This commit was generated by cvs2svn to track changes on a CVS vendor
[external/binutils.git] / sim / testsuite / sim / fr30 / testutils.inc
1 # r0, r4-r6 are used as tmps, consider them call clobbered by these macros.
2
3         .macro start
4         .data
5 failmsg:
6         .ascii "fail\n"
7 passmsg:
8         .ascii "pass\n"
9         .text
10         .global _start
11 _start:
12         ldi32 0x7fffc,sp        ; TODO -- what's a good value for this?
13         ldi32 0xffc00,r0
14         mov   r0,tbr            ; defined in manual
15         mov   sp,usp
16         mov   sp,ssp
17         .endm
18
19 ; Exit with return code
20         .macro exit rc
21         ldi32 \rc,r4
22         ldi32 #1,r0
23         int   #10
24         .endm
25
26 ; Pass the test case
27         .macro pass
28         ldi32 #5,r6
29         ldi32 #passmsg,r5
30         ldi32 #1,r4
31         ldi32 #5,r0
32         int   #10
33         exit  #0
34         .endm
35
36 ; Fail the testcase
37         .macro fail
38         ldi32 #5,r6
39         ldi32 #failmsg,r5
40         ldi32 #1,r4
41         ldi32 #5,r0
42         int   #10
43         exit  #1
44         .endm
45
46 ; Load an immediate value into a general register
47 ; TODO: use minimal sized insn
48         .macro mvi_h_gr val reg
49         ldi32 \val,\reg
50         .endm
51
52 ; Load an immediate value into a dedicated register
53         .macro mvi_h_dr val reg
54         ldi32 \val,r0
55         mov r0,\reg
56         .endm
57
58 ; Load a general register into another general register
59         .macro mvr_h_gr src targ
60         mov \src,\targ
61         .endm
62
63 ; Store an immediate into a word in memory
64         .macro mvi_h_mem val addr
65         mvi_h_gr  \val r4
66         mvr_h_mem r4,\addr
67         .endm
68
69 ; Store a register into a word in memory
70         .macro mvr_h_mem reg addr
71         st \reg,@\addr
72         .endm
73
74 ; Store the current ps on the stack
75         .macro save_ps
76         st ps,@-r15
77         .endm
78
79 ; Load a word value from memory
80         .macro ldmem_h_gr addr reg
81         ld @\addr,\reg
82         .endm
83
84 ; Add 2 general registers
85         .macro add_h_gr reg1 reg2
86         add \reg1,\reg2
87         .endm
88
89 ; Increment a register by and immediate
90         .macro inci_h_gr inc reg
91         mvi_h_gr \inc,r4
92         add r4,\reg
93         .endm
94
95 ; Test the value of an immediate against a general register
96         .macro test_h_gr val reg
97         .if (\val >= 0) && (\val <= 15)
98         cmp \val,\reg
99         .else
100         .if (\val < 0) && (\val >= -16)
101         cmp2 \val,\reg
102         .else
103         ldi32 \val,r4
104         cmp r4,\reg
105         .endif
106         .endif
107         beq test_gr\@
108         fail
109 test_gr\@:
110         .endm
111
112 ; compare two general registers
113         .macro testr_h_gr reg1 reg2
114         cmp \reg1,\reg2
115         beq testr_gr\@
116         fail
117 testr_gr\@:
118         .endm
119
120 ; Test the value of an immediate against a dedicated register
121         .macro test_h_dr val reg
122         mov \reg,r5
123         test_h_gr \val r5
124         .endm
125
126 ; Test the value of an general register against a dedicated register
127         .macro testr_h_dr gr dr
128         mov \dr,r5
129         testr_h_gr \gr r5
130         .endm
131
132 ; Compare an immediate with word in memory
133         .macro test_h_mem val addr
134         ldmem_h_gr \addr r5
135         test_h_gr \val r5
136         .endm
137
138 ; Compare a general register with word in memory
139         .macro testr_h_mem reg addr
140         ldmem_h_gr \addr r5
141         testr_h_gr \reg r5
142         .endm
143
144 ; Set the condition codes
145         .macro set_cc mask
146         andccr  0xf0
147         orccr   \mask
148         .endm
149
150 ; Set the stack mode
151         .macro set_s_user
152         orccr   0x20
153         .endm
154
155         .macro set_s_system
156         andccr  0x1f
157         .endm
158
159 ; Test the stack mode
160         .macro test_s_user
161         mvr_h_gr ps,r0
162         mvi_h_gr 0x20,r4
163         and      r4,r0
164         test_h_gr 0x20,r0
165         .endm
166
167         .macro test_s_system
168         mvr_h_gr ps,r0
169         mvi_h_gr 0x20,r4
170         and      r4,r0
171         test_h_gr 0x0,r0
172         .endm
173
174 ; Set the interrupt bit
175         .macro set_i val
176         .if (\val == 1)
177         orccr   0x10
178         .else
179         andccr  0x2f
180         .endif
181         .endm
182
183 ; Test the stack mode
184         .macro test_i val
185         mvr_h_gr  ps,r0
186         mvi_h_gr  0x10,r4
187         and       r4,r0
188         .if (\val == 1)
189         test_h_gr 0x10,r0
190         .else
191         test_h_gr 0x0,r0
192         .endif
193         .endm
194
195 ; Set the ilm
196         .macro set_ilm val
197         stilm \val
198         .endm
199
200 ; Test the ilm
201         .macro test_ilm val
202         mvr_h_gr   ps,r0
203         mvi_h_gr   0x1f0000,r4
204         and        r4,r0
205         mvi_h_gr   \val,r5
206         mvi_h_gr   0x1f,r4
207         and        r4,r5
208         lsl        15,r5
209         lsl        1,r5
210         testr_h_gr r0,r5
211         .endm
212
213 ; Test the condition codes
214         .macro test_cc N Z V C
215         .if (\N == 1)
216         bp fail\@
217         .else
218         bn fail\@
219         .endif
220         .if (\Z == 1)
221         bne fail\@
222         .else
223         beq fail\@
224         .endif
225         .if (\V == 1)
226         bnv fail\@
227         .else
228         bv fail\@
229         .endif
230         .if (\C == 1)
231         bnc fail\@
232         .else
233         bc fail\@
234         .endif
235         bra test_cc\@
236 fail\@:
237         fail
238 test_cc\@:
239         .endm
240
241 ; Set the division bits
242         .macro set_dbits val
243         mvr_h_gr ps,r5
244         mvi_h_gr 0xfffff8ff,r4
245         and r4,r5
246         mvi_h_gr \val,r0
247         mvi_h_gr 3,r4
248         and r4,r0
249         lsl 9,r0
250         or r0,r5
251         mvr_h_gr r5,ps
252         .endm
253
254 ; Test the division bits
255         .macro test_dbits val
256         mvr_h_gr ps,r0
257         lsr 9,r0
258         mvi_h_gr 3,r4
259         and r4,r0
260         test_h_gr \val,r0
261         .endm
262
263 ; Save the return pointer
264         .macro save_rp
265         st rp,@-R15
266         .ENDM
267
268 ; restore the return pointer
269         .macro restore_rp
270         ld @R15+,rp
271         .endm
272
273 ; Ensure branch taken
274         .macro take_branch opcode
275         \opcode take_br\@
276         fail
277 take_br\@:
278         .endm
279
280         .macro take_branch_d opcode val
281         \opcode take_brd\@
282         ldi:8 \val,r0
283         fail
284 take_brd\@:
285         test_h_gr \val,r0
286         .endm
287
288 ; Ensure branch not taken
289         .macro no_branch opcode
290         \opcode no_brf\@
291         bra     no_brs\@
292 no_brf\@:
293         fail
294 no_brs\@:
295         .endm
296
297         .macro no_branch_d opcode val
298         \opcode no_brdf\@
299         ldi:8   \val,r0
300         bra     no_brds\@
301 no_brdf\@:
302         fail
303 no_brds\@:
304         test_h_gr \val,r0
305         .endm
306