1*37da2899SCharles.Forsyth /* 2*37da2899SCharles.Forsyth * Linux 386 fpu support 3*37da2899SCharles.Forsyth * Mimic Plan9 floating point support 4*37da2899SCharles.Forsyth */ 5*37da2899SCharles.Forsyth 6*37da2899SCharles.Forsyth static void setfcr(ulong fcr)7*37da2899SCharles.Forsythsetfcr(ulong fcr) 8*37da2899SCharles.Forsyth { 9*37da2899SCharles.Forsyth __asm__( "xorb $0x3f, %%al\n\t" 10*37da2899SCharles.Forsyth "pushw %%ax\n\t" 11*37da2899SCharles.Forsyth "fwait\n\t" 12*37da2899SCharles.Forsyth "fldcw (%%esp)\n\t" 13*37da2899SCharles.Forsyth "popw %%ax\n\t" 14*37da2899SCharles.Forsyth : /* no output */ 15*37da2899SCharles.Forsyth : "al" (fcr) 16*37da2899SCharles.Forsyth ); 17*37da2899SCharles.Forsyth } 18*37da2899SCharles.Forsyth 19*37da2899SCharles.Forsyth static ulong getfcr(void)20*37da2899SCharles.Forsythgetfcr(void) 21*37da2899SCharles.Forsyth { 22*37da2899SCharles.Forsyth ulong fcr = 0; 23*37da2899SCharles.Forsyth 24*37da2899SCharles.Forsyth __asm__( "pushl %%eax\n\t" 25*37da2899SCharles.Forsyth "fwait\n\t" 26*37da2899SCharles.Forsyth "fstcw (%%esp)\n\t" 27*37da2899SCharles.Forsyth "popl %%eax\n\t" 28*37da2899SCharles.Forsyth "xorb $0x3f, %%al\n\t" 29*37da2899SCharles.Forsyth : "=a" (fcr) 30*37da2899SCharles.Forsyth : "eax" (fcr) 31*37da2899SCharles.Forsyth ); 32*37da2899SCharles.Forsyth return fcr; 33*37da2899SCharles.Forsyth } 34*37da2899SCharles.Forsyth 35*37da2899SCharles.Forsyth static ulong getfsr(void)36*37da2899SCharles.Forsythgetfsr(void) 37*37da2899SCharles.Forsyth { 38*37da2899SCharles.Forsyth ulong fsr = -1; 39*37da2899SCharles.Forsyth 40*37da2899SCharles.Forsyth __asm__( "fwait\n\t" 41*37da2899SCharles.Forsyth "fstsw (%%eax)\n\t" 42*37da2899SCharles.Forsyth "movl (%%eax), %%eax\n\t" 43*37da2899SCharles.Forsyth "andl $0xffff, %%eax\n\t" 44*37da2899SCharles.Forsyth : "=a" (fsr) 45*37da2899SCharles.Forsyth : "eax" (&fsr) 46*37da2899SCharles.Forsyth ); 47*37da2899SCharles.Forsyth return fsr; 48*37da2899SCharles.Forsyth } 49*37da2899SCharles.Forsyth 50*37da2899SCharles.Forsyth static void setfsr(ulong fsr)51*37da2899SCharles.Forsythsetfsr(ulong fsr) 52*37da2899SCharles.Forsyth { 53*37da2899SCharles.Forsyth __asm__("fclex\n\t"); 54*37da2899SCharles.Forsyth } 55*37da2899SCharles.Forsyth 56*37da2899SCharles.Forsyth /* FCR */ 57*37da2899SCharles.Forsyth #define FPINEX (1<<5) 58*37da2899SCharles.Forsyth #define FPUNFL ((1<<4)|(1<<1)) 59*37da2899SCharles.Forsyth #define FPOVFL (1<<3) 60*37da2899SCharles.Forsyth #define FPZDIV (1<<2) 61*37da2899SCharles.Forsyth #define FPINVAL (1<<0) 62*37da2899SCharles.Forsyth #define FPRNR (0<<10) 63*37da2899SCharles.Forsyth #define FPRZ (3<<10) 64*37da2899SCharles.Forsyth #define FPRPINF (2<<10) 65*37da2899SCharles.Forsyth #define FPRNINF (1<<10) 66*37da2899SCharles.Forsyth #define FPRMASK (3<<10) 67*37da2899SCharles.Forsyth #define FPPEXT (3<<8) 68*37da2899SCharles.Forsyth #define FPPSGL (0<<8) 69*37da2899SCharles.Forsyth #define FPPDBL (2<<8) 70*37da2899SCharles.Forsyth #define FPPMASK (3<<8) 71*37da2899SCharles.Forsyth /* FSR */ 72*37da2899SCharles.Forsyth #define FPAINEX FPINEX 73*37da2899SCharles.Forsyth #define FPAOVFL FPOVFL 74*37da2899SCharles.Forsyth #define FPAUNFL FPUNFL 75*37da2899SCharles.Forsyth #define FPAZDIV FPZDIV 76*37da2899SCharles.Forsyth #define FPAINVAL FPINVAL 77