]> git.proxmox.com Git - qemu.git/blob - tests/tcg/xtensa/test_windowed.S
tests: mv tests/* -> tests/tcg
[qemu.git] / tests / tcg / xtensa / test_windowed.S
1 .include "macros.inc"
2
3 test_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
30 1:
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
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
48 2:
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
74 test overflow
75 all_overflow_tests
76 test_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
94 1:
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
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
112 2:
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
123 test 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
131 test_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
145 1:
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
156 test 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
164 test_end
165
166 test movsp
167 set_vector kernel, 2f
168
169 reset_window 1
170 reset_ps
171 1:
172 movsp a2, a3
173 test_fail
174 2:
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
187 test_end
188
189 test 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
244 test_end
245
246 .macro callw_test window
247 call\window 2f
248 1:
249 test_fail
250 .align 4
251 2:
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
265 test callw
266 reset_window 0x1
267 reset_ps
268
269 callw_test 4
270 callw_test 8
271 callw_test 12
272 test_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
284 1:
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
296 test entry
297 entry_test 4
298 entry_test 8
299 entry_test 12
300 test_end
301
302 test_suite_end