add mul test cases
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 23 Apr 2021 18:42:15 +0000 (19:42 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 23 Apr 2021 18:42:15 +0000 (19:42 +0100)
src/openpower/test/mul/long_mul_cases.py [new file with mode: 0644]
src/openpower/test/mul/mul_cases.py [new file with mode: 0644]

diff --git a/src/openpower/test/mul/long_mul_cases.py b/src/openpower/test/mul/long_mul_cases.py
new file mode 100644 (file)
index 0000000..3247ccc
--- /dev/null
@@ -0,0 +1,214 @@
+import unittest
+from openpower.simulator.program import Program
+from openpower.endian import bigendian
+from openpower.test.common import TestAccumulatorBase
+import random
+
+
+class MulTestCases2Arg(TestAccumulatorBase):
+    def case_all(self):
+        instrs = ["mulhw",
+                  "mulhw.", "mullw",
+                  "mullw.", "mullwo",
+                  "mullwo.", "mulhwu",
+                  "mulhwu.", "mulld",
+                  "mulld.", "mulldo",
+                  "mulldo.", "mulhd",
+                  "mulhd.", "mulhdu",
+                  "mulhdu."]
+
+        test_values = [
+            0x0,
+            0x1,
+            0x2,
+            0xFFFF_FFFF_FFFF_FFFF,
+            0xFFFF_FFFF_FFFF_FFFE,
+            0x7FFF_FFFF_FFFF_FFFF,
+            0x8000_0000_0000_0000,
+            0x1234_5678_0000_0000,
+            0x1234_5678_8000_0000,
+            0x1234_5678_FFFF_FFFF,
+            0x1234_5678_7FFF_FFFF,
+            0xffffffff,
+            0x7fffffff,
+            0x80000000,
+            0xfffffffe,
+            0xfffffffd
+        ]
+
+        for instr in instrs:
+            l = [f"{instr} 3, 1, 2"]
+            # use "with" so as to close the files used
+            with Program(l, bigendian) as prog:
+                for ra in test_values:
+                    for rb in test_values:
+                        initial_regs = [0] * 32
+                        initial_regs[1] = ra
+                        initial_regs[2] = rb
+                        self.add_case(prog, initial_regs)
+
+    def case_all_rb_randint(self):
+        instrs = ["mulhw",
+                  "mulhw.", "mullw",
+                  "mullw.", "mullwo",
+                  "mullwo.", "mulhwu",
+                  "mulhwu.", "mulld",
+                  "mulld.", "mulldo",
+                  "mulldo.", "mulhd",
+                  "mulhd.", "mulhdu",
+                  "mulhdu."]
+
+        test_values = [
+            0x0,
+            0x1,
+            0x2,
+            0xFFFF_FFFF_FFFF_FFFF,
+            0xFFFF_FFFF_FFFF_FFFE,
+            0x7FFF_FFFF_FFFF_FFFF,
+            0x8000_0000_0000_0000,
+            0x1234_5678_0000_0000,
+            0x1234_5678_8000_0000,
+            0x1234_5678_FFFF_FFFF,
+            0x1234_5678_7FFF_FFFF,
+            0xffffffff,
+            0x7fffffff,
+            0x80000000,
+            0xfffffffe,
+            0xfffffffd
+        ]
+
+        for instr in instrs:
+            l = [f"{instr} 3, 1, 2"]
+            # use "with" so as to close the files used
+            with Program(l, bigendian) as prog:
+                for ra in test_values:
+                    initial_regs = [0] * 32
+                    initial_regs[1] = ra
+                    initial_regs[2] = random.randint(0, (1 << 64)-1)
+                    self.add_case(prog, initial_regs)
+
+    def case_all_rb_close_to_ov(self):
+        instrs = ["mulhw",
+                  "mulhw.", "mullw",
+                  "mullw.", "mullwo",
+                  "mullwo.", "mulhwu",
+                  "mulhwu.", "mulld",
+                  "mulld.", "mulldo",
+                  "mulldo.", "mulhd",
+                  "mulhd.", "mulhdu",
+                  "mulhdu."]
+
+        test_values = [
+            0x0,
+            0x1,
+            0x2,
+            0xFFFF_FFFF_FFFF_FFFF,
+            0xFFFF_FFFF_FFFF_FFFE,
+            0x7FFF_FFFF_FFFF_FFFF,
+            0x8000_0000_0000_0000,
+            0x1234_5678_0000_0000,
+            0x1234_5678_8000_0000,
+            0x1234_5678_FFFF_FFFF,
+            0x1234_5678_7FFF_FFFF,
+            0xffffffff,
+            0x7fffffff,
+            0x80000000,
+            0xfffffffe,
+            0xfffffffd
+        ]
+
+        for instr in instrs:
+            l = [f"{instr} 3, 1, 2"]
+            # use "with" so as to close the files used
+            with Program(l, bigendian) as prog:
+                for i in range(20):
+                    x = 0x7fffffff + random.randint((-1 << 31), (1 << 31) - 1)
+                    ra = random.randint(0, (1 << 32)-1)
+                    rb = x // ra
+
+                    initial_regs = [0] * 32
+                    initial_regs[1] = ra
+                    initial_regs[2] = rb
+                    self.add_case(prog, initial_regs)
+
+    def case_mulli(self):
+
+        imm_values = [-32768, -32767, -32766, -2, -1, 0, 1, 2, 32766, 32767]
+
+        ra_values = [
+            0x0,
+            0x1,
+            0x2,
+            0xFFFF_FFFF_FFFF_FFFF,
+            0xFFFF_FFFF_FFFF_FFFE,
+            0x7FFF_FFFF_FFFF_FFFF,
+            0x8000_0000_0000_0000,
+            0x1234_5678_0000_0000,
+            0x1234_5678_8000_0000,
+            0x1234_5678_FFFF_FFFF,
+            0x1234_5678_7FFF_FFFF,
+            0xffffffff,
+            0x7fffffff,
+            0x80000000,
+            0xfffffffe,
+            0xfffffffd
+        ]
+
+        for i in range(20):
+            imm_values.append(random.randint(-1 << 15, (1 << 15) - 1))
+
+        for i in range(14):
+            ra_values.append(random.randint(0, (1 << 64) - 1))
+
+        for imm in imm_values:
+            l = [f"mulli 0, 1, {imm}"]
+            # use "with" so as to close the files used
+            with Program(l, bigendian) as prog:
+                for ra in ra_values:
+                    initial_regs = [0] * 32
+                    initial_regs[1] = ra
+                    self.add_case(prog, initial_regs)
+
+
+MUL_3_ARG_TEST_VALUES = [
+    0x0,
+    0x1,
+    0x2,
+    0xFFFF_FFFF_FFFF_FFFF,
+    0xFFFF_FFFF_FFFF_FFFE,
+    0x7FFF_FFFF_FFFF_FFFF,
+    0x8000_0000_0000_0000,
+    0x1234_5678_0000_0000,
+    0x1234_5678_8000_0000,
+    0x1234_5678_FFFF_FFFF,
+    0x1234_5678_7FFF_FFFF,
+    0xffffffff,
+    0x7fffffff,
+    0x80000000,
+    0xfffffffe,
+    0xfffffffd
+]
+
+
+class MulTestCases3Arg(TestAccumulatorBase):
+    def __init__(self, subtest_index):
+        self.subtest_index = subtest_index
+        super().__init__()
+
+    def case_all(self):
+        instrs = ["maddhd", "maddhdu", "maddld"]
+
+        for instr in instrs:
+            l = [f"{instr} 1, 2, 3, 4"]
+            ra = MUL_3_ARG_TEST_VALUES[self.subtest_index]
+            for rb in MUL_3_ARG_TEST_VALUES:
+                for rc in MUL_3_ARG_TEST_VALUES:
+                    initial_regs = [0] * 32
+                    initial_regs[2] = ra
+                    initial_regs[3] = rb
+                    initial_regs[4] = rc
+                    # use "with" so as to close the files used
+                    with Program(l, bigendian) as prog:
+                        self.add_case(prog, initial_regs)
+
+
diff --git a/src/openpower/test/mul/mul_cases.py b/src/openpower/test/mul/mul_cases.py
new file mode 100644 (file)
index 0000000..ad28da3
--- /dev/null
@@ -0,0 +1,125 @@
+from openpower.simulator.program import Program
+from openpower.endian import bigendian
+from openpower.test.common import TestAccumulatorBase, skip_case
+
+import random
+
+
+class MulTestCases2Arg(TestAccumulatorBase):
+    def case_0_mullw(self):
+        lst = [f"mullw 3, 1, 2"]
+        initial_regs = [0] * 32
+        #initial_regs[1] = 0xffffffffffffffff
+        #initial_regs[2] = 0xffffffffffffffff
+        initial_regs[1] = 0x2ffffffff
+        initial_regs[2] = 0x2
+        self.add_case(Program(lst, bigendian), initial_regs)
+
+    def case_1_mullwo_(self):
+        lst = [f"mullwo. 3, 1, 2"]
+        initial_regs = [0] * 32
+        initial_regs[1] = 0x3b34b06f
+        initial_regs[2] = 0xfdeba998
+        self.add_case(Program(lst, bigendian), initial_regs)
+
+    def case_2_mullwo(self):
+        lst = [f"mullwo 3, 1, 2"]
+        initial_regs = [0] * 32
+        initial_regs[1] = 0xffffffffffffa988  # -5678
+        initial_regs[2] = 0xffffffffffffedcc  # -1234
+        self.add_case(Program(lst, bigendian), initial_regs)
+
+    def case_3_mullw(self):
+        lst = ["mullw 3, 1, 2",
+               "mullw 3, 1, 2"]
+        initial_regs = [0] * 32
+        initial_regs[1] = 0x6
+        initial_regs[2] = 0xe
+        self.add_case(Program(lst, bigendian), initial_regs)
+
+    def case_4_mullw_rand(self):
+        for i in range(40):
+            lst = ["mullw 3, 1, 2"]
+            initial_regs = [0] * 32
+            initial_regs[1] = random.randint(0, (1 << 64)-1)
+            initial_regs[2] = random.randint(0, (1 << 64)-1)
+            self.add_case(Program(lst, bigendian), initial_regs)
+
+    def case_4_mullw_nonrand(self):
+        for i in range(40):
+            lst = ["mullw 3, 1, 2"]
+            initial_regs = [0] * 32
+            initial_regs[1] = i+1
+            initial_regs[2] = i+20
+            self.add_case(Program(lst, bigendian), initial_regs)
+
+    def case_mulhw__regression_1(self):
+        lst = ["mulhw. 3, 1, 2"
+               ]
+        initial_regs = [0] * 32
+        initial_regs[1] = 0x7745b36eca6646fa
+        initial_regs[2] = 0x47dfba3a63834ba2
+        self.add_case(Program(lst, bigendian), initial_regs)
+
+    def case_rand_mul_lh(self):
+        insns = ["mulhw", "mulhw.", "mulhwu", "mulhwu."]
+        for i in range(40):
+            choice = random.choice(insns)
+            lst = [f"{choice} 3, 1, 2"]
+            initial_regs = [0] * 32
+            initial_regs[1] = random.randint(0, (1 << 64)-1)
+            initial_regs[2] = random.randint(0, (1 << 64)-1)
+            self.add_case(Program(lst, bigendian), initial_regs)
+
+    def case_rand_mullw(self):
+        insns = ["mullw", "mullw.", "mullwo", "mullwo."]
+        for i in range(40):
+            choice = random.choice(insns)
+            lst = [f"{choice} 3, 1, 2"]
+            initial_regs = [0] * 32
+            initial_regs[1] = random.randint(0, (1 << 64)-1)
+            initial_regs[2] = random.randint(0, (1 << 64)-1)
+            self.add_case(Program(lst, bigendian), initial_regs)
+
+    def case_rand_mulld(self):
+        insns = ["mulld", "mulld.", "mulldo", "mulldo."]
+        for i in range(40):
+            choice = random.choice(insns)
+            lst = [f"{choice} 3, 1, 2"]
+            initial_regs = [0] * 32
+            initial_regs[1] = random.randint(0, (1 << 64)-1)
+            initial_regs[2] = random.randint(0, (1 << 64)-1)
+            self.add_case(Program(lst, bigendian), initial_regs)
+
+    def case_rand_mulhd(self):
+        insns = ["mulhd", "mulhd."]
+        for i in range(40):
+            choice = random.choice(insns)
+            lst = [f"{choice} 3, 1, 2"]
+            initial_regs = [0] * 32
+            initial_regs[1] = random.randint(0, (1 << 64)-1)
+            initial_regs[2] = random.randint(0, (1 << 64)-1)
+            self.add_case(Program(lst, bigendian), initial_regs)
+
+    def case_0_mullhw_regression(self):
+        lst = [f"mulhwu 3, 1, 2"]
+        initial_regs = [0] * 32
+        initial_regs[1] = 0x4000000000000000
+        initial_regs[2] = 0x0000000000000002
+        self.add_case(Program(lst, bigendian), initial_regs)
+
+
+class MulTestCases3Arg(TestAccumulatorBase):
+    # TODO add test case for these 3 operand cases (madd
+    # needs to be implemented)
+    # "maddhd","maddhdu","maddld"
+    @skip_case("madd not implemented")
+    def case_maddld(self):
+        lst = ["maddld 1, 2, 3, 4"]
+        initial_regs = [0] * 32
+        initial_regs[2] = 0x3
+        initial_regs[3] = 0x4
+        initial_regs[4] = 0x5
+        self.add_case(Program(lst, bigendian), initial_regs)
+
+