3.20.5 Параметры ARM
Для порта ARM определены следующие параметры «-m»:
-
-mabi=name -
Генерировать код для указанного ABI. Допустимые значения: «apcs-gnu», «atpcs», «aapcs», «aapcs-linux» и «iwmmxt».
-
-mapcs-frame -
Генерировать кадр стека, соответствующий стандарту вызова процедур ARM, для всех функций, даже если это не строго необходимо для правильного выполнения кода. Если указать -fomit-frame-pointer вместе с этим параметром, кадры стека не будут генерироваться для листовых функций. По умолчанию используется -mno-apcs-frame. Этот параметр устарел.
-
-mapcs -
Это синоним -mapcs-frame; параметр устарел.
-
-mthumb-interwork -
Генерировать код, поддерживающий вызовы между наборами инструкций ARM и Thumb. Без этого параметра на архитектурах до v5 два набора инструкций нельзя надежно использовать в одной программе. По умолчанию используется -mno-thumb-interwork, поскольку при указании -mthumb-interwork генерируется немного больше кода. В конфигурациях AAPCS этот параметр не имеет смысла.
-
-mno-sched-prolog -
Запретить переупорядочивание инструкций в прологе функции или объединение этих инструкций с инструкциями тела функции. Это означает, что все функции начинаются с распознаваемого набора инструкций (или, точнее, с одного из небольшого набора возможных прологов функций), и эту информацию можно использовать для определения начала функций в исполняемом фрагменте кода. По умолчанию используется -msched-prolog.
-
-mfloat-abi=name -
Задает используемый ABI для операций с плавающей точкой. Допустимые значения: «soft», «softfp» и «hard».
При указании «soft» GCC генерирует код с вызовами библиотечных функций для операций с плавающей точкой. «softfp» позволяет генерировать код с аппаратными инструкциями для операций с плавающей точкой, но при этом используются соглашения о вызовах soft-float. «hard» позволяет генерировать инструкции для операций с плавающей точкой и использует соглашения о вызовах, специфичные для FPU.
Значение по умолчанию зависит от конкретной конфигурации целевой платформы. Обратите внимание, что ABI hard-float и soft-float несовместимы при компоновке: необходимо компилировать всю программу с одним и тем же ABI и компоновывать ее с совместимым набором библиотек.
-
-mgeneral-regs-only -
Генерировать код, использующий только регистры общего назначения. Это не позволит компилятору использовать регистры с плавающей точкой и Advanced SIMD, но не наложит никаких ограничений на ассемблер.
-
-mlittle-endian -
Генерировать код для процессора, работающего в режиме little-endian. Это значение используется по умолчанию во всех стандартных конфигурациях.
-
-mbig-endian -
Генерировать код для процессора, работающего в режиме big-endian; по умолчанию компилируется код для процессора с порядком байтов little-endian.
-
-mbe8 -mbe32-
При компоновке образа big-endian выбрать формат BE8 или BE32. Для образов little-endian параметр не действует и игнорируется. Значение по умолчанию зависит от выбранной целевой архитектуры. Для ARMv6 и более поздних архитектур по умолчанию используется BE8, для более старых архитектур — BE32. Формат BE32 признан ARM устаревшим.
-
-march=name[+extension…] -
Задает название целевой архитектуры ARM. GCC использует это название, чтобы определить, какие инструкции можно генерировать при создании ассемблерного кода. Этот параметр можно использовать вместе с параметром -mcpu= или вместо него.
Допустимые названия: «armv4t», «armv5t», «armv5te», «armv6», «armv6j», «armv6k», «armv6kz», «armv6t2», «armv6z», «armv6zk», «armv7», «armv7-a», «armv7ve», «armv8-a», «armv8.1-a», «armv8.2-a», «armv8.3-a», «armv8.4-a», «armv8.5-a», «armv8.6-a», «armv9-a», «armv7-r», «armv8-r», «armv6-m», «armv6s-m», «armv7-m», «armv7e-m», «armv8-m.base», «armv8-m.main», «armv8.1-m.main», «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.
В таблице ниже перечислены расширения, поддерживаемые каждой архитектурой. Архитектуры, не указанные в таблице, не поддерживают расширений.
- «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»
Инструкции Advanced SIMD и операции с плавающей точкой ARMv8-A.
- «+crypto»
Криптографические инструкции.
- «+nocrypto»
Отключить криптографические инструкции.
- «+nofp»
Отключить инструкции для операций с плавающей точкой, Advanced SIMD и криптографические инструкции.
- «+sb»
Инструкция барьера спекулятивного выполнения.
- «+predres»
Инструкции ограничения прогнозирования выполнения и данных.
- «armv8.1-a»
-
- «+simd»
-
Инструкции Advanced SIMD и операции с плавающей точкой ARMv8.1-A.
- «+crypto»
-
Криптографические инструкции. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой.
- «+nocrypto»
-
Отключить криптографические инструкции.
- «+nofp»
-
Отключить инструкции для операций с плавающей точкой, Advanced SIMD и криптографические инструкции.
- «+sb»
-
Инструкция барьера спекулятивного выполнения.
- «+predres»
Инструкции ограничения прогнозирования выполнения и данных.
- «armv8.2-a»
- «armv8.3-a»
-
- «+fp16»
-
Инструкции обработки данных с плавающей точкой половинной точности. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой.
- «+fp16fml»
-
Расширение fmla для чисел с плавающей точкой половинной точности. Также включает расширение операций с плавающей точкой половинной точности, инструкции Advanced SIMD и инструкции для операций с плавающей точкой.
- «+simd»
-
Инструкции Advanced SIMD и операции с плавающей точкой ARMv8.1-A.
- «+crypto»
-
Криптографические инструкции. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой.
- «+dotprod»
-
Включить расширение Dot Product. Также включает инструкции Advanced SIMD.
- «+nocrypto»
-
Отключить криптографическое расширение.
- «+nofp»
-
Отключить инструкции для операций с плавающей точкой, Advanced SIMD и криптографические инструкции.
- «+sb»
-
Инструкция барьера спекулятивного выполнения.
- «+predres»
-
Инструкции ограничения прогнозирования выполнения и данных.
- «+i8mm»
-
Инструкции умножения целочисленных матриц с 8-битными элементами. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой.
- «+bf16»
Инструкции для чисел с плавающей точкой половинной точности Brain. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой.
- «armv8.4-a»
-
- «+fp16»
-
Инструкции обработки данных с плавающей точкой половинной точности. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой, а также расширение Dot Product и расширение fmla для чисел с плавающей точкой половинной точности.
- «+simd»
-
Инструкции Advanced SIMD и операции с плавающей точкой ARMv8.3-A, а также расширение Dot Product.
- «+crypto»
-
Криптографические инструкции. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой, а также расширение Dot Product.
- «+nocrypto»
-
Отключить криптографическое расширение.
- «+nofp»
-
Отключить инструкции для операций с плавающей точкой, Advanced SIMD и криптографические инструкции.
- «+sb»
-
Инструкция барьера спекулятивного выполнения.
- «+predres»
-
Инструкции ограничения прогнозирования выполнения и данных.
- «+i8mm»
-
Инструкции умножения целочисленных матриц с 8-битными элементами. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой.
- «+bf16»
Инструкции для чисел с плавающей точкой половинной точности Brain. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой.
- «armv8.5-a»
-
- «+fp16»
-
Инструкции обработки данных с плавающей точкой половинной точности. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой, а также расширение Dot Product и расширение fmla для чисел с плавающей точкой половинной точности.
- «+simd»
-
Инструкции Advanced SIMD и операции с плавающей точкой ARMv8.3-A, а также расширение Dot Product.
- «+crypto»
-
Криптографические инструкции. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой, а также расширение Dot Product.
- «+nocrypto»
-
Отключить криптографическое расширение.
- «+nofp»
-
Отключить инструкции для операций с плавающей точкой, Advanced SIMD и криптографические инструкции.
- «+i8mm»
-
Инструкции умножения целочисленных матриц с 8-битными элементами. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой.
- «+bf16»
Инструкции для чисел с плавающей точкой половинной точности Brain. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой.
- «armv8.6-a»
-
- «+fp16»
-
Инструкции обработки данных с плавающей точкой половинной точности. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой, а также расширение Dot Product и расширение fmla для чисел с плавающей точкой половинной точности.
- «+simd»
-
Инструкции Advanced SIMD и операции с плавающей точкой ARMv8.3-A, а также расширение Dot Product.
- «+crypto»
-
Криптографические инструкции. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой, а также расширение Dot Product.
- «+nocrypto»
-
Отключить криптографическое расширение.
- «+nofp»
-
Отключить инструкции для операций с плавающей точкой, Advanced SIMD и криптографические инструкции.
- «+i8mm»
-
Инструкции умножения целочисленных матриц с 8-битными элементами. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой.
- «+bf16»
Инструкции для чисел с плавающей точкой половинной точности Brain. Также включает инструкции Advanced SIMD и инструкции для операций с плавающей точкой.
- «armv7-r»
-
- «+fp.sp»
-
Инструкции для операций с плавающей точкой одинарной точности VFPv3. В качестве псевдонима этого расширения можно использовать «+vfpv3xd».
- «+fp»
-
Инструкции для операций с плавающей точкой VFPv3 с 16 регистрами двойной точности. В качестве псевдонима этого расширения можно использовать +vfpv3-d16.
- «+vfpv3xd-d16-fp16»
-
Инструкции для операций с плавающей точкой одинарной точности VFPv3 с 16 регистрами двойной точности и операции преобразования чисел с плавающей точкой половинной точности.
- «+vfpv3-d16-fp16»
-
Инструкции для операций с плавающей точкой VFPv3 с 16 регистрами двойной точности и операции преобразования чисел с плавающей точкой половинной точности.
- «+nofp»
-
Отключить расширение операций с плавающей точкой.
- «+idiv»
-
Инструкции целочисленного деления в состоянии ARM.
- «+noidiv»
Отключить расширение целочисленного деления в состоянии ARM.
- «armv7e-m»
-
- «+fp»
-
Инструкции для операций с плавающей точкой одинарной точности VFPv4.
- «+fpv5»
-
Инструкции для операций с плавающей точкой одинарной точности FPv5.
- «+fp.dp»
-
Инструкции для операций с плавающей точкой одинарной и двойной точности FPv5.
- «+nofp»
Отключить расширения операций с плавающей точкой.
- «armv8.1-m.main»
-
- «+dsp»
-
Инструкции DSP.
- «+mve»
-
Целочисленные инструкции векторного расширения M-Profile (MVE).
- «+mve.fp»
-
Целочисленные инструкции и инструкции для операций с плавающей точкой одинарной точности векторного расширения M-Profile (MVE).
- «+fp»
-
Инструкции для операций с плавающей точкой одинарной точности.
- «+fp.dp»
-
Инструкции для операций с плавающей точкой одинарной и двойной точности.
- «+nofp»
-
Отключить расширение операций с плавающей точкой.
- «+cdecp0, +cdecp1, ... , +cdecp7»
-
Включить расширение Custom Datapath Extension (CDE) для выбранных сопроцессоров с номерами от 0 до 7, указанными в параметрах.
- «+pacbti»
Включить расширение аутентификации указателей и идентификации целей перехода.
- «armv8-m.main»
-
- «+dsp»
-
Инструкции DSP.
- «+nodsp»
-
Отключить расширение DSP.
- «+fp»
-
Инструкции для операций с плавающей точкой одинарной точности.
- «+fp.dp»
-
Инструкции для операций с плавающей точкой одинарной и двойной точности.
- «+nofp»
-
Отключить расширение операций с плавающей точкой.
- «+cdecp0, +cdecp1, ... , +cdecp7»
Включить расширение Custom Datapath Extension (CDE) для выбранных сопроцессоров с номерами от 0 до 7, указанными в параметрах.
- «armv8-r»
-
- «+crc»
Инструкции проверки циклическим избыточным кодом (CRC).
- «+fp.sp»
Инструкции для операций с плавающей точкой одинарной точности FPv5.
- «+simd»
Инструкции Advanced SIMD и операции с плавающей точкой ARMv8-A.
- «+crypto»
Криптографические инструкции.
- «+nocrypto»
Отключить криптографические инструкции.
- «+nofp»
Отключить инструкции для операций с плавающей точкой, Advanced SIMD и криптографические инструкции.
Параметр -march=native заставляет компилятор автоматически определить архитектуру компьютера, на котором выполняется сборка. В настоящее время эта возможность поддерживается только в GNU/Linux, и распознаются не все архитектуры. Если автоматическое определение завершится неудачно, параметр не подействует.
Параметр -march=unset заставляет компилятор игнорировать все параметры -march=…, указанные ранее в командной строке, и вести себя так, как если бы этот параметр никогда не передавался. Это полезно, чтобы избежать предупреждений о конфликтующих параметрах CPU и архитектуры, если они задают разные спецификации архитектуры.
-
-mtune=name -
Этот параметр задает название целевого процессора ARM, для которого GCC должен оптимизировать производительность кода. Для некоторых реализаций ARM этот параметр позволяет повысить производительность. Допустимые названия: «arm7tdmi», «arm7tdmi-s», «arm710t», «arm720t», «arm740t», «strongarm», «strongarm110», «strongarm1100», «strongarm1110», «arm8», «arm810», «arm9», «arm9e», «arm920», «arm920t», «arm922t», «arm946e-s», «arm966e-s», «arm968e-s», «arm926ej-s», «arm940t», «arm9tdmi», «arm10tdmi», «arm1020t», «arm1026ej-s», «arm10e», «arm1020e», «arm1022e», «arm1136j-s», «arm1136jf-s», «mpcore», «mpcorenovfp», «arm1156t2-s», «arm1156t2f-s», «arm1176jz-s», «arm1176jzf-s», «generic-armv7-a», «cortex-a5», «cortex-a7», «cortex-a8», «cortex-a9», «cortex-a12», «cortex-a15», «cortex-a17», «cortex-a32», «cortex-a35», «cortex-a53», «cortex-a55», «cortex-a57», «cortex-a72», «cortex-a73», «cortex-a75», «cortex-a76», «cortex-a76ae», «cortex-a77», «cortex-a78», «cortex-a78ae», «cortex-a78c», «cortex-a710», «ares», «cortex-r4», «cortex-r4f», «cortex-r5», «cortex-r7», «cortex-r8», «cortex-r52», «cortex-r52plus», «cortex-m0», «cortex-m0plus», «cortex-m1», «cortex-m3», «cortex-m4», «cortex-m7», «cortex-m23», «cortex-m33», «cortex-m35p», «cortex-m52», «cortex-m55», «cortex-m85», «cortex-x1», «cortex-x1c», «cortex-m1.small-multiply», «cortex-m0.small-multiply», «cortex-m0plus.small-multiply», «exynos-m1», «marvell-pj4», «neoverse-n1», «neoverse-n2», «neoverse-v1», «xscale», «iwmmxt», «iwmmxt2», «ep9312», «fa526», «fa626», «fa606te», «fa626te», «fmp626», «fa726te», «star-mc1», «xgene1».
Кроме того, с помощью этого параметра можно указать GCC оптимизировать производительность кода для системы big.LITTLE. Допустимые названия: «cortex-a15.cortex-a7», «cortex-a17.cortex-a7», «cortex-a57.cortex-a53», «cortex-a72.cortex-a53», «cortex-a72.cortex-a35», «cortex-a73.cortex-a53», «cortex-a75.cortex-a55», «cortex-a76.cortex-a55».
-mtune=generic-arch указывает GCC оптимизировать производительность для сочетания процессоров архитектуры arch. Цель — создавать код, хорошо работающий на наиболее распространенных в данный момент процессорах, балансируя между оптимизациями, полезными для одних моделей CPU, и предотвращением проблем с производительностью на других. Эффект этого параметра может меняться в будущих версиях GCC по мере появления и исчезновения моделей CPU.
Для -mtune допускаются те же параметры расширений, что и для -mcpu, однако параметры расширений не влияют на оптимизацию генерируемого кода.
-mtune=native заставляет компилятор автоматически определить CPU компьютера, на котором выполняется сборка. В настоящее время эта возможность поддерживается только в 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’, ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’. Также отключает целочисленные инструкции и инструкции с плавающей точкой одинарной точности расширения M-Profile Vector Extension (MVE) на ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’.
- ‘+nopacbti’
-
Отключает расширение Pointer Authentication and Branch Target Identification на ‘cortex-m52’ и ‘cortex-m85’.
- ‘+nomve’
-
Отключает целочисленные инструкции и инструкции с плавающей точкой одинарной точности расширения M-Profile Vector Extension (MVE) на ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’.
- ‘+nomve.fp’
-
Отключает инструкции с плавающей точкой одинарной точности расширения M-Profile Vector Extension (MVE) на ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’.
- ‘+cdecp0, +cdecp1, ... , +cdecp7’
-
Включает расширение Custom Datapath Extension (CDE) на выбранных сопроцессорах согласно номерам от 0 до 7, указанным в параметрах, для ‘cortex-m52’, ‘cortex-m55’ и ‘star-mc1’.
- ‘+nofp’
-
Отключает инструкции с плавающей точкой на ‘arm9e’, ‘arm946e-s’, ‘arm966e-s’, ‘arm968e-s’, ‘arm10e’, ‘arm1020e’, ‘arm1022e’, ‘arm926ej-s’, ‘arm1026ej-s’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-m4’, ‘cortex-m7’, ‘cortex-m33’, ‘cortex-m35p’, ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’. Отключает инструкции с плавающей точкой и SIMD на ‘generic-armv7-a’, ‘cortex-a5’, ‘cortex-a7’, ‘cortex-a8’, ‘cortex-a9’, ‘cortex-a12’, ‘cortex-a15’, ‘cortex-a17’, ‘cortex-a15.cortex-a7’, ‘cortex-a17.cortex-a7’, ‘cortex-a32’, ‘cortex-a35’, ‘cortex-a53’ и ‘cortex-a55’.
- ‘+nofp.dp’
-
Отключает компонент инструкций с плавающей точкой двойной точности на ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-r52’, ‘cortex-r52plus’ и ‘cortex-m7’.
- ‘+nosimd’
-
Отключает инструкции SIMD (но не инструкции с плавающей точкой) на ‘generic-armv7-a’, ‘cortex-a5’, ‘cortex-a7’ и ‘cortex-a9’.
- ‘+crypto’
Включает криптографические инструкции на ‘cortex-a32’, ‘cortex-a35’, ‘cortex-a53’, ‘cortex-a55’, ‘cortex-a57’, ‘cortex-a72’, ‘cortex-a73’, ‘cortex-a75’, ‘exynos-m1’, ‘xgene1’, ‘cortex-a57.cortex-a53’, ‘cortex-a72.cortex-a53’, ‘cortex-a73.cortex-a35’, ‘cortex-a73.cortex-a53’ и ‘cortex-a75.cortex-a55’.
Кроме того, псевдоцелевая платформа ‘generic-armv7-a’ по умолчанию использует VFPv3 с 16 регистрами двойной точности. Она поддерживает следующие параметры расширений: ‘mp’, ‘sec’, ‘vfpv3-d16’, ‘vfpv3’, ‘vfpv3-d16-fp16’, ‘vfpv3-fp16’, ‘vfpv4-d16’, ‘vfpv4’, ‘neon’, ‘neon-vfpv3’, ‘neon-fp16’, ‘neon-vfpv4’. Их значения совпадают со значениями расширений для -march=armv7-a.
Также допустим параметр -mcpu=generic-arch, эквивалентный параметрам -march=arch -mtune=generic-arch. Дополнительные сведения см. в описании -mtune.
-mcpu=native заставляет компилятор автоматически определять процессор компьютера, на котором выполняется сборка. В настоящее время эта возможность поддерживается только в GNU/Linux, и распознаются не все архитектуры. Если автоматическое определение завершается неудачей, параметр не оказывает никакого эффекта.
-mcpu=unset заставляет компилятор игнорировать все параметры -mcpu=…, указанные ранее в командной строке, и вести себя так, как если бы этот параметр никогда не передавался. Это полезно для предотвращения предупреждений о конфликтующих параметрах процессора и архитектуры, когда они задают разные описания архитектуры.
-
-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), обратите внимание: проход автoвекторизации 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 -
Предполагает, что смещение между сегментами кода и данных фиксировано на этапе статической компоновки. Это позволяет использовать операции относительной к счетчику команд адресации для доступа к данным, заведомо находящимся в сегменте данных. Для целевых платформ RTP, отличных от VxWorks, этот параметр включен по умолчанию. При отключении на таких целевых платформах по умолчанию включается -msingle-pic-base.
-
-mpoke-function-name -
Записывает имя каждой функции в секцию кода непосредственно перед прологом функции. Сгенерированный код будет выглядеть примерно так:
t0 .ascii "arm_poke_function_name", 0 .align t1 .word 0xff000000 + (t1 - t0) arm_poke_function_name mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4При трассировке стека код может проверить значение
pc, хранящееся по адресуfp + 0. Если затем функция трассировки проверит адресpc - 12и старшие 8 бит окажутся установленными, значит, непосредственно перед этим адресом встроено имя функции длиной((pc[-3]) & 0xff000000). -
-mthumb -marm-
Выбирает генерацию кода для выполнения в режиме ARM или Thumb. В большинстве конфигураций по умолчанию генерируется код для режима ARM, но это значение по умолчанию можно изменить, настроив GCC с помощью параметра конфигурации --with-mode=state.
Также можно переопределить режим ARM или Thumb для каждой функции с помощью атрибутов функций
target("thumb")иtarget("arm")(см. Атрибуты функций ARM) или прагм (см. Прагмы параметров для отдельных функций). -
-mflip-thumb -
Поочередно переключает режимы ARM и Thumb для функций. Этот параметр предназначен для регрессионного тестирования генерации смешанного кода Thumb/ARM и не предназначен для обычной компиляции кода.
-
-mtpcs-frame -
Генерирует кадр стека, соответствующий стандарту вызовов процедур Thumb, для всех функций, не являющихся листовыми. (Листовая функция — это функция, не вызывающая другие функции.) По умолчанию используется -mno-tpcs-frame.
-
-mtpcs-leaf-frame -
Генерирует кадр стека, соответствующий стандарту вызовов процедур Thumb, для всех листовых функций. (Листовая функция — это функция, не вызывающая другие функции.) По умолчанию используется -mno-apcs-leaf-frame.
-
-mcallee-super-interworking -
Добавляет всем внешне видимым функциям в компилируемом файле заголовок набора инструкций ARM, переключающий режим на Thumb перед выполнением оставшейся части функции. Это позволяет вызывать такие функции из кода без поддержки межрежимного взаимодействия. Этот параметр недопустим в конфигурациях AAPCS, поскольку межрежимное взаимодействие включено по умолчанию.
-
-mcaller-super-interworking -
Позволяет корректно выполнять вызовы через указатели на функции (включая виртуальные функции) независимо от того, был ли целевой код скомпилирован с поддержкой межрежимного взаимодействия. При включении этого параметра выполнение вызова через указатель на функцию требует немного больше ресурсов. Этот параметр недопустим в конфигурациях AAPCS, поскольку межрежимное взаимодействие включено по умолчанию.
-
-mtp=name -
Задает модель доступа к указателю локального хранилища потока. Модель ‘soft’ генерирует вызовы
__aeabi_read_tp. Другие допустимые модели — ‘tpidrurw’, ‘tpidruro’ и ‘tpidrprw’; они получают указатель потока непосредственно из соответствующего системного регистра (поддерживается начиная с архитектуры arm6k). Доступ к этим системным регистрам осуществляется через интерфейс сопроцессора CP15; аргумент ‘cp15’ также принимается как удобный псевдоним ‘tpidruro’. Аргумент ‘auto’ использует наилучший доступный метод для выбранного процессора. По умолчанию используется ‘auto’. -
-mtls-dialect=dialect -
Задает диалект доступа к локальному хранилищу потока. Поддерживаются два диалекта: ‘gnu’ и ‘gnu2’. Диалект ‘gnu’ выбирает исходную схему GNU для поддержки динамических моделей TLS с локальной и глобальной областью видимости. Диалект ‘gnu2’ выбирает схему дескрипторов GNU, обеспечивающую более высокую производительность для разделяемых библиотек. Схема дескрипторов GNU совместима с исходной схемой, но требует поддержки со стороны новых ассемблера, компоновщика и библиотек. На модели TLS initial-exec и local-exec этот параметр не влияет: они всегда используют исходную схему.
-
-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 -
Предполагает, что загрузка данных из флеш-памяти медленнее выборки инструкций. Поэтому количество загрузок литералов минимизируется для повышения производительности. Этот параметр поддерживается только при компиляции для профиля M ARMv7 и по умолчанию отключен. Он конфликтует с -mword-relocations.
-
-masm-syntax-unified -
Предполагает, что во встроенном ассемблере используется унифицированный синтаксис asm. В настоящее время этот параметр по умолчанию отключен, что подразумевает раздельный синтаксис. На Thumb2 этот параметр не влияет. Однако в будущих выпусках GCC это может измениться. Раздельный синтаксис следует считать устаревшим.
-
-mrestrict-it -
Ограничивает генерацию IT-блоков в соответствии с правилами ARMv8-A. IT-блоки могут содержать только одну 16-битную инструкцию из ограниченного набора инструкций. Этот параметр включен по умолчанию для режима Thumb ARMv8-A.
-
-mprint-tune-info -
Выводит информацию о настройке процессора в виде комментария в файл ассемблера. Этот параметр используется только для регрессионного тестирования компилятора и не предназначен для обычной компиляции кода. По умолчанию параметр отключен.
-
-mverbose-cost-dump -
Включает подробный вывод модели стоимости в файлы отладочных дампов. Этот параметр предназначен для отладки компилятора.
-
-mpure-code -
Запрещает размещать константные данные в секциях кода. Кроме того, при компиляции для объектного формата ELF всем секциям кода назначается специальный атрибут секции ELF для процессора
SHF_ARM_PURECODE. Этот параметр доступен только при генерации кода без PIC для целевых платформ профиля M. -
-mcmse -
Генерирует защищенный код в соответствии со спецификацией "ARMv8-M Security Extensions: Requirements on Development Tools Engineering Specification", доступной по адресу https://developer.arm.com/documentation/ecm0359818/latest/.
-
-mfix-cmse-cve-2021-35465 -
Устраняет потенциальную проблему безопасности, связанную с инструкцией
VLLDMна некоторых устройствах профиля M при использовании CMSE (CVE-2021-365465). Этот параметр включается по умолчанию, если параметр -mcpu= используется со значениемcortex-m33,cortex-m35p,cortex-m52,cortex-m55,cortex-m85илиstar-mc1. Для отключения этого механизма защиты можно использовать параметр -mno-fix-cmse-cve-2021-35465. -
-mstack-protector-guard=guard -mstack-protector-guard-offset=offset-
Генерирует код защиты стека, используя канареечное значение в guard. Поддерживаемые расположения: ‘global’ для глобальной канарейки или ‘tls’ для канарейки, доступной через регистр TLS. Параметр -mstack-protector-guard-offset= предназначен для использования с -fstack-protector-guard=tls, а не в пользовательском коде.
-
-mfdpic -mno-fdpic-
Выбирает ABI FDPIC, в котором для представления указателей на функции используются 64-битные дескрипторы функций. Если компилятор настроен для целевых платформ
arm-*-uclinuxfdpiceabi, этот параметр включен по умолчанию и подразумевает -fPIE, если не заданы параметры, связанные с PIC/PIE. Для других целевых платформ он включает только специфические для FDPIC возможности генерации кода; пользователь должен явно указывать параметры, связанные с PIC/PIE, если это необходимо.Обратите внимание: статическая компоновка не поддерживается, поскольку при самостоятельной перемещаемой загрузке программы все равно будет задействован динамический компоновщик. Если такое поведение приемлемо, используйте параметры -static и -Wl,-dynamic-linker.
Противоположный параметр -mno-fdpic полезен (и необходим) для сборки ядра Linux той же цепочкой инструментов (
arm-*-uclinuxfdpiceabi), которая используется для сборки пользовательских программ. -
-mbranch-protection=none|standard|pac-ret[+leaf][+bti]|bti[+pac-ret[+leaf]] -
Включает функции защиты ветвлений (только для armv8.1-m.main). ‘none’ — генерирует код без защиты ветвлений и подписывания адреса возврата. ‘standard[+leaf]’ — генерирует код со всеми функциями защиты ветвлений, включенными на стандартном уровне. ‘pac-ret[+leaf]’ — генерирует код со стандартным уровнем подписывания адреса возврата: подписываются все функции, сохраняющие адрес возврата в памяти. ‘leaf’ — если подписывание адреса возврата включено, также подписывает листовые функции, даже если они не записывают адрес возврата в память. +‘bti’ — добавляет инструкции посадочной площадки в разрешенные цели инструкций косвенного перехода.
Если архитектурное расширение ‘+pacbti’ не включено, все операции защиты ветвлений и подписывания адреса возврата ограничиваются использованием только инструкций, определенных в области архитектурных инструкций NOP. Сгенерированный код останется обратно совместимым с предыдущими версиями архитектуры, однако дополнительную защиту можно включить во время выполнения на процессорах, поддерживающих расширение ‘PACBTI’.
Защиту целей ветвлений с помощью BTI можно включить во время выполнения, только если весь код приложения скомпилирован как минимум с параметром ‘-mbranch-protection=bti’.
Любое значение, кроме ‘none’, поддерживается только для armv8-m.main и более новых архитектур.
По умолчанию генерируется код без защиты ветвлений и подписывания адреса возврата.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/ARM-Options.html