self.assertEqual(sim.gpr(1), SelectableInt(0x1234, 64))
self.assertEqual(sim.gpr(2), SelectableInt(0, 64))
+ def test_branch_cond(self):
+ for i in [0, 10]:
+ lst = [f"addi 1, 0, {i}", # set r1 to i
+ "cmpi cr0, 1, 1, 10", # compare r1 with 10 and store to cr0
+ "bc 12, 2, 0x8", # beq 0x8 -
+ # branch if r1 equals 10 to the nop below
+ "addi 2, 0, 0x1234", # if r1 == 10 this shouldn't execute
+ "or 0, 0, 0"] # branch target
+ with Program(lst) as program:
+ sim = self.run_tst_program(program)
+ if i == 10:
+ self.assertEqual(sim.gpr(2), SelectableInt(0, 64))
+ else:
+ self.assertEqual(sim.gpr(2), SelectableInt(0x1234, 64))
+
+ def test_branch_loop(self):
+ lst = ["addi 1, 0, 0",
+ "addi 1, 0, 0",
+ "addi 1, 1, 1",
+ "add 2, 2, 1",
+ "cmpi cr0, 1, 1, 10",
+ "bc 12, 0, -0xc"]
+ with Program(lst) as program:
+ sim = self.run_tst_program(program)
+ # Verified with qemu
+ self.assertEqual(sim.gpr(2), SelectableInt(0x37, 64))
+
+
def test_add_compare(self):
lst = ["addis 1, 0, 0xffff",
"addis 2, 0, 0xffff",
# Verified with QEMU
self.assertEqual(sim.gpr(3), SelectableInt(0x80000000, 64))
- @unittest.skip("broken (XER)")
def test_cmp(self):
lst = ["addis 1, 0, 0xffff",
"addis 2, 0, 0xffff",
def test_mtcrf(self):
for i in range(4):
- # 0x7654 gives expected (3+4) (2+4) (1+4) (0+4) for i=3,2,1,0
- lst = ["addi %d, 0, 0x7654" % (i+1),
- "mtcrf %d, %d" % (1 << i, i+1),
+ # 0x76540000 gives expected (3+4) (2+4) (1+4) (0+4) for
+ # i=0, 1, 2, 3
+ # The positions of the CR fields have been verified using
+ # QEMU and 'cmp crx, a, b' instructions
+ lst = ["addis 1, 0, 0x7654",
+ "mtcrf %d, 1" % (1 << (7-i)),
]
with Program(lst) as program:
sim = self.run_tst_program(program)
print("cr", sim.cr)
- expected = (i+4)
+ expected = (7-i)
# check CR itself
- self.assertEqual(sim.cr, SelectableInt(expected << (i*4), 32))
+ self.assertEqual(sim.cr, SelectableInt(expected << ((7-i)*4), 32))
# check CR[0]/1/2/3 as well
print("cr%d", sim.crl[i])
self.assertTrue(SelectableInt(expected, 4) == sim.crl[i])