Spec-Zone.ru › GCC 8

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, но запрещает использование регистров с плавающей запятой с нечётными номерами. Это может использоваться совместно с режимом FRE FPU в процессорах MIPS32R5 и позволяет как FP32, так и FP64A-коду взаимодействовать и выполняться в одном процессе без изменения режимов FPU.

-mabicalls
-mno-abicalls

Генерировать (не генерировать) код, подходящий для динамических объектов типа SVR4. -mabicalls является значением по умолчанию для систем на основе SVR4.

-mshared
-mno-shared
END_OF_DOCUMENT_MARKER

Генерировать (не генерировать) код, полностью независимый от позиции, который, следовательно, может быть связан с общими библиотеками. Этот параметр влияет только на -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. В этом случае тихие NaN обозначаются тем, что первый бит их хвостового поля значащих разрядов равен 1, а сигнализирующие NaN обозначаются тем, что первый бит их хвостового поля значащих разрядов равен 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

Использовать (не использовать) MIPS SmartMIPS ASE.

-mpaired-single
-mno-paired-single

Использовать (не использовать) инструкции с плавающей точкой с парными одинарными значениями. См. Поддержка MIPS Paired-Single. Этот параметр требует включения поддержки аппаратной плавающей точки.

-mdmx
-mno-mdmx

Использовать (не использовать) инструкции MIPS Digital Media Extension. Этот параметр может использоваться только при генерации 64-битного кода и требует включения аппаратной поддержки плавающей точки.

-mips3d
-mno-mips3d

Использовать (не использовать) MIPS-3D ASE. См. Встроенные функции MIPS-3D. Параметр -mips3d подразумевает -mpaired-single.

-mmicromips
-mno-micromips

Генерировать (не генерировать) микроMIPS код.

Генерация микроMIPS кода также может контролироваться на уровне каждой функции с помощью micromips и nomicromips атрибутов. См. Атрибуты функций для получения дополнительной информации.

-mmt
-mno-mt

Использовать (не использовать) инструкции MT Multithreading.

-mmcu
-mno-mcu

Использовать (не использовать) инструкции MIPS MCU ASE.

-meva
-mno-eva

Использовать (не использовать) инструкции MIPS Enhanced Virtual Addressing.

-mvirt
-mno-virt

Использовать (не использовать) инструкции MIPS Virtualization (VZ).

-mxpa
-mno-xpa

Использовать (не использовать) инструкции MIPS eXtended Physical Address (XPA).

-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, когда в кэшах кода установлен бит запрета чтения. Она также полезна на процессорах, которые могут быть сконфигурированы для интерфейса двойной SRAM для инструкций/данных и которые, подобно M4K, автоматически перенаправляют PC-относительные загрузки в оперативную память инструкций.

-mcode-readable=no

Инструкции не должны обращаться к исполняемым разделам. Эта опция может быть полезна на целевых платформах, которые сконфигурированы для двойного интерфейса SRAM для инструкций/данных, но которые (в отличие от M4K) не автоматически перенаправляют PC-относительные загрузки в оперативную память инструкций.

-msplit-addresses
-mno-split-addresses

Включить (выключить) использование операторов перемещения %hi() и %lo() ассемблера. Эта опция устарела, но сохранена для обратной совместимости.

-mexplicit-relocs
-mno-explicit-relocs

Использовать (не использовать) операторы перемещения ассемблера при работе со символическими адресами. Альтернатива, выбранная опцией -mno-explicit-relocs, заключается в использовании макросов ассемблера вместо них.

-mexplicit-relocs является значением по умолчанию, если GCC был сконфигурирован для использования ассемблера, который поддерживает операторы перемещения.

-mcheck-zero-division
-mno-check-zero-division

Вызывать (не вызывать) ошибку при делении на ноль.

Значение по умолчанию — -mcheck-zero-division.

-mdivide-traps
-mdivide-breaks

Системы MIPS проверяют деление на ноль, генерируя либо условную ошибку, либо инструкцию break. Использование ошибок приводит к более компактному коду, но поддерживается только на MIPS II и более поздних версиях. Кроме того, некоторые версии ядра Linux имеют ошибку, которая препятствует генерации правильного сигнала (SIGFPE). Используйте -mdivide-traps, чтобы разрешить условные ошибки на архитектурах, которые их поддерживают, и -mdivide-breaks, чтобы принудительно использовать break.

Значение по умолчанию обычно -mdivide-traps, но это можно переопределить во время конфигурации, используя --with-divide=breaks. Проверки деления на ноль можно полностью отключить с помощью -mno-check-zero-division.

-mload-store-pairs
-mno-load-store-pairs

Включить (отключить) оптимизацию, которая объединяет последовательные инструкции загрузки или сохранения, чтобы включить связывание инструкций загрузки/сохранения. Эта опция включена по умолчанию, но срабатывает только тогда, когда выбранная архитектура, как известно, поддерживает связывание.

-mmemcpy
-mno-memcpy

Принудительно (не принудительно) использовать memcpy для нетривиальных блочных перемещений. Значение по умолчанию — -mno-memcpy, которое позволяет GCC вставлять большинство копий с постоянным размером.

-mlong-calls
-mno-long-calls

Отключить (не отключать) использование инструкции jal. Вызов функций с использованием jal более эффективен, но требует, чтобы вызывающая функция и функция-получатель находились в одном 256-мегабайтном сегменте.

Эта опция не влияет на код abicalls. Значение по умолчанию — -mno-long-calls.

-mmad
-mno-mad

Включить (выключить) использование инструкций mad, madu и mul, которые предоставляются ISA R4650.

-mimadd
-mno-imadd

Включить (выключить) использование целочисленных инструкций madd и msub. По умолчанию — -mimadd на архитектурах, которые поддерживают madd и msub, за исключением архитектуры 74k, где было установлено, что это приводит к более медленному коду.

-mfused-madd
-mno-fused-madd

Включить (выключить) использование инструкций умножения-суммирования с плавающей точкой, когда они доступны. Значение по умолчанию — -mfused-madd.

На процессоре R8000, когда используются инструкции умножения-суммирования, промежуточный продукт вычисляется с бесконечной точностью и не зависит от бита сброса к нулю в регистре FCSR. Это может быть нежелательно в некоторых ситуациях. На других процессорах результат численно идентичен эквивалентному вычислению с использованием отдельных инструкций умножения, сложения, вычитания и отрицания.

-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 и ранее.

Эта опция может быть использована только в том случае, если целевая архитектура поддерживает условные ветвления. -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, если вместо них доступны инструкции VR4130 macc, 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. Предполагается, что прерванные обращения к любому байту в следующих областях не имеют побочных эффектов:

  1. память, занимаемая текущей функцией стека;
  2. память, занимаемая входящим аргументом стека;
  3. память, занимаемая объектом с адресом, константным на этапе компоновки.

Ядро несет ответственность за обеспечение того, чтобы спекулятивные обращения к этим областям были действительно безопасны.

Если входная программа содержит объявление функции, такое как:

void foo (void);

то реализация foo должна позволять j foo и jal foo выполняться спекулятивно. GCC соблюдает это ограничение для функций, которые он компилирует сам. Он ожидает, что не-GCC функции (например, написанный вручную ассемблерный код) сделают то же самое.

У опции есть три формы:

-mr10k-cache-barrier=load-store

Вставить барьер кэша перед чтением или записью, которые могут быть выполнены спекулятивно и которые могут иметь побочные эффекты, даже если они прерваны.

-mr10k-cache-barrier=store

Вставить барьер кэша перед записью, которая может быть выполнена спекулятивно и которая может иметь побочные эффекты, даже если она прервана.

-mr10k-cache-barrier=none

Отключить вставку барьеров кэша. Это значение по умолчанию.

-mflush-func=func
-mno-flush-func

Указывает функцию для очистки кэшей I и D или указывает не вызывать такую функцию. Если вызвана, функция должна принимать те же аргументы, что и общая _flush_func, то есть адрес диапазона памяти, для которого очищается кэш, размер диапазона памяти и число 3 (для очистки обоих кэшей). Значение по умолчанию зависит от того, для какой цели была сконфигурирована GCC, но обычно это _flush_func или __cpu_flush.

mbranch-cost=num

Установить стоимость ветвления примерно в num «простых» инструкций. Эта стоимость является только эвристической и не гарантирует согласованных результатов между выпусками. Нулевая стоимость эквивалентна выбору значения по умолчанию, которое основано на настройке -mtune.

-mbranch-likely
-mno-branch-likely

Включить или отключить использование инструкций Branch Likely, независимо от значения по умолчанию для выбранной архитектуры. По умолчанию, инструкции Branch Likely могут быть сгенерированы, если они поддерживаются выбранной архитектурой. Исключение составляют архитектуры MIPS32 и MIPS64 и процессоры, которые реализуют эти архитектуры; для них инструкции Branch Likely по умолчанию не генерируются, потому что архитектуры MIPS32 и MIPS64 специально устаревают их использование.

-mcompact-branches=never
-mcompact-branches=optimal
-mcompact-branches=always

Эти опции управляют формой генерируемых ветвлений. По умолчанию используется -mcompact-branches=optimal.

Опция -mcompact-branches=never гарантирует, что компактные инструкции ветвления никогда не будут сгенерированы.

Опция -mcompact-branches=always гарантирует, что компактная инструкция ветвления будет сгенерирована, если она доступна. Если компактная инструкция ветвления недоступна, будет использована форма ветвления со слотом задержки.

Эта опция поддерживается начиная с MIPS Release 6.

Опция -mcompact-branches=optimal будет использовать ветвление со слотом задержки, если оно доступно в текущей ISA и слот задержки заполнен успешно. Если слот задержки не заполнен, будет выбран компактный переход, если он доступен.

-mfp-exceptions
-mno-fp-exceptions

Указывает, включены ли исключения FP. Это влияет на планирование инструкций FP для некоторых процессоров. По умолчанию исключения FP включены.

Например, на SB-1, если исключения FP отключены, и мы генерируем 64-битный код, то мы можем использовать оба конвейера FP. В противном случае мы можем использовать только один конвейер FP.

-mvr4130-align
-mno-vr4130-align

Конвейер VR4130 — двухканальный суперскалярный, но может выдавать две инструкции вместе только если первая выровнена по 8 байтам. При включении этой опции GCC выравнивает пары инструкций, которые, по его мнению, должны выполняться параллельно.

Эта опция действует только при оптимизации для VR4130. Она обычно ускоряет код, но за счёт увеличения его размера. Она включена по умолчанию на уровне оптимизации -O3.

-msynci
-mno-synci

Включить (выключить) генерацию инструкций synci на архитектурах, которые её поддерживают. Инструкции synci (если включены) генерируются при компиляции __builtin___clear_cache.

Эта опция по умолчанию -mno-synci, но значение по умолчанию может быть переопределено при конфигурировании GCC с --with-synci.

При компиляции кода для однопроцессорных систем использование synci обычно безопасно. Однако на многих многоядерных (SMP) системах это не приводит к аннулированию кэшей инструкций на всех ядрах и может привести к неопределённому поведению.

-mrelax-pic-calls
-mno-relax-pic-calls

Попробовать преобразовать вызовы PIC, которые обычно обрабатываются через регистр $25, в прямые вызовы. Это возможно только если компоновщик может разрешить пункт назначения во время компоновки и если пункт назначения находится в пределах диапазона для прямого вызова.

-mrelax-pic-calls является значением по умолчанию, если GCC был сконфигурирован для использования ассемблера и компоновщика, которые поддерживают директиву .reloc ассемблера и -mexplicit-relocs активна. С -mno-explicit-relocs эту оптимизацию может выполнять сам ассемблер и компоновщик без помощи компилятора.

-mmcount-ra-address
-mno-mcount-ra-address

Сгенерировать (не генерировать) код, который позволяет _mcount изменить адрес возврата вызывающей функции. При включении эта опция расширяет обычный интерфейс _mcount новым параметром ra-address, который имеет тип intptr_t * и передаётся в регистре $12. _mcount может изменить адрес возврата, выполнив оба следующих действия:

  • Возвращение нового адреса в регистре $31.
  • Запись нового адреса в *ra-address, если ra-address не равен нулю.

По умолчанию используется -mno-mcount-ra-address.

-mframe-header-opt
-mno-frame-header-opt

Включить (выключить) оптимизацию заголовка кадра в o32 ABI. При использовании o32 ABI вызывающие функции выделяют 16 байтов в стеке, чтобы вызываемая функция могла записать аргументы регистров. При включении этой оптимизации выделение заголовка кадра будет подавлено, если можно определить, что он не используется.

Эта оптимизация отключена по умолчанию на всех уровнях оптимизации.

-mlxc1-sxc1
-mno-lxc1-sxc1

Применительно к случаю, включить (выключить) генерацию инструкций lwxc1, swxc1, ldxc1, sdxc1. Включено по умолчанию.

-mmadd4
-mno-madd4

Применительно к случаю, включить (выключить) генерацию 4-операндных инструкций madd.s, madd.d и связанных с ними. Включено по умолчанию.

Далее: Опции MMIX, Предыдущее: Опции MicroBlaze, Вернуться: Опции подмодели [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/MIPS-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API