text: /*
   * 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");
  }
  