3.19.44 Параметры IBM RS/6000 и PowerPC ¶
Эти параметры ‘-m’ определены для IBM RS/6000 и PowerPC:
-mpowerpc-gpopt-mno-powerpc-gpopt-mpowerpc-gfxopt-mno-powerpc-gfxopt-mpowerpc64-mno-powerpc64-mmfcrf-mno-mfcrf-mpopcntb-mno-popcntb-mpopcntd-mno-popcntd-mfprnd-mno-fprnd-mcmpb-mno-cmpb-mhard-dfp-mno-hard-dfp-
Эти параметры используются для указания набора инструкций, доступных на используемом процессоре. Значения по умолчанию этих параметров определяются при конфигурации GCC. Указание -mcpu=cpu_type переопределяет указание этих параметров. Рекомендуется использовать параметр -mcpu=cpu_type вместо перечисленных выше параметров.
Указание -mpowerpc-gpopt позволяет GCC использовать необязательные инструкции архитектуры PowerPC в группе общего назначения, включая квадратный корень с плавающей запятой. Указание -mpowerpc-gfxopt позволяет GCC использовать необязательные инструкции архитектуры PowerPC в группе графических инструкций, включая выборку с плавающей запятой.
Параметр -mmfcrf позволяет GCC генерировать инструкцию перемещения из поля регистра состояния, реализованную на процессоре POWER4 и других процессорах, поддерживающих архитектуру PowerPC V2.01. Параметр -mpopcntb позволяет GCC генерировать инструкции popcount и оценки обратного преобразования для чисел с двойной точностью с плавающей запятой, реализованные на процессоре POWER5 и других процессорах, поддерживающих архитектуру PowerPC V2.02. Параметр -mpopcntd позволяет GCC генерировать инструкцию popcount, реализованную на процессоре POWER7 и других процессорах, поддерживающих архитектуру PowerPC V2.06. Параметр -mfprnd позволяет GCC генерировать инструкции округления чисел с плавающей запятой до целых чисел, реализованные на процессоре POWER5+ и других процессорах, поддерживающих архитектуру PowerPC V2.03. Параметр -mcmpb позволяет GCC генерировать инструкцию сравнения байтов, реализованную на процессоре POWER6 и других процессорах, поддерживающих архитектуру PowerPC V2.05. Параметр -mhard-dfp позволяет GCC генерировать инструкции десятичной арифметики с плавающей запятой, реализованные на некоторых процессорах POWER.
Параметр -mpowerpc64 позволяет GCC генерировать дополнительные 64-битные инструкции, которые встречаются в полной архитектуре PowerPC64, и рассматривать регистры общего назначения как 64-битные, двойные величины. GCC по умолчанию использует -mno-powerpc64.
-mcpu=cpu_type-
Устанавливает тип архитектуры, использование регистров и параметры планирования инструкций для типа машины cpu_type. Допустимые значения для cpu_type — ‘401’, ‘403’, ‘405’, ‘405fp’, ‘440’, ‘440fp’, ‘464’, ‘464fp’, ‘476’, ‘476fp’, ‘505’, ‘601’, ‘602’, ‘603’, ‘603e’, ‘604’, ‘604e’, ‘620’, ‘630’, ‘740’, ‘7400’, ‘7450’, ‘750’, ‘801’, ‘821’, ‘823’, ‘860’, ‘970’, ‘8540’, ‘a2’, ‘e300c2’, ‘e300c3’, ‘e500mc’, ‘e500mc64’, ‘e5500’, ‘e6500’, ‘ec603e’, ‘G3’, ‘G4’, ‘G5’, ‘titan’, ‘power3’, ‘power4’, ‘power5’, ‘power5+’, ‘power6’, ‘power6x’, ‘power7’, ‘power8’, ‘power9’, ‘power10’, ‘powerpc’, ‘powerpc64’, ‘powerpc64le’, ‘rs64’ и ‘native’.
-mcpu=powerpc, -mcpu=powerpc64 и -mcpu=powerpc64le задают типы машин с чистой 32-битной архитектурой PowerPC (любой порядок байтов), 64-битной большой эндиан PowerPC и 64-битной малой эндиан PowerPC, при этом для целей планирования предполагается соответствующая общая модель процессора.
Указание ‘native’ в качестве типа процессора определяет и выбирает параметр архитектуры, соответствующий процессору хост-системы, на которой выполняется компиляция. -mcpu=native не имеет эффекта, если GCC не распознаёт процессор.
Другие параметры указывают на конкретный процессор. Код, сгенерированный с этими параметрами, лучше всего работает на этом процессоре и может вообще не работать на других.
Параметры -mcpu автоматически включают или выключают следующие параметры:
-maltivec -mfprnd -mhard-float -mmfcrf -mmultiple -mpopcntb -mpopcntd -mpowerpc64 -mpowerpc-gpopt -mpowerpc-gfxopt -mmulhw -mdlmzb -mmfpgpr -mvsx -mcrypto -mhtm -mpower8-fusion -mpower8-vector -mquad-memory -mquad-memory-atomic -mfloat128 -mfloat128-hardware -mprefixed -mpcrel -mmma -mrop-protect
Набор параметров для конкретного процессора меняется между версиями компилятора в зависимости от настроек, которые, по-видимому, генерируют оптимальный код для этого процессора; это необязательно отражает реальные возможности оборудования. Если требуется установить отдельный параметр в определённое значение, его можно указать после параметра -mcpu, например, -mcpu=970 -mno-altivec.
В AIX параметры -maltivec и -mpowerpc64 не включаются и не отключаются параметром -mcpu в настоящий момент, так как AIX не имеет полной поддержки этих параметров. Вы всё ещё можете включать или выключать их индивидуально, если уверены, что это сработает в вашей среде.
-mtune=cpu_type-
Устанавливает параметры планирования инструкций для типа машины cpu_type, но не устанавливает тип архитектуры или использование регистров, как -mcpu=cpu_type. Те же значения для cpu_type используются для -mtune, что и для -mcpu. Если оба параметра указаны, сгенерированный код использует архитектуру и регистры, установленные -mcpu, но параметры планирования, установленные -mtune.
-mcmodel=small-
Генерирует код PowerPC64 для малой модели: TOC ограничен 64 КБ.
-mcmodel=medium-
Генерирует код PowerPC64 для средней модели: TOC и другие статические данные могут иметь размер до 4 ГБ в сумме. Это значение по умолчанию для 64-битной Linux.
-mcmodel=large-
Генерирует код PowerPC64 для большой модели: TOC может иметь размер до 4 ГБ. Другие данные и код ограничены только 64-битной адресной пространством.
-maltivec-mno-altivec-
Генерирует код, который использует (не использует) инструкции AltiVec, а также включает использование встроенных функций, которые позволяют более прямой доступ к набору инструкций AltiVec. Возможно, также потребуется установить -mabi=altivec для изменения текущей ABI с улучшениями ABI AltiVec.
Когда используется -maltivec, порядок элементов для AltiVec-встроенных функций, таких как
vec_splat,vec_extract, иvec_insert, соответствует порядку элементов массива, соответствующему порядку байтов целевой платформы. То есть, элемент ноль идентифицирует самый левый элемент в регистре вектора при нацеливании на платформу с big-endian, и идентифицирует самый правый элемент в регистре вектора при нацеливании на платформу с little-endian. -mvrsave-mno-vrsave-
Генерирует инструкции VRSAVE при генерации кода AltiVec.
-msecure-plt-
Генерирует код, который позволяет
ldиld.soсоздавать исполняемые файлы и общие библиотеки с неисполняемыми.pltи.gotсекциями. Это параметр PowerPC 32-битной SYSV ABI. -mbss-plt-
Генерирует код, использующий секцию BSS
.plt, которуюld.soзаполняет, и требует секции.pltи.got, которые являются одновременно записываемыми и исполняемыми. Это параметр PowerPC 32-битной SYSV ABI. -misel-mno-isel-
Этот переключатель включает или отключает генерацию инструкций ISEL.
-mvsx-mno-vsx-
Генерирует код, который использует (не использует) векторные/скалярные (VSX) инструкции, а также включает использование встроенных функций, которые позволяют более прямой доступ к набору инструкций VSX.
-mcrypto-mno-crypto-
Включает (отключает) использование встроенных функций, которые позволяют прямой доступ к криптографическим инструкциям, добавленным в версию 2.07 ISA PowerPC.
-mhtm-mno-htm-
Включает (отключает) использование встроенных функций, которые позволяют прямой доступ к инструкциям Hardware Transactional Memory (HTM), добавленным в версию 2.07 ISA PowerPC.
-mpower8-fusion-mno-power8-fusion-
Генерирует код, который сохраняет (не сохраняет) некоторые целочисленные операции рядом, чтобы инструкции могли быть объединены вместе на процессорах power8 и более поздних процессорах.
-mpower8-vector-mno-power8-vector-
Генерирует код, который использует (не использует) векторные и скалярные инструкции, добавленные в версии 2.07 ISA PowerPC. Также включает использование встроенных функций, которые позволяют более прямой доступ к векторным инструкциям.
-mquad-memory-mno-quad-memory-
Генерирует код, который использует (не использует) неатомарные инструкции для памяти с четырьмя словами. Параметр -mquad-memory требует использования 64-битного режима.
-mquad-memory-atomic-mno-quad-memory-atomic-
Генерирует код, который использует (не использует) атомарные инструкции для памяти с четырьмя словами. Параметр -mquad-memory-atomic требует использования 64-битного режима.
-mfloat128-mno-float128
-
Включить/отключить ключевое слово __float128 для плавающей точки IEEE 128-битного формата и использовать либо программную эмуляцию для плавающей точки IEEE 128-битного формата, либо аппаратные инструкции.
Для использования поддержки плавающей точки IEEE 128-битного формата необходимо включить набор инструкций VSX (-mvsx). Поддержка плавающей точки IEEE 128-битного формата поддерживается только в Linux.
По умолчанию -mfloat128 включена в системах PowerPC Linux, использующих набор инструкций VSX, и отключена в других системах.
Если вы используете набор инструкций ISA 3.0 (-mpower9-vector или -mcpu=power9) на 64-битной системе, поддержка плавающей точки IEEE 128-битного формата также включит генерацию инструкций плавающей точки IEEE 128-битного формата ISA 3.0. В противном случае, если вы не указали генерацию инструкций ISA 3.0 или нацеливаетесь на 32-битную систему с порядком байтов big endian, плавающая точка IEEE 128-битного формата будет реализована с помощью программной эмуляции.
-mfloat128-hardware-mno-float128-hardware-
Включить/отключить использование аппаратных инструкций ISA 3.0 для поддержки типа данных __float128.
По умолчанию -mfloat128-hardware включена в системах PowerPC Linux, использующих набор инструкций ISA 3.0, и отключена в других системах.
-m32-m64-
Генерировать код для 32-битных или 64-битных сред целей Darwin и SVR4 (включая GNU/Linux). 32-битная среда устанавливает int, long и указатель в 32 бита и генерирует код, который работает на любом варианте PowerPC. 64-битная среда устанавливает int в 32 бита, а long и указатель в 64 бита и генерирует код для PowerPC64, как для -mpowerpc64.
-mfull-toc-mno-fp-in-toc-mno-sum-in-toc-mminimal-toc-
Изменить генерацию TOC (Table Of Contents), который создаётся для каждого исполняемого файла. Опция -mfull-toc выбрана по умолчанию. В этом случае GCC выделяет как минимум одну запись TOC для каждой уникальной ссылки на переменную, не являющуюся автоматической, в вашей программе. GCC также помещает константы с плавающей точкой в TOC. Однако в TOC доступно только 16 384 записи.
Если вы получаете сообщение об ошибке компоновщика, говорящее о переполнении доступного пространства TOC, вы можете уменьшить используемое пространство TOC с помощью опций -mno-fp-in-toc и -mno-sum-in-toc. -mno-fp-in-toc предотвращает размещение GCC констант с плавающей точкой в TOC, а -mno-sum-in-toc заставляет GCC генерировать код для вычисления суммы адреса и константы во время выполнения вместо размещения этой суммы в TOC. Вы можете указать одну или обе эти опции. Каждая из них приводит к созданию кода, который работает немного медленнее и больше по размеру в ущерб сохранению пространства TOC.
Если у вас всё ещё не хватает места в TOC, даже когда вы указали обе эти опции, укажите -mminimal-toc вместо этого. Эта опция заставляет GCC создавать только одну запись TOC для каждого файла. При указании этой опции GCC генерирует код, который работает медленнее и больше по размеру, но использует очень мало места в TOC. Вы можете использовать эту опцию только для файлов, содержащих код, который выполняется реже.
-maix64-maix32-
Включить 64-битную ABI и соглашение о вызовах AIX: 64-битные указатели, 64-битный тип
long, и инфраструктура, необходимая для их поддержки. Указание -maix64 подразумевает -mpowerpc64, в то время как -maix32 отключает 64-битную ABI и подразумевает -mno-powerpc64. GCC по умолчанию использует -maix32. -mxl-compat-mno-xl-compat-
Создать код, более соответствующий семантике компилятора IBM XL при использовании совместимой с AIX ABI. Передавать аргументы с плавающей точкой типизированным функциям в зону сохранения регистров (RSA) на стеке в дополнение к аргументам FPR. Не предполагать, что наиболее значимая двойка в 128-битном значении long double корректно округляется при сравнении значений и преобразовании в double. Использовать имена символов XL для функций поддержки long double.
Соглашение о вызовах AIX было расширено, но первоначально не документировано, чтобы обработать редкий случай K&R C, в котором вызывается функция, принимающая адрес своих аргументов с меньшим количеством аргументов, чем объявлено. Компиляторы IBM XL обращаются к аргументам с плавающей точкой, которые не помещаются в RSA, со стека, когда подпрограмма компилируется без оптимизации. Поскольку постоянное хранение аргументов с плавающей точкой на стеке является неэффективным и редко необходимым, эта опция по умолчанию отключена и необходима только при вызове подпрограмм, скомпилированных компиляторами IBM XL без оптимизации.
-mpe-
Поддержка среды IBM RS/6000 SP Parallel Environment (PE). Связать приложение, написанное для использования передачи сообщений, со специальным стартовым кодом, чтобы приложение могло работать. Система должна иметь PE, установленную в стандартном месте (/usr/lpp/ppe.poe/), или файл specs должен быть переопределён с помощью опции -specs= для указания соответствующего расположения каталога. Параллельная среда не поддерживает потоки, поэтому опция -mpe и опция -pthread несовместимы.
-malign-natural-malign-power-
В AIX, 32-битных Darwin и 64-битных PowerPC GNU/Linux опция -malign-natural переопределяет определённое ABI выравнивание более крупных типов, таких как плавающая точка doubles, на границе их естественного размера. Опция -malign-power указывает GCC следовать правилам выравнивания, указанным в ABI. GCC по умолчанию использует стандартное выравнивание, определённое в ABI.
В 64-битных Darwin естественное выравнивание является значением по умолчанию, и -malign-power не поддерживается.
-msoft-float-mhard-float-
Генерировать код, который не использует (использует) набор регистров с плавающей точкой. Программная эмуляция плавающей точки предоставляется, если вы используете опцию -msoft-float, и передаёте эту опцию GCC при компоновке.
-mmultiple-mno-multiple-
Генерировать код, использующий (не использующий) инструкции загрузки и сохранения нескольких слов. Эти инструкции генерируются по умолчанию на системах POWER и не генерируются на системах PowerPC. Не используйте -mmultiple на системах PowerPC с порядком байтов little-endian, так как эти инструкции не работают, когда процессор находится в режиме little-endian. Исключение составляют PPC740 и PPC750, которые допускают эти инструкции в режиме little-endian.
-mupdate-mno-update-
Генерировать код, использующий (не использующий) инструкции загрузки или сохранения, которые обновляют базовый регистр до адреса рассчитанного расположения памяти. Эти инструкции генерируются по умолчанию. Если вы используете -mno-update, существует небольшой интервал времени между обновлением указателя стека и сохранением адреса предыдущей рамки, что означает, что код, проходящий по рамке стека через прерывания или сигналы, может получить повреждённые данные.
-mavoid-indexed-addresses-mno-avoid-indexed-addresses-
Генерировать код, пытающийся избежать (не избегать) использования индексированных инструкций загрузки или сохранения. Эти инструкции могут вызвать штраф производительности на процессорах Power6 в определённых ситуациях, таких как при прохождении по большим массивам, которые пересекают границу 16М. Эта опция включена по умолчанию при нацеливании на Power6 и отключена в противном случае.
-mfused-madd-mno-fused-madd-
Генерировать код, использующий (не использующий) инструкции умножения и накопления с плавающей точкой. Эти инструкции генерируются по умолчанию, если используется аппаратная плавающая точка. Зависимая от машины опция -mfused-madd теперь сопоставляется с независимой от машины опцией -ffp-contract=fast, а -mno-fused-madd сопоставляется с -ffp-contract=off.
-mmulhw-mno-mulhw-
Генерировать код, использующий (не использующий) инструкции умножения и умножения-накопления полуслов на процессорах IBM 405, 440, 464 и 476. Эти инструкции генерируются по умолчанию при нацеливании на эти процессоры.
-mdlmzb-mno-dlmzb-
Генерировать код, использующий (не использующий) инструкцию поиска строки «dlmzb» на процессорах IBM 405, 440, 464 и 476. Эта инструкция генерируется по умолчанию при нацеливании на эти процессоры.
-mno-bit-align-mbit-align-
В системах System V.4 и встраиваемых системах PowerPC не (не) принудительно выравнивать структуры и объединения, содержащие битовые поля, к базовому типу битового поля.
Например, по умолчанию структура, содержащая только 8
unsignedбитовых полей длиной 1, выравнивается до границы 4 байта и имеет размер 4 байта. Используя -mno-bit-align, структура выравнивается до границы 1 байта и имеет размер 1 байт. -mno-strict-align-mstrict-align-
В системах System V.4 и встраиваемых системах PowerPC не (не) предполагается, что обращения к невыровненной памяти обрабатываются системой.
-mrelocatable-mno-relocatable-
Генерировать код, который позволяет (не позволяет) перемещать статический исполняемый файл в другой адрес во время выполнения. Простой загрузчик встраиваемой системы PowerPC должен переместить всё содержимое
.got2и 4-байтовые расположения, перечисленные в разделе.fixup, таблицу 32-битных адресов, сгенерированную этой опцией. Для этого все объединённые объекты должны быть скомпилированы с -mrelocatable или -mrelocatable-lib. -mrelocatable выравнивает стек до границы 8 байт. -mrelocatable-lib-mno-relocatable-lib-
Подобно -mrelocatable, -mrelocatable-lib генерирует раздел
.fixup, чтобы позволить статическим исполняемым файлам перемещаться во время выполнения, но -mrelocatable-lib не использует меньшее выравнивание стека -mrelocatable. Объекты, скомпилированные с -mrelocatable-lib, могут быть связаны с объектами, скомпилированными с любой комбинацией опций -mrelocatable. -mno-toc-mtoc-
В системах System V.4 и встраиваемых системах PowerPC не (не) предполагается, что регистр 2 содержит указатель на глобальную область, указывающую на адреса, используемые в программе.
-mlittle-mlittle-endian-
В системах System V.4 и встраиваемых системах PowerPC компилировать код для процессора в режиме little-endian. Опция -mlittle-endian эквивалентна -mlittle.
-mbig-mbig-endian
-
В системах System V.4 и встроенных системах PowerPC компилируйте код для процессора в режиме big-endian. Опция -mbig-endian эквивалентна опции -mbig.
-mdynamic-no-pic-
В системах Darwin и Mac OS X компилируйте код так, чтобы он не был переместимым, но его внешние ссылки были переместимыми. Полученный код подходит для приложений, но не для общих библиотек.
-msingle-pic-base-
Обращайтесь к регистру, используемому для адресации PIC, как к только для чтения, а не загружайте его в прологе для каждой функции. Система времени выполнения отвечает за инициализацию этого регистра подходящим значением перед началом выполнения.
-mprioritize-restricted-insns=priority-
Эта опция управляет приоритетом, который назначается инструкциям с ограничением ввода-вывода во время второго прохода планирования. Аргумент priority принимает значения ‘0’, ‘1’ или ‘2’, чтобы назначить отсутствие, максимальный или второй по величине приоритет (соответственно) инструкциям с ограничением ввода-вывода.
-msched-costly-dep=dependence_type-
Эта опция управляет тем, какие зависимости считаются дорогостоящими для целевого процессора во время планирования инструкций. Аргумент dependence_type принимает одно из следующих значений:
- ‘no’
-
Ни одна зависимость не является дорогостоящей.
- ‘all’
-
Все зависимости являются дорогостоящими.
- ‘true_store_to_load’
-
Истинная зависимость от записи к чтению является дорогостоящей.
- ‘store_to_load’
-
Любая зависимость от записи к чтению является дорогостоящей.
- number
Любая зависимость, для которой задержка больше или равна number, является дорогостоящей.
-minsert-sched-nops=scheme-
Эта опция управляет схемой вставки NOP, используемой во время второго прохода планирования. Аргумент scheme принимает одно из следующих значений:
- ‘no’
-
Не вставлять NOP.
- ‘pad’
-
Заполнять NOP любой группой ввода-вывода, у которой есть свободные слоты выдачи, в соответствии с группировкой планировщика.
- ‘regroup_exact’
-
Вставлять NOP для принудительного разделения дорогостоящих зависимых инструкций на отдельные группы. Вставить ровно столько NOP, сколько необходимо, чтобы переместить инструкцию в новую группу, в соответствии с оценочной группировкой процессора.
- number
Вставлять NOP для принудительного разделения дорогостоящих зависимых инструкций на отдельные группы. Вставить number NOP для принудительного перемещения инструкции в новую группу.
-mcall-sysv-
В системах System V.4 и встроенных системах PowerPC компилируйте код, используя соглашения о вызовах, которые соответствуют черновику спецификации System V Application Binary Interface, дополнению для процессоров PowerPC от марта 1995 года. Это значение по умолчанию, если вы не настраивали GCC, используя ‘powerpc-*-eabiaix’.
-mcall-sysv-eabi-mcall-eabi-
Укажите обе опции -mcall-sysv и -meabi.
-mcall-sysv-noeabi-
Укажите обе опции -mcall-sysv и -mno-eabi.
-mcall-aixdesc-
В системах System V.4 и встроенных системах PowerPC компилируйте код для операционной системы AIX.
-mcall-linux-
В системах System V.4 и встроенных системах PowerPC компилируйте код для GNU-системы на базе Linux.
-mcall-freebsd-
В системах System V.4 и встроенных системах PowerPC компилируйте код для операционной системы FreeBSD.
-mcall-netbsd-
В системах System V.4 и встроенных системах PowerPC компилируйте код для операционной системы NetBSD.
-mcall-openbsd-
В системах System V.4 и встроенных системах PowerPC компилируйте код для операционной системы OpenBSD.
-mtraceback=traceback_type-
Выберите тип таблицы отслеживания. Допустимые значения для traceback_type — ‘full’, ‘part’ и ‘no’.
-maix-struct-return-
Возвращайте все структуры в памяти (как указано в спецификации AIX ABI).
-msvr4-struct-return-
Возвращайте структуры размером менее 8 байт в регистрах (как указано в спецификации SVR4 ABI).
-mabi=abi-type-
Расширьте текущую ABI с помощью определенного расширения или удалите его. Допустимые значения: ‘altivec’, ‘no-altivec’, ‘ibmlongdouble’, ‘ieeelongdouble’, ‘elfv1’, ‘elfv2’, и для AIX: ‘vec-extabi’, ‘vec-default’.
-mabi=ibmlongdouble-
Измените текущую ABI, чтобы использовать IBM расширенную точность long double. Вероятно, это не сработает, если ваша система по умолчанию использует IEEE расширенную точность long double. Если вы измените тип long double с IEEE расширенной точности, компилятор выведет предупреждение, если вы не используете опцию -Wno-psabi. Требуется включить -mlong-double-128.
-mabi=ieeelongdouble-
Измените текущую ABI, чтобы использовать IEEE расширенную точность long double. Вероятно, это не сработает, если ваша система по умолчанию использует IBM расширенную точность long double. Если вы измените тип long double с IBM расширенной точности, компилятор выведет предупреждение, если вы не используете опцию -Wno-psabi. Требуется включить -mlong-double-128.
-mabi=elfv1-
Измените текущую ABI на использование ELFv1 ABI. Это ABI по умолчанию для big-endian PowerPC 64-битного Linux. Переопределение ABI по умолчанию требует специальной поддержки системы и может привести к неожиданным результатам.
-mabi=elfv2-
Измените текущую ABI на использование ELFv2 ABI. Это ABI по умолчанию для little-endian PowerPC 64-битного Linux. Переопределение ABI по умолчанию требует специальной поддержки системы и может привести к неожиданным результатам.
-mno-gnu-attribute-
Генерируйте ассемблерные директивы .gnu_attribute для задания пар «тег/значение» в секции .gnu.attributes, которые указывают на вариации ABI в параметрах функций или возвращаемых значениях.
-mprototype-mno-prototype-
В системах System V.4 и встроенных системах PowerPC предполагается, что все вызовы функций с переменным числом аргументов должным образом проинициализированы. В противном случае компилятор должен вставить инструкцию перед каждым вызовом без прототипирования для установки или сброса бита 6 регистра состояния условия (
CR) для указания того, передаются ли значения с плавающей точкой в регистрах с плавающей точкой в случае, если функция принимает переменное количество аргументов. С -mprototype только вызовы проинициализированных функций с переменным количеством аргументов устанавливают или сбрасывают бит. -msim-
В встроенных системах PowerPC предполагается, что модуль загрузки называется sim-crt0.o, а стандартные библиотеки C — libsim.a и libc.a. Это значение по умолчанию для конфигураций ‘powerpc-*-eabisim’.
-mmvme-
В встроенных системах PowerPC предполагается, что модуль загрузки называется crt0.o, а стандартные библиотеки C — libmvme.a и libc.a.
-mads-
В встроенных системах PowerPC предполагается, что модуль загрузки называется crt0.o, а стандартные библиотеки C — libads.a и libc.a.
-myellowknife-
В встроенных системах PowerPC предполагается, что модуль загрузки называется crt0.o, а стандартные библиотеки C — libyk.a и libc.a.
-mvxworks-
В системах System V.4 и встроенных системах PowerPC укажите, что вы компилируете для системы VxWorks.
-memb-
В встроенных системах PowerPC установите бит
PPC_EMBв заголовке флагов ELF, чтобы указать, что используются расширенные перестановки ‘eabi’. -mno-eabi-
В системах System V.4 и встроенных системах PowerPC соблюдать (не соблюдать) Embedded Applications Binary Interface (EABI), который представляет собой набор изменений в спецификациях System V.4. Выбор -meabi означает, что стек выровнен по границе 8 байт, функция
__eabiвызывается изmainдля настройки среды EABI, и опция -msdata может использовать какr2, так иr13, чтобы указать на две отдельные области малых данных. Выбор -mno-eabi означает, что стек выровнен по границе 16 байт, функция инициализации EABI не вызывается изmain, и опция -msdata использует толькоr13для указания на одну область малых данных. Опция -meabi включена по умолчанию, если вы настраивали GCC с помощью одного из вариантов ‘powerpc*-*-eabi*’. -msdata=eabi-
В системах System V.4 и встроенных системах PowerPC помещайте малые инициализированные
constглобальные и статические данные в секцию.sdata2, на которую указывает регистрr2. Помещайте малые инициализированные не-constглобальные и статические данные в секцию.sdata, на которую указывает регистрr13. Помещайте малые неинициализированные глобальные и статические данные в секцию.sbss, которая примыкает к секции.sdata. Опция -msdata=eabi несовместима с опцией -mrelocatable. Опция -msdata=eabi также устанавливает опцию -memb. -msdata=sysv-
В системах System V.4 и встроенных системах PowerPC помещайте малые глобальные и статические данные в секцию
.sdata, на которую указывает регистрr13. Помещайте малые неинициализированные глобальные и статические данные в секцию.sbss, которая примыкает к секции.sdata. Опция -msdata=sysv несовместима с опцией -mrelocatable. -msdata=default-msdata-
В системах System V.4 и встроенных системах PowerPC, если используется -meabi, компилируйте код так же, как -msdata=eabi, в противном случае компилируйте код так же, как -msdata=sysv.
-msdata=data
-
В системах System V.4 и встраиваемых PowerPC помещайте небольшие глобальные данные в раздел
.sdata. Помещайте небольшие неинициализированные глобальные данные в раздел.sbss. Однако не используйте регистрr13для адресации небольших данных. Это поведение по умолчанию, если не используются другие параметры -msdata. -msdata=none-mno-sdata-
В системах встраиваемых PowerPC помещайте все инициализированные глобальные и статические данные в раздел
.data, а все неинициализированные данные — в раздел.bss. -mreadonly-in-sdata-
Помещайте только для чтения объекты в раздел
.sdataтакже. Это значение по умолчанию. -mblock-move-inline-limit=num-
Выполняйте все перемещения блоков (такие как вызовы
memcpyили копии структур) размером не более num байт. Минимальное значение для num составляет 32 байта для 32-битных целей и 64 байта для 64-битных целей. Значение по умолчанию зависит от целевой системы. -mblock-compare-inline-limit=num-
Генерируйте нециклический встроенный код для всех сравнений блоков (например, вызовов
memcmpили сравнений структур) размером не более num байт. Если num равно 0, отключено всё встроенное расширение (без циклов и с циклами) сравнения блоков. Значение по умолчанию зависит от целевой системы. -mblock-compare-inline-loop-limit=num-
Генерируйте встроенное расширение с циклическим кодом для всех сравнений блоков, которые меньше или равны num байтам, но больше предела для встроенного сравнения блоков без циклов. Если длина блока не постоянна, не более num байт будут сравниваться перед вызовом
memcmpдля сравнения остальной части блока. Значение по умолчанию зависит от целевой системы. -mstring-compare-inline-limit=num-
Сравнивайте не более num байт строки с помощью встроенного кода. Если различие или конец строки не найдены в конце встроенного сравнения, вызов
strcmpилиstrncmpпозаботятся об оставшейся части сравнения. Значение по умолчанию составляет 64 байта. -G num-
В системах встраиваемых PowerPC помещайте глобальные и статические элементы размером не более num байт в разделы небольших данных или BSS вместо обычных разделов данных или BSS. По умолчанию num равно 8. Переключатель -G num также передаётся в компоновщик. Все модули должны быть скомпилированы с одинаковым значением -G num.
-mregnames-mno-regnames-
В системах System V.4 и встраиваемых PowerPC (выводить/не выводить) имена регистров в выходном коде ассемблера с использованием символических форм.
-mlongcall-mno-longcall-
По умолчанию предполагается, что все вызовы находятся далеко, поэтому требуется более длинная и дорогостоящая последовательность вызова. Это требуется для вызовов, удалённых более чем на 32 мегабайта (33 554 432 байта) от текущего места. Короткий вызов генерируется, если компилятор знает, что вызов не может быть так далёк. Этот параметр может быть переопределён атрибутом функции
shortcallили#pragma longcall(0).Некоторые компоновщики способны обнаруживать вызовы, выходящие за пределы диапазона, и генерировать код-прокладку на лету. В этих системах длинные вызовы не нужны и генерируют более медленный код. На данный момент компоновщик AIX может это сделать, как и компоновщик GNU для PowerPC/64. Планируется добавить эту функцию в компоновщик GNU для 32-битных систем PowerPC.
В системах PowerPC64 ELFv2 и 32-битных системах PowerPC с более новыми компоновщиками GNU GCC может генерировать длинные вызовы с использованием встроенной последовательности вызовов PLT (см. -mpltseq). PowerPC с -mbss-plt и PowerPC64 ELFv1 (big-endian) не поддерживают встроенные вызовы PLT.
В системах Darwin/PPC
#pragma longcallгенерируетjbsr callee, L42, плюс остров ветвления (код-прокладка). Два целевых адреса представляют вызываемую функцию и остров ветвления. Компоновщик Darwin/PPC предпочитает первый адрес и генерируетbl callee, если инструкция PPCblнапрямую достигает вызываемую функцию; в противном случае компоновщик генерируетbl L42для вызова острова ветвления. Остров ветвления добавляется в тело вызывающей функции; он вычисляет полный 32-битный адрес вызываемой функции и переходит к нему.В системах Mach-O (Darwin) этот параметр направляет компилятор на включение прокладки для каждого прямого вызова, а компоновщик Darwin решает, использовать её или отбросить.
В будущем GCC может игнорировать все спецификации longcall, когда компоновщик известен как генерирующий прокладку.
-mpltseq-mno-pltseq-
Реализовать (не реализовывать) -fno-plt и длинные вызовы с использованием встроенной последовательности вызовов PLT, которая поддерживает ленивую компоновку и длинные вызовы функций в динамически подключаемых библиотеках. Встроенные вызовы PLT поддерживаются только в системах PowerPC64 ELFv2 и 32-битных системах PowerPC с более новыми компоновщиками GNU и включены по умолчанию, если поддержка обнаружена при конфигурировании GCC, а в случае 32-битного PowerPC, если GCC сконфигурирован с --enable-secureplt. Код -mpltseq и переносимые объекты 32-битного PowerPC -mbss-plt не могут быть связаны вместе.
-mtls-markers-mno-tls-markers-
Помечать (не помечать) вызовы
__tls_get_addrрелокацией, указывающей на аргумент функции. Релокация позволяет компоновщику надёжно связать вызов функции с инструкциями подготовки аргумента для оптимизации TLS, что, в свою очередь, позволяет GCC лучше планировать последовательность. -mrecip-mno-recip-
Этот параметр включает использование оценок обратных величин и оценок обратных квадратных корней с дополнительными шагами Ньютона-Рафсона для повышения точности вместо выполнения деления или извлечения квадратного корня и деления для аргументов с плавающей запятой. Вы должны использовать параметр -ffast-math при использовании -mrecip (или по крайней мере -funsafe-math-optimizations, -ffinite-math-only, -freciprocal-math и -fno-trapping-math). Обратите внимание, что, хотя производительность последовательности обычно выше, чем производительность инструкции без обратной величины, точность последовательности может быть снижена до 2 ulp (то есть обратное 1,0 равно 0,99999994) для обратных квадратных корней.
-mrecip=opt-
Этот параметр управляет использованием инструкций оценки обратных величин. opt — это список параметров, разделённых запятыми, которые могут быть предварены
!для инвертирования параметра:- ‘all’
Включить все инструкции оценки.
- ‘default’
Включить инструкции по умолчанию, эквивалентные -mrecip.
- ‘none’
Отключить все инструкции оценки, эквивалентные -mno-recip.
- ‘div’
Включить инструкции приближения обратных величин для одинарной и двойной точности.
- ‘divf’
Включить инструкции приближения обратных величин одинарной точности.
- ‘divd’
Включить инструкции приближения обратных величин двойной точности.
- ‘rsqrt’
Включить инструкции приближения обратных квадратных корней для одинарной и двойной точности.
- ‘rsqrtf’
Включить инструкции приближения обратных квадратных корней одинарной точности.
- ‘rsqrtd’
Включить инструкции приближения обратных квадратных корней двойной точности.
Например, -mrecip=all,!rsqrtd включает все инструкции оценки обратных величин, кроме
FRSQRTE,XSRSQRTEDP, иXVRSQRTEDPинструкций, которые обрабатывают вычисления обратных квадратных корней двойной точности. -mrecip-precision-mno-recip-precision-
Предполагать (не предполагать), что инструкции оценки обратных величин предоставляют более точные оценки, чем предписывает ABI PowerPC. Выбор -mcpu=power6, -mcpu=power7 или -mcpu=power8 автоматически выбирает -mrecip-precision. Инструкции оценки обратных квадратных корней двойной точности не генерируются по умолчанию на машинах с низкой точностью, поскольку они не обеспечивают оценку, которая сходится после трёх шагов.
-mveclibabi=type-
Указывает тип ABI для использования при векторизации встроенных функций с помощью внешней библиотеки. В настоящее время поддерживается только тип ‘mass’, который указывает на использование библиотек IBM Mathematical Acceleration Subsystem (MASS) для векторизации встроенных функций с использованием внешних библиотек. В настоящее время GCC генерирует вызовы
acosd2,acosf4,acoshd2,acoshf4,asind2,asinf4,asinhd2,asinhf4,atan2d2,atan2f4,atand2,atanf4,atanhd2,atanhf4,cbrtd2,cbrtf4,cosd2,cosf4,coshd2,coshf4,erfcd2,erfcf4,erfd2,erff4,exp2d2,exp2f4,expd2,expf4,expm1d2,expm1f4,hypotd2,hypotf4,lgammad2,lgammaf4,log10d2,log10f4,log1pd2,log1pf4,log2d2,log2f4,logd2,logf4,powd2,powf4,sind2,sinf4,sinhd2,sinhf4,sqrtd2,sqrtf4,tand2,tanf4,tanhd2, иtanhf4при генерации кода для power7. Также должны быть включены как -ftree-vectorize, так и -funsafe-math-optimizations. Библиотеки MASS должны быть указаны во время компоновки. -mfriz-mno-friz-
Генерировать (не генерировать) инструкцию
frizпри использовании параметра -funsafe-math-optimizations для оптимизации округления значений с плавающей запятой до 64-битного целого и обратно в число с плавающей запятой. Инструкцияfrizне возвращает то же самое значение, если число с плавающей запятой слишком велико, чтобы поместиться в целое. -mpointers-to-nested-functions-mno-pointers-to-nested-functions
-
Генерировать (не генерировать) код для загрузки статического регистра цепочки (
r11) при вызове через указатель на системах AIX и 64-битных Linux, где указатель функции указывает на 3-словный дескриптор, содержащий адрес функции, значение TOC, которое должно быть загружено в регистрr2, и значение статической цепочки, которое должно быть загружено в регистрr11. Опция -mpointers-to-nested-functions включена по умолчанию. Вы не можете вызывать через указатели на вложенные функции или указатели на функции, скомпилированные на других языках, использующих статическую цепочку, если вы используете -mno-pointers-to-nested-functions. -msave-toc-indirect-mno-save-toc-indirect-
Генерировать (не генерировать) код для сохранения значения TOC в зарезервированном местоположении стека в преамбуле функции, если функция вызывает через указатель на системах AIX и 64-битных Linux. Если значение TOC не сохраняется в преамбуле, оно сохраняется непосредственно перед вызовом через указатель. Опция -mno-save-toc-indirect используется по умолчанию.
-mcompat-align-parm-mno-compat-align-parm-
Генерировать (не генерировать) код для передачи параметров структуры с максимальным выравниванием 64 бита, для совместимости со старыми версиями GCC.
Старые версии GCC (до 4.9.0) неправильно не выравнивали параметр структуры на границе 128 бит, когда эта структура содержала член, требующий выравнивания 128 бит. Это исправлено в более новых версиях GCC. Данная опция может быть использована для генерации кода, совместимого с функциями, скомпилированными с более старыми версиями GCC.
Опция -mno-compat-align-parm используется по умолчанию.
-mstack-protector-guard=guard-mstack-protector-guard-reg=reg-mstack-protector-guard-offset=offset-mstack-protector-guard-symbol=symbol-
Генерировать код защиты стека, используя канни в guard. Доступные расположения: ‘global’ для глобального канни или ‘tls’ для канни на поток в блоке TLS (по умолчанию для GNU libc версии 2.4 или более поздней).
В последнем случае опции -mstack-protector-guard-reg=reg и -mstack-protector-guard-offset=offset дополнительно указывают, какой регистр использовать в качестве базового регистра для чтения канни, и с каким смещением от этого базового регистра. По умолчанию для них используются значения, определенные в соответствующей ABI. -mstack-protector-guard-symbol=symbol переопределяет смещение ссылом на символ канни в блоке TLS.
-mpcrel-mno-pcrel-
Генерировать (не генерировать) pc-относительное адресование. Опция -mpcrel требует включения опций модели кода среднего размера (-mcmodel=medium) и адресования с префиксом (-mprefixed).
-mprefixed-mno-prefixed-
Генерировать (не генерировать) режимы адресации, использующие инструкции префиксной загрузки и сохранения. Опция -mprefixed требует включения опции -mcpu=power10 (или более поздней версии).
-mmma-mno-mma-
Генерировать (не генерировать) инструкции MMA. Опция -mma требует включения опции -mcpu=power10 (или более поздней версии).
-mrop-protect-mno-rop-protect-
Генерировать (не генерировать) инструкции защиты ROP, когда целевой процессор их поддерживает. В настоящее время эта опция отключает оптимизацию shrink-wrap (-fshrink-wrap).
-mprivileged-mno-privileged-
Генерировать (не генерировать) код, который будет выполняться в привилегированном режиме.
-mblock-ops-unaligned-vsx-mno-block-ops-unaligned-vsx-
Генерировать (не генерировать) невыровненные загрузки и сохранения VSX для встроенной расшифровки
memcpyиmemmove.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/RS_002f6000-and-PowerPC-Options.html