Spec-Zone.ru › GCC 12

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, но запрещает использование регистров одинарной точности с нечетными номерами. Это можно использовать в сочетании с режимом 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

Предполагать (не предполагать), что статический и динамический линковщики поддерживают 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, если вместо них доступны инструкции VR4130 macc, macchi, dmacc и dmacchi.

-mfix-sb1
-mno-fix-sb1

Обход определенных ошибок процессорного ядра SB-1. (Этот флаг в настоящее время обходит ошибки плавающей точки SB-1 версии 2 «F1» и «F2».)

-mr10k-cache-barrier=setting

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

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

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

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

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

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

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

void foo (void);

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

Параметр имеет три формы:

-mr10k-cache-barrier=load-store

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

-mr10k-cache-barrier=store

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

-mr10k-cache-barrier=none

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

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

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

mbranch-cost=num

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

-mbranch-likely
-mno-branch-likely

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

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

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

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

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

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

Параметр -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

Spec-Zone.ru

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