3.17.17 Параметры Intel 386 и AMD x86-64
Эти параметры -m определены для компьютеров семейства i386 и x86-64:
-
-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производит код, оптимизированный для локальной машины с ограничениями выбранного набора инструкций. - ‘
i386’ - Оригинальный процессор Intel i386.
- ‘
i486’ - Процессор Intel i486. (Планирование для этого чипа не реализовано.)
- ‘
i586’- ‘
pentium’ - ‘
- Процессор Intel Pentium без поддержки MMX.
- ‘
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.
- ‘
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, PCLMUL и RDRND.
- ‘
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, PCL_MUL, 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, PCL_MUL, 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, PCL_MUL, 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, PCL_MUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM и 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, PCL_MUL, 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. (Планирование для этого чипа не реализовано.)
- ‘
geode’ - Встроенный процессор AMD Geode с поддержкой наборов инструкций MMX и 3DNow!.
- ‘
-
-mtune=cpu-type - Устаревший синоним
-mtune. -
-mcpu=unit
- Генерировать вычисления с плавающей запятой для выбранного блока unit. Доступные варианты для unit:
- ‘
387’ - Использовать стандартный сопроцессор с плавающей запятой 387, присутствующий на большинстве процессоров, или эмулировать его в противном случае. Скомпилированный с этим вариантом код работает практически на всех системах. Временные результаты вычисляются с точностью 80 бит вместо точности, заданной типом, что приводит к немного отличающимся результатам по сравнению с большинством других процессоров. Для более подробного описания см.
-ffloat-store.Это значение по умолчанию для компилятора i386.
- ‘
sse’ - Использовать скалярные инструкции с плавающей запятой, присутствующие в наборе инструкций SSE. Этот набор инструкций поддерживается процессорами Pentium III и новее, а в линейке AMD — процессорами Athlon-4, Athlon XP и Athlon MP. Более ранние версии набора инструкций SSE поддерживают только арифметику одинарной точности, поэтому арифметика двойной и расширенной точности всё ещё выполняется с помощью 387. Более поздняя версия, присутствующая только в процессорах Pentium 4 и AMD x86-64, также поддерживает арифметику двойной точности.
Для компилятора i386 необходимо использовать переключатели -march=cpu-type,
-msseили-msse2, чтобы включить расширения SSE и сделать этот вариант эффективным. Для компилятора x86-64 эти расширения включены по умолчанию.Полученный код должен быть значительно быстрее в большинстве случаев и избежать проблем с числовой неустойчивостью кода 387, но может нарушить некоторый существующий код, который ожидает, что временные результаты будут иметь 80 бит.
Это значение по умолчанию для компилятора x86-64.
- ‘
sse,387’- ‘
sse+387’- ‘
both’ - ‘
- Попытаться использовать оба набора инструкций одновременно. Это эффективно удваивает количество доступных регистров, а на процессорах с отдельными вычислительными блоками для 387 и SSE — и ресурсы выполнения. Используйте этот вариант с осторожностью, так как он все ещё находится на стадии разработки, потому что распределитель регистров GCC не моделирует отдельные функциональные блоки хорошо, что приводит к неустойчивой производительности.
- ‘
-
-masm=dialect - Выводить инструкции ассемблера, используя выбранный dialect. Поддерживаются варианты ‘
intel’ или ‘att’ (по умолчанию). Darwin не поддерживает ‘intel’. -
-mieee-fp-mno-ieee-fp - Управлять использованием компараторов с плавающей запятой IEEE. Они корректно обрабатывают случай, когда результат сравнения не упорядочен.
-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. Укажите этот вариант, чтобы избежать генерации этих инструкций. Этот вариант является значением по умолчанию в FreeBSD, OpenBSD и NetBSD. Этот вариант переопределяется, когда-marchуказывает, что целевой процессор всегда имеет FPU, и поэтому инструкция не требует эмуляции. Эти инструкции не генерируются, если вы также не используете переключатель-funsafe-math-optimizations. -
-malign-double-mno-align-double - Управлять тем, выравнивает ли GCC переменные
double,long double, иlong longна границе в два слова или на границе в одно слово. Выравнивание переменныхdoubleна границе в два слова производит код, который работает немного быстрее на Pentium за счёт большего использования памяти.В x86-64,
-malign-doubleвключено по умолчанию.Предупреждение: если вы используете переключатель
-malign-double, структуры, содержащие указанные типы, выравниваются не так, как в опубликованных спецификациях интерфейса прикладного программирования для 386, и не являются двоично совместимыми со структурами в коде, скомпилированном без этого переключателя. -
-m96bit-long-double-m128bit-long-double - Эти переключатели управляют размером типа
long double. Прикладной интерфейс i386 специфицирует размер в 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. Таким образом, они не являются двоично совместимыми с кодом, скомпилированным без этого переключателя. -
-mlarge-data-threshold=threshold - Когда
-mcmodel=mediumуказано, объекты данных, размер которых превышает threshold, размещаются в разделе данных большого размера. Это значение должно быть одинаковым для всех объектов, связанных в бинарный файл, и по умолчанию равно 65535. -mrtd- Использовать другую конвенцию вызова функций, в которой функции, принимающие фиксированное количество аргументов, возвращаются с инструкцией
retnum, которая удаляет их аргументы при возврате. Это экономит одну инструкцию в вызывающей функции, так как там не нужно удалять аргументы.Вы можете указать, что отдельная функция вызывается с этой последовательностью вызова, с помощью атрибута функции ‘
stdcall’. Вы также можете переопределить вариант-mrtdс помощью атрибута функции ‘cdecl’. См. Атрибуты функций.Предупреждение: эта конвенция вызова функций несовместима с обычно используемой в Unix, поэтому вы не можете её использовать, если вам нужно вызывать библиотеки, скомпилированные с компилятором Unix.
Также, вы должны предоставить прототипы функций для всех функций, принимающих переменное число аргументов (включая
printf); в противном случае генерируется некорректный код для вызовов этих функций.Кроме того, генерируется очень некорректный код, если вы вызываете функцию с слишком многими аргументами. (Обычно дополнительные аргументы безопасно игнорируются.)
-
-mregparm=num - Управлять количеством регистров, используемых для передачи целочисленных аргументов. По умолчанию для передачи аргументов не используются регистры, и максимум 3 регистра могут быть использованы. Вы можете управлять этим поведением для конкретной функции с помощью атрибута функции ‘
regparm’. См. Атрибуты функций.Предупреждение: если вы используете этот переключатель, и num не равно нулю, то вы должны скомпилировать все модули с одинаковым значением, включая любые библиотеки. Это включает системные библиотеки и начальные модули.
-msseregparm- Использовать соглашения об передаче регистров SSE для аргументов float и double и возвращаемых значений. Вы можете управлять этим поведением для конкретной функции с помощью атрибута функции ‘
sseregparm’. См. Атрибуты функций.Предупреждение: если вы используете этот переключатель, то вы должны скомпилировать все модули с одинаковым значением, включая любые библиотеки. Это включает системные библиотеки и начальные модули.
-mvect8-ret-in-mem- Возвращать 8-байтовые векторы в памяти вместо регистров MMX. Это значение по умолчанию в Solaris 8 и 9 и VxWorks, чтобы соответствовать ABI компиляторов Sun Studio до версии 12. Более поздние версии компиляторов (начиная с Studio 12 Update 1) следуют ABI, используемому другими x86 целевыми системами, что является значением по умолчанию в Solaris 10 и новее. Только используйте этот вариант, если вам нужно оставаться совместимым с существующим кодом, сгенерированным этими предыдущими версиями компилятора или более ранними версиями GCC.
-
-mpc32-mpc64-mpc80 - Установить точность плавающей запятой 80387 в 32, 64 или 80 бит. Когда
-mpc32указано, значащие разряды результатов операций с плавающей запятой округляются до 24 бит (одинарная точность);-mpc64округляет значащие разряды результатов операций с плавающей запятой до 53 бит (двойная точность) и-mpc80округляет значащие разряды результатов операций с плавающей запятой до 64 бит (расширенная двойная точность), что является значением по умолчанию. Когда этот параметр используется, операции с плавающей запятой в более высоких точностях недоступны программисту без явного задания слова управления FPU.Установка округления операций с плавающей запятой до значения меньше значения по умолчанию в 80 бит может ускорить некоторые программы на 2% или более. Обратите внимание, что некоторые математические библиотеки предполагают, что операции с плавающей запятой расширенной точности (80 бит) включены по умолчанию; процедуры в таких библиотеках могут потерпеть значительную потерю точности, обычно из-за так называемой «катастрофической компенсации», когда этот параметр используется для установки точности меньше чем расширенной.
-mstackrealign- Перестроить стек при входе. На процессорах Intel x86, опция
-mstackrealignгенерирует альтернативный пролог и эпилог, которые перестраивают стек выполнения при необходимости. Это поддерживает смешение устаревшего кода, сохраняющего 4-байтовое выравнивание стека, с современным кодом, сохраняющим 16-байтовое выравнивание для совместимости с SSE. Смотрите также атрибутforce_align_arg_pointer, применимый к отдельным функциям. -
-mpreferred-stack-boundary=num - Попытка сохранить границу стека, выровненную по границе в 2num байт. Если
-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 - Предполагается, что входящий стек выровнен по границе в 2num байт. Если
-mincoming-stack-boundaryне указано, используется значение, заданное-mpreferred-stack-boundary.На процессорах Pentium и Pentium Pro, значения
doubleиlong doubleдолжны быть выровнены по 8-байтовой границе (см.-malign-double) или это приведёт к существенным потерям производительности во время выполнения. На процессорах Pentium III, тип данных расширения Streaming SIMD (SSE)__m128может работать некорректно, если он не выровнен по 16-байтовой границе.Для обеспечения правильного выравнивания этих значений в стеке, граница стека должна быть выровнена так же, как и любое значение, хранящееся в стеке. Кроме того, каждая функция должна генерироваться таким образом, чтобы сохранять выравнивание стека. Таким образом, вызов функции, скомпилированной с более высоким предпочтительным выравниванием стека из функции, скомпилированной с более низким предпочтительным выравниванием стека, скорее всего, приведёт к некорректному выравниванию стека. Рекомендуется, чтобы библиотеки, использующие обратные вызовы, всегда использовали значение по умолчанию.
Это дополнительное выравнивание потребляет дополнительное место в стеке и, как правило, увеличивает размер кода. Код, чувствительный к использованию места в стеке, например, встроенные системы и ядра операционных систем, могут захотеть уменьшить предпочтительное выравнивание до
-mpreferred-stack-boundary=2. -
-mmmx-mno-mmx-msse-mno-sse-msse2-mno-sse2-msse3-mno-sse3-mssse3-mno-ssse3-msse4.1-mno-sse4.1-msse4.2-mno-sse4.2-msse4-mno-sse4-mavx-mno-avx-mavx2-mno-avx2-mavx512f-mno-avx512f-mavx512pf-mno-avx512pf-mavx512er-mno-avx512er-mavx512cd-mno-avx512cd-msha-mno-sha-maes-mno-aes-mpclmul-mno-pclmul-mfsgsbase-mno-fsgsbase-mrdrnd-mno-rdrnd-mf16c-mno-f16c-mfma-mno-fma-mprefetchwt1-mno-prefetchwt1-msse4a-mno-sse4a-mfma4-mno-fma4-mxop-mno-xop-mlwp-mno-lwp-m3dnow-mno-3dnow-mpopcnt-mno-popcnt-mabm-mno-abm-mbmi-mbmi2-mno-bmi-mno-bmi2-mlzcnt-mno-lzcnt-mfxsr-mxsave-mxsaveopt-mrtm-mtbm-mno-tbm - Эти переключатели включают или отключают использование инструкций в наборах команд MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AVX512F, AVX512PF, AVX512ER, AVX512CD, SHA, AES, PCLMUL, FSGSBASE, RDRND, F16C, FMA, SSE4A, FMA4, XOP, LWP, ABM, BMI, BMI2, FXSR, XSAVE, XSAVEOPT, LZCNT, RTM или расширенных наборах команд 3DNow!. Эти расширения также доступны как встроенные функции: см. Встроенные функции 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 в автоматическом векторизаторе.
-mcx16- Эта опция позволяет GCC генерировать инструкции
CMPXCHG16B.CMPXCHG16Bпозволяет выполнять атомные операции над 128-битными двойными квадро- (или oword) типами данных. Это полезно для счётчиков высокой точности, которые могут обновляться несколькими процессорами (или ядрами). Эта инструкция генерируется как часть встроенных функций атомных операций: см. __sync Встроенные функции или __atomic Встроенные функции для получения подробностей. -msahf- Эта опция включает генерацию инструкций
SAHFв 64-битном коде. Ранние процессоры Intel Pentium 4 с поддержкой Intel 64, до появления Pentium 4 G1 step в декабре 2005 года, не имели инструкцийLAHFиSAHF, которые поддерживались AMD64. Это инструкции загрузки и сохранения соответственно для определённых флагов состояния. В 64-битном режиме инструкцияSAHFиспользуется для оптимизацииfmod,dremиremainderвстроенных функций; см. Другие Встроенные функции для получения подробностей. -mmovbe- Эта опция включает использование инструкции
movbeдля реализации__builtin_bswap32и__builtin_bswap64. -mcrc32- Эта опция включает встроенные функции
__builtin_ia32_crc32qi,__builtin_ia32_crc32hi,__builtin_ia32_crc32siи__builtin_ia32_crc32diдля генерации машинной инструкцииcrc32. -mrecip
- Этот параметр разрешает использование инструкций
RCPSSиRSQRTSS(и их векторных вариантовRCPPSиRSQRTPS) с дополнительным шагом Ньютона-Рафсона для повышения точности вместоDIVSSиSQRTSS(и их векторных вариантов) для аргументов с плавающей запятой одинарной точности. Эти инструкции генерируются только при включённом-funsafe-math-optimizationsвместе с-finite-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 с короткой векторной математикой и ‘acml’ для библиотеки ядра математики AMD. Для использования этого параметра должны быть включены как-ftree-vectorize, так и-funsafe-math-optimizations, а совместимая с SVML или ACML библиотека ABI должна быть указана во время компоновки.В настоящее время GCC генерирует вызовы
vmldExp2,vmldLn2,vmldLog102,vmldLog102,vmldPow2,vmldTanh2,vmldTan2,vmldAtan2,vmldAtanh2,vmldCbrt2,vmldSinh2,vmldSin2,vmldAsinh2,vmldAsin2,vmldCosh2,vmldCos2,vmldAcosh2,vmldAcos2,vmlsExp4,vmlsLn4,vmlsLog104,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’. См. Атрибуты функций. -
-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, которая очищает данные обработки исключений на уровне потока. -mno-align-stringops- Не выравнивать назначение встроенных строковых операций. Этот переключатель уменьшает размер кода и улучшает производительность в случае, если назначение уже выровнено, но GCC об этом не знает.
-minline-all-stringops- По умолчанию GCC встраивает строковые операции только в том случае, если назначение известно, что выровнено по крайней мере по границе в 4 байта. Это позволяет увеличить встраивание и размер кода, но может улучшить производительность кода, который зависит от быстрых
memcpy,strlen, иmemsetдля коротких длин. -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. -
-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 - Генерировать код защиты стека с помощью канистры в guard. Поддерживаются расположения ‘
global’ для глобальной канистры или ‘tls’ для канистры на уровне потока в блоке TLS (по умолчанию). Этот параметр действует только при указании-fstack-protectorили-fstack-protector-all.
Эти ‘-m’ переключатели поддерживаются помимо вышеперечисленных на процессорах x86-64 в 64-битных средах.
-
-m32-m64-mx32-m16 - Генерировать код для 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-битном режиме. -mno-red-zone- Не использовать так называемую «красную зону» для кода x86-64. Красная зона предписана x86-64 ABI; это область размером 128 байт за местоположением указателя стека, которая не изменяется обработчиками сигналов или прерываний и, следовательно, может использоваться для временных данных без корректировки указателя стека. Флаг
-mno-red-zoneотключает эту красную зону. -mcmodel=small- Генерировать код для маленькой модели кода: программа и ее символы должны быть объединены в нижних 2 ГБ адресного пространства. Указатели являются 64-битными. Программы могут быть статически или динамически скомпонованы. Это модель кода по умолчанию.
-mcmodel=kernel- Генерировать код для модели кода ядра. Ядро работает в отрицательных 2 ГБ адресного пространства. Эта модель должна использоваться для кода ядра Linux.
-mcmodel=medium- Генерировать код для средней модели: программа компонуется в нижних 2 ГБ адресного пространства. Маленькие символы также размещаются там. Символы размером больше, чем
-mlarge-data-threshold, помещаются в разделы больших данных или BSS и могут располагаться выше 2 ГБ. Программы могут быть статически или динамически скомпонованы. -mcmodel=large- Генерировать код для большой модели. Эта модель не делает предположений о адресах и размерах разделов.
-maddress-mode=long- Генерировать код для длинного режима адресации. Поддерживается только для 64-битных и x32 сред. Это режим адресации по умолчанию для 64-битных сред.
-maddress-mode=short- Генерировать код для короткого режима адресации. Поддерживается только для 32-битных и x32 сред. Это режим адресации по умолчанию для 32-битных и x32 сред.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/i386-and-x86-64-Options.html