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