root / tests / tcg / xtensa / test_windowed.S @ c09015dd
History | View | Annotate | Download (5.4 kB)
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 |