Включите NEON на Cortex A8, если для fpu установлено значение SoftVFP или нет - PullRequest
0 голосов
/ 17 января 2012

Я пытаюсь создать исполняемый файл для Cortex A8, используя RVDS 4.0. Мой код использует NEON, но я хочу установить для параметра fpu значение none или SoftVFP. На веб-сайте ARM упоминается, что NEON отключен, если для fpu установлено значение SoftVFP. Это потому, что VFP и NEON делят регистры?

Может кто-нибудь объяснить, почему я не могу использовать NEON, если для fpu установлено значение SoftVFP, или если есть какая-либо опция, с помощью которой я могу включить NEON, даже если для fpu установлено значение SOftVFP?

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 января 2014

Да, регистры NEON и VFP являются общими. Это упрощает поддержку переключения контекста операционной системы, поскольку любая ОС, осведомленная о VFP, также будет правильно обрабатывать NEON.

Небезопасно связывать код, созданный для softVFP, с кодом, созданным для аппаратного VFP, потому что они помещают аргументы / результаты функций в разные регистры - использование NEON во многом похоже на использование аппаратного VFP в этом отношении.

Существует особый случай, когда вам нужно связываться с библиотеками SoftVFP, но вы знаете, что ваш SoC его поддерживает (знаете ли вы это? Существует множество A8 без NEON). Особый случай называется softvfp +. Это работает так, что аргументы функций передаются в целочисленных регистрах, но внутри функций компилятор может использовать FPU, или вы можете использовать NEON. Для компилятора ARM, нацеленного на CortexA8 с NEON, вы должны использовать "--fpu = softvfp + vfpv3"

См. Это для некоторых опций компилятора ARM, связанных с этим. Многие другие компиляторы имеют аналогичные ключи.

Для компиляторов ARV RVCT3.x и выше вам понадобится (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/CIHCJIFE.html):

softvfp + VFPv3

Выбирает аппаратный векторный модуль с плавающей точкой, соответствующий VFPv3, с программной связью с плавающей точкой. Выберите эту опцию, если вы взаимодействуете код Thumb с кодом ARM в системе, в которой реализован модуль VFPv3.

Для GCC вам понадобится "-mfloat-abi = softfp", и я думаю, "-mfpu =‘ neon ’". Из руководства GCC (http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html):

-mfloat-аби = имя

Указывает, какой ABI с плавающей точкой использовать. Допустимые значения: «soft», «softfp» и «hard». При указании «soft» GCC генерирует выходные данные, содержащие библиотечные вызовы для операций с плавающей запятой. «Softfp» позволяет генерировать код с использованием аппаратных инструкций с плавающей запятой, но по-прежнему использует соглашения о вызовах с плавающей запятой. «Hard» позволяет генерировать инструкции с плавающей запятой и использует специфичные для FPU соглашения о вызовах.

Значение по умолчанию зависит от конкретной целевой конфигурации. Обратите внимание, что жесткие и мягкие ABI не совместимы по ссылкам; Вы должны скомпилировать всю программу с тем же ABI и связать с совместимым набором библиотек.

0 голосов
/ 23 февраля 2012

почему бы просто не использовать --cpu = 7-A? это должно подразумевать наличие правильной опции --fpu

softvfp - библиотека эмуляции, я думаю, NEON просто не реализован

...