xref: /inferno-os/Solaris/sparc/include/fpuctl.h (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth /* This code is a little awkward.  If somebody who understands Solaris
2*37da2899SCharles.Forsyth    better would tell me an idiomatic way to invoke equivalent
3*37da2899SCharles.Forsyth    behavior, I'd be grateful.    ehg@bell-labs.com  */
4*37da2899SCharles.Forsyth 
5*37da2899SCharles.Forsyth /*
6*37da2899SCharles.Forsyth  * accrued exception bits in the fsr
7*37da2899SCharles.Forsyth  */
8*37da2899SCharles.Forsyth #define FPAINEX		(1<<5)
9*37da2899SCharles.Forsyth #define FPAOVFL		(1<<8)
10*37da2899SCharles.Forsyth #define	FPAUNFL		(1<<7)
11*37da2899SCharles.Forsyth #define	FPAZDIV		(1<<6)
12*37da2899SCharles.Forsyth #define	FPAINVAL	(1<<9)
13*37da2899SCharles.Forsyth 
14*37da2899SCharles.Forsyth /*
15*37da2899SCharles.Forsyth  * exception enable bits in the fsr
16*37da2899SCharles.Forsyth  */
17*37da2899SCharles.Forsyth #define	FPINEX		(1<<23)
18*37da2899SCharles.Forsyth #define	FPOVFL		(1<<26)
19*37da2899SCharles.Forsyth #define	FPUNFL		(1<<25)
20*37da2899SCharles.Forsyth #define	FPZDIV		(1<<24)
21*37da2899SCharles.Forsyth #define	FPINVAL		(1<<27)
22*37da2899SCharles.Forsyth 
23*37da2899SCharles.Forsyth /*
24*37da2899SCharles.Forsyth  * rounding
25*37da2899SCharles.Forsyth  */
26*37da2899SCharles.Forsyth #define	FPRMASK		(3<<30)
27*37da2899SCharles.Forsyth #define	FPRNR		(0<<30)
28*37da2899SCharles.Forsyth #define	FPRNINF		(3<<30)
29*37da2899SCharles.Forsyth #define	FPRPINF		(2<<30)
30*37da2899SCharles.Forsyth #define	FPRZ		(1<<30)
31*37da2899SCharles.Forsyth 
32*37da2899SCharles.Forsyth /*
33*37da2899SCharles.Forsyth  * precision
34*37da2899SCharles.Forsyth  */
35*37da2899SCharles.Forsyth #define	FPPDBL		0
36*37da2899SCharles.Forsyth 
37*37da2899SCharles.Forsyth #define	FPFCR		(FPRMASK|FPINEX|FPOVFL|FPUNFL|FPZDIV|FPINVAL)
38*37da2899SCharles.Forsyth #define	FPFSR		(FPAINEX|FPAOVFL|FPAUNFL|FPAZDIV|FPAINVAL)
39*37da2899SCharles.Forsyth 
40*37da2899SCharles.Forsyth static ulong
getfcr(void)41*37da2899SCharles.Forsyth getfcr(void)
42*37da2899SCharles.Forsyth {
43*37da2899SCharles.Forsyth 	ulong v;
44*37da2899SCharles.Forsyth 
45*37da2899SCharles.Forsyth 	asm("	st	%fsr, [%fp-8]");
46*37da2899SCharles.Forsyth 	return v;
47*37da2899SCharles.Forsyth }
48*37da2899SCharles.Forsyth 
49*37da2899SCharles.Forsyth static void
setfcr(ulong v)50*37da2899SCharles.Forsyth setfcr(ulong v)
51*37da2899SCharles.Forsyth {
52*37da2899SCharles.Forsyth 	ulong vv;
53*37da2899SCharles.Forsyth 
54*37da2899SCharles.Forsyth 	vv = (getfcr() & ~FPFCR) | (v & FPFCR);
55*37da2899SCharles.Forsyth 	asm("	ld	[%fp-4], %fsr");
56*37da2899SCharles.Forsyth }
57*37da2899SCharles.Forsyth 
58*37da2899SCharles.Forsyth static ulong
getfsr(void)59*37da2899SCharles.Forsyth getfsr(void)
60*37da2899SCharles.Forsyth {
61*37da2899SCharles.Forsyth 	ulong v;
62*37da2899SCharles.Forsyth 
63*37da2899SCharles.Forsyth 	asm("	st	%fsr, [%fp-8]");
64*37da2899SCharles.Forsyth 	return v;
65*37da2899SCharles.Forsyth }
66*37da2899SCharles.Forsyth 
67*37da2899SCharles.Forsyth static void
setfsr(ulong v)68*37da2899SCharles.Forsyth setfsr(ulong v)
69*37da2899SCharles.Forsyth {
70*37da2899SCharles.Forsyth 	ulong vv;
71*37da2899SCharles.Forsyth 
72*37da2899SCharles.Forsyth 	vv = (getfsr() & ~FPFSR) | (v & FPFSR);
73*37da2899SCharles.Forsyth 	asm("	ld	[%fp-4], %fsr");
74*37da2899SCharles.Forsyth }
75*37da2899SCharles.Forsyth 
76