Spec-Zone.ru › GCC 11

Следующее: Параметры MMIX, Предыдущее: Параметры MicroBlaze, Вверх: Параметры зависящие от машины [Оглавление][Индекс]

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

-mflip-mips16

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

-minterlink-compressed
-mno-interlink-compressed

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

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

Весь код -mabicalls традиционно был независимым от позиции, независимо от параметров, таких как -fPIC и -fpic. Однако, как расширение, GNU инструмент позволяет исполняемым файлам использовать абсолютные обращения к локально связанным символам. Он также может использовать более короткие последовательности инициализации 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 меньше примерно 64 кБ. Всё больше приводит к тому, что компоновщик выдаёт ошибку, например:

relocation truncated to fit: R_MIPS_GOT16 foobar

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

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

Эти параметры не имеют эффекта, если GCC не генерирует независимый от позиции код.

-mgp32

Предполагать, что регистры общего назначения имеют ширину 32 бита.

-mgp64

Предполагать, что регистры общего назначения имеют ширину 64 бита.

-mfp32

Предполагать, что регистры с плавающей запятой имеют ширину 32 бита.

-mfp64

Предполагать, что регистры с плавающей запятой имеют ширину 64 бита.

-mfpxx

Не предполагать ширину регистров с плавающей запятой.

-mhard-float

Использовать инструкции сопроцессора с плавающей запятой.

-msoft-float

Не использовать инструкции сопроцессора с плавающей запятой. Реализовать вычисления с плавающей запятой с помощью вызовов библиотеки вместо этого.

-mno-float

Эквивалентно -msoft-float, но дополнительно утверждает, что программа, которую компилируют, не выполняет никаких операций с плавающей запятой. В настоящее время этот параметр поддерживается только некоторыми конфигурациями MIPS для bare-metal, где он может выбрать специальный набор библиотек, лишенных всей поддержки плавающей запятой (включая, например, форматы плавающей запятой printf). Если код, скомпилированный с -mno-float, случайно содержит операции с плавающей запятой, он, вероятно, потерпит неудачу при компоновке или запуске.

-msingle-float

Предполагать, что сопроцессор с плавающей запятой поддерживает только операции с одинарной точностью.

-mdouble-float

Предполагать, что сопроцессор с плавающей запятой поддерживает операции с двойной точностью. Это значение по умолчанию.

-modd-spreg
-mno-odd-spreg

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

Параметр -mnan=2008 выбирает кодирование IEEE 754-2008. В этом случае тихие NaN (qNaN) обозначаются единичным первым битом в поле значащих цифр, а сигнализирующие NaN (sNaN) обозначаются нулевым первым битом в поле значащих цифр.

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

-mllsc
-mno-llsc

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

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

-mdsp
-mno-dsp

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

-mdspr2
-mno-dspr2

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

-msmartmips
-mno-smartmips

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

-mpaired-single
-mno-paired-single

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

-mdmx
-mno-mdmx

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

-mips3d
-mno-mips3d

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

-mmicromips
-mno-micromips

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

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

-mmt
-mno-mt

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

-mmcu
-mno-mcu

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

-meva
-mno-eva

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

-mvirt
-mno-virt

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

-mxpa
-mno-xpa

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

-mcrc
-mno-crc

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

-mginv
-mno-ginv

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

-mloongson-mmi
-mno-loongson-mmi

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

-mloongson-ext
-mno-loongson-ext

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

-mloongson-ext2
-mno-loongson-ext2

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

-mlong64

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

-mlong32

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

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

-msym32
-mno-sym32

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

-G num

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

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

-mlocal-sdata
-mno-local-sdata

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

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

-mextern-sdata
-mno-extern-sdata

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

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

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

-mgpopt
-mno-gpopt

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

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

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

-membedded-data
-mno-embedded-data

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

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

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

-mcode-readable=setting

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

-mcode-readable=yes

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

-mcode-readable=pcrel

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

-mcode-readable=no

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

-msplit-addresses
-mno-split-addresses

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

-mexplicit-relocs
-mno-explicit-relocs

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

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

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

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

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

-mdivide-traps
-mdivide-breaks

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

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

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

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

-mmemcpy
-mno-memcpy

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

-mlong-calls
-mno-long-calls

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

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

-mmad
-mno-mad

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

-mimadd
-mno-imadd

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

-mfused-madd
-mno-fused-madd

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

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

-nocpp

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

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

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

-mfix-r4000
-mno-fix-r4000

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

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

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

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

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

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

Этот параметр может быть использован только если целевая архитектура поддерживает инструкции 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

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

-mr10k-cache-barrier=setting

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

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

Эта проблема затрагивает только сохранения ядра и, в зависимости от системы, загрузки ядра. Например, спекулятивно выполненное сохранение может загрузить целевую память в кэш и пометить строку кэша как грязную, даже если само сохранение позже прервано. Если операция DMA записывает в ту же область памяти перед тем, как «грязная» строка будет вытеснена, кэшированные данные перезапишут данные DMA. См. руководство по процессору R10K для полного описания, включая другие возможные проблемы.

Одним из способов решения этой проблемы является вставка инструкций барьера кэша перед каждым обращением к памяти, которое может быть спекулятивно выполнено и может иметь побочные эффекты даже если оно прервано. -mr10k-cache-barrier=setting управляет реализацией GCC этого обходного пути. Предполагается, что прерванные обращения к любому байту в следующих областях не имеют побочных эффектов:

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

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

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

void foo (void);

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

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

-mr10k-cache-barrier=load-store

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

-mr10k-cache-barrier=store

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

-mr10k-cache-barrier=none

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

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

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

mbranch-cost=num

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

-mbranch-likely
-mno-branch-likely

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

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

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

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

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

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

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

-mfp-exceptions
-mno-fp-exceptions

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

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

-mvr4130-align
-mno-vr4130-align

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

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

-msynci
-mno-synci

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

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

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

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

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

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

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

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

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

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

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

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

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

-mlxc1-sxc1
-mno-lxc1-sxc1

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

-mmadd4
-mno-madd4

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

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

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

Spec-Zone.ru

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