Spec-Zone.ru › GCC 12

3.19.60 Параметры 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-битными расширениями.

‘x86-64-v2’
‘x86-64-v3’
‘x86-64-v4’

Эти варианты для cpu-type выбирают соответствующий уровень микроархитектуры из psABI x86-64. В других ABIs, кроме psABI x86-64, они выбирают те же функции процессора, что и в документации psABI x86-64 для конкретного уровня микроархитектуры.

Поскольку для этих значений cpu-type нет соответствующей настройки -mtune, использование -march с этими значениями включает общую настройку. Конкретную настройку можно включить, используя параметр -mtune=other-cpu-type с соответствующим значением other-cpu-type.

‘i386’

Оригинальный процессор Intel i386.

‘i486’

Процессор Intel i486. (Расписание не реализовано для этого чипа.)

‘i586’
‘pentium’

Процессор Intel Pentium без поддержки MMX.

‘lakemont’

Процессор Intel Lakemont MCU, основанный на процессоре 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 и FXSR.

‘pentium3’
‘pentium3m’

Процессор Intel Pentium III, основанный на ядре Pentium Pro с поддержкой наборов инструкций MMX, FXSR и SSE.

‘pentium-m’

Intel Pentium M; низкопотребляемая версия процессора Intel Pentium III с поддержкой наборов инструкций MMX, SSE, SSE2 и FXSR. Используется в ноутбуках Centrino.

‘pentium4’
‘pentium4m’

Процессор Intel Pentium 4 с поддержкой наборов инструкций MMX, SSE, SSE2 и FXSR.

‘prescott’

Улучшенная версия процессора Intel Pentium 4 с поддержкой наборов инструкций MMX, SSE, SSE2, SSE3 и FXSR.

‘nocona’

Улучшенная версия процессора Intel Pentium 4 с 64-битными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3 и FXSR.

‘core2’

Процессор Intel Core 2 с 64-битными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, CX16, SAHF и FXSR.

‘nehalem’

Процессор Intel Nehalem с 64-битными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF и FXSR.

‘westmere’

Процессор Intel Westmere с 64-битными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR и PCLMUL.

‘sandybridge’

Процессор Intel Sandy Bridge с 64-битными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE и PCLMUL.

‘ivybridge’

Процессор Intel Ivy Bridge с 64-битными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND и F16C.

‘haswell’

Процессор Intel Haswell с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE и HLE.

‘broadwell’

Процессор Intel Broadwell с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX и PREFETCHW.

‘skylake’

Процессор Intel Skylake с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES и SGX.

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

‘goldmont’

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

‘goldmont-plus’

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

‘tremont’

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

‘knl’

Процессор Intel Knight’s Landing с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AVX512PF, AVX512ER, AVX512F, AVX512CD и PREFETCHWT1.

‘knm’

Процессор Intel Knights Mill с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AVX512PF, AVX512ER, AVX512F, AVX512CD и PREFETCHWT1, AVX5124VNNIW, AVX5124FMAPS и AVX512VPOPCNTDQ.

‘skylake-avx512’

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

‘cannonlake’

Процессор Intel Cannonlake Server с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA и SHA.

‘icelake-client’

Процессор Intel Icelake Client с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID и AVX512VPOPCNTDQ.

‘icelake-server’

Процессор Intel Icelake Server с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, PCONFIG, WBNOINVD и CLWB.

‘cascadelake’

Процессор Intel Cascadelake с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ и AVX512VNNI.

‘cooperlake’

Процессор Intel cooperlake с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VNNI и AVX512BF16.

‘tigerlake’

Процессор Intel Tigerlake с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, MOVDIRI, MOVDIR64B, CLWB, AVX512VP2INTERSECT и KEYLOCKER.

‘sapphirerapids’

Процессор Intel sapphirerapids с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, PCONFIG, WBNOINVD, CLWB, MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512FP16 и AVX512BF16.

‘alderlake’

Процессор Intel Alderlake с 64-битными расширениями, поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL и AVX-VNNI.

‘rocketlake’
END_OF_DOCUMENT_MARKER

Процессор Intel Rocketlake с 64-битными расширениями, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID и поддержку набора инструкций AVX512VPOPCNTDQ.

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

Процессоры на базе ядер 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

Настройка 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
-mtune=cpu-type

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

‘387’

Использование стандартного сопроцессора с плавающей запятой 387, присутствующего на большинстве процессоров, и эмуляции в противном случае. Скомпилированный с этим вариантом код работает практически на всех системах. Временные результаты вычисляются с точностью 80 бит вместо точности, заданной типом, что приводит к немного отличающимся результатам по сравнению с большинством других процессоров. См. -ffloat-store для более подробного описания.

Это значение по умолчанию для целевых платформ non-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

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

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

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

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

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

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

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

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

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

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

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

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

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

-malign-data=type

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

-mlarge-data-threshold=threshold

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

-mrtd

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

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

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

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

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

-mregparm=num

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

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

-msseregparm

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

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

-mvect8-ret-in-mem

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

-mincoming-stack-boundary=num

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

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

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

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

-mmmx
-msse
-msse2
-msse3
-mssse3
-msse4
-msse4a
-msse4.1
-msse4.2
-mavx
-mavx2
-mavx512f
-mavx512pf
-mavx512er
-mavx512cd
-mavx512vl
-mavx512bw
-mavx512dq
-mavx512ifma
-mavx512vbmi
-msha
-maes
-mpclmul
-mclflushopt
-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
-mavx512fp16
-mgfni
-mvaes
-mwaitpkg
-mvpclmulqdq
-mavx512bitalg
-mmovdiri
-mmovdir64b
-menqcmd
-muintr
-mtsxldtrk
-mavx512vpopcntdq
-mavx512vp2intersect
-mavx5124fmaps
-mavx512vnni
-mavxvnni
-mavx5124vnniw
-mcldemote
-mserialize
-mamx-tile
-mamx-int8
-mamx-bf16
-mhreset
-mkl
-mwidekl

Эти переключатели позволяют использовать инструкции в наборах команд 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, SERIALIZE, UINTR, HRESET, AMXTILE, AMXINT8, AMXBF16, KL, WIDEKL, AVXVNNI, AVX512FP16 или расширенные наборы команд 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 бит в инструкциях вместо значения по умолчанию на выбранной платформе.

-mmove-max=bits

Этот параметр сообщает GCC о максимальном количестве битов, которые могут быть эффективно перемещены из памяти в память, в bits. Допустимые значения bits — 128, 256 и 512.

-mstore-max=bits

Этот параметр сообщает GCC о максимальном количестве битов, которые могут быть эффективно сохранены в памяти, в bits. Допустимые значения bits — 128, 256 и 512.

‘none’

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

‘128’

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

‘256’

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

‘512’

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

-mcx16

Этот параметр позволяет GCC генерировать CMPXCHG16B инструкции в 64-битном коде для реализации операций сравнения и обмена на выровненные по 16 байтам объекты размером 128 бит. Это полезно для атомарных обновлений структур данных, превышающих размер одного машинного слова. Компилятор использует эту инструкцию для реализации __sync Builtins. Однако для __atomic Builtins, работающих с 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 Control-flow Enforcement (CET).

-mcrc32

Этот параметр активирует встроенные функции __builtin_ia32_crc32qi, __builtin_ia32_crc32hi, __builtin_ia32_crc32si и __builtin_ia32_crc32di для генерации машинной инструкции crc32.

-mmwait

Этот параметр активирует встроенные функции __builtin_ia32_monitor, и __builtin_ia32_mwait для генерации машинных инструкций monitor и mwait.

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

-mforce-indirect-call

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

-mmanual-endbr

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

-mcall-ms2sysv-xlogues

Из-за различий в 64-битных ABI, любая функция ABI Microsoft, которая вызывает функцию ABI System V, должна учитывать 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. Параметр -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

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

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

-mgeneral-regs-only

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

-mrelax-cmpxchg-loop

Расслабить цикл cmpxchg, выпустив раннее чтение и сравнение перед cmpxchg, выполнить паузу, если загруженное значение не ожидалось. Это уменьшает чрезмерную перезагрузку кэша, когда это необходимо, и работает для всех встроенных атомарных логических операций fetch, которые генерируют цикл сравнения и обмена.

-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

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

-mharden-sls=choice

Генерация кода для защиты от прямолинейного спекулятивного выполнения (SLS) с choice. По умолчанию — ‘none’, что отключает все усложнения SLS. ‘return’ включает усложнения SLS для возвратов функций. ‘indirect-jmp’ включает усложнения SLS для косвенных переходов. ‘all’ включает все усложнения SLS.

-mindirect-branch-cs-prefix

Добавить префикс CS к вызову и переходу к косвенному thunk с целевым адресом перехода в регистрах r8-r15, чтобы длина инструкции вызова и перехода составляла 6 байтов, что позволит их заменить на ‘lfence; call *%r8-r15’ или ‘lfence; jmp *%r8-r15’ во время выполнения.

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

-m32
-m64
-mx32
-m16
-miamcu

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

Параметр -m64 устанавливает int на 32 бита, а long и типы указателей на 64 бита и генерирует код для архитектуры x86-64. Только для Darwin параметр -m64 также отключает параметры -fno-pic и -mdynamic-no-pic.

Параметр -mx32 устанавливает int, long, и типы указателей на 32 бита и генерирует код для архитектуры x86-64.

Параметр -m16 такой же, как -m32, за исключением того, что он выводит директиву ассемблера .code16gcc в начале выходных данных ассемблера, чтобы двоичный файл мог работать в 16-битном режиме.

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

-mno-red-zone

Не использовать так называемую «красную зону» для кода x86-64. Красная зона предписывается ABI x86-64; это область размером 128 байтов за местоположением указателя стека, которая не изменяется обработчиками сигналов или прерываний и поэтому может использоваться для временных данных без корректировки указателя стека. Флаг -mno-red-zone отключает эту красную зону.

-mcmodel=small

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

-mcmodel=kernel

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

-mcmodel=medium

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

-mcmodel=large

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

-maddress-mode=long

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

-maddress-mode=short

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

-mneeded
-mno-needed

Выпустить GNU_PROPERTY_X86_ISA_1_NEEDED GNU свойство для целевой системы Linux, чтобы указать уровень ISA микроархитектуры, необходимый для выполнения двоичного файла.

-mno-direct-extern-access

Без -fpic ни -fPIC, всегда используйте указатель GOT для доступа к внешним символам. С -fpic или -fPIC, обрабатывайте доступ к защищённым символам как к локальным символам. По умолчанию — -mdirect-extern-access.

Предупреждение: библиотеки совместно используемого кода, скомпилированные с -mno-direct-extern-access, и исполняемые файлы, скомпилированные с -mdirect-extern-access, могут быть несовместимы двоично, если защищённые символы используются в библиотеках совместно используемого кода и исполняемых файлах.

Далее: Параметры x86 Windows, Предыдущий: Параметры VxWorks, Наверх: Параметры подмодели [Оглавление][Индекс]

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

Spec-Zone.ru

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