## 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 |