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 и soft не совместимы с точки зрения линковки; вы должны скомпилировать всю свою программу с одним и тем же 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’, ‘armv7-r’, ‘armv8-r’, ‘armv6-m’, ‘armv6s-m’, ‘armv7-m’, ‘armv7e-m’, ‘armv8-m.base’, ‘armv8-m.main’, ‘armv8.1-m.main’, ‘iwmmxt’ и ‘iwmmxt2’.
Кроме того, следующие архитектуры, которые не поддерживают состояние выполнения Thumb, распознаются, но поддержка устарела: ‘armv4’.
Многие из архитектур поддерживают расширения. Их можно добавить, добавив ‘+расширение’ к имени архитектуры. Параметры расширения обрабатываются в порядке их следования, и возможности накапливаются. Расширение также включит любые необходимые базовые расширения, от которых оно зависит. Например, расширение ‘+crypto’ всегда включит расширение ‘+simd’. Исключением из аддитивной конструкции являются расширения, которые начинаются с ‘+no…’: эти расширения отключают указанный параметр и любые другие расширения, которые могут зависеть от наличия этого расширения.
Например, ‘-march=armv7-a+simd+nofp+vfpv4’ эквивалентно записи ‘-march=armv7-a+vfpv4’, поскольку параметр ‘+simd’ полностью отключён параметром ‘+nofp’, который следует за ним.
Большинство имён расширений имеют общее название, но имеют эффект, зависящий от архитектуры, к которой они применяются. Например, параметр ‘+simd’ может быть применён как к архитектуре ‘armv7-a’, так и к архитектуре ‘armv8-a’, но включит оригинальные расширения ARMv7-A Advanced SIMD (Neon) для ‘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’
-
Криптографические инструкции. Это также включает в себя инструкции Advanced SIMD и с плавающей запятой.
- ‘+nocrypto’
-
Отключить криптографические инструкции.
- ‘+nofp’
-
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘+sb’
-
Инструкция барьера упреждения.
- ‘+predres’
Инструкции ограничения прогнозирования выполнения и данных.
- ‘armv8.2-a’
- ‘armv8.3-a’
-
- ‘+fp16’
-
Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+fp16fml’
-
Расширение fmla для чисел с плавающей запятой полуточной точности. Это также включает расширение чисел с плавающей запятой полуточной точности, Advanced SIMD и инструкции с плавающей запятой.
- ‘+simd’
-
Расширенные инструкции SIMD и с плавающей запятой ARMv8.1-A.
- ‘+crypto’
-
Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+dotprod’
-
Включить расширение Dot Product. Это также включает инструкции Advanced SIMD.
- ‘+nocrypto’
-
Отключить криптографическое расширение.
- ‘+nofp’
-
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘+sb’
-
Инструкция барьера упреждения.
- ‘+predres’
-
Инструкции ограничения прогнозирования выполнения и данных.
- ‘+i8mm’
-
Инструкции умножения матриц целых чисел 8-битного размера. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+bf16’
Инструкции с плавающей запятой Brain полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘armv8.4-a’
-
- ‘+fp16’
-
Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product и расширение fmla для чисел с плавающей запятой полуточной точности.
- ‘+simd’
-
Расширенные инструкции SIMD и с плавающей запятой ARMv8.3-A, а также расширение Dot Product.
- ‘+crypto’
-
Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product.
- ‘+nocrypto’
-
Отключить криптографическое расширение.
- ‘+nofp’
-
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘+sb’
-
Инструкция барьера упреждения.
- ‘+predres’
-
Инструкции ограничения прогнозирования выполнения и данных.
- ‘+i8mm’
-
Инструкции умножения матриц целых чисел 8-битного размера. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+bf16’
Инструкции с плавающей запятой Brain полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘armv8.5-a’
-
- ‘+fp16’
-
Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product и расширение fmla для полуточной плавающей запятой.
- ‘+simd’
-
Инструкции ARMv8.3-A Advanced SIMD и с плавающей запятой, а также расширение Dot Product.
- ‘+crypto’
-
Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product.
- ‘+nocrypto’
-
Отключить криптографическое расширение.
- ‘+nofp’
-
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘+i8mm’
-
Инструкции умножения 8-битных целочисленных матриц. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+bf16’
Инструкции с плавающей запятой полуточной точности Brain. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘armv8.6-a’
-
- ‘+fp16’
-
Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product и расширение fmla для полуточной плавающей запятой.
- ‘+simd’
-
Инструкции ARMv8.3-A Advanced SIMD и с плавающей запятой, а также расширение Dot Product.
- ‘+crypto’
-
Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product.
- ‘+nocrypto’
-
Отключить криптографическое расширение.
- ‘+nofp’
-
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘+i8mm’
-
Инструкции умножения 8-битных целочисленных матриц. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+bf16’
Инструкции с плавающей запятой полуточной точности Brain. Это также включает инструкции 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’
-
Инструкции целочисленных расширений Vector Extension (MVE) M-профиля.
- ‘+mve.fp’
-
Инструкции целочисленных и расширений с плавающей запятой одинарной точности Vector Extension (MVE) M-профиля.
- ‘+fp’
-
Инструкции с плавающей запятой одинарной точности.
- ‘+fp.dp’
-
Инструкции с плавающей запятой одинарной и двойной точности.
- ‘+nofp’
-
Отключить расширение с плавающей запятой.
- ‘+cdecp0, +cdecp1, ... , +cdecp7’
Включить расширение Custom Datapath Extension (CDE) на выбранных сопроцессорах в соответствии с числами, указанными в параметрах в диапазоне от 0 до 7.
- ‘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’
Инструкции ARMv8-A Advanced SIMD и с плавающей запятой.
- ‘+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’, ‘ares’, ‘cortex-r4’, ‘cortex-r4f’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-r52’, ‘cortex-m0’, ‘cortex-m0plus’, ‘cortex-m1’, ‘cortex-m3’, ‘cortex-m4’, ‘cortex-m7’, ‘cortex-m23’, ‘cortex-m33’, ‘cortex-m35p’, ‘cortex-m55’, ‘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’, ‘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’.
- ‘+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’. Отключает инструкции с плавающей точкой и 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’ — значение по умолчанию и является специальной. Она заставляет компилятор выбирать инструкции с плавающей точкой и расширения 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 адресации, как только для чтения, а не загружая его в прологе каждой функции. Системный код runtime ответственен за инициализацию этого регистра соответствующим значением до начала выполнения.
-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 Procedure Call Standard для всех функций, кроме листов. (Функция-лист — это функция, которая не вызывает другие функции.) По умолчанию установлено -mno-tpcs-frame.
-mtpcs-leaf-frame-
Генерирует фрейм стека, соответствующий стандарту Thumb Procedure Call Standard для всех функций-листов. (Функция-лист — это функция, которая не вызывает другие функции.) По умолчанию установлено -mno-apcs-leaf-frame.
-mcallee-super-interworking-
Добавляет в каждую внешнюю функцию в компилируемом файле заголовок набора инструкций ARM, который переключается на режим Thumb перед выполнением остальной части функции. Это позволяет вызывать эти функции из кода без межмодового переключения. Эта опция недействительна в конфигурациях AAPCS, потому что межмодовое переключение включено по умолчанию.
-mcaller-super-interworking-
Позволяет вызовам через указатели на функции (включая виртуальные функции) работать правильно независимо от того, был ли целевой код скомпилирован для межмодового переключения или нет. При включении этой опции существует небольшая накладная стоимость при выполнении указателя на функцию. Эта опция недействительна в конфигурациях AAPCS, потому что межмодовое переключение включено по умолчанию.
-mtp=name-
Указывает модель доступа для указателя на хранилище TLS. Допустимые модели: ‘soft’, которая генерирует вызовы
__aeabi_read_tp, ‘cp15’, которая получает указатель на поток напрямую изcp15(поддерживается в архитектуре arm6k), и ‘auto’, которая использует лучший доступный метод для выбранного процессора. Значение по умолчанию — ‘auto’. -mtls-dialect=dialect-
Указывает диалект для доступа к хранилищу TLS. Поддерживаются два диалекта — ‘gnu’ и ‘gnu2’. Диалект ‘gnu’ выбирает оригинальную схему GNU для поддержки локальных и глобальных динамических моделей TLS. Диалект ‘gnu2’ выбирает схему описателей GNU, которая обеспечивает лучшую производительность для общих библиотек. Схема описателей GNU совместима с оригинальной схемой, но требует новой поддержки ассемблера, компоновщика и библиотек. Модели TLS для начального и локального запуска не изменяются этой опцией и всегда используют оригинальную схему.
-mword-relocations-
Генерирует только абсолютные перебазирования для значений размером в слове (т.е. R_ARM_ABS32). Это включено по умолчанию на целях (uClinux, SymbianOS), где загрузчик runtime накладывает это ограничение, и когда указаны -fpic или -fPIC. Эта опция конфликтует с -mslow-flash-data.
-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-
Эта опция устарела и не оказывает влияния.
-mslow-flash-data
-
Предполагается, что загрузка данных из флеш-памяти медленнее, чем получение инструкций. Поэтому для повышения производительности минимизируется буквальная загрузка. Этот параметр поддерживается только при компиляции для ARMv7 M-профиля и по умолчанию выключен. Он конфликтует с -mword-relocations.
-masm-syntax-unified-
Предполагается, что встроенный ассемблер использует унифицированный синтаксис asm. По умолчанию он выключен, что подразумевает разделенный синтаксис. Этот параметр не оказывает влияния на 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-профиля. -mcmse-
Генерировать защищённый код в соответствии с «Спецификацией требований к инструментам разработки ARMv8-M Security Extensions», которую можно найти по адресу 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. Параметр -mno-fix-cmse-cve-2021-35465 может быть использован для отключения мер. -mfdpic-mno-fdpic-
Выбор ABI FDPIC, который использует 64-битные описатели функций для представления указателей на функции. При конфигурации компилятора для
arm-*-uclinuxfdpiceabiцелей этот параметр включён по умолчанию и подразумевает -fPIE, если ни один из параметров, связанных с PIC/PIE, не предоставлен. На других целях он только включает функции генерации кода, специфичные для FDPIC, и пользователь должен явно предоставить необходимые параметры, связанные с PIC/PIE.Обратите внимание, что статическая компоновка не поддерживается, так как она всё равно будет вовлекать динамическую компоновщик при самоперемещении программы. Если такое поведение приемлемо, используйте опции -static и -Wl,-dynamic-linker.
Противоположный параметр -mno-fdpic полезен (и необходим) для построения ядра Linux с использованием того же (
arm-*-uclinuxfdpiceabi) инструментария, что и при построении приложений пользователя.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/ARM-Options.html