3.18.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-
Генерировать код, использующий только регистры общего назначения. Это предотвратит использование компилятором регистров для операций с плавающей запятой и расширенной SIMD, но не наложит никаких ограничений на ассемблер.
-mlittle-endian-
Генерировать код в формате little-endian. Это значение по умолчанию, когда GCC настроен для целевой платформы ‘aarch64-*-*’, но не для ‘aarch64_be-*-*’.
-mcmodel=tiny-
Генерировать код для модели кода tiny. Программа и её статически определённые символы должны находиться в пределах 1 МБ друг от друга. Программы могут быть статически или динамически слинкованы.
-mcmodel=small-
Генерировать код для модели кода small. Программа и её статически определённые символы должны находиться в пределах 4 ГБ друг от друга. Программы могут быть статически или динамически слинкованы. Это модель кода по умолчанию.
-mcmodel=large-
Генерировать код для модели кода large. Это не делает никаких предположений о адресах и размерах секций. Программы могут быть только статически слинкованы.
-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. Этот параметр требует бинарных утилит 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 — ‘armv8-a’, ‘armv8.1-a’, ‘armv8.2-a’, ‘armv8.3-a’, ‘armv8.4-a’, ‘armv8.5-a’ или native.
Значение ‘armv8.5-a’ подразумевает ‘armv8.4-a’ и включает поддержку компилятора для расширений архитектуры ARMv8.5-A.
Значение ‘armv8.4-a’ подразумевает ‘armv8.3-a’ и включает поддержку компилятора для расширений архитектуры ARMv8.4-A.
Значение ‘armv8.3-a’ подразумевает ‘armv8.2-a’ и включает поддержку компилятора для расширений архитектуры ARMv8.3-A.
Значение ‘armv8.2-a’ подразумевает ‘armv8.1-a’ и включает поддержку компилятора для расширений архитектуры ARMv8.2-A.
Значение ‘armv8.1-a’ подразумевает ‘armv8-a’ и включает поддержку компилятора для расширения архитектуры ARMv8.1-A. В частности, это включает функции ‘+crc’, ‘+lse’ и ‘+rdma’.
Значение ‘native’ доступно в 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’, ‘ares’, ‘exynos-m1’, ‘emag’, ‘falkor’, ‘neoverse-e1’, ‘neoverse-n1’, ‘neoverse-n2’, ‘neoverse-v1’, ‘neoverse-512tvb’, ‘qdf24xx’, ‘saphira’, ‘phecda’, ‘xgene1’, ‘vulcan’, ‘octeontx’, ‘octeontx81’, ‘octeontx83’, ‘a64fx’, ‘thunderx’, ‘thunderxt88’, ‘thunderxt88p1’, ‘thunderxt81’, ‘tsv110’, ‘thunderxt83’, ‘thunderx2t99’, ‘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’ ‘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]|bti-
Выберите используемые функции защиты ветвлений. ‘none’ — значение по умолчанию и отключает все типы защиты ветвлений. ‘standard’ включает все типы функций защиты ветвлений. Если для функции есть дополнительные параметры настройки, то ‘standard’ устанавливает их в стандартное значение. ‘pac-ret[+leaf]’ включает подписание адреса возврата в стандартном режиме: подписывает функции, сохраняющие адрес возврата в память (функции, не являющиеся листовыми, практически всегда это делают) с помощью ключа a. Необязательный аргумент ‘leaf’ может быть использован для включения подписи для листовых функций. ‘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’ также генерирует вывод, не зависящий от длины вектора. Все остальные значения генерируют код, специфичный для длины вектора. Поведение этих значений может измениться в будущих выпусках, и на значения, кроме ‘scalable’, не следует полагаться для создания кода, совместимого с различными аппаратными длинами векторов SVE.
Значение по умолчанию — ‘-msve-vector-bits=scalable’, что создаёт код, не зависящий от длины вектора.
3.18.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’
Включить расширение Memory Tagging 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.
Функция 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-9.5.0/gcc/AArch64-Options.html