[PATCH v3 3/3] powerpc test_emulate_step: add testcases for divde[.] and divdeu[.] instructions
Naveen N. Rao
naveen.n.rao at linux.vnet.ibm.com
Wed Apr 1 21:56:00 AEDT 2020
Balamuruhan S wrote:
> 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 <sandipan at linux.ibm.com>
> Signed-off-by: Balamuruhan S <bala24 at 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),
I think you meant to use TEST_DIVDEU here ^^^^^ and in the test before,
rather than TEST_DIVDEU_DOT.
Apart from them, for this series:
Acked-by: Naveen N. Rao <naveen.n.rao at linux.vnet.ibm.com>
- Naveen
More information about the Linuxppc-dev
mailing list