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