3.18.26 Параметры MIPS
-EB-
Генерировать код большого порядка байтов (big-endian).
-EL-
Генерировать код малого порядка байтов (little-endian). По умолчанию для конфигураций ‘mips*el-*-*’.
-march=arch-
Генерировать код, который будет выполняться на архитектуре, которая может быть именем общей ISA MIPS или именем конкретного процессора. Имена ISA: ‘mips1’, ‘mips2’, ‘mips3’, ‘mips4’, ‘mips32’, ‘mips32r2’, ‘mips32r3’, ‘mips32r5’, ‘mips32r6’, ‘mips64’, ‘mips64r2’, ‘mips64r3’, ‘mips64r5’ и ‘mips64r6’. Имена процессоров: ‘4kc’, ‘4km’, ‘4kp’, ‘4ksc’, ‘4kec’, ‘4kem’, ‘4kep’, ‘4ksd’, ‘5kc’, ‘5kf’, ‘20kc’, ‘24kc’, ‘24kf2_1’, ‘24kf1_1’, ‘24kec’, ‘24kef2_1’, ‘24kef1_1’, ‘34kc’, ‘34kf2_1’, ‘34kf1_1’, ‘34kn’, ‘74kc’, ‘74kf2_1’, ‘74kf1_1’, ‘74kf3_2’, ‘1004kc’, ‘1004kf2_1’, ‘1004kf1_1’, ‘i6400’, ‘interaptiv’, ‘loongson2e’, ‘loongson2f’, ‘loongson3a’, ‘m4k’, ‘m14k’, ‘m14kc’, ‘m14ke’, ‘m14kec’, ‘m5100’, ‘m5101’, ‘octeon’, ‘octeon+’, ‘octeon2’, ‘octeon3’, ‘orion’, ‘p5600’, ‘r2000’, ‘r3000’, ‘r3900’, ‘r4000’, ‘r4400’, ‘r4600’, ‘r4650’, ‘r4700’, ‘r6000’, ‘r8000’, ‘rm7000’, ‘rm9000’, ‘r10000’, ‘r12000’, ‘r14000’, ‘r16000’, ‘sb1’, ‘sr71000’, ‘vr4100’, ‘vr4111’, ‘vr4120’, ‘vr4130’, ‘vr4300’, ‘vr5000’, ‘vr5400’, ‘vr5500’, ‘xlr’ и ‘xlp’. Специальное значение ‘from-abi’ выбирает наиболее совместимую архитектуру для выбранного ABI (то есть, ‘mips1’ для 32-битных ABI и ‘mips3’ для 64-битных ABI).
Встроенная цепочка инструментов Linux/GNU также поддерживает значение ‘native’, которое выбирает лучший вариант архитектуры для процессора хоста. -march=native не имеет эффекта, если GCC не распознает процессор.
В именах процессоров конечные ‘000’ можно сократить до ‘k’ (например, -march=r2k). Префиксы необязательны, и ‘vr’ можно записать как ‘r’.
Имена вида ‘nf2_1’ относятся к процессорам с FPU, работающим в два раза медленнее ядра, имена вида ‘nf1_1’ — к процессорам с FPU, работающим с такой же частотой, как ядро, а имена вида ‘nf3_2’ — к процессорам с FPU, работающим в соотношении 3:2 по отношению к ядру. Из соображений совместимости ‘nf’ принимается как синоним для ‘nf2_1’, а ‘nx’ и ‘bfx’ — как синонимы для ‘nf1_1’.
GCC определяет две макросы, основанные на значении этого параметра. Первая —
_MIPS_ARCH, которая возвращает имя целевой архитектуры в виде строки. Вторая имеет вид_MIPS_ARCH_foo, где foo — заглавная форма значения_MIPS_ARCH. Например, -march=r2000 устанавливает_MIPS_ARCHв"r2000"и определяет макрос_MIPS_ARCH_R2000.Обратите внимание, что макрос
_MIPS_ARCHиспользует имена процессоров, указанные выше. То есть, он использует полный префикс и не сокращает ‘000’ до ‘k’. В случае ‘from-abi’ макрос называет разрешенную архитектуру (либо"mips1"либо"mips3"). Он называет стандартную архитектуру, когда параметр -march не задан. -mtune=arch-
Оптимизировать для архитектуры. Среди прочего, этот параметр управляет планированием инструкций и воспринимаемой стоимостью арифметических операций. Список значений архитектуры такой же, как и для -march.
Когда этот параметр не используется, GCC оптимизирует для процессора, указанного параметром -march. Использование -march и -mtune вместе позволяет сгенерировать код, который выполняется на семействе процессоров, но оптимизировать код для одного конкретного члена этого семейства.
-mtune определяет макросы
_MIPS_TUNEи_MIPS_TUNE_foo, которые работают так же, как и макросы -march, описанные выше. -mips1-
Эквивалентно -march=mips1.
-mips2-
Эквивалентно -march=mips2.
-mips3-
Эквивалентно -march=mips3.
-mips4-
Эквивалентно -march=mips4.
-mips32-
Эквивалентно -march=mips32.
-mips32r3-
Эквивалентно -march=mips32r3.
-mips32r5-
Эквивалентно -march=mips32r5.
-mips32r6-
Эквивалентно -march=mips32r6.
-mips64-
Эквивалентно -march=mips64.
-mips64r2-
Эквивалентно -march=mips64r2.
-mips64r3-
Эквивалентно -march=mips64r3.
-mips64r5-
Эквивалентно -march=mips64r5.
-mips64r6-
Эквивалентно -march=mips64r6.
-mips16-mno-mips16-
Генерировать (не генерировать) MIPS16-код. Если GCC нацелен на MIPS32 или MIPS64 архитектуру, используется MIPS16e ASE.
Генерацию MIPS16-кода также можно контролировать на уровне функций с помощью
mips16иnomips16атрибутов. Дополнительную информацию см. в Атрибутах функций. -mflip-mips16-
Генерировать MIPS16-код на чередующихся функциях. Этот параметр предназначен для регрессионного тестирования смешанной генерации MIPS16/не-MIPS16 кода и не предназначен для обычного использования при компиляции пользовательского кода.
-minterlink-compressed-mno-interlink-compressed-
Требовать (не требовать), чтобы код, использующий стандартную (не сжатую) MIPS ISA, был совместим по ссылкам с MIPS16 и microMIPS-кодом и наоборот.
Например, код, использующий кодирование стандартной ISA, не может перейти напрямую к MIPS16 или microMIPS-коду; он должен либо использовать вызов, либо косвенный переход. -minterlink-compressed поэтому отключает прямые переходы, если GCC не знает, что цель перехода не сжата.
-minterlink-mips16-mno-interlink-mips16-
Псевдонимы для -minterlink-compressed и -mno-interlink-compressed. Эти параметры предшествуют microMIPS ASE и сохранены для обратной совместимости.
-mabi=32-mabi=o64-mabi=n32-mabi=64-mabi=eabi-
Генерировать код для данного ABI.
Обратите внимание, что EABI имеет 32-битную и 64-битную варианты. GCC обычно генерирует 64-битный код, когда вы выбираете 64-битную архитектуру, но вы можете использовать -mgp32, чтобы получить 32-битный код вместо этого.
Для получения информации об ABI O64 см. http://gcc.gnu.org/projects/mipso64-abi.html.
GCC поддерживает вариант ABI o32, в котором регистры с плавающей запятой имеют 64 бита, а не 32 бита. Вы можете выбрать эту комбинацию с -mabi=32 -mfp64. Этот ABI использует инструкции
mthc1иmfhc1и поэтому поддерживается только для процессоров MIPS32R2, MIPS32R3 и MIPS32R5.Присвоение регистров для аргументов и значений возврата остается неизменным, но каждое скалярное значение передается в единственном 64-битном регистре, а не в паре 32-битных регистров. Например, скалярные значения с плавающей запятой возвращаются в ‘$f0’ только, а не в паре ‘$f0’/‘$f1’. Набор регистров, сохраняемых при вызове, также остается прежним, так как сохраняются регистры с двойной точностью с четными номерами.
Поддерживаются два дополнительных варианта ABI o32, чтобы обеспечить переход от 32-битных к 64-битным регистрам. Это FPXX (-mfpxx) и FP64A (-mfp64 -mno-odd-spreg). Расширение FPXX требует, чтобы весь код выполнялся правильно при использовании 32-битных или 64-битных регистров. Код может быть соединён с помощью либо FP32, либо FP64, но не с обоими одновременно. Расширение FP64A аналогично расширению FP64, но запрещает использование регистров с плавающей запятой с нечётными номерами. Это может использоваться совместно с режимом
FREFPU в процессорах MIPS32R5 и позволяет как FP32, так и FP64A-коду взаимодействовать и выполняться в одном процессе без изменения режимов FPU. -mabicalls-mno-abicalls-
Генерировать (не генерировать) код, подходящий для динамических объектов типа SVR4. -mabicalls является значением по умолчанию для систем на основе SVR4.
-mshared-mno-shared
-
Генерировать (не генерировать) код, полностью независимый от позиции, который, следовательно, может быть связан с общими библиотеками. Этот параметр влияет только на -mabicalls.
Весь код -mabicalls традиционно был независимым от позиции, независимо от параметров, таких как -fPIC и -fpic. Однако, как расширение, GNU toolchain позволяет исполняемым файлам использовать абсолютные обращения для локальной привязки символов. Он также может использовать более короткие последовательности инициализации GP и генерировать прямые вызовы локально определённых функций. Этот режим выбирается с помощью -mno-shared.
-mno-shared зависит от binutils 2.16 или более поздней версии и генерирует объекты, которые могут быть связаны только GNU линковщиком. Однако, параметр не влияет на ABI конечного исполняемого файла; он влияет только на ABI переносимых объектов. Использование -mno-shared обычно делает исполняемые файлы как меньше, так и быстрее.
-mshared является значением по умолчанию.
-mplt-mno-plt-
Предполагать (не предполагать), что статический и динамический линковщики поддерживают PLT и копии перемещений. Этот параметр влияет только на -mno-shared -mabicalls. Для ABI n64 этот параметр не имеет эффекта без -msym32.
Вы можете сделать -mplt значением по умолчанию, настроив GCC с помощью --with-mips-plt. В противном случае значением по умолчанию является -mno-plt.
-mxgot-mno-xgot-
Поднимать (не поднимать) обычные ограничения на размер таблицы глобальных смещений.
GCC обычно использует одну инструкцию для загрузки значений из GOT. Хотя это относительно эффективно, оно работает только в том случае, если GOT меньше примерно 64k. Любая большая величина заставляет линковщик сообщать об ошибке, например:
relocation truncated to fit: R_MIPS_GOT16 foobar
Если это произойдёт, вы должны перекомпилировать свой код с -mxgot. Это работает с очень большими GOT, хотя код также менее эффективен, так как для получения значения глобального символа требуется три инструкции.
Обратите внимание, что некоторые линковщики могут создавать несколько GOT. Если у вас есть такой линковщик, вам следует использовать -mxgot только тогда, когда один файл объекта обращается более чем к 64k записей GOT. Очень немногие это делают.
Эти параметры не имеют эффекта, если GCC не генерирует код, независимый от позиции.
-mgp32-
Предполагать, что регистры общего назначения имеют ширину 32 бита.
-mgp64-
Предполагать, что регистры общего назначения имеют ширину 64 бита.
-mfp32-
Предполагать, что регистры с плавающей запятой имеют ширину 32 бита.
-mfp64-
Предполагать, что регистры с плавающей запятой имеют ширину 64 бита.
-mfpxx-
Не предполагать ширину регистров с плавающей запятой.
-mhard-float-
Использовать инструкции сопроцессора с плавающей запятой.
-msoft-float-
Не использовать инструкции сопроцессора с плавающей запятой. Реализовывать вычисления с плавающей запятой с помощью вызовов библиотеки вместо этого.
-mno-float-
Эквивалентно -msoft-float, но дополнительно утверждает, что программа, которую компилируют, не выполняет никаких операций с плавающей запятой. В настоящее время этот параметр поддерживается только некоторыми конфигурациями MIPS bare-metal, где он может выбрать специальный набор библиотек, в которых отсутствует вся поддержка плавающей запятой (включая, например, форматы плавающей запятой
printf). Если код, скомпилированный с -mno-float, случайно содержит операции с плавающей запятой, скорее всего, произойдёт ошибка на этапе линковки или выполнения. -msingle-float-
Предполагать, что сопроцессор с плавающей запятой поддерживает только операции с одинарной точностью.
-mdouble-float-
Предполагать, что сопроцессор с плавающей запятой поддерживает операции с двойной точностью. Это значение по умолчанию.
-modd-spreg-mno-odd-spreg-
Включить использование регистров с плавающей запятой с нечётными номерами для ABI o32. Это значение по умолчанию для процессоров, которые, как известно, поддерживают эти регистры. При использовании ABI o32 FPXX, -mno-odd-spreg устанавливается по умолчанию.
-mabs=2008-mabs=legacy-
Эти параметры управляют обработкой специальных данных IEEE 754 с плавающей запятой, которые не являются числами (NaN), с помощью инструкций
abs.fmtиneg.fmtмашины.По умолчанию или при использовании -mabs=legacy выбирается традиционная обработка. В этом случае эти инструкции рассматриваются как арифметические и избегаются, когда требуется правильная работа, а входной операнд может быть NaN. Вместо этого используется более длинная последовательность инструкций, которая вручную обрабатывает бит знака данных с плавающей запятой, если также не указан параметр -ffinite-math-only.
Параметр -mabs=2008 выбирает обработку IEEE 754-2008. В этом случае эти инструкции рассматриваются как не арифметические и, следовательно, работают правильно во всех случаях, в том числе, в частности, когда входной операнд является NaN. Поэтому эти инструкции всегда используются для соответствующих операций.
-mnan=2008-mnan=legacy-
Эти параметры управляют кодированием специальных данных IEEE 754 с плавающей запятой, которые не являются числами (NaN).
Параметр -mnan=legacy выбирает традиционную кодировку. В этом случае тихие NaN (qNaN) обозначаются первым битом их поля дробной части мантиссы, равным 0, а сигнализирующие NaN (sNaN) обозначаются первым битом их поля дробной части мантиссы, равным 1.
Параметр -mnan=2008 выбирает кодировку IEEE 754-2008. В этом случае qNaN обозначаются первым битом их поля дробной части мантиссы, равным 1, а sNaN обозначаются первым битом их поля дробной части мантиссы, равным 0.
Значение по умолчанию — -mnan=legacy, если GCC не был настроен с помощью --with-nan=2008.
-mllsc-mno-llsc-
Использовать (не использовать) инструкции «ll», «sc» и «sync» для реализации встроенных атомарных функций памяти. Если ни один параметр не указан, GCC использует инструкции, если целевая архитектура их поддерживает.
-mllsc полезен, если среда выполнения может эмулировать инструкции, а -mno-llsc может быть полезен при компиляции для нестандартных ISA. Вы можете установить любой из параметров по умолчанию, настроив GCC с помощью --with-llsc и --without-llsc соответственно. --with-llsc является значением по умолчанию для некоторых конфигураций; см. документацию по установке для получения подробностей.
-mdsp-mno-dsp-
Использовать (не использовать) версию 1 расширения MIPS DSP ASE. См. Функции MIPS DSP. Этот параметр определяет препроцессорную макрокоманду
__mips_dsp. Он также определяет__mips_dsp_revкак 1. -mdspr2-mno-dspr2-
Использовать (не использовать) версию 2 расширения MIPS DSP ASE. См. Функции MIPS DSP. Этот параметр определяет препроцессорные макросы
__mips_dspи__mips_dspr2. Он также определяет__mips_dsp_revкак 2. -msmartmips-mno-smartmips-
Использовать (не использовать) расширение MIPS SmartMIPS ASE.
-mpaired-single-mno-paired-single-
Использовать (не использовать) инструкции с плавающей запятой с парными числами. См. Поддержка MIPS Paired-Single. Этот параметр требует включения аппаратной поддержки плавающей запятой.
-mdmx-mno-mdmx-
Использовать (не использовать) инструкции расширения MIPS Digital Media. Этот параметр может использоваться только при генерации 64-битного кода и требует включения аппаратной поддержки плавающей запятой.
-mips3d-mno-mips3d-
Использовать (не использовать) расширение MIPS-3D ASE. См. Встроенные функции MIPS-3D. Параметр -mips3d подразумевает -mpaired-single.
-mmicromips-mno-micromips-
Генерировать (не генерировать) код microMIPS.
Генерация кода microMIPS также может контролироваться на уровне функции с помощью
micromipsиnomicromipsатрибутов. См. Атрибуты функций для получения дополнительной информации. -mmt-mno-mt-
Использовать (не использовать) инструкции MT Multithreading.
-mmcu-mno-mcu-
Использовать (не использовать) инструкции расширения MIPS MCU ASE.
-meva-mno-eva-
Использовать (не использовать) инструкции MIPS Enhanced Virtual Addressing.
-mvirt-mno-virt-
Использовать (не использовать) инструкции MIPS Virtualization Application Specific.
-mxpa-mno-xpa-
Использовать (не использовать) инструкции MIPS eXtended Physical Address (XPA).
-mlong64-
Принудительно установить ширину типов
longв 64 бита. См. -mlong32 для объяснения значения по умолчанию и способа определения размера указателя. -mlong32-
Принудительно установить ширину
long,int, и типов указателей в 32 бита.Размер по умолчанию для
ints,longs и указателей зависит от ABI. Все поддерживаемые ABI используют 32-битныеints. ABI n64 и 64-битный EABI используют 64-битныеlongs, остальные — 32-битныеlongs. Размер указателей такой же, как уlongs или такой же, как у регистров целых чисел, в зависимости от того, какой меньше. -msym32-mno-sym32-
Предполагать (не предполагать), что все символы имеют значения 32 бита, независимо от выбранного ABI. Этот параметр полезен в сочетании с -mabi=64 и -mno-abicalls, поскольку позволяет GCC генерировать более короткие и быстрые ссылки на символические адреса.
-G num-
Поместите определения внешне видимых данных в небольшой раздел данных, если эти данные не превышают num байт. GCC сможет сгенерировать более эффективный доступ к этим данным; см. -mgpopt для получения подробностей.
Значение по умолчанию для опции -G зависит от конфигурации.
-mlocal-sdata-mno-local-sdata-
Расширить (не расширять) поведение опции -G на локальные данные, такие как статические переменные в C. -mlocal-sdata — значение по умолчанию для всех конфигураций.
Если компоновщик жалуется на чрезмерное использование небольших данных в приложении, можно попробовать перестроить менее критически важные части с использованием -mno-local-sdata. Также можно скомпилировать большие библиотеки с -mno-local-sdata, чтобы освободить больше места для основной программы.
-mextern-sdata-mno-extern-sdata-
Предполагать (не предполагать), что внешне определенные данные находятся в небольшом разделе данных, если их размер соответствует ограничению -G. -mextern-sdata — значение по умолчанию для всех конфигураций.
Если вы компилируете модуль Mod с -mextern-sdata -G num -mgpopt, и Mod ссылается на переменную Var, размер которой не превышает num байт, необходимо убедиться, что Var размещается в небольшом разделе данных. Если Var определена другим модулем, необходимо либо скомпилировать этот модуль с достаточно высоким значением -G, либо применить атрибут
sectionк определению Var. Если Var является общей, необходимо слинковать приложение с достаточно высоким значением -G.Самый простой способ удовлетворить этим ограничениям — скомпилировать и слинковать каждый модуль с одинаковым значением опции -G. Однако вы можете захотеть создать библиотеку, поддерживающую несколько различных ограничений на размер небольших данных. Вы можете сделать это, скомпилировав библиотеку с самым высоким поддерживаемым значением -G и дополнительно используя -mno-extern-sdata, чтобы библиотека не делала предположений о внешне определенных данных.
-mgpopt-mno-gpopt-
Использовать (не использовать) GP-относительные обращения к символам, которые, как известно, находятся в небольшом разделе данных; см. -G, -mlocal-sdata и -mextern-sdata. -mgpopt — значение по умолчанию для всех конфигураций.
-mno-gpopt полезно в случаях, когда регистр
$gpможет не содержать значение_gp. Например, если код является частью библиотеки, которая может использоваться в мониторе загрузки, программы, которые вызывают процедуры монитора загрузки, передают неизвестное значение в$gp. (В таких ситуациях сам монитор загрузки обычно компилируется с -G0.)-mno-gpopt подразумевает -mno-local-sdata и -mno-extern-sdata.
-membedded-data-mno-embedded-data-
При возможности сначала выделять переменные в раздел только для чтения, затем в небольшой раздел данных, а если нет — в раздел данных. Это приводит к несколько более медленному коду, чем по умолчанию, но снижает потребление оперативной памяти во время выполнения, поэтому может быть предпочтительно для некоторых встраиваемых систем.
-muninit-const-in-rodata-mno-uninit-const-in-rodata-
Поместить неинициализированные
constпеременные в раздел данных только для чтения. Эта опция имеет смысл только в сочетании с -membedded-data. -mcode-readable=setting-
Указать, может ли GCC генерировать код, который считывает данные из исполняемых секций. Существует три возможных значения:
-mcode-readable=yes-
Инструкции могут свободно обращаться к исполняемым секциям. Это значение по умолчанию.
-mcode-readable=pcrel-
Инструкции MIPS16 PC-относительного загрузки могут обращаться к исполняемым секциям, но другие инструкции не должны этого делать. Эта опция полезна на процессорах 4KSc и 4KSd, когда в TLB кода установлен бит Read Inhibit. Она также полезна на процессорах, которые могут быть сконфигурированы для двойного интерфейса 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.
-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-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=значение управляет реализацией 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 байт в стеке для вызываемой функции, чтобы записать аргументы регистров. При включении эта оптимизация подавляет выделение заголовка фрейма, если можно определить, что он не используется.
Эта оптимизация отключена по умолчанию на всех уровнях оптимизации.
Далее: Опции MMIX, Предыдущее: Опции MicroBlaze, Вверх: Опции подмодели [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/MIPS-Options.html