场景
我的目标平台是启用了VFP/neon的ARM cortex-A7。在目标平台上运行的系统软件不总是打开VFP/neon,而是仅在需要时(通过调用某些系统API)打开。
我的工具链是在pc-cygwin主机(arm-none-eabi)上进行裸金属GCC-4.7.4交叉编译。
我们有一个C源文件a.c
,该代码可能在系统软件关闭VFP/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选项-mfloat-abi=hard
而不是-mfloat-abi=softfp
编译b.c
。
如果b.c
使用-mfloat-abi=hard
选项进行编译,而a.c
使用-mfloat-abi=soft
选项进行编译,则它们无法链接在一起,链接器将报错:"...Uses VFP register arguments, XXX does not"。
问题
有没有任何方法(使用工具链GCC选项、安装配置或版本),可以使这个纯整数的a.c
兼容硬浮点ABI(通过VFP/neon寄存器传递浮点参数),但又不生成任何VFP/neon指令或寄存器来进行纯整数操作?
注释
- 作为一种解决方法,可以使用选项
-mfloat-abi=soft
编译a.c
,使用选项-mfloat-abi=softfp
编译b.c
,但是这会降低性能。 - GCC 4.9发布说明中提到:“默认情况下禁用了在64位标量计算中使用高级SIMD(Neon)指令集。这只在少数情况下生成更好的代码。可以通过
-mneon-for-64bits
选项重新启用它。”这似乎与我的问题有关,但我正在使用GCC 4.7.4。