Spec-Zone.ru › GCC 15

3.20.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-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2 и FXSR.

‘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 MCU на основе процессора Intel Pentium.

‘pentium-mmx’

Процессор Intel Pentium MMX на основе ядра Pentium с поддержкой набора инструкций MMX.

‘pentiumpro’

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

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

‘diamondrapids’

Процессор Intel Diamond Rapids с 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, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512FP16, AVX512BF16, AMX-FP16, PREFETCHI, AMX-COMPLEX, AVX10.1-512, AVX-IFMA, AVX-NE-CONVERT, AVX-VNNI-INT16, AVX-VNNI-INT8, CMPccXADD, SHA512, SM3, SM4, AVX10.2-512, APX_F, AMX-AVX512, AMX-FP8, AMX-TF32, MOVRS и AMX-MOVRS.

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

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

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

‘shijidadao’

Процессор ZHAOXIN shijidadao с поддержкой наборов инструкций 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 — инструкции ассемблера без операндов) и расширенного 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

Управляет тем, выравнивает ли GCC переменные 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. Это значение используется по умолчанию в библиотеке C Bionic для 32-разрядных систем. При размере 128 бит тип long double эквивалентен типу __float128. Это значение используется по умолчанию в библиотеке C Bionic для 64-разрядных систем.

Предупреждение: если переопределить значение по умолчанию для целевого 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

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

-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 тип данных __m128 из Streaming SIMD Extension (SSE) может работать некорректно, если он не выровнен по границе в 16 байт.

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

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

-mmmx
-msse
-msse2
-msse3
-mssse3
-msse4
-msse4a
-msse4.1
-msse4.2
-mavx
-mavx2
-mavx512f
-mavx512cd
-mavx512vl
-mavx512bw
-mavx512dq
-mavx512ifma
-mavx512vbmi
-msha
-maes
-mpclmul
-mclflushopt
-mclwb
-mfsgsbase
-mptwrite
-mrdrnd
-mf16c
-mfma
-mpconfig
-mwbnoinvd
-mfma4
-mprfchw
-mrdpid
-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
-mavx512vnni
-mavxvnni
-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
-mavx10.2
-mamx-avx512
-mamx-tf32
-mamx-transpose
-mamx-fp8
-mmovrs
-mamx-movrs

Эти параметры позволяют использовать инструкции из наборов расширений MMX, SSE, AVX512CD, AVX512VL, AVX512BW, AVX512DQ, AVX512IFMA, AVX512VBMI, SHA, AES, PCLMUL, CLFLUSHOPT, CLWB, FSGSBASE, PTWRITE, RDRND, F16C, FMA, PCONFIG, WBNOINVD, FMA4, PREFETCHW, RDPID, 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, AVX512VNNI, 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, AVX10.2, AMX-AVX512, AMX-TF32, AMX-TRANSPOSE, AMX-FP8, MOVRS, AMX-MOVRS или CLDEMOTE. Для каждого из этих параметров существует соответствующий параметр -mno-, отключающий использование данных инструкций.

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

Обратите внимание: -msse4 включает поддержку SSE4.1 и SSE4.2, а -mno-sse4 отключает эти возможности; ни один из этих вариантов не влияет на поддержку SSE4A, которой отдельно управляет параметр -msse4a.

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

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

Эти параметры позволяют 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, выпущенные до появления Pentium 4 G1 в декабре 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. Обратите внимание: хотя пропускная способность этой последовательности выше, чем у инструкции без вычисления обратной величины, точность последовательности может снизиться на величину до 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 Library, ‘aocl’ для математической библиотеки (LibM) из AMD Optimizing CPU Libraries (AOCL) и ‘acml’ для устаревшей библиотеки AMD Core Math Library, преемником которой является AOCL-LibM. Для использования этого параметра необходимо включить -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; amd_vrs4_acosf, amd_vrs16_acosf, amd_vrd8_asin, amd_vrs4_asinf, amd_vrs8_asinf, amd_vrs16_asinf, amd_vrd2_atan, amd_vrd8_atan, amd_vrs4_atanf, amd_vrs8_atanf, amd_vrs16_atanf, amd_vrd2_cos, amd_vrd4_cos, amd_vrd8_cos, amd_vrs4_cosf, amd_vrs8_cosf, amd_vrs16_cosf, amd_vrs4_coshf, amd_vrs8_coshf, amd_vrd2_erf, amd_vrd4_erf, amd_vrd8_erf, amd_vrs4_erff, amd_vrs8_erff, amd_vrs16_erff, amd_vrd2_exp, amd_vrd4_exp, amd_vrd8_exp, amd_vrs4_expf, amd_vrs8_expf, amd_vrs16_expf, amd_vrd2_exp10, amd_vrs4_exp10f, amd_vrd2_exp2, amd_vrd4_exp2, amd_vrd8_exp2, amd_vrs4_exp2f, amd_vrs8_exp2f, amd_vrs16_exp2f, amd_vrs4_expm1f, amd_vrd2_log, amd_vrd4_log, amd_vrd8_log, amd_vrs4_logf, amd_vrs8_logf, amd_vrs16_logf, amd_vrd2_log10, amd_vrs4_log10f, amd_vrs8_log10f, amd_vrs16_log10f, amd_vrd2_log1p, amd_vrs4_log1pf, amd_vrd2_log2, amd_vrd4_log2, amd_vrd8_log2, amd_vrs4_log2f, amd_vrs8_log2f, amd_vrs16_log2f, amd_vrd2_pow, amd_vrd4_pow, amd_vrd8_pow, amd_vrs4_powf, amd_vrs8_powf, amd_vrs16_powf, amd_vrd2_sin, amd_vrd4_sin, amd_vrd8_sin, amd_vrs4_sinf, amd_vrs8_sinf, amd_vrs16_sinf, amd_vrd2_tan, amd_vrd4_tan, amd_vrd8_tan, amd_vrs16_tanf, amd_vrs4_tanhf, amd_vrs8_tanhf, amd_vrs16_tanhf для соответствующего типа функции при использовании -mveclibabi=aocl; а также __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 любая функция Microsoft ABI, вызывающая функцию System V ABI, должна считать регистры RSI, RDI и XMM6-15 затираемыми. По умолчанию код сохранения и восстановления этих регистров генерируется непосредственно в строке, что приводит к довольно длинным прологам и эпилогам. Параметр -mcall-ms2sysv-xlogues генерирует прологи и эпилоги, использующие заглушки из статической части libgcc для сохранения и восстановления этих регистров. Это уменьшает размер функции ценой нескольких дополнительных инструкций.

-mtls-dialect=type

Генерировать код для доступа к локальному для потока хранилищу с использованием соглашений ‘gnu’ или ‘gnu2’. ‘gnu’ — консервативное значение по умолчанию; ‘gnu2’ эффективнее, но может добавлять требования во время компиляции и выполнения, которые не могут быть удовлетворены во всех системах.

-mpush-args
-mno-push-args

Использовать операции PUSH для сохранения передаваемых параметров. Этот способ короче и обычно не медленнее способа с операциями SUB/MOV; он включён по умолчанию. В некоторых случаях отключение параметра может повысить производительность благодаря улучшенному планированию и уменьшению зависимостей.

-maccumulate-outgoing-args

Если параметр включён, максимальный объём пространства, необходимого для передаваемых аргументов, вычисляется в прологе функции. На большинстве современных процессоров это быстрее благодаря уменьшению зависимостей, улучшенному планированию и сокращению использования стека, если предпочтительная граница стека не равна 2. Недостаток — заметное увеличение размера кода. Этот параметр подразумевает -mno-push-args.

-mthreads

Поддерживать потокобезопасную обработку исключений в MinGW. Программы, использующие потокобезопасную обработку исключений, должны компилировать и компоновать весь код с параметром -mthreads. При компиляции параметр -mthreads задаёт -D_MT; при компоновке он подключает специальную вспомогательную библиотеку потоков -lmingwthrd, которая очищает данные обработки исключений для каждого потока.

-mms-bitfields
-mno-ms-bitfields

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

Если для структуры используется packed или если используются битовые поля, 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 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, но не вызовы соседних функций, завершающиеся инструкцией jump. Допустимые значения: 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
-mstack-protector-guard-symbol=symbol

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

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

Параметр -mstack-protector-guard-symbol=symbol заменяет смещение ссылкой на символ canary в блоке TLS.

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

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

-m32
-m64
-mx32
-m16
-miamcu

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

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

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

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

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

-mno-red-zone

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

-mcmodel=small

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

-mcmodel=kernel

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

-mcmodel=medium

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

-mcmodel=large

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

-maddress-mode=long

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

-maddress-mode=short

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

-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-15.3.0/gcc/x86-Options.html

Spec-Zone.ru

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