Spec-Zone.ru › GCC 6

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

‘lakemont’

Встроенный процессор Intel Lakemont, основанный на процессоре Intel Pentium.

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

‘skylake’

Процессор Intel Skylake с 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, CLFLUSHOPT, XSAVEC и XSAVES.

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

‘skylake-avx512’

Серверный процессор Intel Skylake с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ и AVX512CD.

‘k6’

Процессор AMD K6 с поддержкой набора инструкций MMX.

‘k6-2’
‘k6-3’

Улучшенные версии процессора AMD K6 с поддержкой наборов инструкций MMX и 3DNow!.

‘athlon’
‘athlon-tbird’

Процессор AMD Athlon с поддержкой наборов инструкций MMX, 3dNOW!, улучшенного 3DNow! и предварительных инструкций 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-битности.)

‘znver1’

Процессоры на основе ядер AMD Family 17h с поддержкой набора инструкций x86-64. (Этот набор включает BMI, BMI2, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCL_MUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT и расширения набора инструкций 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=generic следует использовать соответствующую опцию -mtune или -march. Но если вы не знаете точно, какой процессор будут иметь пользователи вашего приложения, то следует использовать эту опцию.

По мере появления новых процессоров на рынке поведение этой опции будет меняться. Поэтому, если вы обновитесь до новой версии GCC, генерация кода, управляемая этой опцией, изменится, отразив наиболее распространённые процессоры на момент выпуска этой версии GCC.

Нет опции -march=generic, потому что -march указывает набор инструкций, который может использовать компилятор, а нет универсального набора инструкций, применимого ко всем процессорам. В отличие от этого, -mtune указывает процессор (или, в данном случае, набор процессоров), для которого оптимизируется код.

‘intel’

Генерирует код, оптимизированный для самых современных процессоров Intel, которые для этой версии GCC являются Haswell и Silvermont. Если вы знаете процессор, на котором будет выполняться ваш код, то вместо -mtune=intel следует использовать соответствующую опцию -mtune или -march. Но если вы хотите, чтобы ваше приложение работало лучше как на 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

Управление тем, выравнивает ли GCC переменные double, long double, и long long на границе двух слов или одном слове. Выравнивание переменных double на границе двух слов приводит к коду, который работает немного быстрее на Pentium с затратами дополнительной памяти.

В x86-64 -malign-double включено по умолчанию.

Предупреждение: если вы используете переключатель -malign-double, структуры, содержащие указанные типы, выравниваются по-другому, чем опубликованные спецификации двоичного интерфейса приложения для x86-32, и не являются совместимыми с кодом, скомпилированным без этого переключателя.

-m96bit-long-double
-m128bit-long-double

Эти переключатели управляют размером типа long double. Интерфейс приложений 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 для плавающей точки и двойных аргументов и возвращаемых значений. Вы можете управлять этим поведением для конкретной функции, используя атрибут функции 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 тип данных расширенного набора команд SIMD потокового типа (SSE) __m128 может работать неправильно, если он не выровнен по 16-байтовой границе.

Для обеспечения правильного выравнивания этих значений в стеке граница стека должна быть выровнена так же, как и любая величина, хранимая в стеке. Кроме того, каждая функция должна быть сгенерирована таким образом, чтобы сохранять выравнивание стека. Таким образом, вызов функции, скомпилированной с более высоким предпочтительным выравниванием стека из функции, скомпилированной с более низким предпочтительным выравниванием стека, скорее всего, приведет к невыравниванию стека. Рекомендуется, чтобы библиотеки, использующие обратные вызовы, всегда использовали значение по умолчанию.

Это дополнительное выравнивание потребляет дополнительное место в стеке и, как правило, увеличивает размер кода. Код, чувствительный к использованию места в стеке, например, встроенные системы и ядра операционных систем, могут захотеть уменьшить предпочтительное выравнивание до -mpreferred-stack-boundary=2.

-mmmx
-msse
-msse2
-msse3
-mssse3
-msse4
-msse4a
-msse4.1
-msse4.2
-mavx
-mavx2
-mavx512f
-mavx512pf
-mavx512er
-mavx512cd
-mavx512vl
-mavx512bw
-mavx512dq
-mavx512ifma
-mavx512vbmi
-msha
-maes
-mpclmul
-mclflushopt
-mfsgsbase
-mrdrnd
-mf16c
-mfma
-mfma4
-mprefetchwt1
-mxop
-mlwp
-m3dnow
-mpopcnt
-mabm
-mbmi
-mbmi2
-mlzcnt
-mfxsr
-mxsave
-mxsaveopt
-mxsavec
-mxsaves
-mrtm
-mtbm
-mmpx
-mmwaitx
-mclzero
-mpku

Эти переключатели позволяют использовать инструкции в наборах команд 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, AVX512VL, AVX512BW, AVX512DQ, AVX512IFMA AVX512VBMI, BMI, BMI2, FXSR, XSAVE, XSAVEOPT, LZCNT, RTM, MPX, MWAITX, PKU или расширенные наборы команд 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

Этот параметр включает генерацию инструкций CMPXCHG16B в GCC. CMPXCHG16B позволяет выполнять атомарные операции с данными типа 128-битного двойного квадрослова (или oword). Это полезно для счетчиков высокой точности, которые могут обновляться несколькими процессорами (или ядрами). Эта инструкция генерируется как часть встроенных атомарных функций: см. __sync Builtins или __atomic Builtins для получения подробностей.

-msahf

Этот параметр включает генерацию инструкций SAHF в 64-битном коде. Ранние процессоры Intel Pentium 4 с поддержкой Intel 64, до появления шага Pentium 4 G1 в декабре 2005 года, не имели инструкций LAHF и SAHF, которые поддерживаются AMD64. Это инструкции загрузки и сохранения для определенных флагов состояния. В 64-битном режиме инструкция SAHF используется для оптимизации встроенных функций fmod, drem, и remainder; см. Other Builtins для получения подробностей.

-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 вместе с -ffinite-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, а совместимая с ABI библиотека SVML или ACML должна быть указана при компоновке.

В настоящее время 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’ для ABI Microsoft. По умолчанию используется ABI Microsoft при нацеливании на Microsoft Windows и SysV ABI во всех других системах. Вы можете контролировать это поведение для определенных функций, используя атрибуты функций ms_abi и sysv_abi. См. Function Attributes.

-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, которая очищает данные обработки исключений для каждого потока.

-mms-bitfields
-mno-ms-bitfields

Включить/выключить компоновку полей-битов, совместимую с родным компилятором Microsoft Windows.

Если packed используется в структуре, или если используются поля-биты, то возможно, Microsoft ABI компонует структуру иначе, чем GCC. Особенно при перемещении упакованных данных между функциями, скомпилированными с GCC и родным компилятором Microsoft (через вызов функции или как данные в файле), может потребоваться доступ к обоим форматам.

Этот параметр включён по умолчанию для целей Microsoft Windows. Это поведение также можно контролировать локально с помощью атрибутов переменных или типов. Для получения дополнительной информации см. Атрибуты переменных x86 и Атрибуты типов x86.

Алгоритм компоновки структуры Microsoft довольно прост, за исключением упаковки полей-битов. Выравнивание и заполнение членов структур, а также возможность поля-бита пересекать границу единицы хранения определяются следующими правилами:

  1. Члены структуры хранятся последовательно в том порядке, в котором они объявлены: первый член имеет самый низкий адрес памяти, а последний — самый высокий.
  2. Каждый объект данных имеет требования к выравниванию. Требование к выравниванию для всех данных, кроме структур, объединений и массивов, равно либо размеру объекта, либо текущему размеру упаковки (указанному с помощью атрибута aligned или директивы pack pragma), в зависимости от того, что меньше. Для структур, объединений и массивов требование к выравниванию является наибольшим требованием к выравниванию из всех членов. Каждому объекту выделяется смещение таким образом, что:
    offset % alignment_requirement == 0
  3. Смежные поля-биты упаковываются в одну единицу размещения 1, 2 или 4 байта, если целочисленные типы имеют одинаковый размер и если следующее поле-бит помещается в текущую единицу размещения без пересечения границы, накладываемой общими требованиями к выравниванию полей-битов.

MSVC интерпретирует поля-биты нулевой длины следующим образом:

  1. Если поле-бит нулевой длины вставлено между двумя полями-битами, которые обычно объединяются, поля-биты не объединяются.

    Например:

    struct
     {
       unsigned long bf_1 : 12;
       unsigned long : 0;
       unsigned long bf_2 : 12;
     } t1;

    Размер t1 составляет 8 байт с полем-битом нулевой длины. Если поле-бит нулевой длины удалить, размер t1 составит 4 байта.

  2. Если поле-бит нулевой длины вставлено после поля-бита foo, и выравнивание поля-бита нулевой длины больше, чем выравнивание следующего члена, bar, bar выравнивается как тип поля-бита нулевой длины.

    Например:

    struct
     {
       char foo : 4;
       short : 0;
       char bar;
     } t2;
    
    struct
     {
       char foo : 4;
       short : 0;
       double bar;
     } t3;

    Для t2, bar помещается по смещению 2, а не 1. Соответственно, размер t2 составляет 4. Для t3, поле-бит нулевой длины не влияет на выравнивание bar или, как следствие, размер структуры.

    Принимая это во внимание, важно отметить следующее:

    1. Если за обычным полем-битом следует поле-бит нулевой длины, тип поля-бита нулевой длины может повлиять на выравнивание всей структуры. Например, t2 имеет размер 4 байта, поскольку за полем-битом следует поле-бит нулевой длины, и он имеет тип short.
    2. Даже если за полем-битом нулевой длины не следует обычное поле-бит, оно может повлиять на выравнивание структуры:
      struct
       {
         char foo : 6;
         long : 0;
       } t4;

      Здесь t4 занимает 4 байта.

  3. Поля-биты нулевой длины, следующие за членами, не являющимися полями-битами, игнорируются:
    struct
     {
       char foo;
       long : 0;
       char bar;
     } t5;

    Здесь t5 занимает 2 байта.

-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), сгенерировать вызовы функций профилирования как NOP. Это полезно, когда они должны быть заменены позже динамически. Вероятно, это полезно только вместе с -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

Генерировать код защиты стека с использованием канделя в guard. Поддерживаются места ‘global’ для глобального канделя или ‘tls’ для канделя на поток в блоке TLS (по умолчанию). Этот параметр действует только при указании -fstack-protector или -fstack-protector-all.

-mmitigate-rop

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

-mindirect-branch=choice

Преобразовать косвенный вызов и переход с помощью choice. По умолчанию используется ‘keep’, что сохраняет косвенный вызов и переход без изменений. ‘thunk’ преобразует косвенный вызов и переход в вызов и возврат thunk. ‘thunk-inline’ преобразует косвенный вызов и переход во встроенный вызов и возврат thunk. ‘thunk-extern’ преобразует косвенный вызов и переход во внешний вызов и возврат thunk, предоставляемый в отдельном объектном файле. Можно управлять этим поведением для конкретной функции, используя атрибут функции indirect_branch. См. Атрибуты функций.

Обратите внимание, что -mcmodel=large несовместим с -mindirect-branch=thunk и -mindirect-branch=thunk-extern, так как функция thunk может быть недоступной в большой модели кода.

-mfunction-return=choice

Преобразовать возврат функции с помощью choice. По умолчанию используется ‘keep’, что сохраняет возврат функции без изменений. ‘thunk’ преобразует возврат функции в вызов и возврат thunk. ‘thunk-inline’ преобразует возврат функции во встроенный вызов и возврат thunk. ‘thunk-extern’ преобразует возврат функции во внешний вызов и возврат thunk, предоставляемый в отдельном объектном файле. Можно управлять этим поведением для конкретной функции, используя атрибут функции function_return. См. Атрибуты функций.

Обратите внимание, что -mcmodel=large несовместим с -mfunction-return=thunk и -mfunction-return=thunk-extern, так как функция thunk может быть недоступной в большой модели кода.

-mindirect-branch-register

Принудительно использовать регистр для косвенного вызова и перехода.

Эти переключатели ‘-m’ поддерживаются помимо вышеперечисленных на процессорах x86-64 в 64-битных средах.

-m32
-m64
-mx32
-m16
-miamcu

Генерировать код для 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-битном режиме.

Опция -miamcu генерирует код, который соответствует psABI Intel MCU. Она требует, чтобы опция -m32 была включена.

-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, помещаются в разделы large data или 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-6.5.0/gcc/x86-Options.html

Spec-Zone.ru

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