Spec-Zone.ru › GCC 14

3.19.54 Опции x86

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

-march=cpu-type

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

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

‘native’

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

‘x86-64’

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

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

Эти варианты для cpu-type выбирают соответствующий уровень микроархитектуры из psABI x86-64. В других 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.

‘i686’

При использовании с -march используется набор инструкций Pentium Pro, поэтому код работает на всех чипах семейства i686. При использовании с -mtune он имеет такое же значение, как ‘generic’.

‘pentium2’

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

‘pentium3’
‘pentium3m’

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

‘pentium-m’

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

‘pentium4’
‘pentium4m’

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

‘prescott’

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

‘nocona’

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

‘core2’

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

‘nehalem’

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

‘westmere’

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

‘sandybridge’

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

‘ivybridge’

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

‘haswell’

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

‘broadwell’

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

‘skylake’

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

‘bonnell’

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

‘silvermont’

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

‘goldmont’

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

‘goldmont-plus’

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

‘tremont’

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

‘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, KL, WIDEKL, AVX-VNNI, ENQCMD, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512, SM3, SM4, USER_MSR и PREFETCHI.

‘knl’

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

‘knm’

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

‘skylake-avx512’

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

‘cannonlake’

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

‘icelake-client’

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

‘icelake-server’

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

‘cascadelake’

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

‘cooperlake’

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

‘tigerlake’

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

‘sapphirerapids’

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

‘alderlake’

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

‘rocketlake’

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

‘graniterapids’

Поддержка набора инструкций процессора Intel graniterapids с 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, AVX512-FP16, AVX512BF16, AMX-FP16 и PREFETCHI.

‘graniterapids-d’

Поддержка набора инструкций процессора Intel graniterapids D с 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.

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

Поддержка набора инструкций процессора Intel Arrow Lake S с 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, 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, CLDEMOTE, 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 и PREFETCHI.

‘k6’

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

‘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-битных архитектур.)

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

Настройте тип-процессора на всё применимое к сгенерированному коду, за исключением ABI и набора доступных инструкций. Хотя выбор конкретного тип-процессора правильно настраивает вещи для этого конкретного чипа, компилятор не генерирует код, который не может работать на стандартном типе машины, если вы не используете параметр -march=тип-процессора. Например, если GCC сконфигурирован для i686-pc-linux-gnu, то -mtune=pentium4 генерирует код, настроенный для Pentium 4, но он всё ещё работает на машинах i686.

Варианты для тип-процессора такие же, как для -march. Кроме того, -mtune поддерживает 2 дополнительных варианта для тип-процессора:

‘generic’

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

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

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

‘intel’

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

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

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

-mcpu=cpu-type

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

-mfpmath=unit

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

‘387’

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

Это стандартный выбор для не-Darwin x86-32 целей.

‘sse’

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

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

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

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

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

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

-masm=dialect

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

-mno-fancy-math-387

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

-malign-double
-mno-align-double

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

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

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

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

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

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

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

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

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

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

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

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

-malign-data=type

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

-mlarge-data-threshold=threshold

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

-mrtd

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

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

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

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

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

-mregparm=num

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

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

-msseregparm

Использование согласованности передачи регистров 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-байтовое выравнивание стека, с современным кодом, который поддерживает 16-байтовое выравнивание стека для совместимости SSE. См. также атрибут force_align_arg_pointer, применимый к отдельным функциям.

-mpreferred-stack-boundary=num

Попытка выровнять границу стека по границе в 2 в степени num байт. Если -mpreferred-stack-boundary не указан, значение по умолчанию — 4 (16 байт или 128 бит).

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

-mincoming-stack-boundary=num

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

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

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

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

-mmmx
-msse
-msse2
-msse3
-mssse3
-msse4
-msse4a
-msse4.1
-msse4.2
-mavx
-mavx2
-mavx512f
-mavx512pf
-mavx512er
-mavx512cd
-mavx512vl
-mavx512bw
-mavx512dq
-mavx512ifma
-mavx512vbmi
-msha
-maes
-mpclmul
-mclflushopt
-mclwb
-mfsgsbase
-mptwrite
-mrdrnd
-mf16c
-mfma
-mpconfig
-mwbnoinvd
-mfma4
-mprfchw
-mrdpid
-mprefetchwt1
-mrdseed
-msgx
-mxop
-mlwp
-m3dnow
-m3dnowa
-mpopcnt
-mabm
-madx
-mbmi
-mbmi2
-mlzcnt
-mfxsr
-mxsave
-mxsaveopt
-mxsavec
-mxsaves
-mrtm
-mhle
-mtbm
-mmwaitx
-mclzero
-mpku
-mavx512vbmi2
-mavx512bf16
-mavx512fp16
-mgfni
-mvaes
-mwaitpkg
-mvpclmulqdq
-mavx512bitalg
-mmovdiri
-mmovdir64b
-menqcmd
-muintr
-mtsxldtrk
-mavx512vpopcntdq
-mavx512vp2intersect
-mavx5124fmaps
-mavx512vnni
-mavxvnni
-mavx5124vnniw
-mcldemote
-mserialize
-mamx-tile
-mamx-int8
-mamx-bf16
-mhreset
-mkl
-mwidekl
-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!, расширенный 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.

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

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

-mdump-tune-features

Этот параметр инструктирует GCC выводить имена функций оптимизации производительности x86 и значения параметров по умолчанию. Имена могут использоваться в -mtune-ctrl=feature-list.

-mtune-ctrl=feature-list

Этот параметр используется для тонкой настройки функций генерации кода x86. feature-list представляет собой список имён feature, разделённый запятыми. См. также -mdump-tune-features. Если указан, feature включается, если перед ним не стоит ‘^’, в противном случае он выключается. -mtune-ctrl=feature-list предназначен для разработчиков GCC. Его использование может привести к не покрытым тестированием ветвям кода и потенциально может привести к ошибкам компилятора или ошибкам во время выполнения.

-mno-default

Этот параметр инструктирует GCC отключить все настраиваемые функции. См. также -mtune-ctrl=feature-list и -mdump-tune-features.

-mcld

Этот параметр инструктирует GCC выводить инструкцию cld в прологе функций, использующих строковые инструкции. Строковые инструкции зависят от флага DF для выбора между режимом автоматического инкремента или автоматического декремента. Хотя ABI определяет, что флаг DF должен быть очищен при входе в функцию, некоторые операционные системы нарушают это требование, не очищая флаг DF в своих диспетчерах обработки исключений. Обработчик исключений может быть вызван с флагом DF, установленным, что приводит к неправильному режиму направления при использовании строковых инструкций. Этот параметр может быть включён по умолчанию для 32-битных целей x86, настроив GCC с параметром конфигурации --enable-cld. Генерация инструкций cld может быть подавлена с помощью опции компилятора -mno-cld в этом случае.

-mvzeroupper

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

-mprefer-avx128

Этот параметр инструктирует GCC использовать 128-битные инструкции AVX вместо 256-битных инструкций AVX в автоматическом векторизаторе.

-mprefer-vector-width=opt

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

-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 Control-flow Enforcement Technology (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 единиц в последнем разряде (т.е. обратная величина 1,0 равна 0,99999994).

Обратите внимание, что GCC реализует 1.0f/sqrtf(x) в терминах RSQRTSS (или RSQRTPS) уже с -ffast-math (или вышеуказанной комбинацией опций) и не нуждается в -mrecip.

Также обратите внимание, что GCC генерирует вышеуказанную последовательность с дополнительным шагом Ньютона–Рафсона для векторизованного деления с плавающей запятой одинарной точности и векторизованного sqrtf(x) уже с -ffast-math (или вышеуказанной комбинацией опций) и не нуждается в -mrecip.

-mrecip=opt

Этот параметр управляет тем, какие инструкции для оценки обратного значения могут быть использованы. opt — это список опций, разделённых запятыми, которые могут быть предваряться ‘!’ для инвертирования опции:

‘all’

Включить все инструкции оценки.

‘default’

Включить стандартные инструкции, эквивалентные -mrecip.

‘none’

Выключить все инструкции оценки, эквивалентно -mno-recip.

‘div’

Включить приближение для скалярного деления.

‘vec-div’

Включить приближение для векторизованного деления.

‘sqrt’

Включить приближение для скалярного квадратного корня.

‘vec-sqrt’

Включить приближение для векторизованного квадратного корня.

Например, -mrecip=all,!sqrt включает все приближения обратного значения, за исключением квадратного корня.

-mveclibabi=type

Указывает тип ABI для векторизации встроенных функций с помощью внешней библиотеки. Допустимые значения для type — ‘svml’ для библиотеки Intel short vector math и ‘acml’ для библиотеки AMD math core. Для использования этого параметра необходимо включить как -ftree-vectorize, так и -funsafe-math-optimizations, а также указать совместимую с 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’ для Microsoft ABI. По умолчанию используется Microsoft ABI при нацеливании на Microsoft Windows и SysV ABI на всех остальных системах. Вы можете контролировать это поведение для определённых функций, используя атрибуты функций 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 используется в структуре, или если используются битовые поля, возможно, что Microsoft ABI выстраивает структуру иначе, чем обычно делает GCC. Особенно при перемещении упакованных данных между функциями, скомпилированными с GCC и родным компилятором Microsoft (через вызов функции или как данные в файле), может потребоваться доступ к обоим форматам.

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

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

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

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

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

    Например:

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

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

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

    Например:

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

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

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

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

      Здесь t4 занимает 4 байта.

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

    Здесь t5 занимает 2 байта.

-mno-align-stringops

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

-minline-all-stringops

По умолчанию GCC встраивает строковые операции только тогда, когда место назначения известно как выровненное по крайней мере по границе 4 байта. Это позволяет большему количеству встроек и увеличивает размер кода, но может улучшить производительность кода, который зависит от быстрой memcpy и memset для коротких длин. Опция включает встраивание расширения strlen для всех выравниваний указателей.

-minline-stringops-dynamically

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

-mstringop-strategy=alg

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

‘rep_byte’
‘rep_4byte’
‘rep_8byte’

Расширение с использованием i386 rep префиксом указанного размера.

‘byte_loop’
‘loop’
‘unrolled_loop’

Расширение во вложенный цикл.

‘libcall’

Всегда использовать вызов библиотеки.

-mmemcpy-strategy=strategy

Переопределить внутренний эвристический алгоритм для принятия решения о том, следует ли встраивать __builtin_memcpy и какой алгоритм встраивания использовать, когда ожидаемый размер операции копирования известен. strategy — это список, разделённый запятыми, троек alg:max_size:dest_align. alg указывается в -mstringop-strategy, max_size определяет максимальный размер в байтах, для которого алгоритм встраивания alg разрешён. Для последней тройки max_size должно быть -1. Размер max_size троек в списке должен быть указан в порядке возрастания. Минимальный размер в байтах для alg составляет 0 для первой тройки и max_size + 1 предыдущего диапазона.

-mmemset-strategy=strategy

Опция аналогична -mmemcpy-strategy=, за исключением того, что она контролирует __builtin_memset расширение.

-momit-leaf-frame-pointer

Не сохранять указатель на фрейм в регистре для функций-листьев. Это позволяет избежать инструкций для сохранения, настройки и восстановления указателей на фреймы и делает доступным дополнительный регистр в функциях-листьях. Опция -fomit-leaf-frame-pointer удаляет указатель на фрейм для функций-листьев, что может затруднить отладку.

-mtls-direct-seg-refs
-mno-tls-direct-seg-refs

Управляет тем, могут ли переменные TLS быть обработаны со смещениями от регистра сегмента TLS (%gs для 32-битных, %fs для 64-битных), или должен быть добавлен указатель на базу потока. Является ли это допустимым, зависит от операционной системы и от того, отображает ли она сегмент для покрытия всей области TLS.

Для систем, использующих GNU C Library, значение по умолчанию — включено.

-msse2avx
-mno-sse2avx

Указать ассемблеру закодировать инструкции SSE с префиксом VEX. Опция -mavx включает это по умолчанию.

-mfentry
-mno-fentry

Если профилирование активно (-pg), поместить вызов счётчика профилирования перед прологом. Примечание: на архитектурах x86 атрибут ms_hook_prologue в настоящее время невозможен для -mfentry и -pg.

-mrecord-mcount
-mno-record-mcount

Если профилирование активно (-pg), сгенерировать секцию __mcount_loc, содержащую указатели на каждый вызов профилирования. Это полезно для автоматического исправления и исключения вызовов.

-mnop-mcount
-mno-nop-mcount

Если профилирование активно (-pg), сгенерировать вызовы функций профилирования как NOP. Это полезно, когда они должны быть заменены позднее динамически. Это, скорее всего, полезно только вместе с -mrecord-mcount.

-minstrument-return=type

Отобразить выход функции в -pg -mfentry instrumented функциях с вызовом указанной функции. Это отображает только истинные возвращения, завершающиеся 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, используется деление беззнаковых 8-битных целых чисел вместо 32/64-битного деления.

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

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

-mstack-protector-guard=guard
-mstack-protector-guard-reg=reg
-mstack-protector-guard-offset=offset

Генерировать код защиты стека с использованием канэри в 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

Для поддержки inline asm с APX, по умолчанию функция EGPR была отключена для предотвращения потенциальных инструкций с ошибкой EGPR. Чтобы использовать EGPR в inline asm, используйте новый параметр компилятора -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 генерирует код, который соответствует Intel MCU psABI. Она требует включения опции -m32.

-mno-red-zone

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

-mcmodel=small

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

-mcmodel=kernel

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

-mcmodel=medium

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

-mcmodel=large

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

-maddress-mode=long

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

-maddress-mode=short

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

-mneeded
-mno-needed

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

-mno-direct-extern-access

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

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

-munroll-only-small-loops

Управляет консервативным развёртыванием небольших циклов. По умолчанию включён в O2 и разворачивает цикл с менее чем 4 инструкциями 1 раз. Явное -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.2.0/gcc/x86-Options.html

Spec-Zone.ru

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