]>
Commit | Line | Data |
---|---|---|
fcc392a3 | 1 | # MIPS DSP ASE simulator testsuite utility functions. |
618f726f | 2 | # Copyright (C) 2005-2016 Free Software Foundation, Inc. |
fcc392a3 CF |
3 | # Contributed by MIPS Technologies, Inc. Written by Chao-ying Fu. |
4 | # | |
5 | # This file is part of the GNU simulators. | |
6 | # | |
7 | # This program is free software; you can redistribute it and/or modify | |
8 | # it under the terms of the GNU General Public License as published by | |
db95e312 JB |
9 | # the Free Software Foundation; either version 3 of the License, or |
10 | # (at your option) any later version. | |
fcc392a3 CF |
11 | # |
12 | # This program is distributed in the hope that it will be useful, | |
13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | # GNU General Public License for more details. | |
16 | # | |
db95e312 JB |
17 | # You should have received a copy of the GNU General Public License |
18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
fcc392a3 CF |
19 | |
20 | # $4, $5, $6, $7, $ac0, $ac1, $ac2, $ac3 are used as temps by the macros | |
21 | # defined here. | |
22 | ||
23 | # If a != b, jump to _fail. | |
24 | # Otherwise, fall through. | |
25 | .macro dsp_assert a, b | |
26 | beq \a, \b, 1f | |
27 | nop | |
28 | j _fail | |
29 | nop | |
30 | 1: | |
31 | .endm | |
32 | ||
33 | # Set dsp control register <= crin | |
34 | # Check if d == (inst ?, s, t) | |
35 | # Check if crout == dsp control register | |
36 | .macro dspck_dstio inst, d, s, t, crin, crout | |
37 | li $4, \crin | |
38 | wrdsp $4 | |
39 | li $4, \s | |
40 | li $5, \t | |
41 | \inst $6, $4, $5 | |
42 | li $7, \d | |
43 | dsp_assert $6, $7 | |
44 | li $4, \crout | |
45 | rddsp $5 | |
46 | dsp_assert $4, $5 | |
47 | .endm | |
48 | ||
49 | # Set dsp control register <= crin | |
50 | # (inst s, t) | |
51 | # Check if crout == dsp control register | |
52 | .macro dspck_stio inst, s, t, crin, crout | |
53 | li $4, \crin | |
54 | wrdsp $4 | |
55 | li $4, \s | |
56 | li $5, \t | |
57 | \inst $4, $5 | |
58 | li $4, \crout | |
59 | rddsp $5 | |
60 | dsp_assert $4, $5 | |
61 | .endm | |
62 | ||
63 | # Set dsp control register <= crin | |
64 | # Check if d == (inst ?, s, t) | |
65 | .macro dspck_dsti inst, d, s, t, crin | |
66 | li $4, \crin | |
67 | wrdsp $4 | |
68 | li $4, \s | |
69 | li $5, \t | |
70 | \inst $6, $4, $5 | |
71 | li $7, \d | |
72 | dsp_assert $6, $7 | |
73 | .endm | |
74 | ||
75 | # Set dsp control register <= crin | |
76 | # Check if tou == (inst tin, s) | |
77 | .macro dspck_tsi inst, tou, tin, s, crin | |
78 | li $4, \crin | |
79 | wrdsp $4 | |
80 | li $4, \s | |
81 | li $5, \tin | |
82 | \inst $5, $4 | |
83 | li $6, \tou | |
84 | dsp_assert $5, $6 | |
85 | .endm | |
86 | ||
87 | # Set dsp control register <= crin | |
88 | # Check if d == (inst ?, imm) | |
89 | # Check if crout == dsp control register | |
90 | .macro dspck_dIio inst, d, imm, crin, crout | |
91 | li $4, \crin | |
92 | wrdsp $4 | |
93 | \inst $5, \imm | |
94 | li $6, \d | |
95 | dsp_assert $5, $6 | |
96 | li $4, \crout | |
97 | rddsp $5 | |
98 | dsp_assert $4, $5 | |
99 | .endm | |
100 | ||
101 | # Set dsp control register <= crin | |
102 | # Check if d == (inst ?, s) | |
103 | # Check if crout == dsp control register | |
104 | .macro dspck_dsio inst, d, s, crin, crout | |
105 | li $4, \crin | |
106 | wrdsp $4 | |
107 | li $4, \s | |
108 | \inst $6, $4 | |
109 | li $7, \d | |
110 | dsp_assert $6, $7 | |
111 | li $4, \crout | |
112 | rddsp $5 | |
113 | dsp_assert $4, $5 | |
114 | .endm | |
115 | ||
116 | # Set dsp control register <= crin | |
117 | # Check if d == (inst ?, t, sa) | |
118 | # Check if crout == dsp control register | |
119 | .macro dspck_dtsaio inst, d, t, sa, crin, crout | |
120 | li $4, \crin | |
121 | wrdsp $4 | |
122 | li $4, \t | |
123 | \inst $6, $4, \sa | |
124 | li $7, \d | |
125 | dsp_assert $6, $7 | |
126 | li $4, \crout | |
127 | rddsp $5 | |
128 | dsp_assert $4, $5 | |
129 | .endm | |
130 | ||
131 | # Set dsp control register <= crin | |
132 | # Check if d == (inst ?, t, sa) | |
133 | .macro dspck_dtsai inst, d, t, sa, crin | |
134 | li $4, \crin | |
135 | wrdsp $4 | |
136 | li $4, \t | |
137 | \inst $6, $4, \sa | |
138 | li $7, \d | |
139 | dsp_assert $6, $7 | |
140 | .endm | |
141 | ||
142 | # Set dsp control register <= crin | |
143 | # Set $ac3 <= {hiin, loin} | |
144 | # (inst $ac3, s, t) | |
145 | # Check if {hiou, loou} == $ac3 | |
146 | # Check if (crout & 0x80000) == (dsp control register & 0x80000) | |
147 | .macro dspck_astio inst, hiin, loin, hiou, loou, s, t, crin, crout | |
148 | li $4, \crin | |
149 | wrdsp $4 | |
150 | li $4, \hiin | |
151 | mthi $4, $ac3 | |
152 | li $4, \loin | |
153 | mtlo $4, $ac3 | |
154 | li $4, \s | |
155 | li $5, \t | |
156 | \inst $ac3, $4, $5 | |
157 | li $4, \hiou | |
158 | mfhi $5, $ac3 | |
159 | dsp_assert $4, $5 | |
160 | li $4, \loou | |
161 | mflo $5, $ac3 | |
162 | dsp_assert $4, $5 | |
163 | li $4, \crout | |
164 | and $4, $4, 0x80000 | |
165 | rddsp $5 | |
166 | and $5, $5, 0x80000 | |
167 | dsp_assert $4, $5 | |
168 | .endm | |
169 | ||
170 | # Set dsp control register <= crin | |
171 | # Set $ac1 <= {hi, lo} | |
172 | # Check if t == (inst ? $ac1, sa) | |
173 | # Check if crout == dsp control register | |
174 | .macro dspck_atsaio inst, hi, lo, t, sa, crin, crout | |
175 | li $4, \crin | |
176 | wrdsp $4 | |
177 | li $4, \hi | |
178 | mthi $4, $ac1 | |
179 | li $4, \lo | |
180 | mtlo $4, $ac1 | |
181 | \inst $5, $ac1, \sa | |
182 | li $6, \t | |
183 | dsp_assert $5, $6 | |
184 | li $4, \crout | |
185 | rddsp $5 | |
186 | dsp_assert $4, $5 | |
187 | .endm | |
188 | ||
8b082fb1 TS |
189 | # Set dsp control register <= crin |
190 | # Set acc <= {hiin, loin} | |
191 | # (inst acc, s, t) | |
192 | # Check if {hiou, loou} == acc | |
193 | # Check if (crout & 0x80000) == (dsp control register & 0x80000) | |
194 | .macro dspckacc_astio inst, acc, hiin, loin, hiou, loou, s, t, crin, crout | |
195 | li $4, \crin | |
196 | wrdsp $4 | |
197 | li $4, \hiin | |
198 | mthi $4, \acc | |
199 | li $4, \loin | |
200 | mtlo $4, \acc | |
201 | li $4, \s | |
202 | li $5, \t | |
203 | \inst \acc, $4, $5 | |
204 | li $4, \hiou | |
205 | mfhi $5, \acc | |
206 | dsp_assert $4, $5 | |
207 | li $4, \loou | |
208 | mflo $5, \acc | |
209 | dsp_assert $4, $5 | |
210 | li $4, \crout | |
211 | and $4, $4, 0x80000 | |
212 | rddsp $5 | |
213 | and $5, $5, 0x80000 | |
214 | dsp_assert $4, $5 | |
215 | .endm | |
216 | ||
fcc392a3 CF |
217 | # Set dsp control register <= crin |
218 | # Set $ac1 <= {hi, lo} | |
219 | # Check if t == (inst ? $ac1, s) | |
220 | # Check if crout == dsp control register | |
221 | .macro dspck_atsio inst, hi, lo, t, s, crin, crout | |
222 | li $4, \crin | |
223 | wrdsp $4 | |
224 | li $4, \hi | |
225 | mthi $4, $ac1 | |
226 | li $4, \lo | |
227 | mtlo $4, $ac1 | |
228 | li $4, \s | |
229 | \inst $5, $ac1, $4 | |
230 | li $6, \t | |
231 | dsp_assert $5, $6 | |
232 | li $4, \crout | |
233 | rddsp $5 | |
234 | dsp_assert $4, $5 | |
235 | .endm | |
236 | ||
237 | # Set dsp control register <= (crin & crinmask) | |
238 | # Set $ac2 <= {hi, lo} | |
239 | # Check if t == (inst ? $ac2, size) | |
240 | # Check if (crout & croutmask) == (dsp control register & croutmask) | |
241 | .macro dspck_tasiimom inst, hi, lo, t, size, crin, crinmask, crout, croutmask | |
242 | li $4, \crin | |
243 | and $4, \crinmask | |
244 | wrdsp $4 | |
245 | li $4, \hi | |
246 | mthi $4, $ac2 | |
247 | li $4, \lo | |
248 | mtlo $4, $ac2 | |
249 | \inst $5, $ac2, \size | |
250 | li $6, \t | |
251 | dsp_assert $5, $6 | |
252 | li $4, \crout | |
253 | and $4, \croutmask | |
254 | rddsp $5 | |
255 | and $5, \croutmask | |
256 | dsp_assert $4, $5 | |
257 | .endm | |
258 | ||
259 | # Set dsp control register <= (crin & crinmask) | |
260 | # Set $ac2 <= {hi, lo} | |
261 | # Check if t == (inst ? $ac2, size) | |
262 | .macro dspck_tasiim inst, hi, lo, t, size, crin, crinmask | |
263 | li $4, \crin | |
264 | and $4, \crinmask | |
265 | wrdsp $4 | |
266 | li $4, \hi | |
267 | mthi $4, $ac2 | |
268 | li $4, \lo | |
269 | mtlo $4, $ac2 | |
270 | \inst $5, $ac2, \size | |
271 | li $6, \t | |
272 | dsp_assert $5, $6 | |
273 | .endm | |
274 | ||
275 | # Set dsp control register <= (crin & crinmask) | |
276 | # Set $ac2 <= {hi, lo} | |
277 | # Check if t == (inst ? $ac2, s) | |
278 | # Check if (crout & croutmask) == (dsp control register & croutmask) | |
279 | .macro dspck_tasimom inst, hi, lo, t, s, crin, crinmask, crout, croutmask | |
280 | li $4, \crin | |
281 | and $4, \crinmask | |
282 | wrdsp $4 | |
283 | li $4, \hi | |
284 | mthi $4, $ac2 | |
285 | li $4, \lo | |
286 | mtlo $4, $ac2 | |
287 | li $4, \s | |
288 | \inst $5, $ac2, $4 | |
289 | li $6, \t | |
290 | dsp_assert $5, $6 | |
291 | li $4, \crout | |
292 | and $4, \croutmask | |
293 | rddsp $5 | |
294 | and $5, \croutmask | |
295 | dsp_assert $4, $5 | |
296 | .endm | |
297 | ||
298 | # Set dsp control register <= (crin & crinmask) | |
299 | # Set $ac2 <= {hi, lo} | |
300 | # Check if t == (inst ? $ac2, s) | |
301 | .macro dspck_tasim inst, hi, lo, t, s, crin, crinmask | |
302 | li $4, \crin | |
303 | and $4, \crinmask | |
304 | wrdsp $4 | |
305 | li $4, \hi | |
306 | mthi $4, $ac2 | |
307 | li $4, \lo | |
308 | mtlo $4, $ac2 | |
309 | li $4, \s | |
310 | \inst $5, $ac2, $4 | |
311 | li $6, \t | |
312 | dsp_assert $5, $6 | |
313 | .endm | |
314 | ||
315 | # Set dsp control register <= crin | |
316 | # Set $ac0 <= {hi, lo} | |
317 | # (inst $ac0, shift) | |
318 | # Check if $ac0 == {hio, loo} | |
319 | # Check if crout == dsp control register | |
320 | .macro dspck_asaio inst, hi, lo, hio, loo, shift, crin, crout | |
321 | li $4, \crin | |
322 | wrdsp $4 | |
323 | li $4, \hi | |
324 | mthi $4, $ac0 | |
325 | li $4, \lo | |
326 | mtlo $4, $ac0 | |
327 | \inst $ac0, \shift | |
328 | mfhi $5, $ac0 | |
329 | li $6, \hio | |
330 | dsp_assert $5, $6 | |
331 | mflo $5, $ac0 | |
332 | li $6, \loo | |
333 | dsp_assert $5, $6 | |
334 | li $4, \crout | |
335 | rddsp $5 | |
336 | dsp_assert $4, $5 | |
337 | .endm | |
338 | ||
339 | # Set dsp control register <= crin | |
340 | # Set $ac0 <= {hi, lo} | |
341 | # (inst $ac0, s) | |
342 | # Check if $ac0 == {hio, loo} | |
343 | # Check if crout == dsp control register | |
344 | .macro dspck_asio inst, hi, lo, hio, loo, s, crin, crout | |
345 | li $4, \crin | |
346 | wrdsp $4 | |
347 | li $4, \hi | |
348 | mthi $4, $ac0 | |
349 | li $4, \lo | |
350 | mtlo $4, $ac0 | |
351 | li $4, \s | |
352 | \inst $ac0, $4 | |
353 | mfhi $5, $ac0 | |
354 | li $6, \hio | |
355 | dsp_assert $5, $6 | |
356 | mflo $5, $ac0 | |
357 | li $6, \loo | |
358 | dsp_assert $5, $6 | |
359 | li $4, \crout | |
360 | rddsp $5 | |
361 | dsp_assert $4, $5 | |
362 | .endm | |
363 | ||
364 | # Set dsp control register <= crin | |
365 | # Set $ac3 <= {hi, lo} | |
366 | # Check if s == (inst ? $ac3) | |
367 | # Check if $ac3 == {hio, loo} | |
368 | # Check if crout == dsp control register | |
369 | .macro dspck_saio inst, hi, lo, hio, loo, s, crin, crout | |
370 | li $4, \crin | |
371 | wrdsp $4 | |
372 | li $4, \hi | |
373 | mthi $4, $ac3 | |
374 | li $4, \lo | |
375 | mtlo $4, $ac3 | |
376 | li $5, \s | |
377 | \inst $5, $ac3 | |
378 | mfhi $5, $ac3 | |
379 | li $6, \hio | |
380 | dsp_assert $5, $6 | |
381 | mflo $5, $ac3 | |
382 | li $6, \loo | |
383 | dsp_assert $5, $6 | |
384 | li $4, \crout | |
385 | rddsp $5 | |
386 | dsp_assert $4, $5 | |
387 | .endm | |
388 | ||
389 | # Set dsp control register <= crin | |
390 | # (wrdsp s, m) | |
391 | # Check if crout == dsp control register | |
392 | .macro dspck_wrdsp s, m, crin, crout | |
393 | li $4, \crin | |
394 | wrdsp $4 | |
395 | li $5, \s | |
396 | wrdsp $5, \m | |
397 | li $6, \crout | |
398 | rddsp $7 | |
399 | dsp_assert $6, $7 | |
400 | .endm | |
401 | ||
402 | # Set dsp control register <= crin | |
403 | # Check if d == (rddsp ?, m) | |
404 | .macro dspck_rddsp d, m, crin | |
405 | li $4, \crin | |
406 | wrdsp $4 | |
407 | rddsp $5, \m | |
408 | li $6, \d | |
409 | dsp_assert $5, $6 | |
410 | .endm | |
411 | ||
412 | # Check if d == (inst i(b)) | |
413 | .macro dspck_load inst, d, i, b | |
414 | li $4, \i | |
415 | la $5, \b | |
416 | \inst $6, $4($5) | |
417 | li $7, \d | |
418 | dsp_assert $6, $7 | |
419 | .endm | |
420 | ||
421 | # Set dsp control register <= crin | |
422 | # Check if bposge32 is taken or not as expected in r | |
423 | # (1 => taken, 0 => not taken) | |
424 | .macro dspck_bposge32 crin, r | |
425 | li $4, \crin | |
426 | wrdsp $4 | |
427 | li $5, 1 | |
428 | bposge32 1f | |
429 | nop | |
430 | li $5, 0 | |
431 | 1: | |
432 | li $6, \r | |
433 | dsp_assert $5, $6 | |
434 | .endm | |
8b082fb1 TS |
435 | |
436 | # Check if tou == (inst tin, s) | |
437 | .macro dspck_tsimm inst, tou, tin, s, sa | |
438 | li $4, \s | |
439 | li $5, \tin | |
440 | \inst $5, $4, \sa | |
441 | li $6, \tou | |
442 | dsp_assert $5, $6 | |
443 | .endm |