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-m52’, ‘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, эти параметры имеют приоритет над соответствующей частью этого параметра.
Многие поддерживаемые процессоры реализуют необязательные архитектурные расширения. В таких случаях архитектурные расширения обычно включены по умолчанию. Если существуют реализации, которым не хватает расширения, то синтаксис расширения можно использовать для отключения тех расширений, которые отсутствуют. Для операций с плавающей запятой и расширенной SIMD (NEON) инструкций также необходимо учитывать настройки параметров -mfloat-abi и -mfpu: инструкции с плавающей запятой и расширенной SIMD будут использоваться только в том случае, если -mfloat-abi не задан как ‘soft’; а любая установка -mfpu отличная от ‘auto’ переопределит доступные инструкции с плавающей запятой и SIMD-расширения.
Например, ‘cortex-a9’ можно найти в трёх основных конфигурациях: только целые числа, только с блоком обработки с плавающей запятой или с блоком обработки с плавающей запятой и расширенной SIMD. По умолчанию все инструкции включены, но расширения ‘+nosimd’ и ‘+nofp’ можно использовать для отключения только SIMD-инструкций или как SIMD- так и инструкций с плавающей запятой соответственно.
Допустимые имена для этого параметра такие же, как и для -mtune.
Следующие параметры расширения являются общими для перечисленных процессоров:
- ‘+nodsp’
-
Отключить DSP-инструкции на ‘cortex-m33’, ‘cortex-m35p’, ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’. Также отключить целочисленные и одноточные инструкции с плавающей запятой расширения M-Profile Vector Extension (MVE) на ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’.
- ‘+nopacbti’
-
Отключить расширение аутентификации указателей и идентификации целевого адреса ветвления на ‘cortex-m52’ и ‘cortex-m85’.
- ‘+nomve’
-
Отключить целочисленные и одноточные инструкции с плавающей запятой расширения M-Profile Vector Extension (MVE) на ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’.
- ‘+nomve.fp’
-
Отключить инструкции с плавающей запятой одинарной точности расширения M-Profile Vector Extension (MVE) на ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’.
- ‘+cdecp0, +cdecp1, ... , +cdecp7’
-
Включить расширение Custom Datapath Extension (CDE) на выбранных сопроцессорах в соответствии с номерами, заданными в параметрах в диапазоне от 0 до 7 на ‘cortex-m52’ и ‘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-m52’, ‘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’ является значением по умолчанию и является специальной. Она заставляет компилятор выбирать инструкции с плавающей запятой и расширенной 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 -
Предполагается, что смещение между текстовым и данными сегментами фиксируется во время статической компоновки. Это позволяет использовать операции адресации относительно 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) или директивы (см. Директивы опций, специфичные для функции). -
-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. Другие поддерживаемые модели — ‘tpidrurw’, ‘tpidruro’ и ‘tpidrprw’, которые извлекают указатель потока из соответствующего системного регистра напрямую (поддерживается с архитектуры arm6k и новее). К этим системным регистрам осуществляется доступ через интерфейс сопроцессора CP15, а аргумент ‘cp15’ также принимается в качестве удобного псевдонима ‘tpidruro’. Аргумент ‘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-битную инструкцию из выбранного набора инструкций. Эта опция включена по умолчанию для режима Thumb ARMv8-A.
-
-mprint-tune-info -
Печатать информацию о настройке процессора в виде комментария в файле ассемблера. Эта опция используется только для регрессионного тестирования компилятора и не предназначена для обычного использования при компиляции кода. Эта опция отключена по умолчанию.
-
-mverbose-cost-dump -
Включает подробный вывод модели стоимости в файлы отладки. Эта опция предоставляется для использования в отладке компилятора.
-
-mpure-code -
Не разрешать размещение константных данных в секциях кода. Кроме того, при компиляции для формата ELF-объектов, присвойте всем секциям текста атрибут ELF, специфичный для процессора
SHF_ARM_PURECODE. Эта опция доступна только при генерации кода без 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-m52,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’ Добавить инструкции landing-pad в разрешённые целевые адреса инструкций косвенного ветвления.
Если расширение архитектуры ‘+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-14.2.0/gcc/ARM-Options.html