Spec-Zone.ru › GCC 14

3.19.54 Параметры x86

Эти параметры «-m» определены для семейства компьютеров x86.

-march=cpu-type

Генерировать инструкции для типа машины cpu-type. В отличие от -mtune=cpu-type, который только настраивает сгенерированный код для указанного cpu-type, -march=cpu-type позволяет GCC генерировать код, который может вообще не работать на процессорах, отличных от указанного. Указание -march=cpu-type подразумевает -mtune=cpu-type, кроме случаев, отмеченных особо.

Возможные значения cpu-type:

‘native’

Этот параметр выбирает процессор, для которого следует генерировать код во время компиляции, определяя тип процессора компилирующей машины. Использование -march=native включает все подмножества инструкций, поддерживаемые локальной машиной (поэтому результат может не работать на других машинах). Использование -mtune=native создает код, оптимизированный для локальной машины с учетом ограничений выбранного набора инструкций.

‘x86-64’

Универсальный процессор с 64-разрядными расширениями.

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

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

Поскольку этим значениям 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 на базе процессора 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’
‘corei7’

Процессор 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’
‘corei7-avx’

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

‘ivybridge’
‘core-avx-i’

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

‘haswell’
‘core-avx2’

Процессор Intel Haswell с 64-разрядными расширениями и поддержкой наборов инструкций 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.

‘skylake-avx512’

Серверный процессор 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, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ и AVX512CD.

‘cascadelake’

Процессор Intel Cascade Lake с 64-разрядными расширениями и поддержкой наборов инструкций 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.

‘cannonlake’

Серверный процессор Intel Cannon Lake с 64-разрядными расширениями и поддержкой наборов инструкций 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.

‘cooperlake’

Процессор Intel Cooper Lake с 64-разрядными расширениями и поддержкой наборов инструкций 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.

‘icelake-client’

Клиентский процессор Intel Ice Lake с 64-разрядными расширениями и поддержкой наборов инструкций 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 Ice Lake с 64-разрядными расширениями и поддержкой наборов инструкций 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.

‘tigerlake’

Процессор Intel Tiger Lake с 64-разрядными расширениями и поддержкой наборов инструкций 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.

‘rocketlake’

Процессор Intel Rocket Lake с 64-разрядными расширениями и поддержкой наборов инструкций 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.

‘alderlake’
‘raptorlake’
‘meteorlake’
‘gracemont’

Процессор Intel Alder Lake/Raptor Lake/Meteor Lake/Gracemont с 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, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL и AVX-VNNI.

‘arrowlake’

Процессор Intel Arrow Lake с 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, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT и CMPCCXADD.

‘arrowlake-s’
‘lunarlake’

Процессор Intel Arrow Lake S/Lunar Lake с 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, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512, SM3 и SM4.

‘pantherlake’

Процессор Intel Panther Lake с 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, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, AVX-VNNI, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512, SM3 и SM4.

‘sapphirerapids’
‘emeraldrapids’

Процессор Intel Sapphire Rapids/Emerald Rapids с 64-разрядными расширениями и поддержкой наборов инструкций 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, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512-FP16 и AVX512BF16.

‘graniterapids’

Процессор Intel Granite Rapids с 64-разрядными расширениями и поддержкой наборов инструкций 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, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512-FP16, AVX512BF16, AMX-FP16 и PREFETCHI.

‘graniterapids-d’

Процессор Intel Granite Rapids D с 64-разрядными расширениями и поддержкой наборов инструкций 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, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512FP16, AVX512BF16, AMX-FP16, PREFETCHI и AMX-COMPLEX.

‘bonnell’
‘atom’

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

‘silvermont’
‘slm’

Процессор 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.

‘sierraforest’

Процессор Intel Sierra Forest с 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, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, ENQCMD и UINTR.

‘grandridge’

Процессор Intel Grand Ridge с 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, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, ENQCMD и UINTR.

‘clearwaterforest’

Процессор Intel Clearwater Forest с 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, AVX-VNNI, ENQCMD, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512, SM3, SM4, USER_MSR и PREFETCHI.

‘knl’

Процессор Intel Knights 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.

‘k6’

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

‘k6-2’
‘k6-3’

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

‘athlon’
‘athlon-tbird’

Процессор AMD Athlon с поддержкой инструкций предварительной выборки MMX, 3dNOW!, enhanced 3DNow! и SSE.

‘athlon-4’
‘athlon-xp’
‘athlon-mp’

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

‘k8’
‘opteron’
‘athlon64’
‘athlon-fx’

Процессоры на базе ядра AMD K8 с поддержкой набора инструкций x86-64, включая процессоры AMD Opteron, Athlon 64 и Athlon 64 FX. (В этот набор входят MMX, SSE, SSE2, 3DNow!, enhanced 3DNow! и 64-разрядные расширения набора инструкций.)

‘k8-sse3’
‘opteron-sse3’
‘athlon64-sse3’

Улучшенные версии ядер AMD K8 с поддержкой набора инструкций SSE3.

‘amdfam10’
‘barcelona’

Процессоры на базе ядер AMD Family 10h с поддержкой набора инструкций x86-64. (В этот набор входят MMX, SSE, SSE2, SSE3, SSE4A, 3DNow!, enhanced 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-разрядные расширения набора инструкций.)

‘znver4’

Процессоры на базе ядер 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, AVX512F, AVX512DQ, AVX512IFMA, AVX512CD, AVX512BW, AVX512VL, AVX512BF16, AVX512VBMI, AVX512VBMI2, AVX512VNNI, AVX512BITALG, AVX512VPOPCNTDQ, GFNI и 64-разрядные расширения набора инструкций.)

‘znver5’

Процессоры на базе ядер AMD Family 1ah с поддержкой набора инструкций 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, AVX512F, AVX512DQ, AVX512IFMA, AVX512CD, AVX512BW, AVX512VL, AVX512BF16, AVX512VBMI, AVX512VBMI2, AVX512VNNI, AVX512BITALG, AVX512VPOPCNTDQ, GFNI, AVXVNNI, MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, PREFETCHI и 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. (Для этого процессора планирование не реализовано.)

‘lujiazui’

Процессор ZHAOXIN lujiazui с поддержкой наборов инструкций x86-64, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PCLMUL, RDRND, XSAVE, XSAVEOPT, FSGSBASE, CX16, ABM, BMI, BMI2, FXSR и RDSEED. Хотя процессоры поддерживают AVX и F16C, эти возможности не включаются -march=lujiazui по соображениям производительности.

‘yongfeng’

Процессор ZHAOXIN yongfeng с поддержкой наборов инструкций x86-64, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, POPCNT, AES, PCLMUL, RDRND, XSAVE, XSAVEOPT, FSGSBASE, CX16, ABM, BMI, BMI2, F16C, FXSR, RDSEED, AVX2, FMA, SHA и LZCNT.

‘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 поддерживает ещё два варианта cpu-type:

‘generic’

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

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

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

‘intel’

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

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

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

-mcpu=cpu-type

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

-mfpmath=unit

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

‘387’

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

Это вариант по умолчанию для целевых платформ x86-32, отличных от Darwin.

‘sse’

Использует скалярные инструкции с плавающей точкой из набора инструкций SSE. Этот набор инструкций поддерживается процессорами Pentium III и новее, а в линейке AMD — процессорами Athlon-4, Athlon XP и Athlon MP. Более ранняя версия набора инструкций SSE поддерживает только вычисления с одинарной точностью, поэтому вычисления с двойной и расширенной точностью по-прежнему выполняются с помощью 387. Более поздняя версия, присутствующая только в Pentium 4 и процессорах AMD x86-64, поддерживает также вычисления с двойной точностью.

Для компилятора x86-32 необходимо использовать параметры -march=cpu-type, -msse или -msse2, чтобы включить расширения SSE и активировать этот параметр. Для компилятора x86-64 эти расширения включены по умолчанию.

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

Это вариант по умолчанию для компилятора x86-64, целевых платформ Darwin x86-32, а также для целевых платформ x86-32 с набором инструкций SSE2, если включён параметр -ffast-math.

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

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

-masm=dialect

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

-mno-fancy-math-387

Некоторые эмуляторы 387 не поддерживают инструкции sin, cos и sqrt для 387. Укажите этот параметр, чтобы избежать генерации этих инструкций. Этот параметр игнорируется, если параметр -march указывает, что целевой CPU всегда имеет FPU и, следовательно, эмулировать инструкцию не требуется. Эти инструкции не генерируются, если дополнительно не указан параметр -funsafe-math-optimizations.

-malign-double
-mno-align-double

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

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

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

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

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

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

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

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

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

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

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

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

-malign-data=type

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

-mlarge-data-threshold=threshold

Если указан параметр -mcmodel=medium или -mcmodel=large, объекты данных размером более threshold размещаются в больших секциях данных. Значение по умолчанию — 65535.

-mrtd

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

Указать такое соглашение о вызовах для отдельной функции можно с помощью атрибута функции stdcall. Переопределить параметр -mrtd также можно с помощью атрибута функции cdecl. См. раздел Объявление атрибутов функций.

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

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

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

-mregparm=num

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

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

-msseregparm

Использует соглашения о передаче аргументов и возвращаемых значений типа float и double через регистры 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 бит). При использовании этого параметра для задания точности ниже расширенной процедуры таких библиотек могут значительно терять точность, обычно из-за так называемого «катастрофического вычитания».

-mdaz-ftz

Флаги flush-to-zero (FTZ) и denormals-are-zero (DAZ) в регистре MXCSR управляют вычислениями с плавающей точкой. Инструкции SSE и AVX, включая скалярные и векторные, могут работать эффективнее при включённых флагах FTZ и DAZ, если указан параметр -mdaz-ftz. Флаги FTZ/DAZ не устанавливаются, если указан параметр -mno-daz-ftz или -shared; однако -mdaz-ftz устанавливает флаги FTZ/DAZ даже при использовании -shared.

-mstackrealign

Повторно выравнивает стек при входе в функцию. На x86 параметр -mstackrealign генерирует альтернативные пролог и эпилог, которые при необходимости повторно выравнивают стек во время выполнения. Это позволяет смешивать старый код, в котором выравнивание стека составляет 4 байта, с современным кодом, в котором для совместимости с SSE используется выравнивание стека в 16 байт. См. также атрибут 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
-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
-mavxifma
-mavxvnniint8
-mavxneconvert
-mcmpccxadd
-mamx-fp16
-mprefetchi
-mraoint
-mamx-complex
-mavxvnniint16
-msm3
-msha512
-msm4
-mapxf
-musermsr
-mavx10.1
-mavx10.1-256
-mavx10.1-512

Эти параметры включают использование инструкций наборов MMX, SSE, 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!, enhanced 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, AVX512-FP16, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AMX-FP16, PREFETCHI, RAOINT, AMX-COMPLEX, AVXVNNIINT16, SM3, SHA512, SM4, APX_F, USER_MSR, AVX10.1 или CLDEMOTE. Для отключения использования этих инструкций предусмотрен соответствующий параметр -mno-.

Эти расширения также доступны в виде встроенных функций: подробные сведения о функциях, включаемых и отключаемых этими параметрами, см. в разделе Встроенные функции x86.

Сведения об автоматической генерации инструкций SSE/SSE2 из кода с плавающей точкой (вместо инструкций 387) см. в описании -mfpmath=sse.

При использовании -mavx GCC избегает инструкций SSEx. Вместо них при необходимости он генерирует новые инструкции AVX или эквиваленты инструкций SSEx на AVX.

Эти параметры позволяют GCC использовать указанные расширенные инструкции в сгенерированном коде даже без -mfpmath=sse. Приложения, выполняющие обнаружение CPU во время выполнения, должны компилировать отдельные файлы для каждой поддерживаемой архитектуры с соответствующими флагами. В частности, файл с кодом обнаружения CPU следует компилировать без этих параметров.

-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-разрядных.

-mprefer-vector-width=opt

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

-mpartial-vector-fp-math

Этот параметр позволяет GCC генерировать операции с плавающей точкой, которые могут изменять набор флагов состояния плавающей точки для частичных векторов, элементы которых находятся в младшей части 128-разрядного регистра SSE. Если не указан параметр -fno-trapping-math, компилятор гарантирует корректное поведение, обнуляя неиспользуемую старшую часть векторного регистра во всех входных операндах. Обратите внимание, что при использовании встроенных функций или встраиваемого ассемблерного кода с аргументами-частичными векторами значения NaN, денормализованные или недопустимые значения могут попасть в старшую часть вектора, что может привести к проблемам с производительностью при включённом параметре -fno-trapping-math. Эти проблемы можно устранить вручную, обнулив старшую часть регистра аргумента-частичного вектора, или использовать -mdaz-ftz, чтобы установить флаг denormals-are-zero (DAZ) в регистре MXCSR.

Этот параметр включён по умолчанию.

-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 бит.

-mnoreturn-no-callee-saved-registers

Этот параметр оптимизирует функции с атрибутом noreturn или спецификатором _Noreturn: в прологе функции не сохраняются используемые в ней регистры, сохраняемые вызываемой функцией (кроме регистра BP). Этот параметр может помешать отладке вызывающей функции noreturn или любой функции выше по стеку вызовов, поэтому по умолчанию он отключён.

-mcx16

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

-msahf

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

-mmovbe

Этот параметр разрешает использование инструкции movbe для оптимизации перестановки байтов в объектах размером четыре и восемь байт.

-mshstk

Параметр -mshstk включает встроенные функции теневого стека из технологии защиты потока управления x86 (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. Обратите внимание: хотя пропускная способность этой последовательности выше, чем у нерекiproчной инструкции, точность последовательности может снизиться на величину до 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 и ‘acml’ для библиотеки математического ядра AMD. Для использования этого параметра должны быть включены -ftree-vectorize и -funsafe-math-optimizations, а во время компоновки необходимо указать библиотеку, совместимую с ABI SVML или ACML.

В настоящее время GCC генерирует вызовы vmldExp2, vmldLn2, vmldLog102, vmldPow2, vmldTanh2, vmldTan2, vmldAtan2, vmldAtanh2, vmldCbrt2, vmldSinh2, vmldSin2, vmldAsinh2, vmldAsin2, vmldCosh2, vmldCos2, vmldAcosh2, vmldAcos2, vmlsExp4, vmlsLn4, vmlsLog104, vmlsPow4, vmlsTanh4, vmlsTan4, vmlsAtan4, vmlsAtanh4, vmlsCbrt4, vmlsSinh4, vmlsSin4, vmlsAsinh4, vmlsAsin4, vmlsCosh4, vmlsCos4, vmlsAcosh4 и vmlsAcos4 для соответствующего типа функции при использовании -mveclibabi=svml, а также __vrd2_sin, __vrd2_cos, __vrd2_exp, __vrd2_log, __vrd2_log2, __vrd2_log10, __vrs4_sinf, __vrs4_cosf, __vrs4_expf, __vrs4_logf, __vrs4_log2f, __vrs4_log10f и __vrs4_powf для соответствующего типа функции при использовании -mveclibabi=acml.

-mabi=name

Генерировать код для указанного соглашения о вызовах. Допустимые значения: ‘sysv’ для ABI, используемого в GNU/Linux и других системах, и ‘ms’ для 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 в точке входа функции.

-mcet-switch

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

-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 или в ней используются битовые поля, ABI Microsoft может размещать поля структуры иначе, чем это обычно делает GCC. В частности, при передаче упакованных данных между функциями, скомпилированными GCC и штатным компилятором Microsoft (вызовом функции или в виде данных в файле), может потребоваться доступ к одному из форматов.

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

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

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

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

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

    Например:

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

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

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

    Например:

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

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

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

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

      В этом примере t4 занимает 4 байта.

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

    В этом примере t5 занимает 2 байта.

-mno-align-stringops

Не выравнивать назначение встроенных строковых операций. Этот параметр уменьшает размер кода и повышает производительность, если назначение уже выровнено, но GCC об этом неизвестно.

-minline-all-stringops

По умолчанию GCC встраивает строковые операции, только если известно, что назначение выровнено как минимум по 4-байтовой границе. Этот параметр позволяет встраивать больше операций и увеличивает размер кода, но может повысить производительность кода, которому важны быстрые memcpy и 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, этот параметр по умолчанию включен.

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

-mavx256-split-unaligned-load
-mavx256-split-unaligned-store

Разделять невыровненные загрузку и сохранение AVX размером 32 байта.

-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

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

-mrelax-cmpxchg-loop

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

-mindirect-branch=choice

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

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

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

-mfunction-return=choice

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

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

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

-mindirect-branch-register

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

-mharden-sls=choice

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

-mindirect-branch-cs-prefix

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

-mapx-inline-asm-use-gpr32

По умолчанию при поддержке встроенного ассемблера с APX функция EGPR отключена, чтобы предотвратить возможное возникновение недопустимых инструкций с EGPR. Чтобы использовать EGPR во встроенном ассемблере, укажите новый параметр компилятора -mapx-inline-asm-use-gpr32 и убедитесь, что инструкция поддерживает EGPR.

-mevex512
-mno-evex512

Включает или отключает 512-разрядные векторы. По умолчанию параметр включен, если включен AVX512F.

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

-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 помещаются в секции больших данных или BSS и могут располагаться выше отметки 2 ГБ. Программы могут компоноваться статически или динамически.

-mcmodel=large

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

-maddress-mode=long

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

-maddress-mode=short

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

-mneeded
-mno-needed

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

-mno-direct-extern-access

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

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

-munroll-only-small-loops

Управляет консервативной малой развёрткой циклов. По умолчанию включается при O2 и разворачивает циклы, содержащие менее 4 инструкций, один раз. Явное указание -f[no-]unroll-[all-]loops отключает этот флаг, чтобы избежать нежелательной для пользователя развёртки циклов.

-mlam=choice

LAM (маскирование линейного адреса) позволяет использовать специальные биты указателя для метаданных. По умолчанию задано значение «none». При значении «u48» для метаданных можно использовать биты указателя в позициях 62:48; при значении «u57» — биты указателя в позициях 62:57.

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

Spec-Zone.ru

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