2004-02-12 Michael Snyder <msnyder@redhat.com>
[external/binutils.git] / sim / testsuite / sim / sh / testutils.inc
1 # Support macros for the sh assembly test cases.
2
3         .equ    no_dsp,  0
4         .equ    yes_dsp, 1
5
6         .section        .rodata
7         .align 2
8 _pass:  .string "pass\n"
9 _fail:  .string "fail\n"
10 _stack: .fill   128, 4, 0
11 stackt: 
12
13         .macro  push reg
14         mov.l   \reg, @-r15
15         .endm
16
17         .macro  pop reg
18         mov.l   @r15+, \reg
19         .endm
20
21         .macro start
22         .text
23         .align 1
24         .global start
25 start:  mov.l   stackp, r15
26         bra     main
27         nop
28         .align 2
29 stackp: .long   stackt
30 mpass:
31         mov     #4, r4
32         mov     #1, r5
33         mov.l   ppass, r6
34         mov     #5, r7
35         trapa   #34
36         rts
37         nop
38 mfail:
39         mov     #4, r4
40         mov     #1, r5
41         mov.l   pfail, r6
42         mov     #5, r7
43         trapa   #34
44         mov     #1, r5
45 mexit:
46         mov     #1, r4
47         mov     #0, r6
48         mov     #0, r7
49         trapa   #34
50         .align 2
51 ppass:  .long   _pass
52 pfail:  .long   _fail
53
54 mtesta5:
55         push    r0
56         mov.l   a5a5, r0
57         cmp/eq  r1, r0
58         bf      mfail
59         cmp/eq  r2, r0
60         bf      mfail
61         cmp/eq  r3, r0
62         bf      mfail
63         cmp/eq  r4, r0
64         bf      mfail
65         cmp/eq  r5, r0
66         bf      mfail
67         cmp/eq  r6, r0
68         bf      mfail
69         cmp/eq  r7, r0
70         bf      mfail
71         cmp/eq  r8, r0
72         bf      mfail
73         cmp/eq  r9, r0
74         bf      mfail
75         cmp/eq  r10, r0
76         bf      mfail
77         cmp/eq  r11, r0
78         bf      mfail
79         cmp/eq  r12, r0
80         bf      mfail
81         cmp/eq  r13, r0
82         bf      mfail
83         cmp/eq  r14, r0
84         bf      mfail
85         # restore and check r0
86         pop     r0
87         cmp/eq  r0, r1
88         bf      mfail
89         # pass
90         rts
91         nop
92 .if (sim_cpu == no_dsp)
93 mtesta5_fp:
94         push    r0
95         flds    fr0, fpul
96         sts     fpul, r0
97         push    r0
98         mov.l   a5a5, r0
99         lds     r0, fpul
100         fsts    fpul, fr0
101         fcmp/eq fr1, fr0
102         bf      mfail
103         fcmp/eq fr2, fr0
104         bf      mfail
105         fcmp/eq fr3, fr0
106         bf      mfail
107         fcmp/eq fr4, fr0
108         bf      mfail
109         fcmp/eq fr5, fr0
110         bf      mfail
111         fcmp/eq fr6, fr0
112         bf      mfail
113         fcmp/eq fr7, fr0
114         bf      mfail
115         fcmp/eq fr8, fr0
116         bf      mfail
117         fcmp/eq fr9, fr0
118         bf      mfail
119         fcmp/eq fr10, fr0
120         bf      mfail
121         fcmp/eq fr11, fr0
122         bf      mfail
123         fcmp/eq fr12, fr0
124         bf      mfail
125         fcmp/eq fr13, fr0
126         bf      mfail
127         fcmp/eq fr14, fr0
128         bf      mfail
129         fcmp/eq fr15, fr0
130         bf      mfail
131         # restore and check fr0
132         pop     r0
133         lds     r0, fpul
134         fsts    fpul, fr0
135         fcmp/eq fr0, fr1
136         bf      mfail
137         # restore r0 and pass
138         pop     r0
139         rts
140         nop
141 .endif
142
143 mseta5:
144         mov.l   a5a5, r0
145         mov.l   a5a5, r1
146         mov.l   a5a5, r2
147         mov.l   a5a5, r3
148         mov.l   a5a5, r4
149         mov.l   a5a5, r5
150         mov.l   a5a5, r6
151         mov.l   a5a5, r7
152         mov.l   a5a5, r8
153         mov.l   a5a5, r9
154         mov.l   a5a5, r10
155         mov.l   a5a5, r11
156         mov.l   a5a5, r12
157         mov.l   a5a5, r13
158         mov.l   a5a5, r14
159         rts
160         nop
161
162 .if (sim_cpu == no_dsp)
163 mseta5_fp:
164         push    r0
165         mov.l   a5a5, r0
166         lds     r0, fpul
167         fsts    fpul, fr0
168         fsts    fpul, fr1
169         fsts    fpul, fr2
170         fsts    fpul, fr3
171         fsts    fpul, fr4
172         fsts    fpul, fr5
173         fsts    fpul, fr6
174         fsts    fpul, fr7
175         fsts    fpul, fr8
176         fsts    fpul, fr9
177         fsts    fpul, fr10
178         fsts    fpul, fr11
179         fsts    fpul, fr12
180         fsts    fpul, fr13
181         fsts    fpul, fr14
182         fsts    fpul, fr15
183         pop     r0
184         rts
185         nop
186 .endif
187
188         .align 2
189 a5a5:   .long   0xa5a5a5a5
190 main:
191         .endm
192
193         .macro exit val
194         mov     #\val, r5
195         bra     mexit
196         nop
197         .endm
198
199         .macro pass
200         bsr     mpass
201         nop
202         .endm
203
204         .macro fail
205         bra     mfail
206         nop
207         .endm
208
209         # Assert value of register (any general register but r0)
210         # Preserves r0 on stack, restores it on success.
211         .macro assertreg val reg
212         push    r0
213         mov.l   .Larval\@, r0
214         cmp/eq  r0, \reg
215         bt      .Lar\@
216         fail
217         .align 2
218 .Larval\@:
219         .long   \val
220 .Lar\@: pop     r0
221         .endm
222
223         # Assert value of register zero
224         # Preserves r1 on stack, restores it on success.
225         .macro assertreg0 val
226         push    r1
227         mov.l   .Lazval\@, r1
228         cmp/eq  r1, r0
229         bt      .Laz\@
230         fail
231         .align 2
232 .Lazval\@:
233         .long   \val
234 .Laz\@: pop     r1
235         .endm
236
237         # Assert value of system register 
238         # [mach, macl, pr, dsr, a0, x0, x1, y0, y1, ...]
239         .macro assert_sreg val reg
240         push    r0
241         sts     \reg, r0
242         assertreg0 \val
243         pop     r0
244         .endm
245
246         # Assert value of system register that isn't directly stc-able
247         # [a1, m0, m1, ...]
248         .macro assert_sreg2 val reg
249         push    r0
250         sts     a0, r0
251         push    r0
252         pcopy   \reg, a0
253         sts     a0, r0
254         assertreg0 \val
255         pop     r0
256         lds     r0, a0
257         pop     r0
258         .endm
259
260         # Assert value of control register 
261         # [gbr, vbr, ssr, spc, sgr, dbr, r[0-7]_bank, sr, mod, re, rs, ...]
262         .macro assert_creg val reg
263         push    r0
264         stc     \reg, r0
265         assertreg0 \val
266         pop     r0
267         .endm
268
269         # Assert integer value of fp register
270         # Preserves r0 on stack, restores it on success
271         # Assumes single-precision fp mode
272         .macro assert_fpreg_i val freg
273         push    r0
274         ftrc    \freg, fpul
275         sts     fpul, r0
276         assertreg0      \val
277         pop     r0
278         .endm
279
280         # Assert integer value of dp register
281         # Preserves r0 on stack, restores it on success
282         # Assumes double-precision fp mode
283         .macro assert_dpreg_i val dreg
284         push    r0
285         ftrc    \dreg, fpul
286         sts     fpul, r0
287         assertreg0      \val
288         pop     r0
289         .endm
290
291         # Assert hex value of fp register
292         # Preserves r0 on stack, restores it on success
293         # Assumes single-precision fp mode
294         .macro assert_fpreg_x val freg
295         push    r0
296         flds    \freg, fpul
297         sts     fpul, r0
298         assertreg0      \val
299         pop     r0
300         .endm
301
302         # Set FP bank 0
303         # Saves and restores r0 and r1
304         .macro  bank0
305         push    r0
306         push    r1
307         mov     #32, r1
308         shll16  r1
309         not     r1, r1
310         sts     fpscr, r0
311         and     r1, r0
312         lds     r0, fpscr
313         pop     r1
314         pop     r0
315         .endm
316
317         # Set FP bank 1
318         .macro  bank1
319         push    r0
320         push    r1
321         mov     #32,  r1
322         shll16  r1
323         sts     fpscr, r0
324         or      r1, r0
325         lds     r0, fpscr
326         pop     r1
327         pop     r0
328         .endm
329
330         # Set FP 32-bit xfer
331         .macro  sz_32
332         push    r0
333         push    r1
334         mov     #16,  r1
335         shll16  r1
336         not     r1, r1
337         sts     fpscr, r0
338         and     r1, r0
339         lds     r0, fpscr
340         pop     r1
341         pop     r0
342         .endm
343
344         # Set FP 64-bit xfer
345         .macro  sz_64
346         push    r0
347         push    r1
348         mov     #16,  r1
349         shll16  r1
350         sts     fpscr, r0
351         or      r1, r0
352         lds     r0, fpscr
353         pop     r1
354         pop     r0
355         .endm
356
357         # Set FP single precision
358         .macro  single_prec
359         push    r0
360         push    r1
361         mov     #8, r1
362         shll16  r1
363         not     r1, r1
364         sts     fpscr, r0
365         and     r1, r0
366         lds     r0, fpscr
367         pop     r1
368         pop     r0
369         .endm
370
371         # Set FP double precision
372         .macro  double_prec
373         push    r0
374         push    r1
375         mov     #8, r1
376         shll16  r1
377         sts     fpscr, r0
378         or      r1, r0
379         lds     r0, fpscr
380         pop     r1
381         pop     r0
382         .endm
383
384         .macro  set_carry
385         sett
386         .endm
387
388         .macro  set_ovf
389         sett
390         .endm
391
392         .macro  clear_carry
393         clrt
394         .endm
395
396         .macro  clear_ovf
397         clrt
398         .endm
399
400         # sets, clrs
401
402
403         .macro set_grs_a5a5
404         bsr     mseta5
405         nop
406         .endm
407
408         .macro set_greg val greg
409         mov.l   gregval\@, \greg
410         bra     set_greg\@
411         nop
412         .align  2
413 gregval\@:      .long   \val
414 set_greg\@:
415         .endm
416
417         .macro set_fprs_a5a5
418         bsr     mseta5_fp
419         nop
420         .endm
421
422         .macro test_grs_a5a5
423         bsr     mtesta5
424         nop
425         .endm
426
427         .macro test_fprs_a5a5   
428         bsr     mtesta5_fp
429         nop
430         .endm
431
432         .macro test_gr_a5a5 reg
433         assertreg 0xa5a5a5a5 \reg
434         .endm
435
436         .macro test_fpr_a5a5 reg
437         assert_fpreg_x 0xa5a5a5a5 \reg
438         .endm
439
440         .macro test_gr0_a5a5
441         assertreg0 0xa5a5a5a5
442         .endm
443
444         # Perform a single to double precision floating point conversion.
445         # Assumes correct settings of fpscr.
446         .macro _s2d fpr dpr
447         flds \fpr, fpul
448         fcnvsd fpul, \dpr
449         .endm
450
451         # Manipulate the status register
452         .macro set_sr   val
453         push    r0
454         mov.l   .Lsrval\@, r0
455         ldc     r0, sr
456         pop     r0
457         bra     .Lsetsr\@
458         nop
459         .align 2
460 .Lsrval\@:
461         .long   \val
462 .Lsetsr\@:
463         .endm
464
465         .macro  get_sr  reg
466         stc     sr, \reg
467         .endm
468
469         .macro  test_sr val
470         push    r0
471         get_sr  r0
472         assertreg0 \val
473         pop     r0
474         .endm
475
476         .macro  set_sr_bit val
477         push    r0
478         push    r1
479         get_sr  r0
480         mov.l   .Lsrbitval\@, r1
481         or      r1, r0
482         ldc     r0, sr
483         pop     r1
484         pop     r0
485         bra     .Lsrbit\@
486         nop
487         .align 2
488 .Lsrbitval\@:
489         .long   \val
490 .Lsrbit\@:
491         .endm
492
493         .macro  test_sr_bit_set val
494         push    r0
495         push    r1
496         get_sr  r0
497         mov.l   .Ltsbsval\@, r1
498         tst     r1, r0
499         bf      .Ltsbs\@
500         fail
501         .align  2
502 .Ltsbsval\@:
503         .long   \val
504 .Ltsbs\@:
505         pop     r1
506         pop     r0
507         .endm
508
509         .macro  test_sr_bit_clear val
510         push    r0
511         push    r1
512         get_sr  r0
513         mov.l   .Ltsbcval\@, r1
514         not     r0, r0
515         tst     r1, r0
516         bf      .Ltsbc\@
517         fail
518         .align  2
519 .Ltsbcval\@:
520         .long   \val
521 .Ltsbc\@:
522         pop     r1
523         pop     r0
524         .endm
525
526         # Set system registers
527         .macro set_sreg val reg
528         # [mach, macl, pr, dsr, a0, x0, x1, y0, y1, ...]
529         push    r0
530         mov.l   .Lssrval\@, r0
531         lds     r0, \reg
532         pop     r0
533         bra     .Lssr\@
534         nop
535         .align 2
536 .Lssrval\@:
537         .long   \val
538 .Lssr\@:
539         .endm
540
541         .macro set_sreg2 val reg
542         # [a1, m0, m1, ...]
543         push    r0
544         sts     a0, r0
545         push    r0
546         mov.l   .Lssr2val\@, r0
547         lds     r0, a0
548         pcopy   a0, \reg
549         pop     r0
550         lds     r0, a0
551         pop     r0
552         bra     .Lssr2_\@
553         nop
554         .align 2
555 .Lssr2val\@:
556         .long   \val
557 .Lssr2_\@:
558         .endm
559
560
561         .macro set_creg val reg
562         # [gbr, vbr, ssr, spc, sgr, dbr... ]
563         push    r0
564         mov.l   .Lscrval\@, r0
565         ldc     r0, \reg
566         pop     r0
567         bra     .Lscr\@
568         nop
569         .align 2
570 .Lscrval\@:
571         .long   \val
572 .Lscr\@:
573         .endm
574
575         .macro  set_dctrue
576         push    r0
577         sts     dsr, r0
578         or      #1, r0
579         lds     r0, dsr
580         pop     r0
581         .endm
582
583         .macro  set_dcfalse
584         push    r0
585         sts     dsr, r0
586         not     r0, r0
587         or      #1, r0
588         not     r0, r0
589         lds     r0, dsr
590         pop     r0
591         .endm