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