Spec-Zone.ru › GCC 7

3.18.26 Опции MIPS

-EB

Генерировать код в формате big-endian.

-EL

Генерировать код в формате little-endian. Это значение по умолчанию для конфигураций ‘mips*el-*-*’.

-march=arch

Генерировать код, который будет выполняться на арх, что может быть именем универсальной ISA MIPS или именем конкретного процессора. Имена ISA: ‘mips1’, ‘mips2’, ‘mips3’, ‘mips4’, ‘mips32’, ‘mips32r2’, ‘mips32r3’, ‘mips32r5’, ‘mips32r6’, ‘mips64’, ‘mips64r2’, ‘mips64r3’, ‘mips64r5’ и ‘mips64r6’. Имена процессоров: ‘4kc’, ‘4km’, ‘4kp’, ‘4ksc’, ‘4kec’, ‘4kem’, ‘4kep’, ‘4ksd’, ‘5kc’, ‘5kf’, ‘20kc’, ‘24kc’, ‘24kf2_1’, ‘24kf1_1’, ‘24kec’, ‘24kef2_1’, ‘24kef1_1’, ‘34kc’, ‘34kf2_1’, ‘34kf1_1’, ‘34kn’, ‘74kc’, ‘74kf2_1’, ‘74kf1_1’, ‘74kf3_2’, ‘1004kc’, ‘1004kf2_1’, ‘1004kf1_1’, ‘i6400’, ‘interaptiv’, ‘loongson2e’, ‘loongson2f’, ‘loongson3a’, ‘m4k’, ‘m14k’, ‘m14kc’, ‘m14ke’, ‘m14kec’, ‘m5100’, ‘m5101’, ‘octeon’, ‘octeon+’, ‘octeon2’, ‘octeon3’, ‘orion’, ‘p5600’, ‘r2000’, ‘r3000’, ‘r3900’, ‘r4000’, ‘r4400’, ‘r4600’, ‘r4650’, ‘r4700’, ‘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, он использует MIPS16e ASE.

Генерацию кода MIPS16 также можно управлять на уровне функций с помощью mips16 и nomips16 атрибутов. См. Атрибуты функций для получения дополнительной информации.

-mflip-mips16

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

-minterlink-compressed
-mno-interlink-compressed

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

Например, код, использующий стандартное кодирование ISA, не может напрямую переходить к MIPS16 или microMIPS-коду; он должен использовать вызов или косвенный переход. -minterlink-compressed поэтому отключает прямые переходы, если GCC знает, что цель перехода не сжата.

-minterlink-mips16
-mno-interlink-mips16

Псевдонимы -minterlink-compressed и -mno-interlink-compressed. Эти параметры появились раньше 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

Предполагать (не предполагать), что статические и динамические линковщики поддерживают 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 o32 FPXX, -mno-odd-spreg устанавливается по умолчанию.

-mabs=2008
-mabs=legacy

Эти параметры управляют обработкой специальных данных с плавающей запятой IEEE 754 (NaN) с помощью abs.fmt и neg.fmt машинных инструкций.

По умолчанию или при использовании -mabs=legacy выбирается обработка по умолчанию. В этом случае эти инструкции считаются арифметическими и избегаются там, где требуется правильная работа, а операнд входа может быть NaN. Вместо этого используется более длинная последовательность инструкций, которая вручную манипулирует битом знака данных с плавающей запятой, если не указан параметр -ffinite-math-only.

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

-mnan=2008
-mnan=legacy

Эти параметры управляют кодированием специальных данных с плавающей запятой IEEE 754 (NaN).

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

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

Значение по умолчанию - -mnan=legacy, если GCC не сконфигурирован с помощью --with-nan=2008.

-mllsc
-mno-llsc

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

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

-mdsp
-mno-dsp

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

-mdspr2
-mno-dspr2

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

-msmartmips
-mno-smartmips

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

-mpaired-single
-mno-paired-single

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

-mdmx
-mno-mdmx

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

-mips3d
-mno-mips3d

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

-mmicromips
-mno-micromips

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

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

-mmt
-mno-mt

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

-mmcu
-mno-mcu

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

-meva
-mno-eva

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

-mvirt
-mno-virt

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

-mxpa
-mno-xpa

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

-mlong64

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

-mlong32

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

Размер по умолчанию ints, longs и указателей зависит от ABI. Все поддерживаемые ABI используют ints размером 32 бита. ABI n64 и 64-битный EABI используют longs размером 64 бита; остальные используют longs размером 32 бита. Указатели имеют такой же размер, как 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-относительные загрузки в память инструкций.

-mcode-readable=no

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

-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, чтобы принудительно использовать break.

Значение по умолчанию обычно -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 и более ранних.

Этот параметр может быть использован только если целевая архитектура поддерживает инструкции вероятного ветвления. -mfix-r10000 является значением по умолчанию при использовании -march=r10000; -mno-fix-r10000 является значением по умолчанию в противном случае.

-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=значение управляет реализацией этого решения в 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-7.5.0/gcc/MIPS-Options.html

Spec-Zone.ru

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