Rev. 1.50, 10/04, page 361 of 448
check_single_exception(&FR[n+3],dstf);
}
}
void check_single_exception(float *dst,result)
{
union {
float f;
int l;
} tmp;
float abs;
if(result < 0.0) tmp.l = 0xff800000; /* – infinity */
else tmp.l = 0x7f800000; /* + infinity */
if(result == tmp.f) {
set_O(); set_I();
if(FPSCR_RM == 1) {
tmp.l -= 1; /* Maximum value of normalized number */
result = tmp.f;
}
}
if(result < 0.0) abs = -result;
else abs = result;
tmp.l = 0x00800000; /* Minimum value of normalized number */
if(abs < tmp.f) {
if((FPSCR_DN == 1) && (abs != 0.0)) {
set_I();
if(result < 0.0) result = -0.0; /* Zeroize denormalized number */
else result = 0.0;
}
if(FPSCR_I == 1) set_U();
}
if(FPSCR & ENABLE_OUI) fpu_exception_trap();
else *dst = result;
}