1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- /*
- * Linux 386 fpu support
- * Mimic Plan9 floating point support
- */
- #include "lib9.h"
- void
- setfcr(ulong fcr)
- {
- __asm__( "xorb $0x3f, %%al\n\t"
- "pushw %%ax\n\t"
- "fwait\n\t"
- "fldcw (%%esp)\n\t"
- "popw %%ax\n\t"
- : /* no output */
- : "al" (fcr)
- );
- }
- ulong
- getfcr(void)
- {
- ulong fcr = 0;
- __asm__( "pushl %%eax\n\t"
- "fwait\n\t"
- "fstcw (%%esp)\n\t"
- "popl %%eax\n\t"
- "xorb $0x3f, %%al\n\t"
- : "=a" (fcr)
- : "eax" (fcr)
- );
- return fcr;
- }
- ulong
- getfsr(void)
- {
- ulong fsr = -1;
- __asm__( "fwait\n\t"
- "fstsw (%%eax)\n\t"
- "movl (%%eax), %%eax\n\t"
- "andl $0xffff, %%eax\n\t"
- : "=a" (fsr)
- : "eax" (&fsr)
- );
- return fsr;
- }
- void
- setfsr(ulong fsr)
- {
- __asm__("fclex\n\t");
- }
|