Spec-Zone.ru › GCC 4

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 генерировать более короткие и быстрые ссылки на символические адреса.
-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
Если возможно, сначала выделите переменные в раздел только для чтения данных, затем, если возможно, в небольшой раздел данных, в противном случае — в раздел данных. Это обеспечивает немного более медленный код, чем по умолчанию, но уменьшает объем памяти 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 если инструкции VR4130 macc, 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 этого решения. Предполагается, что отменённые обращения к любому байту в следующих областях не имеют побочных эффектов:

  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 специально устаревают их использование.
-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

Spec-Zone.ru

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