Spec-Zone.ru › GCC 15

3.20.29 Опции MIPS

-EB

Генерировать код с прямым порядком байтов (big-endian).

-EL

Генерировать код с обратным порядком байтов (little-endian). Это значение по умолчанию для конфигураций «mips*el-*-*».

-march=arch

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

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

-mflip-mips16

Генерировать код MIPS16 для чередующихся функций. Эта опция предназначена для регрессионного тестирования совместной генерации кода MIPS16 и не-MIPS16 и не рекомендуется для обычного использования при компиляции пользовательского кода.

-minterlink-compressed
-mno-interlink-compressed

Требовать (или не требовать), чтобы код, использующий стандартный (несжатый) набор инструкций MIPS, был совместим при компоновке с кодом MIPS16 и microMIPS, и наоборот.

Например, код, использующий стандартную кодировку инструкций, не может напрямую переходить (jump) к коду 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-битный код.

Информацию об O64 ABI см. на странице https://gcc.gnu.org/projects/mipso64-abi.html.

GCC поддерживает вариант o32 ABI, в котором регистры чисел с плавающей точкой имеют ширину 64 бита, а не 32 бита. Вы можете выбрать эту комбинацию с помощью -mabi=32 -mfp64. Этот ABI опирается на инструкции mthc1 и mfhc1 и поэтому поддерживается только для процессоров MIPS32R2, MIPS32R3 и MIPS32R5.

Назначение регистров для аргументов и возвращаемых значений остается прежним, но каждое скалярное значение передается в одном 64-битном регистре, а не в паре 32-битных регистров. Например, скалярные значения с плавающей точкой возвращаются только в регистре «$f0», а не в паре «$f0»/«$f1». Набор сохраняемых при вызове регистров также остается прежним: сохраняются чётные регистры двойной точности.

Для обеспечения перехода от 32-битных регистров к 64-битным поддерживаются еще два варианта o32 ABI: FPXX (-mfpxx) и FP64A (-mfp64 -mno-odd-spreg). Расширение FPXX требует, чтобы весь код выполнялся корректно как при использовании 32-битных, так и 64-битных регистров. Этот код может компоноваться либо с FP32, либо с FP64, но не с тем и другим одновременно. Расширение FP64A похоже на расширение FP64, но запрещает использование нечетных регистров одинарной точности. Его можно использовать в сочетании с режимом FRE процессоров MIPS32R5, что позволяет объединять и выполнять код FP32 и FP64A в рамках одного процесса без изменения режимов FPU.

-mabicalls
-mno-abicalls

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

-mshared
-mno-shared

Генерировать (или не генерировать) код, который полностью независим от позиции (position-independent) и поэтому может быть скомпонован в разделяемые библиотеки. Эта опция влияет только на -mabicalls.

Традиционно весь код -mabicalls не зависел от позиции, независимо от таких опций, как -fPIC и -fpic. Однако в качестве расширения цепочка инструментов GNU позволяет исполняемым файлам использовать абсолютные обращения к локально связываемым символам. Она также может использовать более короткие последовательности инициализации GP и генерировать прямые вызовы локально определенных функций. Этот режим выбирается с помощью -mno-shared.

Опция -mno-shared требует наличия binutils версии 2.16 или выше и генерирует объекты, которые могут компоноваться только компоновщиком GNU. Тем не менее, эта опция не влияет на ABI конечного исполняемого файла; она влияет только на ABI перемещаемых объектов. Использование -mno-shared обычно делает исполняемые файлы меньше и быстрее.

По умолчанию используется -mshared.

-mplt
-mno-plt

Предполагать (или не предполагать), что статический и динамический компоновщики поддерживают PLT и копирование перемещений (copy relocations). Эта опция влияет только на -mno-shared -mabicalls. Для ABI n64 эта опция не имеет эффекта без -msym32.

Вы можете сделать -mplt вариантом по умолчанию, настроив GCC с помощью параметра --with-mips-plt. В противном случае по умолчанию используется -mno-plt.

-mxgot
-mno-xgot

Снять (или не снимать) обычные ограничения на размер таблицы глобального смещения (GOT).

GCC обычно использует одну инструкцию для загрузки значений из GOT. Хотя это относительно эффективно, это работает только в том случае, если GOT меньше примерно 64 КБ. При большем размере компоновщик выдает ошибку вида:

relocation truncated to fit: R_MIPS_GOT16 foobar

Если это произошло, вам следует перекомпилировать код с опцией -mxgot. Это работает с очень большими GOT, хотя такой код менее эффективен, так как для получения значения глобального символа требуются три инструкции.

Обратите внимание, что некоторые компоновщики могут создавать несколько таблиц GOT. Если вы используете такой компоновщик, вам понадобится применять -mxgot только тогда, когда один объектный файл обращается к записям GOT суммарным объемом более 64 КБ. Очень немногие файлы делают это.

Эти опции не оказывают никакого влияния, если 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 выбирается устаревшая обработка (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

Использовать (или не использовать) спаренные скалярные инструкции с плавающей точкой (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

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

Генерацией кода microMIPS также можно управлять для отдельных функций с помощью атрибутов micromips и nomicromips. Дополнительную информацию см. в разделе Объявление атрибутов функций.

-mmt
-mno-mt

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

-mmcu
-mno-mcu

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

-meva
-mno-eva

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

-mvirt
-mno-virt

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

-mxpa
-mno-xpa

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

-mcrc
-mno-crc

Использовать (или не использовать) инструкции циклического избыточного кода MIPS (CRC).

-mginv
-mno-ginv

Использовать (или не использовать) инструкции глобальной инвалидации MIPS (GINV).

-mloongson-mmi
-mno-loongson-mmi

Использовать (или не использовать) мультимедийные расширения MIPS Loongson (MMI).

-mloongson-ext
-mno-loongson-ext

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

-mloongson-ext2
-mno-loongson-ext2

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

-mlong64

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

-mlong32

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

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

-msym32
-mno-sym32

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

-G num

Помещать определения видимых извне данных в секцию малых данных (small data section), если размер этих данных не превышает 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 является общей (common), вы должны скомпоновать приложение с достаточно большим значением -G.

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

-mgpopt
-mno-gpopt

Использовать (или не использовать) обращения относительно регистра GP (GP-relative) для символов, которые, как известно, находятся в секции малых данных; см. -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

Выделять переменные сначала в секцию данных только для чтения, если это возможно, затем в секцию малых данных, если это возможно, и в противном случае — в обычную секцию данных. Это дает чуть более медленный код по сравнению с поведением по умолчанию, но уменьшает объем ОЗУ, необходимый при выполнении, и поэтому может быть предпочтительно для некоторых встроенных (embedded) систем.

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

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

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

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

-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. По умолчанию на архитектурах, поддерживающих madd и msub, используется -mimadd, за исключением архитектуры 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 и более ранних они могут приводить к взаимной блокировке.

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

-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

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

-mbranch-cost=num

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

-mbranch-likely
-mno-branch-likely

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

Включает (отключает) оптимизацию заголовка кадра в ABI o32. При использовании ABI o32 вызывающие функции выделяют в стеке 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-15.3.0/gcc/MIPS-Options.html

Spec-Zone.ru

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