1*37da2899SCharles.Forsyth /* This code is a little awkward. If somebody who understands Solaris 2*37da2899SCharles.Forsyth better would tell me an idiomatic way to invoke equivalent 3*37da2899SCharles.Forsyth behavior, I'd be grateful. ehg@bell-labs.com */ 4*37da2899SCharles.Forsyth 5*37da2899SCharles.Forsyth /* 6*37da2899SCharles.Forsyth * accrued exception bits in the fsr 7*37da2899SCharles.Forsyth */ 8*37da2899SCharles.Forsyth #define FPAINEX (1<<5) 9*37da2899SCharles.Forsyth #define FPAOVFL (1<<8) 10*37da2899SCharles.Forsyth #define FPAUNFL (1<<7) 11*37da2899SCharles.Forsyth #define FPAZDIV (1<<6) 12*37da2899SCharles.Forsyth #define FPAINVAL (1<<9) 13*37da2899SCharles.Forsyth 14*37da2899SCharles.Forsyth /* 15*37da2899SCharles.Forsyth * exception enable bits in the fsr 16*37da2899SCharles.Forsyth */ 17*37da2899SCharles.Forsyth #define FPINEX (1<<23) 18*37da2899SCharles.Forsyth #define FPOVFL (1<<26) 19*37da2899SCharles.Forsyth #define FPUNFL (1<<25) 20*37da2899SCharles.Forsyth #define FPZDIV (1<<24) 21*37da2899SCharles.Forsyth #define FPINVAL (1<<27) 22*37da2899SCharles.Forsyth 23*37da2899SCharles.Forsyth /* 24*37da2899SCharles.Forsyth * rounding 25*37da2899SCharles.Forsyth */ 26*37da2899SCharles.Forsyth #define FPRMASK (3<<30) 27*37da2899SCharles.Forsyth #define FPRNR (0<<30) 28*37da2899SCharles.Forsyth #define FPRNINF (3<<30) 29*37da2899SCharles.Forsyth #define FPRPINF (2<<30) 30*37da2899SCharles.Forsyth #define FPRZ (1<<30) 31*37da2899SCharles.Forsyth 32*37da2899SCharles.Forsyth /* 33*37da2899SCharles.Forsyth * precision 34*37da2899SCharles.Forsyth */ 35*37da2899SCharles.Forsyth #define FPPDBL 0 36*37da2899SCharles.Forsyth 37*37da2899SCharles.Forsyth #define FPFCR (FPRMASK|FPINEX|FPOVFL|FPUNFL|FPZDIV|FPINVAL) 38*37da2899SCharles.Forsyth #define FPFSR (FPAINEX|FPAOVFL|FPAUNFL|FPAZDIV|FPAINVAL) 39*37da2899SCharles.Forsyth 40*37da2899SCharles.Forsyth static ulong getfcr(void)41*37da2899SCharles.Forsythgetfcr(void) 42*37da2899SCharles.Forsyth { 43*37da2899SCharles.Forsyth ulong v; 44*37da2899SCharles.Forsyth 45*37da2899SCharles.Forsyth asm(" st %fsr, [%fp-8]"); 46*37da2899SCharles.Forsyth return v; 47*37da2899SCharles.Forsyth } 48*37da2899SCharles.Forsyth 49*37da2899SCharles.Forsyth static void setfcr(ulong v)50*37da2899SCharles.Forsythsetfcr(ulong v) 51*37da2899SCharles.Forsyth { 52*37da2899SCharles.Forsyth ulong vv; 53*37da2899SCharles.Forsyth 54*37da2899SCharles.Forsyth vv = (getfcr() & ~FPFCR) | (v & FPFCR); 55*37da2899SCharles.Forsyth asm(" ld [%fp-4], %fsr"); 56*37da2899SCharles.Forsyth } 57*37da2899SCharles.Forsyth 58*37da2899SCharles.Forsyth static ulong getfsr(void)59*37da2899SCharles.Forsythgetfsr(void) 60*37da2899SCharles.Forsyth { 61*37da2899SCharles.Forsyth ulong v; 62*37da2899SCharles.Forsyth 63*37da2899SCharles.Forsyth asm(" st %fsr, [%fp-8]"); 64*37da2899SCharles.Forsyth return v; 65*37da2899SCharles.Forsyth } 66*37da2899SCharles.Forsyth 67*37da2899SCharles.Forsyth static void setfsr(ulong v)68*37da2899SCharles.Forsythsetfsr(ulong v) 69*37da2899SCharles.Forsyth { 70*37da2899SCharles.Forsyth ulong vv; 71*37da2899SCharles.Forsyth 72*37da2899SCharles.Forsyth vv = (getfsr() & ~FPFSR) | (v & FPFSR); 73*37da2899SCharles.Forsyth asm(" ld [%fp-4], %fsr"); 74*37da2899SCharles.Forsyth } 75*37da2899SCharles.Forsyth 76