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