如果我在x86_64上使用gcc 4.9,__ float128到底是什么?

tmy*_*ebu 3 c++ floating-point gcc

我写了一个简单的程序,以为我可以从反汇编中找到:

int main() {
  double a, b, c;
  scanf("%lf %lf %lf", &a, &b, &c);
  __float128 foo = a;
  foo += b; foo += c;
  printf("%f\n", (double)foo);
}
Run Code Online (Sandbox Code Playgroud)

main 编译(-O3)为以下内容:

  400630:       48 83 ec 38             sub    $0x38,%rsp
  400634:       bf 34 08 40 00          mov    $0x400834,%edi
  400639:       31 c0                   xor    %eax,%eax
  40063b:       48 8d 4c 24 28          lea    0x28(%rsp),%rcx
  400640:       48 8d 54 24 20          lea    0x20(%rsp),%rdx
  400645:       48 8d 74 24 18          lea    0x18(%rsp),%rsi
  40064a:       e8 c1 ff ff ff          callq  400610 <scanf@plt>
  40064f:       f2 0f 10 44 24 18       movsd  0x18(%rsp),%xmm0
  400655:       e8 a6 ff ff ff          callq  400600 <__extenddftf2@plt>
  40065a:       0f 29 04 24             movaps %xmm0,(%rsp)
  40065e:       f2 0f 10 44 24 20       movsd  0x20(%rsp),%xmm0
  400664:       e8 97 ff ff ff          callq  400600 <__extenddftf2@plt>
  400669:       66 0f 6f 0c 24          movdqa (%rsp),%xmm1
  40066e:       e8 5d ff ff ff          callq  4005d0 <__addtf3@plt>
  400673:       0f 29 04 24             movaps %xmm0,(%rsp)
  400677:       f2 0f 10 44 24 28       movsd  0x28(%rsp),%xmm0
  40067d:       e8 7e ff ff ff          callq  400600 <__extenddftf2@plt>
  400682:       66 0f 6f 0c 24          movdqa (%rsp),%xmm1
  400687:       e8 44 ff ff ff          callq  4005d0 <__addtf3@plt>
  40068c:       e8 8f ff ff ff          callq  400620 <__trunctfdf2@plt>
  400691:       bf 3a 08 40 00          mov    $0x40083a,%edi
  400696:       b8 01 00 00 00          mov    $0x1,%eax
  40069b:       e8 20 ff ff ff          callq  4005c0 <printf@plt>
  4006a0:       31 c0                   xor    %eax,%eax
  4006a2:       48 83 c4 38             add    $0x38,%rsp
  4006a6:       c3                      retq
Run Code Online (Sandbox Code Playgroud)

当我__addtf3通过在其中设置断点并在下运行程序来查看的反汇编时gdb,我看到了一堆算术和条件语句。我没有打扰尝试阅读它,但是它肯定看起来不像double double添加代码。

这些软件是四精度浮点数吗?如果是这样,什么格式?

Jon*_*ely 5

GCC的__float128内核支持其内部的“ TFmode”格式,该格式根据目标和GCC使用的ABI而有所不同。

文件说:

  • TFmode
    “ Tetra Floating”模式表示一个十六字节的浮点数,其所有128位都有意义。一种常见用途是IEEE四精度格式。

此修补程序添加了对x86_64上TFmode的支持,并且GCC 4.3发行说明确认对于x86_64而言,它是IEEE四元格式:

  • __float128可通过x86_64目标上的soft-fp库支持(TFmode)IEEE四边形类型和相应的TCmode IEEE复杂四边形类型。