3.19.54 Параметры x86
Эти параметры «-m» определены для семейства компьютеров x86.
-
-march=cpu-type -
Генерировать инструкции для типа машины cpu-type. В отличие от -mtune=cpu-type, который только настраивает сгенерированный код для указанного cpu-type, -march=cpu-type позволяет GCC генерировать код, который может вообще не работать на процессорах, отличных от указанного. Указание -march=cpu-type подразумевает -mtune=cpu-type, кроме случаев, отмеченных особо.
Возможные значения cpu-type:
- ‘native’
-
Этот параметр выбирает процессор, для которого следует генерировать код во время компиляции, определяя тип процессора компилирующей машины. Использование -march=native включает все подмножества инструкций, поддерживаемые локальной машиной (поэтому результат может не работать на других машинах). Использование -mtune=native создает код, оптимизированный для локальной машины с учетом ограничений выбранного набора инструкций.
- ‘x86-64’
-
Универсальный процессор с 64-разрядными расширениями.
- ‘x86-64-v2’
- ‘x86-64-v3’
- ‘x86-64-v4’
-
Эти значения cpu-type выбирают соответствующий уровень микроархитектуры из x86-64 psABI. Для ABI, отличных от x86-64 psABI, они выбирают те же возможности процессора, которые в документации x86-64 psABI указаны для соответствующего уровня микроархитектуры.
Поскольку этим значениям cpu-type не соответствует настройка -mtune, использование -march с этими значениями включает универсальную настройку. Специальную настройку можно включить с помощью параметра -mtune=other-cpu-type, указав подходящее значение other-cpu-type.
- ‘i386’
-
Исходный процессор Intel i386.
- ‘i486’
-
Процессор Intel i486. (Для этого процессора планирование не реализовано.)
- ‘i586’
- ‘pentium’
-
Процессор Intel Pentium без поддержки MMX.
- ‘lakemont’
-
Микроконтроллер Intel Lakemont на базе процессора Intel Pentium.
- ‘pentium-mmx’
-
Процессор Intel Pentium MMX на базе ядра Pentium с поддержкой набора инструкций MMX.
- ‘pentiumpro’
-
Процессор Intel Pentium Pro.
- ‘i686’
-
При использовании с -march применяется набор инструкций Pentium Pro, поэтому код работает на всех процессорах семейства i686. При использовании с -mtune имеет то же значение, что и «generic».
- ‘pentium2’
-
Процессор Intel Pentium II на базе ядра Pentium Pro с поддержкой наборов инструкций MMX и FXSR.
- ‘pentium3’
- ‘pentium3m’
-
Процессор Intel Pentium III на базе ядра Pentium Pro с поддержкой наборов инструкций MMX, FXSR и SSE.
- ‘pentium-m’
-
Intel Pentium M — маломощная версия процессора Intel Pentium III с поддержкой наборов инструкций MMX, SSE, SSE2 и FXSR. Использовался в ноутбуках Centrino.
- ‘pentium4’
- ‘pentium4m’
-
Процессор Intel Pentium 4 с поддержкой наборов инструкций MMX, SSE, SSE2 и FXSR.
- ‘prescott’
-
Улучшенная версия процессора Intel Pentium 4 с поддержкой наборов инструкций MMX, SSE, SSE2, SSE3 и FXSR.
- ‘nocona’
-
Улучшенная версия процессора Intel Pentium 4 с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3 и FXSR.
- ‘core2’
-
Процессор Intel Core 2 с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, CX16, SAHF и FXSR.
- ‘nehalem’
- ‘corei7’
-
Процессор Intel Nehalem с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF и FXSR.
- ‘westmere’
-
Процессор Intel Westmere с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR и PCLMUL.
- ‘sandybridge’
- ‘corei7-avx’
-
Процессор Intel Sandy Bridge с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE и PCLMUL.
- ‘ivybridge’
- ‘core-avx-i’
-
Процессор Intel Ivy Bridge с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND и F16C.
- ‘haswell’
- ‘core-avx2’
-
Процессор Intel Haswell с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE и HLE.
- ‘broadwell’
-
Процессор Intel Broadwell с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX и PREFETCHW.
- ‘skylake’
-
Процессор Intel Skylake с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES и SGX.
- ‘skylake-avx512’
-
Серверный процессор Intel Skylake с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ и AVX512CD.
- ‘cascadelake’
-
Процессор Intel Cascade Lake с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ, AVX512CD и AVX512VNNI.
- ‘cannonlake’
-
Серверный процессор Intel Cannon Lake с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA и SHA.
- ‘cooperlake’
-
Процессор Intel Cooper Lake с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VNNI и AVX512BF16.
- ‘icelake-client’
-
Клиентский процессор Intel Ice Lake с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2 , VPCLMULQDQ, AVX512BITALG, RDPID и AVX512VPOPCNTDQ.
- ‘icelake-server’
-
Серверный процессор Intel Ice Lake с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2 , VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, PCONFIG, WBNOINVD и CLWB.
- ‘tigerlake’
-
Процессор Intel Tiger Lake с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, MOVDIRI, MOVDIR64B, CLWB, AVX512VP2INTERSECT и KEYLOCKER.
- ‘rocketlake’
-
Процессор Intel Rocket Lake с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID и AVX512VPOPCNTDQ.
- ‘alderlake’
- ‘raptorlake’
- ‘meteorlake’
- ‘gracemont’
-
Процессор Intel Alder Lake/Raptor Lake/Meteor Lake/Gracemont с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL и AVX-VNNI.
- ‘arrowlake’
-
Процессор Intel Arrow Lake с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT и CMPCCXADD.
- ‘arrowlake-s’
- ‘lunarlake’
-
Процессор Intel Arrow Lake S/Lunar Lake с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512, SM3 и SM4.
- ‘pantherlake’
-
Процессор Intel Panther Lake с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, AVX-VNNI, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512, SM3 и SM4.
- ‘sapphirerapids’
- ‘emeraldrapids’
-
Процессор Intel Sapphire Rapids/Emerald Rapids с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, PCONFIG, WBNOINVD, CLWB, MOVDIRI, MOVDIR64B, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512-FP16 и AVX512BF16.
- ‘graniterapids’
-
Процессор Intel Granite Rapids с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, PCONFIG, WBNOINVD, CLWB, MOVDIRI, MOVDIR64B, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512-FP16, AVX512BF16, AMX-FP16 и PREFETCHI.
- ‘graniterapids-d’
-
Процессор Intel Granite Rapids D с 64-разрядными расширениями и поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, PCONFIG, WBNOINVD, CLWB, MOVDIRI, MOVDIR64B, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512FP16, AVX512BF16, AMX-FP16, PREFETCHI и AMX-COMPLEX.
- ‘bonnell’
- ‘atom’
-
Процессор Intel Bonnell с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3 и SSSE3.
- ‘silvermont’
- ‘slm’
-
Процессор Intel Silvermont с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, PCLMUL, PREFETCHW и RDRND.
- ‘goldmont’
-
Процессор Intel Goldmont с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, PCLMUL, PREFETCHW, RDRND, AES, SHA, RDSEED, XSAVE, XSAVEC, XSAVES, XSAVEOPT, CLFLUSHOPT и FSGSBASE.
- ‘goldmont-plus’
-
Процессор Intel Goldmont Plus с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, PCLMUL, PREFETCHW, RDRND, AES, SHA, RDSEED, XSAVE, XSAVEC, XSAVES, XSAVEOPT, CLFLUSHOPT, FSGSBASE, PTWRITE, RDPID и SGX.
- ‘tremont’
-
Процессор Intel Tremont с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, PCLMUL, PREFETCHW, RDRND, AES, SHA, RDSEED, XSAVE, XSAVEC, XSAVES, XSAVEOPT, CLFLUSHOPT, FSGSBASE, PTWRITE, RDPID, SGX, CLWB, GFNI-SSE, MOVDIRI, MOVDIR64B, CLDEMOTE и WAITPKG.
- ‘sierraforest’
-
Процессор Intel Sierra Forest с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, ENQCMD и UINTR.
- ‘grandridge’
-
Процессор Intel Grand Ridge с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, ENQCMD и UINTR.
- ‘clearwaterforest’
-
Процессор Intel Clearwater Forest с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, AVX-VNNI, ENQCMD, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512, SM3, SM4, USER_MSR и PREFETCHI.
- ‘knl’
-
Процессор Intel Knights Landing с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AVX512PF, AVX512ER, AVX512F, AVX512CD и PREFETCHWT1.
- ‘knm’
-
Процессор Intel Knights Mill с 64-разрядными расширениями и поддержкой наборов инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AVX512PF, AVX512ER, AVX512F, AVX512CD, PREFETCHWT1, AVX5124VNNIW, AVX5124FMAPS и AVX512VPOPCNTDQ.
- ‘k6’
-
Процессор AMD K6 с поддержкой набора инструкций MMX.
- ‘k6-2’
- ‘k6-3’
-
Улучшенные версии процессора AMD K6 с поддержкой наборов инструкций MMX и 3DNow!
- ‘athlon’
- ‘athlon-tbird’
-
Процессор AMD Athlon с поддержкой инструкций предварительной выборки MMX, 3dNOW!, enhanced 3DNow! и SSE.
- ‘athlon-4’
- ‘athlon-xp’
- ‘athlon-mp’
-
Улучшенный процессор AMD Athlon с поддержкой наборов инструкций MMX, 3DNow!, enhanced 3DNow! и полного набора SSE.
- ‘k8’
- ‘opteron’
- ‘athlon64’
- ‘athlon-fx’
-
Процессоры на базе ядра AMD K8 с поддержкой набора инструкций x86-64, включая процессоры AMD Opteron, Athlon 64 и Athlon 64 FX. (В этот набор входят MMX, SSE, SSE2, 3DNow!, enhanced 3DNow! и 64-разрядные расширения набора инструкций.)
- ‘k8-sse3’
- ‘opteron-sse3’
- ‘athlon64-sse3’
-
Улучшенные версии ядер AMD K8 с поддержкой набора инструкций SSE3.
- ‘amdfam10’
- ‘barcelona’
-
Процессоры на базе ядер AMD Family 10h с поддержкой набора инструкций x86-64. (В этот набор входят MMX, SSE, SSE2, SSE3, SSE4A, 3DNow!, enhanced 3DNow!, ABM и 64-разрядные расширения набора инструкций.)
- ‘bdver1’
-
Процессоры на базе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (В этот набор входят FMA4, AVX, XOP, LWP, AES, PCLMUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и 64-разрядные расширения набора инструкций.)
- ‘bdver2’
-
Процессоры на базе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (В этот набор входят BMI, TBM, F16C, FMA, FMA4, AVX, XOP, LWP, AES, PCLMUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и 64-разрядные расширения набора инструкций.)
- ‘bdver3’
-
Процессоры на базе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (В этот набор входят BMI, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, XOP, LWP, AES, PCLMUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и 64-разрядные расширения набора инструкций.)
- ‘bdver4’
-
Процессоры на базе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (В этот набор входят BMI, BMI2, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, AVX2, XOP, LWP, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и 64-разрядные расширения набора инструкций.)
- ‘znver1’
-
Процессоры на базе ядер AMD Family 17h с поддержкой набора инструкций x86-64. (В этот набор входят BMI, BMI2, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT и 64-разрядные расширения набора инструкций.)
- ‘znver2’
-
Процессоры на базе ядер AMD Family 17h с поддержкой набора инструкций x86-64. (В этот набор входят BMI, BMI2, CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID, WBNOINVD и 64-разрядные расширения набора инструкций.)
- ‘znver3’
-
Процессоры на базе ядер AMD Family 19h с поддержкой набора инструкций x86-64. (В этот набор входят BMI, BMI2, CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID, WBNOINVD, PKU, VPCLMULQDQ, VAES и 64-разрядные расширения набора инструкций.)
- ‘znver4’
-
Процессоры на базе ядер AMD Family 19h с поддержкой набора инструкций x86-64. (В этот набор входят BMI, BMI2, CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID, WBNOINVD, PKU, VPCLMULQDQ, VAES, AVX512F, AVX512DQ, AVX512IFMA, AVX512CD, AVX512BW, AVX512VL, AVX512BF16, AVX512VBMI, AVX512VBMI2, AVX512VNNI, AVX512BITALG, AVX512VPOPCNTDQ, GFNI и 64-разрядные расширения набора инструкций.)
- ‘znver5’
-
Процессоры на базе ядер AMD Family 1ah с поддержкой набора инструкций x86-64. (В этот набор входят BMI, BMI2, CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID, WBNOINVD, PKU, VPCLMULQDQ, VAES, AVX512F, AVX512DQ, AVX512IFMA, AVX512CD, AVX512BW, AVX512VL, AVX512BF16, AVX512VBMI, AVX512VBMI2, AVX512VNNI, AVX512BITALG, AVX512VPOPCNTDQ, GFNI, AVXVNNI, MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, PREFETCHI и 64-разрядные расширения набора инструкций.)
- ‘btver1’
-
Процессоры на базе ядер AMD Family 14h с поддержкой набора инструкций x86-64. (В этот набор входят MMX, SSE, SSE2, SSE3, SSSE3, SSE4A, CX16, ABM и 64-разрядные расширения набора инструкций.)
- ‘btver2’
-
Процессоры на базе ядер AMD Family 16h с поддержкой набора инструкций x86-64. В него входят MOVBE, F16C, BMI, AVX, PCLMUL, AES, SSE4.2, SSE4.1, CX16, ABM, SSE4A, SSSE3, SSE3, SSE2, SSE, MMX и 64-разрядные расширения набора инструкций.
- ‘winchip-c6’
-
Процессор IDT WinChip C6, обрабатываемый так же, как i486, с дополнительной поддержкой набора инструкций MMX.
- ‘winchip2’
-
Процессор IDT WinChip 2, обрабатываемый так же, как i486, с дополнительной поддержкой наборов инструкций MMX и 3DNow!
- ‘c3’
-
Процессор VIA C3 с поддержкой наборов инструкций MMX и 3DNow! (Для этого процессора планирование не реализовано.)
- ‘c3-2’
-
Процессор VIA C3-2 (Nehemiah/C5XL) с поддержкой наборов инструкций MMX и SSE. (Для этого процессора планирование не реализовано.)
- ‘c7’
-
Процессор VIA C7 (Esther) с поддержкой наборов инструкций MMX, SSE, SSE2 и SSE3. (Для этого процессора планирование не реализовано.)
- ‘samuel-2’
-
Процессор VIA Eden Samuel 2 с поддержкой наборов инструкций MMX и 3DNow! (Для этого процессора планирование не реализовано.)
- ‘nehemiah’
-
Процессор VIA Eden Nehemiah с поддержкой наборов инструкций MMX и SSE. (Для этого процессора планирование не реализовано.)
- ‘esther’
-
Процессор VIA Eden Esther с поддержкой наборов инструкций MMX, SSE, SSE2 и SSE3. (Для этого процессора планирование не реализовано.)
- ‘eden-x2’
-
Процессор VIA Eden X2 с поддержкой наборов инструкций x86-64, MMX, SSE, SSE2 и SSE3. (Для этого процессора планирование не реализовано.)
- ‘eden-x4’
-
Процессор VIA Eden X4 с поддержкой наборов инструкций x86-64, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX и AVX2. (Для этого процессора планирование не реализовано.)
- ‘nano’
-
Универсальный процессор VIA Nano с поддержкой наборов инструкций x86-64, MMX, SSE, SSE2, SSE3 и SSSE3. (Для этого процессора планирование не реализовано.)
- ‘nano-1000’
-
Процессор VIA Nano 1xxx с поддержкой наборов инструкций x86-64, MMX, SSE, SSE2, SSE3 и SSSE3. (Для этого процессора планирование не реализовано.)
- ‘nano-2000’
-
Процессор VIA Nano 2xxx с поддержкой наборов инструкций x86-64, MMX, SSE, SSE2, SSE3 и SSSE3. (Для этого процессора планирование не реализовано.)
- ‘nano-3000’
-
Процессор VIA Nano 3xxx с поддержкой наборов инструкций x86-64, MMX, SSE, SSE2, SSE3, SSSE3 и SSE4.1. (Для этого процессора планирование не реализовано.)
- ‘nano-x2’
-
Двухъядерный процессор VIA Nano с поддержкой наборов инструкций x86-64, MMX, SSE, SSE2, SSE3, SSSE3 и SSE4.1. (Для этого процессора планирование не реализовано.)
- ‘nano-x4’
-
Четырехъядерный процессор VIA Nano с поддержкой наборов инструкций x86-64, MMX, SSE, SSE2, SSE3, SSSE3 и SSE4.1. (Для этого процессора планирование не реализовано.)
- ‘lujiazui’
-
Процессор ZHAOXIN lujiazui с поддержкой наборов инструкций x86-64, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PCLMUL, RDRND, XSAVE, XSAVEOPT, FSGSBASE, CX16, ABM, BMI, BMI2, FXSR и RDSEED. Хотя процессоры поддерживают AVX и F16C, эти возможности не включаются
-march=lujiazuiпо соображениям производительности. - ‘yongfeng’
-
Процессор ZHAOXIN yongfeng с поддержкой наборов инструкций x86-64, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, POPCNT, AES, PCLMUL, RDRND, XSAVE, XSAVEOPT, FSGSBASE, CX16, ABM, BMI, BMI2, F16C, FXSR, RDSEED, AVX2, FMA, SHA и LZCNT.
- ‘geode’
Встраиваемый процессор AMD Geode с поддержкой наборов инструкций MMX и 3DNow!
-
-mtune=cpu-type
-
Настраивает всё, что применимо к сгенерированному коду, для cpu-type, за исключением ABI и набора доступных инструкций. При выборе конкретного cpu-type планирование выполняется соответствующим образом для данного процессора, но компилятор не генерирует код, который не может выполняться на типе машины по умолчанию, если не используется параметр -march=cpu-type. Например, если GCC настроен для i686-pc-linux-gnu, параметр -mtune=pentium4 генерирует код, оптимизированный для Pentium 4, но работающий и на машинах i686.
Варианты cpu-type те же, что и для -march. Кроме того, -mtune поддерживает ещё два варианта cpu-type:
- ‘generic’
-
Создаёт код, оптимизированный для наиболее распространённых процессоров IA32/AMD64/EM64T. Если вы знаете, на каком процессоре будет выполняться ваш код, следует вместо -mtune=generic использовать соответствующий параметр -mtune или -march. Если же вы точно не знаете, какие процессоры будут у пользователей приложения, используйте этот параметр.
По мере появления на рынке новых процессоров поведение этого параметра будет меняться. Поэтому при переходе на более новую версию GCC генерация кода, управляемая этим параметром, будет учитывать процессоры, наиболее распространённые на момент выпуска этой версии GCC.
Параметра -march=generic не существует, поскольку -march задаёт набор инструкций, которые может использовать компилятор, а общего набора инструкций, применимого ко всем процессорам, нет. В отличие от него, -mtune задаёт процессор (или, в данном случае, группу процессоров), для которого оптимизируется код.
- ‘intel’
-
Создаёт код, оптимизированный для наиболее современных процессоров Intel — в этой версии GCC это Haswell и Silvermont. Если вы знаете, на каком процессоре будет выполняться ваш код, следует вместо -mtune=intel использовать соответствующий параметр -mtune или -march. Если же вы хотите, чтобы приложение лучше работало и на Haswell, и на Silvermont, используйте этот параметр.
По мере появления на рынке новых процессоров Intel поведение этого параметра будет меняться. Поэтому при переходе на более новую версию GCC генерация кода, управляемая этим параметром, будет учитывать наиболее современные процессоры Intel на момент выпуска этой версии GCC.
Параметра -march=intel не существует, поскольку -march задаёт набор инструкций, которые может использовать компилятор, а общего набора инструкций, применимого ко всем процессорам, нет. В отличие от него, -mtune задаёт процессор (или, в данном случае, группу процессоров), для которого оптимизируется код.
-
-mcpu=cpu-type -
Устаревший синоним для -mtune.
-
-mfpmath=unit -
Генерирует арифметические операции с плавающей точкой для выбранного блока unit. Возможны следующие варианты unit:
- ‘387’
-
Использует стандартный математический сопроцессор 387, присутствующий в большинстве процессоров; в остальных случаях он эмулируется. Код, скомпилированный с этим параметром, работает практически везде. Промежуточные результаты вычисляются с точностью 80 бит, а не с точностью, заданной типом, поэтому результаты немного отличаются от результатов на большинстве других процессоров. Более подробное описание см. в разделе -ffloat-store.
Это вариант по умолчанию для целевых платформ x86-32, отличных от Darwin.
- ‘sse’
-
Использует скалярные инструкции с плавающей точкой из набора инструкций SSE. Этот набор инструкций поддерживается процессорами Pentium III и новее, а в линейке AMD — процессорами Athlon-4, Athlon XP и Athlon MP. Более ранняя версия набора инструкций SSE поддерживает только вычисления с одинарной точностью, поэтому вычисления с двойной и расширенной точностью по-прежнему выполняются с помощью 387. Более поздняя версия, присутствующая только в Pentium 4 и процессорах AMD x86-64, поддерживает также вычисления с двойной точностью.
Для компилятора x86-32 необходимо использовать параметры -march=cpu-type, -msse или -msse2, чтобы включить расширения SSE и активировать этот параметр. Для компилятора x86-64 эти расширения включены по умолчанию.
В большинстве случаев полученный код должен быть значительно быстрее и не иметь проблем с численной нестабильностью, характерных для кода 387, однако он может нарушить работу существующего кода, который предполагает, что промежуточные значения имеют точность 80 бит.
Это вариант по умолчанию для компилятора x86-64, целевых платформ Darwin x86-32, а также для целевых платформ x86-32 с набором инструкций SSE2, если включён параметр -ffast-math.
- ‘sse,387’
- ‘sse+387’
- ‘both’
Пытается одновременно использовать оба набора инструкций. Это фактически удваивает количество доступных регистров, а на процессорах с отдельными блоками выполнения для 387 и SSE — также вычислительные ресурсы. Используйте этот параметр осторожно: он всё ещё является экспериментальным, поскольку распределитель регистров GCC плохо учитывает раздельные функциональные блоки, что приводит к нестабильной производительности.
-
-masm=dialect -
Выводит инструкции ассемблера в выбранном dialect. Также определяет диалект для базового
asm(см. раздел Базовый ассемблерный код — инструкции ассемблера без операндов) и расширенногоasm(см. раздел Расширенный ассемблерный код — инструкции ассемблера с операндами-выражениями C). Поддерживаемые варианты (в порядке диалектов): ‘att’ или ‘intel’. По умолчанию используется ‘att’. Darwin не поддерживает ‘intel’. -
-mieee-fp -mno-ieee-fp-
Управляет использованием компилятором сравнений с плавающей точкой по стандарту IEEE. Такие сравнения корректно обрабатывают случаи, когда результат сравнения неупорядочен.
-
-m80387 -mhard-float-
Генерирует вывод, содержащий инструкции 80387 для операций с плавающей точкой.
-
-mno-80387 -msoft-float-
Генерирует вывод, содержащий библиотечные вызовы для операций с плавающей точкой.
Предупреждение: необходимые библиотеки не входят в состав GCC. Обычно используются средства стандартного компилятора C для данной машины, однако при кросс-компиляции это невозможно сделать напрямую. При кросс-компиляции необходимо самостоятельно обеспечить наличие подходящих библиотечных функций.
На машинах, где функция возвращает результаты с плавающей точкой в стек регистров 80387, некоторые инструкции с плавающей точкой могут генерироваться даже при использовании -msoft-float.
-
-mno-fp-ret-in-387 -
Не использует регистры FPU для возвращаемых функциями значений.
Согласно обычному соглашению о вызовах, функции возвращают значения типов
floatиdoubleв регистре FPU, даже если FPU отсутствует. Предполагается, что операционная система будет эмулировать FPU.Параметр -mno-fp-ret-in-387 заставляет возвращать такие значения в обычных регистрах CPU.
-
-mno-fancy-math-387 -
Некоторые эмуляторы 387 не поддерживают инструкции
sin,cosиsqrtдля 387. Укажите этот параметр, чтобы избежать генерации этих инструкций. Этот параметр игнорируется, если параметр -march указывает, что целевой CPU всегда имеет FPU и, следовательно, эмулировать инструкцию не требуется. Эти инструкции не генерируются, если дополнительно не указан параметр -funsafe-math-optimizations. -
-malign-double -mno-align-double-
Управляет выравниванием переменных
double,long doubleиlong longпо границе двух слов или одного слова. Выравнивание переменныхdoubleпо границе двух слов позволяет получить несколько более быстрый код на Pentium, ценой увеличения расхода памяти.В x86-64 параметр -malign-double включён по умолчанию.
Предупреждение: при использовании параметра -malign-double структуры, содержащие указанные выше типы, выравниваются иначе, чем предписано опубликованными спецификациями ABI для x86-32, и несовместимы на уровне двоичного представления со структурами в коде, скомпилированном без этого параметра.
-
-m96bit-long-double -m128bit-long-double-
Эти параметры управляют размером типа
long double. В ABI приложений x86-32 задан размер 96 бит, поэтому в 32-разрядном режиме по умолчанию используется -m96bit-long-double.В современных архитектурах (Pentium и новее) предпочтительно выравнивать
long doubleпо границе 8 или 16 байт. Для массивов и структур, соответствующих ABI, это невозможно. Поэтому указание -m128bit-long-double выравниваетlong doubleпо границе 16 байт, дополняяlong doubleдополнительным 32-разрядным нулём.В компиляторе x86-64 вариант -m128bit-long-double используется по умолчанию, поскольку согласно ABI
long doubleвыравнивается по границе 16 байт.Обратите внимание, что ни один из этих параметров не обеспечивает точность выше стандартных 80 бит x87 для
long double.Предупреждение: переопределение значения по умолчанию для целевого ABI меняет размер структур и массивов, содержащих переменные
long double, а также соглашение о вызовах для функций, принимающихlong double. Поэтому они несовместимы на уровне двоичного представления с кодом, скомпилированным без этого параметра. -
-mlong-double-64 -mlong-double-80-mlong-double-128-
Эти параметры управляют размером типа
long double. При размере 64 бита типlong doubleэквивалентен типуdouble. Это значение по умолчанию для 32-разрядной библиотеки Bionic C. При размере 128 бит типlong doubleэквивалентен типу__float128. Это значение по умолчанию для 64-разрядной библиотеки Bionic C.Предупреждение: переопределение значения по умолчанию для целевого ABI меняет размер структур и массивов, содержащих переменные
long double, а также соглашение о вызовах для функций, принимающихlong double. Поэтому они несовместимы на уровне двоичного представления с кодом, скомпилированным без этого параметра. -
-malign-data=type -
Управляет выравниванием переменных в GCC. Поддерживаются следующие значения type: ‘compat’ использует увеличенное значение выравнивания, совместимое с GCC 4.8 и более ранними версиями; ‘abi’ использует значение выравнивания, заданное psABI; ‘cacheline’ использует увеличенное значение выравнивания, соответствующее размеру строки кэша. По умолчанию используется ‘compat’.
-
-mlarge-data-threshold=threshold -
Если указан параметр -mcmodel=medium или -mcmodel=large, объекты данных размером более threshold размещаются в больших секциях данных. Значение по умолчанию — 65535.
-
-mrtd -
Использует другое соглашение о вызовах функций: функции с фиксированным числом аргументов возвращаются с помощью инструкции
ret num, которая удаляет аргументы из стека при возврате. Это позволяет сэкономить одну инструкцию в вызывающем коде, поскольку аргументы не нужно удалять там.Указать такое соглашение о вызовах для отдельной функции можно с помощью атрибута функции
stdcall. Переопределить параметр -mrtd также можно с помощью атрибута функцииcdecl. См. раздел Объявление атрибутов функций.Предупреждение: это соглашение о вызовах несовместимо с обычным соглашением, используемым в Unix, поэтому его нельзя применять, если требуется вызывать библиотеки, скомпилированные компилятором Unix.
Кроме того, необходимо объявлять прототипы всех функций с переменным числом аргументов (в том числе
printf); в противном случае вызовы этих функций будут генерировать неправильный код.Также вызов функции со слишком большим числом аргументов приведёт к серьёзным ошибкам в коде. (Обычно лишние аргументы безвредно игнорируются.)
-
-mregparm=num -
Управляет количеством регистров, используемых для передачи целочисленных аргументов. По умолчанию регистры для передачи аргументов не используются; максимально можно использовать 3 регистра. Это поведение для отдельной функции можно задать с помощью атрибута функции
regparm. См. раздел Объявление атрибутов функций.Предупреждение: если вы используете этот параметр и значение num отлично от нуля, все модули, включая библиотеки, необходимо собирать с одинаковым значением. Это относится к системным библиотекам и стартовым модулям.
-
-msseregparm -
Использует соглашения о передаче аргументов и возвращаемых значений типа float и double через регистры SSE. Это поведение для отдельной функции можно задать с помощью атрибута функции
sseregparm. См. раздел Объявление атрибутов функций.Предупреждение: при использовании этого параметра все модули, включая библиотеки, необходимо собирать с одинаковым значением. Это относится к системным библиотекам и стартовым модулям.
-
-mvect8-ret-in-mem -
Возвращает 8-байтовые векторы в памяти, а не в регистрах MMX. Это значение по умолчанию для VxWorks, чтобы соответствовать ABI компиляторов Sun Studio до версии 12. Используйте этот параметр только в том случае, если необходимо сохранить совместимость с существующим кодом, созданным предыдущими версиями этих компиляторов или более ранними версиями GCC.
-
-mpc32 -mpc64-mpc80-
Задаёт точность операций с плавающей точкой 80387: 32, 64 или 80 бит. При указании -mpc32 значащие части результатов операций с плавающей точкой округляются до 24 бит (одинарная точность); -mpc64 округляет значащие части результатов до 53 бит (двойная точность), а -mpc80 — до 64 бит (расширенная двойная точность); последний вариант используется по умолчанию. При использовании этого параметра программист не может выполнять операции с плавающей точкой повышенной точности, не задав явно управляющее слово FPU.
Уменьшение точности округления операций с плавающей точкой по сравнению со значением по умолчанию в 80 бит может ускорить некоторые программы на 2% или более. Обратите внимание, что некоторые математические библиотеки предполагают, что по умолчанию включены операции с плавающей точкой расширенной точности (80 бит). При использовании этого параметра для задания точности ниже расширенной процедуры таких библиотек могут значительно терять точность, обычно из-за так называемого «катастрофического вычитания».
-
-mdaz-ftz -
Флаги flush-to-zero (FTZ) и denormals-are-zero (DAZ) в регистре MXCSR управляют вычислениями с плавающей точкой. Инструкции SSE и AVX, включая скалярные и векторные, могут работать эффективнее при включённых флагах FTZ и DAZ, если указан параметр -mdaz-ftz. Флаги FTZ/DAZ не устанавливаются, если указан параметр -mno-daz-ftz или -shared; однако -mdaz-ftz устанавливает флаги FTZ/DAZ даже при использовании -shared.
-
-mstackrealign -
Повторно выравнивает стек при входе в функцию. На x86 параметр -mstackrealign генерирует альтернативные пролог и эпилог, которые при необходимости повторно выравнивают стек во время выполнения. Это позволяет смешивать старый код, в котором выравнивание стека составляет 4 байта, с современным кодом, в котором для совместимости с SSE используется выравнивание стека в 16 байт. См. также атрибут
force_align_arg_pointer, применяемый к отдельным функциям. -
-mpreferred-stack-boundary=num -
Пытается выровнять границу стека по границе в 2 в степени num байт. Если параметр -mpreferred-stack-boundary не указан, значение по умолчанию равно 4 (16 байт, или 128 бит).
Предупреждение: при генерации кода для архитектуры x86-64 с отключёнными расширениями SSE можно использовать -mpreferred-stack-boundary=3, чтобы выравнивать границу стека по границе 8 байт. Поскольку ABI x86-64 требует выравнивания стека по границе 16 байт, это несовместимо с ABI и предназначено для использования в контролируемой среде, где объём стека является важным ограничением. Этот параметр приводит к генерации неправильного кода, если функции, скомпилированные с выравниванием стека 16 байт (например, функции стандартной библиотеки), вызываются с невыравненным стеком. В этом случае инструкции SSE могут приводить к исключениям при невыравненном доступе к памяти. Кроме того, аргументы переменной длины обрабатываются неправильно для объектов, выровненных по границе 16 байт (включая x87 long double и __int128), что приводит к неправильным результатам. Все модули, включая библиотеки, необходимо собирать с параметром -mpreferred-stack-boundary=3. Это относится к системным библиотекам и стартовым модулям.
-
-mincoming-stack-boundary=num -
Предполагает, что входящий стек выровнен по границе в 2 в степени num байт. Если параметр -mincoming-stack-boundary не указан, используется значение параметра -mpreferred-stack-boundary.
На Pentium и Pentium Pro значения
doubleиlong doubleдолжны быть выровнены по границе 8 байт (см. -malign-double); в противном случае во время выполнения возникают значительные потери производительности. На Pentium III тип данных Streaming SIMD Extension (SSE)__m128может работать некорректно, если он не выровнен по границе 16 байт.Чтобы обеспечить правильное выравнивание этих значений в стеке, граница стека должна быть выровнена как минимум так же, как требуется для любого значения, хранящегося в стеке. Кроме того, каждую функцию необходимо генерировать так, чтобы она сохраняла выравнивание стека. Поэтому вызов функции, скомпилированной с большим предпочтительным выравниванием стека, из функции, скомпилированной с меньшим предпочтительным выравниванием, скорее всего, нарушит выравнивание стека. Рекомендуется, чтобы библиотеки, использующие обратные вызовы, всегда применяли значение по умолчанию.
Это дополнительное выравнивание требует больше места в стеке и обычно увеличивает размер кода. Для кода, чувствительного к использованию пространства стека, например для встроенных систем и ядер операционных систем, может быть предпочтительно уменьшить выравнивание до -mpreferred-stack-boundary=2.
-
-mmmx -msse-msse2-msse3-mssse3-msse4-msse4a-msse4.1-msse4.2-mavx-mavx2-mavx512f-mavx512pf-mavx512er-mavx512cd-mavx512vl-mavx512bw-mavx512dq-mavx512ifma-mavx512vbmi-msha-maes-mpclmul-mclflushopt-mclwb-mfsgsbase-mptwrite-mrdrnd-mf16c-mfma-mpconfig-mwbnoinvd-mfma4-mprfchw-mrdpid-mprefetchwt1-mrdseed-msgx-mxop-mlwp-m3dnow-m3dnowa-mpopcnt-mabm-madx-mbmi-mbmi2-mlzcnt-mfxsr-mxsave-mxsaveopt-mxsavec-mxsaves-mrtm-mhle-mtbm-mmwaitx-mclzero-mpku-mavx512vbmi2-mavx512bf16-mavx512fp16-mgfni-mvaes-mwaitpkg-mvpclmulqdq-mavx512bitalg-mmovdiri-mmovdir64b-menqcmd-muintr-mtsxldtrk-mavx512vpopcntdq-mavx512vp2intersect-mavx5124fmaps-mavx512vnni-mavxvnni-mavx5124vnniw-mcldemote-mserialize-mamx-tile-mamx-int8-mamx-bf16-mhreset-mkl-mwidekl-mavxifma-mavxvnniint8-mavxneconvert-mcmpccxadd-mamx-fp16-mprefetchi-mraoint-mamx-complex-mavxvnniint16-msm3-msha512-msm4-mapxf-musermsr-mavx10.1-mavx10.1-256-mavx10.1-512-
Эти параметры включают использование инструкций наборов MMX, SSE, AVX512ER, AVX512CD, AVX512VL, AVX512BW, AVX512DQ, AVX512IFMA, AVX512VBMI, SHA, AES, PCLMUL, CLFLUSHOPT, CLWB, FSGSBASE, PTWRITE, RDRND, F16C, FMA, PCONFIG, WBNOINVD, FMA4, PREFETCHW, RDPID, PREFETCHWT1, RDSEED, SGX, XOP, LWP, 3DNow!, enhanced 3DNow!, POPCNT, ABM, ADX, BMI, BMI2, LZCNT, FXSR, XSAVE, XSAVEOPT, XSAVEC, XSAVES, RTM, HLE, TBM, MWAITX, CLZERO, PKU, AVX512VBMI2, GFNI, VAES, WAITPKG, VPCLMULQDQ, AVX512BITALG, MOVDIRI, MOVDIR64B, AVX512BF16, ENQCMD, AVX512VPOPCNTDQ, AVX5124FMAPS, AVX512VNNI, AVX5124VNNIW, SERIALIZE, UINTR, HRESET, AMXTILE, AMXINT8, AMXBF16, KL, WIDEKL, AVXVNNI, AVX512-FP16, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AMX-FP16, PREFETCHI, RAOINT, AMX-COMPLEX, AVXVNNIINT16, SM3, SHA512, SM4, APX_F, USER_MSR, AVX10.1 или CLDEMOTE. Для отключения использования этих инструкций предусмотрен соответствующий параметр -mno-.
Эти расширения также доступны в виде встроенных функций: подробные сведения о функциях, включаемых и отключаемых этими параметрами, см. в разделе Встроенные функции x86.
Сведения об автоматической генерации инструкций SSE/SSE2 из кода с плавающей точкой (вместо инструкций 387) см. в описании -mfpmath=sse.
При использовании -mavx GCC избегает инструкций SSEx. Вместо них при необходимости он генерирует новые инструкции AVX или эквиваленты инструкций SSEx на AVX.
Эти параметры позволяют GCC использовать указанные расширенные инструкции в сгенерированном коде даже без -mfpmath=sse. Приложения, выполняющие обнаружение CPU во время выполнения, должны компилировать отдельные файлы для каждой поддерживаемой архитектуры с соответствующими флагами. В частности, файл с кодом обнаружения CPU следует компилировать без этих параметров.
-
-mdump-tune-features -
Этот параметр указывает GCC вывести названия функций настройки производительности x86 и значения по умолчанию. Эти названия можно использовать в -mtune-ctrl=feature-list.
-
-mtune-ctrl=feature-list -
Этот параметр позволяет тонко управлять функциями генерации кода x86. feature-list — разделённый запятыми список названий feature. См. также -mdump-tune-features. При указании параметра feature включается, если перед ним нет символа ‘^’, и отключается в противном случае. Параметр -mtune-ctrl=feature-list предназначен для разработчиков GCC. Его использование может привести к выбору путей выполнения кода, не охваченных тестированием, и потенциально вызвать внутренние ошибки компилятора или ошибки во время выполнения.
-
-mno-default -
Этот параметр указывает GCC отключить все настраиваемые функции. См. также -mtune-ctrl=feature-list и -mdump-tune-features.
-
-mcld -
Этот параметр указывает GCC помещать инструкцию
cldв пролог функций, использующих строковые инструкции. Строковые инструкции используют флаг DF для выбора режима автоинкремента или автодекремента. Хотя ABI предписывает сбрасывать флаг DF при входе в функцию, некоторые операционные системы нарушают это требование и не сбрасывают флаг DF в обработчиках исключений. Обработчик исключения может быть вызван с установленным флагом DF, что приводит к выбору неверного направления при использовании строковых инструкций. Этот параметр можно включить по умолчанию для 32-разрядных целевых платформ x86, настроив GCC с помощью параметра конфигурации --enable-cld. В этом случае генерацию инструкцийcldможно отключить параметром компилятора -mno-cld. -
-mvzeroupper -
Этот параметр указывает GCC генерировать инструкцию
vzeroupperперед передачей управления за пределы функции, чтобы уменьшить штраф за переход от AVX к SSE и удалить ненужные встроенные функцииzeroupper. -
-mprefer-avx128 -
Этот параметр указывает GCC использовать векторизаторе 128-разрядные инструкции AVX вместо 256-разрядных.
-
-mprefer-vector-width=opt -
Этот параметр указывает GCC использовать в инструкциях векторную ширину opt бит вместо значения по умолчанию для выбранной платформы.
-
-mpartial-vector-fp-math -
Этот параметр позволяет GCC генерировать операции с плавающей точкой, которые могут изменять набор флагов состояния плавающей точки для частичных векторов, элементы которых находятся в младшей части 128-разрядного регистра SSE. Если не указан параметр -fno-trapping-math, компилятор гарантирует корректное поведение, обнуляя неиспользуемую старшую часть векторного регистра во всех входных операндах. Обратите внимание, что при использовании встроенных функций или встраиваемого ассемблерного кода с аргументами-частичными векторами значения NaN, денормализованные или недопустимые значения могут попасть в старшую часть вектора, что может привести к проблемам с производительностью при включённом параметре -fno-trapping-math. Эти проблемы можно устранить вручную, обнулив старшую часть регистра аргумента-частичного вектора, или использовать -mdaz-ftz, чтобы установить флаг denormals-are-zero (DAZ) в регистре MXCSR.
Этот параметр включён по умолчанию.
-
-mmove-max=bits -
Этот параметр указывает GCC задать максимальное количество бит, которое можно эффективно перемещать из памяти в память, равным bits. Допустимые значения bits: 128, 256 и 512.
-
-mstore-max=bits -
Этот параметр указывает GCC задать максимальное количество бит, которое можно эффективно записывать в память, равным bits. Допустимые значения bits: 128, 256 и 512.
- ‘none’
-
Не накладывает на GCC дополнительных ограничений, кроме заданных выбранной платформой.
- ‘128’
-
Предпочитает для инструкций векторную ширину 128 бит.
- ‘256’
-
Предпочитает для инструкций векторную ширину 256 бит.
- ‘512’
Предпочитает для инструкций векторную ширину 512 бит.
-
-mnoreturn-no-callee-saved-registers -
Этот параметр оптимизирует функции с атрибутом
noreturnили спецификатором_Noreturn: в прологе функции не сохраняются используемые в ней регистры, сохраняемые вызываемой функцией (кроме регистраBP). Этот параметр может помешать отладке вызывающей функцииnoreturnили любой функции выше по стеку вызовов, поэтому по умолчанию он отключён. -
-mcx16
-
Этот параметр позволяет GCC генерировать инструкции
CMPXCHG16Bв 64-разрядном коде для реализации операций сравнения и обмена с 128-разрядными объектами, выровненными по 16-байтовой границе. Это полезно для атомарного обновления структур данных, размер которых превышает одно машинное слово. Компилятор использует эту инструкцию для реализации Устаревших встроенных функций__syncдля атомарного доступа к памяти. Однако для встроенных функций атомарных операций с учетом модели памяти, работающих с 128-разрядными целыми числами, всегда используется вызов библиотеки. -
-msahf -
Этот параметр разрешает генерацию инструкций
SAHFв 64-разрядном коде. Ранние процессоры Intel Pentium 4 с поддержкой Intel 64, выпущенные до появления ревизии G1 Pentium 4 в декабре 2005 года, не поддерживали инструкцииLAHFиSAHF, имеющиеся в AMD64. Это инструкции загрузки и сохранения соответственно для определенных флагов состояния. В 64-разрядном режиме инструкцияSAHFиспользуется для оптимизации встроенных функцийfmod,dremиremainder; подробности см. в разделе Другие встроенные функции, предоставляемые GCC. -
-mmovbe -
Этот параметр разрешает использование инструкции
movbeдля оптимизации перестановки байтов в объектах размером четыре и восемь байт. -
-mshstk -
Параметр -mshstk включает встроенные функции теневого стека из технологии защиты потока управления x86 (CET).
-
-mcrc32 -
Этот параметр позволяет встроенным функциям
__builtin_ia32_crc32qi,__builtin_ia32_crc32hi,__builtin_ia32_crc32siи__builtin_ia32_crc32diгенерировать машинную инструкциюcrc32. -
-mmwait -
Этот параметр позволяет встроенным функциям
__builtin_ia32_monitorи__builtin_ia32_mwaitгенерировать машинные инструкцииmonitorиmwait. -
-mrecip -
Этот параметр разрешает использование инструкций
RCPSSиRSQRTSS(а также их векторизованных вариантовRCPPSиRSQRTPS) с дополнительным шагом Ньютона — Рафсона для повышения точности вместоDIVSSиSQRTSS(и их векторизованных вариантов) для аргументов с плавающей точкой одинарной точности. Эти инструкции генерируются только при включенном -funsafe-math-optimizations вместе с -ffinite-math-only и -fno-trapping-math. Обратите внимание: хотя пропускная способность этой последовательности выше, чем у нерекiproчной инструкции, точность последовательности может снизиться на величину до 2 ulp (то есть обратное значение 1.0 равно 0.99999994).Обратите внимание, что GCC уже реализует
1.0f/sqrtf(x)черезRSQRTSS(илиRSQRTPS) при использовании -ffast-math (или указанной выше комбинации параметров), поэтому -mrecip не требуется.Также обратите внимание, что GCC уже генерирует указанную выше последовательность с дополнительным шагом Ньютона — Рафсона для векторизованного деления чисел с плавающей точкой одинарной точности и векторизованного
sqrtf(x)при использовании -ffast-math (или указанной выше комбинации параметров), поэтому -mrecip не требуется. -
-mrecip=opt -
Этот параметр определяет, какие инструкции для оценки обратного значения можно использовать. opt — это список параметров, разделенных запятыми; перед параметром можно поставить ‘!’, чтобы инвертировать его значение:
- ‘all’
-
Включить все инструкции оценки.
- ‘default’
-
Включить инструкции по умолчанию; эквивалентно -mrecip.
- ‘none’
-
Отключить все инструкции оценки; эквивалентно -mno-recip.
- ‘div’
-
Включить приближение для скалярного деления.
- ‘vec-div’
-
Включить приближение для векторизованного деления.
- ‘sqrt’
-
Включить приближение для скалярного извлечения квадратного корня.
- ‘vec-sqrt’
Включить приближение для векторизованного извлечения квадратного корня.
Так, например, -mrecip=all,!sqrt включает все приближения обратного значения, кроме приближения для квадратного корня.
-
-mveclibabi=type -
Задает тип ABI для векторизации встроенных функций с использованием внешней библиотеки. Поддерживаемые значения type: ‘svml’ для библиотеки коротких векторных математических функций Intel и ‘acml’ для библиотеки математического ядра AMD. Для использования этого параметра должны быть включены -ftree-vectorize и -funsafe-math-optimizations, а во время компоновки необходимо указать библиотеку, совместимую с ABI SVML или ACML.
В настоящее время GCC генерирует вызовы
vmldExp2,vmldLn2,vmldLog102,vmldPow2,vmldTanh2,vmldTan2,vmldAtan2,vmldAtanh2,vmldCbrt2,vmldSinh2,vmldSin2,vmldAsinh2,vmldAsin2,vmldCosh2,vmldCos2,vmldAcosh2,vmldAcos2,vmlsExp4,vmlsLn4,vmlsLog104,vmlsPow4,vmlsTanh4,vmlsTan4,vmlsAtan4,vmlsAtanh4,vmlsCbrt4,vmlsSinh4,vmlsSin4,vmlsAsinh4,vmlsAsin4,vmlsCosh4,vmlsCos4,vmlsAcosh4иvmlsAcos4для соответствующего типа функции при использовании -mveclibabi=svml, а также__vrd2_sin,__vrd2_cos,__vrd2_exp,__vrd2_log,__vrd2_log2,__vrd2_log10,__vrs4_sinf,__vrs4_cosf,__vrs4_expf,__vrs4_logf,__vrs4_log2f,__vrs4_log10fи__vrs4_powfдля соответствующего типа функции при использовании -mveclibabi=acml. -
-mabi=name -
Генерировать код для указанного соглашения о вызовах. Допустимые значения: ‘sysv’ для ABI, используемого в GNU/Linux и других системах, и ‘ms’ для ABI Microsoft. По умолчанию используется ABI Microsoft при компиляции для Microsoft Windows и ABI SysV во всех остальных системах. Это поведение для отдельных функций можно контролировать с помощью атрибутов функций
ms_abiиsysv_abi. См. раздел Объявление атрибутов функций. -
-mforce-indirect-call -
Принудительно выполнять все вызовы функций косвенно. Это полезно при использовании Intel Processor Trace, который позволяет получать более точные временные данные для вызовов функций.
-
-mmanual-endbr -
Вставлять инструкцию ENDBR в точке входа функции только с помощью атрибута функции
cf_check. Это полезно в сочетании с параметром -fcf-protection=branch для управления вставкой ENDBR в точке входа функции. -
-mcet-switch -
По умолчанию инструментация CET отключена для операторов switch, использующих таблицу переходов, а отслеживание косвенных переходов отключено. Поскольку таблицы переходов хранятся в памяти только для чтения, это не приводит к прямому снижению уровня защиты. Однако если индекс таблицы переходов контролируется злоумышленником, косвенный переход может не ограничиваться CET. Этот параметр включает инструментацию CET, чтобы задействовать отслеживание косвенных переходов для операторов switch с таблицами переходов. В результате цели переходов становятся доступными для любых косвенных переходов.
-
-mcall-ms2sysv-xlogues -
Из-за различий между 64-разрядными ABI любая функция ABI Microsoft, вызывающая функцию ABI System V, должна считать регистры RSI, RDI и XMM6-15 изменяемыми. По умолчанию код сохранения и восстановления этих регистров генерируется непосредственно встраиваемым образом, что приводит к довольно длинным прологам и эпилогам. Параметр -mcall-ms2sysv-xlogues генерирует прологи и эпилоги, использующие заглушки из статической части libgcc для сохранения и восстановления регистров. Это уменьшает размер функций ценой нескольких дополнительных инструкций.
-
-mtls-dialect=type -
Генерировать код для доступа к локальному хранилищу потока с использованием соглашений ‘gnu’ или ‘gnu2’. ‘gnu’ — консервативный вариант по умолчанию; ‘gnu2’ эффективнее, но может добавить требования во время компиляции и выполнения, которые не поддерживаются во всех системах.
-
-mpush-args -mno-push-args-
Использовать операции PUSH для сохранения передаваемых параметров. Этот способ короче и обычно не медленнее способа с операциями SUB/MOV; по умолчанию он включен. В некоторых случаях отключение этого параметра может повысить производительность благодаря улучшенному планированию и уменьшению числа зависимостей.
-
-maccumulate-outgoing-args -
Если этот параметр включен, максимальный объем пространства, необходимого для передаваемых аргументов, вычисляется в прологе функции. На большинстве современных процессоров это быстрее благодаря уменьшению числа зависимостей, улучшенному планированию и сокращению использования стека, когда предпочтительная граница выравнивания стека не равна 2. Недостаток — заметное увеличение размера кода. Этот параметр подразумевает -mno-push-args.
-
-mthreads -
Поддерживать потокобезопасную обработку исключений в MinGW. Программы, которым необходима потокобезопасная обработка исключений, должны компилировать и компоновывать весь код с параметром -mthreads. При компиляции -mthreads задает -D_MT; при компоновке подключается специальная вспомогательная библиотека потоков -lmingwthrd, которая очищает данные обработки исключений для каждого потока.
-
-mms-bitfields -mno-ms-bitfields-
Включить или отключить раскладку битовых полей, совместимую с компилятором Microsoft Windows.
Если для структуры используется
packedили в ней используются битовые поля, ABI Microsoft может размещать поля структуры иначе, чем это обычно делает GCC. В частности, при передаче упакованных данных между функциями, скомпилированными GCC и штатным компилятором Microsoft (вызовом функции или в виде данных в файле), может потребоваться доступ к одному из форматов.Этот параметр включен по умолчанию для целевых платформ Microsoft Windows. Это поведение также можно контролировать локально с помощью атрибутов переменных или типов. Дополнительные сведения см. в разделах Атрибуты переменных x86 и Атрибуты типов x86.
Алгоритм раскладки структур Microsoft достаточно прост, за исключением упаковки битовых полей. Выравнивание и заполнение членов структур, а также возможность пересечения битовым полем границы единицы хранения определяются следующими правилами:
- Члены структуры хранятся последовательно в порядке объявления: первый член имеет наименьший адрес в памяти, а последний — наибольший.
- Для каждого объекта данных требуется выравнивание. Требование к выравниванию всех данных, кроме структур, объединений и массивов, равно либо размеру объекта, либо текущему размеру упаковки (заданному атрибутом
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, этот параметр по умолчанию включен.
-
-msse2avx -mno-sse2avx-
Указать ассемблеру кодировать инструкции SSE с префиксом VEX. Параметр -mavx включает это по умолчанию.
-
-mfentry -mno-fentry-
Если профилирование включено (-pg), разместить вызов счетчика профилирования перед прологом. Примечание: в настоящее время на архитектурах x86 атрибут
ms_hook_prologueнельзя использовать с -mfentry и -pg. -
-mrecord-mcount -mno-record-mcount-
Если профилирование включено (-pg), сгенерировать секцию __mcount_loc, содержащую указатели на каждый вызов профилирования. Это полезно для автоматического изменения вызовов с помощью патчей и их отключения.
-
-mnop-mcount -mno-nop-mcount-
Если профилирование включено (-pg), генерировать вызовы функций профилирования в виде инструкций NOP. Это полезно, если их следует динамически заменить позднее. Вероятно, этот параметр имеет смысл использовать только вместе с -mrecord-mcount.
-
-minstrument-return=type -
Инструментировать выход из функций, инструментированных с помощью -pg -mfentry, вызовом указанной функции. Инструментируются только настоящие возвраты, завершающиеся инструкцией ret, но не вызовы соседних функций, завершающиеся переходом. Допустимые типы: none — не выполнять инструментацию, call — генерировать вызов __return__, nop5 — генерировать 5-байтовую инструкцию nop.
-
-mrecord-return -mno-record-return-
Сгенерировать секцию __return_loc с указателями на весь код инструментации возврата.
-
-mfentry-name=name -
Задать имя символа __fentry__, вызываемого в точке входа функций -pg -mfentry.
-
-mfentry-section=name -
Задать имя секции для записи вызовов -mrecord-mcount (по умолчанию __mcount_loc).
-
-mskip-rax-setup -mno-skip-rax-setup-
При генерации кода для архитектуры x86-64 с отключенными расширениями SSE параметр -mskip-rax-setup позволяет пропустить настройку регистра RAX, если в векторных регистрах не передаются переменные аргументы.
Предупреждение: поскольку регистр RAX используется для предотвращения ненужного сохранения векторных регистров в стеке при передаче переменных аргументов, последствиями использования этого параметра могут быть напрасное расходование места в стеке вызываемыми функциями, их неправильная работа или переход по случайному адресу. В GCC 4.4 и более поздних версиях этих проблем нет независимо от значения регистра RAX.
-
-m8bit-idiv -mno-8bit-idiv-
На некоторых процессорах, например Intel Atom, деление 8-разрядных беззнаковых целых чисел выполняется намного быстрее, чем деление 32- или 64-разрядных целых чисел. Этот параметр добавляет проверку во время выполнения. Если делимое и делитель находятся в диапазоне от 0 до 255, вместо деления 32- или 64-разрядных целых чисел используется деление 8-разрядных беззнаковых целых чисел.
-
-mavx256-split-unaligned-load -mavx256-split-unaligned-store-
Разделять невыровненные загрузку и сохранение AVX размером 32 байта.
-
-mstack-protector-guard=guard -mstack-protector-guard-reg=reg-mstack-protector-guard-offset=offset-
Генерировать код защиты стека с использованием контрольного значения в расположении guard. Поддерживаются значения ‘global’ для глобального контрольного значения и ‘tls’ для контрольного значения в блоке TLS, отдельного для каждого потока (по умолчанию). Этот параметр действует только при указании -fstack-protector или -fstack-protector-all.
При выборе последнего варианта параметры -mstack-protector-guard-reg=reg и -mstack-protector-guard-offset=offset дополнительно задают, какой сегментный регистр (
%fsили%gs) использовать как базовый регистр для чтения контрольного значения и какое смещение относительно этого базового регистра использовать. По умолчанию применяются значения, заданные соответствующим ABI. -
-mgeneral-regs-only -
Генерировать код, использующий только регистры общего назначения. Это запрещает компилятору использовать регистры для операций с плавающей точкой, векторные, масочные регистры и регистры границ.
-
-mrelax-cmpxchg-loop -
При генерации цикла сравнения и обмена для устаревших встроенных функций
__syncдля атомарного доступа к памяти и встроенных функций атомарных операций с учетом модели памяти, для которых нет соответствующей аппаратной инструкции, оптимизировать работу в условиях высокой конкуренции: выполнять атомарную загрузку перед инструкциейCMPXCHGи использовать инструкциюPAUSEдля экономии энергии процессора при повторном запуске цикла. -
-mindirect-branch=choice -
Преобразовывать косвенные вызовы и переходы в соответствии с параметром choice. По умолчанию используется ‘keep’, при котором косвенные вызовы и переходы остаются без изменений. Значение ‘thunk’ преобразует косвенные вызовы и переходы в вызовы заглушки с последующим возвратом. Значение ‘thunk-inline’ преобразует косвенные вызовы и переходы во встроенные вызовы заглушки с последующим возвратом. Значение ‘thunk-extern’ преобразует косвенные вызовы и переходы во внешние вызовы заглушки с последующим возвратом, предоставленной в отдельном объектном файле. Это поведение для отдельной функции можно контролировать с помощью атрибута функции
indirect_branch. См. раздел Объявление атрибутов функций.Обратите внимание, что -mcmodel=large несовместим с -mindirect-branch=thunk и -mindirect-branch=thunk-extern, поскольку функция-заглушка может быть недоступна в большой модели кода.
Обратите внимание, что -mindirect-branch=thunk-extern совместим с -fcf-protection=branch, поскольку внешнюю заглушку можно настроить для включения проверки потока управления.
-
-mfunction-return=choice -
Преобразовывать возврат из функции в соответствии с параметром choice. По умолчанию используется ‘keep’, при котором возврат из функции остается без изменений. Значение ‘thunk’ преобразует возврат из функции в вызов заглушки с последующим возвратом. Значение ‘thunk-inline’ преобразует возврат из функции во встроенный вызов заглушки с последующим возвратом. Значение ‘thunk-extern’ преобразует возврат из функции во внешний вызов заглушки с последующим возвратом, предоставленной в отдельном объектном файле. Это поведение для отдельной функции можно контролировать с помощью атрибута функции
function_return. См. раздел Объявление атрибутов функций.Обратите внимание, что -mindirect-return=thunk-extern совместим с -fcf-protection=branch, поскольку внешнюю заглушку можно настроить для включения проверки потока управления.
Обратите внимание, что -mcmodel=large несовместим с -mfunction-return=thunk и -mfunction-return=thunk-extern, поскольку функция-заглушка может быть недоступна в большой модели кода.
-
-mindirect-branch-register -
Принудительно выполнять косвенные вызовы и переходы через регистр.
-
-mharden-sls=choice -
Генерировать код для защиты от спекулятивного выполнения по прямой линии (SLS) в соответствии с параметром choice. По умолчанию используется ‘none’, отключающий всю защиту от SLS. Значение ‘return’ включает защиту от SLS для возвратов из функций. Значение ‘indirect-jmp’ включает защиту от SLS для косвенных переходов. Значение ‘all’ включает всю защиту от SLS.
-
-mindirect-branch-cs-prefix -
Добавлять префикс CS к вызовам и переходам к косвенной заглушке, если цель перехода находится в регистрах r8-r15, чтобы длина инструкции вызова или перехода составляла 6 байт и во время выполнения ее можно было заменить на ‘lfence; call *%r8-r15’ или ‘lfence; jmp *%r8-r15’.
-
-mapx-inline-asm-use-gpr32 -
По умолчанию при поддержке встроенного ассемблера с APX функция EGPR отключена, чтобы предотвратить возможное возникновение недопустимых инструкций с EGPR. Чтобы использовать EGPR во встроенном ассемблере, укажите новый параметр компилятора -mapx-inline-asm-use-gpr32 и убедитесь, что инструкция поддерживает EGPR.
-
-mevex512 -mno-evex512-
Включает или отключает 512-разрядные векторы. По умолчанию параметр включен, если включен AVX512F.
На процессорах x86-64 в 64-разрядных средах, помимо перечисленных выше, поддерживаются следующие параметры ‘-m’.
-
-m32 -m64-mx32-m16-miamcu-
Генерировать код для 16-, 32- или 64-разрядной среды. Параметр -m32 задаёт для
int,longи типов указателей ширину 32 бита и генерирует код, работающий в 32-разрядном режиме.Параметр -m64 задаёт для
intширину 32 бита, а дляlongи типов указателей — 64 бита, и генерирует код для архитектуры x86-64. Только для Darwin параметр -m64 также отключает параметры -fno-pic и -mdynamic-no-pic.Параметр -mx32 задаёт для
int,longи типов указателей ширину 32 бита и генерирует код для архитектуры x86-64.Параметр -m16 аналогичен -m32, но в начале выходных данных на языке ассемблера он выводит директиву
.code16gcc, чтобы двоичный файл мог работать в 16-разрядном режиме.Параметр -miamcu генерирует код, соответствующий Intel MCU psABI. Для его использования необходимо включить параметр -m32.
-
-mno-red-zone -
Не использовать так называемую «красную зону» для кода x86-64. Использование красной зоны предписано ABI x86-64; это область размером 128 байт за указателем стека, которая не изменяется обработчиками сигналов или прерываний и поэтому может использоваться для временных данных без изменения указателя стека. Флаг -mno-red-zone отключает эту красную зону.
-
-mcmodel=small -
Генерировать код для малой модели кода: программа и её символы должны быть скомпонованы в нижних 2 ГБ адресного пространства. Указатели имеют ширину 64 бита. Программы могут компоноваться статически или динамически. Это модель кода по умолчанию.
-
-mcmodel=kernel -
Генерировать код для модели кода ядра. Ядро работает в отрицательных 2 ГБ адресного пространства. Эту модель необходимо использовать для кода ядра Linux.
-
-mcmodel=medium -
Генерировать код для средней модели: программа компонуется в нижних 2 ГБ адресного пространства. Там же размещаются небольшие символы. Символы размером больше значения -mlarge-data-threshold помещаются в секции больших данных или BSS и могут располагаться выше отметки 2 ГБ. Программы могут компоноваться статически или динамически.
-
-mcmodel=large -
Генерировать код для большой модели. Эта модель не делает никаких предположений об адресах и размерах секций.
-
-maddress-mode=long -
Генерировать код для режима длинных адресов. Поддерживается только в 64-разрядных средах и средах x32. Это режим адресации по умолчанию для 64-разрядных сред.
-
-maddress-mode=short -
Генерировать код для режима коротких адресов. Поддерживается только в 32-разрядных средах и средах x32. Это режим адресации по умолчанию для 32-разрядных сред и сред x32.
-
-mneeded -mno-needed-
Выводить свойство GNU_PROPERTY_X86_ISA_1_NEEDED для целевой системы Linux, указывающее уровень ISA микроархитектуры, необходимый для выполнения двоичного файла.
-
-mno-direct-extern-access -
Если не задан ни -fpic, ни -fPIC, всегда использовать указатель GOT для доступа к внешним символам. Если задан -fpic или -fPIC, рассматривать доступ к защищённым символам как доступ к локальным символам. По умолчанию используется -mdirect-extern-access.
Предупреждение: разделяемые библиотеки, скомпилированные с параметром -mno-direct-extern-access, и исполняемый файл, скомпилированный с параметром -mdirect-extern-access, могут быть несовместимы на уровне двоичного кода, если в разделяемых библиотеках и исполняемом файле используются защищённые символы.
-
-munroll-only-small-loops -
Управляет консервативной малой развёрткой циклов. По умолчанию включается при O2 и разворачивает циклы, содержащие менее 4 инструкций, один раз. Явное указание -f[no-]unroll-[all-]loops отключает этот флаг, чтобы избежать нежелательной для пользователя развёртки циклов.
-
-mlam=choice LAM (маскирование линейного адреса) позволяет использовать специальные биты указателя для метаданных. По умолчанию задано значение «none». При значении «u48» для метаданных можно использовать биты указателя в позициях 62:48; при значении «u57» — биты указателя в позициях 62:57.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.4.0/gcc/x86-Options.html