3.19.62 Параметры Xtensa ¶
Эти параметры поддерживаются для целей Xtensa:
-mconst16-mno-const16-
Включить или отключить использование инструкций
CONST16для загрузки константных значений. ИнструкцияCONST16в настоящее время не является стандартным параметром Tensilica. При включении инструкцииCONST16всегда используются вместо стандартных инструкцийL32R. Использование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 ассемблерный код всё ещё показывает прямые инструкции вызова — посмотрите на дизассемблированный объектный код, чтобы увидеть фактические инструкции. Обратите внимание, что ассемблер использует косвенный вызов для каждого межфайлового вызова, а не только тех, которые действительно находятся вне диапазона.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/Xtensa-Options.html