Spec-Zone.ru › GCC 5

3.17.25 Варианты MIPS

-EB

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

-EL

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

-march=arch

Генерировать код, который выполняется на 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’, ‘loongson2e’, ‘loongson2f’, ‘loongson3a’, ‘m4k’, ‘m14k’, ‘m14kc’, ‘m14ke’, ‘m14kec’, ‘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

Оптимизация для 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.

-mips32r3

Эквивалентно -march=mips32r3.

-mips32r5

Эквивалентно -march=mips32r5.

-mips32r6

Эквивалентно -march=mips32r6.

-mips64

Эквивалентно -march=mips64.

-mips64r2

Эквивалентно -march=mips64r2.

-mips64r3

Эквивалентно -march=mips64r3.

-mips64r5

Эквивалентно -march=mips64r5.

-mips64r6

Эквивалентно -march=mips64r6.

-mips16
-mno-mips16

Генерировать (не генерировать) код MIPS16. Если GCC нацелен на архитектуру MIPS32 или MIPS64, он использует ASE MIPS16e.

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

-mflip-mips16

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

-minterlink-compressed
-mno-interlink-compressed

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

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

-minterlink-mips16
-mno-interlink-mips16

Псевдонимы -minterlink-compressed и -mno-interlink-compressed. Эти параметры предшествуют ASE microMIPS и сохранены для обратной совместимости.

-mabi=32
-mabi=o64
-mabi=n32
-mabi=64
-mabi=eabi

Генерировать код для заданного ABI.

Обратите внимание, что EABI имеет 32-битную и 64-битную версии. GCC обычно генерирует 64-битный код при выборе 64-битной архитектуры, но вы можете использовать -mgp32, чтобы получить 32-битный код вместо этого.

Сведения об ABI O64 см. на странице http://gcc.gnu.org/projects/mipso64-abi.html.

GCC поддерживает вариант ABI o32, в котором регистры с плавающей запятой имеют 64 бита, а не 32. Вы можете выбрать эту комбинацию с -mabi=32 -mfp64. Этот ABI использует инструкции mthc1 и mfhc1 и поэтому поддерживается только для процессоров MIPS32R2, MIPS32R3 и MIPS32R5.

Присвоение регистров для аргументов и возвращаемых значений остаётся тем же, но каждое скалярное значение передаётся в одном 64-битном регистре, а не в паре 32-битных регистров. Например, скалярные значения с плавающей запятой возвращаются только в ‘$f0’, а не в паре ‘$f0’/‘$f1’. Набор регистров, сохраняемых при вызове, также остаётся тем же, так как чётные регистры с двойной точностью сохраняются.

Поддерживаются ещё два варианта ABI o32 для поддержки перехода от 32-битных к 64-битным регистрам. Это FPXX (-mfpxx) и FP64A (-mfp64 -mno-odd-spreg). Расширение FPXX требует, чтобы весь код выполнялся корректно при выполнении с 32-битными или 64-битными регистрами. Код может быть связан либо с FP32, либо с FP64, но не с обоими одновременно. Расширение FP64A аналогично расширению FP64, но запрещает использование нечётных регистров одинарной точности. Это можно использовать в сочетании с режимом FRE FPU в процессорах MIPS32R5 и позволяет коду FP32 и FP64A связываться и выполняться в одном процессе без изменения режимов FPU.

-mabicalls
-mno-abicalls

Генерировать (не генерировать) код, подходящий для динамических объектов в стиле SVR4. -mabicalls по умолчанию для систем на базе SVR4.

-mshared
-mno-shared

Генерировать (не генерировать) полностью независимый от позиции код, который поэтому может быть подключен к динамическим библиотекам. Этот параметр влияет только на -mabicalls.

Весь код -mabicalls традиционно был независимым от позиции, независимо от параметров, таких как -fPIC и -fpic. Однако в качестве расширения, GNU инструмент позволяет исполняемым файлам использовать абсолютные обращения для локального связывания символов. Он также может использовать более короткие последовательности инициализации GP и генерировать прямые вызовы к локально определённым функциям. Этот режим выбирается с помощью -mno-shared.

-mno-shared зависит от binutils 2.16 или выше и генерирует объекты, которые могут быть связаны только с помощью GNU компоновщика. Однако, параметр не влияет на ABI конечного исполняемого файла; он влияет только на ABI переносимых объектов. Использование -mno-shared обычно уменьшает размер и ускоряет исполняемые файлы.

-mshared по умолчанию.

-mplt
-mno-plt

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

-mfpxx

Не предполагать ширину регистров с плавающей запятой.

-mhard-float

Использовать инструкции сопроцессора с плавающей запятой.

-msoft-float

Не использовать инструкции сопроцессора с плавающей запятой. Реализовать вычисления с плавающей запятой с помощью вызовов библиотеки вместо этого.

-mno-float

Эквивалентно -msoft-float, но дополнительно утверждает, что компилируемая программа не выполняет никаких операций с плавающей запятой. Этот параметр в настоящее время поддерживается только некоторыми конфигурациями MIPS bare-metal, где он может выбрать специальный набор библиотек, в которых отсутствует вся поддержка плавающей запятой (включая, например, форматы плавающей запятой printf). Если код, скомпилированный с -mno-float, случайно содержит операции с плавающей запятой, он, вероятно, потерпит неудачу во время линковки или выполнения.

-msingle-float

Предполагать, что сопроцессор с плавающей запятой поддерживает только операции одинарной точности.

-mdouble-float

Предполагать, что сопроцессор с плавающей запятой поддерживает операции двойной точности. Это значение по умолчанию.

-modd-spreg
-mno-odd-spreg

Включить использование регистров с плавающей запятой одинарной точности с нечетными номерами для ABI o32. Это значение по умолчанию для процессоров, которые, как известно, поддерживают эти регистры. При использовании 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 ASE MIPS DSP. См. MIPS DSP Built-in Functions. Этот параметр определяет препроцессорную макрокоманду __mips_dsp. Он также определяет __mips_dsp_rev как 1.

-mdspr2
-mno-dspr2

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

-msmartmips
-mno-smartmips

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

-mpaired-single
-mno-paired-single

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

-mdmx
-mno-mdmx

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

-mips3d
-mno-mips3d

Использовать (не использовать) MIPS-3D ASE. См. MIPS-3D Built-in Functions. Параметр -mips3d подразумевает -mpaired-single.

-mmicromips
-mno-micromips

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

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

-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.

-mxpa
-mno-xpa

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

-mlong64

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

-mlong32

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

Размер по умолчанию ints, longs и указателей зависит от ABI. Все поддерживаемые ABI используют 32-битные ints. ABI n64 и 64-битный EABI используют 64-битные longs; остальные используют 32-битные longs. Указатели имеют такой же размер, как и longs или такой же размер, как и регистры целых чисел, в зависимости от того, какой меньше.

-msym32
-mno-sym32

Предполагать (не предполагать), что все символы имеют 32-битные значения, независимо от выбранного ABI. Этот параметр полезен в сочетании с -mabi=64 и -mno-abicalls, поскольку он позволяет GCC генерировать более короткие и быстрые ссылки на символические адреса.

-G num

Разместить определения внешне видимых данных в небольшой секции данных, если эти данные не превышают num байт. GCC может затем сгенерировать более эффективные обращения к данным; см. -mgpopt для получения подробностей.

Параметр по умолчанию -G зависит от конфигурации.

-mlocal-sdata
-mno-local-sdata

Расширять (не расширять) поведение -G на локальные данные, например, на статические переменные в C. -mlocal-sdata является значением по умолчанию для всех конфигураций.

Если линковщик жалуется, что приложение использует слишком много данных малого размера, возможно, стоит попробовать перестроить менее критически важные части с помощью -mno-local-sdata. Также возможно, что стоит перестроить большие библиотеки с -mno-local-sdata, чтобы библиотеки оставили больше места для основной программы.

-mextern-sdata
-mno-extern-sdata

Предполагать (не предполагать), что внешние данные находятся в разделе данных малого размера, если размер этих данных находится в пределах ограничения -G. -mextern-sdata является значением по умолчанию для всех конфигураций.

Если вы компилируете модуль Mod с -mextern-sdata -G num -mgpopt, и Mod ссылается на переменную Var, размер которой не превышает num байтов, вы должны убедиться, что Var размещена в разделе данных малого размера. Если Var определена другим модулем, вы должны либо скомпилировать этот модуль с достаточно высоким значением -G, либо прикрепить атрибут section к определению Var. Если Var является общей, вы должны слинковать приложение с достаточно высоким значением -G.

Самый простой способ удовлетворить этим ограничениям — скомпилировать и слинковать каждый модуль с тем же параметром -G. Однако вы можете захотеть создать библиотеку, поддерживающую несколько различных ограничений размера данных малого размера. Вы можете сделать это, скомпилировав библиотеку с наивысшим поддерживаемым значением -G и дополнительно используя -mno-extern-sdata для предотвращения предположений библиотекой о внешних данных.

-mgpopt
-mno-gpopt

Использовать (не использовать) GP-относительные обращения к символам, которые, как известно, находятся в разделе данных малого размера; см. -G, -mlocal-sdata и -mextern-sdata. -mgpopt является значением по умолчанию для всех конфигураций.

-mno-gpopt полезно в тех случаях, когда регистр $gp может не содержать значение _gp. Например, если код является частью библиотеки, которая может быть использована в мониторе загрузки, программы, которые вызывают процедуры монитора загрузки, передают неизвестное значение в $gp. (В таких ситуациях сам монитор загрузки обычно компилируется с -G0.)

-mno-gpopt подразумевает -mno-local-sdata и -mno-extern-sdata.

-membedded-data
-mno-embedded-data

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

-muninit-const-in-rodata
-mno-uninit-const-in-rodata

Разместить неинициализированные const переменные в разделе данных только для чтения. Этот параметр имеет смысл только в сочетании с -membedded-data.

-mcode-readable=setting

Указать, может ли GCC генерировать код, который читает из секций исполняемого кода. Существует три возможных значения:

-mcode-readable=yes

Инструкции могут свободно обращаться к секциям исполняемого кода. Это значение по умолчанию.

-mcode-readable=pcrel

Инструкции MIPS16 PC-относительных загрузок могут обращаться к секциям исполняемого кода, но другие инструкции не должны этого делать. Этот параметр полезен на процессорах 4KSc и 4KSd, когда кэши кода TLB имеют бит запрета чтения. Он также полезен на процессорах, которые могут быть сконфигурированы для наличия двойного интерфейса SRAM для инструкций/данных и которые, подобно M4K, автоматически перенаправляют PC-относительные загрузки в оперативную память инструкций.

-mcode-readable=no

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

-msplit-addresses
-mno-split-addresses

Включить (выключить) использование операторов перемещения адресации %hi() и %lo() ассемблера. Этот параметр устарел и заменён параметром -mexplicit-relocs, но сохраняется для обратной совместимости.

-mexplicit-relocs
-mno-explicit-relocs

Использовать (не использовать) операторы перемещения адресации ассемблера при работе со символическими адресами. Альтернатива, выбранная параметром -mno-explicit-relocs, — использование макросов ассемблера вместо этого.

-mexplicit-relocs является значением по умолчанию, если GCC был сконфигурирован для использования ассемблера, который поддерживает операторы перемещения адресации.

-mcheck-zero-division
-mno-check-zero-division

Захватывать (не захватывать) ошибку при делении на ноль.

Значение по умолчанию — -mcheck-zero-division.

-mdivide-traps
-mdivide-breaks

Системы MIPS проверяют деление на ноль, генерируя либо условную ошибку, либо инструкцию разрыва. Использование ошибок приводит к более компактному коду, но поддерживается только на MIPS II и более поздних версиях. Кроме того, в некоторых версиях ядра Linux существует ошибка, которая предотвращает генерацию правильного сигнала (SIGFPE). Используйте -mdivide-traps, чтобы разрешить условные ошибки на архитектурах, которые их поддерживают, и -mdivide-breaks, чтобы принудительно использовать разрывы.

Значение по умолчанию обычно -mdivide-traps, но это можно переопределить во время конфигурации, используя --with-divide=breaks. Проверки на деление на ноль можно полностью отключить с помощью -mno-check-zero-division.

-mmemcpy
-mno-memcpy

Принудительно (не принудительно) использовать memcpy для нетривиальных блочных перемещений. Значение по умолчанию — -mno-memcpy, что позволяет GCC встраивать большинство копий с постоянным размером.

-mlong-calls
-mno-long-calls

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

Этот параметр не влияет на код abicalls. Значение по умолчанию — -mno-long-calls.

-mmad
-mno-mad

Включить (выключить) использование инструкций mad, madu и mul, предоставляемых ISA R4650.

-mimadd
-mno-imadd

Включить (выключить) использование целочисленных инструкций madd и msub. По умолчанию значение -mimadd на архитектурах, которые поддерживают madd и msub, за исключением архитектуры 74k, где было установлено, что это приводит к более медленному коду.

-mfused-madd
-mno-fused-madd

Включить (выключить) использование инструкций умножения-суммирования с плавающей точкой, когда они доступны. Значение по умолчанию — -mfused-madd.

На процессоре R8000 при использовании инструкций умножения-суммирования промежуточный продукт вычисляется с бесконечной точностью и не подчиняется биту сброса FCSR Flush to Zero. Это может быть нежелательно в некоторых обстоятельствах. На других процессорах результат численно идентичен эквивалентному вычислению с использованием отдельных инструкций умножения, сложения, вычитания и отрицания.

-nocpp

Указать ассемблеру MIPS не запускать свой препроцессор над пользовательскими файлами ассемблера (с суффиксом «.s») при их сборке.

-mfix-24k
-mno-fix-24k

Обход ошибки 24K E48 (потеря данных при сохранении во время заполнения). Обходные решения реализуются ассемблером, а не GCC.

-mfix-r4000
-mno-fix-r4000

Обход некоторых ошибок процессора R4000:

  • - Двойное слово или сдвиг переменной могут дать неправильный результат, если они выполнены сразу после начала целочисленного деления.
  • - Двойное слово или сдвиг переменной могут дать неправильный результат, если они выполнены во время выполнения целочисленного умножения.
  • - Целочисленное деление может дать неправильный результат, если оно начато в слоте задержки взятого ветвления или перехода.
-mfix-r4400
-mno-fix-r4400

Обход некоторых ошибок процессора R4400:

  • - Двойное слово или сдвиг переменной могут дать неправильный результат, если они выполнены сразу после начала целочисленного деления.
-mfix-r10000
-mno-fix-r10000

Обход некоторых ошибок процессора R10000:

  • - Последовательности ll/sc могут не работать атомарно на ревизиях до 3.0. Они могут привести к тупику на ревизиях 2.6 и более ранних.

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

-mfix-rm7000
-mno-fix-rm7000

Обход ошибок RM7000 dmult/dmultu. Обходные решения реализуются ассемблером, а не GCC.

-mfix-vr4120
-mno-fix-vr4120

Обход некоторых ошибок процессора VR4120:

  • - dmultu не всегда даёт правильный результат.
  • - div и ddiv не всегда дают правильный результат, если один из операндов отрицательный.

Обходные решения для ошибок деления полагаются на специальные функции в libgcc.a. В настоящее время эти функции предоставляются только конфигурациями mips64vr*-elf.

Другие ошибки VR4120 требуют вставки NOP между определенными парами инструкций. Эти ошибки обрабатываются ассемблером, а не самим GCC.

-mfix-vr4130

Обход ошибки VR4130 mflo/mfhi. Обходные решения реализуются ассемблером, а не GCC, хотя GCC избегает использования mflo и mfhi, если инструкции VR4130 macc, macchi, dmacc и dmacchi доступны вместо этого.

-mfix-sb1
-mno-fix-sb1

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

-mr10k-cache-barrier=setting

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

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

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

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

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

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

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

void foo (void);

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

У этого параметра есть три формы:

-mr10k-cache-barrier=load-store

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

-mr10k-cache-barrier=load-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, но по умолчанию можно изменить, сконфигурировав 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.

Далее: Параметры MMIX, Предыдущее: Параметры MicroBlaze, Выше: Параметры подмодели [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/MIPS-Options.html

Spec-Zone.ru

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