【问题标题】:Hard float calls for some functions in GCC硬浮点调用 GCC 中的一些函数
【发布时间】:2013-05-26 15:13:21
【问题描述】:

这是一个 Android NDK 项目,但我猜它通常适用于 ARM 的 GCC。

我知道 Android NDK 使用软浮点来保持与 ARMv5 的兼容性,但我突然想到,在为我们的项目编译 ARMv7 库时,库内部的所有调用都可以使用硬浮点,并且只能使用软浮点调用其他库,但我不确定是否有可能告诉编译器这样做。我的感觉是它不是,但我希望有人可能知道如何做到这一点。

(附带说明 - 如果在 NDK 中使用 Clang 可以做到这一点,或者如果 Clang 只是这样做,很高兴知道)

一些背景知识:它是一个使用 NDK 编译的基于物理的库,非常注重浮点的使用,我正在研究可能的优化。

编辑:考虑一下,它只能确定一个函数在链接时是否是外部的,而硬/软浮点会影响编译器,所以我猜如果这是可能的,我需要手动指定应该使用硬浮点的函数,以便编译器知道。

【问题讨论】:

    标签: android gcc android-ndk


    【解决方案1】:

    更新: NDK r9b 添加了对使用 -mhard-float 构建库的支持。见the NDK page

    (原答案如下。)

    没有简单的方法可以做到这一点。编译器需要知道每个方法使用什么调用约定,并且没有“soft fp”属性。您可以编写(或生成)在调用约定之间进行转换的包装函数,但这既尴尬又烦人。

    如果您有一个使用浮点数的库,但没有任何将浮点数作为参数的函数,并且没有调用使用浮点数的外部函数(例如 libc 实用程序函数)——本质上是一个黑盒子在外部查看者看来根本不会使用浮点数——那么您应该能够使用“硬 fp”进行构建。

    【讨论】:

    • 只是在想一些类似于你第二段的独立硬 FP 的东西 - 我可以看到值得麻烦的情况。
    • 谢谢 - 我想我们的主要问题可能是三角函数。希望我有机会尽快尝试将我们的浮点代码分离到一个单独的库中。
    • libm 中的 Trig 函数可以通过从仿生/libm 源构建您自己的 libm 并将其静态链接到您的库中来处理(这样它就不会尝试从 libc 中解析符号)。但是还有其他问题,例如如果库采用带有浮点参数的回调函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多