Spec-Zone.ru › GCC 7

3.18.55 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:

END_OF_DOCUMENT_MARKER
‘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 Server с 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. (Планирование для этого чипа не реализовано.)

‘c7’

Процессор VIA C7 (Esther) с поддержкой наборов инструкций MMX, SSE, SSE2 и SSE3. (Планирование для этого чипа не реализовано.)

‘samuel-2’

Процессор VIA Eden Samuel 2 с поддержкой наборов инструкций MMX и 3DNow! (Планирование для этого чипа не реализовано.)

‘nehemiah’

Процессор VIA Eden Nehemiah с поддержкой наборов инструкций MMX и SSE. (Планирование для этого чипа не реализовано.)

‘esther’

Процессор VIA Eden Esther с поддержкой наборов инструкций MMX, SSE, SSE2 и SSE3. (Планирование для этого чипа не реализовано.)

‘eden-x2’

Процессор VIA Eden X2 с поддержкой x86-64, MMX, SSE, SSE2 и SSE3. (Планирование для этого чипа не реализовано.)

‘eden-x4’

Процессор VIA Eden X4 с поддержкой x86-64, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX и AVX2. (Планирование для этого чипа не реализовано.)

‘nano’

Общий процессор VIA Nano с поддержкой x86-64, MMX, SSE, SSE2, SSE3 и SSSE3. (Планирование для этого чипа не реализовано.)

‘nano-1000’

Процессор VIA Nano 1xxx с поддержкой x86-64, MMX, SSE, SSE2, SSE3 и SSSE3. (Планирование для этого чипа не реализовано.)

‘nano-2000’

Процессор VIA Nano 2xxx с поддержкой x86-64, MMX, SSE, SSE2, SSE3 и SSSE3. (Планирование для этого чипа не реализовано.)

‘nano-3000’

Процессор VIA Nano 3xxx с поддержкой x86-64, MMX, SSE, SSE2, SSE3, SSSE3 и SSE4.1. (Планирование для этого чипа не реализовано.)

‘nano-x2’

Двухъядерный процессор VIA Nano с поддержкой x86-64, MMX, SSE, SSE2, SSE3, SSSE3 и SSE4.1. (Планирование для этого чипа не реализовано.)

‘nano-x4’

Четырехъядерный процессор VIA Nano с поддержкой x86-64, MMX, SSE, SSE2, SSE3, SSSE3 и SSE4.1. (Планирование для этого чипа не реализовано.)

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

‘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, целей Darwin x86-32 и значение по умолчанию для целей x86-32 с набором инструкций SSE2, когда включен -ffast-math.

‘sse,387’
‘sse+387’
‘both’

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

-masm=dialect

Выходные инструкции ассемблера, используя выбранный dialect. Также влияет на диалект, используемый для базового asm (см. Basic Asm) и расширенного asm (см. Extended Asm). Поддерживаемые варианты (в порядке диалектов) — ‘att’ или ‘intel’. По умолчанию используется ‘att’. Darwin не поддерживает ‘intel’.

-mieee-fp
-mno-ieee-fp

Управление тем, использует ли компилятор сравнения с плавающей запятой IEEE. Они правильно обрабатывают случай, когда результат сравнения неопределён.

-m80387
-mhard-float

Генерировать выходные данные, содержащие инструкции 80387 для операций с плавающей запятой.

-mno-80387
-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 байт, добавляя к long double дополнительный 32-битный ноль.

В компиляторе x86-64 -m128bit-long-double является значением по умолчанию, так как его ABI определяет, что long double выравнивается на границе 16 байт.

Обратите внимание, что ни одна из этих опций не увеличивает точность по сравнению со стандартными 80 битами x87 для 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
-m3dnowa
-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! или расширенные наборы инструкций 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 в 64-битном коде для реализации операций сравнения и обмена на 128-битных объектах с выравниванием по 16 байтам. Это полезно для атомных обновлений структур данных, размер которых превышает один машинный слово. Компилятор использует эту инструкцию для реализации встроенных функций __sync. Однако для встроенных функций __atomic, работающих с 128-битными целыми числами, всегда используется вызов библиотеки.

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

-mms-bitfields
-mno-ms-bitfields

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

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

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

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

  1. Члены структуры хранятся последовательно в том порядке, в котором они объявлены: первый член имеет самый низкий адрес памяти, а последний — самый высокий.
  2. Каждый объект данных имеет требование к выравниванию. Требование к выравниванию для всех данных, кроме структур, объединений и массивов, составляет либо размер объекта, либо текущий размер упаковки (указанный атрибутом aligned или предикатом pack), в зависимости от того, что меньше. Для структур, объединений и массивов требование к выравниванию — это наибольшее требование к выравниванию их членов. Каждый объект выделяет смещение таким образом, чтобы:
    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 троек в списке должен быть указан в порядке возрастания. Минимальный размер 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

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

-mgeneral-regs-only

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

-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. Красная зона требуется ABI x86-64; это область размером 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-7.5.0/gcc/x86-Options.html

Spec-Zone.ru

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