xref: /inferno-os/lib9/setfcr-MacOSX-386.c (revision 799f9c8c85c76c3ef40091c1f469049343650f16)
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 Forsyth setfcr(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 Forsyth getfcr(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 Forsyth getfsr(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 Forsyth setfsr(ulong fsr)
54*799f9c8cSCharles Forsyth {
55*799f9c8cSCharles Forsyth 	__asm__("fclex\n\t");
56*799f9c8cSCharles Forsyth }
57