gcc/ChangeLog:

        * config/loongarch/lasx.md: Support.
        * config/loongarch/loongarch.cc
        (loongarch_expand_vec_widen_hilo): Remove unused code.
        * config/loongarch/lsx.md: Support.

Change-Id: Ic11d61fcefd3a425956159e05046d30cc365481d
---
 gcc/config/loongarch/lasx.md      |  8 +++---
 gcc/config/loongarch/loongarch.cc | 45 ++++++-------------------------
 gcc/config/loongarch/lsx.md       | 42 ++++++++++++++++++-----------
 3 files changed, 38 insertions(+), 57 deletions(-)

diff --git a/gcc/config/loongarch/lasx.md b/gcc/config/loongarch/lasx.md
index 8156f84da46..71c6a8c305d 100644
--- a/gcc/config/loongarch/lasx.md
+++ b/gcc/config/loongarch/lasx.md
@@ -3590,8 +3590,8 @@ (define_insn "lasx_xvstx"
 
 (define_expand "vec_widen_<su><optab>_<hi_lo>_<mode>"
   [(match_operand:<VDMODE256> 0 "register_operand")
-   (match_operand:ILASX_HB 1 "register_operand")
-   (match_operand:ILASX_HB 2 "register_operand")
+   (match_operand:ILASX_WHB 1 "register_operand")
+   (match_operand:ILASX_WHB 2 "register_operand")
    (any_extend (const_int 0))
    (addsub (const_int 0) (const_int 0))
    (const_int zero_one)]
@@ -3608,8 +3608,8 @@ (define_expand "vec_widen_<su><optab>_<hi_lo>_<mode>"
 
 (define_expand "vec_widen_<su>mult_<hi_lo>_<mode>"
   [(match_operand:<VDMODE256> 0 "register_operand")
-   (match_operand:ILASX_HB 1 "register_operand")
-   (match_operand:ILASX_HB 2 "register_operand")
+   (match_operand:ILASX_WHB 1 "register_operand")
+   (match_operand:ILASX_WHB 2 "register_operand")
    (any_extend (const_int 0))
    (const_int zero_one)]
   "ISA_HAS_LASX"
diff --git a/gcc/config/loongarch/loongarch.cc 
b/gcc/config/loongarch/loongarch.cc
index 55a9e702bb4..16b6a528983 100644
--- a/gcc/config/loongarch/loongarch.cc
+++ b/gcc/config/loongarch/loongarch.cc
@@ -8769,47 +8769,18 @@ loongarch_expand_vec_widen_hilo (rtx dest, rtx op1, rtx 
op2,
 {
   machine_mode wmode = GET_MODE (dest);
   machine_mode mode = GET_MODE (op1);
+
+  gcc_assert (ISA_HAS_LASX
+             && GET_MODE_SIZE (mode) == 32
+             && mode != V4DImode);
+
   rtx t1 = gen_reg_rtx (wmode);
   rtx t2 = gen_reg_rtx (wmode);
   rtx t3 = gen_reg_rtx (wmode);
 
-  switch (mode)
-    {
-    case V16HImode:
-    case V32QImode:
-       {
-         emit_insn (fn_even (t1, op1, op2));
-         emit_insn (fn_odd (t2, op1, op2));
-         loongarch_expand_vec_interleave (t3, t1, t2, high_p);
-       }
-      break;
-
-    case V8HImode:
-       {
-         emit_insn (fn_even (t1, op1, op2));
-         emit_insn (fn_odd (t2, op1, op2));
-         if (high_p)
-           emit_insn (gen_lsx_vilvh_w (t3, t1, t2));
-         else
-           emit_insn (gen_lsx_vilvl_w (t3, t1, t2));
-       }
-      break;
-
-    case V16QImode:
-       {
-         emit_insn (fn_even (t1, op1, op2));
-         emit_insn (fn_odd (t2, op1, op2));
-         if (high_p)
-           emit_insn (gen_lsx_vilvh_h (t3, t1, t2));
-         else
-           emit_insn (gen_lsx_vilvl_h (t3, t1, t2));
-       }
-      break;
-
-    default:
-      gcc_unreachable ();
-    }
-
+  emit_insn (fn_even (t1, op1, op2));
+  emit_insn (fn_odd (t2, op1, op2));
+  loongarch_expand_vec_interleave (t3, t1, t2, high_p);
   emit_move_insn (dest, gen_lowpart (wmode, t3));
 }
 
diff --git a/gcc/config/loongarch/lsx.md b/gcc/config/loongarch/lsx.md
index 1786cc7dcb2..f111910cac7 100644
--- a/gcc/config/loongarch/lsx.md
+++ b/gcc/config/loongarch/lsx.md
@@ -3220,35 +3220,45 @@ (define_peephole2
 
 (define_expand "vec_widen_<su><optab>_<hi_lo>_<mode>"
   [(match_operand:<VDMODE> 0 "register_operand")
-   (match_operand:ILSX_HB 1 "register_operand")
-   (match_operand:ILSX_HB 2 "register_operand")
+   (match_operand:ILSX_WHB 1 "register_operand")
+   (match_operand:ILSX_WHB 2 "register_operand")
    (any_extend (const_int 0))
    (addsub (const_int 0) (const_int 0))
    (const_int zero_one)]
   "ISA_HAS_LSX"
 {
-  rtx (*fn_even) (rtx, rtx, rtx) =
-gen_lsx_v<optab>wev_<dlsxfmt>_<lsxfmt><u>;
-  rtx (*fn_odd) (rtx, rtx, rtx) =
-gen_lsx_v<optab>wod_<dlsxfmt>_<lsxfmt><u>;
-  loongarch_expand_vec_widen_hilo (operands[0], operands[1], operands[2],
-                        <zero_one>, fn_even, fn_odd);
+  rtx t_even = gen_reg_rtx (<VDMODE>mode);
+  rtx t_odd = gen_reg_rtx (<VDMODE>mode);
+  emit_insn (gen_lsx_v<optab>wev_<dlsxfmt>_<lsxfmt><u> (t_even, operands[1],
+       operands[2]));
+  emit_insn (gen_lsx_v<optab>wod_<dlsxfmt>_<lsxfmt><u> (t_odd, operands[1],
+       operands[2]));
+  if (<zero_one>)
+    emit_insn (gen_lsx_vilvh_<dlsxfmt> (operands[0], t_even, t_odd));
+  else
+    emit_insn (gen_lsx_vilvl_<dlsxfmt> (operands[0], t_even, t_odd));
+
   DONE;
 })
 
 (define_expand "vec_widen_<su>mult_<hi_lo>_<mode>"
   [(match_operand:<VDMODE> 0 "register_operand")
-   (match_operand:ILSX_HB 1 "register_operand")
-   (match_operand:ILSX_HB 2 "register_operand")
+   (match_operand:ILSX_WHB 1 "register_operand")
+   (match_operand:ILSX_WHB 2 "register_operand")
    (any_extend (const_int 0))
    (const_int zero_one)]
   "ISA_HAS_LSX"
 {
-  rtx (*fn_even) (rtx, rtx, rtx) =
-gen_lsx_vmulwev_<dlsxfmt>_<lsxfmt><u>;
-  rtx (*fn_odd) (rtx, rtx, rtx) =
-gen_lsx_vmulwod_<dlsxfmt>_<lsxfmt><u>;
-  loongarch_expand_vec_widen_hilo (operands[0], operands[1], operands[2],
-                        <zero_one>, fn_even, fn_odd);
+  rtx t_even = gen_reg_rtx (<VDMODE>mode);
+  rtx t_odd = gen_reg_rtx (<VDMODE>mode);
+  emit_insn (gen_lsx_vmulwev_<dlsxfmt>_<lsxfmt><u> (t_even, operands[1],
+       operands[2]));
+  emit_insn (gen_lsx_vmulwod_<dlsxfmt>_<lsxfmt><u> (t_odd, operands[1],
+       operands[2]));
+  if (<zero_one>)
+    emit_insn (gen_lsx_vilvh_<dlsxfmt> (operands[0], t_even, t_odd));
+  else
+    emit_insn (gen_lsx_vilvl_<dlsxfmt> (operands[0], t_even, t_odd));
+
   DONE;
 })
-- 
2.34.1

Reply via email to