Spec-Zone.ru › GCC 15

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

Spec-Zone.ru

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