3.18.4 ARM Options
These ‘-m’ options are defined for the ARM port:
-mabi=name-
Generate code for the specified ABI. Permissible values are: ‘apcs-gnu’, ‘atpcs’, ‘aapcs’, ‘aapcs-linux’ and ‘iwmmxt’.
-mapcs-frame-
Generate a stack frame that is compliant with the ARM Procedure Call Standard for all functions, even if this is not strictly necessary for correct execution of the code. Specifying -fomit-frame-pointer with this option causes the stack frames not to be generated for leaf functions. The default is -mno-apcs-frame. This option is deprecated.
-mapcs-
This is a synonym for -mapcs-frame and is deprecated.
-mthumb-interwork-
Generate code that supports calling between the ARM and Thumb instruction sets. Without this option, on pre-v5 architectures, the two instruction sets cannot be reliably used inside one program. The default is -mno-thumb-interwork, since slightly larger code is generated when -mthumb-interwork is specified. In AAPCS configurations this option is meaningless.
-mno-sched-prolog-
Prevent the reordering of instructions in the function prologue, or the merging of those instruction with the instructions in the function’s body. This means that all functions start with a recognizable set of instructions (or in fact one of a choice from a small set of different function prologues), and this information can be used to locate the start of functions inside an executable piece of code. The default is -msched-prolog.
-mfloat-abi=name-
Specifies which floating-point ABI to use. Permissible values are: ‘soft’, ‘softfp’ and ‘hard’.
Specifying ‘soft’ causes GCC to generate output containing library calls for floating-point operations. ‘softfp’ allows the generation of code using hardware floating-point instructions, but still uses the soft-float calling conventions. ‘hard’ allows generation of floating-point instructions and uses FPU-specific calling conventions.
The default depends on the specific target configuration. Note that the hard-float and soft-float ABIs are not link-compatible; you must compile your entire program with the same ABI, and link with a compatible set of libraries.
-mlittle-endian-
Generate code for a processor running in little-endian mode. This is the default for all standard configurations.
-mbig-endian-
Generate code for a processor running in big-endian mode; the default is to compile code for a little-endian processor.
-mbe8-mbe32-
When linking a big-endian image select between BE8 and BE32 formats. The option has no effect for little-endian images and is ignored. The default is dependent on the selected target architecture. For ARMv6 and later architectures the default is BE8, for older architectures the default is BE32. BE32 format has been deprecated by ARM.
-march=name[+extension…]-
This specifies the name of the target ARM architecture. GCC uses this name to determine what kind of instructions it can emit when generating assembly code. This option can be used in conjunction with or instead of the -mcpu= option.
Permissible names are: ‘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’, ‘armv7-r’, ‘armv8-r’, ‘armv6-m’, ‘armv6s-m’, ‘armv7-m’, ‘armv7e-m’, ‘armv8-m.base’, ‘armv8-m.main’, ‘iwmmxt’ and ‘iwmmxt2’.
Additionally, the following architectures, which lack support for the Thumb execution state, are recognized but support is deprecated: ‘armv2’, ‘armv2a’, ‘armv3’, ‘armv3m’, ‘armv4’, ‘armv5’ and ‘armv5e’.
Many of the architectures support extensions. These can be added by appending ‘+extension’ to the architecture name. Extension options are processed in order and capabilities accumulate. An extension will also enable any necessary base extensions upon which it depends. For example, the ‘+crypto’ extension will always enable the ‘+simd’ extension. The exception to the additive construction is for extensions that are prefixed with ‘+no…’: these extensions disable the specified option and any other extensions that may depend on the presence of that extension.
For example, ‘-march=armv7-a+simd+nofp+vfpv4’ is equivalent to writing ‘-march=armv7-a+vfpv4’ since the ‘+simd’ option is entirely disabled by the ‘+nofp’ option that follows it.
Most extension names are generically named, but have an effect that is dependent upon the architecture to which it is applied. For example, the ‘+simd’ option can be applied to both ‘armv7-a’ and ‘armv8-a’ architectures, but will enable the original ARMv7-A Advanced SIMD (Neon) extensions for ‘armv7-a’ and the ARMv8-A variant for ‘armv8-a’.
The table below lists the supported extensions for each architecture. Architectures not mentioned do not support any extensions.
- ‘armv5e’
- ‘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’
-
Расширения Advanced 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’
-
Инструкции Advanced SIMD (Neon) v1 и VFPv3 с плавающей запятой с операциями преобразования чисел с плавающей запятой полуточной точности.
- ‘+neon-vfpv4’
-
Инструкции Advanced SIMD (Neon) v2 и VFPv4 с плавающей запятой.
- ‘+nosimd’
-
Отключить инструкции Advanced SIMD (не отключает плавающую запятую).
- ‘+nofp’
Отключить инструкции с плавающей запятой и Advanced SIMD.
- ‘armv7ve’
-
Расширенная версия архитектуры ARMv7-A с поддержкой виртуализации.
- ‘+fp’
-
Инструкции с плавающей запятой VFPv4 с 16 регистрами двойной точности. Расширение ‘+vfpv4-d16’ может использоваться в качестве псевдонима для этого расширения.
- ‘+simd’
-
Расширения Advanced 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’
-
Инструкции Advanced SIMD (Neon) v1 и VFPv3 с плавающей запятой. Расширение ‘+neon-vfpv3’ может использоваться в качестве псевдонима для этого расширения.
- ‘+neon-fp16’
-
Инструкции Advanced SIMD (Neon) v1 и VFPv3 с плавающей запятой с операциями преобразования чисел с плавающей запятой полуточной точности.
- ‘+nosimd’
-
Отключить инструкции Advanced SIMD (не отключает плавающую запятую).
- ‘+nofp’
Отключить инструкции с плавающей запятой и Advanced SIMD.
- ‘armv8-a’
-
- ‘+crc’
Инструкции Cyclic Redundancy Check (CRC).
- ‘+simd’
Инструкции ARMv8-A Advanced SIMD и с плавающей запятой.
- ‘+crypto’
Криптографические инструкции.
- ‘+nocrypto’
Отключить криптографические инструкции.
- ‘+nofp’
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘armv8.1-a’
-
- ‘+simd’
-
Инструкции ARMv8.1-A Advanced SIMD и с плавающей запятой.
- ‘+crypto’
-
Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+nocrypto’
-
Отключить криптографические инструкции.
- ‘+nofp’
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘armv8.2-a’
- ‘armv8.3-a’
-
- ‘+fp16’
-
Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+fp16fml’
-
Расширение fmla полуточной точности с плавающей запятой. Это также включает расширение полуточной точности с плавающей запятой и инструкции Advanced SIMD и с плавающей запятой.
- ‘+simd’
-
Инструкции ARMv8.1-A Advanced SIMD и с плавающей запятой.
- ‘+crypto’
-
Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+dotprod’
-
Включить расширение Dot Product. Это также включает инструкции Advanced SIMD.
- ‘+nocrypto’
-
Отключить криптографическое расширение.
- ‘+nofp’
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘armv8.4-a’
-
- ‘+fp16’
-
Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product и расширение fmla полуточной точности с плавающей запятой.
- ‘+simd’
-
Инструкции ARMv8.3-A Advanced SIMD и с плавающей запятой, а также расширение Dot Product.
- ‘+crypto’
-
Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product.
- ‘+nocrypto’
-
Отключить криптографическое расширение.
- ‘+nofp’
Отключить инструкции с плавающей запятой, 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-m.main’
-
- ‘+dsp’
-
Инструкции DSP.
- ‘+nodsp’
-
Отключить расширение DSP.
- ‘+fp’
-
Инструкции с плавающей запятой одинарной точности.
- ‘+fp.dp’
-
Инструкции с плавающей запятой одинарной и двойной точности.
- ‘+nofp’
Отключить расширение с плавающей запятой.
- ‘armv8-r’
-
- ‘+crc’
Инструкции Cyclic Redundancy Check (CRC).
- ‘+fp.sp’
Инструкции с плавающей запятой FPv5 одинарной точности.
- ‘+simd’
Инструкции ARMv8-A Advanced SIMD и с плавающей запятой.
- ‘+crypto’
Криптографические инструкции.
- ‘+nocrypto’
Отключить криптографические инструкции.
- ‘+nofp’
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
-march=native заставляет компилятор автоматически определять архитектуру компьютера, на котором выполняется компиляция. В настоящее время эта функция поддерживается только в GNU/Linux и не все архитектуры распознаются. Если автоматическое определение не удалось, этот параметр не оказывает никакого эффекта.
-mtune=name
-
Этот параметр задаёт имя целевого процессора ARM, для которого GCC должен настроить производительность кода. Для некоторых реализаций ARM лучшая производительность может быть достигнута с использованием этого параметра. Допустимые имена: ‘arm2’, ‘arm250’, ‘arm3’, ‘arm6’, ‘arm60’, ‘arm600’, ‘arm610’, ‘arm620’, ‘arm7’, ‘arm7m’, ‘arm7d’, ‘arm7dm’, ‘arm7di’, ‘arm7dmi’, ‘arm70’, ‘arm700’, ‘arm700i’, ‘arm710’, ‘arm710c’, ‘arm7100’, ‘arm720’, ‘arm7500’, ‘arm7500fe’, ‘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’, ‘neoverse-v1’, ‘neoverse-n2’, ‘cortex-r4’, ‘cortex-r4f’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-r52’, ‘cortex-m33’, ‘cortex-m23’, ‘cortex-m7’, ‘cortex-m4’, ‘cortex-m3’, ‘cortex-m1’, ‘cortex-m0’, ‘cortex-m0plus’, ‘cortex-m1.small-multiply’, ‘cortex-m0.small-multiply’, ‘cortex-m0plus.small-multiply’, ‘exynos-m1’, ‘marvell-pj4’, ‘xscale’, ‘iwmmxt’, ‘iwmmxt2’, ‘ep9312’, ‘fa526’, ‘fa626’, ‘fa606te’, ‘fa626te’, ‘fmp626’, ‘fa726te’, ‘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’.
-mtune=generic-arch указывает, что GCC должен настроить производительность для набора процессоров в архитектуре arch. Цель состоит в генерации кода, который будет хорошо работать на наиболее популярных процессорах в данный момент, балансируя оптимизации, которые приносят пользу некоторым процессорам в диапазоне, и избегая проблем с производительностью других процессоров. Эффекты этого параметра могут измениться в будущих версиях GCC по мере появления и исчезновения моделей процессоров.
-mtune допускает те же расширения параметров, что и -mcpu, но расширения параметров не влияют на настройку генерируемого кода.
-mtune=native заставляет компилятор автоматически определить процессор компьютера, на котором выполняется компиляция. В настоящее время эта функция поддерживается только в GNU/Linux, и не все архитектуры распознаются. Если автоматическое определение не удаётся, этот параметр не имеет эффекта.
-mcpu=name[+extension…]-
Это задаёт имя целевого процессора ARM. GCC использует это имя для получения имени целевой архитектуры ARM (как если бы задано -march) и типа процессора ARM, для которого настраивается производительность (как если бы задано -mtune). В случае использования этого параметра вместе с -march или -mtune, эти параметры имеют приоритет над соответствующей частью этого параметра.
Многие из поддерживаемых процессоров реализуют необязательные архитектурные расширения. Если это так, то архитектурные расширения обычно включены по умолчанию. Если существуют реализации, которым не хватает расширения, то синтаксис расширения может быть использован для отключения тех расширений, которые отсутствуют. Для операций с плавающей запятой и расширенной SIMD (Neon), также необходимо учитывать настройки параметров -mfloat-abi и -mfpu: операции с плавающей запятой и расширенные SIMD инструкции будут использоваться только если -mfloat-abi не установлен в ‘soft’; и любая настройка -mfpu, отличная от ‘auto’, переопределит доступные инструкции с плавающей запятой и SIMD расширения.
Например, ‘cortex-a9’ можно найти в трёх основных конфигурациях: только целочисленные, только с блоком обработки плавающей запятой или с блоком обработки плавающей запятой и расширенной SIMD. По умолчанию все инструкции включены, но расширения ‘+nosimd’ и ‘+nofp’ могут быть использованы для отключения только SIMD или и SIMD, и инструкций с плавающей запятой соответственно.
Допустимые имена для этого параметра такие же, как и для -mtune.
Следующие параметры расширений являются общими для перечисленных процессоров:
- ‘+nodsp’
-
Отключить инструкции DSP на ‘cortex-m33’.
- ‘+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’. Отключает инструкции с плавающей запятой и 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-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’ является значением по умолчанию и является специальной. Она заставляет компилятор выбирать инструкции с плавающей запятой и расширенные 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 по умолчанию используется любой подходящий регистр, определяемый компилятором. Для одиночного случая PIC по умолчанию используется ‘R9’, если целевой вариант основан на EABI или включена проверка стека, в противном случае по умолчанию используется ‘R10’.
-mpic-data-is-text-relative-
Предполагать, что смещение между текстовым и данными сегментами является постоянным на этапе статической компоновки. Это позволяет использовать операции адресации с относительным адресом ПК для доступа к данным, которые, как известно, находятся в сегменте данных. Для целей, не связанных с 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) или директивы (см. Директивы опций для функций). -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.
-mfix-cortex-m3-ldrd-
Некоторые ядра Cortex-M3 могут вызывать повреждение данных при использовании инструкций
ldrdс перекрывающимися регистрами назначения и базы. Этот параметр предотвращает генерацию этих инструкций. Этот параметр включён по умолчанию при указании -mcpu=cortex-m3. -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-
Включает использование Neon для обработки скалярных 64-битных операций. По умолчанию отключено, поскольку стоимость перемещения данных из регистров ядра в Neon высока.
-mslow-flash-data-
Предполагается, что загрузка данных из флэш-памяти медленнее, чем извлечение инструкций. Поэтому загрузка литералов сводится к минимуму для повышения производительности. Этот параметр поддерживается только при компиляции для ARMv7 M-профиля и по умолчанию выключен.
-masm-syntax-unified-
Предполагает, что встроенный ассемблер использует унифицированный синтаксис. По умолчанию отключен, что подразумевает разделенный синтаксис. Этот параметр не влияет на Thumb2. Однако это может измениться в будущих выпусках GCC. Разделенный синтаксис следует считать устаревшим.
-mrestrict-it-
Ограничивает генерацию блоков IT в соответствии с правилами ARMv8-A. Блоки IT могут содержать только одну 16-битную инструкцию из выбранного набора инструкций. Этот параметр включен по умолчанию для ARMv8-A режима Thumb.
-mprint-tune-info-
Выводить информацию о настройке процессора в качестве комментария в ассемблерном файле. Это параметр, используемый только для регрессионного тестирования компилятора и не предназначенный для обычного использования при компиляции кода. Этот параметр по умолчанию отключён.
-mverbose-cost-dump-
Включает подробную выгрузку модели стоимости в файлы отладки. Эта опция предназначена для отладки компилятора.
-mpure-code-
Не допускать размещения константных данных в секциях кода. Кроме того, при компиляции для формата объекта ELF задайте атрибут сегмента текста ELF
SHF_ARM_PURECODE. Эта опция доступна только при генерации кода без перемещения для целей M-профиля с инструкцией MOVT. -mcmse-
Генерировать защищённый код в соответствии с "ARMv8-M Security Extensions: Requirements on Development Tools Engineering Specification", который можно найти по адресу https://developer.arm.com/documentation/ecm0359818/latest/.
Далее: Параметры AVR, Предыдущее: Параметры ARC, Вверх: Параметры подмодели [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/ARM-Options.html