Spec-Zone.ru › GCC 6

6.59.19 Встроенные функции PowerPC

Следующие встроенные функции всегда доступны и могут использоваться для проверки типа целевой платформы PowerPC:

Встроенная функция: void __builtin_cpu_init (void)

Эта функция является nop на платформе PowerPC и включена только для сохранения совместимости API с x86 встроенными функциями.

Встроенная функция: void __builtin_cpu_init (void)

Эта функция является nop на платформе PowerPC и включена только для сохранения совместимости API с x86 встроенными функциями.

Встроенная функция: int __builtin_cpu_is (const char *cpuname)

Эта функция возвращает значение 1 , если процессор во время выполнения имеет тип cpuname, и возвращает 0 в противном случае

Функция __builtin_cpu_is требует GLIBC 2.23 или более поздней версии, которая экспортирует биты аппаратных возможностей. GCC определяет макрос __BUILTIN_CPU_SUPPORTS__, если встроенная функция __builtin_cpu_supports полностью поддерживается.

Если GCC был сконфигурирован для использования GLIBC до версии 2.23, встроенная функция __builtin_cpu_is всегда возвращает 0, и компилятор выдает предупреждение.

Следующие имена процессоров могут быть определены:

‘power9’

Процессор IBM POWER9.

‘power8’

Процессор IBM POWER8.

‘power7’

Процессор IBM POWER7.

‘power6x’

Процессор IBM POWER6 (режим RAW).

‘power6’

Процессор IBM POWER6 (режим архитектуры).

‘power5+’

Процессор IBM POWER5+.

‘power5’

Процессор IBM POWER5.

‘ppc970’

Процессор IBM 970 (например, Apple G5).

‘power4’

Процессор IBM POWER4.

‘ppca2’

64-разрядный встроенный процессор IBM A2.

‘ppc476’

32-разрядный встроенный процессор IBM PowerPC 476FP.

‘ppc464’

32-разрядный встроенный процессор IBM PowerPC 464.

‘ppc440’

32-разрядный встроенный процессор PowerPC 440.

‘ppc405’

32-разрядный встроенный процессор PowerPC 405.

‘ppc-cell-be’

Архитектура процессора IBM PowerPC Cell Broadband Engine.

Вот пример:

#ifdef __BUILTIN_CPU_SUPPORTS__
  if (__builtin_cpu_is ("power8"))
    {
       do_power8 (); // POWER8 specific implementation.
    }
  else
#endif
    {
       do_generic (); // Generic implementation.
    }
Встроенная функция: int __builtin_cpu_supports (const char *feature)

Эта функция возвращает значение 1 , если процессор во время выполнения поддерживает аппаратную функцию feature, и возвращает 0 в противном случае.

Функция __builtin_cpu_supports требует GLIBC 2.23 или более поздней версии, которая экспортирует биты аппаратных возможностей. GCC определяет макрос __BUILTIN_CPU_SUPPORTS__, если встроенная функция __builtin_cpu_supports полностью поддерживается.

Если GCC был сконфигурирован для использования GLIBC до версии 2.23, встроенная функция __builtin_cpu_suports всегда возвращает 0, и компилятор выдает предупреждение.

Следующие функции могут быть определены:

‘4xxmac’

Процессор 4xx имеет блок умножения-суммирования.

‘altivec’

Процессор имеет SIMD/векторный блок.

‘arch_2_05’

Процессор поддерживает ISA 2.05 (например, POWER6).

‘arch_2_06’

Процессор поддерживает ISA 2.06 (например, POWER7).

‘arch_2_07’

Процессор поддерживает ISA 2.07 (например, POWER8).

‘arch_3_00’

Процессор поддерживает ISA 3.00 (например, POWER9).

‘archpmu’

Процессор поддерживает набор совместимых событий мониторинга производительности.

‘booke’

Процессор поддерживает категорию встроенной ISA.

‘cellbe’

Процессор имеет CELL broadband engine.

‘dfp’

Процессор имеет блок десятичного плавающей запятой.

‘dscr’

Процессор поддерживает регистр управления потоком данных.

‘ebb’

Процессор поддерживает ветвление с базовым событием.

‘efpdouble’

Процессор имеет SPE двойной точности плавающей запятой.

‘efpsingle’

Процессор имеет SPE одинарной точности плавающей запятой.

‘fpu’

Процессор имеет блок плавающей запятой.

‘htm’

Процессор имеет инструкции аппаратной транзакционной памяти.

‘htm-nosc’

Ядро прерывает аппаратные транзакции при выполнении системного вызова.

‘ic_snoop’

Процессор поддерживает возможности snooping кэша команд.

‘ieee128’

Процессор поддерживает 128-битные инструкции IEEE двоичной плавающей запятой.

‘isel’

Процессор поддерживает инструкцию целочисленного выбора.

‘mmu’

Процессор имеет блок управления памятью.

‘notb’

Процессор не имеет таймбейс (например, 601 и 403gx).

‘pa6t’

Процессор поддерживает ISA PA Semi 6T CORE.

‘power4’

Процессор поддерживает ISA 2.00 (например, POWER4).

‘power5’

Процессор поддерживает ISA 2.02 (например, POWER5).

‘power5+’

Процессор поддерживает ISA 2.03 (например, POWER5+).

‘power6x’

Процессор поддерживает ISA 2.05 (например, POWER6) расширенные кодовые операции mffgpr и mftgpr.

‘ppc32’

Процессор поддерживает выполнение в 32-битном режиме.

‘ppc601’

Процессор поддерживает старую архитектуру POWER (например, 601).

‘ppc64’

Процессор поддерживает выполнение в 64-битном режиме.

‘ppcle’

Процессор поддерживает режим little-endian с использованием перестановки адресов.

‘smt’

Процессор поддерживает одновременную многопоточность.

‘spe’

Процессор имеет блок обработки сигналов.

‘tar’

Процессор поддерживает регистр целевого адреса.

‘true_le’

Процессор поддерживает настоящий режим little-endian.

‘ucache’

Процессор имеет объединённый кэш команд и данных.

‘vcrypto’

Процессор поддерживает инструкции векторной криптографии.

‘vsx’

Процессор поддерживает расширение векторно-скалярного типа.

Вот пример:

#ifdef __BUILTIN_CPU_SUPPORTS__
  if (__builtin_cpu_supports ("fpu"))
    {
       asm("fadd %0,%1,%2" : "=d"(dst) : "d"(src1), "d"(src2));
    }
  else
#endif
    {
       dst = __fadd (src1, src2); // Software FP addition function.
    }

Эти встроенные функции доступны для процессоров семейства PowerPC:

float __builtin_recipdivf (float, float);
float __builtin_rsqrtf (float);
double __builtin_recipdiv (double, double);
double __builtin_rsqrt (double);
uint64_t __builtin_ppc_get_timebase ();
unsigned long __builtin_ppc_mftb ();
double __builtin_unpack_longdouble (long double, int);
long double __builtin_pack_longdouble (double, double);

Функции vec_rsqrt, __builtin_rsqrt, и __builtin_rsqrtf генерируют несколько инструкций для реализации функции обратного корня квадратного, используя инструкции оценки обратного корня квадратного.

Функции __builtin_recipdiv, и __builtin_recipdivf генерируют несколько инструкций для реализации деления, используя инструкции оценки обратного числа.

Функции __builtin_ppc_get_timebase и __builtin_ppc_mftb генерируют инструкции для чтения регистра Time Base. Функция __builtin_ppc_get_timebase может генерировать несколько инструкций и всегда возвращает 64 бита регистра Time Base. Функция __builtin_ppc_mftb всегда генерирует одну инструкцию и возвращает значение регистра Time Base как целое без знака, отбрасывая наиболее значимое слово в 32-разрядных средах.

Дополнительные встроенные функции доступны для 64-разрядных процессоров семейства PowerPC для эффективного использования 128-битных чисел с плавающей запятой (__float128).

Следующие встроенные функции с плавающей запятой доступны с поддержкой -mfloat128 и Altivec. Все они реализуют функцию, которая является частью имени.

__float128 __builtin_fabsq (__float128)
__float128 __builtin_copysignq (__float128, __float128)

Следующие встроенные функции доступны с поддержкой -mfloat128 и Altivec.

__float128 __builtin_infq (void)

Аналогично __builtin_inf, за исключением того, что тип возвращаемого значения — __float128.

__float128 __builtin_huge_valq (void)

Аналогично __builtin_huge_val, за исключением того, что тип возвращаемого значения — __float128.

__float128 __builtin_nanq (void)

Аналогично __builtin_nan, за исключением того, что тип возвращаемого значения — __float128.

__float128 __builtin_nansq (void)

Аналогично __builtin_nans, за исключением того, что тип возвращаемого значения — __float128.

Следующие встроенные функции доступны для процессоров семейства PowerPC, начиная с ISA 2.06 или более поздней версии (-mcpu=power7 или -mpopcntd):

long __builtin_bpermd (long, long);
int __builtin_divwe (int, int);
unsigned int __builtin_divweu (unsigned int, unsigned int);
long __builtin_divde (long, long);
unsigned long __builtin_divdeu (unsigned long, unsigned long);
unsigned int cdtbcd (unsigned int);
unsigned int cbcdtd (unsigned int);
unsigned int addg6s (unsigned int, unsigned int);

Функции __builtin_divde и __builtin_divdeu требуют 64-разрядной среды с поддержкой ISA 2.06 или более поздней версии.

Следующие встроенные функции доступны для процессоров семейства PowerPC, начиная с ISA 3.0 или более поздней версии (-mcpu=power9):

long long __builtin_darn (void);
long long __builtin_darn_raw (void);
int __builtin_darn_32 (void);

int __builtin_dfp_dtstsfi_lt (unsigned int comparison, _Decimal64 value);
int __builtin_dfp_dtstsfi_lt (unsigned int comparison, _Decimal128 value);
int __builtin_dfp_dtstsfi_lt_dd (unsigned int comparison, _Decimal64 value);
int __builtin_dfp_dtstsfi_lt_td (unsigned int comparison, _Decimal128 value);

int __builtin_dfp_dtstsfi_gt (unsigned int comparison, _Decimal64 value);
int __builtin_dfp_dtstsfi_gt (unsigned int comparison, _Decimal128 value);
int __builtin_dfp_dtstsfi_gt_dd (unsigned int comparison, _Decimal64 value);
int __builtin_dfp_dtstsfi_gt_td (unsigned int comparison, _Decimal128 value);

int __builtin_dfp_dtstsfi_eq (unsigned int comparison, _Decimal64 value);
int __builtin_dfp_dtstsfi_eq (unsigned int comparison, _Decimal128 value);
int __builtin_dfp_dtstsfi_eq_dd (unsigned int comparison, _Decimal64 value);
int __builtin_dfp_dtstsfi_eq_td (unsigned int comparison, _Decimal128 value);

int __builtin_dfp_dtstsfi_ov (unsigned int comparison, _Decimal64 value);
int __builtin_dfp_dtstsfi_ov (unsigned int comparison, _Decimal128 value);
int __builtin_dfp_dtstsfi_ov_dd (unsigned int comparison, _Decimal64 value);
int __builtin_dfp_dtstsfi_ov_td (unsigned int comparison, _Decimal128 value);

Функции __builtin_darn и __builtin_darn_raw требуют 64-разрядной среды с поддержкой ISA 3.0 или более поздней версии. Функция __builtin_darn предоставляет 64-разрядное условное случайное число. Функция __builtin_darn_raw предоставляет 64-разрядное случайное число без обработки. Функция __builtin_darn_32 предоставляет 32-разрядное случайное число.

Функция __builtin_dfp_dtstsfi_lt возвращает ненулевое значение тогда и только тогда, когда количество значащих цифр ее аргумента value меньше, чем ее аргумента comparison. Функции __builtin_dfp_dtstsfi_lt_dd и __builtin_dfp_dtstsfi_lt_td ведут себя аналогично, но требуют, чтобы тип аргумента value был __Decimal64 и __Decimal128 соответственно.

Функция __builtin_dfp_dtstsfi_gt возвращает ненулевое значение тогда и только тогда, когда количество значащих цифр ее аргумента value больше, чем ее аргумента comparison. Функции __builtin_dfp_dtstsfi_gt_dd и __builtin_dfp_dtstsfi_gt_td ведут себя аналогично, но требуют, чтобы тип аргумента value был __Decimal64 и __Decimal128 соответственно.

Функция __builtin_dfp_dtstsfi_eq возвращает ненулевое значение тогда и только тогда, когда количество значащих цифр ее аргумента value равно ее аргументу comparison. Функции __builtin_dfp_dtstsfi_eq_dd и __builtin_dfp_dtstsfi_eq_td ведут себя аналогично, но требуют, чтобы тип аргумента value был __Decimal64 и __Decimal128 соответственно.

Функция __builtin_dfp_dtstsfi_ov возвращает ненулевое значение только в том случае, если ее аргумент value имеет неопределенное количество значащих цифр, например, когда value является кодировкой NaN. Функции __builtin_dfp_dtstsfi_ov_dd и __builtin_dfp_dtstsfi_ov_td ведут себя аналогично, но требуют, чтобы тип аргумента value был соответственно __Decimal64 и __Decimal128.

Следующие встроенные функции доступны для процессоров семейства PowerPC, когда доступен аппаратный десятичный плавающий тип (-mhard-dfp):

long long __builtin_dxex (_Decimal64);
long long __builtin_dxexq (_Decimal128);
_Decimal64 __builtin_ddedpd (int, _Decimal64);
_Decimal128 __builtin_ddedpdq (int, _Decimal128);
_Decimal64 __builtin_denbcd (int, _Decimal64);
_Decimal128 __builtin_denbcdq (int, _Decimal128);
_Decimal64 __builtin_diex (long long, _Decimal64);
_Decimal128 _builtin_diexq (long long, _Decimal128);
_Decimal64 __builtin_dscli (_Decimal64, int);
_Decimal128 __builtin_dscliq (_Decimal128, int);
_Decimal64 __builtin_dscri (_Decimal64, int);
_Decimal128 __builtin_dscriq (_Decimal128, int);
unsigned long long __builtin_unpack_dec128 (_Decimal128, int);
_Decimal128 __builtin_pack_dec128 (unsigned long long, unsigned long long);

Следующие встроенные функции доступны для процессоров семейства PowerPC, когда доступен набор команд Vector Scalar (vsx):

unsigned long long __builtin_unpack_vector_int128 (vector __int128_t, int);
vector __int128_t __builtin_pack_vector_int128 (unsigned long long,
                                                unsigned long long);

Далее: Встроенные функции PowerPC AltiVec/VSX, Предыдущее: Встроенные функции picoChip, Наверх: Встроенные функции целевых платформ [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/PowerPC-Built-in-Functions.html

Spec-Zone.ru

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