将硬浮ABI与没有VFP / NEON

时间:2015-07-24 07:06:12

标签: gcc arm neon

方案

我的目标平台是启用了VFP / neon的ARM cortex-A7,我在目标平台上运行的系统软件并不总是打开VPF /霓虹灯,而是仅按需打开VPF / neon(通过调用某些系统API) 。
我的工具链是pc-cygwin主机(arm-none-eabi)上的裸机GCC-4.7.4交叉编译器。

我们有一个C源文件a.c,当系统软件关闭VPF / neon时,代码可能会运行。此a.c代码为纯整数,具有密集的long long(64位整数)运算。如果应用GCC选项-mfloat-abi=hard-mfloat-abi=softfp来编译a.c,则会生成一些使用VFP / neon寄存器的指令(例如,vldr d7,[..]vstr d7,[sp,..]等)。如果在VFP / neon关闭时运行此生成的代码,则目标平台上会发生未定义的故障。如果应用GCC选项-mfloat-abi=soft来编译a.c,则不会使用VFP / neon寄存器来解决未定义的故障问题。

另一方面,还有另一个C源文件b.c,它包含浮点/向量(VFP / neon)操作,并且仅在系统软件打开VFP / neon时运行。出于性能原因,我想使用GCC选项b.c而不是-mfloat-abi=hard编译-mfloat-abi=softfp

如果使用b.c编译-mfloat-abi=hard并使用a.c选项编译-mfloat-abi=soft,则无法将它们链接在一起,链接器会抱怨:“...使用VFP注册参数,XXX不“。

问题

是否有任何方法(使用工具链GCC选项,安装配置,版本)来编译与硬浮点ABI兼容的所述纯整数a.c(通过VFP / neon寄存器传递浮点参数)但不生成任何VFP / neon指令或纯整数运算寄存器?

注释

  • 作为一种变通方法,a.c选项-mfloat-abi=softb.c选项-mfloat-abi=softfp可以关联,但效果较差。
  • GCC 4.9 release notes表示“默认情况下禁用高级SIMD(霓虹灯)用于64位标量计算”。发现这只会在少数情况下产生更好的代码。可以使用-mneon-for-64bits选项重新打开它。这似乎与我的问题有关,但我使用的是GCC 4.7.4。

1 个答案:

答案 0 :(得分:0)

你应该坚持使用softfp选项。

事实上,当没有传递hard类型的参数时,softfpfloat之间没有区别。

即使是这种情况,softfp在可能的循环之外的开头会产生非常小的开销。 (将ARM寄存器的内容移动到VFP寄存器,当有超过四个参数时最终从堆栈中加载一些负载)

由于vfp不支持int64,因此以v开头的说明必须是NEON。您应该尝试使用-fno-tree-vectorize来禁用使用-o3选项自动启用的愚蠢的自动版本。

PS:如果您对性能有所了解,为什么不编写优化的NEON代码?正确的手写NEON代码会使令人惊讶的下颌差异不同于那些完全无用的恼人的自动矢量化代码。