c - 强制 64 位长 double ?

标签 c floating-point clang arm64 musl

我正在 build musl-libc静态地用于 aarch64(ARM 64 位)平台上的项目。我想避免使用任何软浮点库,例如 GCC's soft float library routines .然而,即使我使用 -mfloat-abi=hard,这些仍然出现在库文件中。据我所知,这是因为 ARM 64 位平台将 long double 定义为 128 位。

有什么办法可以改变这种行为吗?例如,我可以强制将 long double 定义为与 double 相同的大小吗?我知道 C 标准允许这样做,但我不确定是否有任何方法可以强制 Clang(我专门为此使用 Clang)使用这样的定义进行编译。

最佳答案

我最终找到了解决方案,但我不一定会推荐给所有人。它可能会在其他地方引发错误,但它足以满足我的需要。它还涉及从头开始构建 Clang(感谢@Art 的建议!)。此外,我正在处理的项目使用的是 LLVM/Clang 3.7.1,因此我对其他版本不做任何声明。


据我所知,AArch64 目标的 long double 定义出现在 clang/lib/Basic/Targets.cpp 中。 :

...
MaxAtomicInlineWidth = 128;
MaxAtomicPromoteWidth = 128;

LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
LongDoubleFormat = &llvm::APFloat::IEEEquad;

// {} in inline assembly are neon specifiers, not assembly variant
// specifiers.
...

通过修改内部 2 行,我删除了对我在问题中提到的软 FP 例程的所有引用:

LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
LongDoubleFormat = &llvm::APFloat::IEEEdouble;

我的测试程序 -- SNU's version of the NASA Parallel Benchmarks - 仍然正确验证,所以我假设我没有破坏任何东西。不过,这是一个重要的修改——我不建议大多数人这样做(它可能会导致其他地方损坏)。

关于c - 强制 64 位长 double ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48888860/

相关文章:

c++ - 严格的别名,-ffast-math 和 SSE

c - 字符串创建问题 C

c - 解析二进制数据时使用属性打包的结构

python - Delphi - 映射函数意外输出

c++ - 如何动态构建和链接 boost::regex 与隐藏的内联?

linker - 我怎么知道ld使用的库的路径?

c - 我收到运行时错误 : Segmentation Fault (SIGSEGV),,为什么?

c - 标记掩码读写 posix

你能在 C 中将一个值四舍五入到小数点后两位吗?

python - 楼层划分如何根据文件规定不给出结果?