0

我正在尝试使用 RVDS 4.0 为 Cortex A8 构建可执行文件。我的代码使用 NEON,但我想将 fpu 选项设置为 none 或 SoftVFP。ARM 网站提到当 fpu 设置为 SoftVFP 时 NEON 被禁用。这是因为 VFP 和 NEON 共享寄存器吗?

有人可以解释为什么当 fpu 设置为 SoftVFP 时我不能使用 NEON,或者即使 fpu 设置为 SOftVFP,我是否可以通过任何选项启用 NEON?

谢谢

4

2 回答 2

0

为什么不直接使用 --cpu=7-A ?这应该暗示正确的 --fpu 选项

softvfp 是一个仿真库,我猜 NEON 根本没有实现

于 2012-02-22T20:32:00.667 回答
0

是的,NEON 和 VFP 寄存器是共享的。这简化了操作系统上下文切换支持,因为任何支持 VFP 的操作系统也将正确处理 NEON。

为 softVFP 构建的代码与为硬件 VFP 构建的代码链接是不安全的,因为它们将函数参数/结果放置在不同的寄存器中 - 使用 NEON 很像使用硬件 VFP。

但是有一个特殊情况,当您必须链接 SoftVFP 库时,但您碰巧知道您的 SoC 支持它(您知道吗?有很多没有 NEON 的 A8)。特殊情况称为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):

软vfp+vfpv3

选择符合 VFPv3 的硬件向量浮点单元,带有软件浮点链接。如果您在实现 VFPv3 单元的系统上将 Thumb 代码与 ARM 代码交互操作,请选择此选项。

对于 GCC,您需要“-mfloat-abi=softfp”,我认为“-mfpu='neon'”。来自 GCC 手册(http://gcc.gnu.org/onlinedocs/gcc/ARM-选项.html):

-mfloat-abi=名称

指定要使用的浮点 ABI。允许的值为:“soft”、“softfp”和“hard”。指定 'soft' 会导致 GCC 生成包含浮点运算库调用的输出。'softfp' 允许使用硬件浮点指令生成代码,但仍使用软浮点调用约定。'hard' 允许生成浮点指令并使用特定于 FPU 的调用约定。

默认值取决于具体的目标配置。请注意,硬浮点和软浮点 ABI 不兼容链接;您必须使用相同的 ABI 编译整个程序,并与一组兼容的库链接。

于 2014-01-22T01:08:33.783 回答