3.18.28 Опции MIPS
-EB-
Генерировать код в формате big-endian.
-EL-
Генерировать код в формате little-endian. По умолчанию используется для конфигураций ‘mips*el-*-*’.
-march=arch-
Генерировать код, который будет выполняться на архитектуре arch, которая может быть именем универсальной ISA MIPS или именем конкретного процессора. Имена ISA: ‘mips1’, ‘mips2’, ‘mips3’, ‘mips4’, ‘mips32’, ‘mips32r2’, ‘mips32r3’, ‘mips32r5’, ‘mips32r6’, ‘mips64’, ‘mips64r2’, ‘mips64r3’, ‘mips64r5’ и ‘mips64r6’. Имена процессоров: ‘4kc’, ‘4km’, ‘4kp’, ‘4ksc’, ‘4kec’, ‘4kem’, ‘4kep’, ‘4ksd’, ‘5kc’, ‘5kf’, ‘20kc’, ‘24kc’, ‘24kf2_1’, ‘24kf1_1’, ‘24kec’, ‘24kef2_1’, ‘24kef1_1’, ‘34kc’, ‘34kf2_1’, ‘34kf1_1’, ‘34kn’, ‘74kc’, ‘74kf2_1’, ‘74kf1_1’, ‘74kf3_2’, ‘1004kc’, ‘1004kf2_1’, ‘1004kf1_1’, ‘i6400’, ‘i6500’, ‘interaptiv’, ‘loongson2e’, ‘loongson2f’, ‘loongson3a’, ‘gs464’, ‘gs464e’, ‘gs264e’, ‘m4k’, ‘m14k’, ‘m14kc’, ‘m14ke’, ‘m14kec’, ‘m5100’, ‘m5101’, ‘octeon’, ‘octeon+’, ‘octeon2’, ‘octeon3’, ‘orion’, ‘p5600’, ‘p6600’, ‘r2000’, ‘r3000’, ‘r3900’, ‘r4000’, ‘r4400’, ‘r4600’, ‘r4650’, ‘r4700’, ‘r5900’, ‘r6000’, ‘r8000’, ‘rm7000’, ‘rm9000’, ‘r10000’, ‘r12000’, ‘r14000’, ‘r16000’, ‘sb1’, ‘sr71000’, ‘vr4100’, ‘vr4111’, ‘vr4120’, ‘vr4130’, ‘vr4300’, ‘vr5000’, ‘vr5400’, ‘vr5500’, ‘xlr’ и ‘xlp’. Специальное значение ‘from-abi’ выбирает наиболее совместимую архитектуру для выбранного ABI (то есть ‘mips1’ для 32-битных ABI и ‘mips3’ для 64-битных ABI).
Нативный инструмент Linux/GNU также поддерживает значение ‘native’, которое выбирает наилучший вариант архитектуры для процессора хоста. -march=native не имеет эффекта, если GCC не распознаёт процессор.
В именах процессоров окончание ‘000’ может быть сокращено до ‘k’ (например, -march=r2k). Префиксы необязательны, и ‘vr’ может быть записано как ‘r’.
Имена вида ‘nf2_1’ относятся к процессорам с FPU, работающими с частотой в половину от частоты ядра, имена вида ‘nf1_1’ — к процессорам с FPU, работающими с той же частотой, что и ядро, а имена вида ‘nf3_2’ — к процессорам с FPU, работающими с соотношением частот 3:2 по отношению к ядру. Из соображений совместимости ‘nf’ принимается как синоним ‘nf2_1’, а ‘nx’ и ‘bfx’ — как синонимы для ‘nf1_1’.
GCC определяет две макросы, основанные на значении этого параметра. Первая —
_MIPS_ARCH, которая даёт имя целевой архитектуры в виде строки. Вторая имеет вид_MIPS_ARCH_foo, где foo — заглавное значение_MIPS_ARCH. Например, -march=r2000 устанавливает_MIPS_ARCHв"r2000"и определяет макрос_MIPS_ARCH_R2000.Обратите внимание, что макрос
_MIPS_ARCHиспользует имена процессоров, перечисленные выше. Другими словами, он имеет полный префикс и не сокращает ‘000’ до ‘k’. В случае ‘from-abi’ макрос называет разрешённую архитектуру (либо"mips1"или"mips3"). Он называет архитектуру по умолчанию, когда опция -march не задана. -mtune=arch-
Оптимизировать для arch. Среди прочего, этот параметр контролирует способ планирования инструкций и предполагаемую стоимость арифметических операций. Список значений arch совпадает со списком для -march.
Если эта опция не используется, GCC оптимизирует для процессора, указанного в -march. Используя -march и -mtune вместе, можно сгенерировать код, который работает на семействе процессоров, но оптимизировать код для конкретного члена этого семейства.
-mtune определяет макросы
_MIPS_TUNEи_MIPS_TUNE_foo, которые работают так же, как и макросы для -march, описанные выше. -mips1-
Эквивалентно -march=mips1.
-mips2-
Эквивалентно -march=mips2.
-mips3-
Эквивалентно -march=mips3.
-mips4-
Эквивалентно -march=mips4.
-mips32-
Эквивалентно -march=mips32.
-mips32r3-
Эквивалентно -march=mips32r3.
-mips32r5-
Эквивалентно -march=mips32r5.
-mips32r6-
Эквивалентно -march=mips32r6.
-mips64-
Эквивалентно -march=mips64.
-mips64r2-
Эквивалентно -march=mips64r2.
-mips64r3-
Эквивалентно -march=mips64r3.
-mips64r5-
Эквивалентно -march=mips64r5.
-mips64r6-
Эквивалентно -march=mips64r6.
-mips16-mno-mips16-
Генерировать (не генерировать) код MIPS16. Если GCC нацелен на архитектуру MIPS32 или MIPS64, он использует ASE MIPS16e.
Генерацию кода MIPS16 также можно контролировать на уровне функций с помощью атрибутов
mips16иnomips16. См. Атрибуты функций для получения дополнительной информации. -mflip-mips16-
Генерировать код MIPS16 на чередующихся функциях. Эта опция предназначена для тестирования регрессии смешанного кода MIPS16/не-MIPS16 и не предназначена для обычного использования при компиляции пользовательского кода.
-minterlink-compressed-mno-interlink-compressed-
Требовать (не требовать), чтобы код, использующий стандартную (нескомпрессированную) ISA MIPS, был совместим с кодом MIPS16 и microMIPS, и наоборот.
Например, код, использующий стандартное кодирование ISA, не может напрямую перейти к коду MIPS16 или microMIPS; он должен использовать вызов или косвенный переход. -minterlink-compressed поэтому отключает прямые переходы, если GCC не знает, что цель перехода не сжата.
-minterlink-mips16-mno-interlink-mips16-
Псевдонимы для -minterlink-compressed и -mno-interlink-compressed. Эти опции появились раньше ASE microMIPS и сохранены для обратной совместимости.
-mabi=32-mabi=o64-mabi=n32-mabi=64-mabi=eabi-
Генерировать код для данного ABI.
Обратите внимание, что EABI имеет 32-битную и 64-битную версии. GCC обычно генерирует 64-битный код при выборе 64-битной архитектуры, но вы можете использовать -mgp32, чтобы получить 32-битный код вместо этого.
Подробнее об ABI O64 см. 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. Для n64 ABI этот параметр не имеет эффекта без -msym32.
Вы можете сделать -mplt значением по умолчанию, сконфигурировав GCC с --with-mips-plt. В противном случае значением по умолчанию является -mno-plt.
-mxgot-mno-xgot-
Убрать (не убирать) обычные ограничения на размер таблицы глобальных смещений.
GCC обычно использует одну инструкцию для загрузки значений из GOT. Хотя это относительно эффективно, оно работает только в том случае, если размер GOT меньше примерно 64 КБ. Любой больший размер заставляет линковщик сообщать об ошибке, например:
relocation truncated to fit: R_MIPS_GOT16 foobar
Если это произойдёт, вы должны перекомпилировать свой код с -mxgot. Это работает с очень большими таблицами GOT, хотя код также менее эффективен, так как для получения значения глобального символа требуется три инструкции.
Обратите внимание, что некоторые линковщики могут создавать несколько таблиц GOT. Если у вас такой линковщик, вам нужно использовать -mxgot только тогда, когда один файл объекта обращается к более чем 64 КБ записей таблицы 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-
Включить использование регистров с плавающей точкой одинарной точности с нечетными номерами для o32 ABI. Это значение по умолчанию для процессоров, которые, как известно, поддерживают эти регистры. При использовании o32 FPXX ABI, -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. В этом случае 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-
Использовать (не использовать) инструкции с плавающей точкой парными числами одинарной точности. См. Поддержка парных чисел одинарной точности MIPS. Этот параметр требует включения аппаратной поддержки плавающей точки.
-mdmx-mno-mdmx-
Использовать (не использовать) инструкции расширения MIPS Digital Media. Этот параметр может быть использован только при генерации 64-битного кода и требует включения аппаратной поддержки плавающей точки.
-mips3d-mno-mips3d-
Использовать (не использовать) расширение MIPS-3D ASE. См. Встроенные функции 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 бита.По умолчанию размер
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, когда кэши кода имеют установленный бит «Запрет чтения». Он также полезен на процессорах, которые могут быть настроены с двойным интерфейсом памяти инструкций/данных и которые, подобно M4K, автоматически перенаправляют PC-относительные загрузки в оперативную память инструкций.
-mcode-readable=noИнструкции не должны обращаться к секциям исполняемого кода. Этот параметр может быть полезен на целевых устройствах, которые настроены с двойным интерфейсом памяти инструкций/данных, но которые (в отличие от 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 проверяют деление на ноль, генерируя либо условную ошибку, либо инструкцию break. Использование ошибок приводит к более короткому коду, но поддерживается только на MIPS II и более поздних версиях. Кроме того, в некоторых версиях ядра Linux есть ошибка, которая препятствует генерации правильного сигнала (
SIGFPE). Используйте -mdivide-traps, чтобы разрешить условные ошибки на архитектурах, которые их поддерживают, и -mdivide-breaks, чтобы принудительно использовать ошибки.Значение по умолчанию обычно -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 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 и ранее.
Этот параметр может быть использован только если целевая архитектура поддерживает инструкции branch-likely. -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. (Этот флаг в настоящее время обходит ошибки с плавающей точкой SB-1 версии 2 “F1” и “F2”).
-mr10k-cache-barrier=setting-
Указывает, должен ли GCC вставлять барьеры кэша, чтобы избежать побочных эффектов спекуляции на процессорах R10K.
Как и многие процессоры, R10K пытается предсказать результат условного перехода и спекулятивно выполняет инструкции из ветви “taken”. Позже он отменяет эти инструкции, если предсказанный результат неверный. Однако на R10K даже отмененные инструкции могут иметь побочные эффекты.
Эта проблема затрагивает только ядра для сохранения (kernel stores) и, в зависимости от системы, ядра для загрузки (kernel loads). Например, спекулятивно выполненное сохранение может загрузить целевую память в кэш и пометить строку кэша как грязную, даже если само сохранение позже отменяется. Если операция 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-9.5.0/gcc/MIPS-Options.html