xref: /inferno-os/os/mpc/fp.s (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1/*
2 * support for floating-point hardware
3 */
4
5#include "mem.h"
6
7/* on some models mtmsr doesn't synchronise enough (eg, 603e) */
8#define	MSRSYNC	SYNC; ISYNC
9
10#define	FPON(X, Y)\
11	MOVW	MSR, X;\
12	OR	$FPE, X, Y;\
13	SYNC;\
14	ISYNC;\
15	MOVW	Y, MSR;\
16	MSRSYNC
17
18#define	FPOFF(X,Y)\
19	MOVW	MSR, X;\
20	RLWNM	$0, X, $~FPE, Y;\
21	SYNC;\
22	ISYNC;\
23	MOVW	Y, MSR;\
24	MSRSYNC
25
26#define	FPPREV(X)\
27	SYNC;\
28	ISYNC;\
29	MOVW	X, MSR;\
30	MSRSYNC
31
32TEXT	kfpinit(SB), $0
33	MOVFL	$0,FPSCR(7)
34	MOVFL	$0xD,FPSCR(6)	/* VE, OE, ZE */
35	MOVFL	$0, FPSCR(5)
36	MOVFL	$0, FPSCR(3)
37	MOVFL	$0, FPSCR(2)
38	MOVFL	$0, FPSCR(1)
39	MOVFL	$0, FPSCR(0)
40
41	FMOVD	$4503601774854144.0, F27
42	FMOVD	$0.5, F29
43	FSUB	F29, F29, F28
44	FADD	F29, F29, F30
45	FADD	F30, F30, F31
46	FMOVD	F28, F0
47	FMOVD	F28, F1
48	FMOVD	F28, F2
49	FMOVD	F28, F3
50	FMOVD	F28, F4
51	FMOVD	F28, F5
52	FMOVD	F28, F6
53	FMOVD	F28, F7
54	FMOVD	F28, F8
55	FMOVD	F28, F9
56	FMOVD	F28, F10
57	FMOVD	F28, F11
58	FMOVD	F28, F12
59	FMOVD	F28, F13
60	FMOVD	F28, F14
61	FMOVD	F28, F15
62	FMOVD	F28, F16
63	FMOVD	F28, F17
64	FMOVD	F28, F18
65	FMOVD	F28, F19
66	FMOVD	F28, F20
67	FMOVD	F28, F21
68	FMOVD	F28, F22
69	FMOVD	F28, F23
70	FMOVD	F28, F24
71	FMOVD	F28, F25
72	FMOVD	F28, F26
73	RETURN
74
75TEXT	getfpscr(SB), $8
76	FPON(R4, R5)
77	MOVFL	FPSCR, F3
78	FMOVD	F3, -8(SP)
79	MOVW	-4(SP), R3
80	FPPREV(R4)
81	RETURN
82
83TEXT	fpsave(SB), $0
84	FPON(R4, R4)
85
86	FMOVD	F0,0(R3)
87	FMOVD	F1,8(R3)
88	FMOVD	F2,16(R3)
89	FMOVD	F3,24(R3)
90	FMOVD	F4,32(R3)
91	FMOVD	F5,40(R3)
92	FMOVD	F6,48(R3)
93	FMOVD	F7,56(R3)
94	FMOVD	F8,64(R3)
95	FMOVD	F9,72(R3)
96	FMOVD	F10,80(R3)
97	FMOVD	F11,88(R3)
98	FMOVD	F12,96(R3)
99	FMOVD	F13,104(R3)
100	FMOVD	F14,112(R3)
101	FMOVD	F15,120(R3)
102	FMOVD	F16,128(R3)
103	FMOVD	F17,136(R3)
104	FMOVD	F18,144(R3)
105	FMOVD	F19,152(R3)
106	FMOVD	F20,160(R3)
107	FMOVD	F21,168(R3)
108	FMOVD	F22,176(R3)
109	FMOVD	F23,184(R3)
110	FMOVD	F24,192(R3)
111	FMOVD	F25,200(R3)
112	FMOVD	F26,208(R3)
113	FMOVD	F27,216(R3)
114	FMOVD	F28,224(R3)
115	FMOVD	F29,232(R3)
116	FMOVD	F30,240(R3)
117	FMOVD	F31,248(R3)
118
119	MOVFL	FPSCR, F0
120	FMOVD	F0, 256(R3)
121	MOVFL	$0,FPSCR(7)
122	MOVFL	$0xD,FPSCR(6)	/* VE, OE, ZE */
123	MOVFL	$0, FPSCR(5)
124	MOVFL	$0, FPSCR(4)
125	MOVFL	$0, FPSCR(3)
126	MOVFL	$0, FPSCR(2)
127	MOVFL	$0, FPSCR(1)
128	MOVFL	$0, FPSCR(0)
129
130	FPOFF(R4, R4)
131	RETURN
132
133TEXT	fprestore(SB), $0
134	FPON(R4, R4)
135
136	FMOVD	256(R3), F0
137	MOVFL	F0, FPSCR
138	FMOVD	0(R3), F0
139	FMOVD	8(R3), F1
140	FMOVD	16(R3), F2
141	FMOVD	24(R3), F3
142	FMOVD	32(R3), F4
143	FMOVD	40(R3), F5
144	FMOVD	48(R3), F6
145	FMOVD	56(R3), F7
146	FMOVD	64(R3), F8
147	FMOVD	72(R3), F9
148	FMOVD	80(R3), F10
149	FMOVD	88(R3), F11
150	FMOVD	96(R3), F12
151	FMOVD	104(R3), F13
152	FMOVD	112(R3), F14
153	FMOVD	120(R3), F15
154	FMOVD	128(R3), F16
155	FMOVD	136(R3), F17
156	FMOVD	144(R3), F18
157	FMOVD	152(R3), F19
158	FMOVD	160(R3), F20
159	FMOVD	168(R3), F21
160	FMOVD	176(R3), F22
161	FMOVD	184(R3), F23
162	FMOVD	192(R3), F24
163	FMOVD	200(R3), F25
164	FMOVD	208(R3), F26
165	FMOVD	216(R3), F27
166	FMOVD	224(R3), F28
167	FMOVD	232(R3), F29
168	FMOVD	240(R3), F30
169	FMOVD	248(R3), F31
170
171	RETURN
172
173TEXT	clrfptrap(SB), $0
174	FPON(R4, R5)
175	MOVFL	$0, FPSCR(5)
176	MOVFL	$0, FPSCR(3)
177	MOVFL	$0, FPSCR(2)
178	MOVFL	$0, FPSCR(1)
179	MOVFL	$0, FPSCR(0)
180	FPPREV(R4)
181	RETURN
182
183TEXT	fpinit(SB), $0
184	FPON(R4, R5)
185	BL	kfpinit(SB)
186	RETURN
187
188TEXT	fpoff(SB), $0
189	FPOFF(R4, R5)
190	RETURN
191
192
193TEXT	FPsave(SB), 1, $0
194	FPON(R4, R5)
195	MOVFL	FPSCR, F0
196	FMOVD	F0, 0(R3)
197	FPPREV(R4)
198	RETURN
199
200TEXT	FPrestore(SB), 1, $0
201	FPON(R4, R5)
202	FMOVD	0(R3), F0
203	MOVFL	F0, FPSCR
204	FPPREV(R4)
205	RETURN
206