3.19.5 ARM Options
Эти опции «-m» определены для порта ARM:
-mabi=name-
Генерировать код для указанного ABI. Допустимые значения: ‘apcs-gnu’, ‘atpcs’, ‘aapcs’, ‘aapcs-linux’ и ‘iwmmxt’.
-mapcs-frame-
Генерировать стековый фрейм, совместимый со стандартом вызова функций ARM (ARM Procedure Call Standard) для всех функций, даже если это не строго необходимо для корректного выполнения кода. Указание -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’ позволяет генерировать код, использующий аппаратные инструкции с плавающей точкой, но по-прежнему использует соглашения о вызовах для мягкой плавающей точки. ‘hard’ позволяет генерировать инструкции с плавающей точкой и использует соглашения о вызовах, специфичные для FPU.
По умолчанию зависит от конкретной конфигурации целевой системы. Обратите внимание, что ABI с твёрдой и мягкой плавающей точкой несовместимы при линковке; вы должны скомпилировать всю программу с одинаковым ABI и слинковать с совместимым набором библиотек.
-mgeneral-regs-only-
Генерировать код, который использует только регистры общего назначения. Это предотвратит использование компилятором регистров с плавающей точкой и расширенных регистров 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’, но включит исходные расширения 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’
-
Расширения 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’
Инструкции циклической избыточной проверки (CRC).
- ‘+simd’
Инструкции ARMv8-A Advanced SIMD и с плавающей запятой.
- ‘+crypto’
Криптографические инструкции.
- ‘+nocrypto’
Отключить криптографические инструкции.
- ‘+nofp’
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘+sb’
Инструкция Speculation Barrier.
- ‘+predres’
Инструкции ограничения прогнозирования выполнения и данных.
- ‘armv8.1-a’
-
- ‘+simd’
-
Инструкции ARMv8.1-A Advanced SIMD и с плавающей запятой.
- ‘+crypto’
-
Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+nocrypto’
-
Отключить криптографические инструкции.
- ‘+nofp’
-
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
- ‘+sb’
-
Инструкция Speculation Barrier.
- ‘+predres’
Инструкции ограничения прогнозирования выполнения и данных.
- ‘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 и криптографические инструкции.
- ‘+sb’
-
Инструкция Speculation Barrier.
- ‘+predres’
-
Инструкции ограничения прогнозирования выполнения и данных.
- ‘+i8mm’
-
Инструкции умножения матриц целых чисел 8-битной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.
- ‘+bf16’
Инструкции с плавающей запятой полуточной точности Brain. Это также включает инструкции 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 и криптографические инструкции.
- ‘+sb’
-
Инструкция Speculation Barrier.
- ‘+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’
-
Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции расширенного SIMD и с плавающей запятой, а также расширение Dot Product и расширение fmla для полуточной точности.
- ‘+simd’
-
Инструкции Advanced SIMD и с плавающей запятой ARMv8.3-A, а также расширение Dot Product.
- ‘+crypto’
-
Криптографические инструкции. Это также включает инструкции расширенного 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-Profile (MVE).
- ‘+mve.fp’
-
Инструкции целых чисел и инструкций с плавающей запятой одинарной точности расширения векторных инструкций M-Profile (MVE).
- ‘+fp’
-
Инструкции с плавающей запятой одинарной точности.
- ‘+fp.dp’
-
Инструкции с плавающей запятой одинарной и двойной точности.
- ‘+nofp’
-
Отключить расширение с плавающей запятой.
- ‘+cdecp0, +cdecp1, ... , +cdecp7’
Включить расширение пользовательского тракта данных (CDE) на выбранных сопроцессорах в соответствии с номерами, заданными в параметрах в диапазоне от 0 до 7.
- ‘armv8-m.main’
-
- ‘+dsp’
-
Инструкции DSP.
- ‘+nodsp’
-
Отключить расширение DSP.
- ‘+fp’
-
Инструкции с плавающей запятой одинарной точности.
- ‘+fp.dp’
-
Инструкции с плавающей запятой одинарной и двойной точности.
- ‘+nofp’
-
Отключить расширение с плавающей запятой.
- ‘+cdecp0, +cdecp1, ... , +cdecp7’
Включить расширение пользовательского тракта данных (CDE) на выбранных сопроцессорах в соответствии с номерами, заданными в параметрах в диапазоне от 0 до 7.
- ‘armv8-r’
-
- ‘+crc’
Инструкции контрольной суммы циклического избытка (CRC).
- ‘+fp.sp’
Инструкции с плавающей запятой FPv5 одинарной точности.
- ‘+simd’
Инструкции Advanced SIMD и с плавающей запятой ARMv8-A.
- ‘+crypto’
Криптографические инструкции.
- ‘+nocrypto’
Отключить криптографические инструкции.
- ‘+nofp’
Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.
-march=native заставляет компилятор автоматически определять архитектуру компьютера сборки. В настоящее время эта функция поддерживается только на GNU/Linux, и не все архитектуры распознаются. Если автоматическое определение не выполняется, параметр не имеет эффекта.
-
-mtune=name-
Этот параметр указывает имя целевого процессора ARM, для которого GCC должен настроить производительность кода. Для некоторых реализаций ARM лучшая производительность может быть достигнута с использованием этого параметра. Допустимые имена: ‘arm7tdmi’, ‘arm7tdmi-s’, ‘arm710t’, ‘arm720t’, ‘arm740t’, ‘strongarm’, ‘strongarm110’, ‘strongarm1100’, ‘strongarm1110’, ‘arm8’, ‘arm810’, ‘arm9’, ‘arm9e’, ‘arm920’, ‘arm920t’, ‘arm922t’, ‘arm946e-s’, ‘arm966e-s’, ‘arm968e-s’, ‘arm926ej-s’, ‘arm940t’, ‘arm9tdmi’, ‘arm10tdmi’, ‘arm1020t’, ‘arm1026ej-s’, ‘arm10e’, ‘arm1020e’, ‘arm1022e’, ‘arm1136j-s’, ‘arm1136jf-s’, ‘mpcore’, ‘mpcorenovfp’, ‘arm1156t2-s’, ‘arm1156t2f-s’, ‘arm1176jz-s’, ‘arm1176jzf-s’, ‘generic-armv7-a’, ‘cortex-a5’, ‘cortex-a7’, ‘cortex-a8’, ‘cortex-a9’, ‘cortex-a12’, ‘cortex-a15’, ‘cortex-a17’, ‘cortex-a32’, ‘cortex-a35’, ‘cortex-a53’, ‘cortex-a55’, ‘cortex-a57’, ‘cortex-a72’, ‘cortex-a73’, ‘cortex-a75’, ‘cortex-a76’, ‘cortex-a76ae’, ‘cortex-a77’, ‘cortex-a78’, ‘cortex-a78ae’, ‘cortex-a78c’, ‘cortex-a710’, ‘ares’, ‘cortex-r4’, ‘cortex-r4f’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-r52’, ‘cortex-r52plus’, ‘cortex-m0’, ‘cortex-m0plus’, ‘cortex-m1’, ‘cortex-m3’, ‘cortex-m4’, ‘cortex-m7’, ‘cortex-m23’, ‘cortex-m33’, ‘cortex-m35p’, ‘cortex-m55’, ‘cortex-x1’, ‘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, эти параметры имеют приоритет над соответствующей частью этого параметра.
Многие поддерживаемые процессоры реализуют необязательные архитектурные расширения. В таких случаях архитектурные расширения обычно включены по умолчанию. Если существуют реализации, которым не хватает расширения, то синтаксис расширения можно использовать для отключения тех расширений, которые отсутствуют. Для инструкций с плавающей запятой и расширенной 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’.
- ‘+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-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 (Thumb Procedure Call Standard), для всех нелистовых функций. (Листовая функция — это функция, которая не вызывает никакие другие функции.) По умолчанию установлено -mno-tpcs-frame.
-mtpcs-leaf-frame-
Генерировать кадр стека, соответствующий стандарту вызовов функций Thumb (Thumb Procedure Call Standard), для всех листовых функций. (Листовая функция — это функция, которая не вызывает никакие другие функции.) По умолчанию установлено -mno-apcs-leaf-frame.
-mcallee-super-interworking-
Предоставляет всем внешне видимым функциям в компилируемом файле заголовок набора инструкций ARM, который переключается на режим Thumb перед выполнением остальной части функции. Это позволяет вызывать эти функции из кода без переключения режимов. Эта опция недействительна в конфигурациях AAPCS, потому что переключение режимов включено по умолчанию.
-mcaller-super-interworking-
Разрешает вызовы через указатели на функции (включая виртуальные функции) для правильного выполнения независимо от того, был ли код целевой программы скомпилирован для переключения режимов или нет. При включении этой опции выполнение указателя на функцию сопровождается небольшой накладной стоимостью. Эта опция недействительна в конфигурациях AAPCS, потому что переключение режимов включено по умолчанию.
-mtp=name-
Указать модель доступа для указателя локального хранилища потока. Допустимые модели: ‘soft’, которая генерирует вызовы к
__aeabi_read_tp, ‘cp15’, которая получает указатель потока изcp15непосредственно (поддерживается в архитектуре arm6k), и ‘auto’, которая использует лучший доступный метод для выбранного процессора. Значение по умолчанию — ‘auto’. -mtls-dialect=dialect-
Указать диалект для доступа к локальному хранилищу потока. Поддерживаются два диалекта — ‘gnu’ и ‘gnu2’. Диалект ‘gnu’ выбирает исходную схему GNU для поддержки локальных и глобальных динамических моделей TLS. Диалект ‘gnu2’ выбирает схему описателей GNU, обеспечивающую лучшую производительность для общих библиотек. Схема описателей GNU совместима с исходной схемой, но требует новой поддержки ассемблера, компоновщика и библиотек. Модели начального и локального исполнения TLS не изменяются этой опцией и всегда используют исходную схему.
-mword-relocations-
Генерировать только абсолютные перемещения для значений размера слова (т. е. R_ARM_ABS32). Это включено по умолчанию на целевых платформах (uClinux, SymbianOS), где загрузчик времени выполнения накладывает это ограничение, а также при указании -fpic или -fPIC. Эта опция конфликтует с -mslow-flash-data.
-mfix-cortex-m3-ldrd-
Некоторые ядра Cortex-M3 могут вызывать повреждение данных, когда используются инструкции
ldrdс перекрывающимися регистрами назначения и базы. Эта опция предотвращает генерацию этих инструкций. Эта опция включена по умолчанию при указании -mcpu=cortex-m3. -mfix-cortex-a57-aes-1742098-mno-fix-cortex-a57-aes-1742098-mfix-cortex-a72-aes-1655431-mno-fix-cortex-a72-aes-1655431-
Включить (отключить) смягчение для ошибки в Cortex-A57 и Cortex-A72, которая влияет на криптографические инструкции AES. Эта опция включена по умолчанию при указании -mcpu=cortex-a57 или -mcpu=cortex-a72.
-munaligned-access-mno-unaligned-access-
Включает (или отключает) чтение и запись значений 16 и 32 битов из адресов, которые не выровнены по 16 или 32 битам. По умолчанию невыровненные доступ отключен для всех архитектур до ARMv6, всех ARMv6-M и ARMv8-M Baseline, и включен для всех остальных архитектур. Если невыровненный доступ отключен, слова в упакованных структурах данных считываются побайтово.
Атрибут ARM
Tag_CPU_unaligned_accessустанавливается в сгенерированном объектном файле в значение true или false, в зависимости от настройки этой опции. Если невыровненный доступ включен, то препроцессорная переменная__ARM_FEATURE_UNALIGNEDтакже определяется. -mneon-for-64bits-
Эта опция устарела и не оказывает никакого влияния.
-mslow-flash-data-
Предполагается, что загрузка данных из флэш-памяти медленнее, чем получение инструкций. Поэтому загрузка литералов сводится к минимуму для повышения производительности. Эта опция поддерживается только при компиляции для ARMv7 M-профиля и отключена по умолчанию. Она конфликтует с -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. Эта опция доступна только при генерации кода без позиционной независимости для целевых платформ M-профиля. -mcmse-
Генерировать защищённый код в соответствии с «ARMv8-M Security Extensions: Requirements on Development Tools Engineering Specification», который можно найти по адресу https://developer.arm.com/documentation/ecm0359818/latest/.
-mfix-cmse-cve-2021-35465-
Смягчение потенциальной проблемы безопасности с инструкцией
VLLDMв некоторых устройствах M-профиля при использовании CMSE (CVE-2021-365465). Эта опция включена по умолчанию, когда используется опция -mcpu= сcortex-m33,cortex-m35pилиcortex-m55. Опция -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) инструментальной цепочки, что и для сборки пользовательских программ.
Далее: Опции AVR, Предыдущее: Опции ARC, Верх: Опции подмоделей [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/ARM-Options.html