Spec-Zone.ru › GCC 9

3.18.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’, ‘armv7-r’, ‘armv8-r’, ‘armv6-m’, ‘armv6s-m’, ‘armv7-m’, ‘armv7e-m’, ‘armv8-m.base’, ‘armv8-m.main’, ‘iwmmxt’ и ‘iwmmxt2’.

Кроме того, следующие архитектуры, которые не поддерживают состояние выполнения Thumb, распознаются, но поддержка устарела: ‘armv4’.

Многие архитектуры поддерживают расширения. Их можно добавить, добавив ‘+extension’ к имени архитектуры. Параметры расширений обрабатываются в порядке следования, и возможности накапливаются. Расширение также включит все необходимые базовые расширения, от которых зависит. Например, расширение ‘+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’.

В таблице ниже перечислены поддерживаемые расширения для каждой архитектуры. Архитектуры, не упомянутые в списке, не поддерживают никаких расширений.

END_OF_DOCUMENT_MARKER
‘armv5te’
‘armv6’
‘armv6j’
‘armv6k’
‘armv6kz’
‘armv6t2’
‘armv6z’
‘armv6zk’
‘+fp’

Инструкции с плавающей точкой VFPv2. Расширение ‘+vfpv2’ может быть использовано в качестве псевдонима для этого расширения.

‘+nofp’

Отключить инструкции с плавающей точкой.

‘armv7’

Общий подмножество архитектур ARMv7-A, ARMv7-R и ARMv7-M.

‘+fp’

Инструкции с плавающей точкой VFPv3 с 16 регистрами двойной точности. Расширение ‘+vfpv3-d16’ может быть использовано в качестве псевдонима для этого расширения. Обратите внимание, что плавающая точка не поддерживается базовой архитектурой ARMv7-M, но совместима с архитектурами ARMv7-A и ARMv7-R.

‘+nofp’

Отключить инструкции с плавающей точкой.

‘armv7-a’
‘+mp’

Расширение многопроцессорной обработки.

‘+sec’

Расширение безопасности.

‘+fp’

Инструкции с плавающей точкой VFPv3 с 16 регистрами двойной точности. Расширение ‘+vfpv3-d16’ может быть использовано в качестве псевдонима для этого расширения.

‘+simd’

Расширения Advanced SIMD (Neon) v1 и инструкции с плавающей точкой VFPv3. Расширения ‘+neon’ и ‘+neon-vfpv3’ могут быть использованы в качестве псевдонимов для этого расширения.

‘+vfpv3’

Инструкции с плавающей точкой VFPv3 с 32 регистрами двойной точности.

‘+vfpv3-d16-fp16’

Инструкции с плавающей точкой VFPv3 с 16 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.

‘+vfpv3-fp16’

Инструкции с плавающей точкой VFPv3 с 32 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.

‘+vfpv4-d16’

Инструкции с плавающей точкой VFPv4 с 16 регистрами двойной точности.

‘+vfpv4’

Инструкции с плавающей точкой VFPv4 с 32 регистрами двойной точности.

‘+neon-fp16’

Расширение Advanced SIMD (Neon) v1 и инструкции с плавающей точкой VFPv3 с операциями преобразования чисел с плавающей запятой полуточной точности.

‘+neon-vfpv4’

Расширение Advanced SIMD (Neon) v2 и инструкции с плавающей точкой VFPv4.

‘+nosimd’

Отключить инструкции Advanced SIMD (не отключает плавающую точку).

‘+nofp’

Отключить инструкции с плавающей точкой и Advanced SIMD.

‘armv7ve’

Расширенная версия архитектуры ARMv7-A с поддержкой виртуализации.

‘+fp’

Инструкции с плавающей точкой VFPv4 с 16 регистрами двойной точности. Расширение ‘+vfpv4-d16’ может быть использовано в качестве псевдонима для этого расширения.

‘+simd’

Расширения Advanced SIMD (Neon) v2 и инструкции с плавающей точкой VFPv4. Расширение ‘+neon-vfpv4’ может быть использовано в качестве псевдонима для этого расширения.

‘+vfpv3-d16’

Инструкции с плавающей точкой VFPv3 с 16 регистрами двойной точности.

‘+vfpv3’

Инструкции с плавающей точкой VFPv3 с 32 регистрами двойной точности.

‘+vfpv3-d16-fp16’

Инструкции с плавающей точкой VFPv3 с 16 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.

‘+vfpv3-fp16’

Инструкции с плавающей точкой VFPv3 с 32 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.

‘+vfpv4-d16’

Инструкции с плавающей точкой VFPv4 с 16 регистрами двойной точности.

‘+vfpv4’

Инструкции с плавающей точкой VFPv4 с 32 регистрами двойной точности.

‘+neon’

Расширения Advanced SIMD (Neon) v1 и инструкции с плавающей точкой VFPv3. Расширение ‘+neon-vfpv3’ может быть использовано в качестве псевдонима для этого расширения.

‘+neon-fp16’

Расширение Advanced SIMD (Neon) v1 и инструкции с плавающей точкой VFPv3 с операциями преобразования чисел с плавающей запятой полуточной точности.

‘+nosimd’

Отключить инструкции Advanced SIMD (не отключает плавающую точку).

‘+nofp’

Отключить инструкции с плавающей точкой и Advanced SIMD.

‘armv8-a’
‘+crc’

Инструкции Cyclic Redundancy Check (CRC).

‘+simd’

Расширения ARMv8-A Advanced SIMD и инструкции с плавающей точкой.

‘+crypto’

Криптографические инструкции.

‘+nocrypto’

Отключить криптографические инструкции.

‘+nofp’

Отключить инструкции с плавающей точкой, Advanced SIMD и криптографические инструкции.

‘+sb’

Инструкция барьера спекуляции.

‘+predres’

Инструкции ограничения спекуляции выполнения и данных.

‘armv8.1-a’
‘+simd’

Инструкции ARMv8.1-A Advanced SIMD и с плавающей точкой.

‘+crypto’

Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей точкой.

‘+nocrypto’

Отключить криптографические инструкции.

‘+nofp’

Отключить инструкции с плавающей точкой, Advanced SIMD и криптографические инструкции.

‘+sb’

Инструкция барьера спекуляции.

‘+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’

Инструкция барьера спекуляции.

‘+predres’

Инструкции ограничения спекуляции выполнения и данных.

‘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’

Инструкция барьера спекуляции.

‘+predres’

Инструкции ограничения спекуляции выполнения и данных.

‘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 и криптографические инструкции.

‘armv7-r’
‘+fp.sp’

Инструкции с плавающей точкой VFPv3 одинарной точности. Расширение ‘+vfpv3xd’ может быть использовано в качестве псевдонима для этого расширения.

‘+fp’

Инструкции с плавающей точкой VFPv3 с 16 регистрами двойной точности. Расширение +vfpv3-d16 может быть использовано в качестве псевдонима для этого расширения.

‘+vfpv3xd-d16-fp16’

Инструкции с плавающей точкой VFPv3 одинарной точности с 16 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.

‘+vfpv3-d16-fp16’

Инструкции с плавающей точкой VFPv3 с 16 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.

‘+nofp’

Отключить расширение плавающей точки.

‘+idiv’

Инструкции целочисленного деления ARM-состояния.

‘+noidiv’

Отключить расширение целочисленного деления ARM-состояния.

‘armv7e-m’
‘+fp’

Инструкции с плавающей точкой VFPv4 одинарной точности.

‘+fpv5’

Инструкции с плавающей точкой FPv5 одинарной точности.

‘+fp.dp’

Инструкции с плавающей точкой FPv5 одинарной и двойной точности.

‘+nofp’

Отключить расширения плавающей точки.

‘armv8-m.main’
‘+dsp’

Инструкции DSP.

‘+nodsp’

Отключить расширение DSP.

‘+fp’

Инструкции с плавающей запятой одинарной точности.

‘+fp.dp’

Инструкции с плавающей запятой одинарной и двойной точности.

‘+nofp’

Отключить расширение с плавающей запятой.

‘armv8-r’
‘+crc’

Инструкции Cyclic Redundancy Check (CRC).

‘+fp.sp’

Инструкции FPv5 с плавающей запятой одинарной точности.

‘+simd’

Инструкции ARMv8-A Advanced SIMD и с плавающей запятой.

‘+crypto’

Криптографические инструкции.

‘+nocrypto’

Отключить криптографические инструкции.

‘+nofp’

Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.

-march=native заставляет компилятор автоматически определять архитектуру компьютера, на котором выполняется сборка. В настоящее время эта функция поддерживается только в GNU/Linux, и не все архитектуры распознаются. Если автоматическое определение не удается, этот параметр не имеет эффекта.

-mtune=name

Этот параметр указывает имя целевого ARM процессора, для которого GCC должно настроить производительность кода. В некоторых реализациях ARM лучшая производительность может быть достигнута с использованием этого параметра. Разрешенные имена: ‘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’, ‘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-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’.

‘+nofp’

Отключает инструкции с плавающей запятой на ‘arm9e’, ‘arm946e-s’, ‘arm966e-s’, ‘arm968e-s’, ‘arm10e’, ‘arm1020e’, ‘arm1022e’, ‘arm926ej-s’, ‘arm1026ej-s’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-m4’, ‘cortex-m7’ и ‘cortex-m33’. Отключает инструкции с плавающей запятой и SIMD на ‘generic-armv7-a’, ‘cortex-a5’, ‘cortex-a7’, ‘cortex-a8’, ‘cortex-a9’, ‘cortex-a12’, ‘cortex-a15’, ‘cortex-a17’, ‘cortex-a15.cortex-a7’, ‘cortex-a17.cortex-a7’, ‘cortex-a32’, ‘cortex-a35’, ‘cortex-a53’ и ‘cortex-a55’.

‘+nofp.dp’

Отключает двойную точность инструкций с плавающей запятой на ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-r52’ и ‘cortex-m7’.

‘+nosimd’

Отключает инструкции SIMD (но не с плавающей запятой) на ‘generic-armv7-a’, ‘cortex-a5’, ‘cortex-a7’ и ‘cortex-a9’.

‘+crypto’

Включает криптографические инструкции на ‘cortex-a32’, ‘cortex-a35’, ‘cortex-a53’, ‘cortex-a55’, ‘cortex-a57’, ‘cortex-a72’, ‘cortex-a73’, ‘cortex-a75’, ‘exynos-m1’, ‘xgene1’, ‘cortex-a57.cortex-a53’, ‘cortex-a72.cortex-a53’, ‘cortex-a73.cortex-a35’, ‘cortex-a73.cortex-a53’ и ‘cortex-a75.cortex-a55’.

Кроме того, псевдоцелевая ‘generic-armv7-a’ по умолчанию использует VFPv3 с 16 регистрами двойной точности. Она поддерживает следующие расширения: ‘mp’, ‘sec’, ‘vfpv3-d16’, ‘vfpv3’, ‘vfpv3-d16-fp16’, ‘vfpv3-fp16’, ‘vfpv4-d16’, ‘vfpv4’, ‘neon’, ‘neon-vfpv3’, ‘neon-fp16’, ‘neon-vfpv4’. Значения такие же, как и для расширений для -march=armv7-a.

-mcpu=generic-arch также допустимо и эквивалентно -march=arch -mtune=generic-arch. См. -mtune для получения дополнительной информации.

-mcpu=native заставляет компилятор автоматически определять процессор компьютера, на котором выполняется сборка. В настоящее время эта функция поддерживается только в GNU/Linux, и не все архитектуры распознаются. Если автоматическое определение не удается, этот параметр не имеет эффекта.

-mfpu=name

Это задаёт, какое оборудование с плавающей запятой (или эмуляция оборудования) доступно на целевой платформе. Разрешенные имена: ‘auto’, ‘vfpv2’, ‘vfpv3’, ‘vfpv3-fp16’, ‘vfpv3-d16’, ‘vfpv3-d16-fp16’, ‘vfpv3xd’, ‘vfpv3xd-fp16’, ‘neon-vfpv3’, ‘neon-fp16’, ‘vfpv4’, ‘vfpv4-d16’, ‘fpv4-sp-d16’, ‘neon-vfpv4’, ‘fpv5-d16’, ‘fpv5-sp-d16’, ‘fp-armv8’, ‘neon-fp-armv8’ и ‘crypto-neon-fp-armv8’. Обратите внимание, что ‘neon’ — псевдоним для ‘neon-vfpv3’, а ‘vfp’ — псевдоним для ‘vfpv2’.

Настройка ‘auto’ является значением по умолчанию и специальной. Она заставляет компилятор выбирать инструкции с плавающей запятой и 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 для всех нелистовых функций. (Листовая функция — это функция, которая не вызывает другие функции.) Значение по умолчанию — -mno-tpcs-frame.

-mtpcs-leaf-frame

Генерирует стековый кадр, совместимый со стандартом вызова функций Thumb для всех листовых функций. (Листовая функция — это функция, которая не вызывает другие функции.) Значение по умолчанию — -mno-apcs-leaf-frame.

-mcallee-super-interworking

Присваивает всем внешне видимым функциям в компилируемом файле заголовок набора инструкций ARM, который переключается в режим Thumb перед выполнением остальной части функции. Это позволяет вызывать эти функции из кода без переключения режимов. Эта опция недействительна в конфигурациях AAPCS, потому что переключение режимов включено по умолчанию.

-mcaller-super-interworking

Разрешает вызовы через указатели на функции (включая виртуальные функции) для правильной работы независимо от того, был ли целевой код скомпилирован для переключения режимов или нет. Существует небольшая накладная стоимость при выполнении указателя на функцию, если эта опция включена. Эта опция недействительна в конфигурациях AAPCS, так как переключение режимов включено по умолчанию.

-mtp=name

Указывает модель доступа для указателя локального хранилища потока. Допустимые модели: ‘soft’, которая генерирует вызовы в __aeabi_read_tp, ‘cp15’, которая извлекает указатель потока из cp15 напрямую (поддерживается в архитектуре arm6k), и ‘auto’, которая использует лучший доступный метод для выбранного процессора. Значение по умолчанию — ‘auto’.

-mtls-dialect=dialect

Укажите диалект для доступа к локальному хранилищу потока. Поддерживаются два диалекта — ‘gnu’ и ‘gnu2’. Диалект ‘gnu’ выбирает оригинальную схему GNU для поддержки локальных и глобальных динамических моделей TLS. Диалект ‘gnu2’ выбирает схему описателей GNU, которая обеспечивает лучшую производительность для общих библиотек. Схема описателей GNU совместима с оригинальной схемой, но требует поддержки нового ассемблера, компоновщика и библиотеки. Модели TLS для начального и локального исполнения не затронуты этой опцией и всегда используют оригинальную схему.

-mword-relocations

Генерирует только абсолютные перемещения для значений размером в слово (то есть R_ARM_ABS32). Это включено по умолчанию на целевых платформах (uClinux, SymbianOS), где загрузчик 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

Включает использование Neon для обработки скалярных операций с 64 битами. Это отключено по умолчанию, так как стоимость перемещения данных из регистров ядра в Neon высока.

-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/.

Далее: Параметры AVR, Предыдущий: Параметры ARC, Вверх: Параметры Подмодели [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/ARM-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API