diff mbox series

[3/3] target/arm: Use vector minmax expanders for aarch32

Message ID 20190106225035.5671-4-richard.henderson@linaro.org
State Superseded
Headers show
Series target/arm: Vector expansion improvments. | expand

Commit Message

Richard Henderson Jan. 6, 2019, 10:50 p.m. UTC
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 target/arm/translate.c | 25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

-- 
2.17.2

Comments

Peter Maydell Jan. 8, 2019, 6:14 p.m. UTC | #1
On Sun, 6 Jan 2019 at 22:50, Richard Henderson
<richard.henderson@linaro.org> wrote:
>

> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> ---

>  target/arm/translate.c | 25 +++++++++++++++++++------

>  1 file changed, 19 insertions(+), 6 deletions(-)

>

> diff --git a/target/arm/translate.c b/target/arm/translate.c

> index 33b1860148..f3f172f384 100644

> --- a/target/arm/translate.c

> +++ b/target/arm/translate.c

> @@ -6368,6 +6368,25 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)

>              tcg_gen_gvec_cmp(u ? TCG_COND_GEU : TCG_COND_GE, size,

>                               rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);

>              return 0;

> +

> +        case NEON_3R_VMAX:

> +            if (u) {

> +                tcg_gen_gvec_umax(size, rd_ofs, rn_ofs, rm_ofs,

> +                                  vec_size, vec_size);

> +            } else {

> +                tcg_gen_gvec_smax(size, rd_ofs, rn_ofs, rm_ofs,

> +                                  vec_size, vec_size);

> +            }

> +            return 0;

> +        case NEON_3R_VMIN:

> +            if (u) {

> +                tcg_gen_gvec_umin(size, rd_ofs, rn_ofs, rm_ofs,

> +                                  vec_size, vec_size);

> +            } else {

> +                tcg_gen_gvec_smin(size, rd_ofs, rn_ofs, rm_ofs,

> +                                  vec_size, vec_size);

> +            }

> +            return 0;

>          }

>

>          if (size == 3) {

> @@ -6533,12 +6552,6 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)

>          case NEON_3R_VQRSHL:

>              GEN_NEON_INTEGER_OP_ENV(qrshl);

>              break;

> -        case NEON_3R_VMAX:

> -            GEN_NEON_INTEGER_OP(max);

> -            break;

> -        case NEON_3R_VMIN:

> -            GEN_NEON_INTEGER_OP(min);

> -            break;

>          case NEON_3R_VABD:

>              GEN_NEON_INTEGER_OP(abd);

>              break;

> --


This leaves the helpers neon_max_[su]{8,16} unused and deletable,
I think? neon_max_[su]32 is used only via the #defines of
neon_pmax_[su]32 so could be renamed to pmax. Similarly min/pmin.

thanks
-- PMM
Peter Maydell Jan. 8, 2019, 6:15 p.m. UTC | #2
On Tue, 8 Jan 2019 at 18:14, Peter Maydell <peter.maydell@linaro.org> wrote:
>

> On Sun, 6 Jan 2019 at 22:50, Richard Henderson

> <richard.henderson@linaro.org> wrote:

> >

> > Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> > ---

> >  target/arm/translate.c | 25 +++++++++++++++++++------

> >  1 file changed, 19 insertions(+), 6 deletions(-)

> >

> > diff --git a/target/arm/translate.c b/target/arm/translate.c

> > index 33b1860148..f3f172f384 100644

> > --- a/target/arm/translate.c

> > +++ b/target/arm/translate.c

> > @@ -6368,6 +6368,25 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)

> >              tcg_gen_gvec_cmp(u ? TCG_COND_GEU : TCG_COND_GE, size,

> >                               rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);

> >              return 0;

> > +

> > +        case NEON_3R_VMAX:

> > +            if (u) {

> > +                tcg_gen_gvec_umax(size, rd_ofs, rn_ofs, rm_ofs,

> > +                                  vec_size, vec_size);

> > +            } else {

> > +                tcg_gen_gvec_smax(size, rd_ofs, rn_ofs, rm_ofs,

> > +                                  vec_size, vec_size);

> > +            }

> > +            return 0;

> > +        case NEON_3R_VMIN:

> > +            if (u) {

> > +                tcg_gen_gvec_umin(size, rd_ofs, rn_ofs, rm_ofs,

> > +                                  vec_size, vec_size);

> > +            } else {

> > +                tcg_gen_gvec_smin(size, rd_ofs, rn_ofs, rm_ofs,

> > +                                  vec_size, vec_size);

> > +            }

> > +            return 0;

> >          }

> >

> >          if (size == 3) {

> > @@ -6533,12 +6552,6 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)

> >          case NEON_3R_VQRSHL:

> >              GEN_NEON_INTEGER_OP_ENV(qrshl);

> >              break;

> > -        case NEON_3R_VMAX:

> > -            GEN_NEON_INTEGER_OP(max);

> > -            break;

> > -        case NEON_3R_VMIN:

> > -            GEN_NEON_INTEGER_OP(min);

> > -            break;

> >          case NEON_3R_VABD:

> >              GEN_NEON_INTEGER_OP(abd);

> >              break;

> > --

>

> This leaves the helpers neon_max_[su]{8,16} unused and deletable,

> I think? neon_max_[su]32 is used only via the #defines of

> neon_pmax_[su]32 so could be renamed to pmax. Similarly min/pmin.


...but if you wanted to do the cleanup in a followon patch
you can have
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

on this one.

thanks
-- PMM
diff mbox series

Patch

diff --git a/target/arm/translate.c b/target/arm/translate.c
index 33b1860148..f3f172f384 100644
--- a/target/arm/translate.c
+++ b/target/arm/translate.c
@@ -6368,6 +6368,25 @@  static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
             tcg_gen_gvec_cmp(u ? TCG_COND_GEU : TCG_COND_GE, size,
                              rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
             return 0;
+
+        case NEON_3R_VMAX:
+            if (u) {
+                tcg_gen_gvec_umax(size, rd_ofs, rn_ofs, rm_ofs,
+                                  vec_size, vec_size);
+            } else {
+                tcg_gen_gvec_smax(size, rd_ofs, rn_ofs, rm_ofs,
+                                  vec_size, vec_size);
+            }
+            return 0;
+        case NEON_3R_VMIN:
+            if (u) {
+                tcg_gen_gvec_umin(size, rd_ofs, rn_ofs, rm_ofs,
+                                  vec_size, vec_size);
+            } else {
+                tcg_gen_gvec_smin(size, rd_ofs, rn_ofs, rm_ofs,
+                                  vec_size, vec_size);
+            }
+            return 0;
         }
 
         if (size == 3) {
@@ -6533,12 +6552,6 @@  static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
         case NEON_3R_VQRSHL:
             GEN_NEON_INTEGER_OP_ENV(qrshl);
             break;
-        case NEON_3R_VMAX:
-            GEN_NEON_INTEGER_OP(max);
-            break;
-        case NEON_3R_VMIN:
-            GEN_NEON_INTEGER_OP(min);
-            break;
         case NEON_3R_VABD:
             GEN_NEON_INTEGER_OP(abd);
             break;