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-doublelong 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 довольно прост, за исключением упаковки битовых полей. Дополнение и выравнивание членов структур, а также возможность пересечения битовым полем границы единицы хранения определяются следующими правилами:
- Члены структуры хранятся последовательно в порядке объявления: первый член имеет наименьший адрес в памяти, а последний — наибольший.
- Для каждого объекта данных требуется выравнивание. Требование к выравниванию всех данных, кроме структур, объединений и массивов, равно либо размеру объекта, либо текущему размеру упаковки (заданному атрибутом
alignedили директивойpack) — выбирается меньшее значение. Для структур, объединений и массивов требование к выравниванию равно наибольшему требованию среди их членов. Каждому объекту назначается смещение так, чтобы:offset % alignment_requirement == 0
- Соседние битовые поля упаковываются в одну единицу размещения размером 1, 2 или 4 байта, если их целочисленные типы имеют одинаковый размер и следующее битовое поле помещается в текущую единицу размещения, не пересекая границу, заданную общими требованиями к выравниванию битовых полей.
MSVC интерпретирует битовые поля нулевой длины следующим образом:
- Если битовое поле нулевой длины вставлено между двумя битовыми полями, которые обычно объединяются, эти битовые поля не объединяются.
Например:
struct { unsigned long bf_1 : 12; unsigned long : 0; unsigned long bf_2 : 12; } t1;Размер
t1с битовым полем нулевой длины составляет 8 байт. Если бы битовое поле нулевой длины было удалено, размерt1составлял бы 4 байта. - Если битовое поле нулевой длины вставлено после битового поля
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и, следовательно, на размер структуры.Учитывая это, важно отметить следующее:
- Если битовое поле нулевой длины следует за обычным битовым полем, его тип может влиять на выравнивание структуры в целом. Например, размер
t2составляет 4 байта, поскольку за обычным битовым полем следует битовое поле нулевой длины типа short. - Даже если за битовым полем нулевой длины не следует обычное битовое поле, оно всё равно может влиять на выравнивание структуры:
struct { char foo : 6; long : 0; } t4;Здесь
t4занимает 4 байта.
- Если битовое поле нулевой длины следует за обычным битовым полем, его тип может влиять на выравнивание структуры в целом. Например, размер
- Битовые поля нулевой длины, следующие за членами, не являющимися битовыми полями, игнорируются:
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