3.19.54 Опции x86
Эти опции ‘-m’ определены для семейства компьютеров x86.
-
-march=cpu-type -
Генерировать инструкции для типа машины cpu-type. В отличие от -mtune=cpu-type, которое просто настраивает сгенерированный код для указанного cpu-type, -march=cpu-type позволяет GCC генерировать код, который может вообще не работать на процессорах, отличных от указанного. Указание -march=cpu-type подразумевает -mtune=cpu-type, за исключением случаев, оговоренных отдельно.
Возможные значения для cpu-type:
- ‘native’
-
Это выбирает процессор для генерации кода во время компиляции, определяя тип процессора компилирующей машины. Использование -march=native включает все наборы инструкций, поддерживаемые локальной машиной (поэтому результат может не работать на других машинах). Использование -mtune=native генерирует код, оптимизированный для локальной машины в рамках ограничений выбранного набора инструкций.
- ‘x86-64’
-
Общий процессор с 64-разрядными расширениями.
- ‘x86-64-v2’
- ‘x86-64-v3’
- ‘x86-64-v4’
-
Эти варианты для cpu-type выбирают соответствующий уровень микроархитектуры из psABI для x86-64. В 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’
-
MCU Intel Lakemont, основанный на процессоре Intel Pentium.
- ‘pentium-mmx’
-
Процессор Intel Pentium MMX, основанный на ядре Pentium с поддержкой набора инструкций MMX.
- ‘pentiumpro’
-
Процессор Intel Pentium Pro.
- ‘i686’
-
При использовании с -march, используется набор инструкций Pentium Pro, поэтому код работает на всех чипах семейства i686. При использовании с -mtune, он имеет то же значение, что и ‘generic’.
- ‘pentium2’
-
Процессор Intel Pentium II, основанный на ядре Pentium Pro с поддержкой наборов инструкций MMX и FXSR.
- ‘pentium3’
- ‘pentium3m’
-
Процессор Intel Pentium III, основанный на ядре Pentium Pro с поддержкой наборов инструкций MMX, FXSR и SSE.
- ‘pentium-m’
-
Intel Pentium M; экономичный вариант процессора Intel Pentium III с поддержкой наборов инструкций MMX, SSE, SSE2 и FXSR. Используется в ноутбуках Centrino.
- ‘pentium4’
- ‘pentium4m’
-
Процессор Intel Pentium 4 с поддержкой наборов инструкций MMX, SSE, SSE2 и FXSR.
- ‘prescott’
-
Улучшенная версия процессора Intel Pentium 4 с поддержкой наборов инструкций MMX, SSE, SSE2, SSE3 и FXSR.
- ‘nocona’
-
Улучшенная версия процессора Intel Pentium 4 с 64-разрядными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3 и FXSR.
- ‘core2’
-
Процессор Intel Core 2 с 64-разрядными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, CX16, SAHF и FXSR.
- ‘nehalem’
-
Процессор Intel Nehalem с 64-разрядными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF и FXSR.
- ‘westmere’
-
Процессор Intel Westmere с 64-разрядными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR и PCLMUL.
- ‘sandybridge’
-
Процессор Intel Sandy Bridge с 64-разрядными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE и PCLMUL.
- ‘ivybridge’
-
Процессор Intel Ivy Bridge с 64-разрядными расширениями, поддержкой наборов инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND и F16C.
- ‘haswell’
-
Процессор Intel Haswell с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE и HLE.
- ‘broadwell’
-
Процессор Intel Broadwell с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX и PREFETCHW.
- ‘skylake’
-
Процессор Intel Skylake с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES и SGX.
- ‘bonnell’
-
Процессор Intel Bonnell с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3 и SSSE3.
- ‘silvermont’
-
Процессор Intel Silvermont с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, PCLMUL, PREFETCHW и RDRND.
- ‘goldmont’
-
Процессор Intel Goldmont с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, PCLMUL, PREFETCHW, RDRND, AES, SHA, RDSEED, XSAVE, XSAVEC, XSAVES, XSAVEOPT, CLFLUSHOPT и FSGSBASE.
- ‘goldmont-plus’
-
Процессор Intel Goldmont Plus с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, PCLMUL, PREFETCHW, RDRND, AES, SHA, RDSEED, XSAVE, XSAVEC, XSAVES, XSAVEOPT, CLFLUSHOPT, FSGSBASE, PTWRITE, RDPID и SGX.
- ‘tremont’
-
Процессор Intel Tremont с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, PCLMUL, PREFETCHW, RDRND, AES, SHA, RDSEED, XSAVE, XSAVEC, XSAVES, XSAVEOPT, CLFLUSHOPT, FSGSBASE, PTWRITE, RDPID, SGX, CLWB, GFNI-SSE, MOVDIRI, MOVDIR64B, CLDEMOTE и WAITPKG.
- ‘sierraforest’
-
Процессор Intel Sierra Forest с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, ENQCMD и UINTR.
- ‘grandridge’
-
Процессор Intel Grand Ridge с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, ENQCMD и UINTR.
- ‘knl’
-
Процессор Intel Knight’s Landing с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AVX512PF, AVX512ER, AVX512F, AVX512CD и PREFETCHWT1.
- ‘knm’
-
Процессор Intel Knights Mill с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AVX512PF, AVX512ER, AVX512F, AVX512CD и PREFETCHWT1, AVX5124VNNIW, AVX5124FMAPS и AVX512VPOPCNTDQ.
- ‘skylake-avx512’
-
Серверный процессор Intel Skylake с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ и AVX512CD.
- ‘cannonlake’
-
Серверный процессор Intel Cannonlake с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA и SHA.
- ‘icelake-client’
-
Клиентский процессор Intel Icelake с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID и AVX512VPOPCNTDQ.
- ‘icelake-server’
-
Серверный процессор Intel Icelake с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, PCONFIG, WBNOINVD и CLWB.
- ‘cascadelake’
-
Процессор Intel Cascadelake с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ и AVX512VNNI.
- ‘cooperlake’
-
Процессор Intel Cooperlake с 64-разрядными расширениями, поддержкой инструкций MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ, AVX512CD и AVX512BF16.
- ‘tigerlake’
-
Процессор Intel Tigerlake с 64-битными расширениями, поддержкой команд MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, MOVDIRI, MOVDIR64B, CLWB, и инструкций KEYLOCKER.
- ‘sapphirerapids’
-
Процессор Intel sapphirerapids с 64-битными расширениями, поддержкой команд MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, PCONFIG, WBNOINVD, CLWB, MOVDIRI, MOVDIR64B, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512-FP16 и AVX512BF16.
- ‘alderlake’
-
Процессор Intel Alderlake с 64-битными расширениями, поддержкой команд MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL и AVX-VNNI.
- ‘rocketlake’
-
Процессор Intel Rocketlake с 64-битными расширениями, поддержкой команд MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID и AVX512VPOPCNTDQ.
- ‘graniterapids’
-
Процессор Intel graniterapids с 64-битными расширениями, поддержкой команд MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, PCONFIG, WBNOINVD, CLWB, MOVDIRI, MOVDIR64B, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512-FP16, AVX512BF16, AMX-FP16 и PREFETCHI.
- ‘graniterapids-d’
-
Процессор Intel graniterapids D с 64-битными расширениями, поддержкой команд MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, PCONFIG, WBNOINVD, CLWB, MOVDIRI, MOVDIR64B, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512FP16, AVX512BF16, AMX-FP16, PREFETCHI и AMX-COMPLEX.
- ‘k6’
-
Процессор AMD K6 с поддержкой набора инструкций MMX.
- ‘k6-2’
- ‘k6-3’
-
Улучшенные версии процессоров AMD K6 с поддержкой наборов инструкций MMX и 3DNow!.
- ‘athlon’
- ‘athlon-tbird’
-
Процессор AMD Athlon с поддержкой наборов инструкций MMX, 3DNow!, расширенного 3DNow! и инструкций prefetch SSE.
- ‘athlon-4’
- ‘athlon-xp’
- ‘athlon-mp’
-
Улучшенные процессоры AMD Athlon с поддержкой наборов инструкций MMX, 3DNow!, расширенного 3DNow! и полного набора инструкций SSE.
- ‘k8’
- ‘opteron’
- ‘athlon64’
- ‘athlon-fx’
-
Процессоры на базе ядра AMD K8 с поддержкой набора инструкций x86-64, включая AMD Opteron, Athlon 64 и Athlon 64 FX. (Этот набор включает MMX, SSE, SSE2, 3DNow!, расширенный 3DNow! и расширения набора инструкций для 64-битности.)
- ‘k8-sse3’
- ‘opteron-sse3’
- ‘athlon64-sse3’
-
Улучшенные версии ядер AMD K8 с поддержкой набора инструкций SSE3.
- ‘amdfam10’
- ‘barcelona’
-
Процессоры на базе ядер AMD Family 10h с поддержкой набора инструкций x86-64. (Этот набор включает MMX, SSE, SSE2, SSE3, SSE4A, 3DNow!, расширенный 3DNow!, ABM и расширения набора инструкций для 64-битности.)
- ‘bdver1’
-
Процессоры на базе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (Этот набор включает FMA4, AVX, XOP, LWP, AES, PCLMUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций для 64-битности.)
- ‘bdver2’
-
Процессоры на базе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (Этот набор включает BMI, TBM, F16C, FMA, FMA4, AVX, XOP, LWP, AES, PCLMUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций для 64-битности.)
- ‘bdver3’
-
Процессоры на базе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (Этот набор включает BMI, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, XOP, LWP, AES, PCLMUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций для 64-битности.)
- ‘bdver4’
-
Процессоры на базе ядер AMD Family 15h с поддержкой набора инструкций x86-64. (Этот набор включает BMI, BMI2, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, AVX2, XOP, LWP, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и расширения набора инструкций для 64-битности.)
- ‘znver1’
-
Процессоры на базе ядер AMD Family 17h с поддержкой набора инструкций x86-64. (Этот набор включает BMI, BMI2, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT и расширения набора инструкций для 64-битности.)
- ‘znver2’
-
Процессоры на базе ядер AMD Family 17h с поддержкой набора инструкций x86-64. (Этот набор включает BMI, BMI2, CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID, WBNOINVD и расширения набора инструкций для 64-битности.)
- ‘znver3’
-
Процессоры на базе ядер AMD Family 19h с поддержкой набора инструкций x86-64. (Этот набор включает BMI, BMI2, CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID, WBNOINVD, PKU, VPCLMULQDQ, VAES и расширения набора инструкций для 64-битности.)
- ‘znver4’
-
Процессоры на базе ядер AMD Family 19h с поддержкой набора инструкций x86-64. (Этот набор включает BMI, BMI2, CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID, WBNOINVD, PKU, VPCLMULQDQ, VAES, AVX512F, AVX512DQ, AVX512IFMA, AVX512CD, AVX512BW, AVX512VL, AVX512BF16, AVX512VBMI, AVX512VBMI2, AVX512VNNI, AVX512BITALG, AVX512VPOPCNTDQ, GFNI и расширения набора инструкций для 64-битности.)
- ‘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 с поддержкой набора инструкций MMX, рассматривается так же, как i486 с дополнительной поддержкой MMX.
- ‘winchip2’
-
Процессор IDT WinChip 2 с поддержкой наборов инструкций MMX и 3DNow!, рассматривается так же, как 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 Quad Core с набором инструкций x86-64, MMX, SSE, SSE2, SSE3, SSSE3 и SSE4.1. (Для этого чипа планирование не реализовано.)
- ‘lujiazui’
-
Процессор ZHAOXIN lujiazui с набором инструкций x86-64, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, POPCNT, AES, PCLMUL, RDRND, XSAVE, XSAVEOPT, FSGSBASE, CX16, ABM, BMI, BMI2, F16C, FXSR, RDSEED.
- ‘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=generic используйте соответствующую опцию -mtune или -march. Но если вы не знаете точно, какой процессор будут иметь пользователи вашего приложения, то следует использовать эту опцию.
По мере появления новых процессоров в продаже поведение этой опции будет изменяться. Поэтому, если вы обновитесь до более новой версии GCC, генерация кода, управляемая этой опцией, изменится, отражая наиболее распространённые процессоры на момент выпуска этой версии GCC.
Нет опции -march=generic, поскольку -march указывает набор инструкций, который может использовать компилятор, а для всех процессоров нет универсального набора инструкций. В отличие от -march, -mtune указывает процессор (или, в данном случае, группу процессоров), для которого оптимизируется код.
- ‘intel’
-
Генерирует код, оптимизированный для самых современных процессоров Intel, которые для этой версии GCC являются Haswell и Silvermont. Если вы знаете процессор, на котором будет выполняться ваш код, то вместо -mtune=intel используйте соответствующую опцию -mtune или -march. Но если вы хотите, чтобы ваше приложение работало лучше на Haswell и Silvermont, то следует использовать эту опцию.
По мере появления новых процессоров Intel в продаже поведение этой опции будет изменяться. Поэтому, если вы обновитесь до более новой версии GCC, генерация кода, управляемая этой опцией, изменится, отражая самые современные процессоры Intel на момент выпуска этой версии GCC.
Нет опции -march=intel, так как -march указывает набор инструкций, который может использовать компилятор, а для всех процессоров нет общего набора инструкций. В отличие от -march, -mtune указывает процессор (или, в данном случае, группу процессоров), для которого оптимизируется код.
-
-mcpu=cpu-type -
Устаревший синоним для -mtune.
-
-mfpmath=unit -
Генерирует арифметические операции с плавающей точкой для выбранного блока unit. Варианты для unit:
- ‘387’
-
Использует стандартный сопроцессор с плавающей точкой 387, присутствующий на большинстве чипов, и эмулируется в противном случае. Код, скомпилированный с этой опцией, выполняется почти на всех платформах. Временные результаты вычисляются с точностью 80 бит вместо указанной точности типа, что приводит к немного отличающимся результатам по сравнению с большинством других чипов. Для более подробного описания см. -ffloat-store.
Это значение по умолчанию для не-Darwin x86-32 целей.
- ‘sse’
-
Использует скалярные инструкции с плавающей точкой, присутствующие в наборе инструкций SSE. Этот набор инструкций поддерживается процессорами Pentium III и новее, а в линейке AMD — процессорами Athlon-4, Athlon XP и Athlon MP. Более ранние версии набора инструкций SSE поддерживают только арифметику одинарной точности, поэтому арифметика двойной и расширенной точности по-прежнему выполняется с использованием 387. Более поздние версии, присутствующие только в процессорах Pentium 4 и AMD x86-64, также поддерживают арифметику двойной точности.
Для компилятора x86-32 необходимо использовать переключатели -march=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-
Управляет тем, выравнивает ли 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-байтовый предел путём добавления дополнительного 32-битного нуля кlong double.В компиляторе 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 бит) включены по умолчанию; подпрограммы в таких библиотеках могут столкнуться с существенной потерей точности, как правило, за счёт так называемой «катастрофической компенсации», когда эта опция используется для установки точности менее расширенной.
-
-mdaz-ftz -
Флаги сброса в ноль (FTZ) и денормалей-в-ноль (DAZ) в регистре MXCSR используются для управления вычислениями с плавающей запятой. Инструкции SSE и AVX, включая скалярные и векторные инструкции, могут выиграть от включения флагов FTZ и DAZ при указании -mdaz-ftz. Не устанавливайте флаги FTZ/DAZ, когда указано -mno-daz-ftz или -shared, -mdaz-ftz установит флаги FTZ/DAZ даже при указании -shared.
-
-mstackrealign -
Выравнивание стека при входе. На x86 опция -mstackrealign генерирует альтернативный пролог и эпилог, которые выравнивают стек во время выполнения при необходимости. Это поддерживает смешение устаревшего кода, который сохраняет выравнивание стека 4 байта, с современным кодом, который сохраняет выравнивание стека 16 байт для совместимости с SSE. См. также атрибут
force_align_arg_pointer, применимый к отдельным функциям. -
-mpreferred-stack-boundary=num -
Попытка сохранить границу стека, выровненную по границе в 2 в степени num байт. Если -mpreferred-stack-boundary не указан, значение по умолчанию равно 4 (16 байт или 128 бит).
Предупреждение: При генерации кода для архитектуры x86-64 с отключенными расширениями SSE, -mpreferred-stack-boundary=3 может использоваться для сохранения выравнивания границы стека по 8-байтовой границе. Поскольку 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 тип данных расширения потоковой обработки команд SSE (__m128) может работать неправильно, если он не выровнен по 16-байтовой границе.Чтобы обеспечить правильное выравнивание этих значений в стеке, граница стека должна быть выровнена так же, как и любое значение, хранящееся в стеке. Кроме того, каждая функция должна быть сгенерирована таким образом, чтобы сохранять стек выровненным. Таким образом, вызов функции, скомпилированной с более высоким приоритетным выравниванием стека, из функции, скомпилированной с более низким приоритетным выравниванием стека, скорее всего, выведет стек из выравнивания. Рекомендуется, чтобы библиотеки, использующие обратные вызовы, всегда использовали значение по умолчанию.
Это дополнительное выравнивание потребляет дополнительное место в стеке и, как правило, увеличивает размер кода. Код, чувствительный к использованию места в стеке, например, встроенные системы и ядра операционных систем, могут захотеть уменьшить предпочтительное выравнивание до -mpreferred-stack-boundary=2.
-
-mmmx -msse-msse2-msse3-mssse3-msse4-msse4a-msse4.1-msse4.2-mavx-mavx2-mavx512f-mavx512pf-mavx512er-mavx512cd-mavx512vl-mavx512bw-mavx512dq-mavx512ifma-mavx512vbmi-msha-maes-mpclmul-mclflushopt-mclwb-mfsgsbase-mptwrite-mrdrnd-mf16c-mfma-mpconfig-mwbnoinvd-mfma4-mprfchw-mrdpid-mprefetchwt1-mrdseed-msgx-mxop-mlwp-m3dnow-m3dnowa-mpopcnt-mabm-madx-mbmi-mbmi2-mlzcnt-mfxsr-mxsave-mxsaveopt-mxsavec-mxsaves-mrtm-mhle-mtbm-mmwaitx-mclzero-mpku-mavx512vbmi2-mavx512bf16-mavx512fp16-mgfni-mvaes
-mwaitpkg-mvpclmulqdq-mavx512bitalg-mmovdiri-mmovdir64b-menqcmd-muintr-mtsxldtrk-mavx512vpopcntdq-mavx512vp2intersect-mavx5124fmaps-mavx512vnni-mavxvnni-mavx5124vnniw-mcldemote-mserialize-mamx-tile-mamx-int8-mamx-bf16-mhreset-mkl-mwidekl-mavxifma-mavxvnniint8-mavxneconvert-mcmpccxadd-mamx-fp16-mprefetchi-mraoint-mamx-complex-
Эти переключатели позволяют использовать инструкции 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, AVX512-FP16, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AMX-FP16, PREFETCHI, RAOINT, AMX-COMPLEX или расширенные наборы инструкций. Каждый из них имеет соответствующий параметр -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-битном коде для реализации операций сравнения и обмена для 128-битных объектов с выравниванием 16 байт. Это полезно для атомных обновлений структур данных, размер которых превышает один машинный слово. Компилятор использует эту инструкцию для реализации Встроенных функций__syncдля атомного доступа к памяти. Однако для Встроенных функций для операций с атомной памятью, работающих с 128-битными целыми числами, всегда используется вызов библиотеки. -
-msahf -
Этот параметр включает генерацию инструкций
SAHFв 64-битном коде. Ранние процессоры Intel Pentium 4 с поддержкой Intel 64, до появления Pentium 4 G1 step в декабре 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 short vector math и ‘acml’ для библиотеки AMD math core. Для использования этого параметра необходимо включить как -ftree-vectorize, так и -funsafe-math-optimizations, а также указать ABI-совместимую библиотеку SVML или ACML во время компоновки.
В настоящее время GCC генерирует вызовы к
vmldExp2,vmldLn2,vmldLog102,vmldPow2,vmldTanh2,vmldTan2,vmldAtan2,vmldAtanh2,vmldCbrt2,vmldSinh2,vmldSin2,vmldAsinh2,vmldAsin2,vmldCosh2,vmldCos2,vmldAcosh2,vmldAcos2,vmlsExp4,vmlsLn4,vmlsLog104,vmlsPow4,vmlsTanh4,vmlsTan4,vmlsAtan4,vmlsAtanh4,vmlsCbrt4,vmlsSinh4,vmlsSin4,vmlsAsinh4,vmlsAsin4,vmlsCosh4,vmlsCos4,vmlsAcosh4иvmlsAcos4для соответствующего типа функции при использовании -mveclibabi=svml, и__vrd2_sin,__vrd2_cos,__vrd2_exp,__vrd2_log,__vrd2_log2,__vrd2_log10,__vrs4_sinf,__vrs4_cosf,__vrs4_expf,__vrs4_logf,__vrs4_log2f,__vrs4_log10fи__vrs4_powfдля соответствующего типа функции при использовании -mveclibabi=acml. -
-mabi=name -
Генерировать код для указанной соглашения вызова. Допустимые значения — ‘sysv’ для ABI, используемого в GNU/Linux и других системах, и ‘ms’ для ABI Microsoft. По умолчанию используется ABI Microsoft при нацеливании на Microsoft Windows и ABI SysV во всех других системах. Вы можете контролировать это поведение для конкретных функций, используя атрибуты функций
ms_abiиsysv_abi. См. Объявление атрибутов функций. -
-mforce-indirect-call -
Принудительно сделать все вызовы функций косвенными. Это полезно при использовании Intel Processor Trace, где он генерирует более точную информацию о времени выполнения для вызовов функций.
-
-mmanual-endbr -
Вставить инструкцию ENDBR только в начале функции с помощью атрибута функции
cf_check. Это полезно при использовании параметра -fcf-protection=branch для управления вставкой ENDBR в начале функции. -
-mcet-switch -
По умолчанию включена отладка CET в операторах switch, использующих таблицу переходов, и отключен отслеживающий путь косвенных ветвлений. Поскольку таблицы переходов хранятся в памяти только для чтения, это не приводит к потере функций защиты. Но если индекс таблицы переходов контролируется злоумышленником, косвенный переход может не быть ограничен CET. Этот параметр включает отладку CET, чтобы включить отслеживающий путь косвенных ветвлений для операторов switch с таблицами переходов, что приводит к достижимости целевых переходов через любые косвенные переходы.
-
-mcall-ms2sysv-xlogues -
Из-за различий в 64-разрядных ABI, любая функция Microsoft ABI, которая вызывает функцию System V ABI, должна учитывать RSI, RDI и XMM6-15 как перекрываемые. По умолчанию код для сохранения и восстановления этих регистров генерируется встроенно, что приводит к довольно длинным прологам и эпилогам. Используя -mcall-ms2sysv-xlogues, генерируются прологи и эпилоги, которые используют подпрограммы в статической части libgcc для выполнения этих сохранений и восстановлений, тем самым уменьшая размер функции за счёт нескольких дополнительных инструкций.
-
-mtls-dialect=type -
Генерировать код для доступа к локальному хранилищу потока с помощью соглашений ‘gnu’ или ‘gnu2’. ‘gnu’ — консервативный по умолчанию; ‘gnu2’ более эффективен, но может добавить требования к компиляции и выполнению, которые не могут быть выполнены на всех системах.
-
-mpush-args -mno-push-args-
Использовать операции PUSH для хранения выходных параметров. Этот метод короче и обычно так же быстр, как метод, использующий операции SUB/MOV, и включен по умолчанию. В некоторых случаях его отключение может улучшить производительность из-за улучшенного планирования и уменьшения зависимостей.
-
-maccumulate-outgoing-args -
Если включено, максимальное количество места, необходимого для выходных аргументов, вычисляется в прологе функции. Это быстрее на большинстве современных процессоров из-за уменьшения зависимостей, улучшенного планирования и уменьшения использования стека, когда предпочтительная граница стека не равна 2. Недостаток заключается в заметном увеличении размера кода. Этот переключатель подразумевает -mno-push-args.
-
-mthreads -
Поддержка безопасной для потоков обработки исключений в MinGW. Программы, которые полагаются на безопасную для потоков обработку исключений, должны компилировать и компоновать весь код с параметром -mthreads. При компиляции -mthreads определяет -D_MT; при компоновке он подключает специальную библиотеку помощника для потоков -lmingwthrd, которая очищает данные обработки исключений на уровне каждого потока.
-
-mms-bitfields -mno-ms-bitfields-
Включить/отключить макет битовых полей, совместимый с родной компилятором Microsoft Windows.
Если
packedиспользуется для структуры или если используются битовые поля, то возможно, что ABI Microsoft располагает структуру иначе, чем обычно делает GCC. В частности, при перемещении упакованных данных между функциями, скомпилированными с GCC и родной компиляцией Microsoft (как через вызов функции, так и в виде данных в файле), может потребоваться доступ к обоим форматам.Этот параметр включен по умолчанию для целей Microsoft Windows. Это поведение также может быть локально контролироваться с помощью атрибутов переменных или типов. Дополнительную информацию см. в x86 Атрибуты переменных и x86 Атрибуты типов.
Алгоритм макета структуры Microsoft довольно прост за исключением упаковки битовых полей. Выравнивание и отступы членов структур и может ли битовое поле пересекать границу единицы хранения определяются этими правилами:
- Члены структуры хранятся последовательно в том порядке, в котором они объявлены: первый член имеет самый низкий адрес памяти, а последний — самый высокий.
- Каждый объект данных имеет требование к выравниванию. Требование к выравниванию для всех данных, кроме структур, объединений и массивов, равно размеру объекта или текущему размеру упаковки (указанному атрибутом
alignedили директивойpack), в зависимости от того, что меньше. Для структур, объединений и массивов требование к выравниванию — это наибольшее требование к выравниванию их членов. Каждый объект получает смещение, такое, что:offset % alignment_requirement == 0
- Смежные битовые поля упаковываются в ту же 1-, 2- или 4-байтовую единицу выделения, если целочисленные типы имеют одинаковый размер и если следующее битовое поле помещается в текущую единицу выделения без пересечения границы, накладываемой общими требованиями к выравниванию битовых полей.
MSVC интерпретирует битовые поля нулевой длины следующим образом:
- Если битовое поле нулевой длины вставлено между двумя битовыми полями, которые обычно объединяются, битовые поля не объединяются.
Например:
struct { unsigned long bf_1 : 12; unsigned long : 0; unsigned long bf_2 : 12; } t1;Размер
t1равен 8 байтам с битовым полем нулевой длины. Если бы битовое поле нулевой длины было удалено, размерt1составлял бы 4 байта. - Если битовое поле нулевой длины вставлено после битового поля
foo, и выравнивание битового поля нулевой длины больше, чем члена, который следует за ним,bar,barвыравнивается как тип битового поля нулевой длины.Например:
struct { char foo : 4; short : 0; char bar; } t2; struct { char foo : 4; short : 0; double bar; } t3;Для
t2,barразмещается со смещением 2, а не со смещением 1. Соответственно, размерt2равен 4. Дляt3, битовое поле нулевой длины не влияет на выравниваниеbarили, как следствие, на размер структуры.Принимая это во внимание, важно отметить следующее:
- Если битовое поле нулевой длины следует за обычным битовым полем, тип битового поля нулевой длины может повлиять на выравнивание всей структуры. Например,
t2имеет размер 4 байта, так как битовое поле нулевой длины следует за обычным битовым полем и имеет тип short. - Даже если битовое поле нулевой длины не следует за обычным битовым полем, оно все равно может повлиять на выравнивание структуры:
struct { char foo : 6; long : 0; } t4;Здесь
t4занимает 4 байта.
- Если битовое поле нулевой длины следует за обычным битовым полем, тип битового поля нулевой длины может повлиять на выравнивание всей структуры. Например,
- Битовые поля нулевой длины, следующие за членами, не являющимися битовыми полями, игнорируются:
struct { char foo; long : 0; char bar; } t5;Здесь
t5занимает 2 байта.
-
-mno-align-stringops
-
Не выравнивать место назначения встроеных строковых операций. Этот переключатель уменьшает размер кода и улучшает производительность в случае, если место назначения уже выровнено, но GCC об этом не знает.
-
-minline-all-stringops -
По умолчанию GCC встраивает строковые операции только тогда, когда известно, что место назначения выровнено по крайней мере по границе 4 байт. Это позволяет большему количеству кода быть встроенным и увеличивает размер кода, но может улучшить производительность кода, который зависит от быстрых
memcpyиmemsetдля коротких длин. Этот параметр позволяет встроенное расширениеstrlenдля всех выравниваний указателей. -
-minline-stringops-dynamically -
Для строковых операций неизвестного размера используются проверки во время выполнения с встроенным кодом для небольших блоков и вызовом библиотечной функции для больших блоков.
-
-mstringop-strategy=alg -
Переопределить внутреннюю эвристику принятия решений для конкретного алгоритма, используемого для встраивания строковых операций. Допустимые значения для alg следующие:
- ‘rep_byte’
- ‘rep_4byte’
- ‘rep_8byte’
-
Расширение с использованием i386
repпрефикса указанного размера. - ‘byte_loop’
- ‘loop’
- ‘unrolled_loop’
-
Расширение в цикл вставки.
- ‘libcall’
Всегда использовать вызов библиотеки.
-
-mmemcpy-strategy=strategy -
Переопределить внутреннюю эвристику принятия решений, чтобы определить, следует ли
__builtin_memcpyвстраивать, и какой алгоритм встраивания использовать, когда ожидаемый размер операции копирования известен. strategy — это список, разделенный запятыми, тройки alg:max_size:dest_align. alg указан в -mstringop-strategy, max_size задает максимальный размер байта, для которого разрешен алгоритм вставки alg. Для последней тройки max_size должен быть-1. Максимальный размер max_size троек в списке должен быть указан в порядке возрастания. Минимальный размер байта для alg равен0для первой тройки иmax_size + 1предыдущего диапазона. -
-mmemset-strategy=strategy -
Этот параметр похож на -mmemcpy-strategy=, за исключением того, что он контролирует
__builtin_memsetрасширение. -
-momit-leaf-frame-pointer -
Не сохранять указатель на кадр в регистре для функций-листьев. Это позволяет избежать инструкций для сохранения, настройки и восстановления указателей на кадры и делает доступным дополнительный регистр в функциях-листьях. Параметр -fomit-leaf-frame-pointer удаляет указатель на кадр для функций-листьев, что может затруднить отладку.
-
-mtls-direct-seg-refs -mno-tls-direct-seg-refs-
Управляет тем, могут ли переменные TLS быть доступны с помощью смещений от регистра сегмента TLS (
%gsдля 32-битных,%fsдля 64-битных), или должен быть добавлен указатель на базу потока. Действительно ли это возможно, зависит от операционной системы и того, отображает ли она сегмент так, чтобы охватить всю область TLS.Для систем, использующих GNU C 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-
При генерации кода для архитектуры x86-64 с отключенными расширениями SSE можно использовать -mskip-rax-setup, чтобы пропустить настройку регистра RAX, когда нет аргументов переменной, передаваемых в векторных регистрах.
Предупреждение: Поскольку регистр RAX используется для избежания ненужного сохранения векторных регистров в стеке при передаче переменных аргументов, последствия использования этого параметра заключаются в том, что вызывающие функции могут тратить некоторое пространство стека, вести себя непредсказуемо или переходить по случайному адресу. GCC 4.4 или более поздние версии не имеют этих проблем, независимо от значения регистра RAX.
-
-m8bit-idiv -mno-8bit-idiv-
На некоторых процессорах, таких как Intel Atom, 8-битное беззнаковое целочисленное деление значительно быстрее, чем 32-битное/64-битное целочисленное деление. Этот параметр генерирует проверку во время выполнения. Если и делимое, и делитель находятся в диапазоне от 0 до 255, используется 8-битное беззнаковое целочисленное деление вместо 32-битного/64-битного целочисленного деления.
-
-mavx256-split-unaligned-load -mavx256-split-unaligned-store-
Разделить 32-байтовое невыровненное загрузку и хранение AVX.
-
-mstack-protector-guard=guard -mstack-protector-guard-reg=reg-mstack-protector-guard-offset=offset-
Генерировать код защиты стека с помощью индикатора guard. Поддерживаются расположения ‘global’ для глобального индикатора или ‘tls’ для индикатора на поток в блоке TLS (по умолчанию). Этот параметр действует только при указании -fstack-protector или -fstack-protector-all.
В последнем случае параметры -mstack-protector-guard-reg=reg и -mstack-protector-guard-offset=offset дополнительно указывают, какой сегментный регистр (
%fsили%gs) использовать в качестве базового регистра для чтения индикатора, и с каким смещением от этого базового регистра. Значение по умолчанию для них задано в соответствующей ABI. -
-mgeneral-regs-only -
Генерировать код, использующий только регистры общего назначения. Это предотвращает использование компилятором регистров с плавающей запятой, векторных, маскирующих и ограниченных регистров.
-
-mrelax-cmpxchg-loop -
При выводе цикла compare-and-swap для Устаревших
__syncвстроенных функций для атомного доступа к памяти и Встроенных функций для операций с атомарной памятью, учитывающей модель памяти, которые не имеют собственной инструкции, оптимизируйте для сильно конкурирующего случая, выполняя атомную загрузку перед инструкциейCMPXCHG, и используйте инструкциюPAUSEдля экономии ресурсов процессора при перезапуске цикла. -
-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 может быть недоступна в модели большого кода.
Обратите внимание, что -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 может быть недоступна в модели большого кода.
-
-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 бита и генерирует код, выполняющийся в 32-битном режиме.Опция -m64 устанавливает
intна 32 бита иlongи типы указателей на 64 бита и генерирует код для архитектуры x86-64. Только для Darwin опция -m64 также отключает опции -fno-pic и -mdynamic-no-pic.Опция -mx32 устанавливает
int,long, и типы указателей на 32 бита и генерирует код для архитектуры x86-64.Опция -m16 такая же, как -m32, за исключением того, что она выводит директиву
.code16gccв начале вывода ассемблерного кода, чтобы двоичный файл мог выполняться в 16-битном режиме.Опция -miamcu генерирует код, соответствующий Intel MCU psABI. Она требует включения опции -m32.
-
-mno-red-zone -
Не использовать так называемую «красную зону» для кода x86-64. Красная зона предписывается x86-64 ABI; это 128-байтовая область за местоположением указателя стека, которая не изменяется обработчиками сигналов или прерываний и, следовательно, может использоваться для временных данных без корректировки указателя стека. Флаг -mno-red-zone отключает эту красную зону.
-
-mcmodel=small -
Генерировать код для небольшой модели кода: программа и её символы должны быть связаны в нижних 2 ГБ адресного пространства. Указатели — 64 бита. Программы могут быть статически или динамически связаны. Это модель кода по умолчанию.
-
-mcmodel=kernel -
Генерировать код для модели кода ядра. Ядро работает в отрицательных 2 ГБ адресного пространства. Эта модель должна использоваться для кода ядра Linux.
-
-mcmodel=medium -
Генерировать код для средней модели: программа связывается в нижних 2 ГБ адресного пространства. Маленькие символы также размещаются там. Символы размером больше, чем -mlarge-data-threshold, помещаются в секции больших данных или BSS и могут располагаться выше 2 ГБ. Программы могут быть статически или динамически связаны.
-
-mcmodel=large -
Генерировать код для большой модели. Эта модель не делает предположений об адресах и размерах секций.
-
-maddress-mode=long -
Генерировать код для режима длинного адреса. Он поддерживается только для 64-битных и x32 сред. Это режим адреса по умолчанию для 64-битных сред.
-
-maddress-mode=short -
Генерировать код для режима короткого адреса. Он поддерживается только для 32-битных и x32 сред. Это режим адреса по умолчанию для 32-битных и x32 сред.
-
-mneeded -mno-needed-
Выводить GNU_PROPERTY_X86_ISA_1_NEEDED GNU свойство для целевой платформы Linux, чтобы указать уровень микроархитектурной ISA, необходимый для выполнения двоичного файла.
-
-mno-direct-extern-access -
Без -fpic ни -fPIC всегда используйте указатель GOT для доступа к внешним символам. С -fpic или -fPIC обрабатывайте доступ к защищённым символам как к локальным символам. По умолчанию используется -mdirect-extern-access.
Предупреждение: общие библиотеки, скомпилированные с -mno-direct-extern-access, и исполняемые файлы, скомпилированные с -mdirect-extern-access, могут быть не совместимы в двоичном формате, если в общих библиотеках и исполняемых файлах используются защищённые символы.
-
-munroll-only-small-loops -
Управляет консервативным развёртыванием небольших циклов. Включён по умолчанию в O2 и разворачивает циклы с менее чем 4 инструкциями 1 раз. Явные -f[no-]unroll-[all-]loops отключат этот флаг, чтобы избежать любого непреднамеренного развёртывания, которого пользователь не хочет.
-
-mlam=choice LAM (маскирование линейного адреса) позволяет использовать специальные биты в указателе для метаданных. По умолчанию используется ‘none’. С ‘u48’ биты указателя в позициях 62:48 могут использоваться для метаданных; с ‘u57’ биты указателя в позициях 62:57 могут использоваться для метаданных.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/x86-Options.html