Spec-Zone.ru › GCC 13

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
END_OF_DOCUMENT_MARKER

Генерировать код для заданного 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, но запрещает использование регистров одинарной точности с нечётными номерами. Это можно использовать совместно с режимом FRE FPU в процессорах 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
END_OF_DOCUMENT_MARKER

Принудительно использовать (или не использовать) 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/dmultu RM7000. Обходные пути реализованы ассемблером, а не GCC.

-mfix-vr4120
-mno-fix-vr4120

Обход определённых ошибок VR4120:

  • dmultu не всегда даёт правильный результат.
  • div и ddiv не всегда дают правильный результат, если один из операндов отрицательный.

Обходные пути для ошибок деления основаны на специальных функциях в libgcc.a. В настоящее время эти функции предоставляются только конфигурациями mips64vr*-elf.

Для других ошибок VR4120 требуется вставка NOP между определёнными парами инструкций. Эти ошибки обрабатываются ассемблером, а не самим GCC.

-mfix-vr4130

Обход ошибки mflo/mfhi VR4130. Обходные пути реализованы ассемблером, а не GCC, хотя GCC избегает использования mflo и mfhi, если вместо них доступны инструкции macc, macchi, dmacc и dmacchi VR4130.

-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. Предполагается, что прерванные доступы к любому байту в следующих областях не имеют побочных эффектов:

  1. память, занимаемая фреймом стека текущей функции;
  2. память, занимаемая входным аргументом стека;
  3. память, занимаемая объектом со связанным во время компиляции постоянным адресом.

Ядро отвечает за обеспечение безопасности спекулятивных доступов к этим областям.

Если входная программа содержит объявление функции, такое как:

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

Spec-Zone.ru

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