Spec-Zone.ru › GCC 11

Следующая: x86 Windows Options, Предыдущая: VxWorks Options, Вверх: Параметры, зависящие от модели машины [Оглавление][Индекс]

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

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

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

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

    Например:

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

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

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

    Например:

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

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

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

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

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

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

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

-mno-align-stringops

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

-minline-all-stringops

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

-minline-stringops-dynamically

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

-mstringop-strategy=alg

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

‘rep_byte’
‘rep_4byte’
‘rep_8byte’

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

‘byte_loop’
‘loop’
‘unrolled_loop’

Расширение в цикл встраивания.

‘libcall’

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

-mmemcpy-strategy=strategy

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

-mmemset-strategy=strategy

Этот параметр похож на -mmemcpy-strategy=, но он управляет расширением __builtin_memset.

-momit-leaf-frame-pointer

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

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

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

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

-msse2avx
-mno-sse2avx

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

-mfentry
-mno-fentry

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

-mrecord-mcount
-mno-record-mcount

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

-mnop-mcount
-mno-nop-mcount

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

-minstrument-return=type

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

Далее: x86 Windows Options, Предыдущее: VxWorks Options, Вверх: Machine-Dependent Options [Содержание][Индекс]

© 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

Spec-Zone.ru

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