3.19.5 Параметры ARM
Эти параметры ‘-m’ определены для порта ARM:
-
-mabi=name -
Генерировать код для указанного ABI. Допустимые значения: ‘apcs-gnu’, ‘atpcs’, ‘aapcs’, ‘aapcs-linux’ и ‘iwmmxt’.
-
-mapcs-frame -
Генерировать кадр стека, совместимый со стандартом вызовов процедур ARM для всех функций, даже если это не строго необходимо для корректной работы кода. Указание -fomit-frame-pointer с этим параметром приводит к тому, что кадры стека не генерируются для функций-листьев. По умолчанию используется -mno-apcs-frame. Этот параметр устарел.
-
-mapcs -
Это синоним для -mapcs-frame и устарел.
-
-mthumb-interwork -
Генерировать код, поддерживающий вызовы между наборами команд ARM и Thumb. Без этого параметра на архитектурах до v5 два набора команд не могут надёжно использоваться внутри одной программы. По умолчанию используется -mno-thumb-interwork, так как при указании -mthumb-interwork генерируется немного больший код. В конфигурациях AAPCS этот параметр бессмысленен.
-
-mno-sched-prolog -
Препятствовать переупорядочению инструкций в прологе функции или слиянию этих инструкций с инструкциями в теле функции. Это означает, что все функции начинаются с узнаваемого набора инструкций (или, фактически, с одного из небольшого набора различных прологов функций), и эта информация может быть использована для нахождения начала функций внутри исполняемого фрагмента кода. По умолчанию используется -msched-prolog.
-
-mfloat-abi=name -
Указывает, какой ABI для операций с плавающей точкой использовать. Допустимые значения: ‘soft’, ‘softfp’ и ‘hard’.
Указание ‘soft’ заставляет GCC генерировать вывод, содержащий вызовы библиотек для операций с плавающей точкой. ‘softfp’ позволяет генерировать код с использованием аппаратных инструкций для плавающей точки, но при этом использует соглашения о вызовах для soft-float. ‘hard’ позволяет генерировать инструкции с плавающей точкой и использует соглашения о вызовах, специфичные для FPU.
Значение по умолчанию зависит от конкретной конфигурации целевой системы. Обратите внимание, что ABI hard-float и soft-float не совместимы при линковке; вы должны скомпилировать всю программу с одинаковым ABI и связать её с соответствующим набором библиотек.
-
-mgeneral-regs-only -
Генерировать код, использующий только регистры общего назначения. Это предотвратит использование компилятором регистров для плавающей точки и Advanced SIMD, но не наложит никаких ограничений на ассемблер.
-
-mlittle-endian -
Генерировать код для процессора, работающего в режиме little-endian. Это значение по умолчанию для всех стандартных конфигураций.
-
-mbig-endian -
Генерировать код для процессора, работающего в режиме big-endian; по умолчанию код компилируется для процессора little-endian.
-
-mbe8 -mbe32-
При линковке big-endian изображения выбирайте между форматами BE8 и BE32. Параметр не оказывает влияния на little-endian изображения и игнорируется. По умолчанию зависит от выбранной целевой архитектуры. Для архитектур ARMv6 и более поздних значение по умолчанию BE8, для более старых архитектур — BE32. Формат BE32 устарел ARM.
-
-march=name[+extension…] -
Это определяет имя целевой архитектуры ARM. GCC использует это имя для определения типа инструкций, которые могут быть выпущены при генерации ассемблерного кода. Этот параметр может быть использован вместе с или вместо параметра -mcpu=.
Допустимые имена: ‘armv4t’, ‘armv5t’, ‘armv5te’, ‘armv6’, ‘armv6j’, ‘armv6k’, ‘armv6kz’, ‘armv6t2’, ‘armv6z’, ‘armv6zk’, ‘armv7’, ‘armv7-a’, ‘armv7ve’, ‘armv8-a’, ‘armv8.1-a’, ‘armv8.2-a’, ‘armv8.3-a’, ‘armv8.4-a’, ‘armv8.5-a’, ‘armv8.6-a’, ‘armv9-a’, ‘armv7-r’, ‘armv8-r’, ‘armv6-m’, ‘armv6s-m’, ‘armv7-m’, ‘armv7e-m’, ‘armv8-m.base’, ‘armv8-m.main’, ‘armv8.1-m.main’, ‘armv9-a’, ‘iwmmxt’ и ‘iwmmxt2’.
Кроме того, следующие архитектуры, не поддерживающие состояние выполнения Thumb, распознаются, но поддержка устарела: ‘armv4’.
Многие архитектуры поддерживают расширения. Их можно добавить, добавив ‘+расширение’ к имени архитектуры. Параметры расширений обрабатываются в порядке следования, и возможности накапливаются. Расширение также включит все необходимые базовые расширения, от которых оно зависит. Например, расширение ‘+crypto’ всегда включит расширение ‘+simd’. Исключением из аддитивного построения являются расширения, которые имеют префикс ‘+no…’: эти расширения отключают указанный параметр и любые другие расширения, которые могут зависеть от наличия этого расширения.
Например, ‘-march=armv7-a+simd+nofp+vfpv4’ эквивалентно написанию ‘-march=armv7-a+vfpv4’, так как параметр ‘+simd’ полностью отключён параметром ‘+nofp’, который следует за ним.
Большинство имён расширений имеют общее название, но имеют действие, зависящее от архитектуры, к которой они применяются. Например, параметр ‘+simd’ может быть применён как к архитектуре ‘armv7-a’, так и к архитектуре ‘armv8-a’, но включит исходные расширения Advanced SIMD (Neon) ARMv7-A для ‘armv7-a’ и вариант ARMv8-A для ‘armv8-a’.
В таблице ниже перечислены поддерживаемые расширения для каждой архитектуры. Архитектуры, не указанные в таблице, не поддерживают никаких расширений.
- ‘armv5te’
- ‘armv6’
- ‘armv6j’
- ‘armv6k’
- ‘armv6kz’
- ‘armv6t2’
- ‘armv6z’
- ‘armv6zk’
-
- ‘+fp’
-
Инструкции с плавающей запятой VFPv2. Расширение ‘+vfpv2’ может использоваться как псевдоним для этого расширения.
- ‘+nofp’
Отключение инструкций с плавающей запятой.
- ‘armv7’
-
Общий подмножество архитектур ARMv7-A, ARMv7-R и ARMv7-M.
- ‘+fp’
-
Инструкции с плавающей запятой VFPv3, с 16 регистрами двойной точности. Расширение ‘+vfpv3-d16’ может использоваться как псевдоним для этого расширения. Обратите внимание, что плавающая запятая не поддерживается базовой архитектурой ARMv7-M, но совместима с архитектурами ARMv7-A и ARMv7-R.
- ‘+nofp’
Отключение инструкций с плавающей запятой.
- ‘armv7-a’
-
- ‘+mp’
-
Расширение для многопроцессорных систем.
- ‘+sec’
-
Расширение безопасности.
- ‘+fp’
-
Инструкции с плавающей запятой VFPv3, с 16 регистрами двойной точности. Расширение ‘+vfpv3-d16’ может использоваться как псевдоним для этого расширения.
- ‘+simd’
-
Расширенные инструкции SIMD (Neon) v1 и инструкции с плавающей запятой VFPv3. Расширения ‘+neon’ и ‘+neon-vfpv3’ могут использоваться как псевдонимы для этого расширения.
- ‘+vfpv3’
-
Инструкции с плавающей запятой VFPv3, с 32 регистрами двойной точности.
- ‘+vfpv3-d16-fp16’
-
Инструкции с плавающей запятой VFPv3, с 16 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.
- ‘+vfpv3-fp16’
-
Инструкции с плавающей запятой VFPv3, с 32 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.
- ‘+vfpv4-d16’
-
Инструкции с плавающей запятой VFPv4, с 16 регистрами двойной точности.
- ‘+vfpv4’
-
Инструкции с плавающей запятой VFPv4, с 32 регистрами двойной точности.
- ‘+neon-fp16’
-
Расширенные инструкции SIMD (Neon) v1 и инструкции с плавающей запятой VFPv3, с операциями преобразования чисел с плавающей запятой полуточной точности.
- ‘+neon-vfpv4’
-
Расширенные инструкции SIMD (Neon) v2 и инструкции с плавающей запятой VFPv4.
- ‘+nosimd’
-
Отключение инструкций Advanced SIMD (не отключает плавающую запятую).
- ‘+nofp’
Отключение инструкций с плавающей запятой и Advanced SIMD.
- ‘armv7ve’
-
Расширенная версия архитектуры ARMv7-A с поддержкой виртуализации.
- ‘+fp’
-
Инструкции с плавающей запятой VFPv4, с 16 регистрами двойной точности. Расширение ‘+vfpv4-d16’ может использоваться как псевдоним для этого расширения.
- ‘+simd’
-
Расширенные инструкции SIMD (Neon) v2 и инструкции с плавающей запятой VFPv4. Расширение ‘+neon-vfpv4’ может использоваться как псевдоним для этого расширения.
- ‘+vfpv3-d16’
-
Инструкции с плавающей запятой VFPv3, с 16 регистрами двойной точности.
- ‘+vfpv3’
-
Инструкции с плавающей запятой VFPv3, с 32 регистрами двойной точности.
- ‘+vfpv3-d16-fp16’
-
Инструкции с плавающей запятой VFPv3, с 16 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.
- ‘+vfpv3-fp16’
-
Инструкции с плавающей запятой VFPv3, с 32 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.
- ‘+vfpv4-d16’
-
Инструкции с плавающей запятой VFPv4, с 16 регистрами двойной точности.
- ‘+vfpv4’
-
Инструкции с плавающей запятой VFPv4, с 32 регистрами двойной точности.
- ‘+neon’
-
Расширенные инструкции SIMD (Neon) v1 и инструкции с плавающей запятой VFPv3. Расширение ‘+neon-vfpv3’ может использоваться как псевдоним для этого расширения.
- ‘+neon-fp16’
-
Расширенные инструкции SIMD (Neon) v1 и инструкции с плавающей запятой VFPv3, с операциями преобразования чисел с плавающей запятой полуточной точности.
- ‘+nosimd’
-
Отключение инструкций Advanced SIMD (не отключает плавающую запятую).
- ‘+nofp’
Отключение инструкций с плавающей запятой и Advanced SIMD.
- ‘armv8-a’
-
- ‘+crc’
Инструкции проверки циклического избытка (CRC).
- ‘+simd’
Расширенные инструкции SIMD и с плавающей запятой ARMv8-A.
- ‘+crypto’
Криптографические инструкции.
- ‘+nocrypto’
Отключение криптографических инструкций.
- ‘+nofp’
Отключение инструкций с плавающей запятой, Advanced SIMD и криптографических инструкций.
- ‘+sb’
Инструкция барьера упреждения.
- ‘+predres’
Инструкции ограничения предсказания выполнения и данных.
- ‘armv8.1-a’
-
- ‘+simd’
-
Расширенные инструкции SIMD и с плавающей запятой ARMv8.1-A.
- ‘+crypto’
-
Криптографические инструкции. Это также включает расширенные инструкции SIMD и с плавающей запятой.
- ‘+nocrypto’
-
Отключение криптографических инструкций.
- ‘+nofp’
-
Отключение инструкций с плавающей запятой, Advanced SIMD и криптографических инструкций.
- ‘+sb’
-
Инструкция барьера упреждения.
- ‘+predres’
Инструкции ограничения предсказания выполнения и данных.
- ‘armv8.2-a’
- ‘armv8.3-a’
-
- ‘+fp16’
-
Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает расширенные инструкции SIMD и с плавающей запятой.
- ‘+fp16fml’
-
Расширение fmla для чисел с плавающей запятой полуточной точности. Это также включает расширение чисел с плавающей запятой полуточной точности, Advanced SIMD и инструкции с плавающей запятой.
- ‘+simd’
-
Расширенные инструкции SIMD и с плавающей запятой ARMv8.1-A.
- ‘+crypto’
-
Криптографические инструкции. Это также включает расширенные инструкции SIMD и с плавающей запятой.
- ‘+dotprod’
-
Включить расширение Dot Product. Это также включает расширенные инструкции SIMD.
- ‘+nocrypto’
-
Отключить криптографическое расширение.
- ‘+nofp’
-
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘+sb’
-
Инструкция барьера упреждения.
- ‘+predres’
-
Инструкции ограничения предсказания выполнения и данных.
- ‘+i8mm’
-
Инструкции умножения матриц целых чисел 8-битного размера. Это также включает расширенные инструкции SIMD и с плавающей запятой.
- ‘+bf16’
Инструкции с плавающей запятой полуточной точности. Это также включает расширенные инструкции SIMD и с плавающей запятой.
- ‘armv8.4-a’
-
- ‘+fp16’
-
Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает расширенные инструкции SIMD и с плавающей запятой, а также расширение Dot Product и расширение fmla для чисел с плавающей запятой полуточной точности.
- ‘+simd’
-
Расширенные инструкции SIMD и с плавающей запятой ARMv8.3-A, а также расширение Dot Product.
- ‘+crypto’
-
Криптографические инструкции. Это также включает расширенные инструкции SIMD и с плавающей запятой, а также расширение Dot Product.
- ‘+nocrypto’
-
Отключение криптографического расширения.
- ‘+nofp’
-
Отключение инструкций с плавающей запятой, Advanced SIMD и криптографических инструкций.
- ‘+sb’
-
Инструкция барьера упреждения.
- ‘+predres’
-
Инструкции ограничения предсказания выполнения и данных.
- ‘+i8mm’
-
Инструкции умножения матриц целых чисел 8-битного размера. Это также включает расширенные инструкции SIMD и с плавающей запятой.
- ‘+bf16’
Инструкции с плавающей запятой полуточной точности. Это также включает расширенные инструкции SIMD и с плавающей запятой.
- ‘armv8.5-a’
-
- ‘+fp16’
-
Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product и расширение fmla для чисел с плавающей запятой полуточной точности.
- ‘+simd’
-
Инструкции Advanced SIMD и с плавающей запятой ARMv8.3-A, а также расширение Dot Product.
- ‘+crypto’
-
Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product.
- ‘+nocrypto’
-
Отключить криптографическое расширение.
- ‘+nofp’
-
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘+i8mm’
-
Инструкции умножения матриц целых чисел 8-битной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+bf16’
Инструкции с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘armv8.6-a’
-
- ‘+fp16’
-
Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product и расширение fmla для чисел с плавающей запятой полуточной точности.
- ‘+simd’
-
Инструкции Advanced SIMD и с плавающей запятой ARMv8.3-A, а также расширение Dot Product.
- ‘+crypto’
-
Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product.
- ‘+nocrypto’
-
Отключить криптографическое расширение.
- ‘+nofp’
-
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘+i8mm’
-
Инструкции умножения матриц целых чисел 8-битной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+bf16’
Инструкции с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘armv7-r’
-
- ‘+fp.sp’
-
Инструкции с плавающей запятой VFPv3 одинарной точности. Расширение ‘+vfpv3xd’ может использоваться как псевдоним для этого расширения.
- ‘+fp’
-
Инструкции с плавающей запятой VFPv3 двойной точности с 16 регистрами двойной точности. Расширение +vfpv3-d16 может использоваться как псевдоним для этого расширения.
- ‘+vfpv3xd-d16-fp16’
-
Инструкции с плавающей запятой VFPv3 одинарной точности с 16 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.
- ‘+vfpv3-d16-fp16’
-
Инструкции с плавающей запятой VFPv3 двойной точности с 16 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.
- ‘+nofp’
-
Отключить расширение с плавающей запятой.
- ‘+idiv’
-
Инструкции целочисленного деления в состоянии ARM.
- ‘+noidiv’
Отключить расширение целочисленного деления в состоянии ARM.
- ‘armv7e-m’
-
- ‘+fp’
-
Инструкции с плавающей запятой VFPv4 одинарной точности.
- ‘+fpv5’
-
Инструкции с плавающей запятой FPv5 одинарной точности.
- ‘+fp.dp’
-
Инструкции с плавающей запятой FPv5 одинарной и двойной точности.
- ‘+nofp’
Отключить расширения с плавающей запятой.
- ‘armv8.1-m.main’
-
- ‘+dsp’
-
Инструкции DSP.
- ‘+mve’
-
Инструкции целочисленного расширения вектора профиля M (MVE).
- ‘+mve.fp’
-
Инструкции целочисленного расширения вектора профиля M (MVE) и инструкции с плавающей запятой одинарной точности.
- ‘+fp’
-
Инструкции с плавающей запятой одинарной точности.
- ‘+fp.dp’
-
Инструкции с плавающей запятой одинарной и двойной точности.
- ‘+nofp’
-
Отключить расширение с плавающей запятой.
- ‘+cdecp0, +cdecp1, ... , +cdecp7’
-
Включить расширение Custom Datapath Extension (CDE) для выбранных сопроцессоров в соответствии с номерами в опциях в диапазоне от 0 до 7.
- ‘+pacbti’
Включить расширение Pointer Authentication and Branch Target Identification.
- ‘armv8-m.main’
-
- ‘+dsp’
-
Инструкции DSP.
- ‘+nodsp’
-
Отключить расширение DSP.
- ‘+fp’
-
Инструкции с плавающей запятой одинарной точности.
- ‘+fp.dp’
-
Инструкции с плавающей запятой одинарной и двойной точности.
- ‘+nofp’
-
Отключить расширение с плавающей запятой.
- ‘+cdecp0, +cdecp1, ... , +cdecp7’
Включить расширение Custom Datapath Extension (CDE) для выбранных сопроцессоров в соответствии с номерами в опциях в диапазоне от 0 до 7.
- ‘armv8-r’
-
- ‘+crc’
Инструкции Cyclic Redundancy Check (CRC).
- ‘+fp.sp’
Инструкции с плавающей запятой FPv5 одинарной точности.
- ‘+simd’
Инструкции Advanced SIMD и с плавающей запятой ARMv8-A.
- ‘+crypto’
Криптографические инструкции.
- ‘+nocrypto’
Отключить криптографические инструкции.
- ‘+nofp’
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
-march=native заставляет компилятор автоматически определять архитектуру компьютера сборки. В настоящее время эта функция поддерживается только в GNU/Linux, и не все архитектуры распознаются. Если автоматическое определение не выполняется, опция не оказывает никакого эффекта.
-
-
-mtune=name
-
Этот параметр указывает имя целевого процессора ARM, для которого GCC должен настраивать производительность кода. Для некоторых реализаций ARM лучшая производительность может быть достигнута с использованием этого параметра. Допустимые имена: ‘arm7tdmi’, ‘arm7tdmi-s’, ‘arm710t’, ‘arm720t’, ‘arm740t’, ‘strongarm’, ‘strongarm110’, ‘strongarm1100’, ‘strongarm1110’, ‘arm8’, ‘arm810’, ‘arm9’, ‘arm9e’, ‘arm920’, ‘arm920t’, ‘arm922t’, ‘arm946e-s’, ‘arm966e-s’, ‘arm968e-s’, ‘arm926ej-s’, ‘arm940t’, ‘arm9tdmi’, ‘arm10tdmi’, ‘arm1020t’, ‘arm1026ej-s’, ‘arm10e’, ‘arm1020e’, ‘arm1022e’, ‘arm1136j-s’, ‘arm1136jf-s’, ‘mpcore’, ‘mpcorenovfp’, ‘arm1156t2-s’, ‘arm1156t2f-s’, ‘arm1176jz-s’, ‘arm1176jzf-s’, ‘generic-armv7-a’, ‘cortex-a5’, ‘cortex-a7’, ‘cortex-a8’, ‘cortex-a9’, ‘cortex-a12’, ‘cortex-a15’, ‘cortex-a17’, ‘cortex-a32’, ‘cortex-a35’, ‘cortex-a53’, ‘cortex-a55’, ‘cortex-a57’, ‘cortex-a72’, ‘cortex-a73’, ‘cortex-a75’, ‘cortex-a76’, ‘cortex-a76ae’, ‘cortex-a77’, ‘cortex-a78’, ‘cortex-a78ae’, ‘cortex-a78c’, ‘cortex-a710’, ‘ares’, ‘cortex-r4’, ‘cortex-r4f’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-r52’, ‘cortex-r52plus’, ‘cortex-m0’, ‘cortex-m0plus’, ‘cortex-m1’, ‘cortex-m3’, ‘cortex-m4’, ‘cortex-m7’, ‘cortex-m23’, ‘cortex-m33’, ‘cortex-m35p’, ‘cortex-m55’, ‘cortex-m85’, ‘cortex-x1’, ‘cortex-x1c’, ‘cortex-m1.small-multiply’, ‘cortex-m0.small-multiply’, ‘cortex-m0plus.small-multiply’, ‘exynos-m1’, ‘marvell-pj4’, ‘neoverse-n1’, ‘neoverse-n2’, ‘neoverse-v1’, ‘xscale’, ‘iwmmxt’, ‘iwmmxt2’, ‘ep9312’, ‘fa526’, ‘fa626’, ‘fa606te’, ‘fa626te’, ‘fmp626’, ‘fa726te’, ‘star-mc1’, ‘xgene1’.
Кроме того, этот параметр может указать, что GCC должен настроить производительность кода для системы big.LITTLE. Допустимые имена: ‘cortex-a15.cortex-a7’, ‘cortex-a17.cortex-a7’, ‘cortex-a57.cortex-a53’, ‘cortex-a72.cortex-a53’, ‘cortex-a72.cortex-a35’, ‘cortex-a73.cortex-a53’, ‘cortex-a75.cortex-a55’, ‘cortex-a76.cortex-a55’.
-mtune=generic-arch указывает, что GCC должен настроить производительность для комбинации процессоров в архитектуре arch. Цель — сгенерировать код, который будет хорошо работать на наиболее популярных процессорах в данный момент, балансируя между оптимизациями, которые приносят пользу некоторым процессорам в этом диапазоне, и избегая проблем с производительностью других процессоров. Последствия использования этого параметра могут изменяться в будущих версиях GCC по мере появления и исчезновения моделей процессоров.
-mtune допускает те же расширения, что и -mcpu, но расширения не влияют на настройку сгенерированного кода.
-mtune=native заставляет компилятор автоматически определять процессор компьютера сборки. В настоящее время эта функция поддерживается только в GNU/Linux и не все архитектуры распознаются. Если автоматическое определение не удается, параметр не оказывает никакого влияния.
-
-mcpu=name[+extension…]
-
Это задаёт имя целевого процессора ARM. GCC использует это имя для вывода имени целевой архитектуры ARM (как если бы задано с помощью -march) и типа процессора ARM, для которого следует настраивать производительность (как если бы задано с помощью -mtune). Если этот параметр используется совместно с -march или -mtune, эти параметры имеют приоритет над соответствующей частью этого параметра.
Многие поддерживаемые процессоры реализуют необязательные расширения архитектуры. В таких случаях расширения архитектуры обычно включены по умолчанию. Если существуют реализации, которым расширение отсутствует, синтаксис расширения может использоваться для отключения этих расширений, которые отсутствуют. Для операций с плавающей точкой и Advanced SIMD (Neon), настройки параметров -mfloat-abi и -mfpu также должны быть учтены: операции с плавающей точкой и Advanced SIMD будут использоваться только если -mfloat-abi не задано как ‘soft’; и любое значение -mfpu кроме ‘auto’ переопределит доступные расширения операций с плавающей точкой и SIMD.
Например, ‘cortex-a9’ может быть представлен в трёх основных конфигурациях: только целочисленные операции, только с блоком обработки чисел с плавающей точкой или с блоком обработки чисел с плавающей точкой и Advanced SIMD. По умолчанию все инструкции включены, но расширения ‘+nosimd’ и ‘+nofp’ могут использоваться для отключения только SIMD или и SIMD и операций с плавающей точкой соответственно.
Допустимые имена для этого параметра такие же, как и для -mtune.
Следующие параметры расширения являются общими для перечисленных процессоров:
- ‘+nodsp’
-
Отключает инструкции DSP на ‘cortex-m33’, ‘cortex-m35p’, ‘cortex-m55’ и ‘cortex-m85’. Также отключает целочисленные и инструкции с плавающей точкой одинарной точности M-Profile Vector Extension (MVE) на ‘cortex-m55’ и ‘cortex-m85’.
- ‘+nopacbti’
-
Отключает расширение Pointer Authentication and Branch Target Identification на ‘cortex-m85’.
- ‘+nomve’
-
Отключает целочисленные и инструкции с плавающей точкой одинарной точности M-Profile Vector Extension (MVE) на ‘cortex-m55’ и ‘cortex-m85’.
- ‘+nomve.fp’
-
Отключает инструкции с плавающей точкой одинарной точности M-Profile Vector Extension (MVE) на ‘cortex-m55’ и ‘cortex-m85’.
- ‘+cdecp0, +cdecp1, ... , +cdecp7’
-
Включает расширение Custom Datapath Extension (CDE) на выбранных сопроцессорах в соответствии с номерами, указанными в параметрах в диапазоне от 0 до 7 на ‘cortex-m55’.
- ‘+nofp’
-
Отключает инструкции с плавающей точкой на ‘arm9e’, ‘arm946e-s’, ‘arm966e-s’, ‘arm968e-s’, ‘arm10e’, ‘arm1020e’, ‘arm1022e’, ‘arm926ej-s’, ‘arm1026ej-s’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-m4’, ‘cortex-m7’, ‘cortex-m33’, ‘cortex-m35p’ ‘cortex-m4’, ‘cortex-m7’, ‘cortex-m33’, ‘cortex-m35p’, ‘cortex-m55’ и ‘cortex-m85’. Отключает инструкции с плавающей точкой и SIMD на ‘generic-armv7-a’, ‘cortex-a5’, ‘cortex-a7’, ‘cortex-a8’, ‘cortex-a9’, ‘cortex-a12’, ‘cortex-a15’, ‘cortex-a17’, ‘cortex-a15.cortex-a7’, ‘cortex-a17.cortex-a7’, ‘cortex-a32’, ‘cortex-a35’, ‘cortex-a53’ и ‘cortex-a55’.
- ‘+nofp.dp’
-
Отключает компонент двойной точности инструкций с плавающей точкой на ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-r52’, ‘cortex-r52plus’ и ‘cortex-m7’.
- ‘+nosimd’
-
Отключает инструкции SIMD (но не инструкции с плавающей точкой) на ‘generic-armv7-a’, ‘cortex-a5’, ‘cortex-a7’ и ‘cortex-a9’.
- ‘+crypto’
Включает криптографические инструкции на ‘cortex-a32’, ‘cortex-a35’, ‘cortex-a53’, ‘cortex-a55’, ‘cortex-a57’, ‘cortex-a72’, ‘cortex-a73’, ‘cortex-a75’, ‘exynos-m1’, ‘xgene1’, ‘cortex-a57.cortex-a53’, ‘cortex-a72.cortex-a53’, ‘cortex-a73.cortex-a35’, ‘cortex-a73.cortex-a53’ и ‘cortex-a75.cortex-a55’.
Кроме того, псевдоцелевой ‘generic-armv7-a’ по умолчанию использует VFPv3 с 16 регистрами двойной точности. Он поддерживает следующие параметры расширения: ‘mp’, ‘sec’, ‘vfpv3-d16’, ‘vfpv3’, ‘vfpv3-d16-fp16’, ‘vfpv3-fp16’, ‘vfpv4-d16’, ‘vfpv4’, ‘neon’, ‘neon-vfpv3’, ‘neon-fp16’, ‘neon-vfpv4’. Значения такие же, как и для расширений -march=armv7-a.
-mcpu=generic-arch также допускается и эквивалентно -march=arch -mtune=generic-arch. Дополнительная информация в -mtune.
-mcpu=native заставляет компилятор автоматически определить процессор компьютера сборки. В настоящее время эта функция поддерживается только в GNU/Linux, и не все архитектуры распознаются. Если автоматическое определение не удалось, параметр не имеет эффекта.
-
-mfpu=name -
Это задаёт, какое оборудование с плавающей точкой (или эмуляция оборудования) доступно на целевом оборудовании. Допустимые имена: ‘auto’, ‘vfpv2’, ‘vfpv3’, ‘vfpv3-fp16’, ‘vfpv3-d16’, ‘vfpv3-d16-fp16’, ‘vfpv3xd’, ‘vfpv3xd-fp16’, ‘neon-vfpv3’, ‘neon-fp16’, ‘vfpv4’, ‘vfpv4-d16’, ‘fpv4-sp-d16’, ‘neon-vfpv4’, ‘fpv5-d16’, ‘fpv5-sp-d16’, ‘fp-armv8’, ‘neon-fp-armv8’ и ‘crypto-neon-fp-armv8’. Обратите внимание, что ‘neon’ — псевдоним для ‘neon-vfpv3’, а ‘vfp’ — псевдоним для ‘vfpv2’.
Настройка ‘auto’ является значением по умолчанию и является особым. Она заставляет компилятор выбрать инструкции с плавающей точкой и Advanced SIMD на основе настроек -mcpu и -march.
Если выбранное оборудование с плавающей точкой включает расширение NEON (например, -mfpu=neon), имейте в виду, что операции с плавающей точкой не генерируются проходом автовекторизации GCC, если также не указан -funsafe-math-optimizations. Это связано с тем, что аппаратное обеспечение NEON не полностью реализует стандарт IEEE 754 для арифметики с плавающей точкой (в частности, значения с ненормализованной мантиссой обрабатываются как ноль), поэтому использование инструкций NEON может привести к потере точности.
Вы также можете установить имя fpu на уровне функции, используя атрибуты функции
target("fpu=")(см. Атрибуты функции ARM) или директивы (см. Директивы для параметров, специфичных для функции). -
-mfp16-format=name -
Укажите формат типа полуточной точности с плавающей точкой
__fp16. Допустимые имена: ‘none’, ‘ieee’, и ‘alternative’; значение по умолчанию ‘none’, в этом случае тип__fp16не определён. См. Полуточная плавающая точка для получения дополнительной информации. -
-mstructure-size-boundary=n -
Размеры всех структур и объединений округляются до кратного числу бит, заданному этим параметром. Допустимые значения: 8, 32 и 64. Значение по умолчанию различается для разных инструментальных сред. Для инструментальной среды, нацеленной на COFF, значение по умолчанию равно 8. Значение 64 допускается только если базовая ABI его поддерживает.
Указание большего числа может привести к более быстрому и эффективному коду, но также может увеличить размер программы. Различные значения потенциально несовместимы. Код, скомпилированный с одним значением, не обязательно будет работать с кодом или библиотеками, скомпилированными с другим значением, если они обмениваются информацией с использованием структур или объединений.
Этот параметр устарел.
-
-mabort-on-noreturn -
Генерирует вызов функции
abortв конце функцииnoreturn. Он выполняется, если функция пытается вернуть значение. -
-mlong-calls -mno-long-calls
-
Указывает компилятору выполнять вызовы функций, сначала загрузив адрес функции в регистр, а затем выполнив вызов подпрограммы на этом регистре. Этот переключатель необходим, если целевая функция находится за пределами диапазона адресации 64 мегабайт в варианте вызова подпрограммы на основе смещения.
Даже если этот переключатель включён, не все вызовы функций преобразуются в длинные вызовы. Эвристика состоит в том, что статические функции, функции с атрибутом
short_call, функции, находящиеся в области действия директивы#pragma no_long_calls, и функции, определения которых уже были скомпилированы в текущей единице компиляции, не преобразуются в длинные вызовы. Исключение составляют определения слабых функций, функции с атрибутомlong_callили атрибутомsection, и функции, находящиеся в области действия директивы#pragma long_calls— они всегда преобразуются в длинные вызовы.Эта функция по умолчанию выключена. Указание -mno-long-calls восстанавливает поведение по умолчанию, как и размещение вызовов функций в области действия директивы
#pragma long_calls_off. Обратите внимание, что эти переключатели не влияют на то, как компилятор генерирует код для обработки вызовов функций через указатели на функции. -
-msingle-pic-base -
Обращаться к регистру, используемому для адресации PIC, как к только для чтения, а не загружать его в прологе для каждой функции. Система выполнения отвечает за инициализацию этого регистра подходящим значением перед началом выполнения.
-
-mpic-register=reg -
Укажите регистр, который будет использоваться для адресации PIC. Для стандартного случая PIC по умолчанию используется любой подходящий регистр, определяемый компилятором. В случае single PIC по умолчанию используется ‘R9’, если целевая система основана на EABI или включена проверка стека, в противном случае по умолчанию используется ‘R10’.
-
-mpic-data-is-text-relative -
Предполагается, что смещение между текстовым и данными сегментами фиксировано во время статической компоновки. Это позволяет использовать операции адресации PC-относительной для доступа к данным, которые известны как находящиеся в сегменте данных. Для целей, не связанных с VxWorks RTP, этот параметр включён по умолчанию. При отключении на таких целях, по умолчанию будет включён -msingle-pic-base.
-
-mpoke-function-name -
Записывает имя каждой функции в сегмент текста, непосредственно перед прологом функции. Сгенерированный код похож на этот:
t0 .ascii "arm_poke_function_name", 0 .align t1 .word 0xff000000 + (t1 - t0) arm_poke_function_name mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4При выполнении трассировки стека код может проверить значение
pc, хранящееся вfp + 0. Если функция трассировки затем обращается к расположениюpc - 12и старшие 8 бит установлены, то мы знаем, что имя функции встроено непосредственно перед этим расположением и имеет длину((pc[-3]) & 0xff000000). -
-mthumb -marm-
Выберите между генерацией кода, выполняемого в состояниях ARM и Thumb. По умолчанию для большинства конфигураций генерируется код, выполняемый в состоянии ARM, но значение по умолчанию может быть изменено путём конфигурации GCC с опцией --with-mode=state.
Вы также можете переопределить режим ARM и Thumb для каждой функции, используя атрибуты функций
target("thumb")иtarget("arm")(см. Атрибуты функций ARM) или пragma (см. Пragma специфичные для функций опции). -
-mflip-thumb -
Переключать режимы ARM/Thumb поочерёдно для функций. Эта опция предоставляется для тестирования регрессии смешанного кода Thumb/ARM, и не предназначена для обычного использования при компиляции кода.
-
-mtpcs-frame -
Генерировать фрейм стека, соответствующий стандарту вызовов процедур Thumb для всех функций, не являющихся листовыми. (Листовая функция — это функция, которая не вызывает другие функции.) По умолчанию используется -mno-tpcs-frame.
-
-mtpcs-leaf-frame -
Генерировать фрейм стека, соответствующий стандарту вызовов процедур Thumb для всех листовых функций. (Листовая функция — это функция, которая не вызывает другие функции.) По умолчанию используется -mno-apcs-leaf-frame.
-
-mcallee-super-interworking -
Даёт всем внешне видимым функциям в компилируемом файле заголовок набора инструкций ARM, который переключается в режим Thumb перед выполнением остальной части функции. Это позволяет вызывать эти функции из кода, не использующего межмодульный вызов. Эта опция недействительна в конфигурациях AAPCS, так как межмодульный вызов включен по умолчанию.
-
-mcaller-super-interworking -
Разрешает вызовы через указатели на функции (включая виртуальные функции) выполняться правильно независимо от того, был ли целевой код скомпилирован для межмодульного вызова или нет. Есть небольшая накладная стоимость при выполнении указателя на функцию, если эта опция включена. Эта опция недействительна в конфигурациях AAPCS, так как межмодульный вызов включен по умолчанию.
-
-mtp=name -
Укажите модель доступа к указателю на локальное хранилище потока. Допустимые модели — ‘soft’, которая генерирует вызовы к
__aeabi_read_tp, ‘cp15’, которая извлекает указатель потока изcp15напрямую (поддерживается в архитектуре arm6k), и ‘auto’, которая использует наилучший доступный метод для выбранного процессора. Значение по умолчанию — ‘auto’. -
-mtls-dialect=dialect -
Укажите диалект для доступа к локальному хранилищу потока. Поддерживаются два диалекта — ‘gnu’ и ‘gnu2’. Диалект ‘gnu’ выбирает исходную схему GNU для поддержки локальных и глобальных динамических моделей TLS. Диалект ‘gnu2’ выбирает схему описателей GNU, которая обеспечивает лучшую производительность для общих библиотек. Схема описателей GNU совместима со исходной схемой, но требует новой поддержки со стороны ассемблера, компоновщика и библиотек. Модели TLS для начального и локального выполнения не затронуты этим параметром и всегда используют исходную схему.
-
-mword-relocations -
Генерировать только абсолютные перемещения для значений размера слова (т.е. R_ARM_ABS32). Это включено по умолчанию для целей (uClinux, SymbianOS), где загрузчик выполнения накладывает это ограничение, и когда указаны -fpic или -fPIC. Этот параметр конфликтует с -mslow-flash-data.
-
-mfix-cortex-m3-ldrd -
Некоторые ядра Cortex-M3 могут привести к повреждению данных, когда используются инструкции
ldrdс перекрывающимися целевыми и базовыми регистрами. Этот параметр избегает генерации таких инструкций. Этот параметр включен по умолчанию при указании -mcpu=cortex-m3. -mfix-cortex-a57-aes-1742098-mno-fix-cortex-a57-aes-1742098-mfix-cortex-a72-aes-1655431-mno-fix-cortex-a72-aes-1655431-
Включить (отключить) смягчение для ошибочной ситуации на Cortex-A57 и Cortex-A72, которая влияет на криптографические инструкции AES. Этот параметр включен по умолчанию, когда указаны либо -mcpu=cortex-a57, либо -mcpu=cortex-a72.
-
-munaligned-access -mno-unaligned-access-
Включает (или отключает) чтение и запись 16- и 32-разрядных значений из адресов, которые не являются 16- или 32-разрядными выровненными. По умолчанию невыровненный доступ отключен для всех архитектур до ARMv6, всех ARMv6-M и ARMv8-M Baseline, и включен для всех остальных архитектур. Если невыровненный доступ не включен, то слова в упакованных структурах данных извлекаются по байтам.
Атрибут ARM
Tag_CPU_unaligned_accessустанавливается в сгенерированном объекте файла на true или false, в зависимости от настройки этого параметра. Если невыровненный доступ включён, то препроцессорная переменная__ARM_FEATURE_UNALIGNEDтакже определяется. -
-mneon-for-64bits -
Эта опция устарела и не имеет эффекта.
-
-mslow-flash-data -
Предполагается, что загрузка данных из флэш-памяти медленнее, чем извлечение инструкций. Поэтому загрузка литералов минимизируется для лучшей производительности. Эта опция поддерживается только при компиляции для ARMv7 M-profile и по умолчанию выключена. Она конфликтует с -mword-relocations.
-
-masm-syntax-unified -
Предполагается, что ассемблер с встроенным кодом использует унифицированный синтаксис asm. По умолчанию этот параметр выключен, что подразумевает раздельный синтаксис. Этот параметр не оказывает влияния на Thumb2. Однако это может измениться в будущих выпусках GCC. Раздельный синтаксис следует считать устаревшим.
-
-mrestrict-it -
Ограничивает генерацию блоков IT, чтобы соответствовать правилам ARMv8-A. Блоки IT могут содержать только одну 16-битную инструкцию из выбранного набора инструкций. Этот параметр включён по умолчанию для ARMv8-A Thumb mode.
-
-mprint-tune-info -
Выводить информацию о настройке процессора как комментарий в файл ассемблера. Это опция используется только для тестирования регрессии компилятора и не предназначена для обычного использования при компиляции кода. Этот параметр выключен по умолчанию.
-
-mverbose-cost-dump -
Включить подробный вывод модели затрат в файлы отладочных выводов. Эта опция предназначена для отладки компилятора.
-
-mpure-code -
Не разрешать размещение константных данных в секциях кода. Кроме того, при компиляции для формата ELF-объекта присвойте всем секциям текста атрибут ELF процессора
SHF_ARM_PURECODE. Эта опция доступна только при генерации кода non-pic для целей M-profile. -
-mcmse -
Генерировать защищённый код в соответствии со спецификацией «ARMv8-M Security Extensions: Requirements on Development Tools Engineering Specification», которую можно найти по адресу https://developer.arm.com/documentation/ecm0359818/latest/.
-
-mfix-cmse-cve-2021-35465 -
Смягчить потенциальную проблему безопасности с инструкцией
VLLDMна некоторых устройствах профиля M при использовании CMSE (CVE-2021-365465). Этот параметр включён по умолчанию при использовании опции -mcpu= сcortex-m33,cortex-m35p,cortex-m55,cortex-m85илиstar-mc1. Опция -mno-fix-cmse-cve-2021-35465 может быть использована для отключения смягчения. -
-mstack-protector-guard=guard -mstack-protector-guard-offset=offset
-
Генерация кода защиты стека с использованием канистры в guard. Поддерживаемые расположения — ‘global’ для глобальной канистры или ‘tls’ для канистры, доступной через регистр TLS. Параметр -mstack-protector-guard-offset= предназначен для использования с -fstack-protector-guard=tls и не предназначен для использования в коде пользовательского пространства.
-
-mfdpic -mno-fdpic-
Выбор ABI FDPIC, который использует 64-битные описатели функций для представления указателей на функции. Когда компилятор настроен для
arm-*-uclinuxfdpiceabiцелей, этот параметр включён по умолчанию и подразумевает -fPIE, если не заданы параметры, связанные с PIC/PIE. На других целях он лишь включает функции генерации кода, специфичные для FDPIC, а пользователю необходимо явно указать параметры, связанные с PIC/PIE, по мере необходимости.Обратите внимание, что статическая компоновка не поддерживается, поскольку она по-прежнему будет включать динамическую компоновку при самоперемещении программы. Если такое поведение приемлемо, используйте параметры -static и -Wl,-dynamic-linker.
Противный параметр -mno-fdpic полезен (и необходим) для построения ядра Linux с использованием той же (
arm-*-uclinuxfdpiceabi) инструментальной цепочки, что и при построении пользовательских программ. -
-mbranch-protection=none|standard|pac-ret[+leaf][+bti]|bti[+pac-ret[+leaf]] -
Включение функций защиты ветвлений (только armv8.1-m.main). ‘none’ генерирует код без защиты ветвлений или подписи адреса возврата. ‘standard[+leaf]’ генерирует код со всеми функциями защиты ветвлений, включёнными на стандартном уровне. ‘pac-ret[+leaf]’ генерирует код с подписью адреса возврата, установленной на стандартном уровне, что означает подпись всех функций, которые сохраняют адрес возврата в память. ‘leaf’ При включении подписи адреса возврата также подписываются листья функций, даже если они не записывают адрес возврата в память. +‘bti’ Добавление инструкций посадочной площадки в разрешённые цели инструкций косвенного ветвления.
Если расширение архитектуры ‘+pacbti’ не включено, все операции защиты ветвлений и подписи адреса возврата ограничены использованием только инструкций, определённых в пространстве архитектурного NOP. Сгенерированный код останется обратно совместимым с более ранними версиями архитектуры, но дополнительная безопасность может быть включена во время выполнения на процессорах, поддерживающих расширение ‘PACBTI’.
Принудительное применение цели ветвления с помощью BTI может быть включено только во время выполнения, если весь код приложения был скомпилирован как минимум с ‘-mbranch-protection=bti’.
Любое значение, отличное от ‘none’, поддерживается только на armv8-m.main или более поздних версиях.
По умолчанию генерируется код без защиты ветвлений или подписи адреса возврата.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/ARM-Options.html