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 системы. Извлечённые элементы расширяются нулями и помещаются в двойное слово 1 в соответствии с естественным порядком элементов. Если байтовый индекс выходит за пределы допустимых значений для типа данных, внутренняя функция будет отклонена. Для 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 битов. Код, использующий эту встроенную функцию, должен учитывать порядок следования байтов.
Раскладывание вектора
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)
Выделить самые левые ненулевые элементы входного вектора-аргумента, заменив все элементы справа от левого нулевого элемента, найденного в аргументе, нулями. Типичная реализация использует инструкцию 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_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);
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/PowerPC-AltiVec-Built-in-Functions-Available-on-ISA-3_002e1.html