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.
-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-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’, ‘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 использует имя для определения типа инструкций, которые он может генерировать при генерации ассемблерного кода (как если бы это было сделано с помощью -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=. Синтаксис, семантика и допустимые значения для строка в этом параметре не гарантируются как согласованные между выпусками.
Этот параметр предназначен только для использования при разработке 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’ её отключает.
-msve-vector-bits=bits-
Укажите количество битов в регистре вектора SVE. Этот параметр имеет эффект только при включённом SVE.
GCC поддерживает два вида генерации кода SVE: «независимый от длины вектора» вывод, который работает с любым размером регистра вектора, и «специфичный для длины вектора» вывод, позволяющий GCC делать предположения о длине вектора, когда это полезно для оптимизации. Возможные значения ‘bits’: ‘scalable’, ‘128’, ‘256’, ‘512’, ‘1024’ и ‘2048’. Указание ‘scalable’ выбирает вывод, независимый от длины вектора. В настоящее время ‘-msve-vector-bits=128’ также генерирует вывод, независимый от длины вектора, для целевых платформ с big-endian архитектурой. Все остальные значения генерируют код, специфичный для длины вектора. Поведение этих значений может измениться в будущих выпусках, и ни одно значение, кроме ‘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 crypto. Также включает инструкции Advanced SIMD.
- ‘sha2’
Включить расширение Armv8-a sha2 crypto. Также включает инструкции Advanced SIMD.
- ‘sha3’
Включить расширение sha512 и sha3 crypto. Также включает инструкции Advanced SIMD. Использование этой опции с архитектурами до Armv8.2-A не поддерживается.
- ‘sm4’
Включить расширение sm3 и sm4 crypto. Также включает инструкции Advanced SIMD. Использование этой опции с архитектурами до Armv8.2-A не поддерживается.
- ‘profile’
Включить расширение Statistical Profiling. Эта опция предназначена только для включения расширения на уровне ассемблера и не влияет на генерацию кода.
- ‘rng’
Включить инструкции Armv8.5-a Random Number. Эта опция предназначена только для включения расширения на уровне ассемблера и не влияет на генерацию кода.
- ‘memtag’
Включить расширение Armv8.5-a Memory Tagging. Использование этой опции с архитектурами до 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 Execution and Data Prediction Restriction. Эта опция предназначена только для включения расширения на уровне ассемблера и не влияет на генерацию кода. По умолчанию включено для -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 не поддерживается.
- ‘flagm’
Включить расширение инструкций обработки флагов.
- ‘pauth’
-
Включить расширение аутентификации указателей.
Функция 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-11.4.0/gcc/AArch64-Options.html