Да, регистры 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 и связать с совместимым набором библиотек.