加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

扩展双精度80位浮点在X86平台和mips平台下的差异

(2011-02-25 20:31:23)
标签:

二进制翻译

80位浮点数

x86

mips

扩展双精度

it

分类: 二进制翻译

    X86浮点栈是80位的扩展双精度表示,尽管在大多数情况下,只会用到64位,但在某些情况,比如在spec测试程序中,会有80位浮点精度的运算。

    在二进制翻译(binary translation)中,由于mips64架构下浮点寄存器是64位,将80位浮点运算移植到mips下精度会丢失,运算结果会错误。这构成了X86浮点栈翻译的又一难点。

    首先要分析清楚80位浮点在X86平台下的表示方法和mips下的差异。

    IEEE754标准对扩展双精度并没有规定具体的格式,但它指定了最小精度和大小。例如,IEEE 双精度扩展格式必须至少具有64位有效数字,并总共占用至少79 位。

 

    http://s2/bmiddle/6449050et9d1ad8bda9c1&690

 

    Microsoft Visual C++ 6.0版本以上的编译器都不支持该类型,long double和double一样,都是64位基本双精度,只能用其它C/C++编译器或汇编语言。 下面统一在GCC4.3下分析。

    测试程序:

    #include<stdio.h>

    int main()

    {

        long double a=0.25;

        long double b=0.1;

        a= a+b;

        return 0;

    }

    不用printf,避免编译器的优化,直接用gdb查看内存

    gcc -o test test.c

    gdb test

    b main

    r

    http://s10/bmiddle/6449050et9d1aff793549&690

    直接b到浮点栈那条指令 fldt

    http://s6/middle/6449050ete230e431a5c5&690

80位浮点的十六进制:0x3ffd8000000000000000 对应0.25

80位浮点的十六进制:0x3ffdccccccccccccd000 对应0.1

根据IEEE754浮点数的表示 0.25 = 1.0*2^(-2)   0x3ffd对应符号位和阶码 0 011 1111 1111 1101(红色部分为阶码)第一个黑色的0位符号位

-2 = 阶码-偏移值 那么x86平台下gcc编译器表示80位浮点的偏移值位:0x3ffd+2=0x3fff = (2^14)-1 = 16383

注意,尾数的1在X86下显示表示出来了0x3ffd8000000000000000

在mips下80位浮点在内存是怎么表示的了?

相同的程序在loongson2F下编译

gcc -o test test.c -mabi=n32

http://s5/middle/6449050et9d1b79a93ac4&690

可以看出,在mips下,80位浮点用128位来表示,80位浮点运算扩展为128位进行运算,编译器中有函数可以调用。在这里就不说了,

这里强调的是128位表示规格:

0x3ffd0000000000000000000000000000   和X86的0x3ffd8000000000000000的对比,可以看出,阶码和偏移值都一样的,尾数的1被隐藏了,更符合IEEE754 浮点规格化的表示



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有