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