Spec-Zone.ru › GCC 14

3.19.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 атрибутов. См. Объявление атрибутов функций для получения дополнительной информации.

-mmips16e2
-mno-mips16e2

Использовать (не использовать) ASE MIPS16e2. Этот параметр изменяет поведение параметра -mips16 таким образом, что он нацелен на ASE MIPS16e2.

-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
END_OF_DOCUMENT_MARKER

Генерировать код для данного ABI.

Обратите внимание, что EABI имеет 32-битную и 64-битную варианты. GCC обычно генерирует 64-битный код, когда вы выбираете 64-битную архитектуру, но вы можете использовать -mgp32, чтобы получить 32-битный код вместо этого.

Для получения информации об ABI O64 см. https://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 linker. Однако параметр не влияет на 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 только в том случае, когда один объектный файл обращается к большему количеству записей GOT, чем 64k. Очень немногие делают это.

Эти параметры не имеют эффекта, если 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 (qNaN) обозначаются битом 1 в старшем бите поля дробной части, а сигнализирующие NaN (sNaN) — битом 0 в старшем бите поля дробной части.

По умолчанию используется -mnan=legacy, если GCC не был сконфигурирован с --with-nan=2008.

-mllsc
-mno-llsc

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

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

-mdsp
-mno-dsp

Использовать (не использовать) ревизию 1 ASE MIPS DSP. См. MIPS DSP Встроенные функции. Этот параметр определяет препроцессорную макрос __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

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

-mpaired-single
-mno-paired-single

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

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

-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 бита.

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

-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, но сохранена для обратной совместимости.

-mexplicit-relocs=none
-mexplicit-relocs=base
-mexplicit-relocs=pcrel
-mexplicit-relocs
-mno-explicit-relocs

Эти опции управляют тем, используются ли явные перестановки (например, %gp_rel). Значение по умолчанию зависит от версии GAS при сборке самого GCC.

Поддержка base явных переместижений была введена в GAS в 2001 году. Поддержка pcrel явных переместижений была введена в GAS в 2014 году, которая поддерживает %pcrel_hi и %pcrel_lo.

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

Захватывать (не захватывать) ошибку целочисленного деления на ноль.

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

-mdivide-traps
-mdivide-breaks

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

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

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

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

-mstrict-align
-mno-strict-align
-munaligned-access
-mno-unaligned-access

Отключить (включить) прямой доступ к невыровненным данным для MIPS Release 6. MIPSr6 требует поддержки доступа к невыровненным данным, либо аппаратно, либо через перехват и эмуляцию. Поэтому может потребоваться -mstrict-align ядру. Опции -munaligned-access и -mno-unaligned-access устарели и поддерживаются только для обратной совместимости.

-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 пытается предсказать результат условного ветвления и спекулятивно выполняет инструкции из «взятого» ветвления. Позже он отменяет эти инструкции, если предсказанный результат неверен. Однако на 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 и выше. Если компактная инструкция ветвления недоступна (или это предшествующая R6 версия), вместо неё будет использована форма ветвления со слотом задержки.

Если используется для целей MIPS16/microMIPS, то сейчас она будет просто проигнорирована. Поведение для MIPS16/microMIPS может измениться в будущем, поскольку у них есть некоторые компактные инструкции ветвления.

Параметр -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 не равен null.

По умолчанию используется -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

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

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

Spec-Zone.ru

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