This function is just a boring large switch-case which can be replaced
completely with a simple RTL templete in the .md file.

gcc/

        * config/loongarch/lsx.md (vec_perm<mode>): Expand directly with
        RTL template.
        * config/loongarch/loongarch-protos.h
        (loongarch_expand_vec_perm): Delete.
        * config/loongarch/loongarch.cc (loongarch_expand_vec_perm):
        Delete.
---
 gcc/config/loongarch/loongarch-protos.h |  1 -
 gcc/config/loongarch/loongarch.cc       | 49 -------------------------
 gcc/config/loongarch/lsx.md             | 23 +++++++-----
 3 files changed, 13 insertions(+), 60 deletions(-)

diff --git a/gcc/config/loongarch/loongarch-protos.h 
b/gcc/config/loongarch/loongarch-protos.h
index a84b708cc28..a0a9aae8f08 100644
--- a/gcc/config/loongarch/loongarch-protos.h
+++ b/gcc/config/loongarch/loongarch-protos.h
@@ -179,7 +179,6 @@ extern void loongarch_expand_atomic_qihi (union 
loongarch_gen_fn_ptrs,
 extern void loongarch_expand_vector_group_init (rtx, rtx);
 extern void loongarch_expand_vector_init (rtx, rtx);
 extern void loongarch_expand_vec_unpack (rtx op[2], bool);
-extern void loongarch_expand_vec_perm (rtx, rtx, rtx, rtx);
 extern void loongarch_expand_vec_perm_1 (rtx[]);
 extern void loongarch_expand_vector_extract (rtx, rtx, int);
 extern void loongarch_expand_vector_reduc (rtx (*)(rtx, rtx, rtx), rtx, rtx);
diff --git a/gcc/config/loongarch/loongarch.cc 
b/gcc/config/loongarch/loongarch.cc
index 78d04ed63de..03d4e15acf9 100644
--- a/gcc/config/loongarch/loongarch.cc
+++ b/gcc/config/loongarch/loongarch.cc
@@ -9204,55 +9204,6 @@ loongarch_expand_vec_perm_1 (rtx operands[])
                    gen_lowpart (GET_MODE (operands[0]), target));
 }
 
-void
-loongarch_expand_vec_perm (rtx target, rtx op0, rtx op1, rtx sel)
-{
-  machine_mode vmode = GET_MODE (target);
-  machine_mode vimode = GET_MODE (sel);
-  auto nelt = GET_MODE_NUNITS (vmode);
-  auto round_reg = gen_reg_rtx (vimode);
-  rtx round_data[MAX_VECT_LEN];
-
-  for (int i = 0; i < nelt; i += 1)
-    {
-      round_data[i] = GEN_INT (0x1f);
-    }
-
-  rtx round_data_rtx = gen_rtx_CONST_VECTOR (vimode, gen_rtvec_v (nelt, 
round_data));
-  emit_move_insn (round_reg, round_data_rtx);
-
-  if (vmode != vimode)
-    {
-      target = lowpart_subreg (vimode, target, vmode);
-      op0 = lowpart_subreg (vimode, op0, vmode);
-      op1 = lowpart_subreg (vimode, op1, vmode);
-    }
-
-  switch (vmode)
-    {
-    case E_V16QImode:
-      emit_insn (gen_andv16qi3 (sel, sel, round_reg));
-      emit_insn (gen_lsx_vshuf_b (target, op1, op0, sel));
-      break;
-    case E_V2DFmode:
-    case E_V2DImode:
-      emit_insn (gen_andv2di3 (sel, sel, round_reg));
-      emit_insn (gen_lsx_vshuf_d (target, sel, op1, op0));
-      break;
-    case E_V4SFmode:
-    case E_V4SImode:
-      emit_insn (gen_andv4si3 (sel, sel, round_reg));
-      emit_insn (gen_lsx_vshuf_w (target, sel, op1, op0));
-      break;
-    case E_V8HImode:
-      emit_insn (gen_andv8hi3 (sel, sel, round_reg));
-      emit_insn (gen_lsx_vshuf_h (target, sel, op1, op0));
-      break;
-    default:
-      break;
-    }
-}
-
 /* Following are the assist function for const vector permutation support.  */
 static bool
 loongarch_is_quad_duplicate (struct expand_vec_perm_d *d)
diff --git a/gcc/config/loongarch/lsx.md b/gcc/config/loongarch/lsx.md
index e4497cc910e..0fee3a4bc9a 100644
--- a/gcc/config/loongarch/lsx.md
+++ b/gcc/config/loongarch/lsx.md
@@ -513,16 +513,19 @@ (define_expand "lsx_vrepli<mode>"
 })
 
 (define_expand "vec_perm<mode>"
- [(match_operand:LSX 0 "register_operand")
-  (match_operand:LSX 1 "register_operand")
-  (match_operand:LSX 2 "register_operand")
-  (match_operand:<VIMODE> 3 "register_operand")]
-  "ISA_HAS_LSX"
-{
-  loongarch_expand_vec_perm (operands[0], operands[1],
-                            operands[2], operands[3]);
-  DONE;
-})
+ [(set (match_dup 4)
+       (and:<VIMODE> (match_operand:<VIMODE> 3 "register_operand")
+                    (match_dup 5)))
+  (set (match_operand:LSX 0 "register_operand")
+       (unspec:LSX [(match_operand:LSX 2 "register_operand")
+                    (match_operand:LSX 1 "register_operand")
+                    (match_dup 4)]
+                  UNSPEC_SIMD_VSHUF))]
+ "ISA_HAS_LSX"
+ {
+   operands[4] = gen_reg_rtx (<VIMODE>mode);
+   operands[5] = gen_const_vec_duplicate (<VIMODE>mode, GEN_INT (0x1f));
+ })
 
 ;; Integer operations
 (define_insn "add<mode>3"
-- 
2.51.2

Reply via email to