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 code model. Программа и её статически определённые символы должны располагаться в пределах 1 МБ друг от друга. Программы могут быть статически или динамически скомпонованы.
-
-mcmodel=small -
Генерация кода для модели small code model. Программа и её статически определённые символы должны располагаться в пределах 4 ГБ друг от друга. Программы могут быть статически или динамически скомпонованы. Это модель кода по умолчанию.
-
-mcmodel=large -
Генерация кода для модели large code model. Не делается никаких предположений о адресах и размерах секций. Программы могут быть только статически скомпонованы. Опция -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 для динамического доступа к переменным TLS. Это значение по умолчанию.
-
-mtls-dialect=traditional -
Использование традиционного TLS в качестве механизма 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’, ‘+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’ ‘armv9.1-a’ Armv9.1-A ‘armv9-a’, ‘+bf16’, ‘+i8mm’ ‘armv9.2-a’ Armv9.2-A ‘armv9.1-a’, ‘+ls64’ ‘armv9.3-a’ Armv9.3-A ‘armv9.2-a’, ‘+mops’ ‘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’, ‘neoverse-v2’, ‘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-x1c’, ‘cortex-x2’, ‘cortex-x3’, ‘cortex-a510’, ‘cortex-a710’, ‘cortex-a715’, ‘ampere1’, ‘ampere1a’, ‘cobalt-100’ и ‘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 Feature Modifiers. В случае конфликта модификаторов функций используется самый правый модификатор.
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]’ включает подпись адреса возврата на стандартном уровне: подписывает функции, сохраняющие адрес возврата в память (функции, не являющиеся листовыми, практически всегда делают это) с использованием ключа a. Необязательный аргумент ‘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’ также генерирует вывод, не зависящий от длины вектора, для больших целевых платформ. Все остальные значения генерируют код, зависящий от длины вектора. Поведение этих значений может измениться в будущих выпусках, и на создание кода, переносимого на разные аппаратные длины вектора SVE, следует полагаться только на значение ‘scalable’.
Значение по умолчанию — ‘-msve-vector-bits=scalable’, которое генерирует код, не зависящий от длины вектора.
3.19.1.1 Модификаторы функций -march и -mcpu
Модификаторы функций, используемые с -march и -mcpu, могут быть любыми из следующих и их инверсиями nofeature:
- ‘crc’
Включить расширение CRC. Оно включено по умолчанию для -march=armv8.1-a.
- ‘crypto’
Включить расширение Crypto. Это также включает расширенные инструкции SIMD и с плавающей запятой.
- ‘fp’
Включить инструкции с плавающей запятой. Они включены по умолчанию для всех возможных значений параметров -march и -mcpu.
- ‘simd’
Включить расширенные инструкции SIMD. Это также включает инструкции с плавающей запятой. Они включены по умолчанию для всех возможных значений параметров -march и -mcpu.
- ‘sve’
Включить инструкции расширения Scalable Vector. Это также включает расширенные инструкции 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. Это включает использование инструкций LDAPR для атомарной семантики load-acquire и передает их сборщику, позволяя инструкциям из расширения RCpc использоваться в инструкциях inline asm.
- ‘dotprod’
Включить расширение Dot Product. Это также включает расширенные инструкции SIMD.
- ‘aes’
Включить расширение криптографии Armv8-a aes и pmull. Это также включает расширенные инструкции SIMD.
- ‘sha2’
Включить расширение криптографии Armv8-a sha2. Это также включает расширенные инструкции SIMD.
- ‘sha3’
Включить расширение криптографии sha512 и sha3. Это также включает расширенные инструкции SIMD. Использование данного параметра с архитектурами до Armv8.2-A не поддерживается.
- ‘sm4’
Включить расширение криптографии sm3 и sm4. Это также включает расширенные инструкции 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’
Включить инструкции bitperm SVE2. Это также включает инструкции SVE2.
- ‘sve2-sm4’
Включить инструкции sm4 SVE2. Это также включает инструкции SVE2.
- ‘sve2-aes’
Включить инструкции aes SVE2. Это также включает инструкции SVE2.
- ‘sve2-sha3’
Включить инструкции sha3 SVE2. Это также включает инструкции SVE2.
- ‘tme’
Включить Transactional Memory Extension.
- ‘i8mm’
Включить инструкции умножения матриц целых чисел 8-битные. Это также включает расширенные инструкции SIMD и с плавающей запятой. Этот параметр включён по умолчанию для -march=armv8.6-a. Использование данного параметра с архитектурами до Armv8.2-A не поддерживается.
- ‘f32mm’
Включить инструкции умножения матриц с плавающей запятой 32-битные. Это также включает инструкции SVE. Использование данного параметра с архитектурами до Armv8.2-A не поддерживается.
- ‘f64mm’
Включить инструкции умножения матриц с плавающей запятой 64-битные. Это также включает инструкции SVE. Использование данного параметра с архитектурами до Armv8.2-A не поддерживается.
- ‘bf16’
Включить инструкции с плавающей запятой brain half-precision. Это также включает расширенные инструкции SIMD и с плавающей запятой. Этот параметр включён по умолчанию для -march=armv8.6-a. Использование данного параметра с архитектурами до Armv8.2-A не поддерживается.
- ‘ls64’
Включить атомарные инструкции загрузки и сохранения 64-байтовых данных для ускорителей. Этот параметр включён по умолчанию для -march=armv8.7-a.
- ‘mops’
Включить инструкции для ускорения операций с памятью, таких как
memcpy,memmove,memset. Этот параметр включён по умолчанию для -march=armv8.8-a- ‘flagm’
Включить расширение инструкций управления флагами.
- ‘pauth’
Включить расширение аутентификации указателей.
- ‘cssc’
-
Включить инструкции Common Short Sequence Compression.
Функция 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-13.3.0/gcc/AArch64-Options.html