Spec-Zone.ru › GCC 15

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API