2 from copy
import deepcopy
4 from nmutil
.formaltest
import FHDLTestCase
5 from openpower
.consts
import SVP64CROffs
6 from openpower
.decoder
.isa
.caller
import SVP64State
7 from openpower
.decoder
.isa
.test_caller
import run_tst
8 from openpower
.decoder
.selectable_int
import SelectableInt
9 from openpower
.simulator
.program
import Program
10 from openpower
.insndb
.asm
import SVP64Asm
13 class DecoderTestCase(FHDLTestCase
):
15 def _check_regs(self
, sim
, expected
):
17 self
.assertEqual(sim
.gpr(i
), SelectableInt(expected
[i
], 64))
19 def test_sv_load_store(self
):
20 """>>> lst = ["addi 16, 0, 0x0010",
27 lst
= SVP64Asm(["addi 16, 0, 0x0010",
35 # SVSTATE (in this case, VL=2)
36 svstate
= SVP64State()
38 svstate
.maxvl
= 2 # MAXVL
39 print("SVSTATE", bin(svstate
.asint()))
41 with
Program(lst
, bigendian
=False) as program
:
42 sim
= self
.run_tst_program(program
, svstate
=svstate
)
44 self
.assertEqual(sim
.gpr(8), SelectableInt(0x1234, 64))
45 self
.assertEqual(sim
.gpr(9), SelectableInt(0x1235, 64))
47 def test_sv_add(self
):
48 """>>> lst = ['sv.add *1, *5, *9'
51 * 1 = 5 + 9 => 0x5555 = 0x4321+0x1234
52 * 2 = 6 + 10 => 0x3334 = 0x2223+0x1111
54 isa
= SVP64Asm(['sv.add *1, *5, *9'
59 # initial values in GPR regfile
60 initial_regs
= [0] * 32
61 initial_regs
[5] = 0x4321
62 initial_regs
[9] = 0x1234
63 initial_regs
[10] = 0x1111
64 initial_regs
[6] = 0x2223
65 # SVSTATE (in this case, VL=2)
66 svstate
= SVP64State()
68 svstate
.maxvl
= 2 # MAXVL
69 print("SVSTATE", bin(svstate
.asint()))
70 # copy before running, then compute answers
71 expected_regs
= deepcopy(initial_regs
)
72 expected_regs
[1] = initial_regs
[5] + initial_regs
[9] # 0x5555
73 expected_regs
[2] = initial_regs
[6] + initial_regs
[10] # 0x3334
75 with
Program(lst
, bigendian
=False) as program
:
76 sim
= self
.run_tst_program(program
, initial_regs
, svstate
)
77 self
._check
_regs
(sim
, expected_regs
)
79 def test_sv_add_2(self
):
80 """>>> lst = ['sv.add 1, *5, *9' ]
82 * 1 = 5 + 9 => 0x5555 = 0x4321+0x1234
83 * r1 is scalar so ENDS EARLY
85 isa
= SVP64Asm(['sv.add 1, *5, *9'
90 # initial values in GPR regfile
91 initial_regs
= [0] * 32
92 initial_regs
[9] = 0x1234
93 initial_regs
[10] = 0x1111
94 initial_regs
[5] = 0x4321
95 initial_regs
[6] = 0x2223
96 # SVSTATE (in this case, VL=2)
97 svstate
= SVP64State()
99 svstate
.maxvl
= 2 # MAXVL
100 print("SVSTATE", bin(svstate
.asint()))
101 # copy before running
102 expected_regs
= deepcopy(initial_regs
)
103 expected_regs
[1] = initial_regs
[5] + initial_regs
[9] # 0x5555
105 with
Program(lst
, bigendian
=False) as program
:
106 sim
= self
.run_tst_program(program
, initial_regs
, svstate
)
107 self
._check
_regs
(sim
, expected_regs
)
109 def test_sv_add_3(self
):
110 """>>> lst = ['sv.add *1, 5, *9' ]
113 * 1 = 5 + 9 => 0x5555 = 0x4321+0x1234
114 * 2 = 5 + 10 => 0x5432 = 0x4321+0x1111
116 isa
= SVP64Asm(['sv.add *1, 5, *9'
119 print("listing", lst
)
121 # initial values in GPR regfile
122 initial_regs
= [0] * 32
123 initial_regs
[9] = 0x1234
124 initial_regs
[10] = 0x1111
125 initial_regs
[5] = 0x4321
126 initial_regs
[6] = 0x2223
127 # SVSTATE (in this case, VL=2)
128 svstate
= SVP64State()
130 svstate
.maxvl
= 2 # MAXVL
131 print("SVSTATE", bin(svstate
.asint()))
132 # copy before running
133 expected_regs
= deepcopy(initial_regs
)
134 expected_regs
[1] = initial_regs
[5] + initial_regs
[9] # 0x5555
135 expected_regs
[2] = initial_regs
[5] + initial_regs
[10] # 0x5432
137 with
Program(lst
, bigendian
=False) as program
:
138 sim
= self
.run_tst_program(program
, initial_regs
, svstate
)
139 self
._check
_regs
(sim
, expected_regs
)
141 def test_sv_add_vl_0(self
):
142 """>>> lst = ['sv.add 1, *5, *9'
145 * none because VL is zero
147 isa
= SVP64Asm(['sv.add 1, *5, *9'
150 print("listing", lst
)
152 # initial values in GPR regfile
153 initial_regs
= [0] * 32
154 initial_regs
[9] = 0x1234
155 initial_regs
[10] = 0x1111
156 initial_regs
[5] = 0x4321
157 initial_regs
[6] = 0x2223
158 # SVSTATE (in this case, VL=0)
159 svstate
= SVP64State()
161 svstate
.maxvl
= 0 # MAXVL
162 print("SVSTATE", bin(svstate
.asint()))
163 # copy before running
164 expected_regs
= deepcopy(initial_regs
)
166 with
Program(lst
, bigendian
=False) as program
:
167 sim
= self
.run_tst_program(program
, initial_regs
, svstate
)
168 self
._check
_regs
(sim
, expected_regs
)
170 def test_sv_add_cr(self
):
171 """>>> lst = ['sv.add. *1, *5, *9'
174 adds when Rc=1: TODO CRs higher up
175 * 1 = 5 + 9 => 0 = -1+1 CR0=0b100
176 * 2 = 6 + 10 => 0x3334 = 0x2223+0x1111 CR1=0b010
178 isa
= SVP64Asm(['sv.add. *1, *5, *9'
181 print("listing", lst
)
183 # initial values in GPR regfile
184 initial_regs
= [0] * 32
185 initial_regs
[9] = 0xffffffffffffffff
186 initial_regs
[10] = 0x1111
187 initial_regs
[5] = 0x1
188 initial_regs
[6] = 0x2223
189 # SVSTATE (in this case, VL=2)
190 svstate
= SVP64State()
192 svstate
.maxvl
= 2 # MAXVL
193 print("SVSTATE", bin(svstate
.asint()))
194 # copy before running
195 expected_regs
= deepcopy(initial_regs
)
196 expected_regs
[1] = initial_regs
[5] + initial_regs
[9] # 0x0
197 expected_regs
[2] = initial_regs
[6] + initial_regs
[10] # 0x3334
199 with
Program(lst
, bigendian
=False) as program
:
200 sim
= self
.run_tst_program(program
, initial_regs
, svstate
)
201 # XXX TODO, these need to move to higher range (offset)
202 cr0_idx
= SVP64CROffs
.CR0
203 cr1_idx
= SVP64CROffs
.CR1
204 CR0
= sim
.crl
[cr0_idx
].get_range().value
205 CR1
= sim
.crl
[cr1_idx
].get_range().value
208 self
._check
_regs
(sim
, expected_regs
)
209 self
.assertEqual(CR0
, SelectableInt(2, 4))
210 self
.assertEqual(CR1
, SelectableInt(4, 4))
212 def run_tst_program(self
, prog
, initial_regs
=None,
214 if initial_regs
is None:
215 initial_regs
= [0] * 32
216 simulator
= run_tst(prog
, initial_regs
, svstate
=svstate
)
221 if __name__
== "__main__":