1*799f9c8cSCharles Forsyth /* 2*799f9c8cSCharles Forsyth * Linux 386 fpu support 3*799f9c8cSCharles Forsyth * Mimic Plan9 floating point support 4*799f9c8cSCharles Forsyth */ 5*799f9c8cSCharles Forsyth 6*799f9c8cSCharles Forsyth #include "lib9.h" 7*799f9c8cSCharles Forsyth 8*799f9c8cSCharles Forsyth void setfcr(ulong fcr)9*799f9c8cSCharles Forsythsetfcr(ulong fcr) 10*799f9c8cSCharles Forsyth { 11*799f9c8cSCharles Forsyth __asm__( "xorb $0x3f, %%al\n\t" 12*799f9c8cSCharles Forsyth "pushw %%ax\n\t" 13*799f9c8cSCharles Forsyth "fwait\n\t" 14*799f9c8cSCharles Forsyth "fldcw (%%esp)\n\t" 15*799f9c8cSCharles Forsyth "popw %%ax\n\t" 16*799f9c8cSCharles Forsyth : /* no output */ 17*799f9c8cSCharles Forsyth : "al" (fcr) 18*799f9c8cSCharles Forsyth ); 19*799f9c8cSCharles Forsyth } 20*799f9c8cSCharles Forsyth 21*799f9c8cSCharles Forsyth ulong getfcr(void)22*799f9c8cSCharles Forsythgetfcr(void) 23*799f9c8cSCharles Forsyth { 24*799f9c8cSCharles Forsyth ulong fcr = 0; 25*799f9c8cSCharles Forsyth 26*799f9c8cSCharles Forsyth __asm__( "pushl %%eax\n\t" 27*799f9c8cSCharles Forsyth "fwait\n\t" 28*799f9c8cSCharles Forsyth "fstcw (%%esp)\n\t" 29*799f9c8cSCharles Forsyth "popl %%eax\n\t" 30*799f9c8cSCharles Forsyth "xorb $0x3f, %%al\n\t" 31*799f9c8cSCharles Forsyth : "=a" (fcr) 32*799f9c8cSCharles Forsyth : "eax" (fcr) 33*799f9c8cSCharles Forsyth ); 34*799f9c8cSCharles Forsyth return fcr; 35*799f9c8cSCharles Forsyth } 36*799f9c8cSCharles Forsyth 37*799f9c8cSCharles Forsyth ulong getfsr(void)38*799f9c8cSCharles Forsythgetfsr(void) 39*799f9c8cSCharles Forsyth { 40*799f9c8cSCharles Forsyth ulong fsr = -1; 41*799f9c8cSCharles Forsyth 42*799f9c8cSCharles Forsyth __asm__( "fwait\n\t" 43*799f9c8cSCharles Forsyth "fstsw (%%eax)\n\t" 44*799f9c8cSCharles Forsyth "movl (%%eax), %%eax\n\t" 45*799f9c8cSCharles Forsyth "andl $0xffff, %%eax\n\t" 46*799f9c8cSCharles Forsyth : "=a" (fsr) 47*799f9c8cSCharles Forsyth : "eax" (&fsr) 48*799f9c8cSCharles Forsyth ); 49*799f9c8cSCharles Forsyth return fsr; 50*799f9c8cSCharles Forsyth } 51*799f9c8cSCharles Forsyth 52*799f9c8cSCharles Forsyth void setfsr(ulong fsr)53*799f9c8cSCharles Forsythsetfsr(ulong fsr) 54*799f9c8cSCharles Forsyth { 55*799f9c8cSCharles Forsyth __asm__("fclex\n\t"); 56*799f9c8cSCharles Forsyth } 57