【发布时间】:2018-07-31 00:39:54
【问题描述】:
我正在为 aarch64(ARM 64 位)平台上的项目静态构建 musl-libc。我想避免使用任何软浮点库,例如GCC's soft float library routines。然而,即使我使用-mfloat-abi=hard,这些仍然出现在图书馆档案中。据我所知,这是因为 ARM 64 位平台将 long double 定义为 128 位。
有没有办法改变这种行为?例如,我可以强制将long double 定义为与double 相同的大小吗?我知道这是 C 标准允许的,但我不确定是否有任何方法可以强制 Clang(我专门为此使用 Clang)使用这样的定义进行编译。
【问题讨论】:
-
试试
-mlong-double-64。不确定是否适用于 ARM... -
@AndrewHenle:我假设软浮点库例程出现只是因为
long double被定义为 128 位(基于__extenddftf2描述和我知道我的@987654332 的事实@platform 有 64 位 FP 寄存器)。所以虽然是的,vfprintf依赖于long double处理,但我想我想知道long double处理是否又依赖于软浮点库例程。这有意义吗? -
@AndrewHenle:换句话说,如果
vfprintf依赖于long double处理,那么long double的大小会改变什么 处理吗?如果是这样,我是否可以利用这一事实来强制long double的大小适合硬浮点寄存器,而不是不得不求助于软浮点? -
我知道这很可怕,但只是为了尝试您的假设,您为什么不在整个库中执行查找替换(将“long double”替换为“double”)?跨度>
-
@tonysdg 据我所知(这是很久以前的事了),这需要重建编译器。也许 clang 是不同的,但对于 gcc,这是唯一的选择。尽管我们确实非常大声地发誓,该架构定义了 CPU (还)没有的类型和指令。实际上我现在回想起来,我们的问题是双重的。在我们重建 gcc 之后,我们需要有那些 abort-stub 函数,以不生成没有 CPU 实现并且我们没有在内核中模拟的指令(像其他人那样)。
标签: c floating-point clang arm64 musl