[gcc r16-9395] rs6000: Add TDOmode reload patterns for DMR registers

jeevitha via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:630a37997741a1a11e593d1e291ee4e78d79bf59

commit r16-9395-g630a37997741a1a11e593d1e291ee4e78d79bf59
Author: Surya Kumari Jangala <[email protected]>
Date:   Wed Jul 22 07:56:51 2026 -0500

    rs6000: Add TDOmode reload patterns for DMR registers
    
    Add define_insn_and_split patterns for reloading TDOmode values between
    Dense Math Registers (DMRs) and memory when TARGET_DMF is enabled.
    
    2026-07-15  Surya Kumari Jangala  <[email protected]>
                Peter Bergner  <[email protected]>
    
    gcc:
            * config/rs6000/mma.md (UNSPEC_DMR_RELOAD_FROM_MEMORY): New unspec.
            (UNSPEC_DMR_RELOAD_TO_MEMORY): Likewise.
            (reload_tdo_load): New define_insn_and_split.
            (reload_tdo_store): Likewise.
            * config/rs6000/rs6000.cc (rs6000_init_hard_regno_mode_ok): Set
            reload_load and reload_store for TDOmode when TARGET_DMF.
    (cherry picked from commit 7b8575e9993a2cfbcdab06ec02aef87d9c76696a)

Diff:
---
 gcc/config/rs6000/mma.md    | 70 +++++++++++++++++++++++++++++++++++++++++++++
 gcc/config/rs6000/rs6000.cc |  6 ++++
 2 files changed, 76 insertions(+)

diff --git a/gcc/config/rs6000/mma.md b/gcc/config/rs6000/mma.md
index 2b0736d86a64..9becb9be0697 100644
--- a/gcc/config/rs6000/mma.md
+++ b/gcc/config/rs6000/mma.md
@@ -94,6 +94,8 @@
    UNSPEC_DMF_INSERT512
    UNSPEC_DMF_EXTRACT512
    UNSPEC_DMF_INSERT1024
+   UNSPEC_DMF_RELOAD_FROM_MEMORY
+   UNSPEC_DMF_RELOAD_TO_MEMORY
   ])
 
 (define_c_enum "unspecv"
@@ -535,6 +537,74 @@
   gcc_unreachable ();
 })
 
+
+(define_insn_and_split "reload_tdo_load"
+  [(set (match_operand:TDO 0 "dmr_register_operand" "=wD")
+        (unspec:TDO [(match_operand:TDO 1 "memory_operand" "m")]
+                    UNSPEC_DMF_RELOAD_FROM_MEMORY))
+   (clobber (match_operand:OO 2 "vsx_register_operand" "=wa"))
+   (clobber (match_operand:OO 3 "vsx_register_operand" "=wa"))
+   (clobber (match_operand:OO 4 "vsx_register_operand" "=wa"))
+   (clobber (match_operand:OO 5 "vsx_register_operand" "=wa"))]
+  "TARGET_DMF"
+  "#"
+  "&& reload_completed"
+  [(const_int 0)]
+{
+  rtx dest = operands[0];
+  rtx src = operands[1];
+  rtx pair0 = operands[2];
+  rtx pair1 = operands[3];
+  rtx pair2 = operands[4];
+  rtx pair3 = operands[5];
+
+  if (BYTES_BIG_ENDIAN)
+    {
+      emit_move_insn (pair0, adjust_address (src, OOmode, 0));
+      emit_move_insn (pair1, adjust_address (src, OOmode, 32));
+      emit_move_insn (pair2, adjust_address (src, OOmode, 64));
+      emit_move_insn (pair3, adjust_address (src, OOmode, 96));
+    }
+  else
+    {
+      emit_move_insn (pair3, adjust_address (src, OOmode, 0));
+      emit_move_insn (pair2, adjust_address (src, OOmode, 32));
+      emit_move_insn (pair1, adjust_address (src, OOmode, 64));
+      emit_move_insn (pair0, adjust_address (src, OOmode, 96));
+    }
+  emit_insn (gen_dm_insert1024 (dest, pair0, pair1, pair2, pair3));
+  DONE;
+}
+  [(set_attr "max_prefixed_insns" "4")])
+
+
+;; Reload dense math register to memory
+(define_insn_and_split "reload_tdo_store"
+  [(set (match_operand:TDO 0 "memory_operand" "=m")
+        (unspec:TDO [(match_operand:TDO 1 "dmr_register_operand" "wD")]
+                    UNSPEC_DMF_RELOAD_TO_MEMORY))
+   (clobber (match_operand:XO 2 "vsx_register_operand" "=wa"))]
+  "TARGET_DMF"
+  "#"
+  "&& reload_completed"
+  [(const_int 0)]
+{
+  rtx dest = operands[0];
+  rtx src = operands[1];
+  rtx tmp_vsx_512 = operands[2];
+  rtx high_mem = adjust_address (dest, XOmode, BYTES_BIG_ENDIAN ? 0 : 64);
+  rtx low_mem = adjust_address (dest, XOmode, BYTES_BIG_ENDIAN ? 64 : 0);
+
+  emit_insn (gen_dm_extract512 (tmp_vsx_512, src, const0_rtx));
+  emit_move_insn (high_mem, tmp_vsx_512);
+
+  emit_insn (gen_dm_extract512 (tmp_vsx_512, src, const1_rtx));
+  emit_move_insn (low_mem, tmp_vsx_512);
+  DONE;
+}
+  [(set_attr "max_prefixed_insns" "4")])
+
+
 (define_expand "mma_assemble_acc"
   [(match_operand:XO 0 "accumulator_operand")
    (match_operand:V16QI 1 "mma_assemble_input_operand")
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 115a893b3223..d1984024a16d 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -3219,6 +3219,12 @@ rs6000_init_hard_regno_mode_ok (bool global_init_p)
 	}
     }
 
+  if (TARGET_DMF)
+    {
+      reg_addr[TDOmode].reload_load = CODE_FOR_reload_tdo_load;
+      reg_addr[TDOmode].reload_store = CODE_FOR_reload_tdo_store;
+    }
+
   /* Precalculate HARD_REGNO_NREGS.  */
   for (r = 0; HARD_REGISTER_NUM_P (r); ++r)
     for (m = 0; m < NUM_MACHINE_MODES; ++m)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.