[gcc r17-3972] amdgcn: Add vector widening multiply insns

Andrew Stubbs ams@gcc.gnu.org
Mon Sep 7 09:45:06 GMT 2026


https://gcc.gnu.org/g:69ac6ad270da1ada5110e5895626a0f226b8519a

commit r17-3972-g69ac6ad270da1ada5110e5895626a0f226b8519a
Author: Andrew Stubbs <ams@baylibre.com>
Date:   Tue Feb 3 15:45:27 2026 +0000

    amdgcn: Add vector widening multiply insns
    
    Add widening multiply insns to match the scalar patterns we already have.
    Also, rename the scalar pattern to the proper standard name.
    
    gcc/ChangeLog:
    
            * config/gcn/gcn-valu.md (vnhi): New mode attribute.
            (VnHI): Likewise.
            (<u>mul<mode><vnsi>3<exec>): New.
            (<u>mul<mode><vnhi>3<exec>): New.
            * config/gcn/gcn.md (<u>mulqihi3_scalar): Rename this ...
            (<u>mulqihi3): ... to this.

Diff:
---
 gcc/config/gcn/gcn-valu.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++
 gcc/config/gcn/gcn.md      |  2 +-
 2 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/gcc/config/gcn/gcn-valu.md b/gcc/config/gcn/gcn-valu.md
index 1dd14ec2a4cb..cd8ad9521a45 100644
--- a/gcc/config/gcn/gcn-valu.md
+++ b/gcc/config/gcn/gcn-valu.md
@@ -227,6 +227,38 @@
    (V64QI "QI") (V64HI "HI") (V64SI "SI") (V64TI "TI")
    (V64HF "HF") (V64SF "SF") (V64DI "DI") (V64DF "DF")])
 
+(define_mode_attr vnhi
+  [(QI "hi") (HI "hi") (SI "hi") (TI "hi")
+   (HF "hi") (SF "hi") (DI "hi") (DF "hi")
+   (V2QI "v2hi") (V2HI "v2hi") (V2HF "v2hi") (V2SI "v2hi")
+   (V2SF "v2hi") (V2DI "v2hi") (V2DF "v2hi") (V2TI "v2hi")
+   (V4QI "v4hi") (V4HI "v4hi") (V4HF "v4hi") (V4SI "v4hi")
+   (V4SF "v4hi") (V4DI "v4hi") (V4DF "v4hi") (V4TI "v4hi")
+   (V8QI "v8hi") (V8HI "v8hi") (V8HF "v8hi") (V8SI "v8hi")
+   (V8SF "v8hi") (V8DI "v8hi") (V8DF "v8hi") (V8TI "v8hi")
+   (V16QI "v16hi") (V16HI "v16hi") (V16HF "v16hi") (V16SI "v16hi")
+   (V16SF "v16hi") (V16DI "v16hi") (V16DF "v16hi") (V16TI "v16hi")
+   (V32QI "v32hi") (V32HI "v32hi") (V32HF "v32hi") (V32SI "v32hi")
+   (V32SF "v32hi") (V32DI "v32hi") (V32DF "v32hi") (V32TI "v32hi")
+   (V64QI "v64hi") (V64HI "v64hi") (V64HF "v64hi") (V64SI "v64hi")
+   (V64SF "v64hi") (V64DI "v64hi") (V64DF "v64hi") (V64TI "v64hi")])
+
+(define_mode_attr VnHI
+  [(QI "HI") (HI "HI") (SI "HI") (TI "HI")
+   (HF "HI") (SF "HI") (DI "HI") (DF "HI")
+   (V2QI "V2HI") (V2HI "V2HI") (V2HF "V2HI") (V2SI "V2HI")
+   (V2SF "V2HI") (V2DI "V2HI") (V2DF "V2HI") (V2TI "V2HI")
+   (V4QI "V4HI") (V4HI "V4HI") (V4HF "V4HI") (V4SI "V4HI")
+   (V4SF "V4HI") (V4DI "V4HI") (V4DF "V4HI") (V4TI "V4HI")
+   (V8QI "V8HI") (V8HI "V8HI") (V8HF "V8HI") (V8SI "V8HI")
+   (V8SF "V8HI") (V8DI "V8HI") (V8DF "V8HI") (V8TI "V8HI")
+   (V16QI "V16HI") (V16HI "V16HI") (V16HF "V16HI") (V16SI "V16HI")
+   (V16SF "V16HI") (V16DI "V16HI") (V16DF "V16HI") (V16TI "V16HI")
+   (V32QI "V32HI") (V32HI "V32HI") (V32HF "V32HI") (V32SI "V32HI")
+   (V32SF "V32HI") (V32DI "V32HI") (V32DF "V32HI") (V32TI "V32HI")
+   (V64QI "V64HI") (V64HI "V64HI") (V64HF "V64HI") (V64SI "V64HI")
+   (V64SF "V64HI") (V64DI "V64HI") (V64DF "V64HI") (V64TI "V64HI")])
+
 (define_mode_attr vnsi
   [(QI "si") (HI "si") (SI "si") (TI "si")
    (HF "si") (SF "si") (DI "si") (DF "si")
@@ -2235,6 +2267,26 @@
   [(set_attr "type" "vop3a")
    (set_attr "length" "8")])
 
+(define_insn "<u>mul<mode><vnsi>3<exec>"
+  [(set (match_operand:<VnSI> 0 "register_operand"		     "= v")
+	(mult:<VnSI>
+	  (any_extend:<VnSI> (match_operand:V_HI 1 "gcn_alu_operand" "%vA"))
+	  (any_extend:<VnSI> (match_operand:V_HI 2 "gcn_alu_operand" " vA"))))]
+  "TARGET_SDWA"
+  "v_mul_<iu>32_<iu>24_sdwa\t%0, %<e>1, %<e>2 src0_sel:WORD_0 src1_sel:WORD_0"
+  [(set_attr "type" "vop_sdwa")
+   (set_attr "length" "8")])
+
+(define_insn "<u>mul<mode><vnhi>3<exec>"
+  [(set (match_operand:<VnHI> 0 "register_operand"		      "= v")
+	(mult:<VnHI>
+	  (any_extend:<VnHI> (match_operand:V_QI 1 "register_operand" "%vA"))
+	  (any_extend:<VnHI> (match_operand:V_QI 2 "register_operand" " vA"))))]
+  "TARGET_SDWA"
+  "v_mul_<iu>32_<iu>24_sdwa\t%0, %<e>1, %<e>2 src0_sel:BYTE_0 src1_sel:BYTE_0"
+  [(set_attr "type" "vop_sdwa")
+   (set_attr "length" "8")])
+
 (define_insn_and_split "mul<mode>3"
   [(set (match_operand:V_DI 0 "register_operand"  "=&v")
 	(mult:V_DI
diff --git a/gcc/config/gcn/gcn.md b/gcc/config/gcn/gcn.md
index 76eeb67cb0b7..34649e69986c 100644
--- a/gcc/config/gcn/gcn.md
+++ b/gcc/config/gcn/gcn.md
@@ -1609,7 +1609,7 @@
   [(set_attr "type" "vop_sdwa")
    (set_attr "length" "8")])
 
-(define_insn "<u>mulqihi3_scalar"
+(define_insn "<u>mulqihi3"
   [(set (match_operand:HI 0 "register_operand"			"=v")
 	(mult:HI
 	  (any_extend:HI (match_operand:QI 1 "register_operand" "%v"))


More information about the Gcc-cvs mailing list