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-
Генерировать код для модели tiny. Программа и её статически определённые символы должны находиться в пределах 1 МБ друг от друга. Программы могут быть статически или динамически слинкованы.
-mcmodel=small-
Генерировать код для модели small. Программа и её статически определённые символы должны находиться в пределах 4 ГБ друг от друга. Программы могут быть статически или динамически слинкованы. Это модель кода по умолчанию.
-mcmodel=large-
Генерировать код для модели 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.
-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, которые присутствуют в базовом наборе команд ARMv8.0 ISA.
Этот параметр применим только при компиляции для базового набора команд 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’ ‘armv8.4-a’ Armv8.4-A ‘armv8.3-a’, ‘+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’ Значение ‘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’, ‘ares’, ‘exynos-m1’, ‘emag’, ‘falkor’, ‘neoverse-e1’, ‘neoverse-n1’, ‘neoverse-n2’, ‘neoverse-v1’, ‘neoverse-v2’, ‘neoverse-512tvb’, ‘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’, ‘ampere1’, ‘ampere1a’, ‘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, которые (a) реализуют SVE и (b) имеют общую пропускную способность вектора 512 бит в цикл. Другими словами, параметр сообщает GCC о необходимости настроить код для ядер Neoverse, которые могут выполнять 4 арифметические инструкции Advanced SIMD 128-бит за цикл и эквивалентное количество арифметических инструкций SVE за цикл (2 для 256-битного SVE, 4 для 128-битного SVE). Это более общее, чем настройка для конкретного ядра, такого как Neoverse V1, но более специфичное, чем стандартная настройка, описанная ниже.
Кроме того, на нативных системах 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, которые (a) реализуют SVE и (b) имеют общую пропускную способность вектора 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]’ включает подписание адреса возврата до стандартного уровня: подписывает функции, которые сохраняют адрес возврата в память (функции-нелистья практически всегда это делают) с помощью ключа а. Дополнительный аргумент ‘leaf’ может быть использован для расширения подписи, чтобы включить функции-листья. Дополнительный аргумент ‘b-key’ может быть использован для подписания функций ключом B вместо ключа A. ‘bti’ включает механизм идентификации целевых ветвей.
-mharden-sls=opts-
Включить усиление компилятора против прямолинейной спекуляции (SLS). opts — это список параметров через запятую из следующих вариантов:
- ‘retbr’
- ‘blr’
Кроме того, ‘-mharden-sls=all’ включает всю защиту от SLS, а ‘-mharden-sls=none’ отключает всю защиту от SLS.
-msve-vector-bits=bits-
Укажите количество бит в регистре вектора SVE. Этот параметр действует только при включении SVE.
GCC поддерживает два формата генерации кода SVE: вывод «независимый от длины вектора», который работает с любым размером регистра вектора, и вывод «специфичный для длины вектора», который позволяет GCC делать предположения о длине вектора, когда это полезно для оптимизации. Возможные значения ‘bits’: ‘scalable’, ‘128’, ‘256’, ‘512’, ‘1024’ и ‘2048’. Указание ‘scalable’ выбирает вывод, независимый от длины вектора. В настоящее время ‘-msve-vector-bits=128’ также генерирует вывод, независимый от длины вектора, для целевых плат big-endian. Все остальные значения генерируют код, специфичный для длины вектора. Поведение этих значений может измениться в будущих выпусках, и на них не следует полагаться для создания кода, совместимого с различными аппаратными длинами вектора 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 Extension. Также включает инструкции Advanced SIMD и с плавающей точкой.
- ‘lse’
Включить инструкции Large System Extension. По умолчанию включено для -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’
Включить расширение Armv8.5-a для меток памяти. Использование этого параметра с архитектурами до Armv8.5-A не поддерживается.
- ‘sb’
Включить инструкцию Armv8-a Speculation Barrier. Этот параметр предназначен только для включения расширения на уровне ассемблера и не влияет на генерацию кода. По умолчанию включено для -march=armv8.5-a.
- ‘ssbs’
Включить инструкцию Armv8-a Speculative Store Bypass Safe. Этот параметр предназначен только для включения расширения на уровне ассемблера и не влияет на генерацию кода. По умолчанию включено для -march=armv8.5-a.
- ‘predres’
Включить инструкции Armv8-a для ограничения выполнения и прогнозирования данных. Этот параметр предназначен только для включения расширения на уровне ассемблера и не влияет на генерацию кода. По умолчанию включено для -march=armv8.5-a.
- ‘sve2’
Включить Armv8-a Scalable Vector Extension 2. Также включает инструкции SVE.
- ‘sve2-bitperm’
Включить инструкции SVE2 bitperm. Также включает инструкции SVE2.
- ‘sve2-sm4’
Включить инструкции SVE2 sm4. Также включает инструкции SVE2.
- ‘sve2-aes’
Включить инструкции SVE2 aes. Также включает инструкции SVE2.
- ‘sve2-sha3’
Включить инструкции SVE2 sha3. Также включает инструкции SVE2.
- ‘tme’
Включить расширение Transactional Memory.
- ‘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 не поддерживается.
Функция crypto подразумевает aes, sha2 и simd, которая подразумевает fp. Обратно, nofp подразумевает nosimd, которая подразумевает nocrypto, noaes и nosha2.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/AArch64-Options.html