3.20.29 Опции MIPS
-
-EB -
Генерировать код с прямым порядком байтов (big-endian).
-
-EL -
Генерировать код с обратным порядком байтов (little-endian). Это значение по умолчанию для конфигураций «mips*el-*-*».
-
-march=arch -
Генерировать код, который выполняется на архитектуре arch, в качестве которой может быть указано имя общего набора инструкций MIPS (ISA) или имя конкретного процессора. Доступные имена 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. Дополнительную информацию см. в разделе Объявление атрибутов функций. -
-mmips16e2 -mno-mips16e2-
Использовать (или не использовать) расширение MIPS16e2 ASE. Эта опция изменяет поведение опции -mips16 таким образом, что она ориентирована на расширение MIPS16e2 ASE.
-
-mflip-mips16 -
Генерировать код MIPS16 для чередующихся функций. Эта опция предназначена для регрессионного тестирования совместной генерации кода MIPS16 и не-MIPS16 и не рекомендуется для обычного использования при компиляции пользовательского кода.
-
-minterlink-compressed -mno-interlink-compressed-
Требовать (или не требовать), чтобы код, использующий стандартный (несжатый) набор инструкций MIPS, был совместим при компоновке с кодом MIPS16 и microMIPS, и наоборот.
Например, код, использующий стандартную кодировку инструкций, не может напрямую переходить (jump) к коду MIPS16 или microMIPS; он должен использовать либо вызов, либо косвенный переход. Поэтому опция -minterlink-compressed отключает прямые переходы, если только GCC точно не знает, что целевой адрес перехода не сжат.
-
-minterlink-mips16 -mno-interlink-mips16-
Псевдонимы для -minterlink-compressed и -mno-interlink-compressed. Эти опции появились раньше расширения microMIPS ASE и сохранены для обратной совместимости.
-
-mabi=32 -mabi=o64-mabi=n32-mabi=64-mabi=eabi-
Генерировать код для указанного ABI.
Обратите внимание, что EABI имеет 32-битную и 64-битную версии. GCC обычно генерирует 64-битный код при выборе 64-битной архитектуры, но вы можете использовать -mgp32, чтобы вместо этого получить 32-битный код.
Информацию об O64 ABI см. на странице https://gcc.gnu.org/projects/mipso64-abi.html.
GCC поддерживает вариант o32 ABI, в котором регистры чисел с плавающей точкой имеют ширину 64 бита, а не 32 бита. Вы можете выбрать эту комбинацию с помощью -mabi=32 -mfp64. Этот ABI опирается на инструкции
mthc1иmfhc1и поэтому поддерживается только для процессоров MIPS32R2, MIPS32R3 и MIPS32R5.Назначение регистров для аргументов и возвращаемых значений остается прежним, но каждое скалярное значение передается в одном 64-битном регистре, а не в паре 32-битных регистров. Например, скалярные значения с плавающей точкой возвращаются только в регистре «$f0», а не в паре «$f0»/«$f1». Набор сохраняемых при вызове регистров также остается прежним: сохраняются чётные регистры двойной точности.
Для обеспечения перехода от 32-битных регистров к 64-битным поддерживаются еще два варианта o32 ABI: FPXX (-mfpxx) и FP64A (-mfp64 -mno-odd-spreg). Расширение FPXX требует, чтобы весь код выполнялся корректно как при использовании 32-битных, так и 64-битных регистров. Этот код может компоноваться либо с FP32, либо с FP64, но не с тем и другим одновременно. Расширение FP64A похоже на расширение FP64, но запрещает использование нечетных регистров одинарной точности. Его можно использовать в сочетании с режимом
FREпроцессоров MIPS32R5, что позволяет объединять и выполнять код FP32 и FP64A в рамках одного процесса без изменения режимов FPU. -
-mabicalls -mno-abicalls-
Генерировать (или не генерировать) код, подходящий для динамических объектов в стиле SVR4. Опция -mabicalls используется по умолчанию для систем на базе SVR4.
-mshared-mno-shared-
Генерировать (или не генерировать) код, который полностью независим от позиции (position-independent) и поэтому может быть скомпонован в разделяемые библиотеки. Эта опция влияет только на -mabicalls.
Традиционно весь код -mabicalls не зависел от позиции, независимо от таких опций, как -fPIC и -fpic. Однако в качестве расширения цепочка инструментов GNU позволяет исполняемым файлам использовать абсолютные обращения к локально связываемым символам. Она также может использовать более короткие последовательности инициализации GP и генерировать прямые вызовы локально определенных функций. Этот режим выбирается с помощью -mno-shared.
Опция -mno-shared требует наличия binutils версии 2.16 или выше и генерирует объекты, которые могут компоноваться только компоновщиком GNU. Тем не менее, эта опция не влияет на ABI конечного исполняемого файла; она влияет только на ABI перемещаемых объектов. Использование -mno-shared обычно делает исполняемые файлы меньше и быстрее.
По умолчанию используется -mshared.
-
-mplt -mno-plt-
Предполагать (или не предполагать), что статический и динамический компоновщики поддерживают PLT и копирование перемещений (copy relocations). Эта опция влияет только на -mno-shared -mabicalls. Для ABI n64 эта опция не имеет эффекта без -msym32.
Вы можете сделать -mplt вариантом по умолчанию, настроив GCC с помощью параметра --with-mips-plt. В противном случае по умолчанию используется -mno-plt.
-
-mxgot -mno-xgot-
Снять (или не снимать) обычные ограничения на размер таблицы глобального смещения (GOT).
GCC обычно использует одну инструкцию для загрузки значений из GOT. Хотя это относительно эффективно, это работает только в том случае, если GOT меньше примерно 64 КБ. При большем размере компоновщик выдает ошибку вида:
relocation truncated to fit: R_MIPS_GOT16 foobar
Если это произошло, вам следует перекомпилировать код с опцией -mxgot. Это работает с очень большими GOT, хотя такой код менее эффективен, так как для получения значения глобального символа требуются три инструкции.
Обратите внимание, что некоторые компоновщики могут создавать несколько таблиц GOT. Если вы используете такой компоновщик, вам понадобится применять -mxgot только тогда, когда один объектный файл обращается к записям GOT суммарным объемом более 64 КБ. Очень немногие файлы делают это.
Эти опции не оказывают никакого влияния, если 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-
Включить использование нечетных регистров одинарной точности с плавающей точкой для o32 ABI. Это значение по умолчанию для процессоров, которые, как известно, поддерживают такие регистры. При использовании o32 FPXX ABI по умолчанию устанавливается -mno-odd-spreg.
-
-mabs=2008 -mabs=legacy-
Эти опции управляют обработкой специальных данных IEEE 754 с плавающей точкой, представляющих «не число» (NaN), с помощью машинных инструкций
abs.fmtиneg.fmt.По умолчанию или при использовании -mabs=legacy выбирается устаревшая обработка (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. В этом случае qNaN обозначаются тем, что первый бит их поля мантиссы равен 1, а 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-
Использовать (или не использовать) спаренные скалярные инструкции с плавающей точкой (paired-single). См. Поддержка спаренных скалярных инструкций MIPS. Эта опция требует включения аппаратной поддержки чисел с плавающей точкой.
-
-mdmx -mno-mdmx-
Использовать (или не использовать) инструкции расширения цифровых медиаданных MIPS (Digital Media Extension). Эта опция может использоваться только при генерации 64-битного кода и требует включения аппаратной поддержки чисел с плавающей точкой.
-
-mips3d -mno-mips3d-
Использовать (или не использовать) расширение MIPS-3D ASE. См. Встроенные функции MIPS-3D. Опция -mips3d подразумевает использование -mpaired-single.
-
-mmicromips -mno-micromips-
Генерировать (или не генерировать) код microMIPS.
Генерацией кода microMIPS также можно управлять для отдельных функций с помощью атрибутов
micromipsиnomicromips. Дополнительную информацию см. в разделе Объявление атрибутов функций. -
-mmt -mno-mt-
Использовать (или не использовать) инструкции многопоточности MT.
-
-mmcu -mno-mcu-
Использовать (или не использовать) инструкции расширения MIPS MCU ASE.
-
-meva -mno-eva-
Использовать (или не использовать) инструкции MIPS Enhanced Virtual Addressing.
-
-mvirt -mno-virt-
Использовать (или не использовать) инструкции виртуализации MIPS (VZ).
-
-mxpa -mno-xpa-
Использовать (или не использовать) инструкции MIPS eXtended Physical Address (XPA).
-
-mcrc -mno-crc-
Использовать (или не использовать) инструкции циклического избыточного кода MIPS (CRC).
-
-mginv -mno-ginv-
Использовать (или не использовать) инструкции глобальной инвалидации MIPS (GINV).
-
-mloongson-mmi -mno-loongson-mmi-
Использовать (или не использовать) мультимедийные расширения MIPS Loongson (MMI).
-
-mloongson-ext -mno-loongson-ext-
Использовать (или не использовать) инструкции расширений MIPS Loongson (EXT).
-
-mloongson-ext2 -mno-loongson-ext2-
Использовать (или не использовать) инструкции расширений MIPS Loongson r2 (EXT2).
-
-mlong64 -
Принудительно установить ширину типов
longравной 64 битам. Пояснения по поводу значения по умолчанию и способа определения размера указателя см. в описании опции -mlong32. -
-mlong32 -
Принудительно установить ширину типов
long,intи указателей равной 32 битам.Размер типов
int,longи указателей по умолчанию зависит от ABI. Все поддерживаемые ABI используют 32-битныеint. ABI n64 использует 64-битныеlong, как и 64-битный EABI; остальные используют 32-битныеlong. Указатели имеют тот же размер, что иlong, либо тот же размер, что и целочисленные регистры (в зависимости от того, что меньше). -
-msym32 -mno-sym32-
Предполагать (или не предполагать), что все символы имеют 32-битные значения, независимо от выбранного ABI. Эта опция полезна в сочетании с -mabi=64 и -mno-abicalls, поскольку позволяет GCC генерировать более короткие и быстрые ссылки на символьные адреса.
-
-G num -
Помещать определения видимых извне данных в секцию малых данных (small data section), если размер этих данных не превышает 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 является общей (common), вы должны скомпоновать приложение с достаточно большим значением -G.Самый простой способ удовлетворить эти требования — компилировать и компоновать каждый модуль с одинаковой опцией -G. Однако вам может потребоваться собрать библиотеку, поддерживающую несколько разных лимитов малых данных. Вы можете сделать это, скомпилировав библиотеку с максимально поддерживаемым значением -G и дополнительно используя -mno-extern-sdata, чтобы запретить библиотеке делать предположения об определимых извне данных.
-
-mgpopt -mno-gpopt-
Использовать (или не использовать) обращения относительно регистра GP (GP-relative) для символов, которые, как известно, находятся в секции малых данных; см. -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-
Выделять переменные сначала в секцию данных только для чтения, если это возможно, затем в секцию малых данных, если это возможно, и в противном случае — в обычную секцию данных. Это дает чуть более медленный код по сравнению с поведением по умолчанию, но уменьшает объем ОЗУ, необходимый при выполнении, и поэтому может быть предпочтительно для некоторых встроенных (embedded) систем.
-
-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=none -mexplicit-relocs=base-mexplicit-relocs=pcrel-mexplicit-relocs-mno-explicit-relocs-
Эти параметры управляют использованием явных релокаций (например,
%gp_rel). Значение по умолчанию зависит от версии GAS, использованной при сборке самого GCC.Поддержка явных релокаций
baseпоявилась в GAS в 2001 году. Поддержка явных релокацийpcrelпоявилась в GAS в 2014 году и включает поддержку%pcrel_hiи%pcrel_lo. -
-mcheck-zero-division -mno-check-zero-division-
Вызывать (не вызывать) исключение при делении целых чисел на ноль.
По умолчанию используется -mcheck-zero-division.
-
-mdivide-traps -mdivide-breaks-
Системы MIPS обнаруживают деление на ноль, генерируя условное исключение или инструкцию break. Использование исключений позволяет получить более компактный код, но поддерживается только в MIPS II и более поздних версиях. Кроме того, в некоторых версиях ядра Linux есть ошибка, из-за которой исключение не генерирует надлежащий сигнал (
SIGFPE). Используйте -mdivide-traps, чтобы разрешить условные исключения на архитектурах, которые их поддерживают, и -mdivide-breaks, чтобы принудительно использовать инструкции break.Обычно по умолчанию используется -mdivide-traps, но это значение можно изменить при настройке с помощью --with-divide=breaks. Проверки деления на ноль можно полностью отключить с помощью -mno-check-zero-division.
-
-mload-store-pairs -mno-load-store-pairs-
Включает (отключает) оптимизацию, которая объединяет последовательные инструкции загрузки или сохранения, чтобы обеспечить их связывание. По умолчанию этот параметр включён, но действует только тогда, когда известно, что выбранная архитектура поддерживает такое связывание.
-
-mstrict-align -mno-strict-align-munaligned-access-mno-unaligned-access-
Отключает (включает) прямой доступ к невыравненным данным для MIPS Release 6. Для MIPSr6 требуется поддержка загрузки и сохранения невыравненных данных аппаратными средствами или посредством обработки исключения и эмуляции. Поэтому ядру может потребоваться -mstrict-align. Параметры -munaligned-access и -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, предусмотренных ISA R4650. -
-mimadd -mno-imadd-
Включает (отключает) использование целочисленных инструкций
maddиmsub. По умолчанию на архитектурах, поддерживающихmaddиmsub, используется -mimadd, за исключением архитектуры 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-
Обходит ошибки RM7000
dmult/dmultu. Обходные решения реализуются ассемблером, а не GCC. -
-mfix-vr4120 -mno-fix-vr4120-
Обходит некоторые ошибки VR4120:
-
dmultuне всегда даёт правильный результат. -
divиddivне всегда дают правильный результат, если один из операндов отрицательный.
Обходные решения для ошибок деления используют специальные функции из libgcc.a. В настоящее время эти функции предоставляются только конфигурациями
mips64vr*-elf.Для обхода других ошибок VR4120 необходимо вставлять NOP между определёнными парами инструкций. Эти ошибки обрабатываются ассемблером, а не самим GCC.
-
-
-mfix-vr4130 -
Обходит ошибки VR4130
mflo/mfhi. Обходные решения реализуются ассемблером, а не GCC, хотя GCC избегает использованияmfloиmfhi, если вместо них доступны инструкции VR4130macc,macchi,dmaccиdmacchi. -
-mfix-sb1 -mno-fix-sb1-
Обходит некоторые ошибки ядра процессора SB-1. (В настоящее время этот флаг обходит ошибки «F1» и «F2» с плавающей точкой в версии 2 процессора SB-1.)
-
-mr10k-cache-barrier=setting -
Указывает, должен ли GCC вставлять барьеры кэша, чтобы избежать побочных эффектов спекулятивного выполнения на процессорах R10K.
Как и многие другие процессоры, R10K пытается предсказать исход условного перехода и спекулятивно выполняет инструкции из ветви, для которой предполагается переход. Позднее он отменяет эти инструкции, если предсказание оказалось неверным. Однако на 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-
Указывает функцию для сброса кэшей инструкций и данных либо задаёт отказ от вызова такой функции. Если функция вызывается, она должна принимать те же аргументы, что и стандартная функция
_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 не равен null.
По умолчанию используется -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-
Если применимо, включает (отключает) генерацию инструкций
madd.s,madd.dи связанных с ними инструкций с четырьмя операндами. По умолчанию включено.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/MIPS-Options.html