关于Visual C++ 6.0浮点库反汇编代码的疑问
下面是我反汇编的Visual C++ 6.0的浮点库中的一个小函数,其作用就是
将一个double数据载入ST(0),相当一条FLD指令。我百思不得其解的就是为什么
这个函数对特殊值作了类型转换,将其从double(IEEE 754双精度数据类型)
转换为IEEE 754的扩展精度类型,然后才装载,有这个必要吗?
代码不是完全的反汇编(要么不可能用C表示要么太难),而是示意性质
// pd存储于edx中,仅是示意,非真正代码
DWORD _fload_withFB( double data )
{
FLOAT_DOUBLE *pDouble = (FLOAT_DOUBLE*)&data;
FLOAT_EXTENDED Extended;
__int64 temp;
if( pDouble->nExponent != 0x7FF )
{
// 一般值,但可能是无效值
__asm fld data
// 返回指数信息
return DOUBLE_EXPONENT_INFO( data );
}
else
{
// 特殊值(NaN和无穷)
Extended.nSign = pDouble->nSign; // 1
Extended.nExponent = 0x7FFF; // 15
// 尾数是右对齐,double的nFraction2前有12位空白
temp = pDouble->nFraction1 |( pDouble->nFraction2 << 32 );
temp = temp << 12;
Extended.nFraction1 = temp & 0xFFFFFFFF;
temp = temp >> 32;
Extended.nFraction2 = temp & 0xFFFFFFFF;
__asm fld tbyte ptr [Extended]
// 返回指数和符号信息
return DOUBLE_SIGN_EXPONENT_INFO( data );
}