Spec-Zone.ru › GCC 9

3.18.28 Опции MIPS

-EB

Генерировать код в формате big-endian.

-EL

Генерировать код в формате little-endian. По умолчанию используется для конфигураций ‘mips*el-*-*’.

-march=arch

Генерировать код, который будет выполняться на архитектуре arch, которая может быть именем универсальной ISA MIPS или именем конкретного процессора. Имена ISA: ‘mips1’, ‘mips2’, ‘mips3’, ‘mips4’, ‘mips32’, ‘mips32r2’, ‘mips32r3’, ‘mips32r5’, ‘mips32r6’, ‘mips64’, ‘mips64r2’, ‘mips64r3’, ‘mips64r5’ и ‘mips64r6’. Имена процессоров: ‘4kc’, ‘4km’, ‘4kp’, ‘4ksc’, ‘4kec’, ‘4kem’, ‘4kep’, ‘4ksd’, ‘5kc’, ‘5kf’, ‘20kc’, ‘24kc’, ‘24kf2_1’, ‘24kf1_1’, ‘24kec’, ‘24kef2_1’, ‘24kef1_1’, ‘34kc’, ‘34kf2_1’, ‘34kf1_1’, ‘34kn’, ‘74kc’, ‘74kf2_1’, ‘74kf1_1’, ‘74kf3_2’, ‘1004kc’, ‘1004kf2_1’, ‘1004kf1_1’, ‘i6400’, ‘i6500’, ‘interaptiv’, ‘loongson2e’, ‘loongson2f’, ‘loongson3a’, ‘gs464’, ‘gs464e’, ‘gs264e’, ‘m4k’, ‘m14k’, ‘m14kc’, ‘m14ke’, ‘m14kec’, ‘m5100’, ‘m5101’, ‘octeon’, ‘octeon+’, ‘octeon2’, ‘octeon3’, ‘orion’, ‘p5600’, ‘p6600’, ‘r2000’, ‘r3000’, ‘r3900’, ‘r4000’, ‘r4400’, ‘r4600’, ‘r4650’, ‘r4700’, ‘r5900’, ‘r6000’, ‘r8000’, ‘rm7000’, ‘rm9000’, ‘r10000’, ‘r12000’, ‘r14000’, ‘r16000’, ‘sb1’, ‘sr71000’, ‘vr4100’, ‘vr4111’, ‘vr4120’, ‘vr4130’, ‘vr4300’, ‘vr5000’, ‘vr5400’, ‘vr5500’, ‘xlr’ и ‘xlp’. Специальное значение ‘from-abi’ выбирает наиболее совместимую архитектуру для выбранного ABI (то есть ‘mips1’ для 32-битных ABI и ‘mips3’ для 64-битных ABI).

Нативный инструмент Linux/GNU также поддерживает значение ‘native’, которое выбирает наилучший вариант архитектуры для процессора хоста. -march=native не имеет эффекта, если GCC не распознаёт процессор.

В именах процессоров окончание ‘000’ может быть сокращено до ‘k’ (например, -march=r2k). Префиксы необязательны, и ‘vr’ может быть записано как ‘r’.

Имена вида ‘nf2_1’ относятся к процессорам с FPU, работающими с частотой в половину от частоты ядра, имена вида ‘nf1_1’ — к процессорам с FPU, работающими с той же частотой, что и ядро, а имена вида ‘nf3_2’ — к процессорам с FPU, работающими с соотношением частот 3:2 по отношению к ядру. Из соображений совместимости ‘nf’ принимается как синоним ‘nf2_1’, а ‘nx’ и ‘bfx’ — как синонимы для ‘nf1_1’.

GCC определяет две макросы, основанные на значении этого параметра. Первая — _MIPS_ARCH, которая даёт имя целевой архитектуры в виде строки. Вторая имеет вид _MIPS_ARCH_foo, где foo — заглавное значение _MIPS_ARCH. Например, -march=r2000 устанавливает _MIPS_ARCH в "r2000" и определяет макрос _MIPS_ARCH_R2000.

Обратите внимание, что макрос _MIPS_ARCH использует имена процессоров, перечисленные выше. Другими словами, он имеет полный префикс и не сокращает ‘000’ до ‘k’. В случае ‘from-abi’ макрос называет разрешённую архитектуру (либо "mips1" или "mips3"). Он называет архитектуру по умолчанию, когда опция -march не задана.

-mtune=arch

Оптимизировать для arch. Среди прочего, этот параметр контролирует способ планирования инструкций и предполагаемую стоимость арифметических операций. Список значений arch совпадает со списком для -march.

Если эта опция не используется, GCC оптимизирует для процессора, указанного в -march. Используя -march и -mtune вместе, можно сгенерировать код, который работает на семействе процессоров, но оптимизировать код для конкретного члена этого семейства.

-mtune определяет макросы _MIPS_TUNE и _MIPS_TUNE_foo, которые работают так же, как и макросы для -march, описанные выше.

-mips1

Эквивалентно -march=mips1.

-mips2

Эквивалентно -march=mips2.

-mips3

Эквивалентно -march=mips3.

-mips4

Эквивалентно -march=mips4.

-mips32

Эквивалентно -march=mips32.

-mips32r3

Эквивалентно -march=mips32r3.

-mips32r5

Эквивалентно -march=mips32r5.

-mips32r6

Эквивалентно -march=mips32r6.

-mips64

Эквивалентно -march=mips64.

-mips64r2

Эквивалентно -march=mips64r2.

-mips64r3

Эквивалентно -march=mips64r3.

-mips64r5

Эквивалентно -march=mips64r5.

-mips64r6

Эквивалентно -march=mips64r6.

-mips16
-mno-mips16

Генерировать (не генерировать) код MIPS16. Если GCC нацелен на архитектуру MIPS32 или MIPS64, он использует ASE MIPS16e.

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

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

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

-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 (VZ).

-mxpa
-mno-xpa

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

-mcrc
-mno-crc

Использовать (не использовать) инструкции MIPS Cyclic Redundancy Check (CRC).

-mginv
-mno-ginv

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

-mloongson-mmi
-mno-loongson-mmi

Использовать (не использовать) инструкции MIPS Loongson MultiMedia extensions (MMI).

-mloongson-ext
-mno-loongson-ext

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

-mloongson-ext2
-mno-loongson-ext2

Использовать (не использовать) инструкции MIPS Loongson EXTensions r2 (EXT2).

-mlong64

Принудительно long типы должны иметь ширину 64 бита. См. -mlong32 для объяснения значения по умолчанию и способа определения размера указателя.

-mlong32

Принудительно установить размер типов long, int, и указателей в 32 бита.

По умолчанию размер ints, longs и указателей зависит от ABI. Все поддерживаемые ABI используют 32-битные ints. ABI n64 и 64-битный EABI используют 64-битные longs; остальные — 32-битные longs. Размер указателей совпадает с размером longs или с размером регистров целых чисел, в зависимости от того, какой меньше.

-msym32
-mno-sym32

Предполагать (не предполагать), что все символы имеют 32-битное значение независимо от выбранного ABI. Этот параметр полезен в сочетании с -mabi=64 и -mno-abicalls, поскольку он позволяет GCC генерировать более короткие и быстрые ссылки на символические адреса.

-G num

Размещать определения внешне видимых данных в небольшой секции данных, если размер этих данных не превышает num байт. GCC может затем генерировать более эффективный доступ к данным; см. -mgpopt для получения подробностей.

Значение параметра -G по умолчанию зависит от конфигурации.

-mlocal-sdata
-mno-local-sdata

Расширять (не расширять) поведение -G на локальные данные, такие как статические переменные в C. -mlocal-sdata является значением по умолчанию для всех конфигураций.

Если компоновщик жалуется, что приложение использует слишком много данных в небольшой секции, вы можете попробовать перестроить менее критически важные части с помощью -mno-local-sdata. Вы также можете скомпилировать большие библиотеки с -mno-local-sdata, чтобы освободить больше места для основной программы.

-mextern-sdata
-mno-extern-sdata

Предполагать (не предполагать), что внешне определённые данные находятся в небольшой секции данных, если их размер находится в пределах ограничения -G. -mextern-sdata является значением по умолчанию для всех конфигураций.

Если вы компилируете модуль Mod с -mextern-sdata -G num -mgpopt, и Mod ссылается на переменную Var, размер которой не превышает num байт, вы должны убедиться, что Var размещена в небольшой секции данных. Если Var определена другим модулем, вы должны либо скомпилировать этот модуль с достаточно высоким значением -G, либо добавить атрибут section к определению Var. Если Var является общей, вы должны слинковать приложение с достаточно высоким значением -G.

Самый простой способ удовлетворить этим ограничениям — скомпилировать и слинковать каждый модуль с тем же параметром -G. Однако, вы можете захотеть создать библиотеку, которая поддерживает несколько различных пределов для небольшой секции данных. Вы можете сделать это, скомпилировав библиотеку с самым высоким поддерживаемым значением -G и дополнительно используя -mno-extern-sdata, чтобы библиотека не делала предположений о внешне определённых данных.

-mgpopt
-mno-gpopt

Использовать (не использовать) GP-относительные обращения к символам, которые известны как находящиеся в небольшой секции данных; см. -G, -mlocal-sdata и -mextern-sdata. -mgpopt является значением по умолчанию для всех конфигураций.

-mno-gpopt полезно в тех случаях, когда регистр $gp может не содержать значение _gp. Например, если код является частью библиотеки, которая может быть использована в мониторе загрузки, программы, вызывающие процедуры монитора загрузки, передают неизвестное значение в $gp. (В таких ситуациях сам монитор загрузки обычно компилируется с -G0.)

-mno-gpopt подразумевает -mno-local-sdata и -mno-extern-sdata.

-membedded-data
-mno-embedded-data

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

-muninit-const-in-rodata
-mno-uninit-const-in-rodata

Размещать неинициализированные const переменные в разделе только для чтения. Этот параметр имеет смысл только в сочетании с -membedded-data.

-mcode-readable=setting

Указывает, может ли GCC генерировать код, который считывает данные из секций исполняемого кода. Существует три возможных значения:

-mcode-readable=yes

Инструкции могут свободно обращаться к секциям исполняемого кода. Это значение по умолчанию.

-mcode-readable=pcrel

Инструкции MIPS16 PC-относительного загрузки могут обращаться к секциям исполняемого кода, но другие инструкции не должны этого делать. Этот параметр полезен на процессорах 4KSc и 4KSd, когда кэши кода имеют установленный бит «Запрет чтения». Он также полезен на процессорах, которые могут быть настроены с двойным интерфейсом памяти инструкций/данных и которые, подобно M4K, автоматически перенаправляют PC-относительные загрузки в оперативную память инструкций.

-mcode-readable=no

Инструкции не должны обращаться к секциям исполняемого кода. Этот параметр может быть полезен на целевых устройствах, которые настроены с двойным интерфейсом памяти инструкций/данных, но которые (в отличие от 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, чтобы принудительно использовать ошибки.

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

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

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

-mmemcpy
-mno-memcpy

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

-mlong-calls
-mno-long-calls

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

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

-mmad
-mno-mad

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

-mimadd
-mno-imadd

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

-mfused-madd
-mno-fused-madd

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

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

-nocpp

Указать ассемблеру MIPS не запускать его препроцессор над пользовательскими файлами ассемблера (с суффиксом «.s») при их сборке.

-mfix-24k
-mno-fix-24k

Решение проблемы 24K E48 (потеря данных при сохранении во время перезагрузки). Решения внедряются ассемблером, а не GCC.

-mfix-r4000
-mno-fix-r4000

Решение определённых ошибок процессора R4000:

  • - Двойное слово или сдвиг переменной может дать неверный результат, если выполняется сразу после запуска целочисленного деления.
  • - Двойное слово или сдвиг переменной может дать неверный результат, если выполняется во время выполнения целочисленного умножения.
  • - Целочисленное деление может дать неверный результат, если начато в слоте задержки взятого ветвления или перехода.
-mfix-r4400
-mno-fix-r4400

Решение определённых ошибок процессора R4400:

  • - Двойное слово или сдвиг переменной может дать неверный результат, если выполняется сразу после запуска целочисленного деления.
-mfix-r10000
-mno-fix-r10000

Решение некоторых проблем R10000:

  • - Последовательности ll/sc могут не работать атомарно на версиях до 3.0. Они могут привести к тупику на версиях 2.6 и ранее.

Этот параметр может быть использован только если целевая архитектура поддерживает инструкции branch-likely. -mfix-r10000 по умолчанию, когда используется -march=r10000; -mno-fix-r10000 — в противном случае.

-mfix-r5900
-mno-fix-r5900

Не пытаться запланировать предшествующую инструкцию в слот ожидания инструкции перехода, помещенной в конце короткой петли из шести и менее инструкций, и всегда планировать инструкцию nop вместо этого. Баг с короткой петлей в определенных условиях приводит к тому, что петли выполняются только один или два раза из-за аппаратного сбоя в чипе R5900. Обходное решение реализуется ассемблером, а не GCC.

-mfix-rm7000
-mno-fix-rm7000

Обходное решение для проблем RM7000 dmult/dmultu. Обходные решения реализуются ассемблером, а не GCC.

-mfix-vr4120
-mno-fix-vr4120

Решение некоторых проблем VR4120:

  • - dmultu не всегда производит правильный результат.
  • - div и ddiv не всегда производят правильный результат, если один из операндов отрицательный.

Обходные решения для ошибок деления полагаются на специальные функции в libgcc.a. В настоящее время эти функции предоставляются только конфигурациями mips64vr*-elf.

Другие ошибки VR4120 требуют вставки NOP между определенными парами инструкций. Эти ошибки обрабатываются ассемблером, а не самим GCC.

-mfix-vr4130

Обходное решение для проблем VR4130 mflo/mfhi . Обходные решения реализуются ассемблером, а не GCC, хотя GCC избегает использования mflo и mfhi, если инструкции VR4130 macc, macchi, dmacc и dmacchi доступны вместо этого.

-mfix-sb1
-mno-fix-sb1

Обходное решение для некоторых ошибок процессорного ядра SB-1. (Этот флаг в настоящее время обходит ошибки с плавающей точкой SB-1 версии 2 “F1” и “F2”).

-mr10k-cache-barrier=setting

Указывает, должен ли GCC вставлять барьеры кэша, чтобы избежать побочных эффектов спекуляции на процессорах R10K.

Как и многие процессоры, R10K пытается предсказать результат условного перехода и спекулятивно выполняет инструкции из ветви “taken”. Позже он отменяет эти инструкции, если предсказанный результат неверный. Однако на R10K даже отмененные инструкции могут иметь побочные эффекты.

Эта проблема затрагивает только ядра для сохранения (kernel stores) и, в зависимости от системы, ядра для загрузки (kernel loads). Например, спекулятивно выполненное сохранение может загрузить целевую память в кэш и пометить строку кэша как грязную, даже если само сохранение позже отменяется. Если операция 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-9.5.0/gcc/MIPS-Options.html

Spec-Zone.ru

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