xref: /qemu/tests/tcg/xtensa/test_windowed.S (revision bfa3ab61)
1#include "macros.inc"
2
3test_suite windowed
4
5.altmacro
6
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
18
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
23
24    movi    a2, 1 | (((1 << ((\window) / 4)) | 1) << ((\shift) / 4))
25    wsr     a2, windowstart
26    reset_ps
27
28    mov     a2, a\probe_ok
29    set_vector window_overflow_\window, 10f
301:
31    mov     a2, a\probe_ex
32    test_fail
3310:
34    rsr     a2, epc1
35    movi    a3, 1b
36    assert  eq, a2, a3
37    movi    a2, 2f
38    wsr     a2, epc1
39
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
482:
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
58
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
65
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
73
74test overflow
75    all_overflow_tests
76test_end
77
78
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
83
84    set_vector window_underflow_\window, 10f
85
86    reset_window 1
87    reset_ps
88
89    ssai    2
90    movi    a2, 2f
91    slli    a2, a2, 2
92    movi    a3, (\window) / 4
93    src     a0, a3, a2
941:
95    retw
96    test_fail
9710:
98    rsr     a2, epc1
99    movi    a3, 1b
100    assert  eq, a2, a3
101    movi    a2, 2f
102    wsr     a2, epc1
103
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
1122:
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
122
123test underflow
124    set_vector window_overflow_4, 0
125    set_vector window_overflow_8, 0
126    set_vector window_overflow_12, 0
127
128    underflow_test 4
129    underflow_test 8
130    underflow_test 12
131test_end
132
133
134.macro retw_test window
135    reset_window %(1 | (1 << (8 - (\window) / 4)))
136    reset_ps
137
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
1451:
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
155
156test retw
157    set_vector window_underflow_4, 0
158    set_vector window_underflow_8, 0
159    set_vector window_underflow_12, 0
160
161    retw_test 4
162    retw_test 8
163    retw_test 12
164test_end
165
166test movsp
167    set_vector kernel, 2f
168
169    reset_window 1
170    reset_ps
1711:
172    movsp   a2, a3
173    test_fail
1742:
175    rsr     a2, exccause
176    assert  eqi, a2, 5
177    rsr     a2, epc1
178    movi    a3, 1b
179    assert  eq, a2, a3
180
181    set_vector kernel, 0
182
183    reset_window 0x81
184    reset_ps
185
186    movsp   a2, a3
187test_end
188
189test rotw
190    reset_window 0x4b
191    reset_ps
192
193    movi    a3, 0x10
194
195    rotw    1
196    rsr     a2, windowbase
197    assert  eqi, a2, 1
198    movi    a3, 0x11
199    movi    a7, 0x12
200
201    rotw    2
202    rsr     a2, windowbase
203    assert  eqi, a2, 3
204    movi    a3, 0x13
205    movi    a7, 0x14
206    movi    a11, 0x15
207
208    rotw    3
209    rsr     a2, windowbase
210    assert  eqi, a2, 6
211    movi    a3, 0x16
212    movi    a7, 0x17
213
214    movi    a2, 0x44
215    wsr     a2, windowstart
216    rsync
217
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
224
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
234
235    movi    a2, 0x5
236    wsr     a2, windowstart
237    rsync
238
239    rotw    -2
240    movi    a2, 0x18
241    assert  eq, a2, a3
242    movi    a2, 0x19
243    assert  eq, a2, a7
244test_end
245
246.macro callw_test window
247    call\window 2f
2481:
249    test_fail
250    .align  4
2512:
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
264
265test callw
266    reset_window 0x1
267    reset_ps
268
269    callw_test 4
270    callw_test 8
271    callw_test 12
272test_end
273
274
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
2841:
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
295
296test entry
297    entry_test 4
298    entry_test 8
299    entry_test 12
300test_end
301
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
307
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
3191:
320    entry   a3, 0x5678
321    test_fail
322    .align  4
32310:
324    rsr     a2, epc1
325    movi    a3, 1b
326    assert  eq, a2, a3
327    movi    a2, 2f
328    wsr     a2, epc1
329
330    rsr     a2, windowbase
331    movi    a3, (\free) / 4
332    assert  eq, a2, a3
333    rfwo
3342:
335.endm
336
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
348
349test entry_overflow
350    all_entry_overflow_tests
351test_end
352
353test_suite_end
354