xref: /inferno-os/FreeBSD/386/include/fpuctl.h (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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.Forsyth setfcr(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.Forsyth getfcr(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.Forsyth getfsr(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.Forsyth setfsr(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