3.19.28 Варианты MIPS
-
-EB -
Генерировать код в формате big-endian.
-
-EL -
Генерировать код в формате little-endian. Это значение по умолчанию для конфигураций «mips*el-*-*».
-
-march=arch -
Генерировать код, который будет выполняться на arch, которое может быть именем обобщённой ISA MIPS или именем конкретного процессора. Названия ISA: «mips1», «mips2», «mips3», «mips4», «mips32», «mips32r2», «mips32r3», «mips32r5», «mips32r6», «mips64», «mips64r2», «mips64r3», «mips64r5» и «mips64r6». Названия процессоров: «4kc», «4km», «4kp», «4ksc», «4kec», «4kem», «4kep», «4ksd», «5kc», «5kf», «20kc», «24kc», «24kf2_1», «24kf1_1», «24kec», «24kef2_1», «24kef1_1», «34kc», «34kf2_1», «34kf1_1», «34kn», «74kc», «74kf2_1», «74kf1_1», «74kf3_2», «1004kc», «1004kf2_1», «1004kf1_1», «i6400», «i6500», «interaptiv», «loongson2e», «loongson2f», «loongson3a», «gs464», «gs464e», «gs264e», «m4k», «m14k», «m14kc», «m14ke», «m14kec», «m5100», «m5101», «octeon», «octeon+», «octeon2», «octeon3», «orion», «p5600», «p6600», «r2000», «r3000», «r3900», «r4000», «r4400», «r4600», «r4650», «r4700», «r5900», «r6000», «r8000», «rm7000», «rm9000», «r10000», «r12000», «r14000», «r16000», «sb1», «sr71000», «vr4100», «vr4111», «vr4120», «vr4130», «vr4300», «vr5000», «vr5400», «vr5500», «xlr» и «xlp». Специальное значение «from-abi» выбирает наиболее совместимую архитектуру для выбранного ABI (то есть «mips1» для 32-битных ABI и «mips3» для 64-битных ABI).
Встроенная цепочка инструментов Linux/GNU также поддерживает значение «native», которое выбирает лучший вариант архитектуры для процессора хоста. -march=native не имеет эффекта, если GCC не распознаёт процессор.
В именах процессоров окончание «000» можно сократить до «k» (например, -march=r2k). Префиксы являются необязательными, а «vr» может быть записано как «r».
Имена вида «nf2_1» относятся к процессорам с FPU, работающим в половину скорости ядра, имена вида «nf1_1» — к процессорам с FPU, работающим в той же скорости, что и ядро, а имена вида «nf3_2» — к процессорам с FPU, работающим со скоростью 3:2 по отношению к ядру. По соображениям совместимости «nf» принимается как синоним для «nf2_1», а «nx» и «bfx» — как синонимы для «nf1_1».
GCC определяет две макросы на основе значения этого варианта. Первая —
_MIPS_ARCH, которая даёт имя целевой архитектуры в виде строки. Вторая имеет вид_MIPS_ARCH_foo, где foo — прописное значение_MIPS_ARCH. Например, -march=r2000 устанавливает_MIPS_ARCHв"r2000"и определяет макрос_MIPS_ARCH_R2000.Обратите внимание, что макрос
_MIPS_ARCHиспользует имена процессоров, приведённые выше. Другими словами, он использует полный префикс и не сокращает «000» до «k». В случае «from-abi» макрос называет разрешённую архитектуру (либо"mips1"или"mips3"). Он называет архитектуру по умолчанию, когда параметр -march не указан. -
-mtune=arch -
Оптимизировать для arch. Среди прочего, этот параметр управляет способом планирования инструкций и воспринимаемой стоимостью арифметических операций. Список значений arch такой же, как для -march.
Если этот параметр не используется, GCC оптимизирует для процессора, указанного параметром -march. Используя -march и -mtune вместе, можно сгенерировать код, который работает на семействе процессоров, но оптимизировать код для конкретного члена этого семейства.
-mtune определяет макросы
_MIPS_TUNEи_MIPS_TUNE_foo, которые работают аналогично макросам из -march, описанным выше. -
-mips1 -
Эквивалентно -march=mips1.
-
-mips2 -
Эквивалентно -march=mips2.
-
-mips3 -
Эквивалентно -march=mips3.
-
-mips4 -
Эквивалентно -march=mips4.
-
-mips32 -
Эквивалентно -march=mips32.
-
-mips32r3 -
Эквивалентно -march=mips32r3.
-
-mips32r5 -
Эквивалентно -march=mips32r5.
-
-mips32r6 -
Эквивалентно -march=mips32r6.
-
-mips64 -
Эквивалентно -march=mips64.
-
-mips64r2 -
Эквивалентно -march=mips64r2.
-
-mips64r3 -
Эквивалентно -march=mips64r3.
-
-mips64r5 -
Эквивалентно -march=mips64r5.
-
-mips64r6 -
Эквивалентно -march=mips64r6.
-
-mips16 -mno-mips16-
Генерировать (не генерировать) код MIPS16. Если GCC нацелен на архитектуру MIPS32 или MIPS64, он использует ASE MIPS16e.
Генерацию кода MIPS16 также можно управлять на уровне каждой функции, используя атрибуты
mips16иnomips16. Подробнее см. Объявление атрибутов функций. -
-mflip-mips16 -
Генерировать код MIPS16 для чередующихся функций. Этот параметр предназначен для отладки, связанной с генерацией кода MIPS16/не-MIPS16, и не предназначен для обычного использования при компиляции пользовательского кода.
-
-minterlink-compressed -mno-interlink-compressed-
Требовать (не требовать), чтобы код, использующий стандартную (не сжатую) ISA MIPS, был совместим с линковкой с кодом MIPS16 и microMIPS, и наоборот.
Например, код, использующий стандартное кодирование ISA, не может напрямую переходить к коду MIPS16 или microMIPS; он должен использовать вызов или косвенный переход. -minterlink-compressed поэтому отключает прямые переходы, если GCC не знает, что цель перехода не сжата.
-
-minterlink-mips16 -mno-interlink-mips16-
Псевдонимы -minterlink-compressed и -mno-interlink-compressed. Эти параметры существовали до появления ASE microMIPS и сохранены для обратной совместимости.
-
-mabi=32 -mabi=o64-mabi=n32-mabi=64-mabi=eabi
-
Генерировать код для заданного ABI.
Обратите внимание, что EABI имеет 32-битную и 64-битную разновидности. GCC обычно генерирует 64-битный код, когда вы выбираете 64-битную архитектуру, но вы можете использовать -mgp32, чтобы получить 32-битный код вместо этого.
Для получения информации об ABI O64 см. https://gcc.gnu.org/projects/mipso64-abi.html.
GCC поддерживает вариант ABI o32, в котором регистры с плавающей точкой имеют ширину 64, а не 32 бита. Вы можете выбрать это сочетание с помощью -mabi=32 -mfp64. Этот ABI использует инструкции
mthc1иmfhc1и поэтому поддерживается только для процессоров MIPS32R2, MIPS32R3 и MIPS32R5.Присваивание регистров для аргументов и возвращаемых значений остаётся неизменным, но каждое скалярное значение передаётся в единственном 64-битном регистре вместо пары 32-битных регистров. Например, скалярные значения с плавающей точкой возвращаются в ‘$f0’ только, а не в паре ‘$f0’/‘$f1’.
Также неизменным остаётся набор регистров, сохраняемых при вызове, так что сохраняются чётные регистры двойной точности.
Поддерживаются две дополнительные разновидности ABI o32 для обеспечения перехода от 32-битных к 64-битным регистрам. Это FPXX (-mfpxx) и FP64A (-mfp64 -mno-odd-spreg). Расширение FPXX требует, чтобы весь код выполнялся правильно при работе с 32-битными или 64-битными регистрами. Код может быть связан с FP32 или FP64, но не с обоими одновременно. Расширение FP64A подобно расширению FP64, но запрещает использование регистров одинарной точности с нечётными номерами. Это можно использовать совместно с режимом
FREFPU в процессорах MIPS32R5 и позволяет коду FP32 и FP64A связываться и выполняться в одном процессе без изменения режимов FPU. -
-mabicalls -mno-abicalls-
Генерировать (не генерировать) код, подходящий для динамических объектов в стиле SVR4. -mabicalls является значением по умолчанию для систем на основе SVR4.
-mshared-mno-shared-
Генерировать (не генерировать) полностью независимый от расположения код, который, следовательно, может быть связан с общими библиотеками. Этот параметр влияет только на -mabicalls.
Весь код -mabicalls традиционно был независим от расположения, независимо от параметров, таких как -fPIC и -fpic. Однако, как расширение, GNU toolchain позволяет исполняемым файлам использовать абсолютные обращения для локальной привязки символов. Он также может использовать более короткие последовательности инициализации GP и генерировать прямые вызовы локально определённых функций. Этот режим выбирается с помощью -mno-shared.
-mno-shared зависит от binutils 2.16 или выше и генерирует объекты, которые могут быть связаны только GNU линковщиком. Однако, этот параметр не влияет на ABI конечного исполняемого файла; он влияет только на ABI переносимых объектов. Использование -mno-shared обычно делает исполняемые файлы как меньшими, так и быстрее.
-mshared является значением по умолчанию.
-
-mplt -mno-plt-
Предполагать (не предполагать), что статические и динамические линковщики поддерживают PLT и перестановки копирования. Этот параметр влияет только на -mno-shared -mabicalls. Для ABI n64 этот параметр не имеет эффекта без -msym32.
Вы можете сделать -mplt значением по умолчанию, настроив GCC с --with-mips-plt. В противном случае значением по умолчанию является -mno-plt.
-
-mxgot -mno-xgot-
Убрать (не убирать) обычные ограничения на размер таблицы смещений глобальных переменных.
GCC обычно использует одну инструкцию для загрузки значений из GOT. Хотя это относительно эффективно, оно работает только в том случае, если GOT меньше примерно 64k. Всё большее значение приводит к тому, что линковщик сообщает об ошибке, например:
relocation truncated to fit: R_MIPS_GOT16 foobar
Если это произойдёт, вы должны перекомпилировать свой код с -mxgot. Это работает с очень большими GOT, хотя код также менее эффективен, так как для извлечения значения глобального символа требуется три инструкции.
Обратите внимание, что некоторые линковщики могут создавать несколько GOT. Если у вас есть такой линковщик, вам нужно использовать -mxgot только когда один файл объекта обращается более чем к 64k записей GOT. Очень немногие это делают.
Эти параметры не действуют, если GCC не генерирует код, независимый от расположения.
-
-mgp32 -
Предполагать, что регистры общего назначения имеют ширину 32 бита.
-
-mgp64 -
Предполагать, что регистры общего назначения имеют ширину 64 бита.
-
-mfp32 -
Предполагать, что регистры с плавающей точкой имеют ширину 32 бита.
-
-mfp64 -
Предполагать, что регистры с плавающей точкой имеют ширину 64 бита.
-
-mfpxx -
Не предполагать ширину регистров с плавающей точкой.
-
-mhard-float -
Использовать инструкции сопроцессора с плавающей точкой.
-
-msoft-float -
Не использовать инструкции сопроцессора с плавающей точкой. Реализовать вычисления с плавающей точкой с помощью вызовов библиотек вместо этого.
-
-mno-float -
Эквивалентно -msoft-float, но дополнительно утверждает, что программа, которую компилируют, не выполняет никаких операций с плавающей точкой. Этот параметр в настоящее время поддерживается только некоторыми конфигурациями MIPS для bare-metal, где он может выбрать специальный набор библиотек, в котором отсутствует вся поддержка плавающей точки (включая, например, форматы плавающей точки
printf). Если код, скомпилированный с -mno-float, случайно содержит операции с плавающей точкой, он, вероятно, столкнётся с ошибкой на этапе линковки или выполнения. -
-msingle-float -
Предполагать, что сопроцессор с плавающей точкой поддерживает только операции одинарной точности.
-
-mdouble-float -
Предполагать, что сопроцессор с плавающей точкой поддерживает операции двойной точности. Это значение по умолчанию.
-
-modd-spreg -mno-odd-spreg-
Включить использование регистров с плавающей точкой одинарной точности с нечётными номерами для ABI o32. Это значение по умолчанию для процессоров, которые, как известно, поддерживают эти регистры. При использовании ABI o32 FPXX, -mno-odd-spreg устанавливается по умолчанию.
-
-mabs=2008 -mabs=legacy-
Эти параметры контролируют обработку специальных данных IEEE 754 с плавающей точкой (NaN) с помощью машинных инструкций
abs.fmtиneg.fmt.По умолчанию или когда используется -mabs=legacy, выбирается обработка по умолчанию. В этом случае эти инструкции рассматриваются как арифметические и избегаются там, где требуется правильная работа, а входной операнд может быть NaN. Вместо этого используется более длинная последовательность инструкций, которая вручную манипулирует битом знака данных с плавающей точкой, если при этом также не задан параметр -ffinite-math-only.
Параметр -mabs=2008 выбирает обработку IEEE 754-2008. В этом случае эти инструкции рассматриваются как неарифметические и, следовательно, работают корректно во всех случаях, в том числе, в частности, когда входной операнд является NaN. Поэтому эти инструкции всегда используются для соответствующих операций.
-
-mnan=2008 -mnan=legacy-
Эти параметры управляют кодированием специальных данных IEEE 754 с плавающей точкой (NaN).
Параметр -mnan=legacy выбирает кодирование по умолчанию. В этом случае тихие NaN (qNaN) обозначаются первым битом их поля значащих битов, равным 0, а сигнализирующие NaN (sNaN) обозначаются первым битом их поля значащих битов, равным 1.
Параметр -mnan=2008 выбирает кодирование IEEE 754-2008. В этом случае тихие NaN (qNaN) обозначаются первым битом их поля значащих битов, равным 1, а сигнализирующие NaN (sNaN) обозначаются первым битом их поля значащих битов, равным 0.
По умолчанию используется -mnan=legacy, если GCC не был настроен с --with-nan=2008.
-
-mllsc -mno-llsc-
Использовать (не использовать) инструкции ‘ll’, ‘sc’ и ‘sync’ для реализации встроенных функций атомной памяти. Если ни один параметр не указан, GCC использует инструкции, если целевая архитектура их поддерживает.
-mllsc полезно, если среда выполнения может эмулировать инструкции, а -mno-llsc может быть полезно при компиляции для нестандартных ISA. Вы можете сделать любой параметр значением по умолчанию, настроив GCC с --with-llsc и --without-llsc соответственно. --with-llsc является значением по умолчанию для некоторых конфигураций; см. документацию по установке для получения подробной информации.
-
-mdsp -mno-dsp-
Использовать (не использовать) ревизию 1 расширения MIPS DSP ASE. См. Встроенные функции MIPS DSP. Этот параметр определяет препроцессорную макрокоманду
__mips_dsp. Он также определяет__mips_dsp_revкак 1. -
-mdspr2 -mno-dspr2-
Использовать (не использовать) ревизию 2 расширения MIPS DSP ASE. См. Встроенные функции MIPS DSP. Этот параметр определяет препроцессорные макрокоманды
__mips_dspи__mips_dspr2. Он также определяет__mips_dsp_revкак 2. -
-msmartmips -mno-smartmips-
Использовать (не использовать) расширение MIPS SmartMIPS ASE.
-
-mpaired-single -mno-paired-single-
Использовать (не использовать) инструкции с парой чисел с плавающей точкой одинарной точности. См. Поддержка парных чисел одинарной точности MIPS. Этот параметр требует включения аппаратной поддержки плавающей точки.
-
-mdmx -mno-mdmx-
Использовать (не использовать) инструкции MIPS Digital Media Extension. Этот параметр может использоваться только при генерации 64-битного кода и требует включения аппаратной поддержки плавающей точки.
-
-mips3d -mno-mips3d
-
Использовать (не использовать) ASE MIPS-3D. См. Встроенные функции MIPS-3D. Опция -mips3d подразумевает -mpaired-single.
-
-mmicromips -mno-micromips-
Генерировать (не генерировать) код microMIPS.
Генерацию кода microMIPS также можно контролировать на уровне каждой функции с помощью
micromipsиnomicromipsатрибутов. Подробнее см. Объявление атрибутов функций. -
-mmt -mno-mt-
Использовать (не использовать) инструкции MT Multithreading.
-
-mmcu -mno-mcu-
Использовать (не использовать) инструкции MIPS MCU ASE.
-
-meva -mno-eva-
Использовать (не использовать) инструкции MIPS Enhanced Virtual Addressing.
-
-mvirt -mno-virt-
Использовать (не использовать) инструкции MIPS Virtualization (VZ).
-
-mxpa -mno-xpa-
Использовать (не использовать) инструкции MIPS eXtended Physical Address (XPA).
-
-mcrc -mno-crc-
Использовать (не использовать) инструкции MIPS Cyclic Redundancy Check (CRC).
-
-mginv -mno-ginv-
Использовать (не использовать) инструкции MIPS Global INValidate (GINV).
-
-mloongson-mmi -mno-loongson-mmi-
Использовать (не использовать) инструкции MIPS Loongson MultiMedia extensions (MMI).
-
-mloongson-ext -mno-loongson-ext-
Использовать (не использовать) инструкции MIPS Loongson EXTensions (EXT).
-
-mloongson-ext2 -mno-loongson-ext2-
Использовать (не использовать) инструкции MIPS Loongson EXTensions r2 (EXT2).
-
-mlong64 -
Принудительно задать тип
longв 64 бита. См. -mlong32 для объяснения значения по умолчанию и способа определения размера указателя. -
-mlong32 -
Принудительно задать тип
long,int, и указателей в 32 бита.Размер по умолчанию для
intов,longов и указателей зависит от ABI. Все поддерживаемые ABI используют 32-битныеintы. ABI n64 и 64-битный EABI используют 64-битныеlongы; остальные используют 32-битныеlongы. Указатели имеют тот же размер, что иlongы, или тот же размер, что и целочисленные регистры, что меньше. -
-msym32 -mno-sym32-
Предполагать (не предполагать), что все символы имеют 32-битные значения независимо от выбранного ABI. Эта опция полезна в сочетании с -mabi=64 и -mno-abicalls, так как она позволяет GCC генерировать более короткие и быстрые ссылки на символические адреса.
-
-G num -
Разместить определения внешне видимых данных в небольшой секции данных, если эти данные не больше, чем num байт. GCC может тогда генерировать более эффективные обращения к данным; см. -mgpopt для подробностей.
Значение опции -G по умолчанию зависит от конфигурации.
-
-mlocal-sdata -mno-local-sdata-
Расширить (не расширять) поведение -G на локальные данные, например, на статические переменные в C. -mlocal-sdata является значением по умолчанию для всех конфигураций.
Если компоновщик сообщает, что приложение использует слишком много данных для небольшой секции данных, возможно, следует перестроить менее важные для производительности части с -mno-local-sdata. Также следует перестроить большие библиотеки с -mno-local-sdata, чтобы оставить больше места для основной программы.
-
-mextern-sdata -mno-extern-sdata-
Предполагать (не предполагать), что внешние данные находятся в небольшой секции данных, если размер этих данных находится в пределах ограничения -G. -mextern-sdata является значением по умолчанию для всех конфигураций.
Если вы компилируете модуль Mod с -mextern-sdata -G num -mgpopt, и Mod ссылается на переменную Var, которая не больше, чем num байт, необходимо убедиться, что Var размещена в небольшой секции данных. Если Var определена другим модулем, необходимо либо скомпилировать этот модуль с достаточно высоким значением -G, либо прикрепить атрибут
sectionк определению Var. Если Var является общей, необходимо скомпоновать приложение с достаточно высоким значением -G.Самый простой способ удовлетворить этим ограничениям — скомпилировать и скомпоновать каждый модуль с той же опцией -G. Однако, возможно, потребуется создать библиотеку, которая поддерживает несколько различных пределов для небольшой секции данных. Можно сделать это, скомпилировав библиотеку с наибольшим поддерживаемым значением -G и дополнительно используя -mno-extern-sdata, чтобы предотвратить библиотеке делать предположения о внешне определённых данных.
-
-mgpopt -mno-gpopt-
Использовать (не использовать) GP-относительные обращения к символам, которые, как известно, находятся в небольшой секции данных; см. -G, -mlocal-sdata и -mextern-sdata. -mgpopt является значением по умолчанию для всех конфигураций.
-mno-gpopt полезно в тех случаях, когда регистр
$gpможет не содержать значение_gp. Например, если код является частью библиотеки, которая может использоваться в мониторе загрузки, программы, которые вызывают процедуры монитора загрузки, передают неизвестное значение в регистре$gp. (В таких ситуациях сам монитор загрузки обычно компилируется с -G0.)-mno-gpopt подразумевает -mno-local-sdata и -mno-extern-sdata.
-
-membedded-data -mno-embedded-data-
При возможности, сначала выделить переменные в секцию только для чтения, затем — в небольшую секцию данных, в противном случае — в секцию данных. Это даёт немного более медленный код, но уменьшает количество необходимой оперативной памяти при выполнении, и поэтому может быть предпочтительным для некоторых встроенных систем.
-
-muninit-const-in-rodata -mno-uninit-const-in-rodata-
Разместить неинициализированные
constпеременные в секции только для чтения. Эта опция имеет смысл только в сочетании с -membedded-data. -
-mcode-readable=setting -
Указать, может ли GCC генерировать код, который считывает из секций исполняемого кода. Существует три возможных значения:
-mcode-readable=yes-
Инструкции могут свободно обращаться к секциям исполняемого кода. Это значение по умолчанию.
-mcode-readable=pcrel-
Инструкции MIPS16 PC-относительных загрузки могут обращаться к секциям исполняемого кода, но другие инструкции не должны этого делать. Эта опция полезна на процессорах 4KSc и 4KSd, когда в TLB кода установлен бит Read Inhibit. Она также полезна на процессорах, которые могут быть сконфигурированы с двойным интерфейсом SRAM для инструкций/данных и которые, как M4K, автоматически перенаправляют PC-относительные загрузки в оперативную память для инструкций.
-mcode-readable=noИнструкции не должны обращаться к секциям исполняемого кода. Эта опция может быть полезна на целевых системах, которые сконфигурированы с двойным интерфейсом SRAM для инструкций/данных, но которые (в отличие от M4K) не автоматически перенаправляют PC-относительные загрузки в оперативную память для инструкций.
-
-msplit-addresses -mno-split-addresses-
Включить (выключить) использование операторов перемещения
%hi()и%lo()для сборки. Эта опция устарела и заменена на -mexplicit-relocs, но сохранена для обратной совместимости. -
-mexplicit-relocs -mno-explicit-relocs-
Использовать (не использовать) операторы перемещения сборки при работе со символическими адресами. Альтернатива, выбранная с помощью -mno-explicit-relocs, — использовать вместо этого макросы сборки.
-mexplicit-relocs является значением по умолчанию, если GCC был сконфигурирован для использования сборки, которая поддерживает операторы перемещения.
-
-mcheck-zero-division -mno-check-zero-division-
Отлавливать (не отлавливать) целочисленное деление на ноль.
Значение по умолчанию — -mcheck-zero-division.
-
-mdivide-traps -mdivide-breaks-
Системы MIPS проверяют деление на ноль, генерируя либо условную ловушку, либо инструкцию прерывания. Использование ловушек приводит к более компактному коду, но поддерживается только на MIPS II и более поздних архитектурах. Также в некоторых версиях ядра Linux есть ошибка, которая не позволяет ловушке генерировать правильный сигнал (
SIGFPE). Используйте -mdivide-traps, чтобы разрешить условные ловушки на архитектурах, которые их поддерживают, и -mdivide-breaks, чтобы принудительно использовать прерывания.По умолчанию обычно используется -mdivide-traps, но это может быть переопределено во время конфигурации с помощью --with-divide=breaks. Проверки деления на ноль можно полностью отключить с помощью -mno-check-zero-division.
-
-mload-store-pairs -mno-load-store-pairs-
Включить (отключить) оптимизацию, которая объединяет последовательные инструкции загрузки или сохранения для включения связки загрузки/сохранения. Эта опция включена по умолчанию, но действует только тогда, когда выбранная архитектура известна как поддерживающая связки.
-
-munaligned-access -mno-unaligned-access-
Включить (отключить) прямой доступ к невыровненным данным для MIPS Release 6. MIPSr6 требует поддержки доступа к невыровненным данным, либо аппаратной поддержки, либо механизма обработки ловушки/эмуляции. Поэтому -mno-unaligned-access может потребоваться в ядре.
-
-mmemcpy -mno-memcpy
-
Принудительно использовать (или не использовать)
memcpyдля нетривиальных перемещений блоков. По умолчанию используется -mno-memcpy, что позволяет GCC выполнять встраивание большинства копирований постоянного размера. -
-mlong-calls -mno-long-calls-
Отключить (или не отключать) использование инструкции
jal. Вызов функций с использованиемjalболее эффективен, но требует, чтобы вызывающая и вызываемая функции находились в одном 256-мегабайтном сегменте.Эта опция не влияет на код abicalls. По умолчанию используется -mno-long-calls.
-
-mmad -mno-mad-
Включить (отключить) использование инструкций
mad,maduиmul, предоставляемых архитектурой R4650 ISA. -
-mimadd -mno-imadd-
Включить (отключить) использование целочисленных инструкций
maddиmsub. По умолчанию используется -mimadd на архитектурах, поддерживающихmaddиmsub, за исключением архитектуры 74k, где было обнаружено, что это приводит к генерации более медленного кода. -
-mfused-madd -mno-fused-madd-
Включить (отключить) использование инструкций умножения-накопления с плавающей точкой, если они доступны. По умолчанию используется -mfused-madd.
В процессоре R8000 при использовании инструкций умножения-накопления промежуточный продукт вычисляется с бесконечной точностью и не подвержен влиянию бита FCSR Flush to Zero. Это может быть нежелательно в некоторых случаях. В других процессорах результат численно идентичен эквивалентному вычислению с использованием отдельных инструкций умножения, сложения, вычитания и изменения знака.
-
-nocpp -
Указать MIPS-ассемблеру не запускать свой препроцессор над пользовательскими файлами ассемблера (с суффиксом ‘.s’) при их сборке.
-
-mfix-24k -mno-fix-24k-
Обход ошибки 24K E48 (потеря данных при хранении во время пополнения). Обходные пути реализованы ассемблером, а не GCC.
-
-mfix-r4000 -mno-fix-r4000-
Обход определённых ошибок процессора R4000:
- Двойное слово или переменный сдвиг могут дать неверный результат, если выполняются сразу после запуска целочисленного деления.
- Двойное слово или переменный сдвиг могут дать неверный результат, если выполняются во время выполнения целочисленного умножения.
- Целочисленное деление может дать неверный результат, если начато в отложенном слоте условного перехода или прыжка.
-
-mfix-r4400 -mno-fix-r4400-
Обход определённых ошибок процессора R4400:
- Двойное слово или переменный сдвиг могут дать неверный результат, если выполняются сразу после запуска целочисленного деления.
-
-mfix-r10000 -mno-fix-r10000-
Обход определённых ошибок R10000:
-
ll/scпоследовательности могут не работать атомарно на ревизиях до 3.0. Они могут зависать на ревизиях 2.6 и ранее.
Эта опция может использоваться только в том случае, если целевая архитектура поддерживает инструкции условного перехода с высокой вероятностью. -mfix-r10000 используется по умолчанию, когда используется -march=r10000; -mno-fix-r10000 используется по умолчанию в противном случае.
-
-
-mfix-r5900 -mno-fix-r5900-
Не пытаться запланировать предшествующую инструкцию в отложенный слот инструкции перехода, размещённой в конце короткого цикла из шести или менее инструкций, и всегда планировать инструкцию
nopвместо этого. Ошибка короткого цикла при определённых условиях приводит к тому, что циклы выполняются только один или два раза из-за аппаратной ошибки в микросхеме R5900. Обходной путь реализован ассемблером, а не GCC. -
-mfix-rm7000 -mno-fix-rm7000-
Обход ошибки
dmult/dmultuRM7000. Обходные пути реализованы ассемблером, а не GCC. -
-mfix-vr4120 -mno-fix-vr4120-
Обход определённых ошибок VR4120:
-
dmultuне всегда даёт правильный результат. -
divиddivне всегда дают правильный результат, если один из операндов отрицательный.
Обходные пути для ошибок деления основаны на специальных функциях в libgcc.a. В настоящее время эти функции предоставляются только конфигурациями
mips64vr*-elf.Для других ошибок VR4120 требуется вставка NOP между определёнными парами инструкций. Эти ошибки обрабатываются ассемблером, а не самим GCC.
-
-
-mfix-vr4130 -
Обход ошибки
mflo/mfhiVR4130. Обходные пути реализованы ассемблером, а не GCC, хотя GCC избегает использованияmfloиmfhi, если вместо них доступны инструкцииmacc,macchi,dmaccиdmacchiVR4130. -
-mfix-sb1 -mno-fix-sb1-
Обход определённых ошибок ядра процессора SB-1. (Этот флаг в настоящее время обходит ошибки с плавающей точкой SB-1 ревизии 2 «F1» и «F2».)
-
-mr10k-cache-barrier=setting -
Укажите, следует ли GCC вставлять барьеры кэша, чтобы избежать побочных эффектов спекулятивного выполнения на процессорах R10K.
Как и многие процессоры, R10K пытается предсказать результат условного перехода и спекулятивно выполняет инструкции из ветки «taken». Позже он прерывает выполнение этих инструкций, если предсказанный результат неверен. Однако на R10K даже прерванные инструкции могут иметь побочные эффекты.
Эта проблема затрагивает только хранение в ядре и, в зависимости от системы, загрузку в ядре. Например, спекулятивно выполненная операция записи может загрузить целевую память в кэш и пометить строку кэша как модифицированную, даже если сама операция записи позже прерывается. Если операция DMA записывает в ту же область памяти до того, как «грязная» строка будет очищена, данные кэша перезаписывают данные DMA. См. руководство по процессору R10K для полного описания, включая другие потенциальные проблемы.
Один из способов решения проблемы — вставить инструкции барьера кэша перед каждым доступом к памяти, который может быть спекулятивно выполнен и который может иметь побочные эффекты, даже если он прерван. -mr10k-cache-barrier=setting управляет реализацией этого обходного пути GCC. Предполагается, что прерванные доступы к любому байту в следующих областях не имеют побочных эффектов:
- память, занимаемая фреймом стека текущей функции;
- память, занимаемая входным аргументом стека;
- память, занимаемая объектом со связанным во время компиляции постоянным адресом.
Ядро отвечает за обеспечение безопасности спекулятивных доступов к этим областям.
Если входная программа содержит объявление функции, такое как:
void foo (void);
то реализация
fooдолжна разрешать спекулятивное выполнениеj fooиjal foo. GCC учитывает это ограничение для функций, которые он компилирует сам. Он ожидает, что не-GCC функции (например, написанный вручную ассемблерный код) будут делать то же самое.У опции есть три формы:
-mr10k-cache-barrier=load-store-
Вставить барьер кэша перед загрузкой или хранением, которые могут быть спекулятивно выполнены и которые могут иметь побочные эффекты, даже если они прерваны.
-mr10k-cache-barrier=store-
Вставить барьер кэша перед хранением, которое может быть спекулятивно выполнено и которое может иметь побочные эффекты, даже если оно прервано.
-mr10k-cache-barrier=noneОтключить вставку барьеров кэша. Это настройка по умолчанию.
-
-mflush-func=func -mno-flush-func-
Указывает функцию, вызываемую для очистки кэшей I и D, или не вызывать никакую такую функцию. Если вызывается, функция должна принимать те же аргументы, что и общая функция
_flush_func, то есть адрес диапазона памяти, для которого очищается кэш, размер диапазона памяти и число 3 (для очистки обоих кэшей). Значение по умолчанию зависит от целевой платформы, для которой был настроен GCC, но обычно это либо_flush_func, либо__cpu_flush. -
mbranch-cost=num -
Установить стоимость переходов примерно в num «простых» инструкций. Эта стоимость является лишь эвристикой и не гарантируется, что она будет давать согласованные результаты в разных выпусках. Нулевая стоимость избыточно выбирает значение по умолчанию, которое основано на настройке -mtune.
-
-mbranch-likely -mno-branch-likely-
Включить или отключить использование инструкций условного перехода с высокой вероятностью, независимо от значения по умолчанию для выбранной архитектуры. По умолчанию инструкции условного перехода с высокой вероятностью могут генерироваться, если они поддерживаются выбранной архитектурой. Исключением являются архитектуры MIPS32 и MIPS64, а также процессоры, реализующие эти архитектуры; для них инструкции условного перехода с высокой вероятностью по умолчанию не генерируются, поскольку архитектуры MIPS32 и MIPS64 специально не рекомендуют их использование.
-
-mcompact-branches=never -mcompact-branches=optimal-mcompact-branches=always-
Эти опции управляют тем, какая форма переходов будет генерироваться. По умолчанию используется -mcompact-branches=optimal.
Опция -mcompact-branches=never гарантирует, что компактные инструкции перехода никогда не будут генерироваться.
Опция -mcompact-branches=always гарантирует, что компактная инструкция перехода будет генерироваться, если она доступна для MIPS Release 6 и выше. Если компактная инструкция перехода недоступна (или до R6), вместо неё будет использоваться форма перехода с отложенным слотом.
Если она используется для целей MIPS16/microMIPS, она будет просто игнорироваться. Поведение для MIPS16/microMIPS может измениться в будущем, поскольку у них есть некоторые компактные инструкции перехода.
Опция -mcompact-branches=optimal приведёт к использованию перехода с отложенным слотом, если он доступен в текущем ISA и отложенный слот успешно заполнен. Если отложенный слот не заполнен, будет выбрана компактная ветка, если она доступна.
-
-mfp-exceptions -mno-fp-exceptions
-
Указывает, включены ли исключения FP. Это влияет на планирование инструкций FP для некоторых процессоров. По умолчанию исключения FP включены.
Например, на SB-1, если исключения FP отключены, а мы генерируем 64-битный код, то мы можем использовать обе FP-трубы. В противном случае мы можем использовать только одну FP-трубу.
-
-mvr4130-align -mno-vr4130-align-
Конвейер VR4130 является двухсторонним суперскалярным, но может выдавать две инструкции вместе только в том случае, если первая из них выровнена по 8 байтам. При включении этого параметра GCC выравнивает пары инструкций, которые, по его мнению, должны выполняться параллельно.
Этот параметр оказывает влияние только при оптимизации для VR4130. Обычно он ускоряет код, но за счет увеличения его размера. Он включен по умолчанию на уровне оптимизации -O3.
-
-msynci -mno-synci-
Включить (выключить) генерацию инструкций
synciна архитектурах, которые их поддерживают. Инструкцииsynci(если включены) генерируются при компиляции__builtin___clear_cache.По умолчанию этот параметр равен -mno-synci, но значение по умолчанию можно изменить, сконфигурировав GCC с помощью --with-synci.
При компиляции кода для однопроцессорных систем использование
synciобычно безопасно. Однако на многих многоядерных (SMP) системах это не приводит к аннулированию кэшей инструкций на всех ядрах и может привести к неопределенному поведению. -
-mrelax-pic-calls -mno-relax-pic-calls-
Попытаться преобразовать вызовы PIC, которые обычно передаются через регистр
$25, в прямые вызовы. Это возможно только в том случае, если компоновщик может разрешить назначение в момент компоновки и если назначение находится в пределах диапазона для прямого вызова.-mrelax-pic-calls является значением по умолчанию, если GCC был сконфигурирован для использования ассемблера и компоновщика, которые поддерживают директиву ассемблера
.relocи -mexplicit-relocs активна. С помощью -mno-explicit-relocs эту оптимизацию можно выполнить ассемблером и компоновщиком самостоятельно без помощи компилятора. -
-mmcount-ra-address -mno-mcount-ra-address-
Генерировать (не генерировать) код, который позволяет
_mcountизменять адрес возврата вызывающей функции. При включенном параметре обычный интерфейс_mcountрасширяется новым параметром ra-address типаintptr_t *, передаваемым в регистре$12._mcountможет затем изменить адрес возврата, выполнив оба следующих действия:- Возвращение нового адреса в регистре
$31. - Запись нового адреса в
*ra-address, если ra-address не равен нулю.
Значение по умолчанию — -mno-mcount-ra-address.
- Возвращение нового адреса в регистре
-
-mframe-header-opt -mno-frame-header-opt-
Включить (отключить) оптимизацию заголовка фрейма в ABI o32. При использовании ABI o32 вызывающие функции выделяют 16 байт в стеке, чтобы вызываемая функция могла записать регистровые аргументы. При включенном параметре эта оптимизация подавит выделение заголовка фрейма, если можно определить, что он не используется.
Эта оптимизация выключена по умолчанию на всех уровнях оптимизации.
-
-mlxc1-sxc1 -mno-lxc1-sxc1-
Применимо, включить (отключить) генерацию инструкций
lwxc1,swxc1,ldxc1,sdxc1. Включено по умолчанию. -
-mmadd4 -mno-madd4-
Применимо, включить (отключить) генерацию 4-операндных инструкций
madd.s,madd.dи смежных. Включено по умолчанию.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/MIPS-Options.html