xref: /qemu/tests/tcg/xtensa/test_windowed.S (revision 500016e5)
1#include "macros.inc"
2
3test_suite windowed
4
5#if XCHAL_HAVE_WINDOWED
6
7.altmacro
8
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
20
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
25
26    movi    a2, 1 | (((1 << ((\window) / 4)) | 1) << ((\shift) / 4))
27    wsr     a2, windowstart
28    reset_ps
29
30    mov     a2, a\probe_ok
31    set_vector window_overflow_\window, 10f
321:
33    mov     a2, a\probe_ex
34    test_fail
3510:
36    rsr     a2, epc1
37    movi    a3, 1b
38    assert  eq, a2, a3
39    movi    a2, 2f
40    wsr     a2, epc1
41
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
502:
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
60
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
67
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
75
76test overflow
77    all_overflow_tests
78test_end
79
80
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
85
86    set_vector window_underflow_\window, 10f
87
88    reset_window 1
89    reset_ps
90
91    ssai    2
92    movi    a2, 2f
93    slli    a2, a2, 2
94    movi    a3, (\window) / 4
95    src     a0, a3, a2
961:
97    retw
98    test_fail
9910:
100    rsr     a2, epc1
101    movi    a3, 1b
102    assert  eq, a2, a3
103    movi    a2, 2f
104    wsr     a2, epc1
105
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
1152:
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
125
126test underflow
127    set_vector window_overflow_4, 0
128    set_vector window_overflow_8, 0
129    set_vector window_overflow_12, 0
130
131    underflow_test 4
132    underflow_test 8
133    underflow_test 12
134test_end
135
136
137.macro retw_test window
138    reset_window %(1 | (1 << ((XCHAL_NUM_AREGS - \window) / 4)))
139    reset_ps
140
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
1481:
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
159
160test retw
161    set_vector window_underflow_4, 0
162    set_vector window_underflow_8, 0
163    set_vector window_underflow_12, 0
164
165    retw_test 4
166    retw_test 8
167    retw_test 12
168test_end
169
170test movsp
171    set_vector kernel, 2f
172
173    reset_window 1
174    reset_ps
1751:
176    movsp   a2, a3
177    test_fail
1782:
179    rsr     a2, exccause
180    assert  eqi, a2, 5
181    rsr     a2, epc1
182    movi    a3, 1b
183    assert  eq, a2, a3
184
185    set_vector kernel, 0
186
187    reset_window %(0x1 | (1 << ((XCHAL_NUM_AREGS / 4) - 1)))
188    reset_ps
189
190    movsp   a2, a3
191test_end
192
193test rotw
194    reset_window 0x4b
195    reset_ps
196
197    movi    a3, 0x10
198
199    rotw    1
200    rsr     a2, windowbase
201    assert  eqi, a2, 1
202    movi    a3, 0x11
203    movi    a7, 0x12
204
205    rotw    2
206    rsr     a2, windowbase
207    assert  eqi, a2, 3
208    movi    a3, 0x13
209    movi    a7, 0x14
210    movi    a11, 0x15
211
212    rotw    3
213    rsr     a2, windowbase
214    assert  eqi, a2, 6
215    movi    a3, 0x16
216    movi    a7, 0x17
217
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
229
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
236
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
246
247    movi    a2, 0x5
248    wsr     a2, windowstart
249    rsync
250
251    rotw    -2
252    movi    a2, 0x18
253    assert  eq, a2, a3
254    movi    a2, 0x19
255    assert  eq, a2, a7
256test_end
257
258.macro callw_test window
259    call\window 2f
2601:
261    test_fail
262    .align  4
2632:
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
276
277test callw
278    reset_window 0x1
279    reset_ps
280
281    callw_test 4
282    callw_test 8
283    callw_test 12
284test_end
285
286
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
2961:
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
307
308test entry
309    entry_test 4
310    entry_test 8
311    entry_test 12
312test_end
313
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
319
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
3311:
332    entry   a3, 0x5678
333    test_fail
334    .align  4
33510:
336    rsr     a2, epc1
337    movi    a3, 1b
338    assert  eq, a2, a3
339    movi    a2, 2f
340    wsr     a2, epc1
341
342    rsr     a2, windowbase
343    movi    a3, (\free) / 4
344    assert  eq, a2, a3
345    rfwo
3462:
347.endm
348
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
360
361test entry_overflow
362    all_entry_overflow_tests
363test_end
364
365#endif
366
367test_suite_end
368