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