qapi: Rename target.json to misc-target.json
[qemu/kevin.git] / tests / tcg / xtensa / test_windowed.S
blob5ead90a790ed365a951e8f973183f3dc90b0f243
1 #include "macros.inc"
3 test_suite windowed
5 #if XCHAL_HAVE_WINDOWED
7 .altmacro
9 .macro reset_window start
10     movi    a2, 0xffff
11     wsr     a2, windowstart
12     rsync
13     movi    a2, 0
14     wsr     a2, windowbase
15     rsync
16     movi    a2, \start
17     wsr     a2, windowstart
18     rsync
19 .endm
21 .macro overflow_test shift, window, probe_ok, probe_ex
22     set_vector window_overflow_4, 0
23     set_vector window_overflow_8, 0
24     set_vector window_overflow_12, 0
26     movi    a2, 1 | (((1 << ((\window) / 4)) | 1) << ((\shift) / 4))
27     wsr     a2, windowstart
28     reset_ps
30     mov     a2, a\probe_ok
31     set_vector window_overflow_\window, 10f
33     mov     a2, a\probe_ex
34     test_fail
35 10:
36     rsr     a2, epc1
37     movi    a3, 1b
38     assert  eq, a2, a3
39     movi    a2, 2f
40     wsr     a2, epc1
42     rsr     a2, windowbase
43     movi    a3, (\shift) / 4
44     assert  eq, a2, a3
45     rsr     a2, ps
46     movi    a3, 0x4001f
47     assert  eq, a2, a3
48     rfwo
49     test_fail
51     rsr     a2, windowbase
52     assert  eqi, a2, 0
53     rsr     a2, windowstart
54     movi    a3, 1 | ((1 << ((\window) / 4)) << ((\shift) / 4))
55     assert  eq, a2, a3
56     rsr     a2, ps
57     movi    a3, 0x4000f
58     assert  eq, a2, a3
59 .endm
61 .macro overflow_tests shift, window, probe
62     .if \probe < 15
63     overflow_test \shift, \window, %((\shift) - 1), \probe
64     overflow_tests \shift, \window, %((\probe) + 1)
65     .endif
66 .endm
68 .macro all_overflow_tests
69     .irp shift, 4, 8, 12
70     .irp window, 4, 8, 12
71     overflow_tests \shift, \window, \shift
72     .endr
73     .endr
74 .endm
76 test overflow
77     all_overflow_tests
78 test_end
81 .macro underflow_test window
82     set_vector window_underflow_4, 0
83     set_vector window_underflow_8, 0
84     set_vector window_underflow_12, 0
86     set_vector window_underflow_\window, 10f
88     reset_window 1
89     reset_ps
91     ssai    2
92     movi    a2, 2f
93     slli    a2, a2, 2
94     movi    a3, (\window) / 4
95     src     a0, a3, a2
97     retw
98     test_fail
99 10:
100     rsr     a2, epc1
101     movi    a3, 1b
102     assert  eq, a2, a3
103     movi    a2, 2f
104     wsr     a2, epc1
106     rsr     a2, ps
107     movi    a3, 0x4001f
108     assert  eq, a2, a3
109     rsr     a2, windowbase
110     movi    a3, (XCHAL_NUM_AREGS - (\window)) / 4
111     assert  eq, a2, a3
112     rsr     a2, windowstart
113     assert  eqi, a2, 1
114     rfwu
116     rsr     a2, ps
117     movi    a3, 0x4000f
118     assert  eq, a2, a3
119     rsr     a2, windowbase
120     assert  eqi, a2, 0
121     rsr     a2, windowstart
122     assert  bsi.l, a2, 0
123     assert  bsi.l, a2, (XCHAL_NUM_AREGS - (\window)) / 4
124 .endm
126 test underflow
127     set_vector window_overflow_4, 0
128     set_vector window_overflow_8, 0
129     set_vector window_overflow_12, 0
131     underflow_test 4
132     underflow_test 8
133     underflow_test 12
134 test_end
137 .macro retw_test window
138     reset_window %(1 | (1 << ((XCHAL_NUM_AREGS - \window) / 4)))
139     reset_ps
141     ssai    2
142     movi    a2, 1f
143     slli    a2, a2, 2
144     movi    a3, (\window) / 4
145     src     a0, a3, a2
146     retw
147     test_fail
149     rsr     a2, ps
150     movi    a3, 0x4000f
151     assert  eq, a2, a3
152     rsr     a2, windowbase
153     movi    a3, (XCHAL_NUM_AREGS - (\window)) / 4
154     assert  eq, a2, a3
155     rsr     a2, windowstart
156     assert  bci.l, a2, 0
157     assert  bsi.l, a2, (XCHAL_NUM_AREGS - (\window)) / 4
158 .endm
160 test retw
161     set_vector window_underflow_4, 0
162     set_vector window_underflow_8, 0
163     set_vector window_underflow_12, 0
165     retw_test 4
166     retw_test 8
167     retw_test 12
168 test_end
170 test movsp
171     set_vector kernel, 2f
173     reset_window 1
174     reset_ps
176     movsp   a2, a3
177     test_fail
179     rsr     a2, exccause
180     assert  eqi, a2, 5
181     rsr     a2, epc1
182     movi    a3, 1b
183     assert  eq, a2, a3
185     set_vector kernel, 0
187     reset_window %(0x1 | (1 << ((XCHAL_NUM_AREGS / 4) - 1)))
188     reset_ps
190     movsp   a2, a3
191 test_end
193 test rotw
194     reset_window 0x4b
195     reset_ps
197     movi    a3, 0x10
199     rotw    1
200     rsr     a2, windowbase
201     assert  eqi, a2, 1
202     movi    a3, 0x11
203     movi    a7, 0x12
205     rotw    2
206     rsr     a2, windowbase
207     assert  eqi, a2, 3
208     movi    a3, 0x13
209     movi    a7, 0x14
210     movi    a11, 0x15
212     rotw    3
213     rsr     a2, windowbase
214     assert  eqi, a2, 6
215     movi    a3, 0x16
216     movi    a7, 0x17
218 #if XCHAL_NUM_AREGS == 32
219     movi    a2, 0x44
220     wsr     a2, windowstart
221 #elif XCHAL_NUM_AREGS == 64
222     movi    a2, 0x4004
223     wsr     a2, windowstart
224     rotw    -8
225 #else
226 #error XCHAL_NUM_AREGS unsupported
227 #endif
228     rsync
230     movi    a2, 0x10
231     assert  eq, a2, a11
232     movi    a11, 0x18
233     movi    a2, 0x11
234     assert  eq, a2, a15
235     movi    a15, 0x19
237     rotw    4
238     movi    a2, 0x12
239     assert  eq, a2, a3
240     movi    a2, 0x13
241     assert  eq, a2, a7
242     movi    a2, 0x14
243     assert  eq, a2, a11
244     movi    a2, 0x15
245     assert  eq, a2, a15
247     movi    a2, 0x5
248     wsr     a2, windowstart
249     rsync
251     rotw    -2
252     movi    a2, 0x18
253     assert  eq, a2, a3
254     movi    a2, 0x19
255     assert  eq, a2, a7
256 test_end
258 .macro callw_test window
259     call\window 2f
261     test_fail
262     .align  4
264     rsr     a2, windowbase
265     assert  eqi, a2, 0
266     rsr     a2, ps
267     movi    a3, 0x4000f | ((\window) << 14)
268     assert  eq, a2, a3
269     movi    a2, 1b
270     slli    a2, a2, 2
271     ssai    2
272     movi    a3, (\window) / 4
273     src     a2, a3, a2
274     assert  eq, a2, a\window
275 .endm
277 test callw
278     reset_window 0x1
279     reset_ps
281     callw_test 4
282     callw_test 8
283     callw_test 12
284 test_end
287 .macro entry_test window
288     reset_window 0x1
289     reset_ps
290     movi    a2, 0x4000f | ((\window) << 14)
291     wsr     a2, ps
292     isync
293     movi    a3, 0x12345678
294     j       1f
295     .align  4
297     entry   a3, 0x5678
298     movi    a2, 0x12340000
299     assert  eq, a2, a3
300     rsr     a2, windowbase
301     assert  eqi, a2, (\window) / 4
302     rsr     a2, windowstart
303     movi    a3, 1 | (1 << ((\window) / 4))
304     assert  eq, a2, a3
305     rotw    -(\window) / 4
306 .endm
308 test entry
309     entry_test 4
310     entry_test 8
311     entry_test 12
312 test_end
314 .macro entry_overflow_test window, free, next_window
315     set_vector window_overflow_4, 0
316     set_vector window_overflow_8, 0
317     set_vector window_overflow_12, 0
318     set_vector window_overflow_\next_window, 10f
320     movi    a2, \window
321     movi    a2, \free
322     movi    a2, \next_window
323     reset_window %(1 | ((1 | (1 << ((\next_window) / 4))) << ((\free) / 4)))
324     reset_ps
325     movi    a2, 0x4000f | ((\window) << 14)
326     wsr     a2, ps
327     isync
328     movi    a3, 0x12345678
329     j       1f
330     .align  4
332     entry   a3, 0x5678
333     test_fail
334     .align  4
336     rsr     a2, epc1
337     movi    a3, 1b
338     assert  eq, a2, a3
339     movi    a2, 2f
340     wsr     a2, epc1
342     rsr     a2, windowbase
343     movi    a3, (\free) / 4
344     assert  eq, a2, a3
345     rfwo
347 .endm
349 .macro all_entry_overflow_tests
350     .irp window, 4, 8, 12
351     .irp next_window, 4, 8, 12
352     .irp free, 4, 8, 12
353     .if \free <= \window
354     entry_overflow_test \window, \free, \next_window
355     .endif
356     .endr
357     .endr
358     .endr
359 .endm
361 test entry_overflow
362     all_entry_overflow_tests
363 test_end
365 #endif
367 test_suite_end