3.17.27 Варианты MIPS
-EB- Генерировать код с порядком байтов big-endian.
-EL- Генерировать код с порядком байтов little-endian. Это значение по умолчанию для конфигураций ‘
mips*el-*-*’. -
-march=arch - Генерировать код, который будет выполняться на arch, которое может быть именем универсальной ISA MIPS, или именем конкретного процессора. Имена ISA: ‘
mips1’, ‘mips2’, ‘mips3’, ‘mips4’, ‘mips32’, ‘mips32r2’, ‘mips64’ и ‘mips64r2’. Имена процессоров: ‘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’, ‘loongson2e’, ‘loongson2f’, ‘loongson3a’, ‘m4k’, ‘m14k’, ‘m14kc’, ‘m14ke’, ‘m14kec’, ‘octeon’, ‘octeon+’, ‘octeon2’, ‘orion’, ‘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 - Оптимизировать для arch. Среди прочего, этот параметр контролирует способ планирования инструкций и предполагаемую стоимость арифметических операций. Список значений arch совпадает со списком значений для
-march.Если этот параметр не используется, GCC оптимизирует для процессора, указанного в
-march. Используя-marchи-mtuneвместе, можно сгенерировать код, работающий на семействе процессоров, но оптимизировать код для конкретного члена этого семейства.-mtuneопределяет макросы ‘_MIPS_TUNE’ и ‘_MIPS_TUNE_foo’, которые работают аналогично описанным выше макросам-march. -mips1- Эквивалентно
-march=mips1. -mips2- Эквивалентно
-march=mips2. -mips3- Эквивалентно
-march=mips3. -mips4- Эквивалентно
-march=mips4. -mips32- Эквивалентно
-march=mips32. -mips32r2- Эквивалентно
-march=mips32r2. -mips64- Эквивалентно
-march=mips64. -mips64r2- Эквивалентно
-march=mips64r2. -
-mips16-mno-mips16 - Генерировать (не генерировать) код MIPS16. Если GCC нацелен на архитектуру MIPS32 или MIPS64, он использует ASE MIPS16e.
Генерацию кода MIPS16 также можно контролировать на уровне функции с помощью атрибутов
mips16иnomips16. Подробнее см. в разделе Атрибуты функций. -mflip-mips16- Генерировать код MIPS16 на чередующихся функциях. Этот параметр предназначен для тестирования регрессии смешанного кода MIPS16/не-MIPS16 и не предназначен для обычного использования при компиляции пользовательского кода.
-
-minterlink-compressed-mno-interlink-compressed - Требовать (не требовать), чтобы код, использующий стандартную (нескомпрессированную) ISA MIPS, был совместим с кодом MIPS16 и microMIPS, и наоборот.
Например, код, использующий стандартное кодирование, не может напрямую перейти к коду 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-битного кода вместо этого.Дополнительную информацию об O64 ABI см. на странице http://gcc.gnu.org/projects/mipso64-abi.html.
GCC поддерживает вариант o32 ABI, в котором регистры с плавающей запятой имеют ширину 64 бита вместо 32. Вы можете выбрать эту комбинацию с помощью
-mabi=32-mfp64. Этот ABI использует инструкцииmthc1иmfhc1и, следовательно, поддерживается только для процессоров MIPS32R2.Присвоение регистров для аргументов и возвращаемых значений остается тем же, но каждое скалярное значение передается в единственном 64-битном регистре вместо пары 32-битных регистров. Например, скалярные значения с плавающей запятой возвращаются только в ‘
$f0’, а не в паре ‘$f0’/‘$f1’. Набор регистров, сохраняемых при вызове, также остается тем же, но сохраняются все 64 бита. -
-mabicalls-mno-abicalls - Генерировать (не генерировать) код, подходящий для динамических объектов в стиле SVR4.
-mabicallsпо умолчанию для систем на базе SVR4. -
-mshared-mno-shared - Генерировать (не генерировать) полностью позиционно-независимый код, который, следовательно, может быть подключён к общим библиотекам. Этот параметр влияет только на
-mabicalls.Весь
-mabicallsкод традиционно был позиционно-независимым, независимо от параметров, таких как-fPICи-fpic. Однако как расширение, GNU инструмент позволяет исполняемым файлам использовать абсолютные обращения для локального связывания символов. Он также может использовать более короткие последовательности инициализации GP и генерировать прямые вызовы локально определённых функций. Этот режим выбирается параметром-mno-shared.-mno-sharedзависит от binutils 2.16 или выше и генерирует объекты, которые могут быть связаны только GNU линковщиком. Однако, параметр не влияет на ABI конечного исполняемого файла; он влияет только на ABI переносимых объектов. Использование-mno-sharedобычно делает исполняемые файлы и меньшими, и более быстрыми.-msharedпо умолчанию. -
-mplt-mno-plt - Предполагать (не предполагать), что статический и динамический линковщики поддерживают PLT и перемещения копирования. Этот параметр влияет только на
-mno-shared -mabicalls. Для ABI n64 этот параметр не имеет эффекта без-msym32.Вы можете сделать
-mpltзначением по умолчанию, настроив GCC с помощью--with-mips-plt. По умолчанию-mno-pltв противном случае. -
-mxgot-mno-xgot
- Поднять (не поднимать) обычные ограничения на размер глобальной таблицы смещений.
GCC обычно использует одну инструкцию для загрузки значений из GOT. Хотя это относительно эффективно, оно работает только в том случае, если GOT меньше примерно 64 КБ. Любое большее значение заставляет компоновщик сообщать об ошибке, например:
relocation truncated to fit: R_MIPS_GOT16 foobar
Если это произойдет, вы должны перекомпилировать свой код с помощью
-mxgot. Это работает с очень большими GOT, хотя код также менее эффективен, так как для извлечения значения глобальной символьной переменной требуется три инструкции.Обратите внимание, что некоторые компоновщики могут создавать несколько GOT. Если у вас есть такой компоновщик, вам нужно использовать только
-mxgotв том случае, если один объектный файл обращается более чем к 64 КБ записей GOT. Очень немногие из них.Эти параметры не имеют эффекта, если GCC не генерирует независимый от позиции код.
-mgp32- Предполагается, что регистры общего назначения имеют ширину 32 бита.
-mgp64- Предполагается, что регистры общего назначения имеют ширину 64 бита.
-mfp32- Предполагается, что регистры с плавающей точкой имеют ширину 32 бита.
-mfp64- Предполагается, что регистры с плавающей точкой имеют ширину 64 бита.
-mhard-float- Использовать инструкции сопроцессора с плавающей точкой.
-msoft-float- Не использовать инструкции сопроцессора с плавающей точкой. Реализовывать вычисления с плавающей точкой с помощью вызовов библиотек вместо этого.
-mno-float- Эквивалентно
-msoft-float, но дополнительно утверждает, что компилируемая программа не выполняет никаких операций с плавающей точкой. В настоящее время этот параметр поддерживается только некоторыми конфигурациями MIPS для работы без операционной системы, где он может выбрать специальный набор библиотек, лишенных всей поддержки плавающей точки (включая, например, форматы с плавающей точкойprintf). Если код, скомпилированный с-mno-float, случайно содержит операции с плавающей точкой, он, скорее всего, потерпит неудачу на этапе компоновки или выполнения. -msingle-float- Предполагать, что сопроцессор с плавающей точкой поддерживает только операции одинарной точности.
-mdouble-float- Предполагать, что сопроцессор с плавающей точкой поддерживает операции двойной точности. Это значение по умолчанию.
-
-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 обозначаются первым битом их конечного поля значащей части, равным 1, а сигнализирующие NaN обозначаются первым битом их конечного поля значащей части, равным 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 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 Application Specific.
-mlong64- Принудительно устанавливать тип
longна 64 бита. См.-mlong32для объяснения значения по умолчанию и способа определения размера указателя. -mlong32- Принудительно устанавливать
long,int, и типы указателей на 32 бита.Размер по умолчанию для
ints,longs и указателей зависит от ABI. Все поддерживаемые ABI используют 32-битныеints. ABI n64 использует 64-битныеlongs, как и 64-битный EABI; остальные используют 32-битныеlongs. Указатели имеют тот же размер, что иlongs или тот же размер, что и регистры целых чисел, в зависимости от того, какой из них меньше. -
-msym32-mno-sym32 - Предполагать (не предполагать), что все символы имеют 32-битные значения, независимо от выбранного ABI. Этот параметр полезен в сочетании с
-mabi=64и-mno-abicallsпотому что он позволяет GCC генерировать более короткие и быстрые ссылки на символические адреса. -
-Gnum - Разместить определения внешне видимых данных в небольшом разделе данных, если эти данные не больше, чем 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 - Если возможно, сначала выделите переменные в раздел только для чтения данных, затем, если возможно, в небольшой раздел данных, в противном случае — в раздел данных. Это обеспечивает немного более медленный код, чем по умолчанию, но уменьшает объем памяти RAM, необходимый при выполнении, и поэтому может быть предпочтительнее для некоторых встроенных систем.
-
-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, когда в кэшах кода установлена пометка Read Inhibit. Он также полезен на процессорах, которые могут быть сконфигурированы для использования двойного интерфейса SRAM для инструкций/данных и которые, подобно M4K, автоматически перенаправляют PC-относительные загрузки в RAM для инструкций.
-mcode-readable=no- Инструкции не должны обращаться к разделам исполняемых файлов. Этот параметр может быть полезен на целевых платформах, сконфигурированных для двойного интерфейса SRAM для инструкций/данных, но которые (в отличие от M4K) не перенаправляют PC-относительные загрузки в RAM для инструкций автоматически.
-
-msplit-addresses-mno-split-addresses - Включить (отключить) использование операторов перемещения
%hi()и%lo()в ассемблере. Этот параметр устарел, но сохранен для обратной совместимости. -
-mexplicit-relocs-mno-explicit-relocs - Использовать (не использовать) операторы перемещения ассемблера при работе со символическими адресами. Альтернативой, выбранной параметром
-mno-explicit-relocs, является использование макросов ассемблера вместо этого.-mexplicit-relocs— значение по умолчанию, если GCC был сконфигурирован для использования ассемблера, который поддерживает операторы перемещения. -
-mcheck-zero-division-mno-check-zero-division - Вызывать ошибку (не вызывать ошибку) при делении на ноль.
-
-mdivide-traps-mdivide-breaks - Системы MIPS проверяют деление на ноль, генерируя либо условную ошибку, либо инструкцию break. Использование ошибок приводит к более компактному коду, но поддерживается только в MIPS II и более поздних версиях. Кроме того, в некоторых версиях ядра Linux есть ошибка, которая не позволяет ошибке сгенерировать правильный сигнал (
SIGFPE). Используйте-mdivide-trapsдля разрешения условных ошибок на архитектурах, которые их поддерживают, и-mdivide-breaksдля принудительного использования ошибок.Значение по умолчанию обычно
-mdivide-traps, но это может быть переопределено во время конфигурирования с помощью--with-divide=breaks. Проверки деления на ноль могут быть полностью отключены с помощью-mno-check-zero-division. -
-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 (потеря данных при сохранении во время заполнения).
-
-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-rm7000-mno-fix-rm7000 - Обход ошибок
dmult/dmultuна RM7000. Обходные решения реализованы в ассемблере, а не в 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. (Этот флаг в настоящее время обходит ошибки с плавающей точкой F1 и F2 для SB-1 версии 2.)
-
-mr10k-cache-barrier=setting
- Укажите, должен ли GCC вставлять барьеры кэша, чтобы избежать побочных эффектов упреждающего выполнения на процессорах R10K.
Как и многие процессоры, R10K пытается предсказать результат условного перехода и упреждающе выполняет инструкции из ветви «взятие». Позже он отменяет эти инструкции, если предсказанный результат неверен. Однако на R10K даже отменённые инструкции могут иметь побочные эффекты.
Эта проблема затрагивает только ядра магазинов и, в зависимости от системы, ядра загрузок. Например, упреждающе выполненный магазин может загрузить целевую память в кэш и пометить строку кэша как грязную, даже если сам магазин позже отменён. Если операция DMA запишет в ту же область памяти до того, как «грязная» строка будет очищена, кэшированные данные перезапишут данные DMA. Полное описание, включая другие возможные проблемы, см. в руководстве по процессору R10K.
Одно из решений – вставить инструкции барьера кэша перед каждым обращением к памяти, которое может быть упреждающе выполнено и которое может иметь побочные эффекты, даже если оно отменено. -mr10k-cache-barrier=setting управляет реализацией GCC этого решения. Предполагается, что отменённые обращения к любому байту в следующих областях не имеют побочных эффектов:
- память, занимаемая кадровой частью стека текущей функции;
- память, занимаемая входящим аргументом стека;
- память, занимаемая объектом с адресом, постоянным во время компоновки.
Ядро должно гарантировать, что упреждающие обращения к этим областям действительно безопасны.
Если входная программа содержит объявление функции, например:
void foo (void);
то реализация
fooдолжна позволятьj fooиjal fooвыполняться упреждающе. GCC соблюдает это ограничение для функций, которые он сам компилирует. Он ожидает, что не-GCC функции (например, код ассемблера, написанный вручную) сделают то же самое.У опции есть три формы:
-mr10k-cache-barrier=load-store- Вставить барьер кэша перед загрузкой или сохранением, которые могут быть упреждающе выполнены и которые могут иметь побочные эффекты, даже если они отменены.
-mr10k-cache-barrier=store- Вставить барьер кэша перед сохранением, которое может быть упреждающе выполнено и которое может иметь побочные эффекты, даже если оно отменено.
-mr10k-cache-barrier=none- Отключить вставку барьеров кэша. Это значение по умолчанию.
-
-mflush-func=func-mno-flush-func - Указывает функцию для очистки кэшей I и D или для отказа от вызова такой функции. Если вызов выполняется, функция должна принимать те же аргументы, что и общая
_flush_func(), т.е. адрес диапазона памяти, для которого очищается кэш, размер диапазона памяти и число 3 (для очистки обоих кэшей). Значение по умолчанию зависит от того, для какой цели был сконфигурирован GCC, но обычно это либо ‘_flush_func’, либо ‘__cpu_flush’. -
mbranch-cost=num - Установить стоимость переходов примерно на num «простых» инструкций. Эта стоимость является только эвристикой и не гарантирует согласованных результатов между выпусками. Ноль стоимости избыточно выбирает значение по умолчанию, которое основано на настройке
-mtune. -
-mbranch-likely-mno-branch-likely - Включить или отключить использование инструкций Branch Likely независимо от значения по умолчанию для выбранной архитектуры. По умолчанию инструкции Branch Likely могут генерироваться, если они поддерживаются выбранной архитектурой. Исключением являются архитектуры MIPS32 и MIPS64 и процессоры, которые реализуют эти архитектуры; для них инструкции Branch Likely не генерируются по умолчанию, потому что архитектуры MIPS32 и MIPS64 специально устаревают их использование.
-
-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, но значение по умолчанию может быть переопределено при конфигурации с помощью--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. - Возвращая новый адрес в регистре
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/MIPS-Options.html