3.17.25 Варианты 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’, ‘loongson2e’, ‘loongson2f’, ‘loongson3a’, ‘m4k’, ‘m14k’, ‘m14kc’, ‘m14ke’, ‘m14kec’, ‘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-
Оптимизация для 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-
Эти параметры управляют обработкой специальных данных 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 ASE MIPS DSP. См. MIPS DSP Built-in Functions. Этот параметр определяет препроцессорную макрокоманду
__mips_dsp. Он также определяет__mips_dsp_revкак 1. -mdspr2-mno-dspr2-
Использовать (не использовать) пересмотр 2 ASE MIPS DSP. См. MIPS DSP Built-in Functions. Этот параметр определяет препроцессорные макрокоманды
__mips_dspи__mips_dspr2. Он также определяет__mips_dsp_revкак 2. -msmartmips-mno-smartmips-
Использовать (не использовать) MIPS SmartMIPS ASE.
-mpaired-single-mno-paired-single-
Использовать (не использовать) инструкции с плавающей запятой парной одинарной точности. См. MIPS Paired-Single Support. Этот параметр требует включения поддержки аппаратной плавающей запятой.
-mdmx-mno-mdmx-
Использовать (не использовать) инструкции MIPS Digital Media Extension. Этот параметр может быть использован только при генерации 64-битного кода и требует включения поддержки аппаратной плавающей запятой.
-mips3d-mno-mips3d-
Использовать (не использовать) MIPS-3D ASE. См. MIPS-3D Built-in Functions. Параметр -mips3d подразумевает -mpaired-single.
-mmicromips-mno-micromips-
Генерировать (не генерировать) код microMIPS.
Генерация кода microMIPS также может контролироваться на уровне каждой функции с помощью
micromipsиnomicromipsатрибутов. См. Function Attributes для получения дополнительной информации. -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 имеют бит запрета чтения. Он также полезен на процессорах, которые могут быть сконфигурированы для наличия двойного интерфейса 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 проверяют деление на ноль, генерируя либо условную ошибку, либо инструкцию разрыва. Использование ошибок приводит к более компактному коду, но поддерживается только на MIPS II и более поздних версиях. Кроме того, в некоторых версиях ядра Linux существует ошибка, которая предотвращает генерацию правильного сигнала (
SIGFPE). Используйте -mdivide-traps, чтобы разрешить условные ошибки на архитектурах, которые их поддерживают, и -mdivide-breaks, чтобы принудительно использовать разрывы.Значение по умолчанию обычно -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=load-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 специально устарели.
-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.
- Возвращение нового адреса в регистре
Далее: Параметры MMIX, Предыдущее: Параметры MicroBlaze, Выше: Параметры подмодели [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/MIPS-Options.html