3.20.57 Параметры Xtensa
Для целей Xtensa поддерживаются следующие параметры:
-
-mconst16 -mno-const16-
Включает или отключает использование инструкций
CONST16для загрузки константных значений. ИнструкцияCONST16в настоящее время не является стандартным параметром Tensilica. Если параметр включён, вместо стандартных инструкцийL32Rвсегда используются инструкцииCONST16. ИспользованиеCONST16включено по умолчанию только в том случае, если инструкцияL32Rнедоступна. -
-mfused-madd -mno-fused-madd-
Включает или отключает использование инструкций слитного умножения со сложением и вычитанием при включённом параметре плавающей запятой. Этот параметр не действует, если параметр плавающей запятой также не включён. Отключение инструкций слитного умножения со сложением и вычитанием заставляет компилятор использовать отдельные инструкции для операций умножения и сложения/вычитания. В некоторых случаях это может быть желательно, когда требуются результаты, строго соответствующие IEEE 754: инструкции слитного умножения со сложением/вычитанием не округляют промежуточный результат и тем самым дают результаты с большей точностью, чем предусмотрено стандартом IEEE. Отключение инструкций слитного умножения со сложением/вычитанием также гарантирует, что вывод программы не зависит от способности компилятора объединять операции умножения и сложения/вычитания.
-
-mserialize-volatile -mno-serialize-volatile-
Если этот параметр включён, GCC вставляет инструкции
MEMWперед обращениями к памятиvolatile, чтобы гарантировать последовательную согласованность. По умолчанию используется -mserialize-volatile. Используйте -mno-serialize-volatile, чтобы не вставлять инструкцииMEMW. -
-mforce-no-pic -
Для целей, например GNU/Linux, где весь пользовательский код Xtensa должен быть позиционно-независимым (PIC), этот параметр отключает PIC при компиляции кода ядра.
-
-mtext-section-literals -mno-text-section-literals-
Эти параметры управляют размещением пулов литералов. По умолчанию используется -mno-text-section-literals, при котором литералы помещаются в отдельную секцию выходного файла. Это позволяет размещать пул литералов в ОЗУ/ПЗУ данных, а также позволяет компоновщику объединять пулы литералов из отдельных объектных файлов, чтобы удалять избыточные литералы и уменьшать размер кода. При использовании -mtext-section-literals литералы размещаются вперемежку в текстовой секции, чтобы находиться как можно ближе к своим ссылкам. Это может потребоваться для больших файлов ассемблера. Литералы каждой функции размещаются непосредственно перед этой функцией.
-
-mauto-litpools -mno-auto-litpools-
Эти параметры управляют размещением пулов литералов. По умолчанию используется -mno-auto-litpools, при котором литералы помещаются в отдельную секцию выходного файла, если не используется -mtext-section-literals. При использовании -mauto-litpools ассемблер размещает литералы вперемежку в текстовой секции. Компилятор не генерирует явные директивы
.literalи загружает литералы в регистры с помощью инструкцийMOVIвместоL32R, чтобы ассемблер мог выполнять релаксацию и при необходимости размещать литералы. Этот параметр позволяет ассемблеру создавать несколько пулов литералов для каждой функции и собирать очень большие функции, что может быть невозможно при использовании -mtext-section-literals. -
-mtarget-align -mno-target-align-
Если этот параметр включён, GCC указывает ассемблеру автоматически выравнивать инструкции, чтобы уменьшить потери производительности при переходах за счёт некоторого снижения плотности кода. Ассемблер пытается расширять компактные инструкции, чтобы выравнивать цели переходов и инструкции, следующие за инструкциями вызова. Если перед целью недостаточно безопасных компактных инструкций для выравнивания, расширение не выполняется. По умолчанию используется -mtarget-align. Эти параметры не влияют на обработку автоматически выравниваемых инструкций, таких как
LOOP, которые ассемблер всегда выравнивает, расширяя компактные инструкции или вставляя инструкции NOP. -
-mlongcalls -mno-longcalls-
Если этот параметр включён, GCC указывает ассемблеру преобразовывать прямые вызовы в косвенные, если только он не может определить, что цель прямого вызова находится в диапазоне, допустимом для инструкции вызова. Обычно такое преобразование выполняется для вызовов функций из других исходных файлов. В частности, ассемблер преобразует прямую инструкцию
CALLв инструкциюL32R, за которой следует инструкцияCALLX. По умолчанию используется -mno-longcalls. Этот параметр следует использовать в программах, где цель вызова потенциально может находиться за пределами допустимого диапазона. Параметр реализован в ассемблере, а не в компиляторе, поэтому в ассемблерном коде, сгенерированном GCC, по-прежнему отображаются прямые инструкции вызова — фактические инструкции можно увидеть в дизассемблированном объектном коде. Обратите внимание: ассемблер использует косвенный вызов для каждого вызова между файлами, а не только для тех, которые действительно выходят за пределы диапазона. -
-mabi=name -
Генерирует код для указанного ABI. Допустимые значения: ‘call0’, ‘windowed’. ABI по умолчанию выбирается конфигурацией ядра Xtensa.
-
-mabi=call0 -
Если этот параметр включён, параметры функций передаются в регистрах
a2–a7, регистрыa12–a15сохраняются вызывающей функцией, а регистрa15может использоваться как указатель кадра стека. При включении этой версии ABI определяется символ препроцессора C__XTENSA_CALL0_ABI__. -
-mabi=windowed -
Если этот параметр включён, параметры функций передаются в регистрах
a10–a15, а вызываемая функция при входе циклически сдвигает окно регистров на 8 регистров, чтобы её аргументы находились в регистрахa2–a7. Регистрa7может использоваться как указатель кадра стека. При возврате окно регистров сдвигается обратно на 8 регистров. При включении этой версии ABI определяется символ препроцессора C__XTENSA_WINDOWED_ABI__. -
-mextra-l32r-costs=n -
Задаёт дополнительную стоимость доступа к инструкционной ОЗУ/ПЗУ для инструкций
L32Rв тактах. При оптимизации по скорости это влияет на выбор между загрузкой константы из пула литералов с помощьюL32Rи формированием константы из небольшой константы с помощью нескольких арифметических инструкций. Значение по умолчанию — 0. -
-mstrict-align -mno-strict-align-
Запрещает или разрешает генерировать обращения к памяти, которые могут быть не выровнены по естественной границе объекта, как описано в спецификации архитектуры. По умолчанию для ядер, поддерживающих аппаратную обработку невыровненных загрузок и сохранений, используется -mno-strict-align, а для всех остальных ядер — -mstrict-align.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Xtensa-Options.html