Spec-Zone.ru › GCC 14

6.62.25.1 Базовые встроенные функции PowerPC, доступные во всех конфигурациях

Встроенная функция: 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, и компилятор выдает предупреждение.

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

‘power10’

Процессор IBM POWER10 Server.

‘power9’

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

‘power8’

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

‘power7’

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

‘power6x’

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

‘power6’

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

‘power5+’

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

‘power5’

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

‘ppc970’

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

‘power4’

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

‘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_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 broadband engine.

‘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 (например, POWER6) расширенные кодовые операции mffgpr и mftgpr.

‘ppc32’

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

‘ppc601’

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

‘ppc64’

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

‘ppcle’

Процессор поддерживает малоендианский режим с использованием переупорядочивания адресов.

‘scv’

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

‘smt’

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

‘spe’

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

‘tar’

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

‘true_le’

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

‘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 генерируют инструкции для чтения регистра тайм-базы. Функция __builtin_ppc_get_timebase может генерировать несколько инструкций и всегда возвращает 64 бита регистра тайм-базы. Функция __builtin_ppc_mftb всегда генерирует одну инструкцию и возвращает значение регистра тайм-базы как целое число без знака, отбрасывая старшее слово в 32-битных средах. Функция __builtin_mffs возвращает значение регистра FPSCR. Обратите внимание, что ISA 3.0 поддерживает __builtin_mffsl(), что позволяет программному обеспечению читать биты управляющего и не-застывшего состояния в FPSCR без большей задержки, связанной с доступом к застывшим битам состояния. Функция __builtin_mtfsf принимает постоянную маску поля целого 8-битного числа и аргумент с плавающей запятой двойной точности и генерирует инструкцию mtfsf (расширенное мнемоническое обозначение) для записи новых значений в выбранные поля FPSCR. Функции __builtin_mtfsb0 и __builtin_mtfsb1 принимают бит для изменения в качестве аргумента. Диапазон действительных битов составляет от 0 до 31. Встроенные функции отображаются на инструкции mtfsb0 и mtfsb1, которые принимают аргумент и добавляют 32. Таким образом, эти инструкции изменяют только биты FPSCR[32:63], изменяя указанный бит на ноль или единицу соответственно.

Встроенная функция __builtin_set_fpscr_rn позволяет изменить оба бита режима округления с плавающей запятой и вернуть различные поля FPSCR до обновления поля RN. Встроенная функция возвращает двойное значение, состоящее из начального значения полей 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-14.2.0/gcc/Basic-PowerPC-Built_002din-Functions-Available-on-all-Configurations.html

Spec-Zone.ru

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