3.19.28 Параметры MIPS
-
-EB -
Генерировать код в формате big-endian.
-
-EL -
Генерировать код в формате little-endian. По умолчанию используется для конфигураций ‘mips*el-*-*’.
-
-march=arch -
Генерировать код, который будет работать на arch, которое может быть именем универсальной ISA MIPS или именем конкретного процессора. Имена ISA: ‘mips1’, ‘mips2’, ‘mips3’, ‘mips4’, ‘mips32’, ‘mips32r2’, ‘mips32r3’, ‘mips32r5’, ‘mips32r6’, ‘mips64’, ‘mips64r2’, ‘mips64r3’, ‘mips64r5’ и ‘mips64r6’. Имена процессоров: ‘4kc’, ‘4km’, ‘4kp’, ‘4ksc’, ‘4kec’, ‘4kem’, ‘4kep’, ‘4ksd’, ‘5kc’, ‘5kf’, ‘20kc’, ‘24kc’, ‘24kf2_1’, ‘24kf1_1’, ‘24kec’, ‘24kef2_1’, ‘24kef1_1’, ‘34kc’, ‘34kf2_1’, ‘34kf1_1’, ‘34kn’, ‘74kc’, ‘74kf2_1’, ‘74kf1_1’, ‘74kf3_2’, ‘1004kc’, ‘1004kf2_1’, ‘1004kf1_1’, ‘i6400’, ‘i6500’, ‘interaptiv’, ‘loongson2e’, ‘loongson2f’, ‘loongson3a’, ‘gs464’, ‘gs464e’, ‘gs264e’, ‘m4k’, ‘m14k’, ‘m14kc’, ‘m14ke’, ‘m14kec’, ‘m5100’, ‘m5101’, ‘octeon’, ‘octeon+’, ‘octeon2’, ‘octeon3’, ‘orion’, ‘p5600’, ‘p6600’, ‘r2000’, ‘r3000’, ‘r3900’, ‘r4000’, ‘r4400’, ‘r4600’, ‘r4650’, ‘r4700’, ‘r5900’, ‘r6000’, ‘r8000’, ‘rm7000’, ‘rm9000’, ‘r10000’, ‘r12000’, ‘r14000’, ‘r16000’, ‘sb1’, ‘sr71000’, ‘vr4100’, ‘vr4111’, ‘vr4120’, ‘vr4130’, ‘vr4300’, ‘vr5000’, ‘vr5400’, ‘vr5500’, ‘xlr’ и ‘xlp’. Специальное значение ‘from-abi’ выбирает наиболее совместимую архитектуру для выбранной ABI (то есть ‘mips1’ для 32-битных ABI и ‘mips3’ для 64-битных ABI).
Нативный Linux/GNU инструмент также поддерживает значение ‘native’, которое выбирает наилучший вариант архитектуры для процессора хоста. -march=native не имеет эффекта, если GCC не распознает процессор.
В именах процессоров окончание ‘000’ может быть сокращено до ‘k’ (например, -march=r2k). Префиксы являются необязательными, и ‘vr’ может быть записано как ‘r’.
Имена в формате ‘nf2_1’ относятся к процессорам с FPU, работающим вполовину быстрее ядра, имена в формате ‘nf1_1’ — к процессорам с FPU, работающим с той же частотой, что и ядро, и имена в формате ‘nf3_2’ — к процессорам с FPU, работающим в соотношении 3:2 к ядру. По соображениям совместимости ‘nf’ принимается как синоним для ‘nf2_1’, а ‘nx’ и ‘bfx’ — как синонимы для ‘nf1_1’.
GCC определяет две макрокоманды на основе значения этого параметра. Первая —
_MIPS_ARCH, которая возвращает имя целевой архитектуры в виде строки. Вторая имеет вид_MIPS_ARCH_foo, где foo — это прописное значение_MIPS_ARCH. Например, -march=r2000 устанавливает_MIPS_ARCHв"r2000"и определяет макрос_MIPS_ARCH_R2000.Обратите внимание, что макрос
_MIPS_ARCHиспользует имена процессоров, указанные выше. Другими словами, он использует полный префикс и не сокращает ‘000’ до ‘k’. В случае ‘from-abi’ макрос называет разрешенную архитектуру (либо"mips1"либо"mips3"). Он называет архитектуру по умолчанию, когда параметр -march не указан. -
-mtune=arch -
Оптимизация для arch. Среди прочего, этот параметр управляет способом планирования инструкций и предполагаемой стоимостью арифметических операций. Список значений arch такой же, как и для -march.
Если этот параметр не используется, GCC оптимизирует для процессора, указанного параметром -march. Используя -march и -mtune вместе, можно сгенерировать код, который работает на семействе процессоров, но оптимизировать код для одного конкретного члена этого семейства.
-mtune определяет макросы
_MIPS_TUNEи_MIPS_TUNE_foo, которые работают аналогично макросам -march, описанным выше. -
-mips1 -
Эквивалентно -march=mips1.
-
-mips2 -
Эквивалентно -march=mips2.
-
-mips3 -
Эквивалентно -march=mips3.
-
-mips4 -
Эквивалентно -march=mips4.
-
-mips32 -
Эквивалентно -march=mips32.
-
-mips32r3 -
Эквивалентно -march=mips32r3.
-
-mips32r5 -
Эквивалентно -march=mips32r5.
-
-mips32r6 -
Эквивалентно -march=mips32r6.
-
-mips64 -
Эквивалентно -march=mips64.
-
-mips64r2 -
Эквивалентно -march=mips64r2.
-
-mips64r3 -
Эквивалентно -march=mips64r3.
-
-mips64r5 -
Эквивалентно -march=mips64r5.
-
-mips64r6 -
Эквивалентно -march=mips64r6.
-
-mips16 -mno-mips16-
Генерировать (не генерировать) код MIPS16. Если GCC нацелен на архитектуру MIPS32 или MIPS64, он использует ASE MIPS16e.
Генерация кода MIPS16 также может контролироваться на уровне каждой функции с помощью
mips16иnomips16атрибутов. См. Объявление атрибутов функций для получения дополнительной информации. -
-mmips16e2 -mno-mips16e2-
Использовать (не использовать) ASE MIPS16e2. Этот параметр изменяет поведение параметра -mips16 таким образом, что он нацелен на ASE MIPS16e2.
-
-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 см. https://gcc.gnu.org/projects/mipso64-abi.html.
GCC поддерживает вариант ABI o32, в котором регистры с плавающей запятой имеют ширину 64 бита, а не 32 бита. Вы можете выбрать эту комбинацию с помощью -mabi=32 -mfp64. Этот ABI опирается на инструкции
mthc1иmfhc1и поэтому поддерживается только для процессоров MIPS32R2, MIPS32R3 и MIPS32R5.Назначение регистров для аргументов и возвращаемых значений остается прежним, но каждое скалярное значение передается в единственном 64-битном регистре вместо пары 32-битных регистров. Например, скалярные значения с плавающей запятой возвращаются только в ‘$f0’, а не в паре ‘$f0’/‘$f1’. Множество регистров, сохраняемых при вызове, также остается неизменным в том смысле, что регистры двойной точности с четными номерами сохраняются.
Поддерживаются два дополнительных варианта ABI o32, чтобы обеспечить переход от 32-битных к 64-битным регистрам. Это FPXX (-mfpxx) и FP64A (-mfp64 -mno-odd-spreg). Расширение FPXX требует, чтобы весь код выполнялся корректно при выполнении с использованием 32-битных или 64-битных регистров. Код может быть связан с FP32 или FP64, но не с обоими одновременно. Расширение FP64A аналогично расширению FP64, но запрещает использование регистров одинарной точности с нечетными номерами. Это можно использовать в сочетании с режимом
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 linker. Однако параметр не влияет на ABI конечного исполняемого файла; он влияет только на ABI переносимых объектов. Использование -mno-shared обычно делает исполняемые файлы и меньше, и быстрее.
-mshared — значение по умолчанию.
-
-mplt -mno-plt-
Предполагать (не предполагать), что статический и динамический линковщики поддерживают PLT и копирование перемещений. Этот параметр влияет только на -mno-shared -mabicalls. Для ABI n64 этот параметр не имеет эффекта без -msym32.
Вы можете сделать -mplt значением по умолчанию, настроив GCC с помощью --with-mips-plt. В противном случае значением по умолчанию является -mno-plt.
-
-mxgot -mno-xgot-
Убрать (не убирать) обычные ограничения на размер таблицы глобальных смещений.
GCC обычно использует одну инструкцию для загрузки значений из GOT. Хотя это относительно эффективно, оно работает только если GOT меньше примерно 64k. Любой больший размер заставляет линковщик сообщить об ошибке, такой как:
relocation truncated to fit: R_MIPS_GOT16 foobar
Если это происходит, вы должны перекомпилировать свой код с -mxgot. Это работает с очень большими GOT, хотя код также менее эффективен, так как требуется три инструкции для получения значения глобального символа.
Обратите внимание, что некоторые линковщики могут создавать несколько GOT. Если у вас такой линковщик, вам нужно использовать -mxgot только в том случае, когда один объектный файл обращается к большему количеству записей GOT, чем 64k. Очень немногие делают это.
Эти параметры не имеют эффекта, если GCC не генерирует позиционно-независимый код.
-
-mgp32 -
Предполагать, что регистры общего назначения имеют ширину 32 бита.
-
-mgp64 -
Предполагать, что регистры общего назначения имеют ширину 64 бита.
-
-mfp32 -
Предполагать, что регистры с плавающей запятой имеют ширину 32 бита.
-
-mfp64 -
Предполагать, что регистры с плавающей запятой имеют ширину 64 бита.
-
-mfpxx -
Не предполагать ширину регистров с плавающей запятой.
-
-mhard-float -
Использовать инструкции сопроцессора с плавающей запятой.
-
-msoft-float -
Не использовать инструкции сопроцессора с плавающей запятой. Реализовывать вычисления с плавающей запятой с помощью вызовов библиотеки вместо этого.
-
-mno-float -
Эквивалентно -msoft-float, но дополнительно утверждает, что программа, которую компилируют, не выполняет никаких операций с плавающей запятой. Этот параметр в настоящее время поддерживается только некоторыми конфигурациями MIPS bare-metal, где он может выбрать специальный набор библиотек, лишенных всей поддержки плавающей запятой (включая, например, форматы плавающей запятой
printf). Если код, скомпилированный с помощью -mno-float, случайно содержит операции с плавающей запятой, он, вероятно, столкнется с ошибкой при линковке или во время выполнения. -
-msingle-float -
Предполагать, что сопроцессор с плавающей запятой поддерживает только операции одинарной точности.
-
-mdouble-float -
Предполагать, что сопроцессор с плавающей запятой поддерживает операции двойной точности. Это значение по умолчанию.
-
-modd-spreg -mno-odd-spreg-
Включить использование регистров с плавающей запятой одинарной точности с нечетными номерами для ABI o32. Это значение по умолчанию для процессоров, которые, как известно, поддерживают эти регистры. При использовании ABI o32 FPXX -mno-odd-spreg устанавливается по умолчанию.
-
-mabs=2008 -mabs=legacy-
Эти параметры управляют обработкой специальных данных с плавающей запятой IEEE 754 типа не-число (NaN) с помощью машинных инструкций
abs.fmtиneg.fmt.По умолчанию или при использовании -mabs=legacy выбирается обработка по умолчанию. В этом случае эти инструкции рассматриваются как арифметические и избегаются там, где требуется корректная работа, и входной операнд может быть NaN. Вместо этого используется более длинная последовательность инструкций, которая вручную изменяет бит знака данных с плавающей запятой, если также не был задан параметр -ffinite-math-only.
Параметр -mabs=2008 выбирает обработку IEEE 754-2008. В этом случае эти инструкции рассматриваются как неарифметические и, следовательно, работают корректно во всех случаях, включая, в частности, случаи, когда входной операнд является NaN. Поэтому для соответствующих операций всегда используются эти инструкции.
-
-mnan=2008 -mnan=legacy-
Эти параметры управляют кодированием специальных данных с плавающей запятой IEEE 754 типа не-число (NaN).
Параметр -mnan=legacy выбирает кодирование по умолчанию. В этом случае тихие NaN (qNaN) обозначаются битом 0 в старшем бите поля дробной части, а сигнализирующие NaN (sNaN) — битом 1 в старшем бите поля дробной части.
Параметр -mnan=2008 выбирает кодирование IEEE 754-2008. В этом случае тихие NaN (qNaN) обозначаются битом 1 в старшем бите поля дробной части, а сигнализирующие NaN (sNaN) — битом 0 в старшем бите поля дробной части.
По умолчанию используется -mnan=legacy, если GCC не был сконфигурирован с --with-nan=2008.
-
-mllsc -mno-llsc-
Использовать (не использовать) инструкции ‘ll’, ‘sc’ и ‘sync’ для реализации встроенных атомных функций памяти. Если ни один из параметров не указан, GCC использует эти инструкции, если целевая архитектура их поддерживает.
-mllsc полезно, если среда выполнения может эмулировать инструкции, а -mno-llsc может быть полезно при компиляции для нестандартных ISA. Вы можете сделать любой из параметров значением по умолчанию, настроив GCC с помощью --with-llsc и --without-llsc соответственно. --with-llsc является значением по умолчанию для некоторых конфигураций; см. документацию по установке для получения подробной информации.
-
-mdsp -mno-dsp-
Использовать (не использовать) ревизию 1 ASE MIPS DSP. См. MIPS DSP Встроенные функции. Этот параметр определяет препроцессорную макрос
__mips_dsp. Он также определяет__mips_dsp_revкак 1. -
-mdspr2 -mno-dspr2-
Использовать (не использовать) ревизию 2 ASE MIPS DSP. См. MIPS DSP Встроенные функции. Этот параметр определяет препроцессорные макросы
__mips_dspи__mips_dspr2. Он также определяет__mips_dsp_revкак 2. -
-msmartmips -mno-smartmips-
Использовать (не использовать) ASE MIPS SmartMIPS.
-
-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-
Генерировать (не генерировать) микро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 бита.Размер
intиlongпо умолчанию зависит от ABI. Все поддерживаемые ABI используют 32-битныеint. ABI n64 и 64-битный EABI используют 64-битныеlong, в то время как остальные используют 32-битныеlong. Размер указателей совпадает с размеромlongили с размером регистров целых чисел, в зависимости от того, что меньше. -
-msym32 -mno-sym32-
Предполагать (не предполагать), что все символы имеют 32-битные значения, независимо от выбранного ABI. Эта опция полезна в сочетании с -mabi=64 и -mno-abicalls, так как она позволяет GCC генерировать более короткие и быстрые ссылки на символические адреса.
-
-G num -
Поместить определения внешне видимых данных в раздел малых данных, если размер данных не превышает num байт. GCC может затем генерировать более эффективные обращения к данным; подробнее см. -mgpopt.
Значение по умолчанию опции -G зависит от конфигурации.
-
-mlocal-sdata -mno-local-sdata-
Расширить (не расширять) поведение опции -G на локальные данные, такие как статические переменные в C. -mlocal-sdata является значением по умолчанию для всех конфигураций.
Если компоновщик жалуется, что приложение использует слишком много малых данных, вы можете попробовать перестроить менее важные части с -mno-local-sdata. Вы также можете скомпилировать большие библиотеки с -mno-local-sdata, чтобы оставить больше места для основной программы.
-
-mextern-sdata -mno-extern-sdata-
Предполагать (не предполагать), что внешне определенные данные находятся в разделе малых данных, если размер этих данных находится в пределах лимита -G. -mextern-sdata является значением по умолчанию для всех конфигураций.
Если вы компилируете модуль Mod с -mextern-sdata -G num -mgpopt, и Mod ссылается на переменную Var, размер которой не превышает num байт, убедитесь, что Var размещена в разделе малых данных. Если Var определена другим модулем, необходимо либо скомпилировать этот модуль с достаточно высоким значением -G, либо добавить атрибут
sectionк определению Var. Если Var является общей, необходимо скомпоновать приложение с достаточно высоким значением -G.Самый простой способ удовлетворить этим ограничениям — скомпилировать и скомпоновать каждый модуль с одинаковым значением -G. Однако вы можете захотеть создать библиотеку, поддерживающую несколько разных лимитов для малых данных. Это можно сделать, скомпилировав библиотеку с самым высоким поддерживаемым значением -G и дополнительно используя -mno-extern-sdata, чтобы библиотека не делала предположений о внешне определённых данных.
-
-mgpopt -mno-gpopt-
Использовать (не использовать) GP-относительные обращения для символов, которые, как известно, находятся в разделе малых данных; см. -G, -mlocal-sdata и -mextern-sdata. -mgpopt является значением по умолчанию для всех конфигураций.
-mno-gpopt полезна в тех случаях, когда регистр
$gpможет не содержать значения_gp. Например, если код является частью библиотеки, которая может использоваться в мониторе загрузки, программы, вызывающие процедуры монитора загрузки, передают неизвестное значение в$gp. (В таких ситуациях сам монитор загрузки обычно компилируется с -G0.)-mno-gpopt подразумевает -mno-local-sdata и -mno-extern-sdata.
-
-membedded-data -mno-embedded-data-
При возможности сначала размещать переменные в разделе только для чтения, затем в разделе малых данных, а если нет, то в разделе данных. Это даёт немного более медленный код, но уменьшает объём требуемой оперативной памяти при выполнении, поэтому может быть предпочтительнее для некоторых встраиваемых систем.
-
-muninit-const-in-rodata -mno-uninit-const-in-rodata-
Поместить неинициализированные
constпеременные в раздел только для чтения. Эта опция имеет смысл только в сочетании с -membedded-data. -
-mcode-readable=setting -
Указывает, может ли GCC генерировать код, который считывает данные из исполняемых разделов. Существует три возможных значения:
-mcode-readable=yes-
Инструкции могут свободно обращаться к исполняемым разделам. Это значение по умолчанию.
-mcode-readable=pcrel-
Инструкции MIPS16 PC-относительного загрузки могут обращаться к исполняемым разделам, но другие инструкции не должны. Эта опция полезна на процессорах 4KSc и 4KSd, когда в кэшах кода установлен бит запрета чтения. Она также полезна на процессорах, которые могут быть настроены с двойным интерфейсом SRAM для инструкций/данных и которые, как M4K, автоматически перенаправляют PC-относительные загрузки в память инструкций.
-mcode-readable=noИнструкции не должны обращаться к исполняемым разделам. Эта опция может быть полезна на целевых платформах, которые настроены с двойным интерфейсом SRAM для инструкций/данных, но которые (в отличие от M4K) не автоматически перенаправляют PC-относительные загрузки в память инструкций.
-
-msplit-addresses -mno-split-addresses-
Включить (выключить) использование операторов перемещения
%hi()и%lo()ассемблера. Эта опция устарела и заменена на -mexplicit-relocs, но сохранена для обратной совместимости. -
-mexplicit-relocs=none -mexplicit-relocs=base-mexplicit-relocs=pcrel-mexplicit-relocs-mno-explicit-relocs-
Эти опции управляют тем, используются ли явные перестановки (например, %gp_rel). Значение по умолчанию зависит от версии GAS при сборке самого GCC.
Поддержка
baseявных переместижений была введена в GAS в 2001 году. Поддержкаpcrelявных переместижений была введена в GAS в 2014 году, которая поддерживает%pcrel_hiи%pcrel_lo. -
-mcheck-zero-division -mno-check-zero-division-
Захватывать (не захватывать) ошибку целочисленного деления на ноль.
Значение по умолчанию — -mcheck-zero-division.
-
-mdivide-traps -mdivide-breaks-
Системы MIPS проверяют деление на ноль, генерируя либо условную ошибку, либо инструкцию прерывания. Использование ошибок приводит к более компактному коду, но поддерживается только на MIPS II и более поздних версиях. Кроме того, некоторые версии ядра Linux содержат ошибку, которая препятствует генерации правильного сигнала (
SIGFPE). Используйте -mdivide-traps, чтобы разрешить условные ошибки на архитектурах, которые их поддерживают, и -mdivide-breaks, чтобы принудительно использовать прерывания.Значение по умолчанию обычно -mdivide-traps, но это можно переопределить во время конфигурации, используя --with-divide=breaks. Проверки на деление на ноль могут быть полностью отключены с помощью -mno-check-zero-division.
-
-mload-store-pairs -mno-load-store-pairs-
Включить (выключить) оптимизацию, которая связывает последовательные инструкции загрузки или сохранения для включения объединения операций загрузки/сохранения. Эта опция включена по умолчанию, но действует только при условии, что выбранная архитектура поддерживает объединение.
-
-mstrict-align -mno-strict-align-munaligned-access-mno-unaligned-access
-
Отключить (включить) прямой доступ к невыровненным данным для MIPS Release 6. MIPSr6 требует поддержки доступа к невыровненным данным, либо аппаратно, либо через перехват и эмуляцию. Поэтому может потребоваться -mstrict-align ядру. Опции -munaligned-access и -mno-unaligned-access устарели и поддерживаются только для обратной совместимости.
-
-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 пытается предсказать результат условного ветвления и спекулятивно выполняет инструкции из «взятого» ветвления. Позже он отменяет эти инструкции, если предсказанный результат неверен. Однако на 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 и выше. Если компактная инструкция ветвления недоступна (или это предшествующая R6 версия), вместо неё будет использована форма ветвления со слотом задержки.
Если используется для целей MIPS16/microMIPS, то сейчас она будет просто проигнорирована. Поведение для MIPS16/microMIPS может измениться в будущем, поскольку у них есть некоторые компактные инструкции ветвления.
Параметр -mcompact-branches=optimal будет использовать ветвление со слотом задержки, если оно доступно в текущей ISA и слот задержки успешно заполнен. Если слот задержки не заполнен, будет выбран компактный способ ветвления, если он доступен.
-
-mfp-exceptions -mno-fp-exceptions-
Указывает, включены ли исключения FP. Это влияет на то, как планируются инструкции FP для некоторых процессоров. По умолчанию исключения FP включены.
Например, на SB-1, если исключения FP отключены, и мы генерируем 64-битный код, то мы можем использовать обе FP-трубы. В противном случае мы можем использовать только одну FP-трубу.
-
-mvr4130-align -mno-vr4130-align-
Конвейер VR4130 является двухканальным суперскалярным, но может выдавать только две инструкции вместе, если первая из них выровнена на границе 8 байт. При включении этого параметра GCC выравнивает пары инструкций, которые, по его мнению, должны выполняться параллельно.
Этот параметр действует только при оптимизации для VR4130. Обычно он ускоряет код, но за счёт увеличения его размера. Он включён по умолчанию на уровне оптимизации -O3.
-
-msynci -mno-synci-
Включить (отключить) генерацию инструкций
synciна архитектурах, которые их поддерживают. Инструкцииsynci(если включены) генерируются при компиляции__builtin___clear_cache.Этот параметр по умолчанию равен -mno-synci, но значение по умолчанию может быть переопределено при конфигурировании GCC с помощью --with-synci.
При компиляции кода для однопроцессорных систем использование
synciобычно безопасно. Однако на многих многоядерных (SMP) системах это не приводит к инвалидации кэша инструкций на всех ядрах и может привести к неопределённому поведению. -
-mrelax-pic-calls -mno-relax-pic-calls-
Попытаться преобразовать вызовы PIC, которые обычно передаются через регистр
$25, в прямые вызовы. Это возможно только если компоновщик может разрешить место назначения во время компоновки и если место назначения находится в пределах диапазона для прямого вызова.-mrelax-pic-calls является значением по умолчанию, если GCC был сконфигурирован для использования ассемблера и компоновщика, которые поддерживают директиву ассемблирования
.relocи -mexplicit-relocs включён. С -mno-explicit-relocs эту оптимизацию может выполнить сам ассемблер и компоновщик без помощи компилятора. -
-mmcount-ra-address -mno-mcount-ra-address-
Выводить (не выводить) код, позволяющий
_mcountизменять адрес возврата вызывающей функции. При включении этот параметр расширяет обычный интерфейс_mcountс новым параметром ra-address, имеющим типintptr_t *и передаваемым в регистре$12._mcountможет затем изменить адрес возврата, выполнив оба следующих действия:- Возвращение нового адреса в регистре
$31. - Запись нового адреса в
*ra-address, если ra-address не равен null.
По умолчанию используется -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-
Если применимо, включить (отключить) генерацию четырёх операндных инструкций
madd.s,madd.dи связанных инструкций. Включено по умолчанию.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/MIPS-Options.html