Spec-Zone.ru › GCC 13

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, код настроен на хорошую работу на различных целевых процессорах, которые реализуют целевую архитектуру.

END_OF_DOCUMENT_MARKER
-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’, которое генерирует код, не зависящий от длины вектора.

  • -march и -mcpu Feature Modifiers

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API