3.19.30 Параметры MIPS
-EB-
Генерировать код в формате big-endian.
-EL-
Генерировать код в формате little-endian. Это значение по умолчанию для конфигураций ‘mips*el-*-*’.
-march=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-
Оптимизировать для архитектуры. Среди прочего, этот параметр управляет планированием инструкций и предполагаемой стоимостью арифметических операций. Список значений архитектуры такой же, как и для -march.
Если этот параметр не используется, GCC оптимизирует для процессора, указанного параметром -march. Используя -march и -mtune вместе, можно сгенерировать код, который работает на семействе процессоров, но оптимизировать код для конкретного члена этого семейства.
-mtune определяет макросы
_MIPS_TUNEи_MIPS_TUNE_foo, которые работают так же, как и макросы -march, описанные выше. -mips1-
Эквивалентно -march=mips1.
-mips2-
Эквивалентно -march=mips2.
-mips3-
Эквивалентно -march=mips3.
-mips4-
Эквивалентно -march=mips4.
-mips32-
Эквивалентно -march=mips32.
-mips32r3-
Эквивалентно -march=mips32r3.
-mips32r5-
Эквивалентно -march=mips32r5.
-mips32r6-
Эквивалентно -march=mips32r6.
-mips64-
Эквивалентно -march=mips64.
-mips64r2-
Эквивалентно -march=mips64r2.
-mips64r3-
Эквивалентно -march=mips64r3.
-mips64r5-
Эквивалентно -march=mips64r5.
-mips64r6-
Эквивалентно -march=mips64r6.
-mips16-mno-mips16-
Генерировать (не генерировать) код MIPS16. Если GCC нацелен на архитектуру MIPS32 или MIPS64, он использует ASE MIPS16e.
Генерацию кода MIPS16 также можно контролировать на уровне каждой функции с помощью
mips16иnomips16атрибутов. См. Атрибуты функций для получения дополнительной информации. -mflip-mips16-
Генерировать код MIPS16 для чередующихся функций. Этот параметр предоставляется для тестирования регрессии смешанного кода MIPS16/не-MIPS16, и не предназначен для обычного использования при компиляции пользовательского кода.
-minterlink-compressed-mno-interlink-compressed-
Требовать (не требовать), чтобы код, использующий стандартную (нескомпрессированную) архитектуру MIPS, был совместим с кодом MIPS16 и microMIPS, и наоборот.
Например, код, использующий стандартное кодирование ISA, не может напрямую переходить к коду MIPS16 или microMIPS; он должен использовать вызов или косвенный переход. -minterlink-compressed поэтому отключает прямые переходы, если GCC не знает, что цель перехода не сжата.
-minterlink-mips16-mno-interlink-mips16-
Псевдонимы -minterlink-compressed и -mno-interlink-compressed. Эти параметры появились до появления ASE microMIPS и сохранены для обратной совместимости.
-mabi=32-mabi=o64-mabi=n32-mabi=64-mabi=eabi-
Генерировать код для данного ABI.
Обратите внимание, что EABI имеет 32-битную и 64-битную разновидности. GCC обычно генерирует 64-битный код при выборе 64-битной архитектуры, но вы можете использовать -mgp32, чтобы получить 32-битный код вместо этого.
Для получения информации об ABI O64 см. 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, но запрещает использование регистров одинарной точности с нечетными номерами. Это можно использовать в сочетании с режимом
FREFPU в процессорах 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-
Предполагать (не предполагать), что статический и динамический линковщики поддерживают PLTs и копирование релокаций. Этот параметр влияет только на -mno-shared -mabicalls. Для n64 ABI этот параметр не имеет эффекта без -msym32.
Вы можете сделать -mplt значением по умолчанию, настроив GCC с помощью --with-mips-plt. В противном случае значение по умолчанию — -mno-plt.
-mxgot-mno-xgot-
Поднимать (не поднимать) обычные ограничения на размер таблицы глобальных смещений.
GCC обычно использует одну инструкцию для загрузки значений из GOT. Хотя это относительно эффективно, оно работает только если GOT меньше примерно 64к. Любой больший размер заставляет линковщик сообщать об ошибке, такой как:
relocation truncated to fit: R_MIPS_GOT16 foobar
Если это произойдёт, вы должны перекомпилировать свой код с -mxgot. Это работает с очень большими GOT, хотя код также менее эффективен, так как требуется три инструкции для извлечения значения глобального символа.
Обратите внимание, что некоторые линковщики могут создавать несколько GOT. Если у вас такой линковщик, вам нужно использовать -mxgot только тогда, когда один файл объекта обращается к большему количеству, чем 64к записей GOT. Очень немногие из них делают это.
Эти параметры не имеют эффекта, если GCC не генерирует код, независимый от позиции.
-mgp32-
Предполагать, что регистры общего назначения имеют ширину 32 бита.
-mgp64-
Предполагать, что регистры общего назначения имеют ширину 64 бита.
-mfp32-
Предполагать, что регистры с плавающей точкой имеют ширину 32 бита.
-mfp64-
Предполагать, что регистры с плавающей точкой имеют ширину 64 бита.
-mfpxx-
Не предполагать ширину регистров с плавающей точкой.
-mhard-float-
Использовать инструкции сопроцессора с плавающей точкой.
-msoft-float-
Не использовать инструкции сопроцессора с плавающей точкой. Реализовывать вычисления с плавающей точкой с помощью вызовов библиотек вместо этого.
-mno-float-
Эквивалентно -msoft-float, но дополнительно утверждает, что программа, которая компилируется, не выполняет никаких операций с плавающей точкой. Этот параметр в настоящее время поддерживается только некоторыми конфигурациями MIPS для bare-metal, где он может выбрать специальный набор библиотек, в которых отсутствует вся поддержка плавающей точки (включая, например, форматы плавающей точки
printf).Если код, скомпилированный с -mno-float, случайно содержит операции с плавающей точкой, он, вероятно, потерпит неудачу во время линковки или выполнения.
-msingle-float-
Предполагать, что сопроцессор с плавающей точкой поддерживает только операции с одинарной точностью.
-mdouble-float-
Предполагать, что сопроцессор с плавающей точкой поддерживает операции с двойной точностью. Это значение по умолчанию.
-modd-spreg-mno-odd-spreg-
Включить использование регистров с плавающей точкой одинарной точности с нечётными номерами для o32 ABI. Это значение по умолчанию для процессоров, которые, как известно, поддерживают эти регистры. При использовании ABI FPXX o32, -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 расширения MIPS DSP ASE. См. Функции MIPS DSP. Этот параметр определяет макрос препроцессора
__mips_dsp. Он также определяет__mips_dsp_revкак 1. -mdspr2-mno-dspr2-
Использовать (не использовать) версию 2 расширения MIPS DSP ASE. См. Функции MIPS DSP. Этот параметр определяет макросы препроцессора
__mips_dspи__mips_dspr2. Он также определяет__mips_dsp_revкак 2. -msmartmips-mno-smartmips-
Использовать (не использовать) расширение MIPS SmartMIPS ASE.
-mpaired-single-mno-paired-single-
Использовать (не использовать) инструкции с плавающей точкой парного типа. См. Поддержка MIPS парного типа. Этот параметр требует включения аппаратной поддержки плавающей точки.
-mdmx-mno-mdmx-
Использовать (не использовать) инструкции расширения MIPS Digital Media. Этот параметр может быть использован только при генерации 64-битного кода и требует включения аппаратной поддержки плавающей точки.
-mips3d-mno-mips3d-
Использовать (не использовать) расширение MIPS-3D ASE. См. Встроенные функции MIPS-3D. Параметр -mips3d подразумевает -mpaired-single.
-mmicromips-mno-micromips-
Генерировать (не генерировать) код microMIPS.
Генерация кода microMIPS также может контролироваться на основе функций с помощью
micromipsиnomicromipsатрибутов. См. Атрибуты функций для получения дополнительной информации. -mmt-mno-mt-
Использовать (не использовать) инструкции MT Multithreading.
-mmcu-mno-mcu-
Использовать (не использовать) инструкции MIPS MCU ASE.
-meva-mno-eva-
Использовать (не использовать) инструкции MIPS Enhanced Virtual Addressing.
-mvirt-mno-virt-
Использовать (не использовать) инструкции MIPS Virtualization (VZ).
-mxpa-mno-xpa-
Использовать (не использовать) инструкции MIPS eXtended Physical Address (XPA).
-mcrc-mno-crc-
Использовать (не использовать) инструкции MIPS Cyclic Redundancy Check (CRC).
-mginv-mno-ginv-
Использовать (не использовать) инструкции MIPS Global INValidate (GINV).
-mloongson-mmi-mno-loongson-mmi-
Использовать (не использовать) инструкции MIPS Loongson MultiMedia extensions (MMI).
-mloongson-ext-mno-loongson-ext-
Использовать (не использовать) инструкции MIPS Loongson EXTensions (EXT).
-mloongson-ext2-mno-loongson-ext2-
Использовать (не использовать) инструкции MIPS Loongson EXTensions r2 (EXT2).
-mlong64-
Принудительно сделать типы
longшириной 64 бита. См. -mlong32 для объяснения значения по умолчанию и способа определения размера указателя. -mlong32
-
Принудительное использование 32-битного размера для типов
long,int, и указателей.Размер
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, когда кеши кода имеют установлен бит «Запрет чтения». Он также полезен на процессорах, которые могут быть настроены для использования двойного интерфейса SRAM для инструкций/данных и которые, подобно M4K, автоматически перенаправляют PC-относительные загрузки в оперативную память инструкций.
-mcode-readable=noИнструкции не должны обращаться к исполняемым разделам. Этот параметр может быть полезен на целевых устройствах, которые настроены для использования двойного интерфейса SRAM для инструкций/данных, но которые (в отличие от M4K) не автоматически перенаправляют PC-относительные загрузки в оперативную память инструкций.
-msplit-addresses-mno-split-addresses-
Включить (выключить) использование операторов переназначения
%hi()и%lo()ассемблера. Этот параметр устарел и заменен на -mexplicit-relocs, но сохранен для обратной совместимости. -mexplicit-relocs-mno-explicit-relocs-
Использовать (не использовать) операторы переназначения ассемблера при работе со символическими адресами. Альтернатива, выбранная с помощью -mno-explicit-relocs, — использование макросов ассемблера вместо них.
-mexplicit-relocs является значением по умолчанию, если GCC был сконфигурирован для использования ассемблера, который поддерживает операторы переназначения.
-mcheck-zero-division-mno-check-zero-division-
Захват (не захват) при делении на ноль.
Значение по умолчанию — -mcheck-zero-division.
-mdivide-traps-mdivide-breaks-
Системы MIPS проверяют деление на ноль, генерируя либо условную ловушку, либо инструкцию разрыва. Использование ловушек приводит к меньшему коду, но поддерживается только на MIPS II и более поздних версиях. Кроме того, в некоторых версиях ядра Linux есть ошибка, которая предотвращает генерацию правильного сигнала ловушкой (
SIGFPE). Используйте -mdivide-traps, чтобы разрешить условные ловушки на архитектурах, которые их поддерживают, и -mdivide-breaks, чтобы принудительно использовать разрывы.Значение по умолчанию обычно -mdivide-traps, но это можно переопределить во время настройки, используя --with-divide=breaks. Проверки на деление на ноль можно полностью отключить с помощью -mno-check-zero-division.
-mload-store-pairs-mno-load-store-pairs-
Включить (выключить) оптимизацию, которая объединяет последовательные инструкции загрузки или сохранения для включения связи загрузки/сохранения. Этот параметр включен по умолчанию, но срабатывает только тогда, когда выбранная архитектура, как известно, поддерживает связь.
-munaligned-access-mno-unaligned-access-
Включить (выключить) прямой доступ к невыровненным данным для MIPS Release 6. MIPSr6 требует поддержки доступа к невыровненным данным в аппаратном обеспечении или с помощью ловушки и эмуляции. Поэтому -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, если вместо них доступны инструкции VR4130macc,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 этого обходного пути. Предполагается, что отмененные обращения к любому байту в следующих областях не имеют побочных эффектов:
- память, занимаемая кадром стека текущей функции;
- память, занимаемая входящим аргументом стека;
- память, занимаемая объектом с адресом, известным на этапе связывания.
Ответственность за обеспечение безопасности спекулятивных обращений к этим областям лежит на ядре.
Если входная программа содержит объявление функции, например:
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 не равен 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-
Применимо, включить (отключить) генерацию 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-12.2.0/gcc/MIPS-Options.html