https://gcc.gnu.org/g:326c2fd8f58ffed62f8c153bc272c16578b44143

commit r16-4900-g326c2fd8f58ffed62f8c153bc272c16578b44143
Author: Lulu Cheng <[email protected]>
Date:   Tue Mar 4 09:49:53 2025 +0800

    LoongArch: Simplify vec_widen_<su>{add/sub/mult}_{hi/lo}_m describe.
    
    gcc/ChangeLog:
    
            * config/loongarch/lasx.md (vec_widen_<su>add_hi_<mode>):
            Move.
            (vec_widen_<su>add_lo_<mode>): Move.
            (vec_widen_<su>sub_hi_<mode>): Move.
            (vec_widen_<su>sub_lo_<mode>): Move.
            (vec_widen_<su>mult_hi_<mode>): Move.
            (vec_widen_<su>mult_lo_<mode>): Move.
            (hi_lo): New define_int_attr.
            (vec_widen_<su><optab>_<hi_lo>_<mode>): New define_expand.
            (vec_widen_<su>mult_<hi_lo>_<mode>): Likewise.
            * config/loongarch/loongarch-protos.h
            (loongarch_expand_vec_widen_hilo): Modify the function
            parameter list.
            * config/loongarch/loongarch.cc
            (loongarch_expand_vec_widen_hilo): Optimized.

Diff:
---
 gcc/config/loongarch/lasx.md            | 73 ++++++++------------------
 gcc/config/loongarch/loongarch-protos.h |  6 ++-
 gcc/config/loongarch/loongarch.cc       | 90 +++------------------------------
 3 files changed, 33 insertions(+), 136 deletions(-)

diff --git a/gcc/config/loongarch/lasx.md b/gcc/config/loongarch/lasx.md
index c4186b0a779c..ef67eb3915dc 100644
--- a/gcc/config/loongarch/lasx.md
+++ b/gcc/config/loongarch/lasx.md
@@ -3570,69 +3570,40 @@
   [(set_attr "type" "simd_store")
    (set_attr "mode" "DI")])
 
-(define_expand "vec_widen_<su>add_hi_<mode>"
-  [(match_operand:<VDMODE256> 0 "register_operand")
-   (any_extend:<VDMODE256> (match_operand:ILASX_HB 1 "register_operand"))
-   (any_extend:<VDMODE256> (match_operand:ILASX_HB 2 "register_operand"))]
-  "ISA_HAS_LASX"
-{
-  loongarch_expand_vec_widen_hilo (operands[0], operands[1], operands[2],
-                        <u_bool>, true, "add");
-  DONE;
-})
-
-(define_expand "vec_widen_<su>add_lo_<mode>"
-  [(match_operand:<VDMODE256> 0 "register_operand")
-   (any_extend:<VDMODE256> (match_operand:ILASX_HB 1 "register_operand"))
-   (any_extend:<VDMODE256> (match_operand:ILASX_HB 2 "register_operand"))]
-  "ISA_HAS_LASX"
-{
-  loongarch_expand_vec_widen_hilo (operands[0], operands[1], operands[2],
-                        <u_bool>, false, "add");
-  DONE;
-})
-
-(define_expand "vec_widen_<su>sub_hi_<mode>"
-  [(match_operand:<VDMODE256> 0 "register_operand")
-   (any_extend:<VDMODE256> (match_operand:ILASX_HB 1 "register_operand"))
-   (any_extend:<VDMODE256> (match_operand:ILASX_HB 2 "register_operand"))]
-  "ISA_HAS_LASX"
-{
-  loongarch_expand_vec_widen_hilo (operands[0], operands[1], operands[2],
-                        <u_bool>, true, "sub");
-  DONE;
-})
-
-(define_expand "vec_widen_<su>sub_lo_<mode>"
-  [(match_operand:<VDMODE256> 0 "register_operand")
-   (any_extend:<VDMODE256> (match_operand:ILASX_HB 1 "register_operand"))
-   (any_extend:<VDMODE256> (match_operand:ILASX_HB 2 "register_operand"))]
-  "ISA_HAS_LASX"
-{
-  loongarch_expand_vec_widen_hilo (operands[0], operands[1], operands[2],
-                        <u_bool>, false, "sub");
-  DONE;
-})
+(define_int_attr hi_lo [(0 "lo") (1 "hi")])
 
-(define_expand "vec_widen_<su>mult_hi_<mode>"
+(define_expand "vec_widen_<su><optab>_<hi_lo>_<mode>"
   [(match_operand:<VDMODE256> 0 "register_operand")
-   (any_extend:<VDMODE256> (match_operand:ILASX_HB 1 "register_operand"))
-   (any_extend:<VDMODE256> (match_operand:ILASX_HB 2 "register_operand"))]
+   (match_operand:ILASX_HB 1 "register_operand")
+   (match_operand:ILASX_HB 2 "register_operand")
+   (any_extend (const_int 0))
+   (addsub (const_int 0) (const_int 0))
+   (const_int zero_one)]
   "ISA_HAS_LASX"
 {
+  rtx (*fn_even) (rtx, rtx, rtx) =
+gen_lasx_xv<optab>wev_<dlasxfmt>_<lasxfmt><u>;
+  rtx (*fn_odd) (rtx, rtx, rtx) =
+gen_lasx_xv<optab>wod_<dlasxfmt>_<lasxfmt><u>;
   loongarch_expand_vec_widen_hilo (operands[0], operands[1], operands[2],
-                        <u_bool>, true, "mult");
+                        <zero_one>, fn_even, fn_odd);
   DONE;
 })
 
-(define_expand "vec_widen_<su>mult_lo_<mode>"
+(define_expand "vec_widen_<su>mult_<hi_lo>_<mode>"
   [(match_operand:<VDMODE256> 0 "register_operand")
-   (any_extend:<VDMODE256> (match_operand:ILASX_HB 1 "register_operand"))
-   (any_extend:<VDMODE256> (match_operand:ILASX_HB 2 "register_operand"))]
+   (match_operand:ILASX_HB 1 "register_operand")
+   (match_operand:ILASX_HB 2 "register_operand")
+   (any_extend (const_int 0))
+   (const_int zero_one)]
   "ISA_HAS_LASX"
 {
+  rtx (*fn_even) (rtx, rtx, rtx) =
+gen_lasx_xvmulwev_<dlasxfmt>_<lasxfmt><u>;
+  rtx (*fn_odd) (rtx, rtx, rtx) =
+gen_lasx_xvmulwod_<dlasxfmt>_<lasxfmt><u>;
   loongarch_expand_vec_widen_hilo (operands[0], operands[1], operands[2],
-                        <u_bool>, false, "mult");
+                        <zero_one>, fn_even, fn_odd);
   DONE;
 })
 
diff --git a/gcc/config/loongarch/loongarch-protos.h 
b/gcc/config/loongarch/loongarch-protos.h
index 6ecbe27218ca..bec436845aa1 100644
--- a/gcc/config/loongarch/loongarch-protos.h
+++ b/gcc/config/loongarch/loongarch-protos.h
@@ -198,7 +198,8 @@ extern void loongarch_register_frame_header_opt (void);
 extern void loongarch_expand_vec_cond_expr (machine_mode, machine_mode, rtx *);
 extern void loongarch_expand_vec_cond_mask_expr (machine_mode, machine_mode,
                                                 rtx *);
-extern void loongarch_expand_vec_widen_hilo (rtx, rtx, rtx, bool, bool, const 
char *);
+extern void loongarch_expand_vec_widen_hilo (rtx, rtx, rtx, bool,
+       rtx (*)(rtx, rtx, rtx), rtx (*)(rtx, rtx, rtx));
 
 /* Routines implemented in loongarch-c.c.  */
 void loongarch_cpu_cpp_builtins (cpp_reader *);
@@ -217,7 +218,8 @@ extern void loongarch_emit_swdivsf (rtx, rtx, rtx, 
machine_mode);
 extern bool loongarch_explicit_relocs_p (enum loongarch_symbol_type);
 extern bool loongarch_symbol_extreme_p (enum loongarch_symbol_type);
 extern bool loongarch_option_valid_attribute_p (tree, tree, tree, int);
-extern void loongarch_option_override_internal (struct loongarch_target *, 
struct gcc_options *, struct gcc_options *);
+extern void loongarch_option_override_internal (struct loongarch_target *,
+       struct gcc_options *, struct gcc_options *);
 extern void loongarch_reset_previous_fndecl (void);
 extern void loongarch_save_restore_target_globals (tree new_tree);
 extern void loongarch_register_pragmas (void);
diff --git a/gcc/config/loongarch/loongarch.cc 
b/gcc/config/loongarch/loongarch.cc
index 740c8611a71a..2198946facfe 100644
--- a/gcc/config/loongarch/loongarch.cc
+++ b/gcc/config/loongarch/loongarch.cc
@@ -8903,98 +8903,22 @@ loongarch_expand_vec_interleave (rtx target, rtx op0, 
rtx op1, bool high_p)
 
 void
 loongarch_expand_vec_widen_hilo (rtx dest, rtx op1, rtx op2,
-                                bool uns_p, bool high_p, const char *optab)
+                                bool high_p, rtx (*fn_even) (rtx, rtx, rtx),
+                                rtx (*fn_odd) (rtx, rtx, rtx))
 {
   machine_mode wmode = GET_MODE (dest);
   machine_mode mode = GET_MODE (op1);
-  rtx t1, t2, t3;
+  rtx t1 = gen_reg_rtx (wmode);
+  rtx t2 = gen_reg_rtx (wmode);
+  rtx t3 = gen_reg_rtx (wmode);
 
-  t1 = gen_reg_rtx (wmode);
-  t2 = gen_reg_rtx (wmode);
-  t3 = gen_reg_rtx (wmode);
   switch (mode)
     {
     case V16HImode:
-      if (!strcmp (optab, "add"))
-       {
-         if (!uns_p)
-           {
-             emit_insn (gen_lasx_xvaddwev_w_h (t1, op1, op2));
-             emit_insn (gen_lasx_xvaddwod_w_h (t2, op1, op2));
-           }
-         else
-           {
-             emit_insn (gen_lasx_xvaddwev_w_hu (t1, op1, op2));
-             emit_insn (gen_lasx_xvaddwod_w_hu (t2, op1, op2));
-           }
-       }
-      else if (!strcmp (optab, "mult"))
-       {
-         if (!uns_p)
-           {
-             emit_insn (gen_lasx_xvmulwev_w_h (t1, op1, op2));
-             emit_insn (gen_lasx_xvmulwod_w_h (t2, op1, op2));
-           }
-         else
-           {
-             emit_insn (gen_lasx_xvmulwev_w_hu (t1, op1, op2));
-             emit_insn (gen_lasx_xvmulwod_w_hu (t2, op1, op2));
-           }
-       }
-      else if (!strcmp (optab, "sub"))
-       {
-         if (!uns_p)
-           {
-             emit_insn (gen_lasx_xvsubwev_w_h (t1, op1, op2));
-             emit_insn (gen_lasx_xvsubwod_w_h (t2, op1, op2));
-           }
-         else
-           {
-             emit_insn (gen_lasx_xvsubwev_w_hu (t1, op1, op2));
-             emit_insn (gen_lasx_xvsubwod_w_hu (t2, op1, op2));
-           }
-       }
-      break;
-
     case V32QImode:
-      if (!strcmp (optab, "add"))
        {
-         if (!uns_p)
-           {
-             emit_insn (gen_lasx_xvaddwev_h_b (t1, op1, op2));
-             emit_insn (gen_lasx_xvaddwod_h_b (t2, op1, op2));
-           }
-         else
-           {
-             emit_insn (gen_lasx_xvaddwev_h_bu (t1, op1, op2));
-             emit_insn (gen_lasx_xvaddwod_h_bu (t2, op1, op2));
-           }
-       }
-      else if (!strcmp (optab, "mult"))
-       {
-         if (!uns_p)
-           {
-             emit_insn (gen_lasx_xvmulwev_h_b (t1, op1, op2));
-             emit_insn (gen_lasx_xvmulwod_h_b (t2, op1, op2));
-           }
-         else
-           {
-             emit_insn (gen_lasx_xvmulwev_h_bu (t1, op1, op2));
-             emit_insn (gen_lasx_xvmulwod_h_bu (t2, op1, op2));
-           }
-       }
-      else if (!strcmp (optab, "sub"))
-       {
-         if (!uns_p)
-           {
-             emit_insn (gen_lasx_xvsubwev_h_b (t1, op1, op2));
-             emit_insn (gen_lasx_xvsubwod_h_b (t2, op1, op2));
-           }
-         else
-           {
-             emit_insn (gen_lasx_xvsubwev_h_bu (t1, op1, op2));
-             emit_insn (gen_lasx_xvsubwod_h_bu (t2, op1, op2));
-           }
+         emit_insn (fn_even (t1, op1, op2));
+         emit_insn (fn_odd (t2, op1, op2));
        }
       break;

Reply via email to