7.13.24.1 Базовые встроенные функции PowerPC, доступные во всех конфигурациях
-
Встроенная функция:
void__builtin_cpu_init(void) На платформе PowerPC эта функция является
nopи включена исключительно для обеспечения совместимости 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, а компилятор выдает предупреждение.Можно обнаружить следующие типы процессоров:
- ‘power10’
Серверный процессор IBM POWER10.
- ‘power9’
Серверный процессор IBM POWER9.
- ‘power8’
Серверный процессор IBM POWER8.
- ‘power7’
Серверный процессор IBM POWER7.
- ‘power6x’
Серверный процессор IBM POWER6 (режим RAW).
- ‘power6’
Серверный процессор IBM POWER6 (режим Architected).
- ‘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, если процессор во время выполнения поддерживает возможность HWCAP feature, и возвращает0в противном случае.Для функции
__builtin_cpu_supportsтребуется GLIBC 2.23 или более поздняя версия, экспортирующая биты аппаратных возможностей. GCC определяет макрос__BUILTIN_CPU_SUPPORTS__, если встроенная функция__builtin_cpu_supportsполностью поддерживается.Если GCC был настроен для использования GLIBC версии ниже 2.23, встроенная функция
__builtin_cpu_supportsвсегда возвращает 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.0 (например, POWER9).
- ‘arch_3_1’
Процессор поддерживает ISA 3.1 (например, POWER10).
- ‘archpmu’
Процессор поддерживает набор совместимых событий мониторинга производительности.
- ‘booke’
Процессор поддерживает категорию встроенных ISA.
- ‘cellbe’
Процессор оснащен широкополосным движком CELL.
- ‘darn’
Процессор поддерживает инструкцию
darn(выдача случайного числа).- ‘dfp’
Процессор имеет блок десятичной арифметики с плавающей точкой.
- ‘dscr’
Процессор поддерживает регистр управления потоком данных.
- ‘ebb’
Процессор поддерживает ветвление по базовому адресу событий.
- ‘efpdouble’
Процессор имеет блок SPE для операций с плавающей точкой двойной точности.
- ‘efpsingle’
Процессор имеет блок SPE для операций с плавающей точкой одинарной точности.
- ‘fpu’
Процессор имеет блок операций с плавающей точкой.
- ‘htm’
Процессор поддерживает инструкции аппаратной транзакционной памяти.
- ‘htm-nosc’
Ядро прерывает аппаратные транзакции при выполнении системного вызова.
- ‘htm-no-suspend’
Процессор поддерживает аппаратную транзакционную память, но не поддерживает инструкцию
tsuspend..- ‘ic_snoop’
Процессор поддерживает возможность отслеживания обращений к кэшу инструкций.
- ‘ieee128’
Процессор поддерживает инструкции двоичной арифметики с плавающей точкой IEEE шириной 128 бит.
- ‘isel’
Процессор поддерживает инструкцию выбора целого числа.
- ‘mma’
Процессор поддерживает инструкции ускорения умножения матриц.
- ‘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 mffgpr и mftgpr (например, POWER6).
- ‘ppc32’
Процессор поддерживает выполнение в 32-разрядном режиме.
- ‘ppc601’
Процессор поддерживает старую версию ISA POWER (например, 601).
- ‘ppc64’
Процессор поддерживает выполнение в 64-разрядном режиме.
- ‘ppcle’
Процессор поддерживает режим little-endian с перестановкой адресов.
- ‘scv’
Ядро поддерживает векторизованный системный вызов.
- ‘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 также доступны следующие встроенные функции:
uint64_t __builtin_ppc_get_timebase (); unsigned long __builtin_ppc_mftb (); double __builtin_unpack_ibm128 (__ibm128, int); __ibm128 __builtin_pack_ibm128 (double, double); double __builtin_mffs (void); void __builtin_mtfsf (const int, double); void __builtin_mtfsb0 (const int); void __builtin_mtfsb1 (const int); double __builtin_set_fpscr_rn (int);
Функции __builtin_ppc_get_timebase и __builtin_ppc_mftb генерируют инструкции для чтения регистра Time Base. Функция __builtin_ppc_get_timebase может генерировать несколько инструкций и всегда возвращает 64 бита регистра Time Base. Функция __builtin_ppc_mftb всегда генерирует одну инструкцию и возвращает значение регистра Time Base как unsigned long, отбрасывая старшее слово в 32-разрядных средах. Функции __builtin_mffs возвращают значение регистра FPSCR. Обратите внимание: ISA 3.0 поддерживает __builtin_mffsl(), которая позволяет программному обеспечению считывать управляющие биты и нестики-биты состояния FSPCR без повышенной задержки, связанной с доступом к стики-битам состояния. Функция __builtin_mtfsf принимает постоянную 8-битную маску поля и аргумент с плавающей точкой двойной точности и генерирует инструкцию mtfsf (расширенную мнемонику) для записи новых значений в выбранные поля FPSCR. Функции __builtin_mtfsb0 и __builtin_mtfsb1 принимают в качестве аргумента бит, который нужно изменить. Допустимый диапазон значений бита — от 0 до 31. Встроенные функции соответствуют инструкциям mtfsb0 и mtfsb1, которые принимают аргумент и прибавляют к нему 32. Поэтому эти инструкции изменяют только биты FPSCR[32:63], устанавливая указанный бит в 0 или 1 соответственно.
Встроенная функция __builtin_set_fpscr_rn позволяет изменить оба бита режима округления чисел с плавающей точкой и вернуть различные поля FPSCR до обновления поля RN. Встроенная функция возвращает значение типа double, состоящее из исходных значений полей FPSCR DRN, VE, OE, UE, ZE, XE, NI и битов RN; все остальные биты равны нулю. Аргумент встроенной функции — 2-битовое значение нового поля RN. В качестве аргумента можно передать const int или переменную. В более ранних версиях __builtin_set_fpscr_rn функция возвращала void. Был добавлен макрос __SET_FPSCR_RN_RETURNS_FPSCR__. Если он определен, встроенная функция __builtin_set_fpscr_rn возвращает поля FPSCR. Если он не определен, функция __builtin_set_fpscr_rn не возвращает значение. Если используется параметр -msoft-float, встроенная функция __builtin_set_fpscr_rn не возвращает значение.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Basic-PowerPC-Built_002din-Functions-Available-on-all-Configurations.html