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-битными расширениями.
- ‘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 и 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 с 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 с 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 с 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 с 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.
- ‘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-
Настройте тип-процессора на всё применимое к сгенерированному коду, кроме ABI и набора доступных инструкций. Выбор определённого тип-процессора позволяет настроить планирование для конкретного чипа, но компилятор не генерирует код, который не может работать на стандартной машине, если вы не используете параметр -march=тип-процессора. Например, если GCC сконфигурирован для i686-pc-linux-gnu, то -mtune=pentium4 генерирует код, настроенный для Pentium 4, но он всё равно работает на машинах i686.
Варианты для тип-процессора такие же, как и для -march. Кроме того, -mtune поддерживает 2 дополнительных варианта для тип-процессора:
- ‘generic’
-
Генерировать код, оптимизированный для самых распространённых процессоров IA32/AMD64/EM64T. Если вы знаете процессор, на котором будет выполняться ваш код, то следует использовать соответствующий параметр -mtune или -march вместо -mtune=generic. Но если вы не знаете точно, какой процессор будут иметь пользователи вашего приложения, то следует использовать этот параметр.
По мере появления новых процессоров на рынке поведение этого параметра будет меняться. Поэтому, при обновлении до более новой версии GCC, генерация кода, управляемая этим параметром, будет меняться в соответствии с наиболее распространёнными процессорами на момент выпуска этой версии GCC.
Нет параметра -march=generic, потому что -march указывает набор инструкций, который может использовать компилятор, а универсального набора инструкций, применимого ко всем процессорам, нет. В отличие от этого, -mtune указывает процессор (или, в данном случае, группу процессоров), для которого оптимизируется код.
- ‘intel’
-
Генерировать код, оптимизированный для самых современных процессоров Intel, которые для этой версии GCC являются Haswell и Silvermont. Если вы знаете процессор, на котором будет выполняться ваш код, то следует использовать соответствующий параметр -mtune или -march вместо -mtune=intel. Но если вы хотите, чтобы ваше приложение работало быстрее как на Haswell, так и на Silvermont, то следует использовать этот параметр.
По мере появления новых процессоров Intel на рынке поведение этого параметра будет меняться. Поэтому, при обновлении до более новой версии GCC, генерация кода, управляемая этим параметром, будет меняться в соответствии с самыми современными процессорами Intel на момент выпуска этой версии GCC.
Нет параметра -march=intel, потому что -march указывает набор инструкций, который может использовать компилятор, а универсального набора инструкций, применимого ко всем процессорам, нет. В отличие от этого, -mtune указывает процессор (или, в данном случае, группу процессоров), для которого оптимизируется код.
-mcpu=cpu-type-
Устаревший синоним для -mtune.
-mfpmath=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=тип-процессора, -msse или -msse2, чтобы включить расширения SSE и сделать этот параметр эффективным. Для компилятора x86-64 эти расширения включены по умолчанию.
Полученный код должен быть значительно быстрее в большинстве случаев и избежать проблем с числовой неустойчивостью кода 387, но может сломать некоторые существующие фрагменты кода, ожидающие, что временные значения будут иметь 80 бит.
Это значение по умолчанию для компилятора x86-64, целевых платформ Darwin x86-32 и значение по умолчанию для целевых платформ x86-32 с набором инструкций SSE2, когда включен параметр -ffast-math.
- ‘sse,387’
- ‘sse+387’
- ‘both’
Попытаться использовать оба набора инструкций одновременно. Это фактически удваивает количество доступных регистров, а на чипах с отдельными исполнительными устройствами для 387 и SSE — и ресурсы исполнения тоже. Используйте этот параметр с осторожностью, так как он всё ещё является экспериментальным, потому что планировщик регистров GCC не хорошо моделирует отдельные функциональные блоки, что приводит к неустойчивой производительности.
-masm=dialect
-
Выходные инструкции ассемблера с использованием выбранного диалекта. Также влияет на то, какой диалект используется для базовых
asm(см. Базовые ассемблерные инструкции без операндов) и расширенныхasm(см. Расширенные ассемблерные инструкции с операндами C-выражений). Доступные варианты (в порядке диалекта) — ‘att’ или ‘intel’. По умолчанию используется ‘att’. Darwin не поддерживает ‘intel’. -mieee-fp-mno-ieee-fp-
Управляет тем, использует ли компилятор сравнения с плавающей точкой IEEE. Они корректно обрабатывают случай, когда результат сравнения не упорядочен.
-m80387-mhard-float-
Генерировать вывод, содержащий инструкции 80387 для работы с плавающей точкой.
-mno-80387-msoft-float-
Генерировать вывод, содержащий вызовы библиотек для работы с плавающей точкой.
Предупреждение: необходимые библиотеки не входят в состав GCC. Обычно используются возможности обычного C-компилятора машины, но это нельзя сделать напрямую при кросс-компиляции. Вы должны самостоятельно позаботиться о предоставлении подходящих функций библиотеки для кросс-компиляции.
На машинах, где функция возвращает результаты с плавающей точкой в стеке регистра 80387, могут быть сгенерированы некоторые инструкции с плавающей точкой, даже если используется -msoft-float.
-mno-fp-ret-in-387-
Не использовать регистры FPU для возвращаемых значений функций.
Обычная соглашение о вызовах функций предполагает возвращение значений типов
floatиdoubleв регистре FPU, даже если FPU отсутствует. Идея в том, что операционная система должна эмулировать FPU.Опция -mno-fp-ret-in-387 приводит к возвращению таких значений в обычные регистры процессора вместо этого.
-mno-fancy-math-387-
Некоторые эмуляторы 387 не поддерживают инструкции
sin,cosиsqrtдля 387. Укажите эту опцию, чтобы избежать генерации этих инструкций. Эта опция переопределяется, когда -march указывает, что целевой процессор всегда имеет FPU, и поэтому инструкция не нуждается в эмуляции. Эти инструкции не генерируются, если также не используется переключатель -funsafe-math-optimizations. -malign-double-mno-align-double-
Управляет тем, выравниваются ли переменные
double,long double, иlong longна границе двух слов или одного слова. Выравнивание переменныхdoubleна границе двух слов генерирует код, который работает несколько быстрее на Pentium за счет большего использования памяти.На x86-64 опция -malign-double включена по умолчанию.
Предупреждение: если вы используете переключатель -malign-double, структуры, содержащие указанные типы, выравниваются иначе, чем в опубликованных спецификациях двоичного интерфейса приложения для x86-32, и не являются двоично совместимыми со структурами в коде, скомпилированном без этого переключателя.
-m96bit-long-double-m128bit-long-double-
Эти переключатели управляют размером типа
long double. Двоичный интерфейс приложения x86-32 определяет размер в 96 бит, поэтому -m96bit-long-double используется по умолчанию в 32-битном режиме.Современные архитектуры (Pentium и новее) предпочитают выравнивание типа
long doubleна границу 8 или 16 байт. В массивах или структурах, соответствующих ABI, это невозможно. Поэтому указание -m128bit-long-double выравниваетlong doubleна границу 16 байт, добавив дополнительно 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 для плавающих точек и двойных аргументов и возвращаемых значений. Вы можете контролировать это поведение для конкретной функции, используя атрибут функции
sseregparm. См. Объявление атрибутов функций.Предупреждение: если вы используете этот переключатель, все модули, включая любые библиотеки, должны быть построены с тем же значением. Это включает системные библиотеки и модули запуска.
-mvect8-ret-in-mem-
Возвращать 8-байтовые векторы в память вместо регистров MMX. Это значение по умолчанию в VxWorks для соответствия ABI компиляторов Sun Studio до версии 12. Только используйте эту опцию, если вам нужно оставаться совместимым с существующим кодом, сгенерированным этими предыдущими версиями компиляторов или более старыми версиями GCC.
-mpc32-mpc64-mpc80-
Установить точность плавающей точки 80387 в 32, 64 или 80 бит. Когда указана опция -mpc32, мантиссы результатов операций с плавающей точкой округляются до 24 бит (одинарная точность); -mpc64 округляет мантиссы результатов операций с плавающей точкой до 53 бит (двойная точность), а -mpc80 округляет мантиссы результатов операций с плавающей точкой до 64 бит (расширенная двойная точность), что является значением по умолчанию. При использовании этой опции программисту не доступны операции с плавающей точкой в более высокой точности без явного установки слова управления FPU.
Установка округления операций с плавающей точкой до меньшего значения, чем по умолчанию (80 бит), может ускорить некоторые программы на 2% или более. Обратите внимание, что некоторые математические библиотеки предполагают, что операции с плавающей точкой расширенной точности (80 бит) включены по умолчанию; функции в таких библиотеках могут потерять значительную точность, как правило, из-за так называемого «катастрофического сокращения», когда эта опция используется для установки точности ниже расширенной точности.
-mstackrealign-
Перевыравнивание стека при входе. На x86 опция -mstackrealign генерирует альтернативный пролог и эпилог, которые перевыравнивают стек во время выполнения, если это необходимо. Это позволяет смешивать устаревший код, который поддерживает выравнивание стека в 4 байта, с современным кодом, который поддерживает выравнивание стека в 16 байт для совместимости с SSE. См. также атрибут
force_align_arg_pointer, применимый к отдельным функциям. -mpreferred-stack-boundary=num
-
Попытка выровнять границу стека по границе в 2 в степени num байт. Если -mpreferred-stack-boundary не указан, значение по умолчанию равно 4 (16 байт или 128 бит).
Предупреждение: При генерации кода для архитектуры x86-64 с отключенными расширениями SSE, -mpreferred-stack-boundary=3 может использоваться для выравнивания границы стека по 8-байтовой границе. Поскольку ABI x86-64 требует выравнивания стека по 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-mavx512vpopcntdq-mavx512vp2intersect-mavx5124fmaps-mavx512vnni-mavx5124vnniw-mcldemote-
Эти переключатели позволяют использовать инструкции 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 или расширенные наборы инструкций 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 Control-flow Enforcement Technology (CET).
-mcrc32-
Этот параметр включает встроенные функции
__builtin_ia32_crc32qi,__builtin_ia32_crc32hi,__builtin_ia32_crc32siи__builtin_ia32_crc32diдля генерации машинной инструкцииcrc32. -mrecip
-
Этот параметр включает использование инструкций
RCPSSиRSQRTSS(и их векторизованных вариантовRCPPSиRSQRTPS) с дополнительным шагом Ньютона-Рафсона для повышения точности вместоDIVSSиSQRTSS(и их векторизованных вариантов) для аргументов с плавающей точкой одинарной точности. Эти инструкции генерируются только при включённых -funsafe-math-optimizations, -ffinite-math-only и -fno-trapping-math. Обратите внимание, что, хотя производительность последовательности выше, чем производительность необратной инструкции, точность последовательности может быть снижена до 2 у.е. (т. е. обратное 1,0 равно 0,99999994).Обратите внимание, что GCC реализует
1.0f/sqrtf(x)в терминахRSQRTSS(илиRSQRTPS) уже с -ffast-math (или указанным выше сочетанием параметров) и не нуждается в -mrecip.Также обратите внимание, что GCC генерирует указанную выше последовательность с дополнительным шагом Ньютона-Рафсона для векторизованного деления с плавающей запятой одинарной точности и векторизованного
sqrtf(x)уже с -ffast-math (или вышеуказанным сочетанием параметров) и не нуждается в -mrecip. -mrecip=opt-
Этот параметр управляет тем, какие инструкции оценки обратного значения могут быть использованы. opt — это список параметров, разделённых запятыми, которые могут быть предваряемыми символом «!» для инвертирования параметра:
- ‘all’
-
Включить все инструкции оценки.
- ‘default’
-
Включить стандартные инструкции, что эквивалентно -mrecip.
- ‘none’
-
Отключить все инструкции оценки, что эквивалентно -mno-recip.
- ‘div’
-
Включить приближение для скалярного деления.
- ‘vec-div’
-
Включить приближение для векторизованного деления.
- ‘sqrt’
-
Включить приближение для скалярного квадратного корня.
- ‘vec-sqrt’
Включить приближение для векторизованного квадратного корня.
Например, -mrecip=all,!sqrt включает все приближения обратных значений, за исключением квадратного корня.
-mveclibabi=type-
Указывает тип ABI для векторизации встроенных функций с использованием внешней библиотеки. Поддерживаемые значения для type — ‘svml’ для библиотеки Intel short vector math и ‘acml’ для библиотеки AMD math core. Для использования этого параметра необходимо включить как -ftree-vectorize, так и -funsafe-math-optimizations, а также указать совместимую с SVML или ACML ABI библиотеку при компоновке.
В настоящее время GCC генерирует вызовы
vmldExp2,vmldLn2,vmldLog102,vmldPow2,vmldTanh2,vmldTan2,vmldAtan2,vmldAtanh2,vmldCbrt2,vmldSinh2,vmldSin2,vmldAsinh2,vmldAsin2,vmldCosh2,vmldCos2,vmldAcosh2,vmldAcos2,vmlsExp4,vmlsLn4,vmlsLog104,vmlsPow4,vmlsTanh4,vmlsTan4,vmlsAtan4,vmlsAtanh4,vmlsCbrt4,vmlsSinh4,vmlsSin4,vmlsAsinh4,vmlsAsin4,vmlsCosh4,vmlsCos4,vmlsAcosh4иvmlsAcos4для соответствующего типа функции при использовании -mveclibabi=svml и__vrd2_sin,__vrd2_cos,__vrd2_exp,__vrd2_log,__vrd2_log2,__vrd2_log10,__vrs4_sinf,__vrs4_cosf,__vrs4_expf,__vrs4_logf,__vrs4_log2f,__vrs4_log10fи__vrs4_powfдля соответствующего типа функции при использовании -mveclibabi=acml. -mabi=name-
Генерирует код для указанной соглашения вызовов. Допустимые значения — ‘sysv’ для ABI, используемого в GNU/Linux и других системах, и ‘ms’ для Microsoft ABI. По умолчанию используется Microsoft ABI при нацеливании на Microsoft Windows и SysV ABI во всех остальных системах. Вы можете управлять этим поведением для определённых функций, используя атрибуты функций
ms_abiиsysv_abi. См. Объявление атрибутов функций. -mforce-indirect-call-
Вынуждает все вызовы функций быть косвенными. Это полезно при использовании Intel Processor Trace, где он генерирует более точную информацию о времени выполнения для вызовов функций.
-mmanual-endbr-
Вставляет инструкцию ENDBR при входе в функцию только через атрибут функции
cf_check. Это полезно при использовании параметра -fcf-protection=branch для управления вставкой ENDBR при входе в функцию. -mcall-ms2sysv-xlogues-
Из-за различий в 64-разрядных ABI любые функции Microsoft ABI, которые вызывают функцию System V ABI, должны учитывать RSI, RDI и XMM6-15 как затронутые. По умолчанию код для сохранения и восстановления этих регистров генерируется встроенным способом, что приводит к довольно длинным прологам и эпилогам. При использовании -mcall-ms2sysv-xlogues генерируются прологи и эпилоги, использующие подпрограммы в статической части libgcc для выполнения этих операций сохранения и восстановления, тем самым уменьшая размер функции за счёт нескольких дополнительных инструкций.
-mtls-dialect=type-
Генерирует код для доступа к локальному хранилищу потока, используя соглашения ‘gnu’ или ‘gnu2’. ‘gnu’ — это консервативное значение по умолчанию; ‘gnu2’ более эффективный, но он может добавлять требования к компиляции и выполнению, которые не могут быть удовлетворены на всех системах.
-mpush-args-mno-push-args-
Использовать операции PUSH для хранения параметров исходящих данных. Этот метод короче и обычно так же быстр, как метод, использующий операции SUB/MOV, и включен по умолчанию. В некоторых случаях его отключение может улучшить производительность из-за улучшенного планирования и уменьшения зависимостей.
-maccumulate-outgoing-args-
Если включено, максимальный объём памяти, необходимый для исходящих аргументов, вычисляется в прологе функции. Это быстрее на большинстве современных процессоров из-за уменьшенных зависимостей, улучшенного планирования и уменьшенного использования стека, когда предпочтительная граница стека не равна 2. Недостатком является заметное увеличение размера кода. Этот переключатель подразумевает -mno-push-args.
-mthreads-
Поддержка безопасной обработки исключений в потоках на MinGW. Программы, которые полагаются на безопасную обработку исключений в потоках, должны компилировать и компоновать весь код с параметром -mthreads. При компиляции -mthreads определяет -D_MT; при компоновке он компонует специальную библиотеку помощника потоков -lmingwthrd, которая очищает данные обработки исключений по каждому потоку.
-mms-bitfields-mno-ms-bitfields
-
Включить/отключить компоновку битовых полей, совместимую с родным компилятором Microsoft Windows.
Если
packedиспользуется для структуры или используются битовые поля, возможно, Microsoft ABI выстраивает структуру иначе, чем обычно делает GCC. Особенно при перемещении упакованных данных между функциями, скомпилированными с GCC и родным компилятором Microsoft (либо через вызов функции, либо как данные в файле), может потребоваться доступ к обоим форматам.Этот параметр включён по умолчанию для целей Microsoft Windows. Это поведение также может контролироваться локально с помощью переменных или атрибутов типов. Для получения дополнительной информации см. Атрибуты переменных x86 и Атрибуты типов x86.
Алгоритм компоновки структуры Microsoft довольно прост за исключением упаковки битовых полей. Выравнивание и заполнение членов структур, а также то, может ли битовое поле пересекать границу единицы хранения, определяются следующими правилами:
- Члены структуры хранятся последовательно в порядке их объявления: первый член имеет наименьший адрес памяти, а последний — наибольший.
- Каждый объект данных имеет требования к выравниванию. Требование к выравниванию для всех данных, кроме структур, объединений и массивов, равно размеру объекта или текущему размеру упаковки (указанному с помощью атрибута
alignedили директивыpackpragma), что меньше. Для структур, объединений и массивов требование к выравниванию равно наибольшему требованию к выравниванию его членов. Каждый объект выделяется смещение таким образом, что:offset % alignment_requirement == 0
- Смежные битовые поля упаковываются в один, два или четыре байта, если целочисленные типы имеют одинаковый размер и если следующее битовое поле помещается в текущую единицу выделения без пересечения границы, наложенной общими требованиями к выравниванию битовых полей.
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.
-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.
-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
-
Генерировать код, использующий только регистры общего назначения. Это предотвращает использование компилятором регистров с плавающей запятой, векторных, масок и ограниченных регистров.
-mindirect-branch=choice-
Преобразовать косвенный вызов и переход с помощью choice. По умолчанию используется ‘keep’, что сохраняет косвенный вызов и переход без изменений. ‘thunk’ преобразует косвенный вызов и переход в вызов и возврат thunk. ‘thunk-inline’ преобразует косвенный вызов и переход в встроенный вызов и возврат thunk. ‘thunk-extern’ преобразует косвенный вызов и переход во внешний вызов и возврат thunk, предоставленный в отдельном объектом файле. Вы можете управлять этим поведением для конкретной функции, используя атрибут функции
indirect_branch. См. Объявление атрибутов функций.Обратите внимание, что -mcmodel=large несовместим с -mindirect-branch=thunk и -mindirect-branch=thunk-extern, поскольку функция thunk может быть недоступна в модели кода large.
Обратите внимание, что -mindirect-branch=thunk-extern совместим с -fcf-protection=branch, поскольку внешний thunk может быть настроен на включение проверки потока управления.
-mfunction-return=choice-
Преобразовать возврат функции с помощью choice. По умолчанию используется ‘keep’, что сохраняет возврат функции без изменений. ‘thunk’ преобразует возврат функции в вызов и возврат thunk. ‘thunk-inline’ преобразует возврат функции во встроенный вызов и возврат thunk. ‘thunk-extern’ преобразует возврат функции во внешний вызов и возврат thunk, предоставленный в отдельном объектом файле. Вы можете управлять этим поведением для конкретной функции, используя атрибут функции
function_return. См. Объявление атрибутов функций.Обратите внимание, что -mindirect-return=thunk-extern совместим с -fcf-protection=branch, поскольку внешний thunk может быть настроен на включение проверки потока управления.
Обратите внимание, что -mcmodel=large несовместим с -mfunction-return=thunk и -mfunction-return=thunk-extern, поскольку функция thunk может быть недоступна в модели кода large.
-mindirect-branch-register-
Вынудительно выполнить косвенный вызов и переход через регистр.
Эти переключатели ‘-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. Красная зона предписывается ABI x86-64; это область размером 128 байт за местоположением указателя стека, которая не изменяется обработчиками сигналов или прерываний и, следовательно, может использоваться для временных данных без корректировки указателя стека. Флаг -mno-red-zone отключает эту красную зону.
-mcmodel=small-
Генерировать код для небольшой модели кода: программа и её символы должны быть связаны в нижних 2 ГБ адресного пространства. Указатели имеют 64 бита. Программы могут быть статически или динамически связаны. Это модель кода по умолчанию.
-mcmodel=kernel-
Генерировать код для модели кода ядра. Ядро работает в отрицательных 2 ГБ адресного пространства. Эта модель должна использоваться для кода ядра Linux.
-mcmodel=medium-
Генерировать код для средней модели: программа связывается в нижних 2 ГБ адресного пространства. Малые символы также размещаются там. Символы размером больше, чем -mlarge-data-threshold, помещаются в секции large data или BSS и могут находиться выше 2 ГБ. Программы могут быть статически или динамически связаны.
-mcmodel=large-
Генерировать код для большой модели. Эта модель не делает предположений об адресах и размерах разделов.
-maddress-mode=long-
Генерировать код для режима с длинным адресом. Это поддерживается только для 64-разрядных и x32 сред. Это режим адресации по умолчанию для 64-разрядных сред.
-maddress-mode=short-
Генерировать код для режима с коротким адресом. Это поддерживается только для 32-разрядных и x32 сред. Это режим адресации по умолчанию для 32-разрядных и x32 сред.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/x86-Options.html