6.62.26.4 Встроенные функции PowerPC AltiVec, доступные в ISA 3.0
Следующие дополнительные встроенные функции также доступны для процессоров семейства PowerPC, начиная с ISA 3.0 (-mcpu=power9) или более поздних версий.
В данном списке указаны только инструкции, исключённые из PVIPR.
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);
vector ieee_128 scalar_insert_exp (vector unsigned __int128 significand,
vector unsigned long long exponent);
vector unsigned long long scalar_extract_exp_to_vec (ieee_128);
vector unsigned __int128 scalar_extract_sig_to_vec (ieee_128);
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);
Функции scalar_extract_exp с 64-битным аргументом-источником требуют среды, поддерживающей ISA 3.0 или более поздние версии. Функции scalar_extract_exp с 128-битным аргументом-источником и 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.
Функции scalar_insert_exp требуют 64-битной среды, поддерживающей ISA 3.0 или более поздние версии. При использовании 64-битного первого аргумента, встроенная функция scalar_insert_exp возвращает значение с плавающей запятой двойной точности, построенное путём сборки значений своих аргументов significand и exponent. Знак результата копируется из старшего бита аргумента significand. Мантисса и экспоненциальные компоненты результата состоят соответственно из 11 младших битов аргумента exponent и 52 младших битов аргумента significand.
При использовании 128-битного первого аргумента, встроенная функция scalar_insert_exp возвращает значение с плавающей запятой IEEE четырёхкратной точности, если оба аргумента были скалярными. Если оба аргумента являются векторами, возвращаемое значение является вектором значений с плавающей запятой IEEE. Бит знака результата копируется из старшего бита аргумента significand . Мантисса и экспоненциальные компоненты результата состоят соответственно из 15 младших битов аргумента exponent (элемент 0 в формате big-endian и элемент 1 в формате little-endian) и 112 младших битов аргумента significand . Обратите внимание, что significand — это скалярный аргумент, а в случае векторных аргументов significand — это элемент 0 для big-endian и элемент 1 для little-endian.
Функции scalar_extract_exp_to_vec и scalar_extract_sig_to_vec аналогичны scalar_extract_exp и scalar_extract_sig, за исключением того, что они возвращают векторный результат типа unsigned long long и unsigned __int128 соответственно.
Встроенные функции 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). Эти строковые функции описаны отдельно, чтобы сгруппировать описания ближе к прототипам функций.
В данном списке указаны только функции, исключённые из PVIPR.
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); 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_xlx и vec_xrx извлекают единственный элемент, выбранный аргументом index, из вектора, представленного аргументом data. Аргумент index всегда указывает смещение байтов, независимо от размера элемента вектора. В случае vec_xlx, index представляет смещение первого байта извлекаемого элемента, измеренного от правого конца вектора. В случае vec_xrx, index представляет последний байт извлекаемого элемента, измеренный от правого конца вектора. Другими словами, последний байт извлекаемого элемента находится в позиции (15 - index). Нет требования, чтобы index был кратным размеру элемента вектора. Однако, если размер элемента вектора, добавленный к index, больше 15, содержимое возвращаемого значения не определено.
Следующие функции также доступны, если доступны дополнения к набору инструкций ISA 3.0 (-mcpu=power9).
В данном списке указаны только функции, исключённые из PVIPR.
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 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).
В данном списке указаны только функции, исключённые из PVIPR.
__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_vrlnm (vector unsigned int, vector unsigned int);
vector unsigned long long vec_vrlnm (vector unsigned long long,
vector unsigned long long);
Результат vec_vrlnm получается путём циклического сдвига каждого элемента первого векторного аргумента влево и выполнения побитового И с маской. Векторный аргумент второй содержит маску, начиная с битов 11:15, конец маски в битах 19:23, и счётчик сдвига в битах 27:31 каждого элемента.
Если инструкции шифрования включены (-mcrypto или -mcpu=power8), следующие встроенные функции включены.
В данном списке указаны только функции, исключённые из PVIPR.
vector unsigned long long __builtin_crypto_vsbox (vector unsigned long long);
vector unsigned long long __builtin_crypto_vcipher (vector unsigned long long,
vector unsigned long long);
vector unsigned long long __builtin_crypto_vcipherlast
(vector unsigned long long,
vector unsigned long long);
vector unsigned long long __builtin_crypto_vncipher (vector unsigned long long,
vector unsigned long long);
vector unsigned long long __builtin_crypto_vncipherlast (vector unsigned long long,
vector unsigned long long);
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.
Следующие встроенные функции для расширения знака предоставляются:
vector signed int vec_signexti (vector signed char a); vector signed long long vec_signextll (vector signed char a); vector signed int vec_signexti (vector signed short a); vector signed long long vec_signextll (vector signed short a); vector signed long long vec_signextll (vector signed int a); vector signed long long vec_signextq (vector signed long long a);
Каждый элемент результата получается путём расширения знака элемента входного вектора, который попал бы в наименее значимую часть элемента результата. Например, расширение знака вектора signed char до вектора signed long long расширит знак правого байта каждого двойного слова.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/PowerPC-AltiVec-Built_002din-Functions-Available-on-ISA-3_002e0.html