7.13.25.5 Встроенные функции PowerPC AltiVec, доступные в ISA 3.1
Следующие дополнительные встроенные функции также доступны для семейства процессоров PowerPC, начиная с ISA 3.1 (-mcpu=power10):
int vec_test_lsbb_all_ones (vector signed char);
int vec_test_lsbb_all_ones (vector unsigned char);
int vec_test_lsbb_all_ones (vector bool char);
Встроенная функция vec_test_lsbb_all_ones возвращает 1, если младший бит каждого байта равен 1. В противном случае она возвращает 0.
int vec_test_lsbb_all_zeros (vector signed char);
int vec_test_lsbb_all_zeros (vector unsigned char);
int vec_test_lsbb_all_zeros (vector bool char);
Встроенная функция vec_test_lsbb_all_zeros возвращает 1, если младший бит каждого байта равен нулю. В противном случае она возвращает 0.
vector unsigned long long int
vec_cfuge (vector unsigned long long int, vector unsigned long long int);
Выполняет операцию центрифугирования вектора, как если бы она была реализована инструкцией vcfuged.
vector unsigned long long int
vec_cntlzm (vector unsigned long long int, vector unsigned long long int);
Выполняет подсчёт ведущих нулей вектора под битовой маской, как если бы операция была реализована инструкцией vclzdm.
vector unsigned long long int
vec_cnttzm (vector unsigned long long int, vector unsigned long long int);
Выполняет подсчёт завершающих нулей вектора под битовой маской, как если бы операция была реализована инструкцией vctzdm.
vector signed char
vec_clrl (vector signed char a, unsigned int n);
vector unsigned char
vec_clrl (vector unsigned char a, unsigned int n);
Очищает крайние левые (16 - n) байты векторного аргумента a, как если бы операция была реализована инструкцией vclrlb на целевой платформе с прямым порядком байтов и инструкцией vclrrb на целевой платформе с обратным порядком байтов. Значение n, превышающее 16, считается равным 16.
vector signed char
vec_clrr (vector signed char a, unsigned int n);
vector unsigned char
vec_clrr (vector unsigned char a, unsigned int n);
Очищает крайние правые (16 - n) байты векторного аргумента a, как если бы операция была реализована инструкцией vclrrb на целевой платформе с прямым порядком байтов и инструкцией vclrlb на целевой платформе с обратным порядком байтов. Значение n, превышающее 16, считается равным 16.
vector unsigned long long int
vec_gnb (vector unsigned __int128, const unsigned char);
Выполняет операцию сбора данных в 128-битный вектор, как если бы она была реализована инструкцией vgnb. Второй аргумент должен быть целочисленным литералом в диапазоне от 2 до 7 включительно.
Извлечение вектора
vector unsigned long long int
vec_extractl (vector unsigned char, vector unsigned char, unsigned int);
vector unsigned long long int
vec_extractl (vector unsigned short, vector unsigned short, unsigned int);
vector unsigned long long int
vec_extractl (vector unsigned int, vector unsigned int, unsigned int);
vector unsigned long long int
vec_extractl (vector unsigned long long, vector unsigned long long, unsigned int);
Извлекает элемент из двух объединённых векторов, начиная с заданного байтового индекса в естественном порядке байтов, и помещает его в нулевом расширении в двойное слово 1 результата согласно естественному порядку элементов. Если байтовый индекс выходит за диапазон для данного типа данных, intrinsic будет отклонена. Для порядка байтов little-endian этот результат соответствует размещению, выполняемому аппаратной инструкцией, то есть dword[0] в нотации RTL. Для порядка байтов big-endian требуется дополнительная инструкция, чтобы переместить его из «левого» двойного слова в «правое». Для little-endian будет сгенерирована семантика, соответствующая инструкциям vextdubvrx, vextduhvrx, vextduwvrx, а для big-endian — семантика, соответствующая инструкциям vextdubvlx, vextduhvlx, vextduwvlx. Обратите внимание, что могут возникать довольно необычные результаты, если байтовый индекс не выровнен по границе элемента, который извлекается. Это ограничение модели программирования векторов с двумя порядками байтов согласуется с ограничением для vec_perm.
vector unsigned long long int
vec_extracth (vector unsigned char, vector unsigned char, unsigned int);
vector unsigned long long int
vec_extracth (vector unsigned short, vector unsigned short,
unsigned int);
vector unsigned long long int
vec_extracth (vector unsigned int, vector unsigned int, unsigned int);
vector unsigned long long int
vec_extracth (vector unsigned long long, vector unsigned long long,
unsigned int);
Извлекает элемент из двух объединённых векторов, начиная с заданного байтового индекса. Для системы с порядком байтов little-endian индекс задаётся в порядке big-endian. Аналогично, для системы с порядком байтов big-endian индекс задаётся в порядке little-endian. Извлечённые элементы расширяются нулями и помещаются в двойное слово 1 согласно естественному порядку элементов. Если байтовый индекс выходит за диапазон для данного типа данных, intrinsic будет отклонена. Для little-endian этот результат соответствует размещению, выполняемому аппаратной инструкцией (vextdubvrx, vextduhvrx, vextduwvrx, vextddvrx), то есть dword[0] в нотации RTL. Для big-endian требуется дополнительная инструкция, чтобы переместить его из «левого» двойного слова в «правое». Для little-endian будет сгенерирована семантика, соответствующая инструкциям vextdubvlx, vextduhvlx, vextduwvlx, а для big-endian — семантика, соответствующая инструкциям vextdubvrx, vextduhvrx, vextduwvrx. Обратите внимание, что могут возникать довольно необычные результаты, если байтовый индекс не выровнен по границе извлекаемого элемента. Это ограничение модели программирования векторов с двумя порядками байтов согласуется с ограничением для vec_perm.
vector unsigned long long int
vec_pdep (vector unsigned long long int, vector unsigned long long int);
Выполняет параллельную операцию внесения битов в вектор, как если бы она была реализована инструкцией vpdepd.
Вставка в вектор
vector unsigned char
vec_insertl (unsigned char, vector unsigned char, unsigned int);
vector unsigned short
vec_insertl (unsigned short, vector unsigned short, unsigned int);
vector unsigned int
vec_insertl (unsigned int, vector unsigned int, unsigned int);
vector unsigned long long
vec_insertl (unsigned long long, vector unsigned long long,
unsigned int);
vector unsigned char
vec_insertl (vector unsigned char, vector unsigned char, unsigned int;
vector unsigned short
vec_insertl (vector unsigned short, vector unsigned short,
unsigned int);
vector unsigned int
vec_insertl (vector unsigned int, vector unsigned int, unsigned int);
Пусть src — первый аргумент, если первый аргумент является скаляром, или крайний правый элемент левого двойного слова первого аргумента, если первый аргумент является вектором. Вставляет источник в назначение в позицию, заданную третьим аргументом, используя естественный порядок элементов во втором аргументе. Остальная часть второго аргумента не изменяется. Если байтовый индекс больше 14 для полуслов, больше 12 для слов или больше 8 для двойных слов, результат не определён. Для little-endian сгенерированный код будет семантически эквивалентен инструкциям vins[bhwd]rx. Аналогично, для big-endian он будет семантически эквивалентен vins[bhwd]lx. Обратите внимание, что могут возникать довольно необычные результаты, если байтовый индекс не выровнен по границе элемента вставляемого типа.
vector unsigned char
vec_inserth (unsigned char, vector unsigned char, unsigned int);
vector unsigned short
vec_inserth (unsigned short, vector unsigned short, unsigned int);
vector unsigned int
vec_inserth (unsigned int, vector unsigned int, unsigned int);
vector unsigned long long
vec_inserth (unsigned long long, vector unsigned long long,
unsigned int);
vector unsigned char
vec_inserth (vector unsigned char, vector unsigned char, unsigned int);
vector unsigned short
vec_inserth (vector unsigned short, vector unsigned short,
unsigned int);
vector unsigned int
vec_inserth (vector unsigned int, vector unsigned int, unsigned int);
Пусть src — первый аргумент, если первый аргумент является скаляром, или крайний правый элемент первого аргумента, если первый аргумент является вектором. Вставляет src во второй аргумент в позицию, заданную третьим аргументом, используя во втором аргументе противоположный порядок элементов и оставляя остальную часть второго аргумента неизменной. Если байтовый индекс больше 14 для полуслов, 12 для слов или 8 для двойных слов, intrinsic будет отклонена. Обратите внимание, что нижележащая аппаратная инструкция использует один и тот же регистр для второго аргумента и результата. Для little-endian генерация кода будет семантически эквивалентна vins[bhwd]lx, а для big-endian — семантически эквивалентна vins[bhwd]rx. Обратите внимание, что могут возникать довольно необычные результаты, если байтовый индекс не выровнен по границе элемента вставляемого типа.
Замена элемента вектора
vector signed int vec_replace_elt (vector signed int, signed int,
const int);
vector unsigned int vec_replace_elt (vector unsigned int,
unsigned int, const int);
vector float vec_replace_elt (vector float, float, const int);
vector signed long long vec_replace_elt (vector signed long long,
signed long long, const int);
vector unsigned long long vec_replace_elt (vector unsigned long long,
unsigned long long, const int);
vector double rec_replace_elt (vector double, double, const int);
Третий аргумент (ограниченный диапазоном [0,3]) задаёт номер элемента первого аргумента в естественном порядке байтов, который будет заменён вторым аргументом для получения результата. Остальные элементы первого аргумента останутся в результате без изменений.
Если требуется вставить слово в невыровненную позицию, используйте вместо этого vec_replace_unaligned.
Невыровненная замена вектора
vector unsigned char vec_replace_unaligned (vector unsigned char,
signed int, const int);
vector unsigned char vec_replace_unaligned (vector unsigned char,
unsigned int, const int);
vector unsigned char vec_replace_unaligned (vector unsigned char,
float, const int);
vector unsigned char vec_replace_unaligned (vector unsigned char,
signed long long, const int);
vector unsigned char vec_replace_unaligned (vector unsigned char,
unsigned long long, const int);
vector unsigned char vec_replace_unaligned (vector unsigned char,
double, const int);
Второй аргумент заменяет часть первого аргумента для получения результата, а остальная часть первого аргумента остаётся в результате без изменений. Третий аргумент задаёт байтовый индекс (в порядке слева направо, то есть big-endian), в который будет помещён старший байт второго аргумента; остальные байты второго аргумента естественным образом располагаются «справа» от старшего байта.
Программист несёт ответственность за понимание связанных с порядком байтов особенностей первого аргумента и результата.
Сдвиг вектора влево на двойное слово с непосредственным битом
vector signed char vec_sldb (vector signed char, vector signed char,
const unsigned int);
vector unsigned char vec_sldb (vector unsigned char,
vector unsigned char, const unsigned int);
vector signed short vec_sldb (vector signed short, vector signed short,
const unsigned int);
vector unsigned short vec_sldb (vector unsigned short,
vector unsigned short, const unsigned int);
vector signed int vec_sldb (vector signed int, vector signed int,
const unsigned int);
vector unsigned int vec_sldb (vector unsigned int, vector unsigned int,
const unsigned int);
vector signed long long vec_sldb (vector signed long long,
vector signed long long, const unsigned int);
vector unsigned long long vec_sldb (vector unsigned long long,
vector unsigned long long, const unsigned int);
vector signed __int128 vec_sldb (vector signed __int128,
vector signed __int128, const unsigned int);
vector unsigned __int128 vec_sldb (vector unsigned __int128,
vector unsigned __int128, const unsigned int);
Сдвигает объединённые входные векторы влево на величину, заданную тремя младшими битами третьего аргумента, и возвращает крайние левые 128 оставшихся битов. Код, использующий эту инструкцию, должен учитывать порядок байтов.
Сдвиг вектора вправо на двойное слово с непосредственным битом
vector signed char vec_srdb (vector signed char, vector signed char,
const unsigned int);
vector unsigned char vec_srdb (vector unsigned char, vector unsigned char,
const unsigned int);
vector signed short vec_srdb (vector signed short, vector signed short,
const unsigned int);
vector unsigned short vec_srdb (vector unsigned short, vector unsigned short,
const unsigned int);
vector signed int vec_srdb (vector signed int, vector signed int,
const unsigned int);
vector unsigned int vec_srdb (vector unsigned int, vector unsigned int,
const unsigned int);
vector signed long long vec_srdb (vector signed long long,
vector signed long long, const unsigned int);
vector unsigned long long vec_srdb (vector unsigned long long,
vector unsigned long long, const unsigned int);
vector signed __int128 vec_srdb (vector signed __int128,
vector signed __int128, const unsigned int);
vector unsigned __int128 vec_srdb (vector unsigned __int128,
vector unsigned __int128, const unsigned int);
Сдвигает объединённые входные векторы вправо на величину, заданную тремя младшими битами третьего аргумента, и возвращает оставшиеся 128 битов. Код, использующий эту встроенную функцию, должен учитывать порядок байтов.
Тиражирование вектора
vector signed int vec_splati (const signed int);
vector float vec_splati (const float);
Тиражирует 32-битное непосредственное значение в вектор слов.
vector double vec_splatid (const float);
Преобразует значение с плавающей точкой одинарной точности в значение двойной точности и тиражирует результат в вектор чисел с плавающей точкой двойной точности.
vector signed int vec_splati_ins (vector signed int,
const unsigned int, const signed int);
vector unsigned int vec_splati_ins (vector unsigned int,
const unsigned int, const unsigned int);
vector float vec_splati_ins (vector float, const unsigned int,
const float);
Аргумент 2 должен быть равен 0 или 1. Тиражирует значение аргумента 3 в слове, заданном аргументом 2, каждого двойного слова аргумента 1 и возвращает результат. Остальные слова аргумента 1 не изменяются.
Векторное смешивание по переменной маске
vector signed char vec_blendv (vector signed char, vector signed char,
vector unsigned char);
vector unsigned char vec_blendv (vector unsigned char,
vector unsigned char, vector unsigned char);
vector signed short vec_blendv (vector signed short,
vector signed short, vector unsigned short);
vector unsigned short vec_blendv (vector unsigned short,
vector unsigned short, vector unsigned short);
vector signed int vec_blendv (vector signed int, vector signed int,
vector unsigned int);
vector unsigned int vec_blendv (vector unsigned int,
vector unsigned int, vector unsigned int);
vector signed long long vec_blendv (vector signed long long,
vector signed long long, vector unsigned long long);
vector unsigned long long vec_blendv (vector unsigned long long,
vector unsigned long long, vector unsigned long long);
vector float vec_blendv (vector float, vector float,
vector unsigned int);
vector double vec_blendv (vector double, vector double,
vector unsigned long long);
Смешивает векторы первого и второго аргументов в соответствии со знаковыми битами соответствующих элементов вектора третьего аргумента. Это аналог инструкций vsel и xxsel, но для более крупных элементов.
Расширенная перестановка вектора
vector signed char vec_permx (vector signed char, vector signed char,
vector unsigned char, const int);
vector unsigned char vec_permx (vector unsigned char,
vector unsigned char, vector unsigned char, const int);
vector signed short vec_permx (vector signed short,
vector signed short, vector unsigned char, const int);
vector unsigned short vec_permx (vector unsigned short,
vector unsigned short, vector unsigned char, const int);
vector signed int vec_permx (vector signed int, vector signed int,
vector unsigned char, const int);
vector unsigned int vec_permx (vector unsigned int,
vector unsigned int, vector unsigned char, const int);
vector signed long long vec_permx (vector signed long long,
vector signed long long, vector unsigned char, const int);
vector unsigned long long vec_permx (vector unsigned long long,
vector unsigned long long, vector unsigned char, const int);
vector float (vector float, vector float, vector unsigned char,
const int);
vector double (vector double, vector double, vector unsigned char,
const int);
Выполняет частичную перестановку первых двух аргументов, образующих 32-байтовый фрагмент эмулируемого вектора шириной до 256 байт, используя управляющий вектор частичной перестановки из третьего аргумента. Четвёртый аргумент (ограниченный значениями от 0 до 7) задаёт, какой 32-байтовый фрагмент эмулируемого вектора содержится в первых двух аргументах.
vector unsigned long long int
vec_pext (vector unsigned long long int, vector unsigned long long int);
Выполняет параллельную операцию извлечения битов из вектора, как если бы она была реализована инструкцией vpextd.
vector unsigned char vec_stril (vector unsigned char);
vector signed char vec_stril (vector signed char);
vector unsigned short vec_stril (vector unsigned short);
vector signed short vec_stril (vector signed short);
Изолирует крайние левые ненулевые элементы входного векторного аргумента, заменяя нулями все элементы справа от крайнего левого нулевого элемента, найденного в аргументе. В типичной реализации на целевых платформах с порядком байтов big-endian используется инструкция vstribl или vstrihl, а на целевых платформах с порядком байтов little-endian — инструкция vstribr или vstrihr.
int vec_stril_p (vector unsigned char);
int vec_stril_p (vector signed char);
int short vec_stril_p (vector unsigned short);
int vec_stril_p (vector signed short);
Возвращает ненулевое значение тогда и только тогда, когда аргумент содержит нулевой элемент. В типичной реализации на целевых платформах с порядком байтов big-endian используется инструкция vstribl. или vstrihl., а на целевых платформах с порядком байтов little-endian — инструкция vstribr. или vstrihr.. Выберите эту встроенную функцию для проверки наличия нулевого элемента, если тот же аргумент также передаётся в vec_stril.
vector unsigned char vec_strir (vector unsigned char);
vector signed char vec_strir (vector signed char);
vector unsigned short vec_strir (vector unsigned short);
vector signed short vec_strir (vector signed short);
Изолирует крайние правые ненулевые элементы входного векторного аргумента, заменяя нулями все элементы слева от крайнего правого нулевого элемента, найденного в аргументе. В типичной реализации на целевых платформах с порядком байтов big-endian используется инструкция vstribr или vstrihr, а на целевых платформах с порядком байтов little-endian — инструкция vstribl или vstrihl.
int vec_strir_p (vector unsigned char);
int vec_strir_p (vector signed char);
int short vec_strir_p (vector unsigned short);
int vec_strir_p (vector signed short);
Возвращает ненулевое значение тогда и только тогда, когда аргумент содержит нулевой элемент. В типичной реализации на целевых платформах с порядком байтов big-endian используется инструкция vstribr. или vstrihr., а на целевых платформах с порядком байтов little-endian — инструкция vstribl. или vstrihl.. Выберите эту встроенную функцию для проверки наличия нулевого элемента, если тот же аргумент также передаётся в vec_strir.
vector unsigned char
vec_ternarylogic (vector unsigned char, vector unsigned char,
vector unsigned char, const unsigned int);
vector unsigned short
vec_ternarylogic (vector unsigned short, vector unsigned short,
vector unsigned short, const unsigned int);
vector unsigned int
vec_ternarylogic (vector unsigned int, vector unsigned int,
vector unsigned int, const unsigned int);
vector unsigned long long int
vec_ternarylogic (vector unsigned long long int, vector unsigned long long int,
vector unsigned long long int, const unsigned int);
vector unsigned __int128
vec_ternarylogic (vector unsigned __int128, vector unsigned __int128,
vector unsigned __int128, const unsigned int);
Выполняет операцию вычисления для 128-битного вектора, как если бы она была реализована инструкцией xxeval. Четвёртый аргумент должен быть целочисленным литералом в диапазоне от 0 до 255 включительно.
vector unsigned char vec_genpcvm (vector unsigned char, const int);
vector unsigned short vec_genpcvm (vector unsigned short, const int);
vector unsigned int vec_genpcvm (vector unsigned int, const int);
vector unsigned int vec_genpcvm (vector unsigned long long int,
const int);
Умножение, деление и вычисление остатка для целых чисел в векторах
vector signed int
vec_mulh (vector signed int a, vector signed int b);
vector unsigned int
vec_mulh (vector unsigned int a, vector unsigned int b);
Для каждого целочисленного значения i от 0 до 3 выполняется следующее. Целое значение в элементе-слове i вектора a умножается на целое значение в элементе-слове i вектора b. Старшие 32 бита 64-битного произведения помещаются в элемент-слово i возвращаемого вектора.
vector signed long long
vec_mulh (vector signed long long a, vector signed long long b);
vector unsigned long long
vec_mulh (vector unsigned long long a, vector unsigned long long b);
Для каждого целочисленного значения i от 0 до 1 выполняется следующее. Целое значение в элементе-двойном слове i вектора a умножается на целое значение в элементе-двойном слове i вектора b. Старшие 64 бита 128-битного произведения помещаются в элемент-двойное слово i возвращаемого вектора.
vector unsigned long long
vec_mul (vector unsigned long long a, vector unsigned long long b);
vector signed long long
vec_mul (vector signed long long a, vector signed long long b);
Для каждого целочисленного значения i от 0 до 1 выполняется следующее. Целое значение в элементе-двойном слове i вектора a умножается на целое значение в элементе-двойном слове i вектора b. Младшие 64 бита 128-битного произведения помещаются в элемент-двойное слово i возвращаемого вектора.
vector signed int
vec_div (vector signed int a, vector signed int b);
vector unsigned int
vec_div (vector unsigned int a, vector unsigned int b);
Для каждого целочисленного значения i от 0 до 3 выполняется следующее. Целое значение в элементе-слове i вектора a делится на целое значение в элементе-слове i вектора b. Единственное целое частное помещается в элемент-слово i возвращаемого вектора. Если предпринимается попытка выполнить любое из делений <anything> ÷ 0, частное не определено.
vector signed long long
vec_div (vector signed long long a, vector signed long long b);
vector unsigned long long
vec_div (vector unsigned long long a, vector unsigned long long b);
Для каждого целочисленного значения i от 0 до 1 выполняется следующее. Целое значение в элементе-двойном слове i вектора a делится на целое значение в элементе-двойном слове i вектора b. Единственное целое частное помещается в элемент-двойное слово i возвращаемого вектора. Если предпринимается попытка выполнить любое из делений 0x8000_0000_0000_0000 ÷ -1 или <anything> ÷ 0, частное не определено.
vector signed int
vec_dive (vector signed int a, vector signed int b);
vector unsigned int
vec_dive (vector unsigned int a, vector unsigned int b);
Для каждого целочисленного значения i от 0 до 3 выполняется следующее. Целое значение в элементе-слове i вектора a сдвигается влево на 32 бита, а затем делится на целое значение в элементе-слове i вектора b. Единственное целое частное помещается в элемент-слово i возвращаемого вектора. Если частное нельзя представить 32 битами или предпринимается попытка выполнить любое из делений <anything> ÷ 0, частное не определено.
vector signed long long
vec_dive (vector signed long long a, vector signed long long b);
vector unsigned long long
vec_dive (vector unsigned long long a, vector unsigned long long b);
Для каждого целочисленного значения i от 0 до 1 выполняется следующее. Целое значение в элементе-двойном слове i вектора a сдвигается влево на 64 бита, а затем делится на целое значение в элементе-двойном слове i вектора b. Единственное целое частное помещается в элемент-двойное слово i возвращаемого вектора. Если частное нельзя представить 64 битами или предпринимается попытка выполнить деление <anything> ÷ 0, частное не определено.
vector signed int
vec_mod (vector signed int a, vector signed int b);
vector unsigned int
vec_mod (vector unsigned int a, vector unsigned int b);
Для каждого целочисленного значения i от 0 до 3 выполняется следующее. Целое значение в элементе-слове i вектора a делится на целое значение в элементе-слове i вектора b. Единственный целый остаток помещается в элемент-слово i возвращаемого вектора. Если предпринимается попытка выполнить любое из делений 0x8000_0000 ÷ -1 или <anything> ÷ 0, остаток не определён.
vector signed long long
vec_mod (vector signed long long a, vector signed long long b);
vector unsigned long long
vec_mod (vector unsigned long long a, vector unsigned long long b);
Для каждого целочисленного значения i от 0 до 1 выполняется следующее. Целое значение в элементе-двойном слове i вектора a делится на целое значение в элементе-двойном слове i вектора b. Единственный целый остаток помещается в элемент-двойное слово i возвращаемого вектора. Если предпринимается попытка выполнить деление <anything> ÷ 0, остаток не определён.
Формирует PCV из заданного размера маски, как если бы операция была реализована инструкциями xxgenpcvbm, xxgenpcvhm, xxgenpcvwm, где непосредственное значение равно 0, 1, 2 или 3.
vector unsigned __int128 vec_rl (vector unsigned __int128 A,
vector unsigned __int128 B);
vector signed __int128 vec_rl (vector signed __int128 A,
vector unsigned __int128 B);
Значение результата: каждый элемент R получается поворотом соответствующего элемента A влево на число битов, заданное соответствующим элементом B.
vector unsigned __int128 vec_rlmi (vector unsigned __int128,
vector unsigned __int128, vector unsigned __int128);
vector signed __int128 vec_rlmi (vector signed __int128,
vector signed __int128, vector unsigned __int128);
Возвращает результат поворота первого входного значения и его вставки под маску во второе входное значение. Первый и последний биты маски берутся соответственно из двух 7-битных полей: битов [108:115] и битов [117:123] второго входного значения. Сдвиг берётся из третьего входного значения, из 7-битного поля [125:131], где биты нумеруются слева направо, начиная с нуля.
vector unsigned __int128 vec_rlnm (vector unsigned __int128,
vector unsigned __int128, vector unsigned __int128);
vector signed __int128 vec_rlnm (vector signed __int128,
vector unsigned __int128, vector unsigned __int128);
Возвращает результат поворота первого входного значения и выполнения побитового AND с маской. Первый и последний биты маски берутся соответственно из двух 7-битных полей: битов [117:123] и битов [125:131] второго входного значения. Сдвиг берётся из третьего входного значения, из 7-битного поля битов [125:131], где биты нумеруются слева направо, начиная с нуля.
vector unsigned __int128 vec_sl(vector unsigned __int128 A, vector unsigned __int128 B);
vector signed __int128 vec_sl(vector signed __int128 A, vector unsigned __int128 B);
Значение результата: каждый элемент R получается сдвигом соответствующего элемента A влево на число битов, заданное соответствующим элементом B.
vector unsigned __int128 vec_sr(vector unsigned __int128 A, vector unsigned __int128 B);
vector signed __int128 vec_sr(vector signed __int128 A, vector unsigned __int128 B);
Значение результата: каждый элемент R получается сдвигом соответствующего элемента A вправо на число битов, заданное соответствующим элементом B.
vector unsigned __int128 vec_sra(vector unsigned __int128 A, vector unsigned __int128 B);
vector signed __int128 vec_sra(vector signed __int128 A, vector unsigned __int128 B);
Значение результата: каждый элемент R получается арифметическим сдвигом соответствующего элемента A вправо на число битов, заданное соответствующим элементом B.
vector unsigned __int128 vec_mule (vector unsigned long long,
vector unsigned long long);
vector signed __int128 vec_mule (vector signed long long,
vector signed long long);
Возвращает вектор, содержащий 128-битный целочисленный результат умножения чётных элементов-двойных слов двух входных значений.
vector unsigned __int128 vec_mulo (vector unsigned long long,
vector unsigned long long);
vector signed __int128 vec_mulo (vector signed long long,
vector signed long long);
Возвращает вектор, содержащий 128-битный целочисленный результат умножения нечётных элементов-двойных слов двух входных значений.
vector unsigned __int128 vec_div (vector unsigned __int128,
vector unsigned __int128);
vector signed __int128 vec_div (vector signed __int128,
vector signed __int128);
Возвращает результат деления первого операнда на второй. Попытка деления любого значения на ноль или деления минимального отрицательного знакового 128-битного целого на минус один приводит к неопределённому значению.
vector unsigned __int128 vec_dive (vector unsigned __int128,
vector unsigned __int128);
vector signed __int128 vec_dive (vector signed __int128,
vector signed __int128);
Результат получается сдвигом первого входного значения влево на 128 бит и делением на второе. Если предпринимается попытка деления на ноль или результат превышает 128 бит, результат не определён.
vector unsigned __int128 vec_mod (vector unsigned __int128,
vector unsigned __int128);
vector signed __int128 vec_mod (vector signed __int128,
vector signed __int128);
Результат представляет собой остаток от деления первого входного значения на второе.
Следующие встроенные функции выполняют сравнения 128-битных векторов. Функции vec_all_xx, vec_any_xx и vec_cmpxx, где xx — одна из операций eq, ne, gt, lt, ge, le, выполняют попарное сравнение элементов, расположенных в одинаковых позициях двух векторных аргументов. Функция vec_all_xx возвращает ненулевое значение тогда и только тогда, когда все попарные сравнения истинны. Функция vec_any_xx возвращает ненулевое значение тогда и только тогда, когда истинно хотя бы одно попарное сравнение. Функция vec_cmpxx возвращает вектор того же типа, что и её аргументы; каждый его элемент состоит из одних единиц, если заданное логическое сравнение соответствующих элементов истинно. В противном случае элемент возвращаемого вектора содержит только нули.
vector bool __int128 vec_cmpeq (vector signed __int128, vector signed __int128); vector bool __int128 vec_cmpeq (vector unsigned __int128, vector unsigned __int128); vector bool __int128 vec_cmpne (vector signed __int128, vector signed __int128); vector bool __int128 vec_cmpne (vector unsigned __int128, vector unsigned __int128); vector bool __int128 vec_cmpgt (vector signed __int128, vector signed __int128); vector bool __int128 vec_cmpgt (vector unsigned __int128, vector unsigned __int128); vector bool __int128 vec_cmplt (vector signed __int128, vector signed __int128); vector bool __int128 vec_cmplt (vector unsigned __int128, vector unsigned __int128); vector bool __int128 vec_cmpge (vector signed __int128, vector signed __int128); vector bool __int128 vec_cmpge (vector unsigned __int128, vector unsigned __int128); vector bool __int128 vec_cmple (vector signed __int128, vector signed __int128); vector bool __int128 vec_cmple (vector unsigned __int128, vector unsigned __int128); int vec_all_eq (vector signed __int128, vector signed __int128); int vec_all_eq (vector unsigned __int128, vector unsigned __int128); int vec_all_ne (vector signed __int128, vector signed __int128); int vec_all_ne (vector unsigned __int128, vector unsigned __int128); int vec_all_gt (vector signed __int128, vector signed __int128); int vec_all_gt (vector unsigned __int128, vector unsigned __int128); int vec_all_lt (vector signed __int128, vector signed __int128); int vec_all_lt (vector unsigned __int128, vector unsigned __int128); int vec_all_ge (vector signed __int128, vector signed __int128); int vec_all_ge (vector unsigned __int128, vector unsigned __int128); int vec_all_le (vector signed __int128, vector signed __int128); int vec_all_le (vector unsigned __int128, vector unsigned __int128); int vec_any_eq (vector signed __int128, vector signed __int128); int vec_any_eq (vector unsigned __int128, vector unsigned __int128); int vec_any_ne (vector signed __int128, vector signed __int128); int vec_any_ne (vector unsigned __int128, vector unsigned __int128); int vec_any_gt (vector signed __int128, vector signed __int128); int vec_any_gt (vector unsigned __int128, vector unsigned __int128); int vec_any_lt (vector signed __int128, vector signed __int128); int vec_any_lt (vector unsigned __int128, vector unsigned __int128); int vec_any_ge (vector signed __int128, vector signed __int128); int vec_any_ge (vector unsigned __int128, vector unsigned __int128); int vec_any_le (vector signed __int128, vector signed __int128); int vec_any_le (vector unsigned __int128, vector unsigned __int128);
Следующие варианты являются расширениями существующих перегруженных встроенных функций vec_sld, vec_sldw, vec_slo, vec_sro, vec_srl, описанных в PVIPR.
vector signed __int128 vec_sld (vector signed __int128,
vector signed __int128, const unsigned int);
vector unsigned __int128 vec_sld (vector unsigned __int128,
vector unsigned __int128, const unsigned int);
vector signed __int128 vec_sldw (vector signed __int128,
vector signed __int128, const unsigned int);
vector unsigned __int128 vec_sldw (vector unsigned __int,
vector unsigned __int128, const unsigned int);
vector signed __int128 vec_slo (vector signed __int128,
vector signed char);
vector signed __int128 vec_slo (vector signed __int128,
vector unsigned char);
vector unsigned __int128 vec_slo (vector unsigned __int128,
vector signed char);
vector unsigned __int128 vec_slo (vector unsigned __int128,
vector unsigned char);
vector signed __int128 vec_sro (vector signed __int128,
vector signed char);
vector signed __int128 vec_sro (vector signed __int128,
vector unsigned char);
vector unsigned __int128 vec_sro (vector unsigned __int128,
vector signed char);
vector unsigned __int128 vec_sro (vector unsigned __int128,
vector unsigned char);
vector signed __int128 vec_srl (vector signed __int128,
vector unsigned char);
vector unsigned __int128 vec_srl (vector unsigned __int128,
vector unsigned char);
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/PowerPC-AltiVec-Built_002din-Functions-Available-on-ISA-3_002e1.html