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添加代码。
这些软件是四精度浮点数吗?如果是这样,什么格式?
GCC的__float128内核支持其内部的“ TFmode”格式,该格式根据目标和GCC使用的ABI而有所不同。
该文件说:
此修补程序添加了对x86_64上TFmode的支持,并且GCC 4.3发行说明确认对于x86_64而言,它是IEEE四元格式:
__float128可通过x86_64目标上的soft-fp库支持(TFmode)IEEE四边形类型和相应的TCmode IEEE复杂四边形类型。| 归档时间: |
|
| 查看次数: |
867 次 |
| 最近记录: |