Message ID | 20200120065426.3259-4-bala24@linux.ibm.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Add support for divde[.] and divdeu[.] instruction emulation | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | Successfully applied on branch powerpc/merge (20862247a368dbb75d6e97d82345999adaacf3cc) |
snowpatch_ozlabs/build-ppc64le | success | Build succeeded |
snowpatch_ozlabs/build-ppc64be | success | Build succeeded |
snowpatch_ozlabs/build-ppc64e | success | Build succeeded |
snowpatch_ozlabs/build-pmac32 | success | Build succeeded |
snowpatch_ozlabs/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 176 lines checked |
snowpatch_ozlabs/needsstable | success | Patch has no Fixes tags |
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@linux.ibm.com> > Signed-off-by: Balamuruhan S <bala24@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@linux.vnet.ibm.com> - Naveen
On Wed, 2020-04-01 at 16:26 +0530, Naveen N. Rao wrote: > 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@linux.ibm.com> > > Signed-off-by: Balamuruhan S <bala24@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. yes indeed, I will fix it in my next version. > > Apart from them, for this series: > Acked-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Thank you Naveen for reviewing. -- Bala > > > - Naveen >
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, + } + } + } } };