add testcases for divde, divde., divdeu, divdeu. emulated
instructions to cover few scenarios,
        * with same dividend and divisor to have undefine RT
          for divdeu[.]
        * with divide by zero to have undefine RT for both
          divde[.] and divdeu[.]
        * with negative dividend to cover -|divisor| < r <= 0 if
          the dividend is negative for divde[.]
        * normal case with proper dividend and divisor for both
          divde[.] and divdeu[.]

Reviewed-by: Sandipan Das <sandi...@linux.ibm.com>
Signed-off-by: Balamuruhan S <bal...@linux.ibm.com>
---
 arch/powerpc/lib/test_emulate_step.c | 164 +++++++++++++++++++++++++++++++++++
 1 file changed, 164 insertions(+)

diff --git a/arch/powerpc/lib/test_emulate_step.c 
b/arch/powerpc/lib/test_emulate_step.c
index 42347067739c..ffeb9b68a31d 100644
--- a/arch/powerpc/lib/test_emulate_step.c
+++ b/arch/powerpc/lib/test_emulate_step.c
@@ -53,6 +53,14 @@
                                        ___PPC_RA(a) | ___PPC_RB(b))
 #define TEST_ADDC_DOT(t, a, b) (PPC_INST_ADDC | ___PPC_RT(t) |         \
                                        ___PPC_RA(a) | ___PPC_RB(b) | 0x1)
+#define TEST_DIVDE(t, a, b)    (PPC_INST_DIVDE | ___PPC_RT(t) |        \
+                                       ___PPC_RA(a) | ___PPC_RB(b))
+#define TEST_DIVDE_DOT(t, a, b)        (PPC_INST_DIVDE | ___PPC_RT(t) |        
\
+                                       ___PPC_RA(a) | ___PPC_RB(b) | 0x1)
+#define TEST_DIVDEU(t, a, b)   (PPC_INST_DIVDEU | ___PPC_RT(t) |       \
+                                       ___PPC_RA(a) | ___PPC_RB(b))
+#define TEST_DIVDEU_DOT(t, a, b)(PPC_INST_DIVDEU | ___PPC_RT(t) |      \
+                                       ___PPC_RA(a) | ___PPC_RB(b) | 0x1)
 
 #define MAX_SUBTESTS   16
 
@@ -837,6 +845,162 @@ static struct compute_test compute_tests[] = {
                                }
                        }
                }
+       },
+       {
+               .mnemonic = "divde",
+               .subtests = {
+                       {
+                               .descr = "RA = LONG_MIN, RB = LONG_MIN",
+                               .instr = TEST_DIVDE(20, 21, 22),
+                               .regs = {
+                                       .gpr[21] = LONG_MIN,
+                                       .gpr[22] = LONG_MIN,
+                               }
+                       },
+                       {
+                               .descr = "RA = 1L, RB = 0",
+                               .instr = TEST_DIVDE(20, 21, 22),
+                               .flags = IGNORE_GPR(20),
+                               .regs = {
+                                       .gpr[21] = 1L,
+                                       .gpr[22] = 0,
+                               }
+                       },
+                       {
+                               .descr = "RA = LONG_MIN, RB = LONG_MAX",
+                               .instr = TEST_DIVDE(20, 21, 22),
+                               .regs = {
+                                       .gpr[21] = LONG_MIN,
+                                       .gpr[22] = LONG_MAX,
+                               }
+                       }
+               }
+       },
+       {
+               .mnemonic = "divde.",
+               .subtests = {
+                       {
+                               .descr = "RA = LONG_MIN, RB = LONG_MIN",
+                               .instr = TEST_DIVDE_DOT(20, 21, 22),
+                               .regs = {
+                                       .gpr[21] = LONG_MIN,
+                                       .gpr[22] = LONG_MIN,
+                               }
+                       },
+                       {
+                               .descr = "RA = 1L, RB = 0",
+                               .instr = TEST_DIVDE_DOT(20, 21, 22),
+                               .flags = IGNORE_GPR(20),
+                               .regs = {
+                                       .gpr[21] = 1L,
+                                       .gpr[22] = 0,
+                               }
+                       },
+                       {
+                               .descr = "RA = LONG_MIN, RB = LONG_MAX",
+                               .instr = TEST_DIVDE_DOT(20, 21, 22),
+                               .regs = {
+                                       .gpr[21] = LONG_MIN,
+                                       .gpr[22] = LONG_MAX,
+                               }
+                       }
+               }
+       },
+       {
+               .mnemonic = "divdeu",
+               .subtests = {
+                       {
+                               .descr = "RA = LONG_MIN, RB = LONG_MIN",
+                               .instr = TEST_DIVDEU(20, 21, 22),
+                               .flags = IGNORE_GPR(20),
+                               .regs = {
+                                       .gpr[21] = LONG_MIN,
+                                       .gpr[22] = LONG_MIN,
+                               }
+                       },
+                       {
+                               .descr = "RA = 1L, RB = 0",
+                               .instr = TEST_DIVDEU(20, 21, 22),
+                               .flags = IGNORE_GPR(20),
+                               .regs = {
+                                       .gpr[21] = 1L,
+                                       .gpr[22] = 0,
+                               }
+                       },
+                       {
+                               .descr = "RA = LONG_MIN, RB = LONG_MAX",
+                               .instr = TEST_DIVDEU(20, 21, 22),
+                               .regs = {
+                                       .gpr[21] = LONG_MIN,
+                                       .gpr[22] = LONG_MAX,
+                               }
+                       },
+                       {
+                               .descr = "RA = LONG_MAX - 1, RB = LONG_MAX",
+                               .instr = TEST_DIVDEU_DOT(20, 21, 22),
+                               .regs = {
+                                       .gpr[21] = LONG_MAX - 1,
+                                       .gpr[22] = LONG_MAX,
+                               }
+                       },
+                       {
+                               .descr = "RA = LONG_MIN + 1, RB = LONG_MIN",
+                               .instr = TEST_DIVDEU_DOT(20, 21, 22),
+                               .flags = IGNORE_GPR(20),
+                               .regs = {
+                                       .gpr[21] = LONG_MIN + 1,
+                                       .gpr[22] = LONG_MIN,
+                               }
+                       }
+               }
+       },
+       {
+               .mnemonic = "divdeu.",
+               .subtests = {
+                       {
+                               .descr = "RA = LONG_MIN, RB = LONG_MIN",
+                               .instr = TEST_DIVDEU_DOT(20, 21, 22),
+                               .flags = IGNORE_GPR(20),
+                               .regs = {
+                                       .gpr[21] = LONG_MIN,
+                                       .gpr[22] = LONG_MIN,
+                               }
+                       },
+                       {
+                               .descr = "RA = 1L, RB = 0",
+                               .instr = TEST_DIVDEU_DOT(20, 21, 22),
+                               .flags = IGNORE_GPR(20),
+                               .regs = {
+                                       .gpr[21] = 1L,
+                                       .gpr[22] = 0,
+                               }
+                       },
+                       {
+                               .descr = "RA = LONG_MIN, RB = LONG_MAX",
+                               .instr = TEST_DIVDEU_DOT(20, 21, 22),
+                               .regs = {
+                                       .gpr[21] = LONG_MIN,
+                                       .gpr[22] = LONG_MAX,
+                               }
+                       },
+                       {
+                               .descr = "RA = LONG_MAX - 1, RB = LONG_MAX",
+                               .instr = TEST_DIVDEU_DOT(20, 21, 22),
+                               .regs = {
+                                       .gpr[21] = LONG_MAX - 1,
+                                       .gpr[22] = LONG_MAX,
+                               }
+                       },
+                       {
+                               .descr = "RA = LONG_MIN + 1, RB = LONG_MIN",
+                               .instr = TEST_DIVDEU_DOT(20, 21, 22),
+                               .flags = IGNORE_GPR(20),
+                               .regs = {
+                                       .gpr[21] = LONG_MIN + 1,
+                                       .gpr[22] = LONG_MIN,
+                               }
+                       }
+               }
        }
 };
 
-- 
2.14.5

Reply via email to