diff mbox series

[v3,3/3] powerpc test_emulate_step: add testcases for divde[.] and divdeu[.] instructions

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

Checks

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

Commit Message

Balamuruhan S Jan. 20, 2020, 6:54 a.m. UTC
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(+)

Comments

Naveen N. Rao April 1, 2020, 10:56 a.m. UTC | #1
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
Balamuruhan S April 1, 2020, 11:21 a.m. UTC | #2
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 mbox series

Patch

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,
+				}
+			}
+		}
 	}
 };