我最终找到了解决方案,尽管我不一定会向所有人推荐它。它可能会在其他地方引发错误,但它足以满足我的需要。它还涉及从头开始构建 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 行,我删除了对我在问题中提到的 soft-FP 例程的任何引用:
LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
LongDoubleFormat = &llvm::APFloat::IEEEdouble;
我的测试程序——SNU 的 NASA Parallel Benchmarks 版本——仍然可以正确验证,所以我假设我没有严重破坏任何东西。尽管如此,这是一个重要的修改——我不建议大多数人使用它(它可能导致其他地方的损坏)。