3.19.59 x86 Параметры ¶
Эти параметры ‘-m’ определены для семейства компьютеров x86.
-march=cpu-type-
Генерирует инструкции для типа машины cpu-type. В отличие от -mtune=cpu-type, которое просто настраивает сгенерированный код для указанного типа cpu-type, -march=cpu-type позволяет GCC генерировать код, который может вообще не выполняться на процессорах, отличных от указанного. Указание -march=cpu-type подразумевает -mtune=cpu-type, за исключением случаев, отмеченных иначе.
Варианты для cpu-type:
- ‘native’
-
Это выбирает процессор для генерации кода во время компиляции, определяя тип процессора компилятора. Использование -march=native включает все наборы инструкций, поддерживаемые локальной машиной (поэтому результат может не работать на других машинах). Использование -mtune=native генерирует код, оптимизированный для локальной машины в рамках ограничений выбранного набора инструкций.
- ‘x86-64’
-
Универсальный процессор с 64-битными расширениями.
- ‘x86-64-v2’
- ‘x86-64-v3’
- ‘x86-64-v4’
-
Эти варианты для cpu-type выбирают соответствующий уровень микроархитектуры из x86-64 psABI. В других ABIs, кроме x86-64 psABI, они выбирают те же функции процессора, что и в документации x86-64 psABI для конкретного уровня микроархитектуры.
Поскольку для этих значений cpu-type нет соответствующей настройки -mtune, использование -march с этими значениями включает общую настройку. Конкретную настройку можно включить, используя параметр -mtune=other-cpu-type со соответствующим значением other-cpu-type.
- ‘i386’
-
Оригинальный процессор Intel i386.
- ‘i486’
-
Процессор Intel i486. (Для этого чипа не реализовано планирование.)
- ‘i586’
- ‘pentium’
-
Процессор Intel Pentium без поддержки MMX.
- ‘lakemont’
-
Микроконтроллер Intel Lakemont, основанный на процессоре Intel Pentium.
- ‘pentium-mmx’
-
Процессор Intel Pentium MMX, основанный на ядре Pentium с поддержкой набора инструкций MMX.
- ‘pentiumpro’
-
Процессор Intel Pentium Pro.
- ‘i686’
-
При использовании с -march используется набор инструкций Pentium Pro, поэтому код работает на всех чипах семейства i686. При использовании с -mtune он имеет то же значение, что и ‘generic’.
- ‘pentium2’
-
Процессор Intel Pentium II, основанный на ядре Pentium Pro с поддержкой набора инструкций MMX.
- ‘pentium3’
- ‘pentium3m’
-
Процессор Intel Pentium III, основанный на ядре Pentium Pro с поддержкой наборов инструкций MMX и SSE.
- ‘pentium-m’
-
Intel Pentium M; энергоэффективная версия процессора Intel Pentium III с поддержкой наборов инструкций MMX, SSE и SSE2. Используется в ноутбуках Centrino.
- ‘pentium4’
- ‘pentium4m’
-
Процессор Intel Pentium 4 с поддержкой наборов инструкций MMX, SSE и SSE2.
- ‘prescott’
-
Улучшенная версия процессора Intel Pentium 4 с поддержкой наборов инструкций MMX, SSE, SSE2 и SSE3.
- ‘nocona’
-
Улучшенная версия процессора Intel Pentium 4 с 64-битными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2 и SSE3.
- ‘core2’
-
Процессор Intel Core 2 с 64-битными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3 и SSSE3.
- ‘nehalem’
-
Процессор Intel Nehalem с 64-битными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 и POPCNT.
- ‘westmere’
-
Процессор Intel Westmere с 64-битными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES и PCLMUL.
- ‘sandybridge’
-
Процессор Intel Sandy Bridge с 64-битными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AES и PCLMUL.
- ‘ivybridge’
-
Процессор Intel Ivy Bridge с 64-битными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AES, PCLMUL, FSGSBASE, RDRND и F16C.
- ‘haswell’
-
Процессор Intel Haswell с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2 и F16C.
- ‘broadwell’
-
Процессор Intel Broadwell с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX и PREFETCHW.
- ‘skylake’
-
Процессор Intel Skylake с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC и XSAVES.
- ‘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, AES, PREFETCHW, PCLMUL и RDRND.
- ‘goldmont’
-
Процессор Intel Goldmont с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT и FSGSBASE.
- ‘goldmont-plus’
-
Процессор Intel Goldmont Plus с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX и UMIP.
- ‘tremont’
-
Процессор Intel Tremont с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, UMIP, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, CLDEMOTE и WAITPKG.
- ‘knl’
-
Процессор Intel Knight’s Landing с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, PREFETCHWT1, AVX512F, AVX512PF, AVX512ER и AVX512CD.
- ‘knm’
-
Процессор Intel Knights Mill с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, PREFETCHWT1, AVX512F, AVX512PF, AVX512ER, AVX512CD, AVX5124VNNIW, AVX5124FMAPS и AVX512VPOPCNTDQ.
- ‘skylake-avx512’
-
Процессор Intel Skylake Server с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ и AVX512CD.
- ‘cannonlake’
-
Процессор Intel Cannonlake Server с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VBMI, AVX512IFMA, SHA и UMIP.
- ‘icelake-client’
-
Процессор Intel Icelake Client с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VBMI, AVX512IFMA, SHA, CLWB, UMIP, RDPID, GFNI, AVX512VBMI2, AVX512VPOPCNTDQ, AVX512BITALG, AVX512VNNI, VPCLMULQDQ и VAES.
- ‘icelake-server’
-
Процессор Intel Icelake Server с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VBMI, AVX512IFMA, SHA, CLWB, UMIP, RDPID, GFNI, AVX512VBMI2, AVX512VPOPCNTDQ, AVX512BITALG, AVX512VNNI, VPCLMULQDQ, VAES, PCONFIG и WBNOINVD.
- ‘cascadelake’
-
Процессор Intel Cascadelake с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ и AVX512VNNI.
- ‘cooperlake’
-
Процессор Intel Cooperlake с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VNNI и AVX512BF16.
- ‘tigerlake’
-
Процессор Intel Tigerlake с 64-битными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VBMI, AVX512IFMA, SHA, CLWB, UMIP, RDPID, GFNI, AVX512VBMI2, AVX512VPOPCNTDQ, AVX512BITALG, AVX512VNNI, VPCLMULQDQ, VAES, PCONFIG, WBNOINVD, MOVDIRI, MOVDIR64B, 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 и 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, UMIP, 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, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VBMI, AVX512IFMA, SHA, CLWB, UMIP, RDPID, GFNI, AVX512VBMI2, AVX512VPOPCNTDQ, AVX512BITALG, AVX512VNNI, VPCLMULQDQ, VAES набор инструкций.
- ‘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, которые для этой версии GCC — Haswell и Silvermont. Если вы знаете процессор, на котором будет выполняться ваш код, используйте соответствующую опцию -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 для более подробного описания.
По умолчанию для целей x86-32, не являющихся Darwin.
- ‘sse’
-
Использовать скалярные инструкции с плавающей запятой, присутствующие в наборе инструкций SSE. Этот набор инструкций поддерживается чипами Pentium III и новее, а в линейке AMD — чипами Athlon-4, Athlon XP и Athlon MP. Более ранние версии набора инструкций SSE поддерживают только арифметику одинарной точности, поэтому арифметика двойной и расширенной точности по-прежнему выполняется с использованием 387. Более поздняя версия, присутствующая только в чипах Pentium 4 и AMD x86-64, также поддерживает арифметику двойной точности.
Для компилятора x86-32 необходимо использовать переключатели -march=cpu-type, -msse или -msse2, чтобы включить расширения SSE и сделать этот параметр эффективным. Для компилятора x86-64 эти расширения включены по умолчанию.
Полученный код должен быть значительно быстрее в большинстве случаев и избежать проблем с неустойчивостью числовых вычислений, связанных с кодом 387, но может сломать некоторый существующий код, который ожидает, что временные переменные будут 80-битные.
По умолчанию для компилятора x86-64, целей Darwin x86-32 и по умолчанию для целей x86-32 с набором инструкций SSE2 при включенном -ffast-math.
- ‘sse,387’
- ‘sse+387’
- ‘both’
Попытаться использовать оба набора инструкций одновременно. Это эффективно удваивает количество доступных регистров и, на чипах с отдельными исполнительными блоками для 387 и SSE, также ресурсы выполнения. Используйте этот параметр с осторожностью, так как он все еще находится в стадии разработки, так как распределитель регистров GCC не хорошо моделирует отдельные функциональные блоки, что приводит к нестабильной производительности.
-masm=dialect-
Выводить инструкции ассемблера, используя выбранный dialect. Также влияет на то, какой диалект используется для базовых
asm(см. Основные инструкции ассемблера без операндов) и расширенныхasm(см. Расширенный ассемблер — инструкции ассемблера с операндами выражений C). Поддерживаемые варианты (в порядке диалектов) — ‘att’ или ‘intel’. По умолчанию — ‘att’. Darwin не поддерживает ‘intel’. -mieee-fp-mno-ieee-fp-
Управлять использованием IEEE сравнений с плавающей запятой компилятором. Эти сравнения правильно обрабатывают случай, когда результат сравнения не упорядочен.
-m80387-mhard-float-
Генерировать выходной код, содержащий инструкции 80387 для плавающей запятой.
-mno-80387-msoft-float-
Генерировать выходной код, содержащий вызовы библиотек для плавающей запятой.
Предупреждение: необходимые библиотеки не входят в GCC. Обычно используются средства обычного компилятора C машины, но это нельзя сделать напрямую при кросс-компиляции. Вам необходимо самостоятельно организовать предоставление соответствующих функций библиотеки для кросс-компиляции.
На машинах, где функция возвращает результаты с плавающей запятой в стеке регистра 80387, могут быть выведены некоторые инструкции с плавающей запятой, даже если используется -msoft-float.
-mno-fp-ret-in-387-
Не использовать регистры FPU для значений возврата функций.
Обычная соглашение о вызовах функций возвращает значения типов
floatиdoubleв регистре FPU, даже если FPU отсутствует. Идея в том, что операционная система должна эмулировать FPU.Параметр -mno-fp-ret-in-387 приводит к возврату таких значений в обычные регистры процессора вместо этого.
-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-битной бинарной библиотеки C. Размер 128 бит делает типlong doubleэквивалентным типу__float128. Это значение по умолчанию для 64-битной бинарной библиотеки 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 бит) включены по умолчанию; при использовании этого параметра для установки точности меньше, чем расширенная точность, процедуры в таких библиотеках могут иметь значительную потерю точности, обычно из-за так называемой «катастрофической компенсации».
-mdaz-ftz-
Флаги сброса в ноль (FTZ) и нулевые значения с плавающей запятой (DAZ) в регистре MXCSR используются для управления вычислениями с плавающей запятой.Инструкции SSE и AVX, включая скалярные и векторные инструкции, могут извлечь выгоду из включения флагов FTZ и DAZ, если указан -mdaz-ftz. Не устанавливайте флаги FTZ/DAZ, если указан -mno-daz-ftz.
-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 тип данных расширений Streaming SIMD Extension (SSE)__m128может работать неправильно, если он не выровнен по 16-байтовой границе.Для обеспечения правильного выравнивания этих значений в стеке, граница стека должна быть выровнена по границе, необходимой для любого значения, хранящегося в стеке. Кроме того, каждая функция должна быть сгенерирована таким образом, чтобы сохранять стек выровненным. Таким образом, вызов функции, скомпилированной с более высоким приоритетом выравнивания стека, из функции, скомпилированной с более низким приоритетом выравнивания стека, скорее всего, приведет к неправильному выравниванию стека. Рекомендуется, чтобы библиотеки, использующие обратные вызовы, всегда использовали значение по умолчанию.
Это дополнительное выравнивание потребляет дополнительное пространство стека и, как правило, увеличивает размер кода. Код, чувствительный к использованию пространства стека, например, встроенные системы и ядра операционных систем, может захотеть уменьшить предпочтительное выравнивание до -mpreferred-stack-boundary=2.
-mmmx-msse-msse2-msse3-mssse3-msse4-msse4a-msse4.1-msse4.2-mavx-mavx2-mavx512f-mavx512pf-mavx512er-mavx512cd-mavx512vl-mavx512bw-mavx512dq-mavx512ifma-mavx512vbmi-msha-maes-mpclmul-mclflushopt-mclwb-mfsgsbase-mptwrite-mrdrnd-mf16c-mfma-mpconfig-mwbnoinvd-mfma4-mprfchw-mrdpid-mprefetchwt1-mrdseed-msgx-mxop-mlwp-m3dnow-m3dnowa-mpopcnt-mabm-madx-mbmi-mbmi2-mlzcnt-mfxsr-mxsave-mxsaveopt-mxsavec-mxsaves-mrtm-mhle-mtbm-mmwaitx-mclzero-mpku-mavx512vbmi2-mavx512bf16-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 или расширенные наборы команд 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-бит в инструкциях вместо значения по умолчанию для выбранной платформы.
- ‘none’
-
Дополнительные ограничения для GCC не применяются, кроме тех, которые определены выбранной платформой.
- ‘128’
-
Предпочитать ширину вектора 128 бит для инструкций.
- ‘256’
-
Предпочитать ширину вектора 256 бит для инструкций.
- ‘512’
Предпочитать ширину вектора 512 бит для инструкций.
-mcx16-
Этот параметр позволяет GCC генерировать
CMPXCHG16Bинструкции в 64-битном коде для реализации операций сравнения и обмена на выровненных по 16 байтам 128-битных объектах. Это полезно для атомных обновлений структур данных, размер которых превышает один машинный слово. Компилятор использует эту инструкцию для реализации Встроенных функций__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для реализации__builtin_bswap32и__builtin_bswap64. -mshstk-
Параметр -mshstk включает встроенные функции для работы со стеком тени из технологии контроля потока x86 (CET).
-mcrc32-
Этот параметр включает встроенные функции
__builtin_ia32_crc32qi,__builtin_ia32_crc32hi,__builtin_ia32_crc32siи__builtin_ia32_crc32diдля генерации машинной инструкцииcrc32. -mmwait-
Этот параметр включает встроенные функции
__builtin_ia32_monitor, и__builtin_ia32_mwaitдля генерации машинных инструкцийmonitorиmwait. -mrecip-
Этот параметр включает использование инструкций
RCPSSиRSQRTSS(и их векторизованных вариантовRCPPSиRSQRTPS) с дополнительным шагом Ньютона-Рафсона для повышения точности вместоDIVSSиSQRTSS(и их векторизованных вариантов) для одноточных аргументов с плавающей точкой. Эти инструкции генерируются только при включении -funsafe-math-optimizations вместе с -ffinite-math-only и -fno-trapping-math. Обратите внимание, что, хотя производительность последовательности выше, чем производительность необратной инструкции, точность последовательности может быть уменьшена до 2 ulp (т.е. обратная величина 1.0 равна 0.99999994).Обратите внимание, что GCC уже реализует
1.0f/sqrtf(x)в терминахRSQRTSS(илиRSQRTPS) с -ffast-math (или указанной выше комбинацией параметров) и не требует -mrecip.Также обратите внимание, что GCC генерирует указанную выше последовательность с дополнительным шагом Ньютона-Рафсона для векторизованного деления с одинарной точностью и векторизованного
sqrtf(x)уже с -ffast-math (или указанной выше комбинацией параметров) и не требует -mrecip. -mrecip=opt-
Этот параметр управляет тем, какие инструкции приближенного вычисления обратного значения могут быть использованы. opt — это список параметров, разделенных запятыми, которые могут быть предваряться символом ‘!’ для инвертирования параметра:
- ‘all’
-
Включить все инструкции приближенного вычисления.
- ‘default’
-
Включить инструкции по умолчанию, эквивалентно -mrecip.
- ‘none’
-
Отключить все инструкции приближенного вычисления, эквивалентно -mno-recip.
- ‘div’
-
Включить приближение для скалярного деления.
- ‘vec-div’
-
Включить приближение для векторизованного деления.
- ‘sqrt’
-
Включить приближение для скалярного квадратного корня.
- ‘vec-sqrt’
Включить приближение для векторизованного квадратного корня.
Например, -mrecip=all,!sqrt включает все приближения обратного значения, за исключением квадратного корня.
-mveclibabi=type-
Указывает тип ABI для использования при векторизации встроенных функций с использованием внешней библиотеки. Допустимые значения для type — ‘svml’ для библиотеки коротких векторных математических функций Intel и ‘acml’ для библиотеки математических ядер AMD. Для использования этого параметра необходимо включить -ftree-vectorize и -funsafe-math-optimizations, а также библиотеку, совместимую с ABI SVML или ACML, должна быть указана при линковке.
В настоящее время GCC генерирует вызовы к
vmldExp2,vmldLn2,vmldLog102,vmldPow2,vmldTanh2,vmldTan2,vmldAtan2,vmldAtanh2,vmldCbrt2,vmldSinh2,vmldSin2,vmldAsinh2,vmldAsin2,vmldCosh2,vmldCos2,vmldAcosh2,vmldAcos2,vmlsExp4,vmlsLn4,vmlsLog104,vmlsPow4,vmlsTanh4,vmlsTan4,vmlsAtan4,vmlsAtanh4,vmlsCbrt4,vmlsSinh4,vmlsSin4,vmlsAsinh4,vmlsAsin4,vmlsCosh4,vmlsCos4,vmlsAcosh4иvmlsAcos4для соответствующего типа функции при использовании -mveclibabi=svml, и__vrd2_sin,__vrd2_cos,__vrd2_exp,__vrd2_log,__vrd2_log2,__vrd2_log10,__vrs4_sinf,__vrs4_cosf,__vrs4_expf,__vrs4_logf,__vrs4_log2f,__vrs4_log10fи__vrs4_powfдля соответствующего типа функции при использовании -mveclibabi=acml. -mabi=name-
Генерировать код для указанного соглашения о вызовах. Допустимые значения — ‘sysv’ для ABI, используемого в GNU/Linux и других системах, и ‘ms’ для ABI Microsoft. По умолчанию используется ABI Microsoft при нацеливании на Microsoft Windows и SysV ABI во всех остальных системах. Вы можете управлять этим поведением для определенных функций, используя атрибуты функций
ms_abiиsysv_abi. См. Объявление атрибутов функций. -mforce-indirect-call-
Принудительно делать все вызовы функций косвенными. Это полезно при использовании трассировки процессора Intel, где она генерирует более точную информацию о времени выполнения для вызовов функций.
-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, но не вложенные вызовы, завершающиеся 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-
При генерации кода для 64-битной архитектуры x86 с отключёнными расширениями 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
-
Генерировать код, использующий только регистры общего назначения. Это предотвращает использование компилятором регистров с плавающей точкой, векторных, масочных и ограниченных регистров.
-mindirect-branch=choice-
Преобразовывать косвенные вызовы и переходы с помощью choice. По умолчанию значение «keep», которое оставляет косвенные вызовы и переходы без изменений. «thunk» преобразует косвенные вызовы и переходы в вызов и возврат туннеля. «thunk-inline» преобразует косвенные вызовы и переходы в встроенный вызов и возврат туннеля. «thunk-extern» преобразует косвенные вызовы и переходы во внешний вызов и возврат туннеля, предоставленный в отдельном объектном файле. Вы можете управлять этим поведением для конкретной функции, используя атрибут функции
indirect_branch. См. Определение атрибутов функций.Обратите внимание, что -mcmodel=large несовместим с -mindirect-branch=thunk и -mindirect-branch=thunk-extern, поскольку функция туннеля может быть недоступна в модели кода large.
Обратите внимание, что -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, поскольку функция туннеля может быть недоступна в модели кода large.
-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» во время выполнения.
Эти переключатели «-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 генерирует код, соответствующий Intel MCU psABI. Требуется включить опцию -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, помещаются в разделы large data или 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 микроархитектуры, необходимый для выполнения двоичного файла.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/x86-Options.html