Spec-Zone.ru › GCC 11

Далее: AVR Options, Предыдущее: ARC Options, Вверх: Опции, зависящие от машины [Оглавление][Индекс]

3.19.5 Опции ARM ¶

Эти опции ‘-m’ определены для порта ARM:

-mabi=name

Генерировать код для указанного ABI. Допустимые значения: ‘apcs-gnu’, ‘atpcs’, ‘aapcs’, ‘aapcs-linux’ и ‘iwmmxt’.

-mapcs-frame

Генерировать структуру стека, совместимую с 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’ позволяет генерировать код, использующий аппаратные инструкции с плавающей точкой, но при этом использует соглашения о вызовах 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

При линковке большого эндианного изображения выбирайте между форматами 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’.

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

Инструкция барьера угадывания.

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

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

‘+i8mm’

Инструкции умножения матриц целых чисел 8-битного размера. Это также включает инструкции Advanced SIMD и с плавающей точкой.

‘+bf16’

Инструкции чисел с плавающей точкой полуточной точности. Это также включает инструкции 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’

Инструкция барьера угадывания.

‘+predres’

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

‘+i8mm’

Инструкции умножения матриц целых чисел 8-битного размера. Это также включает инструкции Advanced SIMD и с плавающей точкой.

‘+bf16’

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

‘armv8.5-a’
‘+fp16’

Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции расширенного SIMD и инструкции с плавающей запятой, а также расширение Dot Product и расширение fmla полуточной точности с плавающей запятой.

‘+simd’

Инструкции ARMv8.3-A расширенного SIMD и с плавающей запятой, а также расширение Dot Product.

‘+crypto’

Криптографические инструкции. Это также включает инструкции расширенного SIMD и с плавающей запятой, а также расширение Dot Product.

‘+nocrypto’

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

‘+nofp’

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

‘+i8mm’

Инструкции умножения матриц целых чисел 8-битной точности. Это также включает инструкции расширенного SIMD и с плавающей запятой.

‘+bf16’

Инструкции с плавающей запятой полуточной точности. Это также включает инструкции расширенного SIMD и с плавающей запятой.

‘armv8.6-a’
‘+fp16’

Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции расширенного SIMD и инструкции с плавающей запятой, а также расширение Dot Product и расширение fmla полуточной точности с плавающей запятой.

‘+simd’

Инструкции ARMv8.3-A расширенного SIMD и с плавающей запятой, а также расширение Dot Product.

‘+crypto’

Криптографические инструкции. Это также включает инструкции расширенного SIMD и с плавающей запятой, а также расширение Dot Product.

‘+nocrypto’

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

‘+nofp’

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

‘+i8mm’

Инструкции умножения матриц целых чисел 8-битной точности. Это также включает инструкции расширенного SIMD и с плавающей запятой.

‘+bf16’

Инструкции с плавающей запятой полуточной точности. Это также включает инструкции расширенного 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’

Включить расширение Custom Datapath (CDE) на выбранных сопроцессорах в соответствии с номерами, указанными в опциях в диапазоне от 0 до 7.

‘armv8-m.main’
‘+dsp’

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

‘+nodsp’

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

‘+fp’

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

‘+fp.dp’

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

‘+nofp’

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

‘+cdecp0, +cdecp1, ... , +cdecp7’

Включить расширение Custom Datapath (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’, 0‘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’, ‘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-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, эти параметры имеют приоритет над соответствующей частью этого параметра.

Многие поддерживаемые процессоры реализуют дополнительные архитектурные расширения. В таких случаях архитектурные расширения обычно включены по умолчанию. Если существуют реализации, в которых расширение отсутствует, синтаксис расширения может использоваться для отключения этих расширений, которые отсутствуют. Для инструкций с плавающей точкой и 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

Указывает формат типа с плавающей запятой полуточной точности. Допустимые имена: ‘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 base значение по умолчанию — любой подходящий регистр, определяемый компилятором. Для случая single PIC base значение по умолчанию — ‘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), где загрузчик времени выполнения накладывает это ограничение, и когда указаны -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

Предполагается, что встроенный ассемблер использует унифицированный синтаксис ассемблера. По умолчанию он отключён, что подразумевает раздельный синтаксис. Этот параметр не оказывает влияния на 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: 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 можно использовать для отключения минимизации.

-mfdpic
-mno-fdpic

Выбрать ABI FDPIC, который использует 64-битные описатели функций для представления указателей на функции. При настройке компилятора для целей arm-*-uclinuxfdpiceabi этот параметр включён по умолчанию и подразумевает -fPIE, если ни один из параметров, связанных с PIC/PIE, не задан. На других целевых платформах он только включает функции генерации кода, специфичные для FDPIC, и пользователь должен явно указать необходимые параметры PIC/PIE.

Обратите внимание, что статическая линковка не поддерживается, так как она всё ещё будет связана с динамическим линкером, когда программа выполняет самоперемещение. Если такое поведение приемлемо, используйте параметры -static и -Wl,-dynamic-linker.

Противный параметр -mno-fdpic полезен (и необходим) для построения ядра Linux с помощью той же (arm-*-uclinuxfdpiceabi) инструментальной цепочки, что и для построения приложений пользовательского интерфейса.

Далее: AVR Options, Предыдущий: ARC Options, Вверх: Параметры, зависящие от машины [Оглавление][Индекс]

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

Spec-Zone.ru

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