Spec-Zone.ru › GCC 6

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. В этом случае qNaN обозначаются первым битом их поля дробной части мантиссы, равным 1, а sNaN обозначаются первым битом их поля дробной части мантиссы, равным 0.

Значение по умолчанию — -mnan=legacy, если GCC не был настроен с помощью --with-nan=2008.

-mllsc
-mno-llsc

Использовать (не использовать) инструкции «ll», «sc» и «sync» для реализации встроенных атомарных функций памяти. Если ни один параметр не указан, GCC использует инструкции, если целевая архитектура их поддерживает.

-mllsc полезен, если среда выполнения может эмулировать инструкции, а -mno-llsc может быть полезен при компиляции для нестандартных ISA. Вы можете установить любой из параметров по умолчанию, настроив GCC с помощью --with-llsc и --without-llsc соответственно. --with-llsc является значением по умолчанию для некоторых конфигураций; см. документацию по установке для получения подробностей.

-mdsp
-mno-dsp

Использовать (не использовать) версию 1 расширения MIPS DSP ASE. См. Функции MIPS DSP. Этот параметр определяет препроцессорную макрокоманду __mips_dsp. Он также определяет __mips_dsp_rev как 1.

-mdspr2
-mno-dspr2

Использовать (не использовать) версию 2 расширения MIPS DSP ASE. См. Функции MIPS DSP. Этот параметр определяет препроцессорные макросы __mips_dsp и __mips_dspr2. Он также определяет __mips_dsp_rev как 2.

-msmartmips
-mno-smartmips

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

-mpaired-single
-mno-paired-single

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

-mdmx
-mno-mdmx

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

-mips3d
-mno-mips3d

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

-mmicromips
-mno-micromips

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

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

-mmt
-mno-mt

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

-mmcu
-mno-mcu

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

-meva
-mno-eva

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

-mvirt
-mno-virt

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

-mxpa
-mno-xpa

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

-mlong64

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

-mlong32

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

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

-msym32
-mno-sym32

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

-G num

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

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

-mlocal-sdata
-mno-local-sdata

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

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

-mextern-sdata
-mno-extern-sdata

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

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

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

-mgpopt
-mno-gpopt

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

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

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

-membedded-data
-mno-embedded-data

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

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

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

-mcode-readable=setting

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

-mcode-readable=yes

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

-mcode-readable=pcrel

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

-mcode-readable=no

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

-msplit-addresses
-mno-split-addresses

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

-mexplicit-relocs
-mno-explicit-relocs

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

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

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

Захватывать (не захватывать) при делении на ноль.

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

-mdivide-traps
-mdivide-breaks

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

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

-mmemcpy
-mno-memcpy

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

-mlong-calls
-mno-long-calls

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

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

-mmad
-mno-mad

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

-mimadd
-mno-imadd

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

-mfused-madd
-mno-fused-madd

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

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

-nocpp

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

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

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

-mfix-r4000
-mno-fix-r4000

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

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

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

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

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

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

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

-mfix-rm7000
-mno-fix-rm7000

Обход ошибок RM7000 dmult/dmultu. Обходы реализованы ассемблером, а не GCC.

-mfix-vr4120
-mno-fix-vr4120

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

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

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

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

-mfix-vr4130

Обход ошибок VR4130 mflo/mfhi. Обходные решения реализуются ассемблером, а не GCC, хотя GCC избегает использования mflo и mfhi, если инструкции 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=значение управляет реализацией 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 приведет к использованию ветвления с задержкой, если оно доступно в текущем наборе команд и задержка успешно заполняется. Если задержка не заполняется, будет выбран компактный переход, если он доступен.

-mfp-exceptions
-mno-fp-exceptions

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

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

-mvr4130-align
-mno-vr4130-align

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

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

-msynci
-mno-synci

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

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

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

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

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

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

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

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

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

Значение по умолчанию - -mno-mcount-ra-address.

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

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

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

Далее: Опции MMIX, Предыдущее: Опции MicroBlaze, Вверх: Опции подмодели [Оглавление][Индекс]

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

Spec-Zone.ru

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