Spec-Zone.ru › GCC 10

Далее: x86 Windows Options, Предыдущее: VxWorks Options, Вверх: Параметры, зависящие от модели машины [Оглавление][Индекс]

3.19.59 Параметры 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.

‘cooperlake’

Процессор Intel Cooperlake с 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, AVX512VNNI и AVX512BF16.

‘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, AVX512VP2INTERSECT и KEYLOCKER.

‘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, PCLMUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций 64 бит.)

‘bdver2’
END_OF_DOCUMENT_MARKER

Процессоры AMD Family 15h на базе ядер с поддержкой набора инструкций x86-64. (Это включает наборы BMI, TBM, F16C, FMA, FMA4, AVX, XOP, LWP, AES, PCLMUL, 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, PCLMUL, 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, PCLMUL, 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, PCLMUL, 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, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID, WBNOINVD и расширения набора инструкций 64-бит.)

‘znver3’

Процессоры AMD Family 19h на базе ядер с поддержкой набора инструкций x86-64. (Это включает наборы BMI, BMI2, CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID, WBNOINVD, PKU, VPCLMULQDQ, VAES и расширения набора инструкций 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, PCLMUL, 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

Настройте тип-процессора на всё применимое к сгенерированному коду, кроме ABI и набора доступных инструкций. Выбор определённого тип-процессора позволяет настроить планирование для конкретного чипа, но компилятор не генерирует код, который не может работать на стандартной машине, если вы не используете параметр -march=тип-процессора. Например, если GCC сконфигурирован для i686-pc-linux-gnu, то -mtune=pentium4 генерирует код, настроенный для Pentium 4, но он всё равно работает на машинах i686.

Варианты для тип-процессора такие же, как и для -march. Кроме того, -mtune поддерживает 2 дополнительных варианта для тип-процессора:

‘generic’

Генерировать код, оптимизированный для самых распространённых процессоров IA32/AMD64/EM64T. Если вы знаете процессор, на котором будет выполняться ваш код, то следует использовать соответствующий параметр -mtune или -march вместо -mtune=generic. Но если вы не знаете точно, какой процессор будут иметь пользователи вашего приложения, то следует использовать этот параметр.

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

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

‘intel’

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

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

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

-mcpu=cpu-type

Устаревший синоним для -mtune.

-mfpmath=unit

Генерировать арифметику с плавающей запятой для выбранного блока блок. Варианты для блок:

‘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=тип-процессора, -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

Выходные инструкции ассемблера с использованием выбранного диалекта. Также влияет на то, какой диалект используется для базовых asm (см. Базовые ассемблерные инструкции без операндов) и расширенных asm (см. Расширенные ассемблерные инструкции с операндами C-выражений). Доступные варианты (в порядке диалекта) — ‘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 на границе двух слов или одного слова. Выравнивание переменных double на границе двух слов генерирует код, который работает несколько быстрее на Pentium за счет большего использования памяти.

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

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

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

Эти переключатели управляют размером типа long double. Двоичный интерфейс приложения x86-32 определяет размер в 96 бит, поэтому -m96bit-long-double используется по умолчанию в 32-битном режиме.

Современные архитектуры (Pentium и новее) предпочитают выравнивание типа long double на границу 8 или 16 байт. В массивах или структурах, соответствующих ABI, это невозможно. Поэтому указание -m128bit-long-double выравнивает long double на границу 16 байт, добавив дополнительно 32-битовое нулевое значение к long double.

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

Обратите внимание, что ни одна из этих опций не обеспечивает дополнительной точности по сравнению со стандартом x87 в 80 бит для long double.

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

-mlong-double-64
-mlong-double-80
-mlong-double-128

Эти переключатели управляют размером типа long double. Размер в 64 бита делает тип long double эквивалентным типу double. Это значение по умолчанию для 32-битной Bionic C библиотеки. Размер в 128 бит делает тип long double эквивалентным типу __float128. Это значение по умолчанию для 64-битной Bionic C библиотеки.

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

-malign-data=type

Управляет тем, как GCC выравнивает переменные. Допустимые значения для type — ‘compat’ использует увеличенное значение выравнивания, совместимое с GCC 4.8 и более ранними версиями, ‘abi’ использует значение выравнивания, указанное в psABI, и ‘cacheline’ использует увеличенное значение выравнивания для соответствия размеру строки кэша. ‘compat’ — значение по умолчанию.

-mlarge-data-threshold=threshold

При указании -mcmodel=medium, объекты данных, большие, чем threshold, размещаются в разделе данных большого размера. Это значение должно быть одинаковым для всех объектов, связанных в двоичный файл, и по умолчанию равно 65535.

-mrtd

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

Вы можете указать, что отдельная функция вызывается с этим последовательностью вызова, с помощью атрибута функции stdcall. Вы также можете переопределить опцию -mrtd с помощью атрибута функции cdecl. См. Объявление атрибутов функций.

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

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

Кроме того, получается серьёзно неправильный код, если вы вызываете функцию с слишком многими аргументами. (Обычно дополнительные аргументы безвредно игнорируются.)

-mregparm=num

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

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

-msseregparm

Использовать соглашения о передаче аргументов в регистрах SSE для плавающих точек и двойных аргументов и возвращаемых значений. Вы можете контролировать это поведение для конкретной функции, используя атрибут функции sseregparm. См. Объявление атрибутов функций.

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

-mvect8-ret-in-mem

Возвращать 8-байтовые векторы в память вместо регистров MMX. Это значение по умолчанию в VxWorks для соответствия ABI компиляторов Sun Studio до версии 12. Только используйте эту опцию, если вам нужно оставаться совместимым с существующим кодом, сгенерированным этими предыдущими версиями компиляторов или более старыми версиями 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-байтовой границе. Поскольку ABI x86-64 требует выравнивания стека по 16 байтам, это несовместимо с ABI и предназначено для использования в контролируемой среде, где важно ограничение пространства стека. Этот параметр приводит к неправильному коду, когда вызываются функции, скомпилированные с 16-байтовым выравниванием стека (например, функции из стандартной библиотеки), со смещенным стеком. В этом случае инструкции SSE могут привести к ошибкам доступа к невыровненной памяти. Кроме того, обработка переменных аргументов некорректна для объектов с выравниванием по 16 байтам (включая x87 long double и __int128), что приводит к неправильным результатам. Необходимо скомпилировать все модули с -mpreferred-stack-boundary=3, включая библиотеки. Это включает системные библиотеки и стартовые модули.

-mincoming-stack-boundary=num

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

На процессорах Pentium и Pentium Pro значения double и long double должны быть выровнены по 8-байтовой границе (см. -malign-double), иначе это приведет к существенным потерям производительности во время выполнения. На Pentium III тип данных расширений Streaming SIMD Extension (SSE) __m128 может работать некорректно, если он не выровнен по 16-байтовой границе.

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

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

-mmmx
-msse
-msse2
-msse3
-mssse3
-msse4
-msse4a
-msse4.1
-msse4.2
-mavx
-mavx2
-mavx512f
-mavx512pf
-mavx512er
-mavx512cd
-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
-mavx512bf16
-mgfni
-mvaes
-mwaitpkg
-mvpclmulqdq
-mavx512bitalg
-mmovdiri
-mmovdir64b
-menqcmd
-mavx512vpopcntdq
-mavx512vp2intersect
-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, AVX512BF16, ENQCMD, 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 для атомного доступа к памяти. Однако для Встроенных функций для модели памяти, учитывающих атомные операции, выполняемых над 128-битными целыми числами, всегда используется вызов библиотеки.

-msahf

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

-mmovbe

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

-mshstk

Параметр -mshstk включает встроенные функции стека теней из x86 Control-flow Enforcement Technology (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 у.е. (т. е. обратное 1,0 равно 0,99999994).

Обратите внимание, что GCC реализует 1.0f/sqrtf(x) в терминах RSQRTSS (или RSQRTPS) уже с -ffast-math (или указанным выше сочетанием параметров) и не нуждается в -mrecip.

Также обратите внимание, что GCC генерирует указанную выше последовательность с дополнительным шагом Ньютона-Рафсона для векторизованного деления с плавающей запятой одинарной точности и векторизованного sqrtf(x) уже с -ffast-math (или вышеуказанным сочетанием параметров) и не нуждается в -mrecip.

-mrecip=opt

Этот параметр управляет тем, какие инструкции оценки обратного значения могут быть использованы. opt — это список параметров, разделённых запятыми, которые могут быть предваряемыми символом «!» для инвертирования параметра:

‘all’

Включить все инструкции оценки.

‘default’

Включить стандартные инструкции, что эквивалентно -mrecip.

‘none’

Отключить все инструкции оценки, что эквивалентно -mno-recip.

‘div’

Включить приближение для скалярного деления.

‘vec-div’

Включить приближение для векторизованного деления.

‘sqrt’

Включить приближение для скалярного квадратного корня.

‘vec-sqrt’

Включить приближение для векторизованного квадратного корня.

Например, -mrecip=all,!sqrt включает все приближения обратных значений, за исключением квадратного корня.

-mveclibabi=type

Указывает тип ABI для векторизации встроенных функций с использованием внешней библиотеки. Поддерживаемые значения для type — ‘svml’ для библиотеки Intel short vector math и ‘acml’ для библиотеки AMD math core. Для использования этого параметра необходимо включить как -ftree-vectorize, так и -funsafe-math-optimizations, а также указать совместимую с SVML или ACML ABI библиотеку при компоновке.

В настоящее время GCC генерирует вызовы vmldExp2, vmldLn2, vmldLog102, 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 pragma), что меньше. Для структур, объединений и массивов требование к выравниванию равно наибольшему требованию к выравниванию его членов. Каждый объект выделяется смещение таким образом, что:
    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 и memset для коротких длин. Параметр включает встроенную расшифровку strlen для всех выравниваний указателей.

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

-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, но не вложенные вызовы, завершающиеся jump.

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

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

-mindirect-branch-register

Вынудительно выполнить косвенный вызов и переход через регистр.

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

-m32
-m64
-mx32
-m16
-miamcu

Генерировать код для 16-разрядной, 32-разрядной или 64-разрядной среды. Опция -m32 устанавливает int, long, и типы указателей на 32 бита и генерирует код, работающий в 32-разрядном режиме.

Опция -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. Красная зона предписывается ABI x86-64; это область размером 128 байт за местоположением указателя стека, которая не изменяется обработчиками сигналов или прерываний и, следовательно, может использоваться для временных данных без корректировки указателя стека. Флаг -mno-red-zone отключает эту красную зону.

-mcmodel=small

Генерировать код для небольшой модели кода: программа и её символы должны быть связаны в нижних 2 ГБ адресного пространства. Указатели имеют 64 бита. Программы могут быть статически или динамически связаны. Это модель кода по умолчанию.

-mcmodel=kernel

Генерировать код для модели кода ядра. Ядро работает в отрицательных 2 ГБ адресного пространства. Эта модель должна использоваться для кода ядра Linux.

-mcmodel=medium

Генерировать код для средней модели: программа связывается в нижних 2 ГБ адресного пространства. Малые символы также размещаются там. Символы размером больше, чем -mlarge-data-threshold, помещаются в секции large data или BSS и могут находиться выше 2 ГБ. Программы могут быть статически или динамически связаны.

-mcmodel=large

Генерировать код для большой модели. Эта модель не делает предположений об адресах и размерах разделов.

-maddress-mode=long

Генерировать код для режима с длинным адресом. Это поддерживается только для 64-разрядных и x32 сред. Это режим адресации по умолчанию для 64-разрядных сред.

-maddress-mode=short

Генерировать код для режима с коротким адресом. Это поддерживается только для 32-разрядных и x32 сред. Это режим адресации по умолчанию для 32-разрядных и x32 сред.

Далее: x86 Windows Options, Предыдущее: VxWorks Options, Вверх: Machine-Dependent Options [Содержание][Индекс]

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

Spec-Zone.ru

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