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