summaryrefslogtreecommitdiff
path: root/os/mpc/fp.s
blob: e37bb63a04a3ab77dcb587fd66a8d22932c1fca6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
/*
 * support for floating-point hardware
 */

#include "mem.h"

/* on some models mtmsr doesn't synchronise enough (eg, 603e) */
#define	MSRSYNC	SYNC; ISYNC

#define	FPON(X, Y)\
	MOVW	MSR, X;\
	OR	$FPE, X, Y;\
	SYNC;\
	ISYNC;\
	MOVW	Y, MSR;\
	MSRSYNC

#define	FPOFF(X,Y)\
	MOVW	MSR, X;\
	RLWNM	$0, X, $~FPE, Y;\
	SYNC;\
	ISYNC;\
	MOVW	Y, MSR;\
	MSRSYNC

#define	FPPREV(X)\
	SYNC;\
	ISYNC;\
	MOVW	X, MSR;\
	MSRSYNC

TEXT	kfpinit(SB), $0
	MOVFL	$0,FPSCR(7)
	MOVFL	$0xD,FPSCR(6)	/* VE, OE, ZE */
	MOVFL	$0, FPSCR(5)
	MOVFL	$0, FPSCR(3)
	MOVFL	$0, FPSCR(2)
	MOVFL	$0, FPSCR(1)
	MOVFL	$0, FPSCR(0)

	FMOVD	$4503601774854144.0, F27
	FMOVD	$0.5, F29
	FSUB	F29, F29, F28
	FADD	F29, F29, F30
	FADD	F30, F30, F31
	FMOVD	F28, F0
	FMOVD	F28, F1
	FMOVD	F28, F2
	FMOVD	F28, F3
	FMOVD	F28, F4
	FMOVD	F28, F5
	FMOVD	F28, F6
	FMOVD	F28, F7
	FMOVD	F28, F8
	FMOVD	F28, F9
	FMOVD	F28, F10
	FMOVD	F28, F11
	FMOVD	F28, F12
	FMOVD	F28, F13
	FMOVD	F28, F14
	FMOVD	F28, F15
	FMOVD	F28, F16
	FMOVD	F28, F17
	FMOVD	F28, F18
	FMOVD	F28, F19
	FMOVD	F28, F20
	FMOVD	F28, F21
	FMOVD	F28, F22
	FMOVD	F28, F23
	FMOVD	F28, F24
	FMOVD	F28, F25
	FMOVD	F28, F26
	RETURN

TEXT	getfpscr(SB), $8
	FPON(R4, R5)
	MOVFL	FPSCR, F3
	FMOVD	F3, -8(SP)
	MOVW	-4(SP), R3
	FPPREV(R4)
	RETURN

TEXT	fpsave(SB), $0
	FPON(R4, R4)

	FMOVD	F0,0(R3)
	FMOVD	F1,8(R3)
	FMOVD	F2,16(R3)
	FMOVD	F3,24(R3)
	FMOVD	F4,32(R3)
	FMOVD	F5,40(R3)
	FMOVD	F6,48(R3)
	FMOVD	F7,56(R3)
	FMOVD	F8,64(R3)
	FMOVD	F9,72(R3)
	FMOVD	F10,80(R3)
	FMOVD	F11,88(R3)
	FMOVD	F12,96(R3)
	FMOVD	F13,104(R3)
	FMOVD	F14,112(R3)
	FMOVD	F15,120(R3)
	FMOVD	F16,128(R3)
	FMOVD	F17,136(R3)
	FMOVD	F18,144(R3)
	FMOVD	F19,152(R3)
	FMOVD	F20,160(R3)
	FMOVD	F21,168(R3)
	FMOVD	F22,176(R3)
	FMOVD	F23,184(R3)
	FMOVD	F24,192(R3)
	FMOVD	F25,200(R3)
	FMOVD	F26,208(R3)
	FMOVD	F27,216(R3)
	FMOVD	F28,224(R3)
	FMOVD	F29,232(R3)
	FMOVD	F30,240(R3)
	FMOVD	F31,248(R3)

	MOVFL	FPSCR, F0
	FMOVD	F0, 256(R3)
	MOVFL	$0,FPSCR(7)
	MOVFL	$0xD,FPSCR(6)	/* VE, OE, ZE */
	MOVFL	$0, FPSCR(5)
	MOVFL	$0, FPSCR(4)
	MOVFL	$0, FPSCR(3)
	MOVFL	$0, FPSCR(2)
	MOVFL	$0, FPSCR(1)
	MOVFL	$0, FPSCR(0)

	FPOFF(R4, R4)
	RETURN

TEXT	fprestore(SB), $0
	FPON(R4, R4)

	FMOVD	256(R3), F0
	MOVFL	F0, FPSCR
	FMOVD	0(R3), F0
	FMOVD	8(R3), F1
	FMOVD	16(R3), F2
	FMOVD	24(R3), F3
	FMOVD	32(R3), F4
	FMOVD	40(R3), F5
	FMOVD	48(R3), F6
	FMOVD	56(R3), F7
	FMOVD	64(R3), F8
	FMOVD	72(R3), F9
	FMOVD	80(R3), F10
	FMOVD	88(R3), F11
	FMOVD	96(R3), F12
	FMOVD	104(R3), F13
	FMOVD	112(R3), F14
	FMOVD	120(R3), F15
	FMOVD	128(R3), F16
	FMOVD	136(R3), F17
	FMOVD	144(R3), F18
	FMOVD	152(R3), F19
	FMOVD	160(R3), F20
	FMOVD	168(R3), F21
	FMOVD	176(R3), F22
	FMOVD	184(R3), F23
	FMOVD	192(R3), F24
	FMOVD	200(R3), F25
	FMOVD	208(R3), F26
	FMOVD	216(R3), F27
	FMOVD	224(R3), F28
	FMOVD	232(R3), F29
	FMOVD	240(R3), F30
	FMOVD	248(R3), F31

	RETURN

TEXT	clrfptrap(SB), $0
	FPON(R4, R5)
	MOVFL	$0, FPSCR(5)
	MOVFL	$0, FPSCR(3)
	MOVFL	$0, FPSCR(2)
	MOVFL	$0, FPSCR(1)
	MOVFL	$0, FPSCR(0)
	FPPREV(R4)
	RETURN

TEXT	fpinit(SB), $0
	FPON(R4, R5)
	BL	kfpinit(SB)
	RETURN

TEXT	fpoff(SB), $0
	FPOFF(R4, R5)
	RETURN


TEXT	FPsave(SB), 1, $0
	FPON(R4, R5)
	MOVFL	FPSCR, F0
	FMOVD	F0, 0(R3)
	FPPREV(R4)
	RETURN

TEXT	FPrestore(SB), 1, $0
	FPON(R4, R5)
	FMOVD	0(R3), F0
	MOVFL	F0, FPSCR
	FPPREV(R4)
	RETURN