Spec-Zone.ru › GCC 12

3.19.1 Параметры AArch64

Эти параметры определены для реализаций AArch64:

-mabi=name

Генерирует код для указанной модели данных. Допустимые значения — ‘ilp32’ для модели данных типа SysV, где int, long int и указатели имеют 32 бита, и ‘lp64’ для модели данных типа SysV, где int имеет 32 бита, а long int и указатели — 64 бита.

Значение по умолчанию зависит от конкретной конфигурации целевой системы. Обратите внимание, что ABI LP64 и ILP32 не совместимы при компоновке; необходимо скомпилировать всю программу с одинаковым ABI и выполнить компоновку с совместимым набором библиотек.

-mbig-endian

Генерирует код в формате big-endian. Это значение по умолчанию, когда GCC настроен для целевой системы ‘aarch64_be-*-*’.

-mgeneral-regs-only

Генерирует код, использующий только регистры общего назначения. Это предотвратит использование компилятором регистров с плавающей точкой и Advanced SIMD, но не наложит никаких ограничений на ассемблер.

-mlittle-endian

Генерирует код в формате little-endian. Это значение по умолчанию, когда GCC настроен для целевой системы ‘aarch64-*-*’, но не для ‘aarch64_be-*-*’.

-mcmodel=tiny

Генерирует код для крошечной модели кода. Программа и её статически определённые символы должны находиться в пределах 1 МБ друг от друга. Программы могут быть статически или динамически связаны.

-mcmodel=small

Генерирует код для малой модели кода. Программа и её статически определённые символы должны находиться в пределах 4 ГБ друг от друга. Программы могут быть статически или динамически связаны. Это модель кода по умолчанию.

-mcmodel=large

Генерирует код для большой модели кода. Не делается никаких предположений о адресах и размерах сегментов. Программы могут быть только статически связаны. Параметр -mcmodel=large несовместим с -mabi=ilp32, -fpic и -fPIC.

-mstrict-align
-mno-strict-align

Избегать или разрешать генерацию обращений к памяти, которые могут быть не выровнены на границе естественного объекта, как описано в спецификации архитектуры.

-momit-leaf-frame-pointer
-mno-omit-leaf-frame-pointer

Опускать или сохранять указатель на кадр в функциях листа. Первое поведение по умолчанию.

-mstack-protector-guard=guard
-mstack-protector-guard-reg=reg
-mstack-protector-guard-offset=offset

Генерирует код защиты стека с использованием канистры в позиции guard. Поддерживаемые позиции — ‘global’ для глобальной канистры или ‘sysreg’ для канистры в соответствующем системном регистре.

При последнем выборе параметры -mstack-protector-guard-reg=reg и -mstack-protector-guard-offset=offset дополнительно указывают, какой системный регистр использовать в качестве базового регистра для чтения канистры и с каким смещением от этого базового регистра. Нет значения по умолчанию для регистра или смещения, так как это предназначено исключительно для использования в ядре Linux.

-mtls-dialect=desc

Использовать описатели TLS в качестве механизма хранения данных на уровне потока для динамических обращений к переменным TLS. Это значение по умолчанию.

-mtls-dialect=traditional

Использовать традиционные TLS в качестве механизма хранения данных на уровне потока для динамических обращений к переменным TLS.

-mtls-size=size

Указать разрядность в битах непосредственных смещений TLS. Допустимые значения — 12, 24, 32, 48. Этот параметр требует binutils 2.26 или новее.

-mfix-cortex-a53-835769
-mno-fix-cortex-a53-835769

Включить или отключить исправление для ошибки ARM Cortex-A53 под номером 835769. Это подразумевает вставку инструкции NOP между инструкциями памяти и инструкциями 64-битного умножения-складывания целых чисел.

-mfix-cortex-a53-843419
-mno-fix-cortex-a53-843419

Включить или отключить исправление для ошибки ARM Cortex-A53 под номером 843419. Это исправление ошибки выполняется на этапе компоновки, и это передаст соответствующий флаг компоновщику.

-mlow-precision-recip-sqrt
-mno-low-precision-recip-sqrt

Включить или отключить приближение обратной квадратного корня. Этот параметр эффективен только при использовании -ffast-math или -funsafe-math-optimizations. Включение этого параметра уменьшает точность результатов обратной квадратного корня примерно до 16 бит для одинарной точности и до 32 бит для двойной точности.

-mlow-precision-sqrt
-mno-low-precision-sqrt

Включить или отключить приближение квадратного корня. Этот параметр эффективен только при использовании -ffast-math или -funsafe-math-optimizations. Включение этого параметра уменьшает точность результатов квадратного корня примерно до 16 бит для одинарной точности и до 32 бит для двойной точности. Если включено, оно подразумевает -mlow-precision-recip-sqrt.

-mlow-precision-div
-mno-low-precision-div

Включить или отключить приближение деления. Этот параметр эффективен только при использовании -ffast-math или -funsafe-math-optimizations. Включение этого параметра уменьшает точность результатов деления примерно до 16 бит для одинарной точности и до 32 бит для двойной точности.

-mtrack-speculation
-mno-track-speculation

Включить или отключить генерацию дополнительного кода для отслеживания упреждающего выполнения через условные ветвления. Состояние отслеживания затем может быть использовано компилятором при расширении вызовов __builtin_speculation_safe_copy, чтобы позволить сгенерировать более эффективную последовательность кода.

-moutline-atomics
-mno-outline-atomics

Включить или отключить вызовы вспомогательных функций вне строки для реализации атомных операций. Эти вспомогательные функции будут во время выполнения определять, можно ли использовать инструкции LSE из ARMv8.1-A; если нет, они будут использовать инструкции load/store-exclusive, которые присутствуют в базовой ISA ARMv8.0.

Этот параметр применим только при компиляции для базового набора команд ARMv8.0. Если используется более поздняя ревизия, например, -march=armv8.1-a или -march=armv8-a+lse, инструкции ARMv8.1-Atomics будут использоваться напрямую. То же самое относится к использованию -mcpu=, когда выбранный процессор поддерживает функцию ‘lse’. Этот параметр включен по умолчанию.

-march=name

Указывает имя целевой архитектуры и, необязательно, один или несколько модификаторов функций. Этот параметр имеет вид -march=arch{+[no]feature}*.

В таблице ниже приводятся допустимые значения для arch и функции, которые они включают по умолчанию:

Значение archАрхитектураВключает по умолчанию
‘armv8-a’Armv8-A‘+fp’, ‘+simd’
‘armv8.1-a’Armv8.1-A‘armv8-a’, ‘+crc’, ‘+lse’, ‘+rdma’
‘armv8.2-a’Armv8.2-A‘armv8.1-a’
‘armv8.3-a’Armv8.3-A‘armv8.2-a’, ‘+pauth’
‘armv8.4-a’Armv8.4-A‘armv8.3-a’, ‘+flagm’, ‘+fp16fml’, ‘+dotprod’
‘armv8.5-a’Armv8.5-A‘armv8.4-a’, ‘+sb’, ‘+ssbs’, ‘+predres’
‘armv8.6-a’Armv8.6-A‘armv8.5-a’, ‘+bf16’, ‘+i8mm’
‘armv8.7-a’Armv8.7-A‘armv8.6-a’, ‘+ls64’
‘armv8.8-a’Armv8.8-a‘armv8.7-a’, ‘+mops’
‘armv9-a’Armv9-A‘armv8.5-a’, ‘+sve’, ‘+sve2’
‘armv8-r’Armv8-R‘armv8-r’

Значение ‘native’ доступно в родных AArch64 GNU/Linux и заставляет компилятор выбрать архитектуру хост-системы. Этот параметр не имеет эффекта, если компилятор не может распознать архитектуру хост-системы.

Допустимые значения для feature перечислены в подразделе о -march и -mcpu Модификаторы функций. При конфликтующих модификаторах функций используется самый правый.

GCC использует name, чтобы определить, какие инструкции могут быть выпущены при генерации ассемблерного кода. Если -march указан без -mtune или -mcpu, код настроен на эффективную работу на широком диапазоне целевых процессоров, реализующих целевую архитектуру.

-mtune=name

Укажите имя целевого процессора, для которого GCC должен настраивать производительность кода. Допустимые значения для этого параметра: ‘generic’, ‘cortex-a35’, ‘cortex-a53’, ‘cortex-a55’, ‘cortex-a57’, ‘cortex-a72’, ‘cortex-a73’, ‘cortex-a75’, ‘cortex-a76’, ‘cortex-a76ae’, ‘cortex-a77’, ‘cortex-a65’, ‘cortex-a65ae’, ‘cortex-a34’, ‘cortex-a78’, ‘cortex-a78ae’, ‘cortex-a78c’, ‘ares’, ‘exynos-m1’, ‘emag’, ‘falkor’, ‘neoverse-512tvb’, ‘neoverse-e1’, ‘neoverse-n1’, ‘neoverse-n2’, ‘neoverse-v1’, ‘qdf24xx’, ‘saphira’, ‘phecda’, ‘xgene1’, ‘vulcan’, ‘octeontx’, ‘octeontx81’, ‘octeontx83’, ‘octeontx2’, ‘octeontx2t98’, ‘octeontx2t96’ ‘octeontx2t93’, ‘octeontx2f95’, ‘octeontx2f95n’, ‘octeontx2f95mm’, ‘a64fx’, ‘thunderx’, ‘thunderxt88’, ‘thunderxt88p1’, ‘thunderxt81’, ‘tsv110’, ‘thunderxt83’, ‘thunderx2t99’, ‘thunderx3t110’, ‘zeus’, ‘cortex-a57.cortex-a53’, ‘cortex-a72.cortex-a53’, ‘cortex-a73.cortex-a35’, ‘cortex-a73.cortex-a53’, ‘cortex-a75.cortex-a55’, ‘cortex-a76.cortex-a55’, ‘cortex-r82’, ‘cortex-x1’, ‘cortex-x2’, ‘cortex-a510’, ‘cortex-a710’, ‘ampere1’, ‘native’.

Значения ‘cortex-a57.cortex-a53’, ‘cortex-a72.cortex-a53’, ‘cortex-a73.cortex-a35’, ‘cortex-a73.cortex-a53’, ‘cortex-a75.cortex-a55’, ‘cortex-a76.cortex-a55’ указывают, что GCC должен настраиваться для системы big.LITTLE.

Значение ‘neoverse-512tvb’ указывает, что GCC должен настраиваться для ядер Neoverse, которые (а) реализуют SVE и (б) имеют общую пропускную способность вектора 512 бит за цикл. Другими словами, параметр сообщает GCC настроить для ядер Neoverse, которые могут выполнять 4 арифметические инструкции Advanced SIMD 128-битного размера за цикл и могут выполнять эквивалентное количество арифметических инструкций SVE за цикл (2 для 256-битного SVE, 4 для 128-битного SVE). Это более общее, чем настройка для конкретного ядра, такого как Neoverse V1, но более конкретное, чем стандартная настройка, описанная ниже.

Кроме того, в системах native AArch64 GNU/Linux значение ‘native’ настраивает производительность под систему хоста. Этот параметр не оказывает никакого влияния, если компилятор не может распознать процессор системы хоста.

Если ни один из параметров -mtune=, -mcpu= или -march= не указан, код настраивается на хорошую работу на широком спектре целевых процессоров.

Этот параметр не может быть дополнен модификаторами функций.

-mcpu=name

Укажите имя целевого процессора, необязательно дополненного одним или несколькими модификаторами функций. Этот параметр имеет вид -mcpu=cpu{+[no]feature}*, где допустимые значения для cpu такие же, как доступные для -mtune. Допустимые значения для feature описаны в подразд. -march и -mcpu Модификаторы функций. При наличии конфликтующих модификаторов функций используется самый правый модификатор.

GCC использует name для определения типа инструкций, которые могут быть выведены при генерации ассемблерного кода (как если бы был указан -march) и для определения целевого процессора, для которого настраивать производительность (как если бы был указан -mtune). Если этот параметр используется вместе с -march или -mtune, эти параметры имеют приоритет над соответствующей частью этого параметра.

-mcpu=neoverse-512tvb является специальным, так как он не относится к конкретному ядру, а вместо этого относится ко всем ядрам Neoverse, которые (а) реализуют SVE и (б) имеют общую пропускную способность вектора 512 бит в цикл. Если не переопределено параметром -march, -mcpu=neoverse-512tvb генерирует код, который может выполняться на ядре Neoverse V1, поскольку Neoverse V1 является первым ядром Neoverse с этими свойствами. Если не переопределено параметром -mtune, -mcpu=neoverse-512tvb настраивает код так же, как для -mtune=neoverse-512tvb.

-moverride=string

Переопределить решения по настройке, принятые бэкэндом в ответ на параметр -mtune=. Синтаксис, семантика и допустимые значения для string в этом параметре не гарантируются как неизменные между выпусками.

Этот параметр предназначен только для использования при разработке GCC.

-mverbose-cost-dump

Включить подробную выгрузку модели стоимости в файлы отладки. Этот параметр предоставлен для использования при отладке компилятора.

-mpc-relative-literal-loads
-mno-pc-relative-literal-loads

Включить или выключить загрузку литералов, относительных к PC. С этим параметром доступ к пулам литералов осуществляется с помощью одной инструкции и выводится после каждой функции. Это ограничивает максимальный размер функций до 1 МБ. Это включено по умолчанию для -mcmodel=tiny.

-msign-return-address=scope

Выберите область действия функции, на которую будет применено подписание возвращаемого адреса. Допустимые значения: ‘none’, которое отключает подписание возвращаемого адреса, ‘non-leaf’, которое включает подписание указателя для функций, которые не являются листовыми, и ‘all’, которое включает подписание указателя для всех функций. Значение по умолчанию — ‘none’. Этот параметр устарел и заменён параметром -mbranch-protection.

-mbranch-protection=none|standard|pac-ret[+leaf+b-key]|bti

Выберите функции защиты ветвлений для использования. ‘none’ по умолчанию и отключает все типы защиты ветвлений. ‘standard’ включает все типы функций защиты ветвлений. Если функция имеет дополнительные параметры настройки, то ‘standard’ устанавливает их на стандартный уровень. ‘pac-ret[+leaf]’ включает подписание возвращаемого адреса на стандартном уровне: подписывает функции, которые сохраняют возвращаемый адрес в память (функции, не являющиеся листовыми, практически всегда делают это), используя ключ a-key. Дополнительный аргумент ‘leaf’ можно использовать для расширения подписи, чтобы она включала и листовые функции. Дополнительный аргумент ‘b-key’ можно использовать для подписания функций с ключом B вместо ключа A. ‘bti’ включает механизм идентификации целевой ветви.

-mharden-sls=opts

Включить усовершенствования компилятора против умозрительных вычислений по прямой линии (SLS). opts — список параметров через запятую:

‘retbr’
‘blr’

Кроме того, ‘-mharden-sls=all’ включает всю защиту от SLS, а ‘-mharden-sls=none’ — отключает её.

-msve-vector-bits=bits

Укажите количество бит в регистре вектора SVE. Этот параметр действует только при включении SVE.

GCC поддерживает два формата генерации кода SVE: “независимый от длины вектора”, который работает с любым размером регистра вектора, и “специфичный для длины вектора”, который позволяет GCC делать предположения о длине вектора, когда это полезно для оптимизации. Возможные значения ‘bits’: ‘scalable’, ‘128’, ‘256’, ‘512’, ‘1024’ и ‘2048’. Указание ‘scalable’ выбирает формат независимый от длины вектора. В настоящее время ‘-msve-vector-bits=128’ также генерирует независимый от длины вектора вывод для больших целевых платформ. Все остальные значения генерируют код, специфичный для длины вектора. Поведение этих значений может измениться в будущих выпусках, и ни одно значение, кроме ‘scalable’, не должно использоваться для создания кода, совместимого с различными аппаратными длинами векторов SVE.

Значение по умолчанию — ‘-msve-vector-bits=scalable’, что генерирует код, не зависящий от длины вектора.

3.19.1.1 -march и -mcpu Модификаторы функций

Модификаторы функций, используемые с -march и -mcpu, могут быть любыми из следующих и их обратными nofeature:

‘crc’

Включить расширение CRC. По умолчанию включено для -march=armv8.1-a.

‘crypto’

Включить расширение Crypto. Также включает инструкции Advanced SIMD и с плавающей запятой.

‘fp’

Включить инструкции с плавающей запятой. По умолчанию включено для всех возможных значений опций -march и -mcpu.

‘simd’

Включить инструкции Advanced SIMD. Также включает инструкции с плавающей запятой. По умолчанию включено для всех возможных значений опций -march и -mcpu.

‘sve’

Включить инструкции расширения Scalable Vector. Также включает инструкции Advanced SIMD и с плавающей запятой.

‘lse’

Включить инструкции расширения Large System. По умолчанию включено для -march=armv8.1-a.

‘rdma’

Включить инструкции Round Double Multiply Accumulate. По умолчанию включено для -march=armv8.1-a.

‘fp16’

Включить расширение FP16. Также включает инструкции с плавающей запятой.

‘fp16fml’

Включить расширение FP16 fmla. Также включает расширения FP16 и инструкции с плавающей запятой. По умолчанию включено для -march=armv8.4-a. Использование этой опции с архитектурами до Armv8.2-A не поддерживается.

‘rcpc’

Включить расширение RcPc. Это не изменяет генерацию кода GCC, но передаётся в ассемблер, что позволяет инструкциям из расширения RcPc использовать inline asm-выражения.

‘dotprod’

Включить расширение Dot Product. Также включает инструкции Advanced SIMD.

‘aes’

Включить расширение криптографии Armv8-a aes и pmull. Также включает инструкции Advanced SIMD.

‘sha2’

Включить расширение криптографии Armv8-a sha2. Также включает инструкции Advanced SIMD.

‘sha3’

Включить расширение криптографии sha512 и sha3. Также включает инструкции Advanced SIMD. Использование этой опции с архитектурами до Armv8.2-A не поддерживается.

‘sm4’

Включить расширение криптографии sm3 и sm4. Также включает инструкции Advanced SIMD. Использование этой опции с архитектурами до Armv8.2-A не поддерживается.

‘profile’

Включить расширение Statistical Profiling. Эта опция предназначена только для включения расширения на уровне ассемблера и не влияет на генерацию кода.

‘rng’

Включить инструкции для генерации случайных чисел Armv8.5-a. Эта опция предназначена только для включения расширения на уровне ассемблера и не влияет на генерацию кода.

‘memtag’

Включить расширение Memory Tagging Armv8.5-a. Использование этой опции с архитектурами до Armv8.5-A не поддерживается.

‘sb’

Включить инструкцию Speculation Barrier Armv8-a. Эта опция предназначена только для включения расширения на уровне ассемблера и не влияет на генерацию кода. По умолчанию включено для -march=armv8.5-a.

‘ssbs’

Включить инструкцию Speculative Store Bypass Safe Armv8-a. Эта опция предназначена только для включения расширения на уровне ассемблера и не влияет на генерацию кода. По умолчанию включено для -march=armv8.5-a.

‘predres’

Включить инструкции для ограничения прогнозирования выполнения и данных Armv8-a. Эта опция предназначена только для включения расширения на уровне ассемблера и не влияет на генерацию кода. По умолчанию включено для -march=armv8.5-a.

‘sve2’

Включить Scalable Vector Extension 2 Armv8-a. Также включает инструкции SVE.

‘sve2-bitperm’

Включить инструкции SVE2 bitperm. Также включает инструкции SVE2.

‘sve2-sm4’

Включить инструкции SVE2 sm4. Также включает инструкции SVE2.

‘sve2-aes’

Включить инструкции SVE2 aes. Также включает инструкции SVE2.

‘sve2-sha3’

Включить инструкции SVE2 sha3. Также включает инструкции SVE2.

‘tme’

Включить Transactional Memory Extension.

‘i8mm’

Включить инструкции 8-битного целого матричного умножения. Также включает инструкции Advanced SIMD и с плавающей запятой. По умолчанию включено для -march=armv8.6-a. Использование этой опции с архитектурами до Armv8.2-A не поддерживается.

‘f32mm’

Включить инструкции 32-битного матричного умножения с плавающей запятой. Также включает инструкции SVE. Использование этой опции с архитектурами до Armv8.2-A не поддерживается.

‘f64mm’

Включить инструкции 64-битного матричного умножения с плавающей запятой. Также включает инструкции SVE. Использование этой опции с архитектурами до Armv8.2-A не поддерживается.

‘bf16’

Включить инструкции с плавающей запятой Brain Half-precision. Также включает инструкции Advanced SIMD и с плавающей запятой. По умолчанию включено для -march=armv8.6-a. Использование этой опции с архитектурами до Armv8.2-A не поддерживается.

‘ls64’

Включить инструкции 64-байтового атомарного загрузки и сохранения для ускорителей. По умолчанию включено для -march=armv8.7-a.

‘mops’

Включить инструкции для ускорения операций с памятью, таких как memcpy, memmove, memset. По умолчанию включено для -march=armv8.8-a

‘flagm’

Включить расширение инструкций управления флагами.

‘pauth’

Включить расширение аутентификации указателей.

Функция crypto подразумевает aes, sha2 и simd, которая, в свою очередь, подразумевает fp. И наоборот, nofp подразумевает nosimd, которая подразумевает nocrypto, noaes и nosha2.

Далее: Параметры Adapteva Epiphany, Назад: Параметры подмодели [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/AArch64-Options.html

Spec-Zone.ru

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