Spec-Zone.ru › GCC 9

3.18.58 Опции 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 генерирует код, оптимизированный для локальной машины в рамках ограничений выбранного набора инструкций.

‘x86-64’

Общий процессор с 64-разрядными расширениями.

‘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, PREFETCHW, PCLMUL и RDRND.

‘goldmont’

Процессор Intel Goldmont с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT и FSGSBASE.

‘goldmont-plus’

Процессор Intel Goldmont Plus с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX и UMIP.

‘tremont’

Процессор Intel Tremont с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, UMIP, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B и WAITPKG.

‘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, PREFETCHWT1, AVX512F, AVX512PF, AVX512ER и AVX512CD.

‘knm’

Процессор Intel Knights Mill с 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, PREFETCHWT1, AVX512F, AVX512PF, AVX512ER, AVX512CD, AVX5124VNNIW, AVX5124FMAPS и AVX512VPOPCNTDQ.

‘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, CLWB, AVX512VL, AVX512BW, AVX512DQ и AVX512CD.

‘cannonlake’

Серверный процессор Intel Cannonlake с 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, AVX512VBMI, AVX512IFMA, SHA и UMIP.

‘icelake-client’

Клиентский процессор Intel Icelake с 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, AVX512VBMI, AVX512IFMA, SHA, CLWB, UMIP, RDPID, GFNI, AVX512VBMI2, AVX512VPOPCNTDQ, AVX512BITALG, AVX512VNNI, VPCLMULQDQ и VAES.

‘icelake-server’

Серверный процессор Intel Icelake с 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, AVX512VBMI, AVX512IFMA, SHA, CLWB, UMIP, RDPID, GFNI, AVX512VBMI2, AVX512VPOPCNTDQ, AVX512BITALG, AVX512VNNI, VPCLMULQDQ, VAES, PCONFIG и WBNOINVD.

‘cascadelake’

Процессор Intel Cascadelake с 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, CLWB, AVX512VL, AVX512BW, AVX512DQ и AVX512VNNI.

‘tigerlake’

Процессор Intel Tigerlake с 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, AVX512VBMI, AVX512IFMA, SHA, CLWB, UMIP, RDPID, GFNI, AVX512VBMI2, AVX512VPOPCNTDQ, AVX512BITALG, AVX512VNNI, VPCLMULQDQ, VAES, PCONFIG, WBNOINVD, MOVDIRI, MOVDIR64B и CLWB.

‘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-разрядные расширения набора инструкций.

‘znver2’

Процессоры AMD Family 17h на основе ядер с набором инструкций x86-64. (Этот набор включает BMI, BMI2, CLWB, 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 для более подробного описания.

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

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

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

-masm=dialect

Вывод инструкций ассемблера с использованием выбранного dialect. Также влияет на диалект, используемый для базовых asm (см. Базовый ассемблер) и расширенных 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. Укажите эту опцию, чтобы избежать генерации этих инструкций. Эта опция переопределяется, когда -march указывает, что целевой процессор всегда имеет FPU, и поэтому инструкция не нуждается в эмуляции. Эти инструкции не генерируются, если вы также не используете переключатель -funsafe-math-optimizations.

-malign-double
-mno-align-double

Управление выравниванием переменных double, long double, и long long GCC на границе в два слова или одно слово. Выравнивание переменных 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 для аргументов с плавающей точкой и double, а также для значений возврата. Вы можете управлять этим поведением для определенной функции, используя атрибут функции sseregparm. См. Атрибуты функций.

Предупреждение: если вы используете этот переключатель, все модули, включая библиотеки, должны быть построены с этим же значением. Это включает системные библиотеки и начальные модули.

-mvect8-ret-in-mem

Возвращение 8-байтовых векторов в память вместо регистров MMX. Это значение по умолчанию в Solaris 8 и 9 и VxWorks для соответствия ABI компиляторов Sun Studio до версии 12. Более поздние версии компиляторов (начиная с Studio 12 Update 1) следуют ABI, используемому другими целевыми x86, что является значением по умолчанию в Solaris 10 и более поздних версиях. Только используйте этот параметр, если вам нужно оставаться совместимым с существующим кодом, созданным этими предыдущими версиями компиляторов или более старыми версиями GCC.

-mpc32
-mpc64
-mpc80

Установите точность 80387 с плавающей запятой в 32, 64 или 80 бит. Когда указан -mpc32, значащие части результатов операций с плавающей запятой округляются до 24 бит (одинарная точность); -mpc64 округляет значащие части результатов операций с плавающей запятой до 53 бит (двойная точность), а -mpc80 округляет значащие части результатов операций с плавающей запятой до 64 бит (расширенная двойная точность), что является значением по умолчанию. При использовании этого параметра операции с плавающей запятой в более высокой точности недоступны программисту без явного задания слова управления FPU.

Уменьшение округления операций с плавающей запятой по сравнению со значением по умолчанию 80 бит может ускорить некоторые программы на 2% или более. Обратите внимание, что некоторые математические библиотеки предполагают, что операции с плавающей запятой с расширенной точностью (80 бит) включены по умолчанию; процедуры в таких библиотеках могут потерять значительную точность, как правило, из-за так называемой «катастрофической отмены», когда этот параметр используется для задания точности ниже расширенной.

-mstackrealign

Перевыравнивание стека при входе. На x86 параметр -mstackrealign генерирует альтернативный пролог и эпилог, которые перевыравнивают стек во время выполнения, если это необходимо. Это поддерживает смешение устаревших кодов, которые сохраняют 4-байтовое выравнивание стека, с современными кодами, которые сохраняют 16-байтовое выравнивание стека для совместимости с SSE. См. также атрибут force_align_arg_pointer, применимый к отдельным функциям.

-mpreferred-stack-boundary=num

Попытка сохранить границу стека, выровненную на границе в 2num байт. Если -mpreferred-stack-boundary не указан, по умолчанию используется 4 (16 байт или 128 бит).

Предупреждение: при генерации кода для архитектуры x86-64 с отключенными расширениями SSE параметр -mpreferred-stack-boundary=3 может использоваться для сохранения границы стека, выровненной на 8-байтовой границе. Поскольку ABI x86-64 требует 16-байтового выравнивания стека, это несовместимо с ABI и предназначено для использования в контролируемой среде, где пространство стека является важным ограничением. Этот параметр приводит к неправильному коду, когда функции, скомпилированные с 16-байтовым выравниванием стека (например, функции из стандартной библиотеки), вызываются с невыровненным стеком. В этом случае инструкции SSE могут привести к ошибкам доступа к невыровненной памяти. Кроме того, обработка переменных аргументов неверна для объектов с 16-байтовым выравниванием (включая x87 long double и __int128), что приводит к неправильным результатам. Все модули должны быть построены с -mpreferred-stack-boundary=3, включая любые библиотеки. Это включает системные библиотеки и начальные модули.

-mincoming-stack-boundary=num

Предполагается, что входящий стек выровнен на границе в 2num байт. Если -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
-mclwb
-mfsgsbase
-mptwrite
-mrdrnd
-mf16c
-mfma
-mpconfig
-mwbnoinvd
-mfma4
-mprfchw
-mrdpid
-mprefetchwt1
-mrdseed
-msgx
-mxop
-mlwp
-m3dnow
-m3dnowa
-mpopcnt
-mabm
-madx
-mbmi
-mbmi2
-mlzcnt
-mfxsr
-mxsave
-mxsaveopt
-mxsavec
-mxsaves
-mrtm
-mhle
-mtbm
-mmwaitx
-mclzero
-mpku
-mavx512vbmi2
-mgfni
-mvaes
-mwaitpkg
-mvpclmulqdq
-mavx512bitalg
-mmovdiri
-mmovdir64b
-mavx512vpopcntdq
-mavx5124fmaps
-mavx512vnni
-mavx5124vnniw
-mcldemote

Эти переключатели позволяют использовать инструкции в наборах MMX, SSE, SSE2, SSE3, SSSE3, SSE4, SSE4A, SSE4.1, SSE4.2, AVX, AVX2, AVX512F, AVX512PF, AVX512ER, AVX512CD, AVX512VL, AVX512BW, AVX512DQ, AVX512IFMA, AVX512VBMI, SHA, AES, PCLMUL, CLFLUSHOPT, CLWB, FSGSBASE, PTWRITE, RDRND, F16C, FMA, PCONFIG, WBNOINVD, FMA4, PREFETCHW, RDPID, PREFETCHWT1, RDSEED, SGX, XOP, LWP, 3DNow!, улучшенный 3DNow!, POPCNT, ABM, ADX, BMI, BMI2, LZCNT, FXSR, XSAVE, XSAVEOPT, XSAVEC, XSAVES, RTM, HLE, TBM, MWAITX, CLZERO, PKU, AVX512VBMI2, GFNI, VAES, WAITPKG, VPCLMULQDQ, AVX512BITALG, MOVDIRI, MOVDIR64B, AVX512VPOPCNTDQ, AVX5124FMAPS, AVX512VNNI, AVX5124VNNIW или расширенных наборах инструкций CLDEMOTE. У каждого из них есть соответствующий параметр -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 в автовекторизаторе.

-mprefer-vector-width=opt

Этот параметр указывает GCC на использование ширины вектора opt-бит в инструкциях вместо значения по умолчанию на выбранной платформе.

‘none’

Дополнительные ограничения для GCC, помимо определенных выбранной платформой, не применяются.

‘128’

Предпочтение ширины вектора 128 бит для инструкций.

‘256’

Предпочтение ширины вектора 256 бит для инструкций.

‘512’

Предпочтение ширины вектора 512 бит для инструкций.

-mcx16

Этот параметр позволяет GCC генерировать инструкции CMPXCHG16B в 64-битном коде для реализации операций сравнения и обмена на выровненных по 16 байтам 128-битных объектах. Это полезно для атомных обновлений структур данных, превышающих размер одного машинного слова. Компилятор использует эту инструкцию для реализации __sync Встроенные функции. Однако для __atomic Встроенные функции, работающих с 128-битными целыми числами, всегда используется вызов библиотеки.

-msahf

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

-mmovbe

Этот параметр включает использование инструкции movbe для реализации __builtin_bswap32 и __builtin_bswap64.

-mshstk

Параметр -mshstk включает встроенные функции теневого стека из технологии контроля потока x86 (CET).

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

В настоящее время GCC генерирует вызовы vmldExp2, vmldLn2, vmldLog102, vmldPow2, vmldTanh2, vmldTan2, vmldAtan2, vmldAtanh2, vmldCbrt2, vmldSinh2, vmldSin2, vmldAsinh2, vmldAsin2, vmldCosh2, vmldCos2, vmldAcosh2, vmldAcos2, vmlsExp4, vmlsLn4, 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. См. Атрибуты функций.

-mforce-indirect-call

Принудительно делает все вызовы функций косвенными. Это полезно при использовании Intel Processor Trace, так как это даёт более точную информацию о времени выполнения для вызовов функций.

-mmanual-endbr

Вставляет инструкцию ENDBR только в начало функции с помощью атрибута функции cf_check. Это полезно при использовании параметра -fcf-protection=branch для управления вставкой ENDBR в начало функции.

-mcall-ms2sysv-xlogues

Из-за различий в 64-битных ABI, любая функция Microsoft ABI, вызывающая функцию System V ABI, должна учитывать RSI, RDI и XMM6-15 как изменённые. По умолчанию код сохранения и восстановления этих регистров генерируется встроенно, что приводит к довольно длинным преамбулам и постфиксам. Использование -mcall-ms2sysv-xlogues генерирует преамбулы и постфиксы, которые используют плагины в статической части libgcc для выполнения этих сохранений и восстановлений, тем самым уменьшая размер функции за счёт нескольких дополнительных инструкций.

-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. Соседние битовые поля упаковываются в один, два или четыре байта, если целочисленные типы имеют одинаковый размер и если следующее битовое поле помещается в текущую единицу выделения без пересечения границы, накладываемой общими требованиями к выравниванию битовых полей.

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.

-minstrument-return=type

Инструментировать выход из функций в -pg -mfentry функций с вызовом указанной функции. Это инструментирует только истинные возвраты, завершающиеся командой ret, но не связанные вызовы, завершающиеся переходом. Допустимые типы: none — не инструментировать, call — сгенерировать вызов __return__, или nop5 — сгенерировать 5-байтный nop.

-mrecord-return
-mno-record-return

Сгенерировать секцию __return_loc, указывающую на весь код инструментирования возврата.

-mfentry-name=name

Установить имя символа __fentry__, вызываемого при входе в функцию для функций -pg -mfentry.

-mfentry-section=name

Установить имя секции для записи вызовов -mrecord-mcount (по умолчанию __mcount_loc).

-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
-mstack-protector-guard-reg=reg
-mstack-protector-guard-offset=offset

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

С последним выбором параметры -mstack-protector-guard-reg=reg и -mstack-protector-guard-offset=offset дополнительно указывают, какой регистр сегмента (%fs или %gs) использовать в качестве базового регистра для чтения канцлера и с какого смещения от этого базового регистра. По умолчанию значения указаны в соответствующем ABI.

-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 может быть недоступна в модели кода большого размера.

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

-mfunction-return=choice

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

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

Обратите внимание, что -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 генерирует код, соответствующий Intel MCU psABI. Она требует, чтобы опция -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, помещаются в разделы больших данных или 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-9.5.0/gcc/x86-Options.html

Spec-Zone.ru

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