Merge remote-tracking branch 'qemu/master'
[qemu/ar7.git] / tests / tcg / xtensa / test_windowed.S
blobd851e8f43c5cc9b85147e7881fc1c6a2aea34d66
1 #include "macros.inc"
3 test_suite windowed
5 .altmacro
7 .macro reset_window start
8     movi    a2, 0xff
9     wsr     a2, windowstart
10     rsync
11     movi    a2, 0
12     wsr     a2, windowbase
13     rsync
14     movi    a2, \start
15     wsr     a2, windowstart
16     rsync
17 .endm
19 .macro overflow_test shift, window, probe_ok, probe_ex
20     set_vector window_overflow_4, 0
21     set_vector window_overflow_8, 0
22     set_vector window_overflow_12, 0
24     movi    a2, 1 | (((1 << ((\window) / 4)) | 1) << ((\shift) / 4))
25     wsr     a2, windowstart
26     reset_ps
28     mov     a2, a\probe_ok
29     set_vector window_overflow_\window, 10f
31     mov     a2, a\probe_ex
32     test_fail
33 10:
34     rsr     a2, epc1
35     movi    a3, 1b
36     assert  eq, a2, a3
37     movi    a2, 2f
38     wsr     a2, epc1
40     rsr     a2, windowbase
41     movi    a3, (\shift) / 4
42     assert  eq, a2, a3
43     rsr     a2, ps
44     movi    a3, 0x4001f
45     assert  eq, a2, a3
46     rfwo
47     test_fail
49     rsr     a2, windowbase
50     assert  eqi, a2, 0
51     rsr     a2, windowstart
52     movi    a3, 1 | ((1 << ((\window) / 4)) << ((\shift) / 4))
53     assert  eq, a2, a3
54     rsr     a2, ps
55     movi    a3, 0x4000f
56     assert  eq, a2, a3
57 .endm
59 .macro overflow_tests shift, window, probe
60     .if \probe < 15
61     overflow_test \shift, \window, %((\shift) - 1), \probe
62     overflow_tests \shift, \window, %((\probe) + 1)
63     .endif
64 .endm
66 .macro all_overflow_tests
67     .irp shift, 4, 8, 12
68     .irp window, 4, 8, 12
69     overflow_tests \shift, \window, \shift
70     .endr
71     .endr
72 .endm
74 test overflow
75     all_overflow_tests
76 test_end
79 .macro underflow_test window
80     set_vector window_underflow_4, 0
81     set_vector window_underflow_8, 0
82     set_vector window_underflow_12, 0
84     set_vector window_underflow_\window, 10f
86     reset_window 1
87     reset_ps
89     ssai    2
90     movi    a2, 2f
91     slli    a2, a2, 2
92     movi    a3, (\window) / 4
93     src     a0, a3, a2
95     retw
96     test_fail
97 10:
98     rsr     a2, epc1
99     movi    a3, 1b
100     assert  eq, a2, a3
101     movi    a2, 2f
102     wsr     a2, epc1
104     rsr     a2, ps
105     movi    a3, 0x4001f
106     assert  eq, a2, a3
107     rsr     a2, windowbase
108     assert  eqi, a2, 8 - ((\window) / 4)
109     rsr     a2, windowstart
110     assert  eqi, a2, 1
111     rfwu
113     rsr     a2, ps
114     movi    a3, 0x4000f
115     assert  eq, a2, a3
116     rsr     a2, windowbase
117     assert  eqi, a2, 0
118     rsr     a2, windowstart
119     assert  bsi, a2, 0
120     assert  bsi, a2, 8 - ((\window) / 4)
121 .endm
123 test underflow
124     set_vector window_overflow_4, 0
125     set_vector window_overflow_8, 0
126     set_vector window_overflow_12, 0
128     underflow_test 4
129     underflow_test 8
130     underflow_test 12
131 test_end
134 .macro retw_test window
135     reset_window %(1 | (1 << (8 - (\window) / 4)))
136     reset_ps
138     ssai    2
139     movi    a2, 1f
140     slli    a2, a2, 2
141     movi    a3, (\window) / 4
142     src     a0, a3, a2
143     retw
144     test_fail
146     rsr     a2, ps
147     movi    a3, 0x4000f
148     assert  eq, a2, a3
149     rsr     a2, windowbase
150     assert  eqi, a2, 8 - ((\window) / 4)
151     rsr     a2, windowstart
152     assert  bci, a2, 0
153     assert  bsi, a2, 8 - ((\window) / 4)
154 .endm
156 test retw
157     set_vector window_underflow_4, 0
158     set_vector window_underflow_8, 0
159     set_vector window_underflow_12, 0
161     retw_test 4
162     retw_test 8
163     retw_test 12
164 test_end
166 test movsp
167     set_vector kernel, 2f
169     reset_window 1
170     reset_ps
172     movsp   a2, a3
173     test_fail
175     rsr     a2, exccause
176     assert  eqi, a2, 5
177     rsr     a2, epc1
178     movi    a3, 1b
179     assert  eq, a2, a3
181     set_vector kernel, 0
183     reset_window 0x81
184     reset_ps
186     movsp   a2, a3
187 test_end
189 test rotw
190     reset_window 0x4b
191     reset_ps
193     movi    a3, 0x10
195     rotw    1
196     rsr     a2, windowbase
197     assert  eqi, a2, 1
198     movi    a3, 0x11
199     movi    a7, 0x12
201     rotw    2
202     rsr     a2, windowbase
203     assert  eqi, a2, 3
204     movi    a3, 0x13
205     movi    a7, 0x14
206     movi    a11, 0x15
208     rotw    3
209     rsr     a2, windowbase
210     assert  eqi, a2, 6
211     movi    a3, 0x16
212     movi    a7, 0x17
214     movi    a2, 0x44
215     wsr     a2, windowstart
216     rsync
218     movi    a2, 0x10
219     assert  eq, a2, a11
220     movi    a11, 0x18
221     movi    a2, 0x11
222     assert  eq, a2, a15
223     movi    a15, 0x19
225     rotw    4
226     movi    a2, 0x12
227     assert  eq, a2, a3
228     movi    a2, 0x13
229     assert  eq, a2, a7
230     movi    a2, 0x14
231     assert  eq, a2, a11
232     movi    a2, 0x15
233     assert  eq, a2, a15
235     movi    a2, 0x5
236     wsr     a2, windowstart
237     rsync
239     rotw    -2
240     movi    a2, 0x18
241     assert  eq, a2, a3
242     movi    a2, 0x19
243     assert  eq, a2, a7
244 test_end
246 .macro callw_test window
247     call\window 2f
249     test_fail
250     .align  4
252     rsr     a2, windowbase
253     assert  eqi, a2, 0
254     rsr     a2, ps
255     movi    a3, 0x4000f | ((\window) << 14)
256     assert  eq, a2, a3
257     movi    a2, 1b
258     slli    a2, a2, 2
259     ssai    2
260     movi    a3, (\window) / 4
261     src     a2, a3, a2
262     assert  eq, a2, a\window
263 .endm
265 test callw
266     reset_window 0x1
267     reset_ps
269     callw_test 4
270     callw_test 8
271     callw_test 12
272 test_end
275 .macro entry_test window
276     reset_window 0x1
277     reset_ps
278     movi    a2, 0x4000f | ((\window) << 14)
279     wsr     a2, ps
280     isync
281     movi    a3, 0x12345678
282     j       1f
283     .align  4
285     entry   a3, 0x5678
286     movi    a2, 0x12340000
287     assert  eq, a2, a3
288     rsr     a2, windowbase
289     assert  eqi, a2, (\window) / 4
290     rsr     a2, windowstart
291     movi    a3, 1 | (1 << ((\window) / 4))
292     assert  eq, a2, a3
293     rotw    -(\window) / 4
294 .endm
296 test entry
297     entry_test 4
298     entry_test 8
299     entry_test 12
300 test_end
302 .macro entry_overflow_test window, free, next_window
303     set_vector window_overflow_4, 0
304     set_vector window_overflow_8, 0
305     set_vector window_overflow_12, 0
306     set_vector window_overflow_\next_window, 10f
308     movi    a2, \window
309     movi    a2, \free
310     movi    a2, \next_window
311     reset_window %(1 | ((1 | (1 << ((\next_window) / 4))) << ((\free) / 4)))
312     reset_ps
313     movi    a2, 0x4000f | ((\window) << 14)
314     wsr     a2, ps
315     isync
316     movi    a3, 0x12345678
317     j       1f
318     .align  4
320     entry   a3, 0x5678
321     test_fail
322     .align  4
324     rsr     a2, epc1
325     movi    a3, 1b
326     assert  eq, a2, a3
327     movi    a2, 2f
328     wsr     a2, epc1
330     rsr     a2, windowbase
331     movi    a3, (\free) / 4
332     assert  eq, a2, a3
333     rfwo
335 .endm
337 .macro all_entry_overflow_tests
338     .irp window, 4, 8, 12
339     .irp next_window, 4, 8, 12
340     .irp free, 4, 8, 12
341     .if \free <= \window
342     entry_overflow_test \window, \free, \next_window
343     .endif
344     .endr
345     .endr
346     .endr
347 .endm
349 test entry_overflow
350     all_entry_overflow_tests
351 test_end
353 test_suite_end