experimenting with CR/LR/XER etc in qemu
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 9 Jun 2020 22:38:39 +0000 (23:38 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 9 Jun 2020 22:38:39 +0000 (23:38 +0100)
src/soc/simulator/qemu.py
src/soc/simulator/test_sim.py

index d45c17c85289af15d9f25ef73ded1da37b73d781..3c4733a0be2672281c4f7088098627ba5e16f252 100644 (file)
@@ -40,13 +40,15 @@ class QemuController:
                 return int(x['payload']['register-values'][0]['value'], 0)
         return None
 
-    def get_pc(self): return self._get_register('pc')
-    def get_cr(self): return self._get_register('cnd')
-    def get_xer(self): return self._get_register('xer')
-    def get_msr(self): return self._get_register('msr')
-    def get_lr(self): return self._get_register('lr')
-    def get_fpscr(self): return self._get_register('fpscr')
-    def get_ctr(self): return self._get_register('cnt') # probably
+    # TODO: use -data-list-register-names instead of hardcoding the values
+    def get_pc(self): return self._get_register('x 64')
+    def get_msr(self): return self._get_register('x 65')
+    def get_cr(self): return self._get_register('x 66')
+    def get_lr(self): return self._get_register('x 67')
+    def get_ctr(self): return self._get_register('x 68') # probably
+    def get_xer(self): return self._get_register('x 69')
+    def get_fpscr(self): return self._get_register('x 70')
+    def get_mq(self): return self._get_register('x 71')
 
     def get_register(self, num):
         return self._get_register('x {}'.format(num))
index ecf04246b8287b878d7d09db09c1893854110e51..9d00476d6379fdce714bbc888319a9d5301f4348 100644 (file)
@@ -61,6 +61,15 @@ class DecoderTestCase(FHDLTestCase):
 
         return simulator
 
+    def test_0_cmp(self):
+        lst = ["addi 6, 0, 0x10",
+               "addi 7, 0, 0x05",
+               "subf. 1, 6, 7",
+               "cmp cr2, 1, 6, 7",
+               ]
+        with Program(lst) as program:
+            self.run_tst_program(program, [1])
+
     def test_example(self):
         lst = ["addi 1, 0, 0x1234",
                "addi 2, 0, 0x5678",
@@ -142,11 +151,21 @@ class DecoderTestCase(FHDLTestCase):
             self.qemu_register_compare(simulator, q, reglist)
         print(simulator.gpr.dump())
 
-
-    def qemu_register_compare(self, simulator, qemu, regs):
+    def qemu_register_compare(self, sim, qemu, regs):
+        qpc, qxer, qcr = qemu.get_pc(), qemu.get_xer(), qemu.get_cr()
+        sim_cr = sim.cr.get_range().value
+        sim_pc = sim.pc.CIA.value
+        sim_xer = sim.spr['XER'].value
+        print("qemu pc", hex(qpc))
+        print("qemu cr", hex(qcr))
+        print("qemu xer", bin(qxer))
+        print("sim pc", sim.pc.CIA.value)
+        print("sim cr", hex(sim_cr))
+        print("sim xer", hex(sim_xer))
+        self.assertEqual(qcr, sim_cr)
         for reg in regs:
             qemu_val = qemu.get_register(reg)
-            sim_val = simulator.gpr(reg).value
+            sim_val = sim.gpr(reg).value
             self.assertEqual(qemu_val, sim_val)