fpu64-ps.s revision 1.1 1 1.1 christos # mips test sanity, expected to pass.
2 1.1 christos # mach: mips64 sb1
3 1.1 christos # as: -mabi=eabi
4 1.1 christos # ld: -N -Ttext=0x80010000
5 1.1 christos # output: *\\npass\\n
6 1.1 christos
7 1.1 christos .include "testutils.inc"
8 1.1 christos
9 1.1 christos .macro check_ps psval, upperval, lowerval
10 1.1 christos .set push
11 1.1 christos .set noreorder
12 1.1 christos cvt.s.pu $f0, \psval # upper
13 1.1 christos cvt.s.pl $f2, \psval # lower
14 1.1 christos li.s $f4, \upperval
15 1.1 christos li.s $f6, \lowerval
16 1.1 christos c.eq.s $fcc0, $f0, $f4
17 1.1 christos bc1f $fcc0, _fail
18 1.1 christos c.eq.s $fcc0, $f2, $f6
19 1.1 christos bc1f $fcc0, _fail
20 1.1 christos nop
21 1.1 christos .set pop
22 1.1 christos .endm
23 1.1 christos
24 1.1 christos setup
25 1.1 christos
26 1.1 christos .set noreorder
27 1.1 christos
28 1.1 christos .ent DIAG
29 1.1 christos DIAG:
30 1.1 christos
31 1.1 christos # make sure that Status.FR and .CU1 are set.
32 1.1 christos mfc0 $2, $12
33 1.1 christos or $2, $2, (1 << 26) | (1 << 29)
34 1.1 christos mtc0 $2, $12
35 1.1 christos
36 1.1 christos
37 1.1 christos writemsg "ldc1"
38 1.1 christos
39 1.1 christos .data
40 1.1 christos 1: .dword 0xc1a8000042200000 # -21.0, 40.0
41 1.1 christos .text
42 1.1 christos la $2, 1b
43 1.1 christos ldc1 $f8, 0($2)
44 1.1 christos check_ps $f8, -21.0, 40.0
45 1.1 christos
46 1.1 christos
47 1.1 christos writemsg "cvt.ps.s"
48 1.1 christos
49 1.1 christos li.s $f10, 1.0
50 1.1 christos li.s $f12, 3.0
51 1.1 christos cvt.ps.s $f8, $f10, $f12 # upper, lower
52 1.1 christos check_ps $f8, 1.0, 3.0
53 1.1 christos
54 1.1 christos
55 1.1 christos writemsg "cvt.ps.s, sdc1, copy, ldc1"
56 1.1 christos
57 1.1 christos .data
58 1.1 christos 1: .dword 0
59 1.1 christos .dword 0
60 1.1 christos .text
61 1.1 christos la $2, 1b
62 1.1 christos li.s $f12, -4.0
63 1.1 christos li.s $f14, 32.0
64 1.1 christos cvt.ps.s $f10, $f12, $f14 # upper, lower
65 1.1 christos sdc1 $f10, 8($2)
66 1.1 christos lw $3, 8($2)
67 1.1 christos lw $4, 12($2)
68 1.1 christos sw $3, 0($2)
69 1.1 christos sw $4, 4($2)
70 1.1 christos ldc1 $f8, 0($2)
71 1.1 christos check_ps $f8, -4.0, 32.0
72 1.1 christos
73 1.1 christos
74 1.1 christos # Load some constants for later use
75 1.1 christos
76 1.1 christos li.s $f10, 4.0
77 1.1 christos li.s $f12, 16.0
78 1.1 christos cvt.ps.s $f20, $f10, $f12 # $f20: u=4.0, l=16.0
79 1.1 christos
80 1.1 christos li.s $f10, -1.0
81 1.1 christos li.s $f12, 2.0
82 1.1 christos cvt.ps.s $f22, $f10, $f12 # $f22: u=-1.0, l=2.0
83 1.1 christos
84 1.1 christos li.s $f10, 17.0
85 1.1 christos li.s $f12, -8.0
86 1.1 christos cvt.ps.s $f24, $f10, $f12 # $f24: u=17.0, l=-8.0
87 1.1 christos
88 1.1 christos
89 1.1 christos writemsg "pll.ps"
90 1.1 christos
91 1.1 christos pll.ps $f8, $f20, $f22
92 1.1 christos check_ps $f8, 16.0, 2.0
93 1.1 christos
94 1.1 christos
95 1.1 christos writemsg "plu.ps"
96 1.1 christos
97 1.1 christos plu.ps $f8, $f20, $f22
98 1.1 christos check_ps $f8, 16.0, -1.0
99 1.1 christos
100 1.1 christos
101 1.1 christos writemsg "pul.ps"
102 1.1 christos
103 1.1 christos pul.ps $f8, $f20, $f22
104 1.1 christos check_ps $f8, 4.0, 2.0
105 1.1 christos
106 1.1 christos
107 1.1 christos writemsg "puu.ps"
108 1.1 christos
109 1.1 christos puu.ps $f8, $f20, $f22
110 1.1 christos check_ps $f8, 4.0, -1.0
111 1.1 christos
112 1.1 christos
113 1.1 christos writemsg "abs.ps"
114 1.1 christos
115 1.1 christos abs.ps $f8, $f22
116 1.1 christos check_ps $f8, 1.0, 2.0
117 1.1 christos
118 1.1 christos
119 1.1 christos writemsg "mov.ps"
120 1.1 christos
121 1.1 christos mov.ps $f8, $f22
122 1.1 christos check_ps $f8, -1.0, 2.0
123 1.1 christos
124 1.1 christos
125 1.1 christos writemsg "neg.ps"
126 1.1 christos
127 1.1 christos neg.ps $f8, $f22
128 1.1 christos check_ps $f8, 1.0, -2.0
129 1.1 christos
130 1.1 christos
131 1.1 christos writemsg "add.ps"
132 1.1 christos
133 1.1 christos add.ps $f8, $f20, $f22
134 1.1 christos check_ps $f8, 3.0, 18.0
135 1.1 christos
136 1.1 christos
137 1.1 christos writemsg "mul.ps"
138 1.1 christos
139 1.1 christos mul.ps $f8, $f20, $f22
140 1.1 christos check_ps $f8, -4.0, 32.0
141 1.1 christos
142 1.1 christos
143 1.1 christos writemsg "sub.ps"
144 1.1 christos
145 1.1 christos sub.ps $f8, $f20, $f22
146 1.1 christos check_ps $f8, 5.0, 14.0
147 1.1 christos
148 1.1 christos
149 1.1 christos writemsg "madd.ps"
150 1.1 christos
151 1.1 christos madd.ps $f8, $f24, $f20, $f22
152 1.1 christos check_ps $f8, 13.0, 24.0
153 1.1 christos
154 1.1 christos
155 1.1 christos writemsg "msub.ps"
156 1.1 christos
157 1.1 christos msub.ps $f8, $f24, $f20, $f22
158 1.1 christos check_ps $f8, -21.0, 40.0
159 1.1 christos
160 1.1 christos
161 1.1 christos writemsg "nmadd.ps"
162 1.1 christos
163 1.1 christos nmadd.ps $f8, $f24, $f20, $f22
164 1.1 christos check_ps $f8, -13.0, -24.0
165 1.1 christos
166 1.1 christos
167 1.1 christos writemsg "nmsub.ps"
168 1.1 christos
169 1.1 christos nmsub.ps $f8, $f24, $f20, $f22
170 1.1 christos check_ps $f8, 21.0, -40.0
171 1.1 christos
172 1.1 christos
173 1.1 christos writemsg "movn.ps (n)"
174 1.1 christos
175 1.1 christos li $2, 0
176 1.1 christos mov.ps $f8, $f20
177 1.1 christos movn.ps $f8, $f22, $2 # doesn't move
178 1.1 christos check_ps $f8, 4.0, 16.0
179 1.1 christos
180 1.1 christos
181 1.1 christos writemsg "movn.ps (y)"
182 1.1 christos
183 1.1 christos li $2, 1
184 1.1 christos mov.ps $f8, $f20
185 1.1 christos movn.ps $f8, $f22, $2 # does move
186 1.1 christos check_ps $f8, -1.0, 2.0
187 1.1 christos
188 1.1 christos
189 1.1 christos writemsg "movz.ps (y)"
190 1.1 christos
191 1.1 christos li $2, 0
192 1.1 christos mov.ps $f8, $f20
193 1.1 christos movz.ps $f8, $f22, $2 # does move
194 1.1 christos check_ps $f8, -1.0, 2.0
195 1.1 christos
196 1.1 christos
197 1.1 christos writemsg "movz.ps (n)"
198 1.1 christos
199 1.1 christos li $2, 1
200 1.1 christos mov.ps $f8, $f20
201 1.1 christos movz.ps $f8, $f22, $2 # doesn't move
202 1.1 christos check_ps $f8, 4.0, 16.0
203 1.1 christos
204 1.1 christos
205 1.1 christos writemsg "movf.ps (y,y)"
206 1.1 christos
207 1.1 christos cfc1 $2, $31
208 1.1 christos or $2, $2, (1 << 23) | (1 << 25)
209 1.1 christos xor $2, $2, (1 << 23) | (1 << 25)
210 1.1 christos ctc1 $2, $31 # clear fcc0, clear fcc1
211 1.1 christos mov.ps $f8, $f20
212 1.1 christos movf.ps $f8, $f22, $fcc0 # moves both halves
213 1.1 christos check_ps $f8, -1.0, 2.0
214 1.1 christos
215 1.1 christos
216 1.1 christos writemsg "movf.ps (y,n)"
217 1.1 christos
218 1.1 christos cfc1 $2, $31
219 1.1 christos or $2, $2, (1 << 23) | (1 << 25)
220 1.1 christos xor $2, $2, (0 << 23) | (1 << 25)
221 1.1 christos ctc1 $2, $31 # set fcc0, clear fcc1
222 1.1 christos mov.ps $f8, $f20
223 1.1 christos movf.ps $f8, $f22, $fcc0 # moves upper half only
224 1.1 christos check_ps $f8, -1.0, 16.0
225 1.1 christos
226 1.1 christos
227 1.1 christos writemsg "movf.ps (n,y)"
228 1.1 christos
229 1.1 christos cfc1 $2, $31
230 1.1 christos or $2, $2, (1 << 23) | (1 << 25)
231 1.1 christos xor $2, $2, (1 << 23) | (0 << 25)
232 1.1 christos ctc1 $2, $31 # clear fcc0, set fcc1
233 1.1 christos mov.ps $f8, $f20
234 1.1 christos movf.ps $f8, $f22, $fcc0 # moves lower half only
235 1.1 christos check_ps $f8, 4.0, 2.0
236 1.1 christos
237 1.1 christos
238 1.1 christos writemsg "movf.ps (n,n)"
239 1.1 christos
240 1.1 christos cfc1 $2, $31
241 1.1 christos or $2, $2, (1 << 23) | (1 << 25)
242 1.1 christos xor $2, $2, (0 << 23) | (0 << 25)
243 1.1 christos ctc1 $2, $31 # set fcc0, set fcc1
244 1.1 christos mov.ps $f8, $f20
245 1.1 christos movf.ps $f8, $f22, $fcc0 # doesn't move either half
246 1.1 christos check_ps $f8, 4.0, 16.0
247 1.1 christos
248 1.1 christos
249 1.1 christos writemsg "movt.ps (n,n)"
250 1.1 christos
251 1.1 christos cfc1 $2, $31
252 1.1 christos or $2, $2, (1 << 23) | (1 << 25)
253 1.1 christos xor $2, $2, (1 << 23) | (1 << 25)
254 1.1 christos ctc1 $2, $31 # clear fcc0, clear fcc1
255 1.1 christos mov.ps $f8, $f20
256 1.1 christos movt.ps $f8, $f22, $fcc0 # doesn't move either half
257 1.1 christos check_ps $f8, 4.0, 16.0
258 1.1 christos
259 1.1 christos
260 1.1 christos writemsg "movt.ps (n,y)"
261 1.1 christos
262 1.1 christos cfc1 $2, $31
263 1.1 christos or $2, $2, (1 << 23) | (1 << 25)
264 1.1 christos xor $2, $2, (0 << 23) | (1 << 25)
265 1.1 christos ctc1 $2, $31 # set fcc0, clear fcc1
266 1.1 christos mov.ps $f8, $f20
267 1.1 christos movt.ps $f8, $f22, $fcc0 # moves lower half only
268 1.1 christos check_ps $f8, 4.0, 2.0
269 1.1 christos
270 1.1 christos
271 1.1 christos writemsg "movt.ps (y,n)"
272 1.1 christos
273 1.1 christos cfc1 $2, $31
274 1.1 christos or $2, $2, (1 << 23) | (1 << 25)
275 1.1 christos xor $2, $2, (1 << 23) | (0 << 25)
276 1.1 christos ctc1 $2, $31 # clear fcc0, set fcc1
277 1.1 christos mov.ps $f8, $f20
278 1.1 christos movt.ps $f8, $f22, $fcc0 # moves upper half only
279 1.1 christos check_ps $f8, -1.0, 16.0
280 1.1 christos
281 1.1 christos
282 1.1 christos writemsg "movt.ps (y,y)"
283 1.1 christos
284 1.1 christos cfc1 $2, $31
285 1.1 christos or $2, $2, (1 << 23) | (1 << 25)
286 1.1 christos xor $2, $2, (0 << 23) | (0 << 25)
287 1.1 christos ctc1 $2, $31 # set fcc0, set fcc1
288 1.1 christos mov.ps $f8, $f20
289 1.1 christos movt.ps $f8, $f22, $fcc0 # moves both halves
290 1.1 christos check_ps $f8, -1.0, 2.0
291 1.1 christos
292 1.1 christos
293 1.1 christos writemsg "alnv.ps (aligned)"
294 1.1 christos
295 1.1 christos .data
296 1.1 christos 1: .dword 0xc1a8000042200000 # -21.0, 40.0
297 1.1 christos .dword 0xc228000041a00000 # -42.0, 20.0
298 1.1 christos .text
299 1.1 christos la $2, 1b
300 1.1 christos li $3, 0
301 1.1 christos addu $4, $3, 8
302 1.1 christos luxc1 $f10, $3($2)
303 1.1 christos luxc1 $f12, $4($2)
304 1.1 christos alnv.ps $f8, $f10, $f12, $3
305 1.1 christos check_ps $f8, -21.0, 40.0
306 1.1 christos
307 1.1 christos
308 1.1 christos writemsg "alnv.ps (unaligned)"
309 1.1 christos
310 1.1 christos .data
311 1.1 christos 1: .dword 0xc1a8000042200000 # -21.0, 40.0
312 1.1 christos .dword 0xc228000041a00000 # -42.0, 20.0
313 1.1 christos .hword 0x0001
314 1.1 christos .text
315 1.1 christos la $2, 1b
316 1.1 christos li $3, 4
317 1.1 christos addu $4, $3, 8
318 1.1 christos luxc1 $f10, $3($2)
319 1.1 christos luxc1 $f12, $4($2)
320 1.1 christos alnv.ps $f8, $f10, $f12, $3
321 1.1 christos
322 1.1 christos lb $5, 16($2)
323 1.1 christos bnez $5, 2f # little endian
324 1.1 christos nop
325 1.1 christos
326 1.1 christos # big endian
327 1.1 christos check_ps $f8, 40.0, -42.0
328 1.1 christos b 3f
329 1.1 christos nop
330 1.1 christos 2:
331 1.1 christos # little endian
332 1.1 christos check_ps $f8, 20.0, -21.0
333 1.1 christos 3:
334 1.1 christos
335 1.1 christos
336 1.1 christos # We test c.cond.ps only lightly, just to make sure it modifies
337 1.1 christos # two bits and compares the halves separately. Perhaps it should
338 1.1 christos # be tested more thoroughly.
339 1.1 christos
340 1.1 christos writemsg "c.f.ps"
341 1.1 christos
342 1.1 christos cfc1 $2, $31
343 1.1 christos or $2, $2, (1 << 23) | (0x7f << 25)
344 1.1 christos ctc1 $2, $31 # set all fcc bits
345 1.1 christos c.f.ps $fcc0, $f8, $f8 # -> f, f
346 1.1 christos bc1t $fcc0, _fail
347 1.1 christos nop
348 1.1 christos bc1t $fcc1, _fail
349 1.1 christos nop
350 1.1 christos
351 1.1 christos
352 1.1 christos writemsg "c.olt.ps"
353 1.1 christos
354 1.1 christos cfc1 $2, $31
355 1.1 christos or $2, $2, (1 << 23) | (0x7f << 25)
356 1.1 christos xor $2, $2, (1 << 23) | (0x7f << 25)
357 1.1 christos ctc1 $2, $31 # clear all fcc bits
358 1.1 christos c.lt.ps $fcc0, $f22, $f24 # -> f, t
359 1.1 christos bc1t $fcc0, _fail
360 1.1 christos nop
361 1.1 christos bc1f $fcc1, _fail
362 1.1 christos nop
363 1.1 christos
364 1.1 christos
365 1.1 christos pass
366 1.1 christos
367 1.1 christos .end DIAG
368