1 #include <ieeefp.h> 2 #include "lib9.h" 3 #include "mathi.h" 4 5 void 6 FPinit(void) 7 { 8 fpsetsticky(0); /* Clear pending exceptions */ 9 fpsetround(FP_RN); 10 fpsetmask(FP_X_INV|FP_X_DZ|FP_X_UFL|FP_X_OFL); 11 } 12 13 ulong 14 getFPstatus(void) 15 { 16 ulong fsr = 0; 17 fp_except fsr9=fpgetsticky(); 18 if(fsr9&FP_X_IMP) fsr |= INEX; 19 if(fsr9&FP_X_OFL) fsr |= OVFL; 20 if(fsr9&FP_X_UFL) fsr |= UNFL; 21 if(fsr9&FP_X_DZ) fsr |= ZDIV; 22 if(fsr9&FP_X_INV) fsr |= INVAL; 23 return fsr; 24 } 25 26 ulong 27 FPstatus(ulong fsr, ulong mask) 28 { 29 ulong fsr9 = 0; 30 ulong old = getFPstatus(); 31 fsr = (fsr&mask) | (old&~mask); 32 if(fsr&INEX) fsr9 |= FP_X_IMP; 33 if(fsr&OVFL) fsr9 |= FP_X_OFL; 34 if(fsr&UNFL) fsr9 |= FP_X_UFL; 35 if(fsr&ZDIV) fsr9 |= FP_X_DZ; 36 if(fsr&INVAL) fsr9 |= FP_X_INV; 37 /* fpsetmask(fsr9); */ 38 fpsetsticky(fsr9); 39 return(old&mask); 40 } 41 42 ulong 43 getFPcontrol(void) 44 { 45 ulong fcr = 0; 46 fp_except fpc = fpgetmask(); 47 fp_rnd fpround = fpgetround(); 48 49 if(fpc&FP_X_INV) 50 fcr|=INVAL; 51 if(fpc&FP_X_DZ) 52 fcr|=ZDIV; 53 if(fpc&FP_X_OFL) 54 fcr|=OVFL; 55 if(fpc&FP_X_UFL) 56 fcr|=UNFL; 57 if(fpc&FP_X_IMP) 58 fcr|=INEX; 59 switch(fpround){ 60 case FP_RZ: 61 fcr|=RND_Z; 62 break; 63 case FP_RN: 64 fcr|=RND_NINF; 65 break; 66 case FP_RP: 67 fcr|=RND_PINF; 68 break; 69 case FP_RM: 70 fcr|=RND_NR; 71 } 72 return fcr; 73 } 74 ulong 75 FPcontrol(ulong fcr, ulong mask) 76 { 77 fp_except fc=0; 78 fp_rnd round; 79 ulong old = getFPcontrol(); 80 ulong changed = mask&(fcr^old); 81 fcr = (fcr&mask) | (old&~mask); 82 83 if(fcr&INEX) fc |= FP_X_IMP; 84 if(fcr&OVFL) fc |= FP_X_OFL; 85 if(fcr&UNFL) fc |= FP_X_UFL; 86 if(fcr&ZDIV) fc |= FP_X_DZ; 87 if(fcr&INVAL) fc |= FP_X_INV; 88 89 switch(fcr&RND_MASK){ 90 case RND_NR: round |= FP_RM; break; 91 case RND_NINF: round |= FP_RN; break; 92 case RND_PINF: round |= FP_RP; break; 93 case RND_Z: round |= FP_RZ; break; 94 } 95 96 fpsetround(round); 97 fpsetmask(fc); 98 return(old&mask); 99 } 100