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-13.3.0/gcc/PowerPC-AltiVec-Built_002din-Functions-Available-on-ISA-3_002e1.html