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, но запрещает использование регистров с нечётными номерами одинарной точности. Это можно использовать в сочетании с режимом
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 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, если инструкции 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=значение управляет реализацией этого решения в 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 не нулевой.
Значение по умолчанию — -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