6.60.23.5 PowerPC AltiVec Встроенные функции, доступные в ISA 3.1
Следующие дополнительные встроенные функции также доступны для процессоров семейства PowerPC, начиная с ISA 3.1 (-mcpu=power10):
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 на целевой системе с порядком байтов big-endian и инструкцией vclrrb на целевой системе с порядком байтов little-endian. Значение 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 на целевой системе с порядком байтов big-endian и инструкцией vclrlb на целевой системе с порядком байтов little-endian. Значение 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-й двойной слот результата с нулевым расширением, соответствующим естественному порядку элементов. Если байтовый индекс выходит за пределы диапазона для типа данных, внутренняя функция будет отклонена. Для 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);
Извлечь элемент из двух объединённых векторов, начиная с заданного байтового индекса. Индекс основан на порядке big-endian для little-endian системы. Аналогично, индекс основан на порядке little-endian для big-endian системы. Извлеченные элементы с нулевым расширением помещаются во второе двойное слово в соответствии с естественным порядком элементов. Если байтовый индекс выходит за пределы диапазона для типа данных, внутренняя функция будет отклонена. Для 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 для двойных слов, внутренняя функция будет отклонена. Обратите внимание, что основная аппаратная инструкция использует один и тот же регистр для второго аргумента и результата. Для 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);
Сдвинуть объединённые векторы входных данных влево на величину, определяемую младшими тремя битами третьего аргумента, и вернуть оставшиеся 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);
Сдвинуть объединённые векторы входных данных вправо на величину, определяемую младшими тремя битами третьего аргумента, и вернуть оставшиеся 128 бит. Код, использующий эту встроенную функцию, должен учитывать порядок байтов.
Векторный «splat»
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 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);
Изолируйте самые левые ненулевые элементы входного векторного аргумента, заменив все элементы справа от самого левого нулевого элемента, найденного в аргументе, нулем. Типичная реализация использует инструкцию vstribl или vstrihl на целевых системах с порядком байтов big-endian и инструкцию vstribr или vstrihr на целевых системах с порядком байтов little-endian.
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);
Возвращает ненулевое значение тогда и только тогда, когда аргумент содержит нулевой элемент. Типичная реализация использует инструкцию vstribl. или vstrihl. на целевых системах с порядком байтов big-endian и инструкцию vstribr. или vstrihr. на целевых системах с порядком байтов little-endian. Используйте этот встроенный инструмент для проверки наличия нулевого элемента, если тот же аргумент также передан в 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);
Изолируйте самые правые ненулевые элементы входного векторного аргумента, заменив все элементы слева от самого правого нулевого элемента, найденного в аргументе, нулем. Типичная реализация использует инструкцию vstribr или vstrihr на целевых системах с порядком байтов big-endian и инструкцию vstribl или vstrihl на целевых системах с порядком байтов little-endian.
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);
Возвращает ненулевое значение тогда и только тогда, когда аргумент содержит нулевой элемент. Типичная реализация использует инструкцию vstribr. или vstrihr. на целевых системах с порядком байтов big-endian и инструкцию vstribl. или vstrihl. на целевых системах с порядком байтов little-endian. Используйте этот встроенный инструмент для проверки наличия нулевого элемента, если тот же аргумент также передан в 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 возвращаемого вектора. Если выполняется попытка выполнить любое из делений <любое> ÷ 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 или <любое> ÷ 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 битах, или если выполняется попытка выполнить любое из делений <любое> ÷ 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 битах, или если выполняется попытка выполнить <любое> ÷ 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 или <любое> ÷ 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 возвращаемого вектора. Если выполняется попытка выполнить <любое> ÷ 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);
Возвращает результат поворота первого входного значения и побитового И с маской. Первый бит в маске и последний бит в маске получаются из двух 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_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);
Предыдущая: Встроенные функции PowerPC AltiVec, доступные в ISA 3.0, Верхний уровень: Встроенные функции PowerPC AltiVec/VSX [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/PowerPC-AltiVec-Built-in-Functions-Available-on-ISA-3_002e1.html