我正在尝试使用RVDS 4.0为Cortex A8构建可执行文件。我的代码使用NEON,但我想将fpu选项设置为none或SoftVFP。 ARM网站提到当fpu设置为SoftVFP时,NEON被禁用。这是因为VFP和NEON共享寄存器吗?
有人可以解释为什么当fpu设置为SoftVFP时我不能使用NEON,或者是否有任何选项可以启用NEON,即使fpu设置为SOftVFP?
由于
答案 0 :(得分:0)
为什么不使用--cpu = 7-A?这应该意味着当前的--fpu选项
softvfp是一个仿真库,我猜NEON根本就没有实现
答案 1 :(得分:0)
是的,NEON和VFP寄存器是共享的。这简化了操作系统上下文切换支持,因为任何知道VFP的操作系统也将正确处理NEON。
将为softVFP构建的代码与为硬件VFP构建的代码链接是不安全的,因为它们将函数参数/结果放在不同的寄存器中 - 使用NEON就像使用硬件VFP一样。
但是有一个特例,当你必须链接SoftVFP库时,你碰巧知道你的SoC支持它(你知道吗?有很多A8没有NEON)。这种特殊情况称为softvfp +。这种方式的工作方式是函数参数在整数寄存器中传递,但在函数内部,编译器可以使用FPU,或者您可以使用NEON。对于使用NEON定位CortexA8的ARM编译器,您需要使用" - fpu = softvfp + vfpv3"
请参阅此处了解与此相关的ARM编译器的一些选项。许多其他编译器也有类似的开关。
对于ARM的RVCT3.x及更高版本的编译器,您需要(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/CIHCJIFE.html):
softvfp + vfpv3可使
使用软件浮点链接选择符合VFPv3的硬件向量浮点单元。如果要在实现VFPv3单元的系统上将Thumb代码与ARM代码互通,请选择此选项。
对于GCC,你会想要" -mfloat-abi = softfp",我认为" -mfpu ='neon'"。从GCC手册(http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html):
-mfloat-ABI =名称
指定要使用的浮点ABI。允许的值为:'soft','softfp'和'hard'。指定'soft'会导致GCC生成包含用于浮点运算的库调用的输出。 'softfp'允许使用硬件浮点指令生成代码,但仍使用soft-float调用约定。 'hard'允许生成浮点指令并使用FPU特定的调用约定。
默认值取决于特定的目标配置。请注意,硬浮点和软浮点ABI不是链接兼容的;您必须使用相同的ABI编译整个程序,并链接到一组兼容的库。