3.18.26 Параметры MIPS
-EB-
Генерировать код большого порядка байтов (big-endian).
-EL-
Генерировать код малого порядка байтов (little-endian). По умолчанию для конфигураций ‘mips*el-*-*’.
-march=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’, ‘interaptiv’, ‘loongson2e’, ‘loongson2f’, ‘loongson3a’, ‘m4k’, ‘m14k’, ‘m14kc’, ‘m14ke’, ‘m14kec’, ‘m5100’, ‘m5101’, ‘octeon’, ‘octeon+’, ‘octeon2’, ‘octeon3’, ‘orion’, ‘p5600’, ‘r2000’, ‘r3000’, ‘r3900’, ‘r4000’, ‘r4400’, ‘r4600’, ‘r4650’, ‘r4700’, ‘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-
Оптимизировать для архитектуры. Среди прочего, этот параметр управляет планированием инструкций и воспринимаемой стоимостью арифметических операций. Список значений архитектуры такой же, как и для -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 архитектуру, используется MIPS16e ASE.
Генерацию MIPS16-кода также можно контролировать на уровне функций с помощью
mips16иnomips16атрибутов. Дополнительную информацию см. в Атрибутах функций. -mflip-mips16-
Генерировать MIPS16-код на чередующихся функциях. Этот параметр предназначен для регрессионного тестирования смешанной генерации MIPS16/не-MIPS16 кода и не предназначен для обычного использования при компиляции пользовательского кода.
-minterlink-compressed-mno-interlink-compressed-
Требовать (не требовать), чтобы код, использующий стандартную (не сжатую) MIPS ISA, был совместим по ссылкам с MIPS16 и microMIPS-кодом и наоборот.
Например, код, использующий кодирование стандартной ISA, не может перейти напрямую к 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-битный код вместо этого.
Для получения информации об ABI O64 см. http://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 обозначаются тем, что первый бит их хвостового поля значащих разрядов равен 1, а сигнализирующие NaN обозначаются тем, что первый бит их хвостового поля значащих разрядов равен 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 ASE MIPS DSP. См. Функции MIPS DSP. Этот параметр определяет препроцессорную макрос
__mips_dsp. Он также определяет__mips_dsp_revв 1. -mdspr2-mno-dspr2-
Использовать (не использовать) пересмотр 2 ASE MIPS DSP. См. Функции MIPS DSP. Этот параметр определяет препроцессорные макросы
__mips_dspи__mips_dspr2. Он также определяет__mips_dsp_revв 2. -msmartmips-mno-smartmips-
Использовать (не использовать) MIPS SmartMIPS ASE.
-mpaired-single-mno-paired-single-
Использовать (не использовать) инструкции с плавающей точкой с парными одинарными значениями. См. Поддержка MIPS Paired-Single. Этот параметр требует включения поддержки аппаратной плавающей точки.
-mdmx-mno-mdmx-
Использовать (не использовать) инструкции MIPS Digital Media Extension. Этот параметр может использоваться только при генерации 64-битного кода и требует включения аппаратной поддержки плавающей точки.
-mips3d-mno-mips3d-
Использовать (не использовать) MIPS-3D ASE. См. Встроенные функции MIPS-3D. Параметр -mips3d подразумевает -mpaired-single.
-mmicromips-mno-micromips-
Генерировать (не генерировать) микроMIPS код.
Генерация микроMIPS кода также может контролироваться на уровне каждой функции с помощью
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).
-mlong64-
Принудительно
longтипы данных иметь ширину 64 бита. См. -mlong32 для объяснения значения по умолчанию и способа определения размера указателя. -mlong32-
Принудительно
long,int, и типы указателей иметь ширину 32 бита.Размер по умолчанию для
ints,longs и указателей зависит от ABI. Все поддерживаемые ABI используют 32-битныеints. ABI n64 и 64-битный EABI используют 64-битныеlongs; остальные используют 32-битныеlongs. Указатели имеют тот же размер, что иlongs, или тот же размер, что и регистры целых чисел, в зависимости от того, какой из них меньше. -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, когда в кэшах кода установлен бит запрета чтения. Она также полезна на процессорах, которые могут быть сконфигурированы для интерфейса двойной SRAM для инструкций/данных и которые, подобно M4K, автоматически перенаправляют PC-относительные загрузки в оперативную память инструкций.
-mcode-readable=noИнструкции не должны обращаться к исполняемым разделам. Эта опция может быть полезна на целевых платформах, которые сконфигурированы для двойного интерфейса SRAM для инструкций/данных, но которые (в отличие от M4K) не автоматически перенаправляют PC-относительные загрузки в оперативную память инструкций.
-msplit-addresses-mno-split-addresses-
Включить (выключить) использование операторов перемещения
%hi()и%lo()ассемблера. Эта опция устарела, но сохранена для обратной совместимости. -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 проверяют деление на ноль, генерируя либо условную ошибку, либо инструкцию 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-
Включить (отключить) оптимизацию, которая объединяет последовательные инструкции загрузки или сохранения, чтобы включить связывание инструкций загрузки/сохранения. Эта опция включена по умолчанию, но срабатывает только тогда, когда выбранная архитектура, как известно, поддерживает связывание.
-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. По умолчанию — -mimadd на архитектурах, которые поддерживаютmaddиmsub, за исключением архитектуры 74k, где было установлено, что это приводит к более медленному коду. -mfused-madd-mno-fused-madd-
Включить (выключить) использование инструкций умножения-суммирования с плавающей точкой, когда они доступны. Значение по умолчанию — -mfused-madd.
На процессоре R8000, когда используются инструкции умножения-суммирования, промежуточный продукт вычисляется с бесконечной точностью и не зависит от бита сброса к нулю в регистре FCSR. Это может быть нежелательно в некоторых ситуациях. На других процессорах результат численно идентичен эквивалентному вычислению с использованием отдельных инструкций умножения, сложения, вычитания и отрицания.
-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-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. (В данный момент этот флаг обходит ошибки плавающей точки SB-1 ревизии 2 “F1” и “F2”).
-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-
Указывает функцию для очистки кэшей I и D или указывает не вызывать такую функцию. Если вызвана, функция должна принимать те же аргументы, что и общая
_flush_func, то есть адрес диапазона памяти, для которого очищается кэш, размер диапазона памяти и число 3 (для очистки обоих кэшей). Значение по умолчанию зависит от того, для какой цели была сконфигурирована GCC, но обычно это_flush_funcили__cpu_flush. mbranch-cost=num-
Установить стоимость ветвления примерно в num «простых» инструкций. Эта стоимость является только эвристической и не гарантирует согласованных результатов между выпусками. Нулевая стоимость эквивалентна выбору значения по умолчанию, которое основано на настройке -mtune.
-mbranch-likely-mno-branch-likely-
Включить или отключить использование инструкций Branch Likely, независимо от значения по умолчанию для выбранной архитектуры. По умолчанию, инструкции Branch Likely могут быть сгенерированы, если они поддерживаются выбранной архитектурой. Исключение составляют архитектуры MIPS32 и MIPS64 и процессоры, которые реализуют эти архитектуры; для них инструкции Branch Likely по умолчанию не генерируются, потому что архитектуры MIPS32 и MIPS64 специально устаревают их использование.
-mcompact-branches=never-mcompact-branches=optimal-mcompact-branches=always-
Эти опции управляют формой генерируемых ветвлений. По умолчанию используется -mcompact-branches=optimal.
Опция -mcompact-branches=never гарантирует, что компактные инструкции ветвления никогда не будут сгенерированы.
Опция -mcompact-branches=always гарантирует, что компактная инструкция ветвления будет сгенерирована, если она доступна. Если компактная инструкция ветвления недоступна, будет использована форма ветвления со слотом задержки.
Эта опция поддерживается начиная с MIPS Release 6.
Опция -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-
Включить (выключить) оптимизацию заголовка кадра в o32 ABI. При использовании o32 ABI вызывающие функции выделяют 16 байтов в стеке, чтобы вызываемая функция могла записать аргументы регистров. При включении этой оптимизации выделение заголовка кадра будет подавлено, если можно определить, что он не используется.
Эта оптимизация отключена по умолчанию на всех уровнях оптимизации.
-mlxc1-sxc1-mno-lxc1-sxc1-
Применительно к случаю, включить (выключить) генерацию инструкций
lwxc1,swxc1,ldxc1,sdxc1. Включено по умолчанию. -mmadd4-mno-madd4-
Применительно к случаю, включить (выключить) генерацию 4-операндных инструкций
madd.s,madd.dи связанных с ними. Включено по умолчанию.
Далее: Опции MMIX, Предыдущее: Опции MicroBlaze, Вернуться: Опции подмодели [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/MIPS-Options.html