代码之家  ›  专栏  ›  技术社区  ›  tonysdg

强制64位长双倍?

  •  16
  • tonysdg  · 技术社区  · 8 年前

    我在建造 musl-libc 静态地用于 aarch64 (ARM 64位)平台。我希望避免任何软浮点库,例如 GCC's soft float library routines . 然而,即使在我使用 -mfloat-abi=hard . 据我所知,这是因为ARM 64位平台定义了 long double 为128位。

    有没有办法改变这种行为?例如,我可以强制 长双人 定义为与 double ? 我知道这是C标准允许的,但我不确定是否有任何方法可以强制使用Clang(我专门为此使用Clang)以这样的定义编译。

    2 回复  |  直到 8 年前
        1
  •  1
  •   tonysdg    8 年前

    我最终找到了一个解决方案,尽管我不一定会推荐给每个人。它可能会在其他地方引发bug,但它已经足够满足我的需要了。它还涉及从头开始构建叮当声(感谢您的建议@艺术!)。此外,我正在从事的项目使用的是LLVM/Clang3.7.1,因此我不主张使用其他版本。


    据我所知,AArch64目标的长双精度定义出现在 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 --仍然正确验证,所以我假设我没有严重损坏任何东西。尽管如此,这是一个非常重要的修改——我不建议大多数人使用它(它可能会导致其他地方的损坏)。

        2
  •  0
  •   user1902824 user1902824    8 年前

    我以前也做过类似的事情,在类型上游手好闲(尤其是 long s) 。最好的方法是手动替换类型,因为这是获得所需内容的最简单、最直接的方法。你可以试着用宏玩把戏,或者修改编译器,但根据我的经验,你只会产生比你解决的问题更多的问题,而且这通常是一个脆弱的解决方案,以后会崩溃。

    幸运的是,您正在使用的源代码看起来维护得很好,并且您正在寻找的更改非常笼统。你可以很简单地解决这个问题。假设您运行的是类Unix系统,则可以从musl的基本目录运行以下命令:

    $ grep -Rl 'long double' * | xargs -tn1 sed -i '' -e 's/long double/double/g'
    

    此命令:

    1. 查找字符串 long double 并返回包含该字符串的文件名。
    2. 它被传递到 xargs ,调用 sed 每个文件名的命令,并在打印过程中进行打印。
    3. 什么时候 sed公司 运行时,它会在位修改文件,并替换 长双人 具有 double .

    当我尝试这个命令时,它“刚刚起作用”。我会更仔细地阅读差异,以确保它符合所有要求,并且不会改变库的行为。

    推荐文章