3 from nmutil
.formaltest
import FHDLTestCase
4 from openpower
.decoder
.isa
.test_runner
import run_tst
5 from openpower
.decoder
.selectable_int
import SelectableInt
6 from openpower
.simulator
.program
import Program
9 class DecoderTestCase(FHDLTestCase
):
12 initial_regs
= [0] * 32
13 initial_regs
[3] = 0x1234
14 initial_regs
[2] = 0x4321
15 with
Program(lst
, bigendian
=False) as program
:
16 sim
= self
.run_tst_program(program
, initial_regs
)
17 self
.assertEqual(sim
.gpr(1), SelectableInt(0x5555, 64))
20 lst
= ["addi 3, 0, 0x1234",
23 with
Program(lst
, bigendian
=False) as program
:
24 sim
= self
.run_tst_program(program
)
26 self
.assertEqual(sim
.gpr(1), SelectableInt(0x5555, 64))
28 def test_load_store(self
):
29 lst
= ["addi 1, 0, 0x0010",
33 with
Program(lst
, bigendian
=False) as program
:
34 sim
= self
.run_tst_program(program
)
36 self
.assertEqual(sim
.gpr(3), SelectableInt(0x1234, 64))
38 @unittest.skip("broken")
39 def test_addpcis(self
):
40 lst
= ["addpcis 1, 0x1",
43 with
Program(lst
, bigendian
=False) as program
:
44 sim
= self
.run_tst_program(program
)
45 self
.assertEqual(sim
.gpr(1), SelectableInt(0x10004, 64))
46 self
.assertEqual(sim
.gpr(2), SelectableInt(0x10008, 64))
47 self
.assertEqual(sim
.gpr(3), SelectableInt(0x1000c, 64))
49 def test_branch(self
):
50 lst
= ["ba 0xc", # branch to line 4
51 "addi 1, 0, 0x1234", # Should never execute
52 "ba 0x1000", # exit the program
53 "addi 2, 0, 0x1234", # line 4
54 "ba 0x8"] # branch to line 3
55 with
Program(lst
, bigendian
=False) as program
:
56 sim
= self
.run_tst_program(program
)
57 self
.assertEqual(sim
.pc
.CIA
, SelectableInt(0x1000, 64))
58 self
.assertEqual(sim
.gpr(1), SelectableInt(0x0, 64))
59 self
.assertEqual(sim
.gpr(2), SelectableInt(0x1234, 64))
61 def test_branch_link(self
):
67 with
Program(lst
, bigendian
=False) as program
:
68 sim
= self
.run_tst_program(program
)
69 self
.assertEqual(sim
.spr
['LR'], SelectableInt(0x4, 64))
71 def test_branch_ctr(self
):
72 lst
= ["addi 1, 0, 0x10", # target of jump
73 "mtspr 9, 1", # mtctr 1
74 "bcctr 20, 0, 0", # bctr
75 "addi 2, 0, 0x1", # should never execute
76 "addi 1, 0, 0x1234"] # target of ctr
77 with
Program(lst
, bigendian
=False) as program
:
78 sim
= self
.run_tst_program(program
)
79 self
.assertEqual(sim
.spr
['CTR'], SelectableInt(0x10, 64))
80 self
.assertEqual(sim
.gpr(1), SelectableInt(0x1234, 64))
81 self
.assertEqual(sim
.gpr(2), SelectableInt(0, 64))
83 def test_branch_cond(self
):
85 lst
= [f
"addi 1, 0, {i}", # set r1 to i
86 "cmpi cr0, 1, 1, 10", # compare r1 with 10 and store to cr0
87 "bc 12, 2, 0x8", # beq 0x8 -
88 # branch if r1 equals 10 to the nop below
89 "addi 2, 0, 0x1234", # if r1 == 10 this shouldn't execute
90 "or 0, 0, 0"] # branch target
91 with
Program(lst
, bigendian
=False) as program
:
92 sim
= self
.run_tst_program(program
)
94 self
.assertEqual(sim
.gpr(2), SelectableInt(0, 64))
96 self
.assertEqual(sim
.gpr(2), SelectableInt(0x1234, 64))
98 def test_branch_loop(self
):
99 lst
= ["addi 1, 0, 0",
103 "cmpi cr0, 1, 1, 10",
105 with
Program(lst
, bigendian
=False) as program
:
106 sim
= self
.run_tst_program(program
)
108 self
.assertEqual(sim
.gpr(2), SelectableInt(0x37, 64))
110 def test_branch_loop_ctr(self
):
111 lst
= ["addi 1, 0, 0",
113 "mtspr 9, 2", # set ctr to 7
115 "bc 16, 0, -0x4"] # bdnz to the addi above
116 with
Program(lst
, bigendian
=False) as program
:
117 sim
= self
.run_tst_program(program
)
119 self
.assertEqual(sim
.gpr(1), SelectableInt(0x23, 64))
121 def test_add_compare(self
):
122 lst
= ["addis 1, 0, 0xffff",
123 "addis 2, 0, 0xffff",
126 with
Program(lst
, bigendian
=False) as program
:
127 sim
= self
.run_tst_program(program
)
129 self
.assertEqual(sim
.gpr(3), SelectableInt(0x80000000, 64))
132 lst
= ["addis 1, 0, 0xffff",
133 "addis 2, 0, 0xffff",
136 with
Program(lst
, bigendian
=False) as program
:
137 sim
= self
.run_tst_program(program
)
138 self
.assertEqual(sim
.gpr(3), SelectableInt(0x200000, 64))
141 lst
= ["slw 1, 3, 2"]
142 initial_regs
= [0] * 32
143 initial_regs
[3] = 0xdeadbeefcafebabe
145 with
Program(lst
, bigendian
=False) as program
:
146 sim
= self
.run_tst_program(program
, initial_regs
)
147 self
.assertEqual(sim
.gpr(1), SelectableInt(0x5fd757c0, 64))
150 lst
= ["srw 1, 3, 2"]
151 initial_regs
= [0] * 32
152 initial_regs
[3] = 0xdeadbeefcafebabe
154 with
Program(lst
, bigendian
=False) as program
:
155 sim
= self
.run_tst_program(program
, initial_regs
)
156 self
.assertEqual(sim
.gpr(1), SelectableInt(0x657f5d5, 64))
158 def test_rlwinm(self
):
159 lst
= ["rlwinm 3, 1, 5, 20, 6"]
160 initial_regs
= [0] * 32
162 with
Program(lst
, bigendian
=False) as program
:
163 sim
= self
.run_tst_program(program
, initial_regs
)
164 self
.assertEqual(sim
.gpr(3), SelectableInt(0xfffffffffe000fff, 64))
166 def test_rlwimi(self
):
167 lst
= ["rlwimi 3, 1, 5, 20, 6"]
168 initial_regs
= [0] * 32
169 initial_regs
[1] = 0xffffffffdeadbeef
170 initial_regs
[3] = 0x12345678
171 with
Program(lst
, bigendian
=False) as program
:
172 sim
= self
.run_tst_program(program
, initial_regs
)
173 self
.assertEqual(sim
.gpr(3), SelectableInt(0xd5b7ddfbd4345dfb, 64))
175 def test_rldic(self
):
176 lst
= ["rldic 3, 1, 5, 20"]
177 initial_regs
= [0] * 32
178 initial_regs
[1] = 0xdeadbeefcafec0de
179 with
Program(lst
, bigendian
=False) as program
:
180 sim
= self
.run_tst_program(program
, initial_regs
)
181 self
.assertEqual(sim
.gpr(3), SelectableInt(0xdf95fd81bc0, 64))
185 initial_regs
= [0] * 32
186 initial_regs
[1] = 0xdeadbeeecaffc0de
187 with
Program(lst
, bigendian
=False) as program
:
188 sim
= self
.run_tst_program(program
, initial_regs
)
189 self
.assertEqual(sim
.gpr(2), SelectableInt(0x100000001, 64))
191 def test_popcnt(self
):
192 lst
= ["popcntb 2, 1",
196 initial_regs
= [0] * 32
197 initial_regs
[1] = 0xdeadbeefcafec0de
198 with
Program(lst
, bigendian
=False) as program
:
199 sim
= self
.run_tst_program(program
, initial_regs
)
200 self
.assertEqual(sim
.gpr(2),
201 SelectableInt(0x605060704070206, 64))
202 self
.assertEqual(sim
.gpr(3),
203 SelectableInt(0x1800000013, 64))
204 self
.assertEqual(sim
.gpr(4),
205 SelectableInt(0x2b, 64))
207 def test_cntlz(self
):
208 lst
= ["cntlzd 2, 1",
210 initial_regs
= [0] * 32
211 initial_regs
[1] = 0x0000beeecaffc0de
212 initial_regs
[3] = 0x0000000000ffc0de
213 with
Program(lst
, bigendian
=False) as program
:
214 sim
= self
.run_tst_program(program
, initial_regs
)
215 self
.assertEqual(sim
.gpr(2), SelectableInt(16, 64))
216 self
.assertEqual(sim
.gpr(4), SelectableInt(8, 64))
218 def test_cmpeqb(self
):
219 lst
= ["cmpeqb cr0, 2, 1",
221 initial_regs
= [0] * 32
222 initial_regs
[1] = 0x0102030405060708
223 initial_regs
[2] = 0x04
224 initial_regs
[3] = 0x10
225 with
Program(lst
, bigendian
=False) as program
:
226 sim
= self
.run_tst_program(program
, initial_regs
)
227 self
.assertEqual(sim
.crl
[0].get_range().value
,
229 self
.assertEqual(sim
.crl
[1].get_range().value
,
232 def test_mtcrf(self
):
234 # 0x76540000 gives expected (3+4) (2+4) (1+4) (0+4) for
236 # The positions of the CR fields have been verified using
237 # QEMU and 'cmp crx, a, b' instructions
238 lst
= ["addis 1, 0, 0x7654",
239 "mtcrf %d, 1" % (1 << (7-i
)),
241 with
Program(lst
, bigendian
=False) as program
:
242 sim
= self
.run_tst_program(program
)
245 # check CR[0]/1/2/3 as well
246 print("cr%d" % i
, sim
.crl
[i
].asint(True))
247 self
.assertTrue(SelectableInt(expected
, 4) == sim
.crl
[i
])
249 self
.assertEqual(sim
.cr
, SelectableInt(expected
<< ((7-i
)*4), 64))
251 def run_tst_program(self
, prog
, initial_regs
=[0] * 32):
252 simulator
= run_tst(prog
, initial_regs
)
257 if __name__
== "__main__":