Rev. 1.50, 10/04, page 391 of 448
case NINF : switch (data_type_of(m)){
case PZERO:
case NZERO:invalid(n); break;
default: switch (data_type_of(n)){
case DENORM: set_E(); break;
case qNaN: qnan(n); break;
default: inf(n,sign_of(0)^sign_of(m)^sign_of(n));break
} break;
} break;
}
}
void normal_fmac(int m,n)
{
union {
int double x;
int l[4];
} dstx,tmpx;
float dstf,srcf;
if((data_type_of(n) == PZERO)|| (data_type_of(n) == NZERO))
srcf = 0.0; /* flush denormalized value */
else srcf = FR[n];
tmpx.x = FR[0]; /* convert single to int double */
tmpx.x *= FR[m]; /* exact product */
dstx.x = tmpx.x + srcf;
if(((dstx.x == srcf) && (tmpx.x != 0.0)) ||
((dstx.x == tmpx.x) && (srcf != 0.0))) {
set_I();
if(sign_of(0)^ sign_of(m)^ sign_of(n)) {
dstx.l[3] -= 1; /* correct result */
if(dstx.l[3] == 0xffffffff) dstx.l[2] -= 1;
if(dstx.l[2] == 0xffffffff) dstx.l[1] -= 1;
if(dstx.l[1] == 0xffffffff) dstx.l[0] -= 1;
}
else dstx.l[3] |= 1;
}
if((dstx.l[1] & 0x01ffffff) || dstx.l[2] || dstx.l[3]) set_I();
if(FPSCR_RM == 1) {