1 from nmigen
import Module
, Signal
2 from nmigen
.sim
import Simulator
, Delay
, Settle
3 from nmutil
.formaltest
import FHDLTestCase
5 from openpower
.decoder
.isa
.caller
import ISACaller
6 from openpower
.decoder
.power_decoder
import (create_pdecode
)
7 from openpower
.decoder
.power_decoder2
import (PowerDecode2
)
8 from openpower
.simulator
.program
import Program
9 from openpower
.decoder
.isa
.caller
import ISACaller
, SVP64State
, CRFields
10 from openpower
.decoder
.selectable_int
import SelectableInt
11 from openpower
.decoder
.orderedset
import OrderedSet
12 from openpower
.decoder
.isa
.all
import ISA
13 from openpower
.decoder
.isa
.test_caller
import Register
, run_tst
14 from openpower
.sv
.trans
.svp64
import SVP64Asm
15 from openpower
.consts
import SVP64CROffs
16 from copy
import deepcopy
18 class DecoderTestCase(FHDLTestCase
):
20 def _check_regs(self
, sim
, expected
):
24 self
.assertEqual(sim
.gpr(i
), SelectableInt(expected
[i
], 64))
26 def test_1_setvl_zero_rc1(self
):
27 lst
= SVP64Asm(["setvl. 5, 4, 5, 0, 1, 1",
31 # SVSTATE (in this case, MAXVL=5) which is going to get erased by setvl
32 # but, ha! r4 (RA) is zero. and Rc=1. therefore, CR0 should be set EQ
33 svstate
= SVP64State()
34 svstate
.maxvl
= 5 # MAXVL
35 print ("SVSTATE", bin(svstate
.asint()))
37 with
Program(lst
, bigendian
=False) as program
:
38 sim
= self
.run_tst_program(program
, svstate
=svstate
)
39 print ("SVSTATE after", bin(sim
.svstate
.asint()))
40 print (" vl", bin(sim
.svstate
.vl
))
41 print (" mvl", bin(sim
.svstate
.maxvl
))
42 print (" srcstep", bin(sim
.svstate
.srcstep
))
43 print (" dststep", bin(sim
.svstate
.dststep
))
44 print (" vfirst", bin(sim
.svstate
.vfirst
))
45 self
.assertEqual(sim
.svstate
.vl
, 0)
46 self
.assertEqual(sim
.svstate
.maxvl
, 5)
47 self
.assertEqual(sim
.svstate
.srcstep
, 0)
48 self
.assertEqual(sim
.svstate
.dststep
, 0)
49 self
.assertEqual(sim
.svstate
.vfirst
, 0)
50 print(" gpr4", sim
.gpr(4))
51 self
.assertEqual(sim
.gpr(4), SelectableInt(0, 64))
52 print(" gpr5", sim
.gpr(5))
53 self
.assertEqual(sim
.gpr(5), SelectableInt(0, 64))
55 print(" CR0", bin(CR0
.get_range().value
))
56 self
.assertEqual(CR0
[CRFields
.EQ
], 1)
57 self
.assertEqual(CR0
[CRFields
.LT
], 0)
58 self
.assertEqual(CR0
[CRFields
.GT
], 0)
59 self
.assertEqual(CR0
[CRFields
.SO
], 0)
61 def test_2_setvl_nonzero_rc1(self
):
62 lst
= SVP64Asm(["setvl. 5, 4, 5, 0, 1, 1",
66 # SVSTATE (in this case, MAXVL=5) which is going to get erased by setvl
67 # r4 (RA) is 4. and Rc=1. therefore, CR0 should be set to GT
68 svstate
= SVP64State()
69 svstate
.maxvl
= 5 # MAXVL
70 print ("SVSTATE", bin(svstate
.asint()))
72 initial_regs
= [0] * 32
75 with
Program(lst
, bigendian
=False) as program
:
76 sim
= self
.run_tst_program(program
, svstate
=svstate
,
77 initial_regs
=initial_regs
)
78 print ("SVSTATE after", bin(sim
.svstate
.asint()))
79 print (" vl", bin(sim
.svstate
.vl
))
80 print (" mvl", bin(sim
.svstate
.maxvl
))
81 print (" srcstep", bin(sim
.svstate
.srcstep
))
82 print (" dststep", bin(sim
.svstate
.dststep
))
83 print (" vfirst", bin(sim
.svstate
.vfirst
))
84 self
.assertEqual(sim
.svstate
.vl
, 4)
85 self
.assertEqual(sim
.svstate
.maxvl
, 5)
86 self
.assertEqual(sim
.svstate
.srcstep
, 0)
87 self
.assertEqual(sim
.svstate
.dststep
, 0)
88 self
.assertEqual(sim
.svstate
.vfirst
, 0)
89 print(" gpr4", sim
.gpr(4))
90 self
.assertEqual(sim
.gpr(4), SelectableInt(4, 64))
91 print(" gpr5", sim
.gpr(5))
92 self
.assertEqual(sim
.gpr(5), SelectableInt(4, 64))
94 print(" CR0", bin(CR0
.get_range().value
))
95 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
96 self
.assertEqual(CR0
[CRFields
.LT
], 0)
97 self
.assertEqual(CR0
[CRFields
.GT
], 1)
98 self
.assertEqual(CR0
[CRFields
.SO
], 0)
100 def test_3_setvl_overflow_rc1(self
):
101 lst
= SVP64Asm(["setvl. 5, 4, 5, 0, 1, 1",
105 # SVSTATE (in this case, MAXVL=5) which is going to get erased by setvl
106 # r4 (RA) is 4. and Rc=1. therefore, CR0 should be set to GT
107 svstate
= SVP64State()
108 svstate
.maxvl
= 5 # MAXVL
109 print ("SVSTATE", bin(svstate
.asint()))
111 initial_regs
= [0] * 32
112 initial_regs
[4] = 1000 # much greater than MAXVL
114 with
Program(lst
, bigendian
=False) as program
:
115 sim
= self
.run_tst_program(program
, svstate
=svstate
,
116 initial_regs
=initial_regs
)
117 print ("SVSTATE after", bin(sim
.svstate
.asint()))
118 print (" vl", bin(sim
.svstate
.vl
))
119 print (" mvl", bin(sim
.svstate
.maxvl
))
120 print (" srcstep", bin(sim
.svstate
.srcstep
))
121 print (" dststep", bin(sim
.svstate
.dststep
))
122 print (" vfirst", bin(sim
.svstate
.vfirst
))
123 self
.assertEqual(sim
.svstate
.vl
, 5)
124 self
.assertEqual(sim
.svstate
.maxvl
, 5)
125 self
.assertEqual(sim
.svstate
.srcstep
, 0)
126 self
.assertEqual(sim
.svstate
.dststep
, 0)
127 self
.assertEqual(sim
.svstate
.vfirst
, 0)
128 print(" gpr4", sim
.gpr(4))
129 self
.assertEqual(sim
.gpr(4), SelectableInt(1000, 64)) # unmodified
130 print(" gpr5", sim
.gpr(5))
131 self
.assertEqual(sim
.gpr(5), SelectableInt(5, 64)) # equal to MAXVL
133 print(" CR0", bin(CR0
.get_range().value
))
134 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
135 self
.assertEqual(CR0
[CRFields
.LT
], 0)
136 self
.assertEqual(CR0
[CRFields
.GT
], 1)
137 self
.assertEqual(CR0
[CRFields
.SO
], 1)
139 def test_4_setvl_max_overflow_rc1(self
):
140 """this should set overflow even though VL gets set to MAXVL
141 at its limit of 127 (0b1111111)
143 lst
= SVP64Asm(["setvl. 5, 4, 127, 0, 1, 1",
147 # SVSTATE (in this case, MAXVL=5) which is going to get erased by setvl
148 # r4 (RA) is 4. and Rc=1. therefore, CR0 should be set to GT
149 svstate
= SVP64State()
150 svstate
.maxvl
= 5 # MAXVL
151 print ("SVSTATE", bin(svstate
.asint()))
153 initial_regs
= [0] * 32
154 initial_regs
[4] = 1000 # much greater than MAXVL
156 with
Program(lst
, bigendian
=False) as program
:
157 sim
= self
.run_tst_program(program
, svstate
=svstate
,
158 initial_regs
=initial_regs
)
159 print ("SVSTATE after", bin(sim
.svstate
.asint()))
160 print (" vl", bin(sim
.svstate
.vl
))
161 print (" mvl", bin(sim
.svstate
.maxvl
))
162 print (" srcstep", bin(sim
.svstate
.srcstep
))
163 print (" dststep", bin(sim
.svstate
.dststep
))
164 print (" vfirst", bin(sim
.svstate
.vfirst
))
165 self
.assertEqual(sim
.svstate
.vl
, 127)
166 self
.assertEqual(sim
.svstate
.maxvl
, 127)
167 self
.assertEqual(sim
.svstate
.srcstep
, 0)
168 self
.assertEqual(sim
.svstate
.dststep
, 0)
169 self
.assertEqual(sim
.svstate
.vfirst
, 0)
170 print(" gpr4", sim
.gpr(4))
171 self
.assertEqual(sim
.gpr(4), SelectableInt(1000, 64)) # unmodified
172 print(" gpr5", sim
.gpr(5))
173 self
.assertEqual(sim
.gpr(5), SelectableInt(127, 64)) # eq. MAXVL
175 print(" CR0", bin(CR0
.get_range().value
))
176 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
177 self
.assertEqual(CR0
[CRFields
.LT
], 0)
178 self
.assertEqual(CR0
[CRFields
.GT
], 1)
179 self
.assertEqual(CR0
[CRFields
.SO
], 1)
181 def test_5_setvl_max_rc1(self
):
182 """this should not set when VL gets set to MAXVL
183 at its limit of 127 (0b1111111)
185 lst
= SVP64Asm(["setvl. 5, 4, 127, 0, 1, 1",
189 # SVSTATE (in this case, MAXVL=5) which is going to get erased by setvl
190 # r4 (RA) is 4. and Rc=1. therefore, CR0 should be set to GT
191 svstate
= SVP64State()
192 svstate
.maxvl
= 5 # MAXVL
193 print ("SVSTATE", bin(svstate
.asint()))
195 initial_regs
= [0] * 32
196 initial_regs
[4] = 127 # exactly equal to MAXVL
198 with
Program(lst
, bigendian
=False) as program
:
199 sim
= self
.run_tst_program(program
, svstate
=svstate
,
200 initial_regs
=initial_regs
)
201 print ("SVSTATE after", bin(sim
.svstate
.asint()))
202 print (" vl", bin(sim
.svstate
.vl
))
203 print (" mvl", bin(sim
.svstate
.maxvl
))
204 print (" srcstep", bin(sim
.svstate
.srcstep
))
205 print (" dststep", bin(sim
.svstate
.dststep
))
206 print (" vfirst", bin(sim
.svstate
.vfirst
))
207 self
.assertEqual(sim
.svstate
.vl
, 127)
208 self
.assertEqual(sim
.svstate
.maxvl
, 127)
209 self
.assertEqual(sim
.svstate
.srcstep
, 0)
210 self
.assertEqual(sim
.svstate
.dststep
, 0)
211 self
.assertEqual(sim
.svstate
.vfirst
, 0)
212 print(" gpr4", sim
.gpr(4))
213 self
.assertEqual(sim
.gpr(4), SelectableInt(127, 64)) # unmodified
214 print(" gpr5", sim
.gpr(5))
215 self
.assertEqual(sim
.gpr(5), SelectableInt(127, 64)) # eq. MAXVL
217 print(" CR0", bin(CR0
.get_range().value
))
218 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
219 self
.assertEqual(CR0
[CRFields
.LT
], 0)
220 self
.assertEqual(CR0
[CRFields
.GT
], 1)
221 self
.assertEqual(CR0
[CRFields
.SO
], 0)
223 def test_5_setvl_rt0_rc1(self
):
224 """odd one. Rc=1, RT=0, RA!=0, so RT does not get set, but VL does.
225 confirms that when Rc=1 and RT is unmodified that CR0 still is updated
227 lst
= SVP64Asm(["setvl. 0, 4, 5, 0, 1, 1",
231 # SVSTATE (in this case, MAXVL=5) which is going to get erased by setvl
232 # r4 (RA) is 4. and Rc=1. therefore, CR0 should be set to GT
233 svstate
= SVP64State()
234 svstate
.maxvl
= 5 # MAXVL
235 print ("SVSTATE", bin(svstate
.asint()))
237 initial_regs
= [0] * 32
238 initial_regs
[4] = 127 # overlimit, should set CR0.SO=1, and CR0.GT=1
240 with
Program(lst
, bigendian
=False) as program
:
241 sim
= self
.run_tst_program(program
, svstate
=svstate
,
242 initial_regs
=initial_regs
)
243 print ("SVSTATE after", bin(sim
.svstate
.asint()))
244 print (" vl", bin(sim
.svstate
.vl
))
245 print (" mvl", bin(sim
.svstate
.maxvl
))
246 print (" srcstep", bin(sim
.svstate
.srcstep
))
247 print (" dststep", bin(sim
.svstate
.dststep
))
248 print (" vfirst", bin(sim
.svstate
.vfirst
))
249 self
.assertEqual(sim
.svstate
.vl
, 5)
250 self
.assertEqual(sim
.svstate
.maxvl
, 5)
251 self
.assertEqual(sim
.svstate
.srcstep
, 0)
252 self
.assertEqual(sim
.svstate
.dststep
, 0)
253 self
.assertEqual(sim
.svstate
.vfirst
, 0)
254 print(" gpr0", sim
.gpr(0))
255 self
.assertEqual(sim
.gpr(0), SelectableInt(0, 64)) # unmodified
256 print(" gpr4", sim
.gpr(4))
257 self
.assertEqual(sim
.gpr(4), SelectableInt(127, 64)) # unmodified
259 print(" CR0", bin(CR0
.get_range().value
))
260 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
261 self
.assertEqual(CR0
[CRFields
.LT
], 0)
262 self
.assertEqual(CR0
[CRFields
.GT
], 1)
263 self
.assertEqual(CR0
[CRFields
.SO
], 1)
265 def test_svstep_1(self
):
266 lst
= SVP64Asm(["setvl 0, 0, 10, 1, 1, 1", # actual setvl (VF mode)
267 "setvl 0, 0, 1, 1, 0, 0", # svstep
268 "setvl 0, 0, 1, 1, 0, 0" # svstep
272 # SVSTATE (in this case, VL=4) which is going to get erased by setvl
273 svstate
= SVP64State()
275 svstate
.maxvl
= 4 # MAXVL
276 print ("SVSTATE", bin(svstate
.asint()))
278 with
Program(lst
, bigendian
=False) as program
:
279 sim
= self
.run_tst_program(program
, svstate
=svstate
)
280 print ("SVSTATE after", bin(sim
.svstate
.asint()))
281 print (" vl", bin(sim
.svstate
.vl
))
282 print (" mvl", bin(sim
.svstate
.maxvl
))
283 print (" srcstep", bin(sim
.svstate
.srcstep
))
284 print (" dststep", bin(sim
.svstate
.dststep
))
285 print (" vfirst", bin(sim
.svstate
.vfirst
))
286 self
.assertEqual(sim
.svstate
.vl
, 10)
287 self
.assertEqual(sim
.svstate
.maxvl
, 10)
288 self
.assertEqual(sim
.svstate
.srcstep
, 2)
289 self
.assertEqual(sim
.svstate
.dststep
, 2)
290 self
.assertEqual(sim
.svstate
.vfirst
, 1)
291 print(" gpr1", sim
.gpr(0))
292 self
.assertEqual(sim
.gpr(0), SelectableInt(0, 64))
294 def test_svstep_2(self
):
295 """tests svstep when it reaches VL
297 lst
= SVP64Asm(["setvl 0, 0, 2, 1, 1, 1", # actual setvl (VF mode)
298 "setvl. 0, 0, 1, 1, 0, 0", # svstep (Rc=1)
299 "setvl. 0, 0, 1, 1, 0, 0" # svstep (Rc=1)
303 # SVSTATE (in this case, VL=2)
304 svstate
= SVP64State()
306 svstate
.maxvl
= 2 # MAXVL
307 print ("SVSTATE", bin(svstate
.asint()))
309 with
Program(lst
, bigendian
=False) as program
:
310 sim
= self
.run_tst_program(program
, svstate
=svstate
)
311 print ("SVSTATE after", bin(sim
.svstate
.asint()))
312 print (" vl", bin(sim
.svstate
.vl
))
313 print (" mvl", bin(sim
.svstate
.maxvl
))
314 print (" srcstep", bin(sim
.svstate
.srcstep
))
315 print (" dststep", bin(sim
.svstate
.dststep
))
316 print (" vfirst", bin(sim
.svstate
.vfirst
))
317 self
.assertEqual(sim
.svstate
.vl
, 2)
318 self
.assertEqual(sim
.svstate
.maxvl
, 2)
319 self
.assertEqual(sim
.svstate
.srcstep
, 0)
320 self
.assertEqual(sim
.svstate
.dststep
, 0)
321 # when end reached, vertical mode is exited
322 self
.assertEqual(sim
.svstate
.vfirst
, 0)
323 print(" gpr1", sim
.gpr(0))
324 self
.assertEqual(sim
.gpr(0), SelectableInt(0, 64))
326 print(" CR0", bin(CR0
.get_range().value
))
327 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
328 self
.assertEqual(CR0
[CRFields
.LT
], 0)
329 self
.assertEqual(CR0
[CRFields
.GT
], 0)
330 self
.assertEqual(CR0
[CRFields
.SO
], 1)
332 def test_svstep_3(self
):
333 """tests svstep when it *doesn't* reach VL
335 lst
= SVP64Asm(["setvl 0, 0, 3, 1, 1, 1", # actual setvl (VF mode)
336 "setvl. 0, 0, 1, 1, 0, 0", # svstep (Rc=1)
337 "setvl. 0, 0, 1, 1, 0, 0" # svstep (Rc=1)
341 # SVSTATE (in this case, VL=2)
342 svstate
= SVP64State()
344 svstate
.maxvl
= 2 # MAXVL
345 print ("SVSTATE", bin(svstate
.asint()))
347 with
Program(lst
, bigendian
=False) as program
:
348 sim
= self
.run_tst_program(program
, svstate
=svstate
)
349 print ("SVSTATE after", bin(sim
.svstate
.asint()))
350 print (" vl", bin(sim
.svstate
.vl
))
351 print (" mvl", bin(sim
.svstate
.maxvl
))
352 print (" srcstep", bin(sim
.svstate
.srcstep
))
353 print (" dststep", bin(sim
.svstate
.dststep
))
354 print (" vfirst", bin(sim
.svstate
. vfirst
))
355 self
.assertEqual(sim
.svstate
.vl
, 3)
356 self
.assertEqual(sim
.svstate
.maxvl
, 3)
357 # svstep called twice, didn't reach VL, so srcstep/dststep both 2
358 self
.assertEqual(sim
.svstate
.srcstep
, 2)
359 self
.assertEqual(sim
.svstate
.dststep
, 2)
360 print(" gpr1", sim
.gpr(0))
361 self
.assertEqual(sim
.gpr(0), SelectableInt(0, 64))
362 self
.assertEqual(sim
.svstate
.vfirst
, 1)
364 print(" CR0", bin(CR0
.get_range().value
))
365 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
366 self
.assertEqual(CR0
[CRFields
.LT
], 0)
367 self
.assertEqual(CR0
[CRFields
.GT
], 0)
368 self
.assertEqual(CR0
[CRFields
.SO
], 0)
370 def test_setvl_ctr_1_rc1(self
):
371 """setvl CTR mode, with Rc=1, testing if VL and MVL are over-ridden
372 and CR0 set correctly
374 lst
= SVP64Asm(["setvl. 1, 0, 10, 0, 1, 1",
378 # SVSTATE (in this case, VL=2), want to see if these get changed
379 svstate
= SVP64State()
381 svstate
.maxvl
= 2 # MAXVL
382 print ("SVSTATE", bin(svstate
.asint()))
386 with
Program(lst
, bigendian
=False) as program
:
387 sim
= self
.run_tst_program(program
, svstate
=svstate
,
389 print ("SVSTATE after", bin(sim
.svstate
.asint()))
390 print (" vl", bin(sim
.svstate
.vl
))
391 print (" mvl", bin(sim
.svstate
.maxvl
))
392 self
.assertEqual(sim
.svstate
.vl
, 5)
393 self
.assertEqual(sim
.svstate
.maxvl
, 10)
394 print(" gpr1", sim
.gpr(1))
395 self
.assertEqual(sim
.gpr(1), SelectableInt(5, 64))
398 print(" CR0", bin(CR0
.get_range().value
))
399 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
400 self
.assertEqual(CR0
[CRFields
.LT
], 0)
401 self
.assertEqual(CR0
[CRFields
.GT
], 1)
402 self
.assertEqual(CR0
[CRFields
.SO
], 0)
404 def test_setvl_ctr_1(self
):
405 """setvl CTR mode, testing if VL and MVL are over-ridden
407 lst
= SVP64Asm(["setvl 1, 0, 10, 0, 1, 1",
411 # SVSTATE (in this case, VL=2), want to see if these get changed
412 svstate
= SVP64State()
414 svstate
.maxvl
= 2 # MAXVL
415 print ("SVSTATE", bin(svstate
.asint()))
419 with
Program(lst
, bigendian
=False) as program
:
420 sim
= self
.run_tst_program(program
, svstate
=svstate
,
422 print ("SVSTATE after", bin(sim
.svstate
.asint()))
423 print (" vl", bin(sim
.svstate
.vl
))
424 print (" mvl", bin(sim
.svstate
.maxvl
))
425 self
.assertEqual(sim
.svstate
.vl
, 5)
426 self
.assertEqual(sim
.svstate
.maxvl
, 10)
427 print(" gpr1", sim
.gpr(1))
428 self
.assertEqual(sim
.gpr(1), SelectableInt(5, 64))
431 print(" CR0", bin(CR0
.get_range().value
))
432 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
433 self
.assertEqual(CR0
[CRFields
.LT
], 0)
434 self
.assertEqual(CR0
[CRFields
.GT
], 0)
435 self
.assertEqual(CR0
[CRFields
.SO
], 0)
437 def test_setvl_ctr_2_rc1(self
):
438 """setvl Rc=1, CTR large, testing if VL and MVL are over-ridden,
439 check if CR0.SO gets set
441 lst
= SVP64Asm(["setvl. 1, 0, 10, 0, 1, 1",
445 # SVSTATE (in this case, VL=2), want to see if these get changed
446 svstate
= SVP64State()
448 svstate
.maxvl
= 2 # MAXVL
449 print ("SVSTATE", bin(svstate
.asint()))
450 sprs
= {'CTR': 0x1000000000,
453 with
Program(lst
, bigendian
=False) as program
:
454 sim
= self
.run_tst_program(program
, svstate
=svstate
,
456 print ("SVSTATE after", bin(sim
.svstate
.asint()))
457 print (" vl", bin(sim
.svstate
.vl
))
458 print (" mvl", bin(sim
.svstate
.maxvl
))
459 self
.assertEqual(sim
.svstate
.vl
, 10)
460 self
.assertEqual(sim
.svstate
.maxvl
, 10)
461 print(" gpr1", sim
.gpr(1))
462 self
.assertEqual(sim
.gpr(1), SelectableInt(10, 64))
465 print(" CR0", bin(CR0
.get_range().value
))
466 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
467 self
.assertEqual(CR0
[CRFields
.LT
], 0)
468 self
.assertEqual(CR0
[CRFields
.GT
], 1)
469 self
.assertEqual(CR0
[CRFields
.SO
], 1)
471 def test_setvl_ctr_2(self
):
472 """setvl CTR large, testing if VL and MVL are over-ridden
474 lst
= SVP64Asm(["setvl 1, 0, 10, 0, 1, 1",
478 # SVSTATE (in this case, VL=2), want to see if these get changed
479 svstate
= SVP64State()
481 svstate
.maxvl
= 2 # MAXVL
482 print ("SVSTATE", bin(svstate
.asint()))
483 sprs
= {'CTR': 0x1000000000,
486 with
Program(lst
, bigendian
=False) as program
:
487 sim
= self
.run_tst_program(program
, svstate
=svstate
,
489 print ("SVSTATE after", bin(sim
.svstate
.asint()))
490 print (" vl", bin(sim
.svstate
.vl
))
491 print (" mvl", bin(sim
.svstate
.maxvl
))
492 self
.assertEqual(sim
.svstate
.vl
, 10)
493 self
.assertEqual(sim
.svstate
.maxvl
, 10)
494 print(" gpr1", sim
.gpr(1))
495 self
.assertEqual(sim
.gpr(1), SelectableInt(10, 64))
497 def test_setvl_1(self
):
498 """straight setvl, testing if VL and MVL are over-ridden
500 lst
= SVP64Asm(["setvl 0, 0, 10, 0, 1, 1",
504 # SVSTATE (in this case, VL=2), want to see if these get changed
505 svstate
= SVP64State()
507 svstate
.maxvl
= 2 # MAXVL
508 print ("SVSTATE", bin(svstate
.asint()))
510 with
Program(lst
, bigendian
=False) as program
:
511 sim
= self
.run_tst_program(program
, svstate
=svstate
)
512 print ("SVSTATE after", bin(sim
.svstate
.asint()))
513 print (" vl", bin(sim
.svstate
.vl
))
514 print (" mvl", bin(sim
.svstate
.maxvl
))
515 self
.assertEqual(sim
.svstate
.vl
, 10)
516 self
.assertEqual(sim
.svstate
.maxvl
, 10)
517 print(" gpr1", sim
.gpr(1))
518 self
.assertEqual(sim
.gpr(1), SelectableInt(0, 64))
520 def test_setvl_2(self
):
521 """setvl, testing if VL is transferred to RT, and MVL truncates it
523 lst
= SVP64Asm(["setvl 1, 0, 2, 0, 0, 1",
527 # SVSTATE (in this case, VL=2), want to see if these get changed
528 svstate
= SVP64State()
530 svstate
.maxvl
= 10 # MAXVL
531 print ("SVSTATE", bin(svstate
.asint()))
533 with
Program(lst
, bigendian
=False) as program
:
534 sim
= self
.run_tst_program(program
, svstate
=svstate
)
535 print ("SVSTATE after", bin(sim
.svstate
.asint()))
536 print (" vl", bin(sim
.svstate
.vl
))
537 print (" mvl", bin(sim
.svstate
.maxvl
))
538 self
.assertEqual(sim
.svstate
.maxvl
, 2)
539 self
.assertEqual(sim
.svstate
.vl
, 2)
540 print(" gpr1", sim
.gpr(1))
541 self
.assertEqual(sim
.gpr(1), SelectableInt(2, 64))
543 def test_svstep_inner_loop_6(self
):
544 """tests svstep inner loop, running 6 times, looking for "k".
545 also sees if k is actually output into reg 2 (RT=2)
548 # set triple butterfly mode with persistent "REMAP"
549 "svshape 8, 1, 1, 1, 1",
550 "svremap 31, 1, 0, 2, 0, 1, 1",
551 "setvl. 0, 0, 2, 1, 0, 0",# svstep (Rc=1)
552 "setvl. 0, 0, 2, 1, 0, 0",# svstep (Rc=1)
553 "setvl. 0, 0, 2, 1, 0, 0",# svstep (Rc=1)
554 "setvl. 0, 0, 2, 1, 0, 0",# svstep (Rc=1)
555 "setvl. 0, 0, 2, 1, 0, 0",# svstep (Rc=1)
556 "setvl. 2, 0, 2, 1, 0, 0",# svstep (Rc=1)
561 svstate
= SVP64State()
563 #svstate.maxvl = 2 # MAXVL
564 print ("SVSTATE", bin(svstate
.asint()))
566 with
Program(lst
, bigendian
=False) as program
:
567 sim
= self
.run_tst_program(program
, svstate
=svstate
)
568 print ("SVSTATE after", bin(sim
.svstate
.asint()))
569 print (" vl", bin(sim
.svstate
.vl
))
570 print (" mvl", bin(sim
.svstate
.maxvl
))
571 print (" srcstep", bin(sim
.svstate
.srcstep
))
572 print (" dststep", bin(sim
.svstate
.dststep
))
573 print (" vfirst", bin(sim
.svstate
. vfirst
))
574 self
.assertEqual(sim
.svstate
.vl
, 12)
575 self
.assertEqual(sim
.svstate
.maxvl
, 12)
576 # svstep called twice, didn't reach VL, so srcstep/dststep both 2
577 self
.assertEqual(sim
.svstate
.srcstep
, 6)
578 self
.assertEqual(sim
.svstate
.dststep
, 6)
579 self
.assertEqual(sim
.gpr(2), SelectableInt(1, 64))
580 self
.assertEqual(sim
.svstate
.vfirst
, 1)
582 print(" CR0", bin(CR0
.get_range().value
))
583 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
584 self
.assertEqual(CR0
[CRFields
.LT
], 1)
585 self
.assertEqual(CR0
[CRFields
.GT
], 1)
586 self
.assertEqual(CR0
[CRFields
.SO
], 0)
588 def test_svstep_inner_loop_3(self
):
589 """tests svstep inner loop, running 3 times
592 # set triple butterfly mode with persistent "REMAP"
593 "svshape 8, 1, 1, 1, 1",
594 "svremap 31, 1, 0, 2, 0, 1, 1",
595 "setvl. 0, 0, 2, 1, 0, 0",# svstep (Rc=1)
596 "setvl. 0, 0, 2, 1, 0, 0",# svstep (Rc=1)
597 "setvl. 0, 0, 2, 1, 0, 0", # svstep (Rc=1)
602 svstate
= SVP64State()
604 #svstate.maxvl = 2 # MAXVL
605 print ("SVSTATE", bin(svstate
.asint()))
607 with
Program(lst
, bigendian
=False) as program
:
608 sim
= self
.run_tst_program(program
, svstate
=svstate
)
609 print ("SVSTATE after", bin(sim
.svstate
.asint()))
610 print (" vl", bin(sim
.svstate
.vl
))
611 print (" mvl", bin(sim
.svstate
.maxvl
))
612 print (" srcstep", bin(sim
.svstate
.srcstep
))
613 print (" dststep", bin(sim
.svstate
.dststep
))
614 print (" vfirst", bin(sim
.svstate
. vfirst
))
615 self
.assertEqual(sim
.svstate
.vl
, 12)
616 self
.assertEqual(sim
.svstate
.maxvl
, 12)
617 # svstep called twice, didn't reach VL, so srcstep/dststep both 2
618 self
.assertEqual(sim
.svstate
.srcstep
, 3)
619 self
.assertEqual(sim
.svstate
.dststep
, 3)
620 self
.assertEqual(sim
.gpr(0), SelectableInt(0, 64))
621 self
.assertEqual(sim
.svstate
.vfirst
, 1)
623 print(" CR0", bin(CR0
.get_range().value
))
624 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
625 self
.assertEqual(CR0
[CRFields
.LT
], 1)
626 self
.assertEqual(CR0
[CRFields
.GT
], 1)
627 self
.assertEqual(CR0
[CRFields
.SO
], 0)
629 def test_svstep_inner_loop_4(self
):
630 """tests svstep inner loop, running 4 times
633 # set triple butterfly mode with persistent "REMAP"
634 "svshape 8, 1, 1, 1, 1",
635 "svremap 31, 1, 0, 2, 0, 1, 1",
636 "setvl. 0, 0, 2, 1, 0, 0",# svstep (Rc=1)
637 "setvl. 0, 0, 2, 1, 0, 0",# svstep (Rc=1)
638 "setvl. 0, 0, 2, 1, 0, 0", # svstep (Rc=1)
639 "setvl. 0, 0, 2, 1, 0, 0", # svstep (Rc=1)
644 svstate
= SVP64State()
646 #svstate.maxvl = 2 # MAXVL
647 print ("SVSTATE", bin(svstate
.asint()))
649 with
Program(lst
, bigendian
=False) as program
:
650 sim
= self
.run_tst_program(program
, svstate
=svstate
)
651 print ("SVSTATE after", bin(sim
.svstate
.asint()))
652 print (" vl", bin(sim
.svstate
.vl
))
653 print (" mvl", bin(sim
.svstate
.maxvl
))
654 print (" srcstep", bin(sim
.svstate
.srcstep
))
655 print (" dststep", bin(sim
.svstate
.dststep
))
656 print (" vfirst", bin(sim
.svstate
. vfirst
))
657 self
.assertEqual(sim
.svstate
.vl
, 12)
658 self
.assertEqual(sim
.svstate
.maxvl
, 12)
659 # svstep called twice, didn't reach VL, so srcstep/dststep both 2
660 self
.assertEqual(sim
.svstate
.srcstep
, 4)
661 self
.assertEqual(sim
.svstate
.dststep
, 4)
662 self
.assertEqual(sim
.gpr(0), SelectableInt(0, 64))
663 self
.assertEqual(sim
.svstate
.vfirst
, 1)
665 print(" CR0", bin(CR0
.get_range().value
))
666 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
667 self
.assertEqual(CR0
[CRFields
.LT
], 1)
668 self
.assertEqual(CR0
[CRFields
.GT
], 0)
669 self
.assertEqual(CR0
[CRFields
.SO
], 0)
671 def test_svstep_inner_loop_4_jl(self
):
672 """tests svstep inner loop, running 4 times, checking
673 "jl" is returned after 4th iteration
676 # set triple butterfly mode with persistent "REMAP"
677 "svshape 8, 1, 1, 1, 1",
678 "svremap 31, 1, 0, 2, 0, 1, 1",
679 "setvl. 0, 0, 2, 1, 0, 0",# svstep (Rc=1)
680 "setvl. 0, 0, 2, 1, 0, 0",# svstep (Rc=1)
681 "setvl. 0, 0, 2, 1, 0, 0", # svstep (Rc=1)
682 "setvl. 2, 0, 2, 1, 0, 0", # svstep (Rc=1)
687 svstate
= SVP64State()
689 #svstate.maxvl = 2 # MAXVL
690 print ("SVSTATE", bin(svstate
.asint()))
692 with
Program(lst
, bigendian
=False) as program
:
693 sim
= self
.run_tst_program(program
, svstate
=svstate
)
694 print ("SVSTATE after", bin(sim
.svstate
.asint()))
695 print (" vl", bin(sim
.svstate
.vl
))
696 print (" mvl", bin(sim
.svstate
.maxvl
))
697 print (" srcstep", bin(sim
.svstate
.srcstep
))
698 print (" dststep", bin(sim
.svstate
.dststep
))
699 print (" vfirst", bin(sim
.svstate
. vfirst
))
700 self
.assertEqual(sim
.svstate
.vl
, 12)
701 self
.assertEqual(sim
.svstate
.maxvl
, 12)
702 # svstep called twice, didn't reach VL, so srcstep/dststep both 2
703 self
.assertEqual(sim
.svstate
.srcstep
, 4)
704 self
.assertEqual(sim
.svstate
.dststep
, 4)
705 self
.assertEqual(sim
.gpr(2), SelectableInt(6, 64))
706 self
.assertEqual(sim
.svstate
.vfirst
, 1)
708 print(" CR0", bin(CR0
.get_range().value
))
709 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
710 self
.assertEqual(CR0
[CRFields
.LT
], 1)
711 self
.assertEqual(CR0
[CRFields
.GT
], 0)
712 self
.assertEqual(CR0
[CRFields
.SO
], 0)
714 def test_svstep_inner_loop_8_jl(self
):
715 """tests svstep inner loop, running 8 times (sv.setvl.), checking
716 jl is copied into a *Vector* result.
721 # set DCT triple butterfly mode with persistent "REMAP"
722 "svshape 8, 1, 1, 2, 0",
723 "svremap 0, 0, 0, 2, 0, 1, 1",
724 "sv.svstep *2, 4, 1", # svstep get vector of ci
725 "sv.svstep *16, 3, 1", # svstep get vector of step
730 svstate
= SVP64State()
732 #svstate.maxvl = 2 # MAXVL
733 print ("SVSTATE", bin(svstate
.asint()))
735 with
Program(lst
, bigendian
=False) as program
:
736 sim
= self
.run_tst_program(program
, svstate
=svstate
)
737 print ("SVSTATE after", bin(sim
.svstate
.asint()))
738 print (" vl", bin(sim
.svstate
.vl
))
739 print (" mvl", bin(sim
.svstate
.maxvl
))
740 print (" srcstep", bin(sim
.svstate
.srcstep
))
741 print (" dststep", bin(sim
.svstate
.dststep
))
742 print (" vfirst", bin(sim
.svstate
. vfirst
))
743 self
.assertEqual(sim
.svstate
.vl
, 12)
744 self
.assertEqual(sim
.svstate
.maxvl
, 12)
745 # svstep called four times, reset occurs, srcstep zero
746 self
.assertEqual(sim
.svstate
.srcstep
, 0)
747 self
.assertEqual(sim
.svstate
.dststep
, 0)
749 self
.assertEqual(sim
.gpr(2+i
), SelectableInt(8, 64))
750 self
.assertEqual(sim
.gpr(6+i
), SelectableInt(4, 64))
751 self
.assertEqual(sim
.gpr(10+i
), SelectableInt(2, 64))
752 self
.assertEqual(sim
.gpr(16+i
), SelectableInt(i
, 64))
753 self
.assertEqual(sim
.gpr(24+i
), SelectableInt(0, 64))
755 self
.assertEqual(sim
.gpr(20+i
), SelectableInt(i
, 64))
756 self
.assertEqual(sim
.gpr(22+i
), SelectableInt(i
, 64))
757 self
.assertEqual(sim
.svstate
.vfirst
, 0)
759 print(" CR0", bin(CR0
.get_range().value
))
760 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
761 self
.assertEqual(CR0
[CRFields
.LT
], 0)
762 self
.assertEqual(CR0
[CRFields
.GT
], 0)
763 self
.assertEqual(CR0
[CRFields
.SO
], 0)
765 def test_sv_add(self
):
766 """sets VL=2 then adds:
767 * 1 = 5 + 9 => 0x5555 = 0x4321+0x1234
768 * 2 = 6 + 10 => 0x3334 = 0x2223+0x1111
770 isa
= SVP64Asm(["setvl 0, 0, 2, 0, 1, 1",
772 "setvl 3, 0, 0, 0, 0, 0",
775 print ("listing", lst
)
777 # initial values in GPR regfile
778 initial_regs
= [0] * 32
779 initial_regs
[9] = 0x1234
780 initial_regs
[10] = 0x1111
781 initial_regs
[5] = 0x4321
782 initial_regs
[6] = 0x2223
784 # copy before running
785 expected_regs
= deepcopy(initial_regs
)
786 expected_regs
[1] = 0x5555
787 expected_regs
[2] = 0x3334
788 expected_regs
[3] = 2 # setvl places copy of VL here
790 with
Program(lst
, bigendian
=False) as program
:
791 sim
= self
.run_tst_program(program
, initial_regs
)
792 self
._check
_regs
(sim
, expected_regs
)
794 def test_svstep_add_1(self
):
795 """tests svstep with an add, when it reaches VL
796 lst = SVP64Asm(["setvl 0, 0, 2, 1, 1, 1",
798 "setvl. 0, 0, 1, 1, 0, 0",
800 "setvl. 3, 0, 1, 1, 0, 0"
802 sequence is as follows:
803 * setvl sets VL=2 but also "Vertical First" mode.
804 this sets SVSTATE[SVF].
805 * first add, which has srcstep/dststep = 0, does add 1,5,9
806 * svstep EXPLICITLY walks srcstep/dststep to next element
807 * second add, which now has srcstep/dststep = 1, does add 2,6,10
808 * svstep EXPLICITLY walks srcstep/dststep to next element,
809 which now equals VL. srcstep and dststep are both set to
812 lst
= SVP64Asm(["setvl 0, 0, 2, 1, 1, 1",
814 "setvl. 0, 0, 1, 1, 0, 0", # svstep
816 "setvl. 3, 0, 1, 1, 0, 0", # svstep
817 "setvl 4, 0, 0, 0, 0, 0" # svstep
821 # SVSTATE (in this case, VL=2)
822 svstate
= SVP64State()
824 svstate
.maxvl
= 2 # MAXVL
825 print ("SVSTATE", bin(svstate
.asint()))
827 # initial values in GPR regfile
828 initial_regs
= [0] * 32
829 initial_regs
[9] = 0x1234
830 initial_regs
[10] = 0x1111
831 initial_regs
[5] = 0x4321
832 initial_regs
[6] = 0x2223
834 # copy before running
835 expected_regs
= deepcopy(initial_regs
)
836 expected_regs
[1] = 0x5555
837 expected_regs
[2] = 0x3334
838 expected_regs
[4] = 2 # setvl places copy of VL here
840 with
Program(lst
, bigendian
=False) as program
:
841 sim
= self
.run_tst_program(program
, initial_regs
, svstate
=svstate
)
842 print ("SVSTATE after", bin(sim
.svstate
.asint()))
843 print (" vl", bin(sim
.svstate
.vl
))
844 print (" mvl", bin(sim
.svstate
.maxvl
))
845 print (" srcstep", bin(sim
.svstate
.srcstep
))
846 print (" dststep", bin(sim
.svstate
.dststep
))
847 print (" vfirst", bin(sim
.svstate
. vfirst
))
848 self
.assertEqual(sim
.svstate
.vl
, 2)
849 self
.assertEqual(sim
.svstate
.maxvl
, 2)
850 self
.assertEqual(sim
.svstate
.srcstep
, 0)
851 self
.assertEqual(sim
.svstate
.dststep
, 0)
852 # when end reached, vertical mode is exited
853 self
.assertEqual(sim
.svstate
.vfirst
, 0)
855 print(" CR0", bin(CR0
.get_range().value
))
856 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
857 self
.assertEqual(CR0
[CRFields
.LT
], 0)
858 self
.assertEqual(CR0
[CRFields
.GT
], 0)
859 self
.assertEqual(CR0
[CRFields
.SO
], 1)
861 # check registers as expected
862 self
._check
_regs
(sim
, expected_regs
)
864 def test_svstep_add_2(self
):
865 """tests svstep with a branch.
866 lst = SVP64Asm(["setvl 0, 0, 2, 1, 1, 1",
868 "setvl. 0, 0, 1, 1, 0, 0",
871 sequence is as follows:
872 * setvl sets VL=2 but also "Vertical First" mode.
874 * first time add, which has srcstep/dststep = 0, does add 1,5,9
875 * svstep EXPLICITLY walks srcstep/dststep to next element,
876 not yet met VL, so CR0.EQ is set to zero
877 * branch conditional checks bne on CR0, jumps back TWELVE bytes
878 because whilst branch is 32-bit the sv.add is 64-bit
879 * second time add, which now has srcstep/dststep = 1, does add 2,6,10
880 * svstep walks to next element, meets VL, so:
881 - srcstep and dststep set to zero
883 - MSR[SVF] is cleared
884 * branch conditional detects CR0.EQ=1 and FAILs the condition,
887 we therefore have an explicit "Vertical-First" system which can
888 have **MULTIPLE* instructions inside a loop, running each element 0
889 first, then looping back and running all element 1, then all element 2
892 lst
= SVP64Asm(["setvl 0, 0, 2, 1, 1, 1",
894 "setvl. 0, 0, 1, 1, 0, 0", # svstep - this is 64-bit!
895 "bc 6, 3, -0xc" # branch to add (64-bit op so -0xc!)
899 # SVSTATE (in this case, VL=2)
900 svstate
= SVP64State()
902 svstate
.maxvl
= 2 # MAXVL
903 print ("SVSTATE", bin(svstate
.asint()))
905 # initial values in GPR regfile
906 initial_regs
= [0] * 32
907 initial_regs
[9] = 0x1234
908 initial_regs
[10] = 0x1111
909 initial_regs
[5] = 0x4321
910 initial_regs
[6] = 0x2223
912 # copy before running
913 expected_regs
= deepcopy(initial_regs
)
914 expected_regs
[1] = 0x5555
915 expected_regs
[2] = 0x3334
917 with
Program(lst
, bigendian
=False) as program
:
918 sim
= self
.run_tst_program(program
, initial_regs
, svstate
=svstate
)
919 print ("SVSTATE after", bin(sim
.svstate
.asint()))
920 print (" vl", bin(sim
.svstate
.vl
))
921 print (" mvl", bin(sim
.svstate
.maxvl
))
922 print (" srcstep", bin(sim
.svstate
.srcstep
))
923 print (" dststep", bin(sim
.svstate
.dststep
))
924 print (" vfirst", bin(sim
.svstate
. vfirst
))
925 self
.assertEqual(sim
.svstate
.vl
, 2)
926 self
.assertEqual(sim
.svstate
.maxvl
, 2)
927 self
.assertEqual(sim
.svstate
.srcstep
, 0)
928 self
.assertEqual(sim
.svstate
.dststep
, 0)
929 # when end reached, vertical mode is exited
930 self
.assertEqual(sim
.svstate
.vfirst
, 0)
932 print(" CR0", bin(CR0
.get_range().value
))
933 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
934 self
.assertEqual(CR0
[CRFields
.LT
], 0)
935 self
.assertEqual(CR0
[CRFields
.GT
], 0)
936 self
.assertEqual(CR0
[CRFields
.SO
], 1)
938 # check registers as expected
939 self
._check
_regs
(sim
, expected_regs
)
941 def test_svremap(self
):
942 """svremap, see if values get set
944 lst
= SVP64Asm(["svremap 11, 0, 1, 2, 3, 3, 1",
948 with
Program(lst
, bigendian
=False) as program
:
949 sim
= self
.run_tst_program(program
)
950 svstate
= sim
.svstate
951 print ("SVREMAP after", bin(svstate
.value
))
952 print (" men", bin(svstate
.SVme
))
953 print (" mi0", bin(svstate
.mi0
))
954 print (" mi1", bin(svstate
.mi1
))
955 print (" mi2", bin(svstate
.mi2
))
956 print (" mo0", bin(svstate
.mo0
))
957 print (" mo1", bin(svstate
.mo1
))
958 print (" persist", bin(svstate
.RMpst
))
959 self
.assertEqual(svstate
.SVme
, 11)
960 self
.assertEqual(svstate
.mi0
, 0)
961 self
.assertEqual(svstate
.mi1
, 1)
962 self
.assertEqual(svstate
.mi2
, 2)
963 self
.assertEqual(svstate
.mo0
, 3)
964 self
.assertEqual(svstate
.mo1
, 3)
965 self
.assertEqual(svstate
.RMpst
, 1)
967 def test_svstep_iota(self
):
968 """tests svstep "straight", placing srcstep, dststep into vector
970 lst
= SVP64Asm(["setvl 0, 0, 4, 0, 1, 1",
971 "sv.svstep *0, 5, 1", # svstep get vector srcstep
972 "sv.svstep. *4, 6, 1", # svstep get vector dststep
977 svstate
= SVP64State()
979 #svstate.maxvl = 2 # MAXVL
980 print ("SVSTATE", bin(svstate
.asint()))
982 with
Program(lst
, bigendian
=False) as program
:
983 sim
= self
.run_tst_program(program
, svstate
=svstate
)
984 print ("SVSTATE after", bin(sim
.svstate
.asint()))
985 print (" vl", bin(sim
.svstate
.vl
))
986 print (" mvl", bin(sim
.svstate
.maxvl
))
987 print (" srcstep", bin(sim
.svstate
.srcstep
))
988 print (" dststep", bin(sim
.svstate
.dststep
))
989 print (" vfirst", bin(sim
.svstate
. vfirst
))
990 self
.assertEqual(sim
.svstate
.vl
, 4)
991 self
.assertEqual(sim
.svstate
.maxvl
, 4)
992 # svstep called four times, reset occurs, srcstep zero
993 self
.assertEqual(sim
.svstate
.srcstep
, 0)
994 self
.assertEqual(sim
.svstate
.dststep
, 0)
996 self
.assertEqual(sim
.gpr(0+i
), SelectableInt(i
, 64))
997 self
.assertEqual(sim
.gpr(4+i
), SelectableInt(i
, 64))
998 self
.assertEqual(sim
.svstate
.vfirst
, 0)
1000 print(" CR0", bin(CR0
.get_range().value
))
1001 self
.assertEqual(CR0
[CRFields
.EQ
], 0)
1002 self
.assertEqual(CR0
[CRFields
.LT
], 0)
1003 self
.assertEqual(CR0
[CRFields
.GT
], 0)
1004 self
.assertEqual(CR0
[CRFields
.SO
], 1)
1006 def test_svstep_iota_mask(self
):
1007 """tests svstep "straight", placing srcstep, dststep into vector
1009 lst
= SVP64Asm(["setvl 0, 0, 5, 0, 1, 1",
1010 "sv.svstep/m=r30 *0, 5, 1", # svstep get vector srcstep
1011 "sv.svstep./m=r30 *8, 6, 1", # svstep get vector dststep
1016 svstate
= SVP64State()
1017 #svstate.vl = 2 # VL
1018 #svstate.maxvl = 2 # MAXVL
1019 print ("SVSTATE", bin(svstate
.asint()))
1022 initial_regs
= [0] * 32
1023 initial_regs
[30] = mask
1025 with
Program(lst
, bigendian
=False) as program
:
1026 sim
= self
.run_tst_program(program
, svstate
=svstate
,
1027 initial_regs
=initial_regs
)
1028 print ("SVSTATE after", bin(sim
.svstate
.asint()))
1029 print (" vl", bin(sim
.svstate
.vl
))
1030 print (" mvl", bin(sim
.svstate
.maxvl
))
1031 print (" srcstep", bin(sim
.svstate
.srcstep
))
1032 print (" dststep", bin(sim
.svstate
.dststep
))
1033 print (" vfirst", bin(sim
.svstate
. vfirst
))
1034 self
.assertEqual(sim
.svstate
.vl
, 5)
1035 self
.assertEqual(sim
.svstate
.maxvl
, 5)
1036 # svstep called four times, reset occurs, srcstep zero
1037 self
.assertEqual(sim
.svstate
.srcstep
, 0)
1038 self
.assertEqual(sim
.svstate
.dststep
, 0)
1045 self
.assertEqual(sim
.gpr(0+i
), SelectableInt(tst
, 64))
1046 self
.assertEqual(sim
.gpr(8+i
), SelectableInt(tst
, 64))
1047 self
.assertEqual(sim
.svstate
.vfirst
, 0)
1049 print(" CR4", bin(CR4
.get_range().value
))
1050 self
.assertEqual(CR4
[CRFields
.EQ
], 0)
1051 self
.assertEqual(CR4
[CRFields
.LT
], 0)
1052 self
.assertEqual(CR4
[CRFields
.GT
], 0)
1053 self
.assertEqual(CR4
[CRFields
.SO
], 0)
1055 def run_tst_program(self
, prog
, initial_regs
=None,
1058 if initial_regs
is None:
1059 initial_regs
= [0] * 32
1060 simulator
= run_tst(prog
, initial_regs
, svstate
=svstate
,
1061 initial_sprs
=initial_sprs
)
1062 simulator
.gpr
.dump()
1066 if __name__
== "__main__":