3.17.53 Опции x86
Эти опции '-m' определены для семейства компьютеров x86.
-march=cpu-type-
Генерировать инструкции для типа процессора cpu-type. В отличие от -mtune=cpu-type, которое лишь настраивает сгенерированный код для указанного типа процессора cpu-type, -march=cpu-type позволяет GCC генерировать код, который может вообще не работать на процессорах, отличных от указанного. Указание -march=cpu-type подразумевает -mtune=cpu-type.
Возможные значения для cpu-type:
- ‘native’
-
Этот параметр выбирает процессор для генерации кода во время компиляции, определяя тип процессора компилятора. Использование -march=native включает все наборы инструкций, поддерживаемые локальной машиной (поэтому результат может не работать на других машинах). Использование -mtune=native генерирует код, оптимизированный для локальной машины в рамках ограничений выбранного набора инструкций.
- ‘i386’
-
Оригинальный процессор Intel i386.
- ‘i486’
-
Процессор Intel i486. (Расписание для этого чипа не реализовано.)
- ‘i586’
- ‘pentium’
-
Процессор Intel Pentium без поддержки MMX.
- ‘pentium-mmx’
-
Процессор Intel Pentium MMX, основанный на ядре Pentium с поддержкой набора инструкций MMX.
- ‘pentiumpro’
-
Процессор Intel Pentium Pro.
- ‘i686’
-
При использовании с -march используется набор инструкций Pentium Pro, поэтому код работает на всех чипах семейства i686. При использовании с -mtune имеет тот же смысл, что и ‘generic’.
- ‘pentium2’
-
Процессор Intel Pentium II, основанный на ядре Pentium Pro с поддержкой набора инструкций MMX.
- ‘pentium3’
- ‘pentium3m’
-
Процессор Intel Pentium III, основанный на ядре Pentium Pro с поддержкой наборов инструкций MMX и SSE.
- ‘pentium-m’
-
Процессор Intel Pentium M; энергосберегающая версия процессора Intel Pentium III с поддержкой наборов инструкций MMX, SSE и SSE2. Используется в ноутбуках Centrino.
- ‘pentium4’
- ‘pentium4m’
-
Процессор Intel Pentium 4 с поддержкой наборов инструкций MMX, SSE и SSE2.
- ‘prescott’
-
Улучшенная версия процессора Intel Pentium 4 с поддержкой наборов инструкций MMX, SSE, SSE2 и SSE3.
- ‘nocona’
-
Улучшенная версия процессора Intel Pentium 4 с 64-разрядными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2 и SSE3.
- ‘core2’
-
Процессор Intel Core 2 с 64-разрядными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3 и SSSE3.
- ‘nehalem’
-
Процессор Intel Nehalem с 64-разрядными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 и POPCNT.
- ‘westmere’
-
Процессор Intel Westmere с 64-разрядными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES и PCLMUL.
- ‘sandybridge’
-
Процессор Intel Sandy Bridge с 64-разрядными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AES и PCLMUL.
- ‘ivybridge’
-
Процессор Intel Ivy Bridge с 64-разрядными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AES, PCLMUL, FSGSBASE, RDRND и F16C.
- ‘haswell’
-
Процессор Intel Haswell с 64-разрядными расширениями, поддержкой MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2 и F16C.
- ‘broadwell’
-
Процессор Intel Broadwell с 64-разрядными расширениями, поддержкой MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX и PREFETCHW.
- ‘bonnell’
-
Процессор Intel Bonnell с 64-разрядными расширениями, поддержкой MOVBE, MMX, SSE, SSE2, SSE3 и SSSE3.
- ‘silvermont’
-
Процессор Intel Silvermont с 64-разрядными расширениями, поддержкой MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PCLMUL и RDRND.
- ‘knl’
-
Процессор Intel Knight’s Landing с 64-разрядными расширениями, поддержкой MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, AVX512F, AVX512PF, AVX512ER и AVX512CD.
- ‘k6’
-
Процессор AMD K6 с поддержкой набора инструкций MMX.
- ‘k6-2’
- ‘k6-3’
-
Улучшенные версии процессора AMD K6 с поддержкой наборов инструкций MMX и 3DNow!.
- ‘athlon’
- ‘athlon-tbird’
-
Процессор AMD Athlon с поддержкой MMX, 3dNOW!, улучшенного 3DNow! и инструкций prefetch SSE.
- ‘athlon-4’
- ‘athlon-xp’
- ‘athlon-mp’
-
Улучшенный процессор AMD Athlon с поддержкой MMX, 3DNow!, улучшенного 3DNow! и полного набора инструкций SSE.
- ‘k8’
- ‘opteron’
- ‘athlon64’
- ‘athlon-fx’
-
Процессоры на основе ядра AMD K8 с поддержкой набора инструкций x86-64, включая процессоры AMD Opteron, Athlon 64 и Athlon 64 FX. (Этот набор включает MMX, SSE, SSE2, 3DNow!, улучшенный 3DNow! и расширения набора инструкций 64-бит.)
- ‘k8-sse3’
- ‘opteron-sse3’
- ‘athlon64-sse3’
-
Улучшенные версии ядер AMD K8 с поддержкой набора инструкций SSE3.
- ‘amdfam10’
- ‘barcelona’
-
Процессоры на основе ядер AMD Family 10h с поддержкой набора инструкций x86-64. (Этот набор включает MMX, SSE, SSE2, SSE3, SSE4A, 3DNow!, улучшенный 3DNow!, ABM и расширения набора инструкций 64-бит.)
- ‘bdver1’
Процессоры на основе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (Этот набор включает FMA4, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций 64-бит.)
- ‘bdver2’
Процессоры на основе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (Этот набор включает BMI, TBM, F16C, FMA, FMA4, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций 64-бит.)
- ‘bdver3’
Процессоры на основе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (Этот набор включает BMI, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций 64-бит.
- ‘bdver4’
-
Процессоры на основе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (Этот набор включает BMI, BMI2, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, AVX2, XOP, LWP, AES, PCL_MUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций 64-бит.
- ‘btver1’
-
Процессоры на основе ядер AMD Family 14h с поддержкой набора инструкций x86-64. (Этот набор включает MMX, SSE, SSE2, SSE3, SSSE3, SSE4A, CX16, ABM и расширения набора инструкций 64-бит.)
- ‘btver2’
-
Процессоры на основе ядер AMD Family 16h с поддержкой набора инструкций x86-64. Это включает MOVBE, F16C, BMI, AVX, PCL_MUL, AES, SSE4.2, SSE4.1, CX16, ABM, SSE4A, SSSE3, SSE3, SSE2, SSE, MMX и расширения набора инструкций 64-бит.
- ‘winchip-c6’
-
Процессор IDT WinChip C6, обрабатывается аналогично i486 с дополнительной поддержкой набора инструкций MMX.
- ‘winchip2’
-
Процессор IDT WinChip 2, обрабатывается аналогично i486 с дополнительной поддержкой наборов инструкций MMX и 3DNow!.
- ‘c3’
-
Процессор VIA C3 с поддержкой наборов инструкций MMX и 3DNow!. (Расписание для этого чипа не реализовано.)
- ‘c3-2’
-
Процессор VIA C3-2 (Nehemiah/C5XL) с поддержкой наборов инструкций MMX и SSE. (Расписание для этого чипа не реализовано.)
- ‘geode’
Встраиваемый процессор AMD Geode с поддержкой наборов инструкций MMX и 3DNow!.
-mtune=cpu-type-
Настройка на cpu-type всех применимых аспектов сгенерированного кода, за исключением ABI и набора доступных инструкций. При выборе конкретного cpu-type планирование происходит соответствующим образом для конкретного чипа, но компилятор не генерирует код, который не может работать на типе машины по умолчанию, если вы не используете параметр -march=cpu-type. Например, если GCC сконфигурирован для i686-pc-linux-gnu, то -mtune=pentium4 генерирует код, настроенный для Pentium 4, но он всё равно работает на машинах i686.
Возможные значения для cpu-type такие же, как и для -march. Кроме того, -mtune поддерживает 2 дополнительных значения для cpu-type:
- ‘generic’
-
Генерировать код, оптимизированный для наиболее распространённых процессоров IA32/AMD64/EM64T. Если вы знаете процессор, на котором будет работать ваш код, то вы должны использовать соответствующий параметр -mtune или -march, а не -mtune=generic. Но если вы не знаете точно, какой процессор будут иметь пользователи вашего приложения, то вы должны использовать этот параметр.
По мере выхода новых процессоров на рынок поведение этого параметра будет меняться. Поэтому, если вы обновитесь до более новой версии GCC, генерация кода, контролируемая этим параметром, будет меняться, отражая наиболее распространённые процессоры на момент выпуска этой версии GCC.
Нет параметра -march=generic, потому что -march указывает набор инструкций, который может использовать компилятор, а нет универсального набора инструкций, применимого ко всем процессорам. В отличие от этого, -mtune указывает процессор (или, в данном случае, набор процессоров), для которого оптимизируется код.
- ‘intel’
-
Генерировать код, оптимизированный для самых современных процессоров Intel, которые для этой версии GCC — Haswell и Silvermont. Если вы знаете процессор, на котором будет работать ваш код, то вы должны использовать соответствующий параметр -mtune или -march, а не -mtune=intel. Но если вы хотите, чтобы ваше приложение работало быстрее как на Haswell, так и на Silvermont, то вы должны использовать этот параметр.
По мере выхода новых процессоров Intel на рынок поведение этого параметра будет меняться. Поэтому, если вы обновитесь до более новой версии GCC, генерация кода, контролируемая этим параметром, будет меняться, отражая самые современные процессоры Intel на момент выпуска этой версии GCC.
Нет параметра -march=intel, потому что -march указывает набор инструкций, который может использовать компилятор, а нет универсального набора инструкций, применимого ко всем процессорам. В отличие от этого, -mtune указывает процессор (или, в данном случае, набор процессоров), для которого оптимизируется код.
-mcpu=cpu-type-
Устаревший синоним для -mtune.
-mfpmath=unit
-
Генерация операций с плавающей запятой для выбранного устройства unit. Возможные значения для unit:
- ‘387’
-
Использование стандартного сопроцессора 387 с плавающей запятой, присутствующего на большинстве чипов, и эмуляции в противном случае. Код, скомпилированный с этим параметром, работает практически на всех системах. Временные результаты вычисляются с точностью 80 бит вместо точности, заданной типом, что приводит к немного другим результатам по сравнению с большинством других чипов. Подробнее см. -ffloat-store.
Это значение по умолчанию для целей x86-32.
- ‘sse’
-
Использование скалярных инструкций с плавающей запятой, присутствующих в наборе инструкций SSE. Этот набор инструкций поддерживается чипами Pentium III и новее, а в линейке AMD - чипами Athlon-4, Athlon XP и Athlon MP. Более ранние версии набора инструкций SSE поддерживают только арифметику одинарной точности, поэтому арифметика двойной и расширенной точности всё ещё выполняется с помощью 387. Более поздняя версия, присутствующая только в чипах Pentium 4 и AMD x86-64, также поддерживает арифметику двойной точности.
Для компилятора x86-32 необходимо использовать переключатели -march=cpu-type, -msse или -msse2, чтобы включить расширения SSE и сделать этот параметр эффективным. Для компилятора x86-64 эти расширения включены по умолчанию.
Полученный код должен быть значительно быстрее в большинстве случаев и избежать проблем с числовой неустойчивостью кода 387, но может нарушить некоторые существующие фрагменты кода, которые ожидают, что временные результаты будут иметь 80 бит.
Это значение по умолчанию для компилятора x86-64.
- ‘sse,387’
- ‘sse+387’
- ‘both’
Попытка одновременного использования обоих наборов инструкций. Это фактически удваивает количество доступных регистров, а на чипах с отдельными исполнительными блоками для 387 и SSE - и ресурсы для выполнения. Используйте этот параметр с осторожностью, поскольку он всё ещё является экспериментальным, так как планировщик регистров GCC не моделирует хорошо отдельные функциональные блоки, что приводит к нестабильной производительности.
-masm=dialect-
Выходные ассемблерные инструкции с использованием выбранного dialect. Также влияет на используемый диалект для базовых
asm(см. Базовый ассемблер) и расширенныхasm(см. Расширенный ассемблер). Поддерживаются варианты (в порядке диалекта) ‘att’ или ‘intel’. По умолчанию используется ‘att’. Darwin не поддерживает ‘intel’. -mieee-fp-mno-ieee-fp-
Управление тем, использует ли компилятор сравнения с плавающей запятой IEEE. Они правильно обрабатывают случай, когда результат сравнения не упорядочен.
-msoft-float-
Генерация вывода, содержащего вызовы библиотек для плавающей запятой.
Предупреждение: необходимые библиотеки не являются частью GCC. Обычно используются возможности обычного C-компилятора машины, но это нельзя сделать напрямую при кросс-компиляции. Вам нужно будет самостоятельно обеспечить подходящие функции библиотек для кросс-компиляции.
На машинах, где функция возвращает результаты с плавающей запятой в стеке регистров 80387, некоторые инструкции с плавающей запятой могут быть сгенерированы, даже если используется -msoft-float.
-mno-fp-ret-in-387-
Не использовать регистры FPU для значений возврата функций.
Обычная соглашение о вызовах функций возвращает значения типов
floatиdoubleв регистре FPU, даже если FPU отсутствует. Идея в том, что операционная система должна эмулировать FPU.Параметр -mno-fp-ret-in-387 вызывает возврат таких значений в обычные регистры процессора вместо этого.
-mno-fancy-math-387-
Некоторые эмуляторы 387 не поддерживают инструкции
sin,cosиsqrtдля 387. Укажите этот параметр, чтобы избежать генерации этих инструкций. Этот параметр используется по умолчанию в OpenBSD и NetBSD. Этот параметр переопределяется, когда -march указывает, что целевой процессор всегда имеет FPU, и поэтому инструкция не нуждается в эмуляции. Эти инструкции не генерируются, если вы не используете также переключатель -funsafe-math-optimizations. -malign-double-mno-align-double-
Управление тем, выравниваются ли переменные типа
double,long double, иlong longна границе двух слов или одного слова. Выравнивание переменных типаdoubleна границе двух слов создаёт код, который работает немного быстрее на Pentium за счёт большего использования памяти.На x86-64 -malign-double включён по умолчанию.
Предупреждение: если вы используете переключатель -malign-double, структуры, содержащие указанные типы, выравниваются по-другому, чем опубликованные спецификации интерфейса прикладного программирования (ABI) для x86-32, и не являются двоично совместимыми со структурами в коде, скомпилированном без этого переключателя.
-m96bit-long-double-m128bit-long-double-
Эти переключатели управляют размером типа
long double. Интерфейс прикладного программирования (ABI) x86-32 указывает размер в 96 бит, поэтому -m96bit-long-double используется по умолчанию в 32-битном режиме.Современные архитектуры (Pentium и новее) предпочитают, чтобы тип
long doubleвыравнивался на границе 8 или 16 байт. В массивах или структурах, соответствующих ABI, это невозможно. Поэтому, указание -m128bit-long-double выравнивает типlong doubleна границе 16 байт, добавляя дополнительно 32-битовое нулевое значение кlong double.В компиляторе x86-64 -m128bit-long-double используется по умолчанию, так как его ABI определяет, что тип
long doubleвыравнивается на границе 16 байт.Обратите внимание, что ни один из этих параметров не увеличивает точность по сравнению со стандартом x87 в 80 бит для типа
long double.Предупреждение: если вы переопределите значение по умолчанию для вашего целевого ABI, это изменит размер структур и массивов, содержащих переменные типа
long double, а также изменит соглашение о вызове функций для функций, принимающихlong double. Поэтому они не будут двоично совместимы с кодом, скомпилированным без этого переключателя. -mlong-double-64-mlong-double-80-mlong-double-128-
Эти переключатели управляют размером типа
long double. Размер в 64 бита делает типlong doubleэквивалентным типуdouble. Это значение по умолчанию для 32-битной библиотеки Bionic C. Размер в 128 бит делает типlong doubleэквивалентным типу__float128. Это значение по умолчанию для 64-битной библиотеки Bionic C.Предупреждение: если вы переопределите значение по умолчанию для вашего целевого ABI, это изменит размер структур и массивов, содержащих переменные типа
long double, а также изменит соглашение о вызове функций для функций, принимающихlong double. Поэтому они не будут двоично совместимы с кодом, скомпилированным без этого переключателя. -malign-data=type-
Управление тем, как GCC выравнивает переменные. Поддерживаемые значения для type: ‘compat’ использует увеличенное значение выравнивания, совместимое со стандартом GCC 4.8 и более ранними версиями, ‘abi’ использует значение выравнивания, указанное в psABI, а ‘cacheline’ использует увеличенное значение выравнивания, соответствующее размеру строки кэша. По умолчанию используется ‘compat’.
-mlarge-data-threshold=threshold-
При использовании -mcmodel=medium, объекты данных, размер которых больше threshold, размещаются в секции больших данных. Это значение должно быть одинаковым для всех объектов, связанных в двоичный файл, и по умолчанию равно 65535.
-mrtd-
Использование другого соглашения о вызове функций, в котором функции, принимающие фиксированное количество аргументов, возвращаются с инструкцией
ret num, которая удаляет их аргументы при возврате. Это экономит одну инструкцию в вызывающей функции, так как нет необходимости удалять аргументы там.Вы можете указать, что отдельные функции вызываются с этой последовательностью вызовов, используя атрибут функции
stdcall. Вы также можете переопределить параметр -mrtd, используя атрибут функцииcdecl. См. Атрибуты функций.Предупреждение: это соглашение о вызовах функций несовместимо с тем, что обычно используется в Unix, поэтому вы не можете использовать его, если вам нужно вызывать библиотеки, скомпилированные с помощью компилятора Unix.
Также вы должны предоставить прототипы функций для всех функций, которые принимают переменное количество аргументов (включая
printf); в противном случае для вызовов этих функций будет сгенерирован неверный код.Кроме того, результатом будет серьёзный неверный код, если вы вызываете функцию с слишком большим количеством аргументов. (В нормальных случаях дополнительные аргументы игнорируются без последствий.)
-mregparm=num-
Управление тем, сколько регистров используется для передачи целочисленных аргументов. По умолчанию регистры не используются для передачи аргументов, и не более 3 регистров могут быть использованы. Вы можете контролировать это поведение для конкретной функции, используя атрибут функции
regparm. См. Атрибуты функций.Предупреждение: если вы используете этот переключатель, и num не равно нулю, то вы должны скомпилировать все модули с одинаковым значением, включая любые библиотеки. Это включает системные библиотеки и начальные модули.
-msseregparm-
Использование соглашений о передаче регистров SSE для аргументов float и double и значений возврата. Вы можете контролировать это поведение для конкретной функции, используя атрибут функции
sseregparm. См. Атрибуты функций.Предупреждение: если вы используете этот переключатель, то вы должны скомпилировать все модули с одинаковым значением, включая любые библиотеки. Это включает системные библиотеки и начальные модули.
-mvect8-ret-in-mem-
Возвращать 8-байтовые векторы в память вместо регистров MMX. Это значение по умолчанию в Solaris 8 и 9 и VxWorks для соответствия ABI компиляторов Sun Studio до версии 12. Более поздние версии компилятора (начиная с Studio 12 Update 1) следуют ABI, используемому другими x86-целями, что является значением по умолчанию в Solaris 10 и более поздних версиях. Только используйте этот параметр, если вам нужно сохранить совместимость с существующим кодом, созданным предыдущими версиями компилятора или более ранними версиями GCC.
-mpc32-mpc64-mpc80
-
Установите точность чисел с плавающей запятой 80387 в 32, 64 или 80 бит. При указании -mpc32, значащие разряды результатов операций с плавающей запятой округляются до 24 бит (одинарной точности); -mpc64 округляет значащие разряды результатов операций с плавающей запятой до 53 бит (двойной точности), а -mpc80 округляет значащие разряды результатов операций с плавающей запятой до 64 бит (расширенной двойной точности), что является значением по умолчанию. При использовании этого параметра, операции с плавающей запятой в большей точности недоступны программисту без явного задания слова управления FPU.
Уменьшение точности операций с плавающей запятой до значения, меньшего, чем значение по умолчанию (80 бит), может ускорить некоторые программы на 2% или более. Обратите внимание, что некоторые математические библиотеки предполагают, что операции с плавающей запятой расширенной точности (80 бит) включены по умолчанию; в таких библиотеках процедуры могут столкнуться с существенной потерей точности, как правило, из-за так называемого «катастрофического сокращения», когда этот параметр используется для установки точности ниже расширенной.
-mstackrealign-
Перевыравнивание стека при входе. В x86, параметр -mstackrealign генерирует альтернативный пролог и эпилог, которые перевыравнивают стек во время выполнения, если это необходимо. Это поддерживает смешение устаревших кодов, сохраняющих 4-байтовое выравнивание стека, с современными кодами, сохраняющими 16-байтовое выравнивание для совместимости с SSE. См. также атрибут
force_align_arg_pointer, применимый к отдельным функциям. -mpreferred-stack-boundary=num-
Попытка сохранить границу стека, выровненную по границе в 2 в степени num байт. Если -mpreferred-stack-boundary не указан, значение по умолчанию равно 4 (16 байт или 128 бит).
Предупреждение: При генерации кода для архитектуры x86-64 с отключенными расширениями SSE, -mpreferred-stack-boundary=3 может быть использовано для сохранения границы стека, выровненной по границе 8 байт. Так как x86-64 ABI требует 16-байтового выравнивания стека, это несовместимо с ABI и предназначено для использования в контролируемой среде, где пространство стека является важным ограничением. Этот параметр приводит к неправильному коду, когда вызываются функции, скомпилированные с 16-байтовым выравниванием стека (такие как функции из стандартной библиотеки) с невыровненным стеком. В этом случае инструкции SSE могут привести к ошибкам доступа к невыровненной памяти. Кроме того, обработка переменных аргументов выполняется неправильно для объектов с 16-байтовым выравниванием (включая x87 long double и __int128), что приводит к неправильным результатам. Вам необходимо скомпилировать все модули с -mpreferred-stack-boundary=3, включая любые библиотеки. Это включает системные библиотеки и начальные модули.
-mincoming-stack-boundary=num-
Предполагается, что входящий стек выровнен по границе в 2 в степени num байт. Если -mincoming-stack-boundary не указан, используется значение, заданное параметром -mpreferred-stack-boundary.
На Pentium и Pentium Pro, значения
doubleиlong doubleдолжны быть выровнены по 8-байтовой границе (см. -malign-double), иначе это может привести к значительным потерям времени выполнения. На Pentium III, тип данных Streaming SIMD Extension (SSE)__m128может работать неправильно, если он не выровнен по 16-байтовой границе.Чтобы обеспечить правильное выравнивание этих значений в стеке, граница стека должна быть выровнена так, как это требуется любым значением, хранящимся в стеке. Кроме того, каждая функция должна быть сгенерирована таким образом, чтобы сохранять стек выровненным. Таким образом, вызов функции, скомпилированной с более высоким предпочтительным выравниванием стека, из функции, скомпилированной с более низким предпочтительным выравниванием стека, скорее всего, вызовет невыравнивание стека. Рекомендуется, чтобы библиотеки, использующие обратные вызовы, всегда использовали значение по умолчанию.
Это дополнительное выравнивание потребляет дополнительное пространство стека и, как правило, увеличивает размер кода. Код, чувствительный к использованию пространства стека, такой как встроенные системы и ядра операционных систем, может захотеть уменьшить предпочтительное выравнивание до -mpreferred-stack-boundary=2.
-mmmx-msse-msse2-msse3-mssse3-msse4-msse4a-msse4.1-msse4.2-mavx-mavx2-mavx512f-mavx512pf-mavx512er-mavx512cd-msha-maes-mpclmul-mclfushopt-mfsgsbase-mrdrnd-mf16c-mfma-mfma4-mno-fma4-mprefetchwt1-mxop-mlwp-m3dnow-mpopcnt-mabm-mbmi-mbmi2-mlzcnt-mfxsr-mxsave-mxsaveopt-mxsavec-mxsaves-mrtm-mtbm-mmpx-mmwaitx-
Эти переключатели позволяют использовать инструкции в наборах инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AVX512F, AVX512PF, AVX512ER, AVX512CD, SHA, AES, PCLMUL, FSGSBASE, RDRND, F16C, FMA, SSE4A, FMA4, XOP, LWP, ABM, BMI, BMI2, FXSR, XSAVE, XSAVEOPT, LZCNT, RTM, MPX, MWAITX или расширенных наборах инструкций 3DNow!. Каждый из них имеет соответствующий параметр -mno- для отключения использования этих инструкций.
Эти расширения также доступны как встроенные функции: см. x86 Встроенные функции для получения подробностей о функциях, включенных и отключенных этими переключателями.
Для автоматического генерирования инструкций SSE/SSE2 из кода с плавающей запятой (вместо инструкций 387), см. -mfpmath=sse.
GCC отключает инструкции SSEx, когда используется -mavx. Вместо этого он генерирует новые инструкции AVX или эквиваленты AVX для всех инструкций SSEx при необходимости.
Эти параметры позволяют GCC использовать эти расширенные инструкции в сгенерированном коде даже без -mfpmath=sse. Приложения, выполняющие обнаружение процессора во время выполнения, должны компилировать отдельные файлы для каждой поддерживаемой архитектуры, используя соответствующие флаги. В частности, файл, содержащий код обнаружения процессора, должен быть скомпилирован без этих параметров.
-mdump-tune-features-
Этот параметр инструктирует GCC вывести имена функций оптимизации производительности x86 и значения по умолчанию. Имена могут быть использованы в -mtune-ctrl=feature-list.
-mtune-ctrl=feature-list-
Этот параметр используется для точного управления функциями генерации кода x86. feature-list — это список имён feature, разделённых запятыми. См. также -mdump-tune-features. Если указан feature без префикса ‘^’, он включен; в противном случае — выключен. -mtune-ctrl=feature-list предназначен для разработчиков GCC. Его использование может привести к не покрытым тестированием путям выполнения кода, и потенциально может привести к ошибкам компилятора или ошибкам во время выполнения.
-mno-default-
Этот параметр инструктирует GCC выключить все настраиваемые функции. См. также -mtune-ctrl=feature-list и -mdump-tune-features.
-mcld-
Этот параметр инструктирует GCC вывести инструкцию
cldв прологе функций, использующих строковые инструкции. Строковые инструкции зависят от флага DF для выбора между режимом автоматического инкремента или декремента. Хотя ABI определяет, что флаг DF должен быть сброшен при входе в функцию, некоторые операционные системы нарушают это требование, не сбрасывая флаг DF в своих обработчиках исключений. Обработчик исключений может быть вызван с установленным флагом DF, что приводит к неправильному режиму направления при использовании строковых инструкций. Этот параметр может быть включён по умолчанию для 32-битных x86 целей путём настройки GCC с параметром конфигурации --enable-cld. Генерация инструкцийcldможет быть подавлена с помощью параметра компилятора -mno-cld в этом случае. -mvzeroupper-
Этот параметр инструктирует GCC выводить инструкцию
vzeroupperперед передачей управления из функции, чтобы свести к минимуму штраф за переход от AVX к SSE, а также устранить ненужныеzeroupperвстроенные функции. -mprefer-avx128-
Этот параметр инструктирует GCC использовать 128-битные инструкции AVX вместо 256-битных инструкций AVX в автоматическом векторизаторе.
-mcx16-
Этот параметр позволяет GCC генерировать инструкции
CMPXCHG16B.CMPXCHG16Bпозволяет выполнять атомарные операции над 128-битными двойными квадровыми (или oword) данными. Это полезно для счётчиков высокой точности, которые могут быть обновлены несколькими процессорами (или ядрами). Эта инструкция генерируется как часть встроенных атомарных функций: см. __sync Встроенные функции или __atomic Встроенные функции для получения подробностей. -msahf-
Этот параметр включает генерацию инструкций
SAHFв 64-битном коде. Ранние процессоры Intel Pentium 4 с поддержкой Intel 64, до появления Pentium 4 G1 step в декабре 2005 года, не имели инструкцийLAHFиSAHF, которые поддерживаются AMD64. Это инструкции загрузки и сохранения для определённых флагов состояния. В 64-битном режиме инструкцияSAHFиспользуется для оптимизации встроенных функцийfmod,drem, иremainder; см. Другие встроенные функции для получения подробностей. -mmovbe-
Этот параметр включает использование инструкции
movbeдля реализации__builtin_bswap32и__builtin_bswap64. -mcrc32-
Этот параметр включает встроенные функции
__builtin_ia32_crc32qi,__builtin_ia32_crc32hi,__builtin_ia32_crc32siи__builtin_ia32_crc32diдля генерации машинной инструкцииcrc32. -mrecip
-
Этот параметр включает использование инструкций
RCPSSиRSQRTSS(и их векторных вариантовRCPPSиRSQRTPS) с дополнительным шагом Ньютона-Рафсона для повышения точности вместоDIVSSиSQRTSS(и их векторных вариантов) для аргументов с плавающей точкой одинарной точности. Эти инструкции генерируются только при включении -funsafe-math-optimizations вместе с -finite-math-only и -fno-trapping-math. Обратите внимание, что, хотя пропускная способность последовательности выше, чем пропускная способность необратной инструкции, точность последовательности может быть снижена до 2 ulp (т.е. обратное значение 1.0 равно 0.99999994).Обратите внимание, что GCC реализует
1.0f/sqrtf(x)в терминахRSQRTSS(илиRSQRTPS) уже с -ffast-math (или с указанным выше сочетанием параметров) и не нуждается в -mrecip.Также обратите внимание, что GCC генерирует указанную выше последовательность с дополнительным шагом Ньютона-Рафсона для векторизованного деления на один с плавающей точкой и векторизованного
sqrtf(x)уже с -ffast-math (или с указанным выше сочетанием параметров) и не нуждается в -mrecip. -mrecip=opt-
Этот параметр управляет тем, какие инструкции оценки обратного могут быть использованы. opt представляет собой список параметров, разделенных запятыми, которые могут быть опережены символом ‘!’ для инвертирования параметра:
- ‘all’
-
Включить все инструкции оценки.
- ‘default’
-
Включить стандартные инструкции, эквивалентные -mrecip.
- ‘none’
-
Отключить все инструкции оценки, эквивалентные -mno-recip.
- ‘div’
-
Включить приближение для скалярного деления.
- ‘vec-div’
-
Включить приближение для векторизованного деления.
- ‘sqrt’
-
Включить приближение для скалярного квадратного корня.
- ‘vec-sqrt’
Включить приближение для векторизованного квадратного корня.
Например, -mrecip=all,!sqrt включает все приближения обратного значения, за исключением квадратного корня.
-mveclibabi=type-
Указывает тип ABI для использования при векторизации встроенных функций с помощью внешней библиотеки. Допустимые значения для type — ‘svml’ для библиотеки Intel short vector math и ‘acml’ для библиотеки AMD math core. Для использования этого параметра необходимо включить как -ftree-vectorize, так и -funsafe-math-optimizations, а также указать библиотеку, совместимую с SVML или ACML ABI, во время компоновки.
В настоящее время GCC генерирует вызовы
vmldExp2,vmldLn2,vmldLog102,vmldLog102,vmldPow2,vmldTanh2,vmldTan2,vmldAtan2,vmldAtanh2,vmldCbrt2,vmldSinh2,vmldSin2,vmldAsinh2,vmldAsin2,vmldCosh2,vmldCos2,vmldAcosh2,vmldAcos2,vmlsExp4,vmlsLn4,vmlsLog104,vmlsLog104,vmlsPow4,vmlsTanh4,vmlsTan4,vmlsAtan4,vmlsAtanh4,vmlsCbrt4,vmlsSinh4,vmlsSin4,vmlsAsinh4,vmlsAsin4,vmlsCosh4,vmlsCos4,vmlsAcosh4иvmlsAcos4для соответствующего типа функции при использовании -mveclibabi=svml, и__vrd2_sin,__vrd2_cos,__vrd2_exp,__vrd2_log,__vrd2_log2,__vrd2_log10,__vrs4_sinf,__vrs4_cosf,__vrs4_expf,__vrs4_logf,__vrs4_log2f,__vrs4_log10fи__vrs4_powfдля соответствующего типа функции при использовании -mveclibabi=acml. -mabi=name-
Генерирует код для указанной конвенции вызовов. Допустимые значения — ‘sysv’ для ABI, используемого в GNU/Linux и других системах, и ‘ms’ для Microsoft ABI. По умолчанию используется Microsoft ABI при нацеливании на Microsoft Windows и SysV ABI во всех других системах. Вы можете контролировать это поведение для отдельных функций, используя атрибуты функций
ms_abiиsysv_abi. См. Атрибуты функций. -mtls-dialect=type-
Генерирует код для доступа к локальному хранилищу потоков, используя конвенции ‘gnu’ или ‘gnu2’. ‘gnu’ — консервативный параметр по умолчанию; ‘gnu2’ более эффективен, но может добавлять требования к компиляции и выполнению, которые не могут быть выполнены на всех системах.
-mpush-args-mno-push-args-
Использует операции PUSH для хранения параметров вызова. Этот метод короче и обычно так же быстр, как метод, использующий операции SUB/MOV, и включен по умолчанию. В некоторых случаях его отключение может улучшить производительность из-за улучшенного планирования и уменьшения зависимостей.
-maccumulate-outgoing-args-
При включении вычисляется максимальный объем памяти, необходимый для параметров вызова, в префиксе функции. Это быстрее на большинстве современных процессоров из-за уменьшения зависимостей, улучшенного планирования и уменьшения использования стека при том, что предпочтительная граница стека не равна 2. Недостатком является заметное увеличение размера кода. Этот переключатель подразумевает -mno-push-args.
-mthreads-
Поддержка безопасной для потоков обработки исключений в MinGW. Программы, которые полагаются на безопасную для потоков обработку исключений, должны скомпилировать и скомпоновать весь код с параметром -mthreads. При компиляции -mthreads определяет -D_MT; при компоновке он подключает специальную библиотеку поддержки потоков -lmingwthrd, которая очищает данные обработки исключений на каждый поток.
-mno-align-stringops-
Не выравнивать целевой адрес встроенных строковых операций. Этот переключатель уменьшает размер кода и улучшает производительность в случае, если целевой адрес уже выровнен, но GCC об этом не знает.
-minline-all-stringops-
По умолчанию GCC встраивает строковые операции только тогда, когда целевой адрес известен как выровненный по крайней мере до 4-байтовой границы. Это позволяет большему встраиванию и увеличивает размер кода, но может улучшить производительность кода, зависящего от быстрых
memcpy,strlen, иmemsetдля коротких длин. -minline-stringops-dynamically-
Для строковых операций неизвестного размера используйте проверки во время выполнения с встроенным кодом для небольших блоков и вызов библиотеки для больших блоков.
-mstringop-strategy=alg-
Переопределяет внутренний эвристический алгоритм для выбора алгоритма, используемого для встраивания строковых операций. Разрешенные значения для alg:
- ‘rep_byte’
- ‘rep_4byte’
- ‘rep_8byte’
-
Расширить с использованием i386
repпрефикса указанного размера. - ‘byte_loop’
- ‘loop’
- ‘unrolled_loop’
-
Расширить до встроенного цикла.
- ‘libcall’
Всегда использовать вызов библиотеки.
-mmemcpy-strategy=strategy-
Переопределяет внутренний эвристический алгоритм для принятия решения о том, должен ли быть встроен
__builtin_memcpyи какой алгоритм встраивания использовать, когда известен ожидаемый размер операции копирования. strategy представляет собой список, разделенный запятыми, тройками alg:max_size:dest_align. alg определяется в -mstringop-strategy, max_size определяет максимальный размер байтов, с которым разрешен алгоритм встраивания alg. Для последней тройки max_size должен быть-1. Максимальный размер max_size троек в списке должен быть указан в порядке возрастания. Минимальный размер байтов для alg равен0для первой тройки иmax_size + 1предыдущего диапазона. -mmemset-strategy=strategy-
Параметр аналогичен -mmemcpy-strategy=, но он управляет расширением
__builtin_memset. -momit-leaf-frame-pointer-
Не сохранять указатель на кадр в регистре для функций-листьев. Это позволяет избежать инструкций для сохранения, настройки и восстановления указателей на кадр, что делает дополнительный регистр доступным в функциях-листьях. Параметр -fomit-leaf-frame-pointer удаляет указатель на кадр для функций-листьев, что может затруднить отладку.
-mtls-direct-seg-refs-mno-tls-direct-seg-refs-
Управляет тем, могут ли переменные TLS быть обращены с помощью смещений от регистра сегмента TLS (
%gsдля 32-битных,%fsдля 64-битных), или необходим ли добавление указателя на базовый адрес потока. Правильность этого зависит от операционной системы и от того, отображает ли она сегмент для всего пространства TLS.Для систем, использующих GNU C Library, значение по умолчанию — включено.
-msse2avx-mno-sse2avx-
Указывает ассемблеру, что он должен кодировать инструкции SSE с префиксом VEX. Параметр -mavx включает это по умолчанию.
-mfentry-mno-fentry-
Если включено профилирование (-pg), вызов счетчика профилирования помещается перед префиксом. Примечание: на архитектурах x86 атрибут
ms_hook_prologueв настоящее время не поддерживается для -mfentry и -pg. -mrecord-mcount-mno-record-mcount-
Если включено профилирование (-pg), генерируется секция __mcount_loc, которая содержит указатели на каждый вызов профилирования. Это полезно для автоматической подмены и выхода из вызовов.
-mnop-mcount-mno-nop-mcount-
Если включено профилирование (-pg), вызовы функций профилирования генерируются как пустые операции. Это полезно, когда они должны быть подменены позже динамически. Скорее всего, это полезно только вместе с -mrecord-mcount.
-mskip-rax-setup-mno-skip-rax-setup-
При генерации кода для архитектуры x86-64 с отключенными расширениями SSE, -mskip-rax-setup может быть использован для пропуска установки регистра RAX, когда переменные аргументы не передаются в векторные регистры.
Предупреждение: Поскольку регистр RAX используется для избежания ненужного сохранения векторных регистров в стеке при передаче переменных аргументов, влияние этого параметра состоит в том, что вызываемые функции могут тратить некоторое место в стеке, неправильно работать или переходить по случайному адресу. GCC 4.4 или более поздних версий не имеет этих проблем, независимо от значения регистра RAX.
-m8bit-idiv-mno-8bit-idiv
-
На некоторых процессорах, таких как Intel Atom, деление 8-битных беззнаковых целых чисел значительно быстрее, чем деление 32/64-битных целых чисел. Этот параметр генерирует проверку во время выполнения. Если и делимое, и делитель находятся в диапазоне от 0 до 255, используется деление 8-битных беззнаковых целых чисел вместо деления 32/64-битных целых чисел.
-mavx256-split-unaligned-load-mavx256-split-unaligned-store-
Разделенное 32-байтовое невыровненное загрузка и сохранение AVX.
-mstack-protector-guard=guard-
Генерирует код защиты стека с использованием канистра (canary) в guard. Поддерживаемые расположения: ‘global’ для глобального канистра или ‘tls’ для канистра на нить в блоке TLS (по умолчанию). Этот параметр действует только при указании -fstack-protector или -fstack-protector-all.
Эти переключатели ‘-m’ поддерживаются дополнительно на процессорах x86-64 в 64-битных средах.
-m32-m64-mx32-m16-
Генерирует код для 16-, 32- или 64-битной среды. Параметр -m32 устанавливает
int,long, и типы указателей на 32 бита, а также генерирует код, который работает на любой системе i386.Параметр -m64 устанавливает
intна 32 бита, аlongи типы указателей на 64 бита и генерирует код для архитектуры x86-64. Только для Darwin параметр -m64 также отключает параметры -fno-pic и -mdynamic-no-pic.Параметр -mx32 устанавливает
int,long, и типы указателей на 32 бита и генерирует код для архитектуры x86-64.Параметр -m16 такой же, как -m32, за исключением того, что он выводит директиву
.code16gccассемблера в начале выходных данных ассемблера, чтобы двоичный файл мог работать в 16-битном режиме. -mno-red-zone-
Не использовать так называемую «красную зону» для кода x86-64. Красная зона предписывается x86-64 ABI; это область размером 128 байт за расположением указателя стека, которая не изменяется обработчиками сигналов или прерываний и, следовательно, может использоваться для временных данных без корректировки указателя стека. Флаг -mno-red-zone отключает эту красную зону.
-mcmodel=small-
Генерирует код для малой модели кода: программа и её символы должны быть связаны в нижних 2 ГБ адресного пространства. Указатели – 64 бита. Программы могут быть статически или динамически связаны. Это модель кода по умолчанию.
-mcmodel=kernel-
Генерирует код для модели кода ядра. Ядро работает в отрицательных 2 ГБ адресного пространства. Эта модель должна использоваться для кода ядра Linux.
-mcmodel=medium-
Генерирует код для средней модели: программа подключается в нижних 2 ГБ адресного пространства. Малые символы также размещаются там. Символы размером больше, чем -mlarge-data-threshold, помещаются в разделы больших данных или BSS и могут располагаться выше 2 ГБ. Программы могут быть статически или динамически связаны.
-mcmodel=large-
Генерирует код для большой модели. Эта модель не делает предположений о адресах и размерах разделов.
-maddress-mode=long-
Генерирует код для режима длинного адреса. Это поддерживается только для 64-битных и x32 сред. Это режим адреса по умолчанию для 64-битных сред.
-maddress-mode=short-
Генерирует код для режима короткого адреса. Это поддерживается только для 32-битных и x32 сред. Это режим адреса по умолчанию для 32-битных и x32 сред.
Далее: Параметры x86 Windows, Предыдущее: Параметры VxWorks, Вверх: Параметры подмоделей [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/x86-Options.html