6.60.23.4 PowerPC AltiVec Встроенные функции, доступные в ISA 3.0 ¶
Следующие дополнительные встроенные функции также доступны для процессоров семейства PowerPC, начиная с ISA 3.0 (-mcpu=power9) и позднее:
unsigned int scalar_extract_exp (double source);
unsigned long long int scalar_extract_exp (__ieee128 source);
unsigned long long int scalar_extract_sig (double source);
unsigned __int128 scalar_extract_sig (__ieee128 source);
double scalar_insert_exp (unsigned long long int significand,
unsigned long long int exponent);
double scalar_insert_exp (double significand, unsigned long long int exponent);
ieee_128 scalar_insert_exp (unsigned __int128 significand,
unsigned long long int exponent);
ieee_128 scalar_insert_exp (ieee_128 significand, unsigned long long int exponent);
int scalar_cmp_exp_gt (double arg1, double arg2);
int scalar_cmp_exp_lt (double arg1, double arg2);
int scalar_cmp_exp_eq (double arg1, double arg2);
int scalar_cmp_exp_unordered (double arg1, double arg2);
bool scalar_test_data_class (float source, const int condition);
bool scalar_test_data_class (double source, const int condition);
bool scalar_test_data_class (__ieee128 source, const int condition);
bool scalar_test_neg (float source);
bool scalar_test_neg (double source);
bool scalar_test_neg (__ieee128 source);
vector _uint128_t vec_msum (vector unsigned long long,
vector unsigned long long,
vector _uint128_t);
vector _int128_t vec_msum (vector signed long long,
vector signed long long,
vector _int128_t);
Функции scalar_extract_exp и scalar_extract_sig требуют 64-битной среды, поддерживающей ISA 3.0 или более поздние версии. Функции scalar_extract_exp и scalar_extract_sig возвращают соответственно мантиссу и смещённое значение экспоненты аргумента source. При использовании 64-битного аргумента source, результат, возвращаемый функцией scalar_extract_sig, имеет установленный бит 0x0010000000000000, если аргумент функции source находится в нормализованной форме. В противном случае этот бит равен 0. При использовании 128-битного аргумента source, бит 0x00010000000000000000000000000000 результата обрабатывается аналогично. Обратите внимание, что знак мантиссы не представлен в результате, возвращаемом функцией scalar_extract_sig. Используйте функцию scalar_test_neg для проверки знака аргумента double. Функции vec_msum выполняют векторное умножение-суммирование, возвращая результат arg1*arg2+arg3. ISA 3.0 добавляет поддержку vec_msum, возвращающей векторный результат int128.
Функции scalar_insert_exp требуют 64-битной среды, поддерживающей ISA 3.0 или более поздние версии. При использовании 64-битного первого аргумента, встроенная функция scalar_insert_exp возвращает значение с двойной точностью, которое формируется путём объединения значений аргументов significand и exponent. Знак результата копируется из старшего бита аргумента significand. Мантисса и компонент экспоненты результата состоят из 11 младших битов аргумента exponent и 52 младших битов аргумента significand соответственно.
При использовании 128-битного первого аргумента, встроенная функция scalar_insert_exp возвращает значение с четырёхкратной точностью ieee. Знаковый бит результата копируется из старшего бита аргумента significand. Мантисса и экспонента результата состоят из 15 младших битов аргумента exponent и 112 младших битов аргумента significand соответственно.
Встроенные функции scalar_cmp_exp_gt, scalar_cmp_exp_lt, scalar_cmp_exp_eq и scalar_cmp_exp_unordered возвращают ненулевое значение, если arg1 больше, меньше, равно или не сравнимо с arg2 соответственно. Аргументы не сравнимы, если один или другой равен NaN (не число).
Встроенная функция scalar_test_data_class возвращает 1, если какой-либо из тестов условия, задаваемых значением переменной condition, верны, и 0 в противном случае. Аргумент condition должен быть целочисленной константой времени компиляции со значением, не превышающим 127. Аргумент condition закодирован как битовая маска, каждый бит которой включает проверку разного условия, как описано ниже:
0x40 Test for NaN 0x20 Test for +Infinity 0x10 Test for -Infinity 0x08 Test for +Zero 0x04 Test for -Zero 0x02 Test for +Denormal 0x01 Test for -Denormal
Встроенная функция scalar_test_neg возвращает 1, если её аргумент source имеет отрицательное значение, и 0 в противном случае.
Следующие встроенные функции также доступны для процессоров семейства PowerPC, начиная с ISA 3.0 или более поздних (-mcpu=power9). Эти строковые функции описываются отдельно, чтобы группировать описания ближе к прототипам функций:
int vec_all_nez (vector signed char, vector signed char);
int vec_all_nez (vector unsigned char, vector unsigned char);
int vec_all_nez (vector signed short, vector signed short);
int vec_all_nez (vector unsigned short, vector unsigned short);
int vec_all_nez (vector signed int, vector signed int);
int vec_all_nez (vector unsigned int, vector unsigned int);
int vec_any_eqz (vector signed char, vector signed char);
int vec_any_eqz (vector unsigned char, vector unsigned char);
int vec_any_eqz (vector signed short, vector signed short);
int vec_any_eqz (vector unsigned short, vector unsigned short);
int vec_any_eqz (vector signed int, vector signed int);
int vec_any_eqz (vector unsigned int, vector unsigned int);
vector bool char vec_cmpnez (vector signed char arg1, vector signed char arg2);
vector bool char vec_cmpnez (vector unsigned char arg1, vector unsigned char arg2);
vector bool short vec_cmpnez (vector signed short arg1, vector signed short arg2);
vector bool short vec_cmpnez (vector unsigned short arg1, vector unsigned short arg2);
vector bool int vec_cmpnez (vector signed int arg1, vector signed int arg2);
vector bool int vec_cmpnez (vector unsigned int, vector unsigned int);
vector signed char vec_cnttz (vector signed char);
vector unsigned char vec_cnttz (vector unsigned char);
vector signed short vec_cnttz (vector signed short);
vector unsigned short vec_cnttz (vector unsigned short);
vector signed int vec_cnttz (vector signed int);
vector unsigned int vec_cnttz (vector unsigned int);
vector signed long long vec_cnttz (vector signed long long);
vector unsigned long long vec_cnttz (vector unsigned long long);
signed int vec_cntlz_lsbb (vector signed char);
signed int vec_cntlz_lsbb (vector unsigned char);
signed int vec_cnttz_lsbb (vector signed char);
signed int vec_cnttz_lsbb (vector unsigned char);
unsigned int vec_first_match_index (vector signed char, vector signed char);
unsigned int vec_first_match_index (vector unsigned char, vector unsigned char);
unsigned int vec_first_match_index (vector signed int, vector signed int);
unsigned int vec_first_match_index (vector unsigned int, vector unsigned int);
unsigned int vec_first_match_index (vector signed short, vector signed short);
unsigned int vec_first_match_index (vector unsigned short, vector unsigned short);
unsigned int vec_first_match_or_eos_index (vector signed char, vector signed char);
unsigned int vec_first_match_or_eos_index (vector unsigned char, vector unsigned char);
unsigned int vec_first_match_or_eos_index (vector signed int, vector signed int);
unsigned int vec_first_match_or_eos_index (vector unsigned int, vector unsigned int);
unsigned int vec_first_match_or_eos_index (vector signed short, vector signed short);
unsigned int vec_first_match_or_eos_index (vector unsigned short,
vector unsigned short);
unsigned int vec_first_mismatch_index (vector signed char, vector signed char);
unsigned int vec_first_mismatch_index (vector unsigned char, vector unsigned char);
unsigned int vec_first_mismatch_index (vector signed int, vector signed int);
unsigned int vec_first_mismatch_index (vector unsigned int, vector unsigned int);
unsigned int vec_first_mismatch_index (vector signed short, vector signed short);
unsigned int vec_first_mismatch_index (vector unsigned short, vector unsigned short);
unsigned int vec_first_mismatch_or_eos_index (vector signed char, vector signed char);
unsigned int vec_first_mismatch_or_eos_index (vector unsigned char,
vector unsigned char);
unsigned int vec_first_mismatch_or_eos_index (vector signed int, vector signed int);
unsigned int vec_first_mismatch_or_eos_index (vector unsigned int, vector unsigned int);
unsigned int vec_first_mismatch_or_eos_index (vector signed short, vector signed short);
unsigned int vec_first_mismatch_or_eos_index (vector unsigned short,
vector unsigned short);
vector unsigned short vec_pack_to_short_fp32 (vector float, vector float);
vector signed char vec_xl_be (signed long long, signed char *);
vector unsigned char vec_xl_be (signed long long, unsigned char *);
vector signed int vec_xl_be (signed long long, signed int *);
vector unsigned int vec_xl_be (signed long long, unsigned int *);
vector signed __int128 vec_xl_be (signed long long, signed __int128 *);
vector unsigned __int128 vec_xl_be (signed long long, unsigned __int128 *);
vector signed long long vec_xl_be (signed long long, signed long long *);
vector unsigned long long vec_xl_be (signed long long, unsigned long long *);
vector signed short vec_xl_be (signed long long, signed short *);
vector unsigned short vec_xl_be (signed long long, unsigned short *);
vector double vec_xl_be (signed long long, double *);
vector float vec_xl_be (signed long long, float *);
vector signed char vec_xl_len (signed char *addr, size_t len);
vector unsigned char vec_xl_len (unsigned char *addr, size_t len);
vector signed int vec_xl_len (signed int *addr, size_t len);
vector unsigned int vec_xl_len (unsigned int *addr, size_t len);
vector signed __int128 vec_xl_len (signed __int128 *addr, size_t len);
vector unsigned __int128 vec_xl_len (unsigned __int128 *addr, size_t len);
vector signed long long vec_xl_len (signed long long *addr, size_t len);
vector unsigned long long vec_xl_len (unsigned long long *addr, size_t len);
vector signed short vec_xl_len (signed short *addr, size_t len);
vector unsigned short vec_xl_len (unsigned short *addr, size_t len);
vector double vec_xl_len (double *addr, size_t len);
vector float vec_xl_len (float *addr, size_t len);
vector unsigned char vec_xl_len_r (unsigned char *addr, size_t len);
void vec_xst_len (vector signed char data, signed char *addr, size_t len);
void vec_xst_len (vector unsigned char data, unsigned char *addr, size_t len);
void vec_xst_len (vector signed int data, signed int *addr, size_t len);
void vec_xst_len (vector unsigned int data, unsigned int *addr, size_t len);
void vec_xst_len (vector unsigned __int128 data, unsigned __int128 *addr, size_t len);
void vec_xst_len (vector signed long long data, signed long long *addr, size_t len);
void vec_xst_len (vector unsigned long long data, unsigned long long *addr, size_t len);
void vec_xst_len (vector signed short data, signed short *addr, size_t len);
void vec_xst_len (vector unsigned short data, unsigned short *addr, size_t len);
void vec_xst_len (vector signed __int128 data, signed __int128 *addr, size_t len);
void vec_xst_len (vector double data, double *addr, size_t len);
void vec_xst_len (vector float data, float *addr, size_t len);
void vec_xst_len_r (vector unsigned char data, unsigned char *addr, size_t len);
signed char vec_xlx (unsigned int index, vector signed char data);
unsigned char vec_xlx (unsigned int index, vector unsigned char data);
signed short vec_xlx (unsigned int index, vector signed short data);
unsigned short vec_xlx (unsigned int index, vector unsigned short data);
signed int vec_xlx (unsigned int index, vector signed int data);
unsigned int vec_xlx (unsigned int index, vector unsigned int data);
float vec_xlx (unsigned int index, vector float data);
signed char vec_xrx (unsigned int index, vector signed char data);
unsigned char vec_xrx (unsigned int index, vector unsigned char data);
signed short vec_xrx (unsigned int index, vector signed short data);
unsigned short vec_xrx (unsigned int index, vector unsigned short data);
signed int vec_xrx (unsigned int index, vector signed int data);
unsigned int vec_xrx (unsigned int index, vector unsigned int data);
float vec_xrx (unsigned int index, vector float data);
Функции vec_all_nez, vec_any_eqz и vec_cmpnez выполняют попарное сравнение элементов в тех же позициях в двух векторных аргументах. Функция vec_all_nez возвращает ненулевое значение тогда и только тогда, когда все попарные сравнения не равны, и ни один элемент ни одного векторного аргумента не содержит ноль. Функция vec_any_eqz возвращает ненулевое значение тогда и только тогда, когда хотя бы одно попарное сравнение равно или хотя бы один элемент в любом векторном аргументе содержит ноль. Функция vec_cmpnez возвращает вектор того же типа, что и два её аргумента, в котором каждый элемент состоит из единиц, чтобы указать, что соответствующие элементы входных аргументов не равны или что хотя бы один из соответствующих элементов содержит ноль. В противном случае элемент возвращаемого вектора содержит все нули.
Функция vec_cntlz_lsbb возвращает количество последовательных ведущих байтовых элементов (начиная с позиции 0 в предоставленном векторном аргументе), для которых младший бит равен нулю. Функция vec_cnttz_lsbb возвращает количество последовательных хвостовых байтовых элементов (начиная с позиции 15 и считая назад в предоставленном векторном аргументе), для которых младший бит равен нулю.
Функции vec_xl_len и vec_xst_len требуют 64-битной среды, поддерживающей ISA 3.0 или более поздние версии. Функция vec_xl_len загружает вектор переменной длины из памяти. Функция vec_xst_len сохраняет вектор переменной длины в памяти. В обоих функциях vec_xl_len и vec_xst_len, аргумент addr представляет адрес памяти, в который или из которого будут переданы данные, а аргумент len представляет количество байтов, передаваемых, как вычисляется выражением C min((len & 0xff), 16). Если значение этого выражения не кратно размеру элемента вектора, поведение этой функции не определено. Если компьютер сконфигурирован для работы в режиме big-endian, передача данных перемещает байты с 0 до (len - 1) соответствующего вектора. В режиме little-endian передача данных перемещает байты с (16 - len) до 15 соответствующего вектора. В случае с функцией загрузки, любые байты вектора результата, которые не загружаются из памяти, устанавливаются в ноль. Значение аргумента addr не обязательно должно быть кратно размеру элемента вектора.
Функции vec_xlx и vec_xrx извлекают единственный элемент, выбранный аргументом index, из вектора, представленного аргументом data. Аргумент index всегда указывает смещение байта, независимо от размера элемента вектора. С vec_xlx, index — это смещение первого байта извлекаемого элемента. С vec_xrx, index представляет последний байт извлекаемого элемента, отсчитываемый от правого конца вектора. Другими словами, последний байт извлекаемого элемента находится в позиции (15 - index). Нет требования, чтобы index было кратно размеру элемента вектора. Однако, если размер элемента вектора, добавленный к index, превышает 15, содержание возвращаемого значения не определено.
Если доступны дополнения набора инструкций ISA 3.0 (-mcpu=power9):
vector unsigned long long vec_bperm (vector unsigned long long, vector unsigned char);
vector bool char vec_cmpne (vector bool char, vector bool char);
vector bool char vec_cmpne (vector signed char, vector signed char);
vector bool char vec_cmpne (vector unsigned char, vector unsigned char);
vector bool int vec_cmpne (vector bool int, vector bool int);
vector bool int vec_cmpne (vector signed int, vector signed int);
vector bool int vec_cmpne (vector unsigned int, vector unsigned int);
vector bool long long vec_cmpne (vector bool long long, vector bool long long);
vector bool long long vec_cmpne (vector signed long long, vector signed long long);
vector bool long long vec_cmpne (vector unsigned long long, vector unsigned long long);
vector bool short vec_cmpne (vector bool short, vector bool short);
vector bool short vec_cmpne (vector signed short, vector signed short);
vector bool short vec_cmpne (vector unsigned short, vector unsigned short);
vector bool long long vec_cmpne (vector double, vector double);
vector bool int vec_cmpne (vector float, vector float);
vector float vec_extract_fp32_from_shorth (vector unsigned short);
vector float vec_extract_fp32_from_shortl (vector unsigned short);
vector long long vec_vctz (vector long long);
vector unsigned long long vec_vctz (vector unsigned long long);
vector int vec_vctz (vector int);
vector unsigned int vec_vctz (vector int);
vector short vec_vctz (vector short);
vector unsigned short vec_vctz (vector unsigned short);
vector signed char vec_vctz (vector signed char);
vector unsigned char vec_vctz (vector unsigned char);
vector signed char vec_vctzb (vector signed char);
vector unsigned char vec_vctzb (vector unsigned char);
vector long long vec_vctzd (vector long long);
vector unsigned long long vec_vctzd (vector unsigned long long);
vector short vec_vctzh (vector short);
vector unsigned short vec_vctzh (vector unsigned short);
vector int vec_vctzw (vector int);
vector unsigned int vec_vctzw (vector int);
vector unsigned long long vec_extract4b (vector unsigned char, const int);
vector unsigned char vec_insert4b (vector signed int, vector unsigned char,
const int);
vector unsigned char vec_insert4b (vector unsigned int, vector unsigned char,
const int);
vector unsigned int vec_parity_lsbb (vector signed int);
vector unsigned int vec_parity_lsbb (vector unsigned int);
vector unsigned __int128 vec_parity_lsbb (vector signed __int128);
vector unsigned __int128 vec_parity_lsbb (vector unsigned __int128);
vector unsigned long long vec_parity_lsbb (vector signed long long);
vector unsigned long long vec_parity_lsbb (vector unsigned long long);
vector int vec_vprtyb (vector int);
vector unsigned int vec_vprtyb (vector unsigned int);
vector long long vec_vprtyb (vector long long);
vector unsigned long long vec_vprtyb (vector unsigned long long);
vector int vec_vprtybw (vector int);
vector unsigned int vec_vprtybw (vector unsigned int);
vector long long vec_vprtybd (vector long long);
vector unsigned long long vec_vprtybd (vector unsigned long long);
На 64-битных целевых платформах, если доступны дополнения ISA 3.0 (-mcpu=power9):
vector long vec_vprtyb (vector long); vector unsigned long vec_vprtyb (vector unsigned long); vector __int128 vec_vprtyb (vector __int128); vector __uint128 vec_vprtyb (vector __uint128); vector long vec_vprtybd (vector long); vector unsigned long vec_vprtybd (vector unsigned long); vector __int128 vec_vprtybq (vector __int128); vector __uint128 vec_vprtybd (vector __uint128);
Следующие встроенные векторные функции доступны для процессоров семейства PowerPC, начиная с ISA 3.0 или более поздних (-mcpu=power9):
__vector unsigned char vec_slv (__vector unsigned char src, __vector unsigned char shift_distance); __vector unsigned char vec_srv (__vector unsigned char src, __vector unsigned char shift_distance);
Функции vec_slv и vec_srv работают со всеми байтами аргументов src и shift_distance параллельно. Поведение vec_slv такое, как если бы существовал временный массив из 17 беззнаковых символов slv_array, в котором элементы 0-15 такие же, как в массиве src, а элемент 16 равен 0. Результат, возвращаемый функцией vec_slv, — это массив из 16 беззнаковых символов __vector, в котором элемент i вычисляется по выражению C 0xff & (*((unsigned short *)(slv_array + i)) << (0x07 &
shift_distance[i])), а это значение приводится к типу unsigned char. Поведение vec_srv такое, как если бы существовал временный массив из 17 беззнаковых символов srv_array, в котором элемент 0 равен нулю, а элементы 1-16 равны элементам 0-15 массива src. Результат, возвращаемый функцией vec_srv, — это массив из 16 беззнаковых символов __vector, в котором элемент i вычисляется по выражению C 0xff & (*((unsigned short *)(srv_array + i)) >>
(0x07 & shift_distance[i])), а это значение приводится к типу unsigned char.
Следующие встроенные функции доступны для процессоров семейства PowerPC, начиная с ISA 3.0 или более поздних (-mcpu=power9):
__vector unsigned char vec_absd (__vector unsigned char arg1, __vector unsigned char arg2); __vector unsigned short vec_absd (__vector unsigned short arg1, __vector unsigned short arg2); __vector unsigned int vec_absd (__vector unsigned int arg1, __vector unsigned int arg2); __vector unsigned char vec_absdb (__vector unsigned char arg1, __vector unsigned char arg2); __vector unsigned short vec_absdh (__vector unsigned short arg1, __vector unsigned short arg2); __vector unsigned int vec_absdw (__vector unsigned int arg1, __vector unsigned int arg2);
Встроенные функции vec_absd, vec_absdb, vec_absdh и vec_absdw вычисляют абсолютные разности пар элементов векторов, предоставленных в двух векторных аргументах, помещая абсолютные разности в соответствующие элементы результата вектора.
Следующие встроенные функции доступны для процессоров семейства PowerPC, начиная с ISA 3.0 или более поздних (-mcpu=power9):
__vector unsigned int vec_extract_exp (__vector float source);
__vector unsigned long long int vec_extract_exp (__vector double source);
__vector unsigned int vec_extract_sig (__vector float source);
__vector unsigned long long int vec_extract_sig (__vector double source);
__vector float vec_insert_exp (__vector unsigned int significands,
__vector unsigned int exponents);
__vector float vec_insert_exp (__vector unsigned float significands,
__vector unsigned int exponents);
__vector double vec_insert_exp (__vector unsigned long long int significands,
__vector unsigned long long int exponents);
__vector double vec_insert_exp (__vector unsigned double significands,
__vector unsigned long long int exponents);
__vector bool int vec_test_data_class (__vector float source, const int condition);
__vector bool long long int vec_test_data_class (__vector double source,
const int condition);
Встроенные функции vec_extract_sig и vec_extract_exp возвращают векторы, представляющие мантиссы и смещенные значения экспоненты их аргументов source соответственно. В результате вектора, возвращаемого функцией vec_extract_sig, бит 0x800000 каждого элемента вектора возвращается, когда аргумент функции source типа float, устанавливается в 1, если соответствующее значение с плавающей запятой находится в нормализованной форме. В противном случае этот бит устанавливается в 0. Когда аргумент source имеет тип double, бит 0x10000000000000 в каждом элементе вектора результата устанавливается по тем же правилам. Обратите внимание, что знак мантиссы не представлен в результате, возвращаемом функцией vec_extract_sig. Для извлечения знаковых битов используйте функцию vec_cpsgn, которая возвращает новый вектор, в котором все знаковые биты второго векторного аргумента перезаписываются знаками, скопированными из соответствующих элементов первого векторного аргумента, а все остальные (не знаковые) биты второго векторного аргумента копируются без изменений в вектор результата.
Функции vec_insert_exp возвращают вектор с плавающей точкой одинарной или двойной точности, построенный путем сборки значений их аргументов significands и exponents в соответствующие элементы возвращаемого вектора. Знак каждого элемента результата копируется из старшего бита соответствующей записи в аргументе significands. Обратите внимание, что соответствующие биты аргумента significands одинаковы для целочисленных и чисел с плавающей точкой. Значимая часть и компонент экспоненты каждого элемента результата состоят из младших битов соответствующего элемента significands и младших битов соответствующего элемента exponents.
Функция vec_test_data_class возвращает вектор, представляющий результаты проверки вектора source на условие, выбранное аргументом condition. Аргумент condition должен быть целочисленной константой времени компиляции со значением, не превышающим 127. Аргумент condition закодирован как битовая маска, при этом каждый бит включает проверку разного условия, как показано ниже:
0x40 Test for NaN 0x20 Test for +Infinity 0x10 Test for -Infinity 0x08 Test for +Zero 0x04 Test for -Zero 0x02 Test for +Denormal 0x01 Test for -Denormal
Если какое-либо из включённых тестовых условий истинно, соответствующая запись в векторе результата равна -1. В противном случае (все включенные тестовые условия ложны), соответствующая запись в векторе результата равна 0.
Следующие встроенные функции доступны для процессоров семейства PowerPC, начиная с ISA 3.0 или более поздней версии (-mcpu=power9):
vector unsigned int vec_rlmi (vector unsigned int, vector unsigned int,
vector unsigned int);
vector unsigned long long vec_rlmi (vector unsigned long long,
vector unsigned long long,
vector unsigned long long);
vector unsigned int vec_rlnm (vector unsigned int, vector unsigned int,
vector unsigned int);
vector unsigned long long vec_rlnm (vector unsigned long long,
vector unsigned long long,
vector unsigned long long);
vector unsigned int vec_vrlnm (vector unsigned int, vector unsigned int);
vector unsigned long long vec_vrlnm (vector unsigned long long,
vector unsigned long long);
Результат vec_rlmi получается путём циклического сдвига каждого элемента первого вектора аргумента влево и вставки его под маску во второй вектор аргумента. Третий вектор аргумента содержит маску, начинающуюся с битов 11:15, конец маски в битах 19:23, а сдвиг в битах 27:31 каждого элемента.
Результат vec_rlnm получается путём циклического сдвига влево каждого элемента первого вектора аргумента и побитового логического И с маской, заданной вторым и третьим векторами аргументов. Второй вектор аргументов содержит сдвиг для каждого элемента в младшем байте. Третий вектор аргументов содержит конец маски для каждого элемента в младшем байте, причём начало маски находится в следующем старшем байте.
Результат vec_vrlnm получается путём циклического сдвига влево каждого элемента первого вектора аргумента и побитового логического И с маской. Второй вектор аргументов содержит маску, начинающуюся с битов 11:15, конец маски в битах 19:23, а сдвиг в битах 27:31 каждого элемента.
Если доступны дополнения к набору инструкций ISA 3.0 (-mcpu=power9):
vector signed bool char vec_revb (vector signed char); vector signed char vec_revb (vector signed char); vector unsigned char vec_revb (vector unsigned char); vector bool short vec_revb (vector bool short); vector short vec_revb (vector short); vector unsigned short vec_revb (vector unsigned short); vector bool int vec_revb (vector bool int); vector int vec_revb (vector int); vector unsigned int vec_revb (vector unsigned int); vector float vec_revb (vector float); vector bool long long vec_revb (vector bool long long); vector long long vec_revb (vector long long); vector unsigned long long vec_revb (vector unsigned long long); vector double vec_revb (vector double);
На 64-битных целевых платформах, если доступны дополнения ISA 3.0 (-mcpu=power9):
vector long vec_revb (vector long); vector unsigned long vec_revb (vector unsigned long); vector __int128 vec_revb (vector __int128); vector __uint128 vec_revb (vector __uint128);
Функция vec_revb инвертирует байты в элементе поэлементно. Вектор vector unsigned char или vector signed char инвертирует байты в целом слове.
Если включены инструкции криптографии (-mcrypto или -mcpu=power8), следующие встроенные функции включены.
vector unsigned long long __builtin_crypto_vsbox (vector unsigned long long);
vector unsigned char vec_sbox_be (vector unsigned char);
vector unsigned long long __builtin_crypto_vcipher (vector unsigned long long,
vector unsigned long long);
vector unsigned char vec_cipher_be (vector unsigned char, vector unsigned char);
vector unsigned long long __builtin_crypto_vcipherlast
(vector unsigned long long,
vector unsigned long long);
vector unsigned char vec_cipherlast_be (vector unsigned char,
vector unsigned char);
vector unsigned long long __builtin_crypto_vncipher (vector unsigned long long,
vector unsigned long long);
vector unsigned char vec_ncipher_be (vector unsigned char,
vector unsigned char);
vector unsigned long long __builtin_crypto_vncipherlast (vector unsigned long long,
vector unsigned long long);
vector unsigned char vec_ncipherlast_be (vector unsigned char,
vector unsigned char);
vector unsigned char __builtin_crypto_vpermxor (vector unsigned char,
vector unsigned char,
vector unsigned char);
vector unsigned short __builtin_crypto_vpermxor (vector unsigned short,
vector unsigned short,
vector unsigned short);
vector unsigned int __builtin_crypto_vpermxor (vector unsigned int,
vector unsigned int,
vector unsigned int);
vector unsigned long long __builtin_crypto_vpermxor (vector unsigned long long,
vector unsigned long long,
vector unsigned long long);
vector unsigned char __builtin_crypto_vpmsumb (vector unsigned char,
vector unsigned char);
vector unsigned short __builtin_crypto_vpmsumh (vector unsigned short,
vector unsigned short);
vector unsigned int __builtin_crypto_vpmsumw (vector unsigned int,
vector unsigned int);
vector unsigned long long __builtin_crypto_vpmsumd (vector unsigned long long,
vector unsigned long long);
vector unsigned long long __builtin_crypto_vshasigmad (vector unsigned long long,
int, int);
vector unsigned int __builtin_crypto_vshasigmaw (vector unsigned int, int, int);
Второй аргумент для __builtin_crypto_vshasigmad и __builtin_crypto_vshasigmaw должен быть целочисленной константой 0 или 1. Третий аргумент этих встроенных функций должен быть целочисленной константой в диапазоне от 0 до 15.
Если включены дополнения набора инструкций ISA 3.0 (-mcpu=power9), следующие дополнительные функции доступны как для 32-битных, так и для 64-битных целевых платформ.
vector short vec_xl (int, vector short *); vector short vec_xl (int, short *); vector unsigned short vec_xl (int, vector unsigned short *); vector unsigned short vec_xl (int, unsigned short *); vector char vec_xl (int, vector char *); vector char vec_xl (int, char *); vector unsigned char vec_xl (int, vector unsigned char *); vector unsigned char vec_xl (int, unsigned char *); void vec_xst (vector short, int, vector short *); void vec_xst (vector short, int, short *); void vec_xst (vector unsigned short, int, vector unsigned short *); void vec_xst (vector unsigned short, int, unsigned short *); void vec_xst (vector char, int, vector char *); void vec_xst (vector char, int, char *); void vec_xst (vector unsigned char, int, vector unsigned char *); void vec_xst (vector unsigned char, int, unsigned char *);
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/PowerPC-AltiVec-Built-in-Functions-Available-on-ISA-3_002e0.html