3.19.29 Параметры MIPS ¶
-EB-
Генерировать код в формате big-endian.
-EL-
Генерировать код в формате little-endian. Это значение по умолчанию для конфигураций ‘mips*el-*-*’.
-march=arch-
Генерировать код, работающий на arch, который может быть именем универсальной архитектуры MIPS ISA или именем конкретного процессора. Названия ISA: ‘mips1’, ‘mips2’, ‘mips3’, ‘mips4’, ‘mips32’, ‘mips32r2’, ‘mips32r3’, ‘mips32r5’, ‘mips32r6’, ‘mips64’, ‘mips64r2’, ‘mips64r3’, ‘mips64r5’ и ‘mips64r6’. Названия процессоров: ‘4kc’, ‘4km’, ‘4kp’, ‘4ksc’, ‘4kec’, ‘4kem’, ‘4kep’, ‘4ksd’, ‘5kc’, ‘5kf’, ‘20kc’, ‘24kc’, ‘24kf2_1’, ‘24kf1_1’, ‘24kec’, ‘24kef2_1’, ‘24kef1_1’, ‘34kc’, ‘34kf2_1’, ‘34kf1_1’, ‘34kn’, ‘74kc’, ‘74kf2_1’, ‘74kf1_1’, ‘74kf3_2’, ‘1004kc’, ‘1004kf2_1’, ‘1004kf1_1’, ‘i6400’, ‘i6500’, ‘interaptiv’, ‘loongson2e’, ‘loongson2f’, ‘loongson3a’, ‘gs464’, ‘gs464e’, ‘gs264e’, ‘m4k’, ‘m14k’, ‘m14kc’, ‘m14ke’, ‘m14kec’, ‘m5100’, ‘m5101’, ‘octeon’, ‘octeon+’, ‘octeon2’, ‘octeon3’, ‘orion’, ‘p5600’, ‘p6600’, ‘r2000’, ‘r3000’, ‘r3900’, ‘r4000’, ‘r4400’, ‘r4600’, ‘r4650’, ‘r4700’, ‘r5900’, ‘r6000’, ‘r8000’, ‘rm7000’, ‘rm9000’, ‘r10000’, ‘r12000’, ‘r14000’, ‘r16000’, ‘sb1’, ‘sr71000’, ‘vr4100’, ‘vr4111’, ‘vr4120’, ‘vr4130’, ‘vr4300’, ‘vr5000’, ‘vr5400’, ‘vr5500’, ‘xlr’ и ‘xlp’. Специальное значение ‘from-abi’ выбирает наиболее совместимую архитектуру для выбранной ABI (то есть ‘mips1’ для 32-битных ABI и ‘mips3’ для 64-битных ABI).
Встроенная цепочка инструментов Linux/GNU также поддерживает значение ‘native’, которое выбирает лучший вариант архитектуры для процессора-хоста. -march=native не имеет эффекта, если GCC не распознаёт процессор.
В именах процессоров заключительные ‘000’ могут быть сокращены до ‘k’ (например, -march=r2k). Префиксы необязательны, и ‘vr’ можно написать ‘r’.
Имена в формате ‘nf2_1’ относятся к процессорам с FPU, работающими вполовину медленнее ядра; имена в формате ‘nf1_1’ — к процессорам с FPU, работающим с той же скоростью, что и ядро; а имена в формате ‘nf3_2’ — к процессорам с FPU, работающими в отношении к ядру со скоростью 3:2. По соображениям совместимости, ‘nf’ принимается как синоним для ‘nf2_1’, в то время как ‘nx’ и ‘bfx’ принимаются как синонимы для ‘nf1_1’.
GCC определяет две макрокоманды на основе значения этого параметра. Первая —
_MIPS_ARCH, которая даёт название целевой архитектуры в виде строки. Вторая имеет вид_MIPS_ARCH_foo, где foo — это значение_MIPS_ARCH, записанное с большой буквы. Например, -march=r2000 устанавливает_MIPS_ARCHв"r2000"и определяет макрос_MIPS_ARCH_R2000.Обратите внимание, что макрос
_MIPS_ARCHиспользует имена процессоров, указанные выше. Другими словами, он содержит полный префикс и не сокращает ‘000’ до ‘k’. В случае ‘from-abi’, макрос называет разрешённую архитектуру (либо"mips1", либо"mips3"). Он называет стандартную архитектуру, если опция -march не задана. -mtune=arch-
Оптимизировать для arch. Среди прочего, этот параметр управляет способом планирования инструкций и воспринимаемой стоимостью арифметических операций. Список значений arch совпадает со списком для -march.
Если этот параметр не используется, GCC оптимизирует для процессора, указанного параметром -march. Использование -march и -mtune вместе позволяет сгенерировать код, работающий на семействе процессоров, но оптимизированный для конкретного члена этого семейства.
-mtune определяет макросы
_MIPS_TUNEи_MIPS_TUNE_foo, которые работают аналогично описанным выше для -march. -mips1-
Эквивалентно -march=mips1.
-mips2-
Эквивалентно -march=mips2.
-mips3-
Эквивалентно -march=mips3.
-mips4-
Эквивалентно -march=mips4.
-mips32-
Эквивалентно -march=mips32.
-mips32r3-
Эквивалентно -march=mips32r3.
-mips32r5-
Эквивалентно -march=mips32r5.
-mips32r6-
Эквивалентно -march=mips32r6.
-mips64-
Эквивалентно -march=mips64.
-mips64r2-
Эквивалентно -march=mips64r2.
-mips64r3-
Эквивалентно -march=mips64r3.
-mips64r5-
Эквивалентно -march=mips64r5.
-mips64r6-
Эквивалентно -march=mips64r6.
-mips16-mno-mips16-
Генерировать (не генерировать) код MIPS16. Если GCC нацелен на архитектуру MIPS32 или MIPS64, он использует ASE MIPS16e.
Генерация кода MIPS16 также может быть контролируема на уровне каждой функции с помощью
mips16иnomips16атрибутов. Более подробная информация в Описании атрибутов функций. -mflip-mips16-
Генерировать код MIPS16 на чередующихся функциях. Этот параметр предназначен для тестирования регрессии смешанного кода MIPS16/non-MIPS16, а не для обычного использования при компиляции пользовательского кода.
-minterlink-compressed-mno-interlink-compressed-
Требовать (не требовать), чтобы код, использующий стандартную (не сжатую) архитектуру MIPS, был совместим с кодом 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 инструмент позволяет исполняемым файлам использовать абсолютные обращения к локально связанным символам. Он также может использовать более короткие последовательности инициализации 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 меньше примерно 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-
Включить использование регистров с плавающей запятой с одинарной точностью с нечётными номерами для 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) обозначаются нулевым первым битом в поле значащих цифр, а сигнализирующие NaN (sNaN) обозначаются единичным первым битом в поле значащих цифр.
Параметр -mnan=2008 выбирает кодирование IEEE 754-2008. В этом случае тихие NaN (qNaN) обозначаются единичным первым битом в поле значащих цифр, а сигнализирующие NaN (sNaN) обозначаются нулевым первым битом в поле значащих цифр.
Значение по умолчанию — -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-
Использовать (не использовать) 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, когда в TLB кода установлен бит запрета чтения. Он также полезен на процессорах, которые могут быть сконфигурированы для использования двойного интерфейса SRAM для инструкций/данных и которые, подобно M4K, автоматически перенаправляют PC-относительные загрузки в RAM инструкций.
-mcode-readable=noИнструкции не должны обращаться к секциям исполняемого кода. Этот параметр может быть полезен на целевых устройствах, сконфигурированных для использования двойного интерфейса SRAM для инструкций/данных, но которые (в отличие от M4K) не автоматически перенаправляют PC-относительные загрузки в RAM инструкций.
-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, чтобы принудительно использовать прерывания.Значение по умолчанию обычно -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 и ранее.
Этот параметр может быть использован только если целевая архитектура поддерживает инструкции 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-
Укажите, должен ли GCC вставлять барьеры кэша для предотвращения побочных эффектов угадывания на процессорах R10K.
-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и связанных с ними. Включено по умолчанию.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/MIPS-Options.html