3.19.60 Параметры 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. В других ABIs, кроме psABI x86-64, они выбирают те же функции процессора, что и в документации psABI x86-64 для конкретного уровня микроархитектуры.
Поскольку для этих значений 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.
- ‘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 Server с 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 Server с 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 Client с 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 Server с 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 и 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, AVX512VNNI и 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, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512FP16 и 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.
- ‘k6’
-
Процессор AMD K6 с поддержкой набора инструкций MMX.
- ‘k6-2’
- ‘k6-3’
-
Улучшенные версии процессора AMD K6 с поддержкой наборов инструкций MMX и 3DNow!.
- ‘athlon’
- ‘athlon-tbird’
-
Процессор AMD Athlon с поддержкой наборов инструкций MMX, 3dNOW!, расширенного 3DNow! и инструкций префечинга SSE.
- ‘athlon-4’
- ‘athlon-xp’
- ‘athlon-mp’
-
Улучшенные процессоры AMD Athlon с поддержкой наборов инструкций MMX, 3DNow!, расширенного 3DNow! и полного набора инструкций SSE.
- ‘k8’
- ‘opteron’
- ‘athlon64’
- ‘athlon-fx’
-
Процессоры на базе ядра AMD K8 с поддержкой набора инструкций x86-64, включая процессоры AMD Opteron, Athlon 64 и Athlon 64 FX. (Этот набор инструкций включает в себя MMX, SSE, SSE2, 3DNow!, расширенный 3DNow! и расширения набора инструкций 64-бит.)
- ‘k8-sse3’
- ‘opteron-sse3’
- ‘athlon64-sse3’
-
Улучшенные версии ядер AMD K8 с поддержкой набора инструкций SSE3.
- ‘amdfam10’
- ‘barcelona’
-
Процессоры на базе ядер AMD Family 10h с поддержкой набора инструкций x86-64. (Этот набор инструкций включает в себя MMX, SSE, SSE2, SSE3, SSE4A, 3DNow!, расширенный 3DNow!, ABM и расширения набора инструкций 64-бит.)
- ‘bdver1’
-
Процессоры на базе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (Этот набор инструкций включает в себя FMA4, AVX, XOP, LWP, AES, PCLMUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций 64-бит.)
- ‘bdver2’
-
Процессоры на базе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (Этот набор инструкций включает в себя BMI, TBM, F16C, FMA, FMA4, AVX, XOP, LWP, AES, PCLMUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций 64-бит.)
- ‘bdver3’
-
Процессоры на базе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (Этот набор инструкций включает в себя BMI, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, XOP, LWP, AES, PCLMUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций 64-бит.)
- ‘bdver4’
-
Процессоры на базе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (Этот набор инструкций включает в себя BMI, BMI2, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, AVX2, XOP, LWP, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций 64-бит.)
- ‘znver1’
-
Процессоры на базе ядер AMD Family 17h с поддержкой набора инструкций x86-64. (Этот набор инструкций включает в себя BMI, BMI2, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT и расширения набора инструкций 64-бит.)
- ‘znver2’
-
Процессоры на базе ядер AMD Family 17h с поддержкой набора инструкций x86-64. (Этот набор инструкций включает в себя BMI, BMI2, CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID, WBNOINVD и расширения набора инструкций 64-бит.)
- ‘znver3’
-
Процессоры на базе ядер AMD Family 19h с поддержкой набора инструкций x86-64. (Этот набор инструкций включает в себя BMI, BMI2, CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID, WBNOINVD, PKU, VPCLMULQDQ, VAES и расширения набора инструкций 64-бит.)
- ‘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. (Расписание для этого процессора не реализовано.)
- ‘geode’
Встраиваемый процессор AMD Geode с поддержкой наборов инструкций MMX и 3DNow!.
-
-mtune=cpu-type-
Настройка cpu-type для всего применимого в сгенерированном коде, за исключением ABI и набора доступных инструкций. Выбор конкретного cpu-type позволяет правильно настроить расписание для конкретного чипа, но компилятор не генерирует код, который не может работать на стандартной машине, если вы не используете опцию -march=cpu-type. Например, если GCC сконфигурирован для i686-pc-linux-gnu, то -mtune=pentium4 генерирует код, настроенный для Pentium 4, но который по-прежнему работает на машинах i686.
Выбор cpu-type такой же, как и для -march. Кроме того, -mtune поддерживает 2 дополнительных варианта cpu-type:
- ‘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
-mtune=cpu-type-
Генерация арифметики с плавающей запятой для выбранного устройства unit. Доступные варианты для unit:
- ‘387’
-
Использование стандартного сопроцессора с плавающей запятой 387, присутствующего на большинстве процессоров, и эмуляции в противном случае. Скомпилированный с этим вариантом код работает практически на всех системах. Временные результаты вычисляются с точностью 80 бит вместо точности, заданной типом, что приводит к немного отличающимся результатам по сравнению с большинством других процессоров. См. -ffloat-store для более подробного описания.
Это значение по умолчанию для целевых платформ non-Darwin x86-32.
- ‘sse’
-
Использование скалярных инструкций с плавающей запятой, присутствующих в наборе инструкций SSE. Этот набор инструкций поддерживается процессорами Pentium III и более новыми, а в линейке AMD - процессорами Athlon-4, Athlon XP и Athlon MP. Более ранние версии набора инструкций SSE поддерживают только арифметику с одинарной точностью, поэтому арифметика с двойной и расширенной точностью всё ещё выполняется с помощью 387. Более поздняя версия, присутствующая только в процессорах Pentium 4 и AMD x86-64, поддерживает также арифметику с двойной точностью.
Для компилятора x86-32 необходимо использовать переключатели -march=cpu-type, -msse или -msse2 для включения расширений SSE и активации этого варианта. Для компилятора x86-64 эти расширения включены по умолчанию.
Полученный код должен быть значительно быстрее в большинстве случаев и избежать проблем с числовой неустойчивостью кода 387, но может нарушить некоторые существующие коды, ожидающие, что временные значения будут 80-битными.
Это значение по умолчанию для компилятора x86-64, целевых платформ Darwin x86-32 и значение по умолчанию для целевых платформ x86-32 с набором инструкций SSE2, когда включен -ffast-math.
- ‘sse,387’
- ‘sse+387’
- ‘both’
Попытка одновременного использования обоих наборов инструкций. Это фактически удваивает количество доступных регистров и, на процессорах с отдельными блоками выполнения для 387 и SSE, также удваивает ресурсы выполнения. Используйте этот вариант с осторожностью, так как он всё ещё находится в стадии разработки, потому что планировщик регистров GCC не моделирует хорошо отдельные функциональные блоки, что приводит к нестабильной производительности.
-masm=dialect-
Выходные инструкции ассемблера с использованием выбранного диалекта. Также влияет на используемый диалект для базовых
asm(см. Базовый ассемблер) и расширенныхasm(см. Расширенный ассемблер). Поддерживаемые варианты (в порядке диалекта) - ‘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-
Управление выравниванием GCC переменных
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, объекты данных, размер которых больше, чем threshold, размещаются в разделе данных большого размера. Это значение должно быть одинаковым для всех объектов, связанных в двоичный файл, и по умолчанию равно 65535.
-mrtd-
Использование другого соглашения о вызовах функций, в котором функции, принимающие фиксированное количество аргументов, возвращаются с инструкцией
ret num, которая извлекает их аргументы при возврате. Это экономит одну инструкцию в вызывающей программе, так как нет необходимости извлекать аргументы там.Вы можете указать, что отдельные функции вызываются с этим набором инструкций, используя атрибут функции
stdcall. Вы также можете переопределить вариант -mrtd, используя атрибут функцииcdecl. См. Атрибуты функций.Предупреждение: это соглашение о вызовах несовместимо с обычно используемым в Unix, поэтому его нельзя использовать, если необходимо вызывать библиотеки, скомпилированные с компилятором Unix.
Также необходимо предоставить прототипы функций для всех функций, принимающих переменное количество аргументов (включая
printf); в противном случае генерируется некорректный код для вызовов этих функций.Кроме того, полученный код будет серьезно некорректным, если вы вызываете функцию с слишком многими аргументами. (Обычно дополнительные аргументы безвредно игнорируются.)
-mregparm=num-
Управление тем, сколько регистров используется для передачи целочисленных аргументов. По умолчанию регистры для передачи аргументов не используются, и может использоваться не более 3 регистров. Вы можете контролировать это поведение для конкретной функции, используя атрибут функции
regparm. См. Атрибуты функций.Предупреждение: если вы используете этот переключатель, и num не равно нулю, все модули, включая любые библиотеки, должны быть скомпилированы с тем же значением. Это включает системные библиотеки и модули инициализации.
-msseregparm-
Использование соглашений о передаче регистров SSE для аргументов float и double и значений возврата. Вы можете контролировать это поведение для конкретной функции, используя атрибут функции
sseregparm. См. Атрибуты функций.Предупреждение: если вы используете этот переключатель, то все модули, включая любые библиотеки, должны быть скомпилированы с тем же значением. Это включает системные библиотеки и модули инициализации.
-mvect8-ret-in-mem-
Возврат 8-байтовых векторов в память вместо регистров MMX. Это значение по умолчанию в VxWorks для соответствия ABI компиляторов Sun Studio до версии 12. Только используйте этот вариант, если вам нужно сохранить совместимость с существующим кодом, созданным этими предыдущими версиями компилятора или более старыми версиями GCC.
-mpc32-mpc64-mpc80
-
Установите точность плавающей точки 80387 в 32, 64 или 80 бит. При указании -mpc32, мантиссы результатов операций с плавающей точкой округляются до 24 бит (одинарная точность); -mpc64 округляет мантиссы результатов операций с плавающей точкой до 53 бит (двойная точность), а -mpc80 округляет мантиссы результатов операций с плавающей точкой до 64 бит (расширенная двойная точность), что является значением по умолчанию. При использовании этого параметра программисту не доступны операции с плавающей точкой в большей точности без явного задания слова управления FPU.
Установка округления операций с плавающей точкой до значения меньше, чем значение по умолчанию (80 бит), может ускорить некоторые программы на 2% или более. Обратите внимание, что некоторые математические библиотеки предполагают, что операции с плавающей точкой расширенной точности (80 бит) включены по умолчанию; процедуры в таких библиотеках могут иметь значительную потерю точности, как правило, из-за так называемого «катастрофического сокращения», когда этот параметр используется для установки точности ниже расширенной точности.
-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 байт. Поскольку x86-64 ABI требует выравнивания стека в 16 байт, это несовместимо с ABI и предназначено для использования в контролируемой среде, где пространство стека является важным ограничением. Этот параметр приводит к неправильному коду, когда вызываются функции, скомпилированные с выравниванием стека в 16 байт (например, функции из стандартной библиотеки), с невыровненным стеком. В этом случае инструкции SSE могут привести к ловушкам невыровненного доступа к памяти. Кроме того, аргументы переменных обрабатываются неправильно для объектов с выравниванием 16 байт (включая x87 long double и __int128), что приводит к неправильным результатам. Вы должны скомпилировать все модули с -mpreferred-stack-boundary=3, включая любые библиотеки. Это включает системные библиотеки и стартовые модули.
-mincoming-stack-boundary=num-
Предполагается, что входящий стек выровнен по границе в 2 в степени num байт. Если -mincoming-stack-boundary не указан, используется значение, указанное параметром -mpreferred-stack-boundary.
На Pentium и Pentium Pro,
doubleиlong doubleзначения должны быть выровнены по границе 8 байт (см. -malign-double), иначе это приведет к значительным потерям производительности во время выполнения. На Pentium III тип данных расширения потоковой обработки 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-
Эти переключатели позволяют использовать инструкции в наборах команд MMX, SSE, SSE2, SSE3, SSSE3, SSE4, SSE4A, SSE4.1, SSE4.2, AVX, AVX2, AVX512F, AVX512PF, 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, AVX512FP16 или расширенные наборы команд 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 бит в инструкциях вместо значения по умолчанию на выбранной платформе.
-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 бит для инструкций.
-mcx16-
Этот параметр позволяет GCC генерировать
CMPXCHG16Bинструкции в 64-битном коде для реализации операций сравнения и обмена на выровненные по 16 байтам объекты размером 128 бит. Это полезно для атомарных обновлений структур данных, превышающих размер одного машинного слова. Компилятор использует эту инструкцию для реализации __sync Builtins. Однако для __atomic Builtins, работающих с 128-битными целыми числами, всегда используется вызов библиотечной функции. -msahf-
Этот параметр позволяет генерировать
SAHFинструкции в 64-битном коде. Ранние процессоры Intel Pentium 4 с поддержкой Intel 64, до появления Pentium 4 G1 в декабре 2005 года, не имели инструкцийLAHFиSAHF, которые поддерживаются AMD64. Это инструкции загрузки и сохранения для определённых флагов состояния. В 64-битном режиме инструкцияSAHFиспользуется для оптимизацииfmod,drem, иremainderвстроенных функций; см. Другие встроенные функции для получения подробностей. -mmovbe-
Этот параметр позволяет использовать инструкцию
movbeдля реализации__builtin_bswap32и__builtin_bswap64. -mshstk-
Параметр -mshstk активирует встроенные функции теневого стека из технологии x86 Control-flow Enforcement (CET).
-mcrc32-
Этот параметр активирует встроенные функции
__builtin_ia32_crc32qi,__builtin_ia32_crc32hi,__builtin_ia32_crc32siи__builtin_ia32_crc32diдля генерации машинной инструкцииcrc32. -mmwait-
Этот параметр активирует встроенные функции
__builtin_ia32_monitor, и__builtin_ia32_mwaitдля генерации машинных инструкцийmonitorиmwait. -mrecip-
Этот параметр включает использование инструкций
RCPSSиRSQRTSS(и их векторизованных вариантовRCPPSиRSQRTPS) с дополнительным шагом Ньютона-Рафсона для повышения точности вместоDIVSSиSQRTSS(и их векторизованных вариантов) для аргументов с плавающей точкой одинарной точности. Эти инструкции генерируются только при включении -funsafe-math-optimizations вместе с -ffinite-math-only и -fno-trapping-math. Обратите внимание, что, хотя пропускная способность последовательности выше, чем пропускная способность необратной инструкции, точность последовательности может быть снижена до 2 ulp (т.е. обратное значение 1.0 равно 0.99999994).Обратите внимание, что GCC реализует
1.0f/sqrtf(x)в терминахRSQRTSS(илиRSQRTPS) уже с -ffast-math (или указанной комбинацией опций) и не нуждается в -mrecip.Также обратите внимание, что GCC генерирует вышеуказанную последовательность с дополнительным шагом Ньютона-Рафсона для векторизованного деления с плавающей запятой одинарной точности и векторизованного
sqrtf(x)уже с -ffast-math (или указанной комбинацией опций) и не нуждается в -mrecip. -mrecip=opt-
Этот параметр управляет тем, какие инструкции оценки обратных величин могут использоваться. opt — это список опций, разделённых запятыми, которые могут предваряться символом ‘!’ для инвертирования опции:
- ‘all’
-
Включить все инструкции оценки.
- ‘default’
-
Включить стандартные инструкции, эквивалентно -mrecip.
- ‘none’
-
Отключить все инструкции оценки, эквивалентно -mno-recip.
- ‘div’
-
Включить приближение для скалярного деления.
- ‘vec-div’
-
Включить приближение для векторизованного деления.
- ‘sqrt’
-
Включить приближение для скалярного квадратного корня.
- ‘vec-sqrt’
Включить приближение для векторизованного квадратного корня.
Например, -mrecip=all,!sqrt включает все приближения обратных величин, за исключением квадратного корня.
-mveclibabi=type-
Указывает тип ABI для использования при векторизации встроенных функций с помощью внешней библиотеки. Поддерживаемые значения для type — ‘svml’ для библиотеки Intel short vector math и ‘acml’ для библиотеки AMD math core. Для использования этого параметра необходимо включить как -ftree-vectorize, так и -funsafe-math-optimizations, а совместимую с SVML или ACML ABI библиотеку необходимо указать при компоновке.
В настоящее время GCC генерирует вызовы к
vmldExp2,vmldLn2,vmldLog102,vmldPow2,vmldTanh2,vmldTan2,vmldAtan2,vmldAtanh2,vmldCbrt2,vmldSinh2,vmldSin2,vmldAsinh2,vmldAsin2,vmldCosh2,vmldCos2,vmldAcosh2,vmldAcos2,vmlsExp4,vmlsLn4,vmlsLog104,vmlsPow4,vmlsTanh4,vmlsTan4,vmlsAtan4,vmlsAtanh4,vmlsCbrt4,vmlsSinh4,vmlsSin4,vmlsAsinh4,vmlsAsin4,vmlsCosh4,vmlsCos4,vmlsAcosh4иvmlsAcos4для соответствующего типа функции при использовании -mveclibabi=svml, и__vrd2_sin,__vrd2_cos,__vrd2_exp,__vrd2_log,__vrd2_log2,__vrd2_log10,__vrs4_sinf,__vrs4_cosf,__vrs4_expf,__vrs4_logf,__vrs4_log2f,__vrs4_log10fи__vrs4_powfдля соответствующего типа функции при использовании -mveclibabi=acml. -mabi=name-
Генерировать код для указанной соглашения вызова. Допустимые значения — ‘sysv’ для ABI, используемой в GNU/Linux и других системах, и ‘ms’ для ABI Microsoft. По умолчанию используется ABI Microsoft при нацеливании на Microsoft Windows и ABI SysV во всех остальных системах. Вы можете управлять этим поведением для отдельных функций с помощью атрибутов функций
ms_abiиsysv_abi. См. Атрибуты функций. -mforce-indirect-call-
Принудительно сделать все вызовы функциям косвенными. Это полезно при использовании Intel Processor Trace, где он генерирует более точную информацию о времени выполнения для вызовов функций.
-mmanual-endbr-
Вставлять инструкцию ENDBR только при входе в функцию с помощью атрибута функции
cf_check. Это полезно при использовании параметра -fcf-protection=branch для управления вставкой ENDBR при входе в функцию. -mcall-ms2sysv-xlogues-
Из-за различий в 64-битных ABI, любая функция ABI Microsoft, которая вызывает функцию ABI System V, должна учитывать RSI, RDI и XMM6-15 как регистры, подверженные изменениям. По умолчанию код сохранения и восстановления этих регистров генерируется непосредственно, что приводит к достаточно длинным преамбулам и постфиксам. Использование -mcall-ms2sysv-xlogues генерирует преамбулы и постфиксы, использующие подпрограммы в статической части libgcc для выполнения этих сохранений и восстановлений, что уменьшает размер функции за счёт нескольких дополнительных инструкций.
-mtls-dialect=type-
Генерировать код для доступа к локальному хранилищу потока, используя соглашения ‘gnu’ или ‘gnu2’. ‘gnu’ — консервативный параметр по умолчанию; ‘gnu2’ более эффективен, но может добавить требования компиляции и выполнения, которые не могут быть выполнены на всех системах.
-mpush-args-mno-push-args-
Использовать операции PUSH для хранения выходных параметров. Этот метод короче и обычно так же быстр, как метод, использующий операции SUB/MOV, и включён по умолчанию. В некоторых случаях его отключение может улучшить производительность за счёт улучшенного планирования и уменьшения зависимостей.
-maccumulate-outgoing-args-
При включении, максимальный объём памяти, необходимый для выходных аргументов, вычисляется в преамбуле функции. Это быстрее на большинстве современных процессоров из-за уменьшения зависимостей, улучшенного планирования и уменьшения использования стека, когда предпочтительная граница стека не равна 2. Недостатком является заметное увеличение размера кода. Этот переключатель подразумевает -mno-push-args.
-mthreads-
Поддержка безопасной для потоков обработки исключений в MinGW. Программы, которые полагаются на безопасную для потоков обработку исключений, должны скомпилировать и связать весь код с параметром -mthreads. При компиляции -mthreads определяет -D_MT; при компоновке он связывает специальную библиотеку помощников потоков -lmingwthrd, которая очищает данные обработки исключений для каждого потока.
-mms-bitfields-mno-ms-bitfields
-
Включить/отключить расположение битовых полей, совместимое с родным компилятором Microsoft Windows.
Если
packedиспользуется в структуре, или если используются битовые поля, может оказаться, что Microsoft ABI располагает структуру по-другому, чем обычно делает GCC. Особенно при перемещении упакованных данных между функциями, скомпилированными с GCC и родным компилятором Microsoft (либо через вызов функции, либо как данные в файле), может потребоваться доступ к обоим форматам.Этот параметр включён по умолчанию для целевых систем Microsoft Windows. Это поведение также может контролироваться локально с помощью атрибутов переменных или типов. Для получения дополнительной информации см. Атрибуты переменных x86 и Атрибуты типов x86.
Алгоритм расположения структуры Microsoft довольно прост, за исключением упаковки битовых полей. Выравнивание и отступы членов структур, а также может ли битовое поле пересекать границу единицы хранения, определяются следующими правилами:
- Члены структуры хранятся последовательно в том порядке, в котором они объявлены: первый член имеет самый низкий адрес памяти, а последний — самый высокий.
- Каждый объект данных имеет требования к выравниванию. Требование к выравниванию для всех данных, кроме структур, объединений и массивов, равно либо размеру объекта, либо текущему размеру упаковки (указанному с помощью атрибута
alignedили директивыpackpragma), что меньше. Для структур, объединений и массивов требование к выравниванию — это наибольшее требование к выравниванию его членов. Каждый объект выделяется смещение таким образом, чтобы:offset % alignment_requirement == 0
- Соседние битовые поля упаковываются в один, два или четыре байта, если целочисленные типы имеют одинаковый размер и если следующее битовое поле помещается в текущую единицу размещения без пересечения границы, наложенной общими требованиями к выравниванию битовых полей.
MSVC интерпретирует битовые поля нулевой длины следующим образом:
- Если битовое поле нулевой длины вставлено между двумя битовыми полями, которые обычно объединяются, битовые поля не объединяются.
Например:
struct { unsigned long bf_1 : 12; unsigned long : 0; unsigned long bf_2 : 12; } t1;Размер
t1составляет 8 байт с нулевым битовым полем. Если нулевое битовое поле удалить, размерt1будет 4 байта. - Если битовое поле нулевой длины вставлено после битового поля,
foo, и выравнивание битового поля нулевой длины больше, чем следующего члена,bar,barвыравнивается как тип битового поля нулевой длины.Например:
struct { char foo : 4; short : 0; char bar; } t2; struct { char foo : 4; short : 0; double bar; } t3;Для
t2,barразмещается со смещением 2, а не со смещением 1. Соответственно, размерt2равен 4. Дляt3, битовое поле нулевой длины не влияет на выравниваниеbarили, как следствие, размер структуры.Учитывая это, важно отметить следующее:
- Если битовое поле нулевой длины следует за обычным битовым полем, тип битового поля нулевой длины может повлиять на выравнивание всей структуры. Например,
t2имеет размер 4 байта, так как битовое поле нулевой длины следует за обычным битовым полем и имеет тип short. - Даже если битовое поле нулевой длины не следует за обычным битовым полем, оно все равно может повлиять на выравнивание структуры:
struct { char foo : 6; long : 0; } t4;Здесь
t4занимает 4 байта.
- Если битовое поле нулевой длины следует за обычным битовым полем, тип битового поля нулевой длины может повлиять на выравнивание всей структуры. Например,
- Битовые поля нулевой длины, следующие за членами, не являющимися битовыми полями, игнорируются:
struct { char foo; long : 0; char bar; } t5;Здесь
t5занимает 2 байта.
-mno-align-stringops-
Не выравнивать назначения встроенных строковых операций. Этот переключатель уменьшает размер кода и улучшает производительность в случае, если назначение уже выровнено, но GCC об этом не знает.
-minline-all-stringops-
По умолчанию GCC встраивает строковые операции только тогда, когда известно, что назначение выровнено как минимум до границы в 4 байта. Это позволяет увеличить встраивание и увеличить размер кода, но может улучшить производительность кода, зависящего от быстрых
memcpyиmemsetдля коротких длин. Параметр позволяет включить встроенное расширениеstrlenдля всех выравниваний указателей. -minline-stringops-dynamically-
Для строковых операций неизвестного размера используйте проверки во время выполнения с встроенным кодом для небольших блоков и вызов библиотеки для больших блоков.
-mstringop-strategy=alg-
Переопределить внутреннюю эвристику для выбора конкретного алгоритма, используемого для встраивания строковых операций. Допустимые значения для alg:
- ‘rep_byte’
- ‘rep_4byte’
- ‘rep_8byte’
-
Расширить с использованием i386
repпрефикса указанного размера. - ‘byte_loop’
- ‘loop’
- ‘unrolled_loop’
-
Расширить в цикл вставки.
- ‘libcall’
Всегда использовать вызов библиотеки.
-mmemcpy-strategy=strategy-
Переопределить внутреннюю эвристику для принятия решения о том, нужно ли встраивать
__builtin_memcpyи какой алгоритм вставки использовать, когда известен ожидаемый размер операции копирования. strategy — это список через запятые троек alg:max_size:dest_align. alg указан в -mstringop-strategy, max_size указывает максимальный размер в байтах, для которого алгоритм вставки alg разрешён. Для последней тройки max_size должно быть-1. max_size троек в списке должны быть указаны в порядке возрастания. Минимальный размер в байтах для alg составляет0для первой тройки иmax_size + 1предыдущего диапазона. -mmemset-strategy=strategy-
Параметр аналогичен -mmemcpy-strategy=, за исключением того, что он управляет
__builtin_memsetрасширением. -momit-leaf-frame-pointer-
Не сохранять указатель на кадр в регистре для функций-листьев. Это избегает инструкций для сохранения, настройки и восстановления указателей на кадры и делает доступным дополнительный регистр в функциях-листьях. Параметр -fomit-leaf-frame-pointer удаляет указатель на кадр для функций-листьев, что может затруднить отладку.
-mtls-direct-seg-refs-mno-tls-direct-seg-refs-
Управляет тем, могут ли переменные TLS обращаться к смещениям из регистра сегмента TLS (
%gsдля 32-разрядных,%fsдля 64-разрядных систем), или необходимо добавлять указатель на базу потока. Валидность этого зависит от операционной системы и от того, отображает ли она сегмент, покрывающий всю область TLS.Для систем, использующих GNU C Library, значение по умолчанию — включено.
-msse2avx-mno-sse2avx-
Указать ассемблеру кодировать инструкции SSE с префиксом VEX. Параметр -mavx включает это по умолчанию.
-mfentry-mno-fentry-
Если включено профилирование (-pg), поместить вызов счётчика профилирования перед прологом. Примечание: в архитектурах x86 в настоящее время атрибут
ms_hook_prologueневозможен для -mfentry и -pg. -mrecord-mcount-mno-record-mcount-
Если включено профилирование (-pg), сгенерировать раздел __mcount_loc, содержащий указатели на каждый вызов профилирования. Это полезно для автоматической подмены и удаления вызовов.
-mnop-mcount-mno-nop-mcount-
Если включено профилирование (-pg), сгенерировать вызовы функций профилирования как NOP. Это полезно, когда они должны быть подменены позднее динамически. Скорее всего, это полезно только вместе с -mrecord-mcount.
-minstrument-return=type-
Инструментировать выход из функции в -pg -mfentry функций с вызовом указанной функции. Это инструментирует только истинные возвраты, заканчивающиеся ret, а не вложенные вызовы, заканчивающиеся переходом. Допустимые типы: 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
-
Генерация кода защиты стека с использованием canarie по адресу guard. Поддерживаемые места расположения — ‘global’ для глобального canarie или ‘tls’ для canarie на поток в блоке TLS (по умолчанию). Этот параметр действует только при указании -fstack-protector или -fstack-protector-all.
При последнем выборе параметры -mstack-protector-guard-reg=reg и -mstack-protector-guard-offset=offset дополнительно указывают, какой сегментный регистр (
%fsили%gs) использовать в качестве базового регистра для чтения canarie, и с каким смещением от этого базового регистра. По умолчанию используется значение, указанное в соответствующем ABI. -mgeneral-regs-only-
Генерировать код, использующий только регистры общего назначения. Это предотвращает использование компилятором регистров с плавающей точкой, векторных, маски и ограничений.
-mrelax-cmpxchg-loop-
Расслабить цикл cmpxchg, выпустив раннее чтение и сравнение перед cmpxchg, выполнить паузу, если загруженное значение не ожидалось. Это уменьшает чрезмерную перезагрузку кэша, когда это необходимо, и работает для всех встроенных атомарных логических операций fetch, которые генерируют цикл сравнения и обмена.
-mindirect-branch=choice-
Преобразовать косвенный вызов и переход с choice. По умолчанию — ‘keep’, что сохраняет косвенный вызов и переход без изменений. ‘thunk’ преобразует косвенный вызов и переход в вызов и возврат thunk. ‘thunk-inline’ преобразует косвенный вызов и переход в встроенный вызов и возврат thunk. ‘thunk-extern’ преобразует косвенный вызов и переход во внешний вызов и возврат thunk, предоставленный в отдельном объектом файле. Вы можете контролировать это поведение для конкретной функции, используя атрибут функции
indirect_branch. См. Атрибуты функций.Обратите внимание, что -mcmodel=large несовместим с -mindirect-branch=thunk и -mindirect-branch=thunk-extern, так как функция thunk может быть недоступна в модели кода large.
Обратите внимание, что -mindirect-branch=thunk-extern совместим с -fcf-protection=branch, так как внешний thunk может быть настроен на включение проверки потока управления.
-mfunction-return=choice-
Преобразовать возврат функции с choice. По умолчанию — ‘keep’, что сохраняет возврат функции без изменений. ‘thunk’ преобразует возврат функции в вызов и возврат thunk. ‘thunk-inline’ преобразует возврат функции во встроенный вызов и возврат thunk. ‘thunk-extern’ преобразует возврат функции во внешний вызов и возврат thunk, предоставленный в отдельном объектом файле. Вы можете контролировать это поведение для конкретной функции, используя атрибут функции
function_return. См. Атрибуты функций.Обратите внимание, что -mindirect-return=thunk-extern совместим с -fcf-protection=branch, так как внешний thunk может быть настроен на включение проверки потока управления.
Обратите внимание, что -mcmodel=large несовместим с -mfunction-return=thunk и -mfunction-return=thunk-extern, так как функция thunk может быть недоступна в модели кода large.
-mindirect-branch-register-
Принудительно использовать регистр для косвенного вызова и перехода.
-mharden-sls=choice-
Генерация кода для защиты от прямолинейного спекулятивного выполнения (SLS) с choice. По умолчанию — ‘none’, что отключает все усложнения SLS. ‘return’ включает усложнения SLS для возвратов функций. ‘indirect-jmp’ включает усложнения SLS для косвенных переходов. ‘all’ включает все усложнения SLS.
-mindirect-branch-cs-prefix-
Добавить префикс CS к вызову и переходу к косвенному thunk с целевым адресом перехода в регистрах r8-r15, чтобы длина инструкции вызова и перехода составляла 6 байтов, что позволит их заменить на ‘lfence; call *%r8-r15’ или ‘lfence; jmp *%r8-r15’ во время выполнения.
Эти переключатели ‘-m’ поддерживаются дополнительно на процессорах x86-64 в 64-битных средах.
-m32-m64-mx32-m16-miamcu-
Генерировать код для 16-битной, 32-битной или 64-битной среды. Параметр -m32 устанавливает
int,long, и типы указателей на 32 бита и генерирует код, который работает на любой системе i386.Параметр -m64 устанавливает
intна 32 бита, аlongи типы указателей на 64 бита и генерирует код для архитектуры x86-64. Только для Darwin параметр -m64 также отключает параметры -fno-pic и -mdynamic-no-pic.Параметр -mx32 устанавливает
int,long, и типы указателей на 32 бита и генерирует код для архитектуры x86-64.Параметр -m16 такой же, как -m32, за исключением того, что он выводит директиву ассемблера
.code16gccв начале выходных данных ассемблера, чтобы двоичный файл мог работать в 16-битном режиме.Параметр -miamcu генерирует код, соответствующий psABI Intel MCU. Он требует включения параметра -m32.
-mno-red-zone-
Не использовать так называемую «красную зону» для кода x86-64. Красная зона предписывается ABI x86-64; это область размером 128 байтов за местоположением указателя стека, которая не изменяется обработчиками сигналов или прерываний и поэтому может использоваться для временных данных без корректировки указателя стека. Флаг -mno-red-zone отключает эту красную зону.
-mcmodel=small-
Генерировать код для модели кода 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, могут быть несовместимы двоично, если защищённые символы используются в библиотеках совместно используемого кода и исполняемых файлах.
Далее: Параметры x86 Windows, Предыдущий: Параметры VxWorks, Наверх: Параметры подмодели [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/x86-Options.html