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-битных архитектур.)
-
- ‘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 довольно прост за исключением упаковки битовых полей. Выравнивание и заполнение членов структур, а также возможность того, что битовое поле может пересекать границу единицы хранения, определяются следующими правилами:
- Члены структуры хранятся последовательно в том порядке, в котором они объявлены: первый член имеет наименьший адрес памяти, а последний член — наибольший.
- Каждый объект данных имеет требование к выравниванию. Требование к выравниванию для всех данных, кроме структур, объединений и массивов, равно либо размеру объекта, либо текущему размеру упаковки (указан с помощью атрибута
alignedили директивыpackpragma), в зависимости от того, какой меньше. Для структур, объединений и массивов требование к выравниванию — наибольшее требование к выравниванию его членов. Для каждого объекта выделяется смещение таким образом, что:offset % alignment_requirement == 0
- Смежные битовые поля упаковываются в единицу выделения 1, 2 или 4 байта, если целочисленные типы имеют одинаковый размер и если следующее битовое поле помещается в текущую единицу выделения без пересечения границы, наложенной общими требованиями к выравниванию битовых полей.
MSVC интерпретирует битовые поля нулевой длины следующим образом:
- Если битовое поле нулевой длины вставлено между двумя битовыми полями, которые обычно объединяются, то битовые поля не объединяются.
Например:
struct { unsigned long bf_1 : 12; unsigned long : 0; unsigned long bf_2 : 12; } t1;Размер
t1составляет 8 байт с битовым полем нулевой длины. Если битовое поле нулевой длины удалить, размерt1составил бы 4 байта. - Если битовое поле нулевой длины вставлено после битового поля,
foo, и выравнивание битового поля нулевой длины больше, чем члена, который следует за ним,bar, тоbarвыравнивается как тип битового поля нулевой длины.Например:
struct { char foo : 4; short : 0; char bar; } t2; struct { char foo : 4; short : 0; double bar; } t3;Для
t2,barразмещается со смещением 2, а не со смещением 1. Соответственно, размерt2равен 4. Дляt3, битовое поле нулевой длины не влияет на выравниваниеbarили, как следствие, на размер структуры.Учитывая это, важно отметить следующее:
- Если битовое поле нулевой длины следует за обычным битовым полем, тип битового поля нулевой длины может повлиять на выравнивание всей структуры. Например,
t2имеет размер 4 байта, так как битовое поле нулевой длины следует за обычным битовым полем и имеет тип short. - Даже если битовое поле нулевой длины не следует за обычным битовым полем, оно всё ещё может повлиять на выравнивание структуры:
struct { char foo : 6; long : 0; } t4;Здесь
t4занимает 4 байта.
- Если битовое поле нулевой длины следует за обычным битовым полем, тип битового поля нулевой длины может повлиять на выравнивание всей структуры. Например,
- Битовые поля нулевой длины, следующие за членами, не являющимися битовыми полями, игнорируются:
struct { char foo; long : 0; char bar; } t5;Здесь
t5занимает 2 байта.
-
-mno-align-stringops -
Не выравнивать место назначения вложенных строковых операций. Этот переключатель уменьшает размер кода и улучшает производительность в случае, если место назначения уже выровнено, но GCC об этом не знает.
-
-minline-all-stringops -
По умолчанию GCC встраивает строковые операции только тогда, когда место назначения известно как выровненное по крайней мере по границе 4 байта. Это позволяет большему количеству встроек и увеличивает размер кода, но может улучшить производительность кода, который зависит от быстрой
memcpyиmemsetдля коротких длин. Опция включает встраивание расширенияstrlenдля всех выравниваний указателей. -
-minline-stringops-dynamically -
Для строковых операций неизвестного размера используются проверки во время выполнения с встроенным кодом для небольших блоков и вызов библиотеки для больших блоков.
-
-mstringop-strategy=alg -
Переопределить внутренний эвристический алгоритм для использования определённого алгоритма для встраивания строковых операций. Разрешённые значения для alg следующие:
- ‘rep_byte’
- ‘rep_4byte’
- ‘rep_8byte’
-
Расширение с использованием i386
repпрефиксом указанного размера. - ‘byte_loop’
- ‘loop’
- ‘unrolled_loop’
-
Расширение во вложенный цикл.
- ‘libcall’
Всегда использовать вызов библиотеки.
-
-mmemcpy-strategy=strategy -
Переопределить внутренний эвристический алгоритм для принятия решения о том, следует ли встраивать
__builtin_memcpyи какой алгоритм встраивания использовать, когда ожидаемый размер операции копирования известен. strategy — это список, разделённый запятыми, троек alg:max_size:dest_align. alg указывается в -mstringop-strategy, max_size определяет максимальный размер в байтах, для которого алгоритм встраивания alg разрешён. Для последней тройки max_size должно быть-1. Размер max_size троек в списке должен быть указан в порядке возрастания. Минимальный размер в байтах для alg составляет0для первой тройки иmax_size + 1предыдущего диапазона. -
-mmemset-strategy=strategy -
Опция аналогична -mmemcpy-strategy=, за исключением того, что она контролирует
__builtin_memsetрасширение. -
-momit-leaf-frame-pointer -
Не сохранять указатель на фрейм в регистре для функций-листьев. Это позволяет избежать инструкций для сохранения, настройки и восстановления указателей на фреймы и делает доступным дополнительный регистр в функциях-листьях. Опция -fomit-leaf-frame-pointer удаляет указатель на фрейм для функций-листьев, что может затруднить отладку.
-
-mtls-direct-seg-refs -mno-tls-direct-seg-refs-
Управляет тем, могут ли переменные TLS быть обработаны со смещениями от регистра сегмента TLS (
%gsдля 32-битных,%fsдля 64-битных), или должен быть добавлен указатель на базу потока. Является ли это допустимым, зависит от операционной системы и от того, отображает ли она сегмент для покрытия всей области TLS.Для систем, использующих GNU C Library, значение по умолчанию — включено.
-
-msse2avx -mno-sse2avx-
Указать ассемблеру закодировать инструкции SSE с префиксом VEX. Опция -mavx включает это по умолчанию.
-
-mfentry -mno-fentry-
Если профилирование активно (-pg), поместить вызов счётчика профилирования перед прологом. Примечание: на архитектурах x86 атрибут
ms_hook_prologueв настоящее время невозможен для -mfentry и -pg. -
-mrecord-mcount -mno-record-mcount-
Если профилирование активно (-pg), сгенерировать секцию __mcount_loc, содержащую указатели на каждый вызов профилирования. Это полезно для автоматического исправления и исключения вызовов.
-
-mnop-mcount -mno-nop-mcount-
Если профилирование активно (-pg), сгенерировать вызовы функций профилирования как NOP. Это полезно, когда они должны быть заменены позднее динамически. Это, скорее всего, полезно только вместе с -mrecord-mcount.
-
-minstrument-return=type -
Отобразить выход функции в -pg -mfentry 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