[gcc(refs/users/meissner/heads/work251-dmf)] DMF patch 8

Michael Meissner via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:776f164f7bfbc4b53a924e65bcd861d2b9b10301

commit 776f164f7bfbc4b53a924e65bcd861d2b9b10301
Author: Michael Meissner <[email protected]>
Date:   Sat Jul 18 02:46:57 2026 -0400

    DMF patch 8
    
    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_DMF_RELOAD_FROM_MEMORY): New unspec.
            (UNSPEC_DMF_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.

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 4477845d753d..1d24d155bfe2 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.