1 #include "lib9.h" 2 #include "mathi.h" 3 4 void 5 FPinit(void) 6 { 7 setfsr(0); /* Clear pending exceptions */ 8 setfcr(FPPDBL|FPRNR|FPINVAL|FPZDIV|FPUNFL|FPOVFL); 9 } 10 11 ulong 12 getFPstatus(void) 13 { 14 ulong fsr = 0, fsr9 = getfsr(); 15 /* on specific machines, could be table lookup */ 16 if(fsr9&FPAINEX) fsr |= INEX; 17 if(fsr9&FPAOVFL) fsr |= OVFL; 18 if(fsr9&FPAUNFL) fsr |= UNFL; 19 if(fsr9&FPAZDIV) fsr |= ZDIV; 20 if(fsr9&FPAINVAL) fsr |= INVAL; 21 return fsr; 22 } 23 24 ulong 25 FPstatus(ulong fsr, ulong mask) 26 { 27 ulong fsr9 = 0; 28 ulong old = getFPstatus(); 29 fsr = (fsr&mask) | (old&~mask); 30 if(fsr&INEX) fsr9 |= FPAINEX; 31 if(fsr&OVFL) fsr9 |= FPAOVFL; 32 if(fsr&UNFL) fsr9 |= FPAUNFL; 33 if(fsr&ZDIV) fsr9 |= FPAZDIV; 34 if(fsr&INVAL) fsr9 |= FPAINVAL; 35 setfsr(fsr9); 36 return(old&mask); 37 } 38 39 ulong 40 getFPcontrol(void) 41 { 42 ulong fcr = 0, fcr9 = getfcr(); 43 switch(fcr9&FPRMASK){ 44 case FPRNR: fcr = RND_NR; break; 45 case FPRNINF: fcr = RND_NINF; break; 46 case FPRPINF: fcr = RND_PINF; break; 47 case FPRZ: fcr = RND_Z; break; 48 } 49 if(fcr9&FPINEX) fcr |= INEX; 50 if(fcr9&FPOVFL) fcr |= OVFL; 51 if(fcr9&FPUNFL) fcr |= UNFL; 52 if(fcr9&FPZDIV) fcr |= ZDIV; 53 if(fcr9&FPINVAL) fcr |= INVAL; 54 return fcr; 55 } 56 57 ulong 58 FPcontrol(ulong fcr, ulong mask) 59 { 60 ulong fcr9 = FPPDBL; 61 ulong old = getFPcontrol(); 62 fcr = (fcr&mask) | (old&~mask); 63 if(fcr&INEX) fcr9 |= FPINEX; 64 if(fcr&OVFL) fcr9 |= FPOVFL; 65 if(fcr&UNFL) fcr9 |= FPUNFL; 66 if(fcr&ZDIV) fcr9 |= FPZDIV; 67 if(fcr&INVAL) fcr9 |= FPINVAL; 68 switch(fcr&RND_MASK){ 69 case RND_NR: fcr9 |= FPRNR; break; 70 case RND_NINF: fcr9 |= FPRNINF; break; 71 case RND_PINF: fcr9 |= FPRPINF; break; 72 case RND_Z: fcr9 |= FPRZ; break; 73 } 74 setfcr(fcr9); 75 return(old&mask); 76 } 77 78