https://gcc.gnu.org/g:c94ac10ffc422d4c9a28266b1340382d69518464

commit r15-6175-gc94ac10ffc422d4c9a28266b1340382d69518464
Author: Georg-Johann Lay <a...@gjlay.de>
Date:   Thu Dec 12 16:13:39 2024 +0100

    AVR: target/118000 - Fix copymem from address-spaces.
    
    * rampz_rtx et al. were missing MEM_VOLATILE_P.  This is needed because
      avr_emit_cpymemhi is setting RAMPZ explicitly with an own insn.
    
    * avr_out_cpymem was missing a final RAMPZ = 0 on EBI devices.
    
    This only affects the __flash1 ... __flash5 spaces since the other ASes
    use different routines,
    
    gcc/
            PR target/118000
            * config/avr/avr.cc (avr_init_expanders) <sreg_rtx>
            <rampd_rtx, rampx_rtx, rampy_rtx, rampz_rtx>: Set MEM_VOLATILE_P.
            (avr_out_cpymem) [ELPM && EBI]: Restore RAMPZ to 0 after.

Diff:
---
 gcc/config/avr/avr.cc | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc
index ef236016990c..05a6905b5d62 100644
--- a/gcc/config/avr/avr.cc
+++ b/gcc/config/avr/avr.cc
@@ -596,6 +596,12 @@ avr_init_expanders (void)
   rampy_rtx = gen_rtx_MEM (QImode, GEN_INT (avr_addr.rampy));
   rampz_rtx = gen_rtx_MEM (QImode, GEN_INT (avr_addr.rampz));
 
+  MEM_VOLATILE_P (sreg_rtx) = 1;
+  MEM_VOLATILE_P (rampd_rtx) = 1;
+  MEM_VOLATILE_P (rampx_rtx) = 1;
+  MEM_VOLATILE_P (rampy_rtx) = 1;
+  MEM_VOLATILE_P (rampz_rtx) = 1;
+
   xstring_empty = gen_rtx_CONST_STRING (VOIDmode, "");
   xstring_e = gen_rtx_CONST_STRING (VOIDmode, "e");
 
@@ -14857,9 +14863,16 @@ avr_out_cpymem (rtx_insn * /*insn*/, rtx *op, int 
*plen)
                   "sbci %B1,0", xop, plen, 2);
     }
 
-  /* Loop until zero */
+  // Loop until zero.
+  avr_asm_len ("brne 0b", xop, plen, 1);
+
 
-  return avr_asm_len ("brne 0b", xop, plen, 1);
+  // Restore RAMPZ on EBI devices.
+  if (as >= ADDR_SPACE_FLASH1
+      && AVR_HAVE_ELPM && AVR_HAVE_RAMPD)
+    avr_asm_len ("out %i0,__zero_reg__", &rampz_rtx, plen, 1);
+
+  return "";
 }

Reply via email to