3.19.29 Параметры 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 инструментная цепочка позволяет исполняемым файлам использовать абсолютные обращения к локально связанным символам. Он также может использовать более короткие последовательности инициализации 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-
Эти параметры контролируют обработку специальных значений «не число» (NaN) данных с плавающей запятой IEEE 754 с помощью машинных инструкций
abs.fmtиneg.fmt.По умолчанию или при использовании -mabs=legacy выбирается обработка legacy. В этом случае эти инструкции считаются арифметическими и избегаются там, где требуется правильная работа, а входной операнд может быть NaN. Вместо этого используется более длинная последовательность инструкций, которая вручную манипулирует битом знака плавающего числа, если не задан также параметр -ffinite-math-only.
Параметр -mabs=2008 выбирает обработку IEEE 754-2008. В этом случае эти инструкции считаются не арифметическими и, следовательно, работают правильно во всех случаях, включая, в частности, когда входной операнд является NaN. Эти инструкции всегда используются для соответствующих операций.
-mnan=2008-mnan=legacy-
Эти параметры управляют кодированием специальных значений «не число» (NaN) данных с плавающей запятой IEEE 754.
Параметр -mnan=legacy выбирает legacy кодирование. В этом случае тихие NaN (qNaN) обозначаются значением первого бита в поле значащих битов, равным 0, а сигнализирующие NaN (sNaN) обозначаются значением первого бита в поле значащих битов, равным 1.
Параметр -mnan=2008 выбирает кодирование IEEE 754-2008. В этом случае тихие NaN (qNaN) обозначаются значением первого бита в поле значащих битов, равным 1, а сигнализирующие NaN (sNaN) обозначаются значением первого бита в поле значащих битов, равным 0.
Значение по умолчанию — -mnan=legacy, если GCC не был сконфигурирован с помощью --with-nan=2008.
-mllsc-mno-llsc-
Использовать (не использовать) инструкции ‘ll’, ‘sc’, и ‘sync’ для реализации встроенных функций атомарной памяти. Если ни один из параметров не указан, GCC использует эти инструкции, если целевая архитектура их поддерживает.
-mllsc полезно, если среда выполнения может эмулировать эти инструкции, а -mno-llsc может быть полезно при компиляции для нестандартных ISA. Вы можете сделать любой из этих параметров значением по умолчанию, сконфигурировав GCC с --with-llsc и --without-llsc соответственно. --with-llsc является значением по умолчанию для некоторых конфигураций; см. документацию по установке для получения подробной информации.
-mdsp-mno-dsp-
Использовать (не использовать) ревизию 1 MIPS DSP ASE. См. Функции MIPS DSP. Этот параметр определяет макрос препроцессора
__mips_dsp. Также определяет__mips_dsp_revравным 1. -mdspr2-mno-dspr2-
Использовать (не использовать) ревизию 2 MIPS DSP ASE. См. Функции MIPS DSP. Этот параметр определяет макросы препроцессора
__mips_dspи__mips_dspr2. Также определяет__mips_dsp_revравным 2. -msmartmips-mno-smartmips-
Использовать (не использовать) MIPS SmartMIPS ASE.
-mpaired-single-mno-paired-single-
Использовать (не использовать) инструкции с парными числами с плавающей запятой. См. Поддержка MIPS 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).
-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-относительные загрузки в память инструкций.
-mcode-readable=noИнструкции не должны обращаться к секциям исполняемого кода. Этот параметр может быть полезен на целевых платформах, которые настроены на наличие двойного интерфейса инструкция/данные SRAM, но которые (в отличие от M4K) не автоматически перенаправляют PC-относительные загрузки в память инструкций.
-msplit-addresses-mno-split-addresses-
Включить (отключить) использование релокейшенных операторов ассемблера
%hi()и%lo(). Этот параметр устарел и заменен -mexplicit-relocs, но сохранен для обратной совместимости. -mexplicit-relocs-mno-explicit-relocs-
Использовать (не использовать) операторы релокации ассемблера при работе со символическими адресами. Альтернатива, выбранная параметром -mno-explicit-relocs, — использовать вместо этого макросы ассемблера.
-mexplicit-relocs — значение по умолчанию, если GCC был сконфигурирован для использования ассемблера, который поддерживает операторы релокации.
-mcheck-zero-division-mno-check-zero-division-
Запретить (не запрещать) обработку деления на ноль при целочисленном делении.
Значение по умолчанию — -mcheck-zero-division.
-mdivide-traps-mdivide-breaks-
Системы MIPS проверяют деление на ноль, генерируя либо условную обработку прерывания, либо инструкцию 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 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-
Укажите, должен ли 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 приведет к использованию ветвления со слотом задержки, если он доступен в текущем наборе команд, и слот задержки успешно заполнен. Если слот задержки не заполнен, будет выбран компактный вариант ветвления, если он доступен.
-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-10.5.0/gcc/MIPS-Options.html