7.13.25.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 для порядка байтов от старшего к младшему и элемент 1 для порядка байтов от младшего к старшему) и 112 младших битов аргумента significand. Обратите внимание: significand — это скалярный аргумент; если аргументы являются векторами, significand — это элемент 0 для порядка байтов от старшего к младшему и элемент 1 для порядка байтов от младшего к старшему.
Функции 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 извлекают из вектора, представленного аргументом data, отдельный элемент, выбранный аргументом index. Аргумент 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 получается поворотом влево каждого элемента первого вектора-аргумента и выполнением над ним операции AND с маской. Второй вектор-аргумент содержит маску в битах 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-15.3.0/gcc/PowerPC-AltiVec-Built_002din-Functions-Available-on-ISA-3_002e0.html