From e6ee6dda1395c044338f7bf92b7307d62a94e191 Mon Sep 17 00:00:00 2001
From: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Date: Mon, 2 Sep 2024 19:40:39 +0200
Subject: [PATCH 08/11] Patch 59000

---
 gcc/config/sh/sh-mem.cc |  34 +++++++++
 gcc/config/sh/sh.cc     |   5 ++
 gcc/config/sh/sh.md     | 153 +++++++++++++++++++++++++++++++++-------
 3 files changed, 166 insertions(+), 26 deletions(-)

diff --git a/gcc/config/sh/sh-mem.cc b/gcc/config/sh/sh-mem.cc
index e22419912d6..2c1dca5fcd5 100644
--- a/gcc/config/sh/sh-mem.cc
+++ b/gcc/config/sh/sh-mem.cc
@@ -116,6 +116,14 @@ expand_block_move (rtx *operands)
 	  force_into (XEXP (operands[0], 0), r4);
 	  force_into (XEXP (operands[1], 0), r5);
 	  emit_insn (gen_block_move_real_i4 (func_addr_rtx, lab));
+	  if (sh_lra_p ())
+	    {
+	      emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	      emit_clobber (gen_rtx_REG (SImode, T_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R0_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R1_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R2_REG));
+	    }
 	  return true;
 	}
       else if (! optimize_size)
@@ -135,6 +143,18 @@ expand_block_move (rtx *operands)
 	  int dwords = bytes >> 3;
 	  emit_insn (gen_move_insn (r6, GEN_INT (dwords - 1)));
 	  emit_insn (gen_block_lump_real_i4 (func_addr_rtx, lab));
+	  if (sh_lra_p ())
+	    {
+	      emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	      emit_clobber (gen_rtx_REG (SImode, T_REG));
+	      emit_clobber (r4);
+	      emit_clobber (r5);
+	      emit_clobber (r6);
+	      emit_clobber (gen_rtx_REG (SImode, R0_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R1_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R2_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R3_REG));
+	    }
 	  return true;
 	}
       else
@@ -152,6 +172,11 @@ expand_block_move (rtx *operands)
       force_into (XEXP (operands[0], 0), r4);
       force_into (XEXP (operands[1], 0), r5);
       emit_insn (gen_block_move_real (func_addr_rtx, lab));
+      if (sh_lra_p ())
+	{
+	  emit_clobber(gen_rtx_REG (SImode, PR_REG));
+	  emit_clobber(gen_rtx_REG (SImode, R0_REG));
+	}
       return true;
     }
 
@@ -179,6 +204,15 @@ expand_block_move (rtx *operands)
       while_loop = ((bytes / 4) / 16 - 1) * 16;
       emit_insn (gen_move_insn (r6, GEN_INT (while_loop + final_switch)));
       emit_insn (gen_block_lump_real (func_addr_rtx, lab));
+      if (sh_lra_p ())
+	{
+	  emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	  emit_clobber (gen_rtx_REG (SImode, T_REG));
+	  emit_clobber (r4);
+	  emit_clobber (r5);
+	  emit_clobber (r6);
+	  emit_clobber (gen_rtx_REG (SImode, R0_REG));
+	}
       return true;
     }
 
diff --git a/gcc/config/sh/sh.cc b/gcc/config/sh/sh.cc
index 280588268ae..ae2e69c4d0b 100644
--- a/gcc/config/sh/sh.cc
+++ b/gcc/config/sh/sh.cc
@@ -3883,6 +3883,11 @@ expand_ashiftrt (rtx *operands)
   sprintf (func, "__ashiftrt_r4_%d", value);
   rtx lab = function_symbol (wrk, func, SFUNC_STATIC).lab;
   emit_insn (gen_ashrsi3_n (GEN_INT (value), wrk, lab));
+  if (sh_lra_p ())
+    {
+      emit_clobber (gen_rtx_REG (SImode, PR_REG));
+      emit_clobber (gen_rtx_REG (SImode, T_REG));
+    }
   emit_move_insn (operands[0], gen_rtx_REG (SImode, 4));
   return true;
 }
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md
index c7f1020080e..26fa4e64380 100644
--- a/gcc/config/sh/sh.md
+++ b/gcc/config/sh/sh.md
@@ -2276,7 +2276,6 @@
 		 (match_operand:SI 2 "general_operand")))]
   ""
 {
-  rtx last;
   rtx func_ptr = gen_reg_rtx (Pmode);
 
   /* Emit the move of the address to a pseudo outside of the libcall.  */
@@ -2299,15 +2298,56 @@
 	  DONE;
 	}
       function_symbol (func_ptr, "__udivsi3_i4i", SFUNC_GOT);
-      last = gen_udivsi3_i4_int (operands[0], func_ptr);
+      emit_move_insn (gen_rtx_REG (SImode, 4), operands[1]);
+      emit_move_insn (gen_rtx_REG (SImode, 5), operands[2]);
+      emit_insn (gen_udivsi3_i4_int (operands[0], func_ptr));
+      if (sh_lra_p ())
+	{
+	  emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	  emit_clobber (gen_rtx_REG (SImode, T_REG));
+	  emit_clobber (gen_rtx_REG (SImode, R1_REG));
+	  emit_clobber (gen_rtx_REG (SImode, MACH_REG));
+	  emit_clobber (gen_rtx_REG (SImode, MACL_REG));
+	}
     }
   else if (TARGET_DIVIDE_CALL_FP)
     {
       rtx lab = function_symbol (func_ptr, "__udivsi3_i4", SFUNC_STATIC).lab;
+      emit_move_insn (gen_rtx_REG (SImode, 4), operands[1]);
+      emit_move_insn (gen_rtx_REG (SImode, 5), operands[2]);
       if (TARGET_FPU_SINGLE)
-	last = gen_udivsi3_i4_single (operands[0], func_ptr, lab);
+	{
+	  emit_insn (gen_udivsi3_i4_single (operands[0], func_ptr, lab));
+          if (sh_lra_p ())
+	    {
+	      emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	      emit_clobber (gen_rtx_REG (SImode, T_REG));
+	      emit_clobber (gen_rtx_REG (SImode, DR0_REG));
+	      emit_clobber (gen_rtx_REG (SImode, DR2_REG));
+	      emit_clobber (gen_rtx_REG (SImode, DR4_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R0_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R1_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R4_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R5_REG));
+	    }
+	}
       else
-	last = gen_udivsi3_i4 (operands[0], func_ptr, lab);
+	{
+	  emit_insn (gen_udivsi3_i4 (operands[0], func_ptr, lab));
+          if (sh_lra_p ())
+	    {
+	      emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	      emit_clobber (gen_rtx_REG (SImode, T_REG));
+	      emit_clobber (gen_rtx_REG (SImode, DR0_REG));
+	      emit_clobber (gen_rtx_REG (SImode, DR2_REG));
+	      emit_clobber (gen_rtx_REG (SImode, DR4_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R0_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R1_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R4_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R5_REG));
+	      emit_clobber (gen_rtx_REG (SImode, FPSCR_STAT_REG));
+	    }
+	}
     }
   else if (TARGET_SH2A)
     {
@@ -2319,11 +2359,17 @@
   else
     {
       rtx lab = function_symbol (func_ptr, "__udivsi3", SFUNC_STATIC).lab;
-      last = gen_udivsi3_i1 (operands[0], func_ptr, lab);
+      emit_move_insn (gen_rtx_REG (SImode, 4), operands[1]);
+      emit_move_insn (gen_rtx_REG (SImode, 5), operands[2]);
+      emit_insn (gen_udivsi3_i1 (operands[0], func_ptr, lab));
+      if (sh_lra_p ())
+	{
+	  emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	  emit_clobber (gen_rtx_REG (SImode, T_REG));
+	  emit_clobber (gen_rtx_REG (SImode, R1_REG));
+	  emit_clobber (gen_rtx_REG (SImode, R4_REG));
+	}
     }
-  emit_move_insn (gen_rtx_REG (SImode, 4), operands[1]);
-  emit_move_insn (gen_rtx_REG (SImode, 5), operands[2]);
-  emit_insn (last);
   DONE;
 })
 
@@ -2404,23 +2450,52 @@
 		(match_operand:SI 2 "general_operand")))]
   ""
 {
-  rtx last;
   rtx func_ptr = gen_reg_rtx (Pmode);
 
   /* Emit the move of the address to a pseudo outside of the libcall.  */
   if (TARGET_DIVIDE_CALL_TABLE)
     {
       function_symbol (func_ptr, sh_divsi3_libfunc, SFUNC_GOT);
-      last = gen_divsi3_i4_int (operands[0], func_ptr);
+      emit_move_insn (gen_rtx_REG (SImode, 4), operands[1]);
+      emit_move_insn (gen_rtx_REG (SImode, 5), operands[2]);
+      emit_insn (gen_divsi3_i4_int (operands[0], func_ptr));
+      if (sh_lra_p ())
+	{
+	  emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	  emit_clobber (gen_rtx_REG (SImode, T_REG));
+	  emit_clobber (gen_rtx_REG (SImode, R1_REG));
+	  emit_clobber (gen_rtx_REG (SImode, MACH_REG));
+	  emit_clobber (gen_rtx_REG (SImode, MACL_REG));
+	}
     }
   else if (TARGET_DIVIDE_CALL_FP)
     {
       rtx lab = function_symbol (func_ptr, sh_divsi3_libfunc,
 				 SFUNC_STATIC).lab;
+      emit_move_insn (gen_rtx_REG (SImode, 4), operands[1]);
+      emit_move_insn (gen_rtx_REG (SImode, 5), operands[2]);
       if (TARGET_FPU_SINGLE)
-	last = gen_divsi3_i4_single (operands[0], func_ptr, lab);
+	{
+	  emit_insn (gen_divsi3_i4_single (operands[0], func_ptr, lab));
+          if (sh_lra_p ())
+	    {
+	      emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	      emit_clobber (gen_rtx_REG (SImode, DR0_REG));
+	      emit_clobber (gen_rtx_REG (SImode, DR2_REG));
+	      emit_clobber (gen_rtx_REG (SImode, R2_REG));
+	    }
+	}
       else
-	last = gen_divsi3_i4 (operands[0], func_ptr, lab);
+	{
+	  emit_insn (gen_divsi3_i4 (operands[0], func_ptr, lab));
+          if (sh_lra_p ())
+	    {
+	      emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	      emit_clobber (gen_rtx_REG (SImode, DR0_REG));
+	      emit_clobber (gen_rtx_REG (SImode, DR2_REG));
+	      emit_clobber (gen_rtx_REG (SImode, FPSCR_STAT_REG));
+	    }
+	}
     }
   else if (TARGET_SH2A)
     {
@@ -2432,11 +2507,18 @@
   else
     {
       function_symbol (func_ptr, sh_divsi3_libfunc, SFUNC_GOT);
-      last = gen_divsi3_i1 (operands[0], func_ptr);
+      emit_move_insn (gen_rtx_REG (SImode, 4), operands[1]);
+      emit_move_insn (gen_rtx_REG (SImode, 5), operands[2]);
+      emit_insn (gen_divsi3_i1 (operands[0], func_ptr));
+      if (sh_lra_p ())
+	{
+	  emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	  emit_clobber (gen_rtx_REG (SImode, T_REG));
+	  emit_clobber (gen_rtx_REG (SImode, R1_REG));
+	  emit_clobber (gen_rtx_REG (SImode, R2_REG));
+	  emit_clobber (gen_rtx_REG (SImode, R3_REG));
+	}
     }
-  emit_move_insn (gen_rtx_REG (SImode, 4), operands[1]);
-  emit_move_insn (gen_rtx_REG (SImode, 5), operands[2]);
-  emit_insn (last);
   DONE;
 })
 
@@ -2548,6 +2630,15 @@
       rtx sym = function_symbol (NULL, "__mulsi3", SFUNC_STATIC).sym;
 
       emit_insn (gen_mulsi3_call (force_reg (SImode, sym), operands[0]));
+      if (sh_lra_p ())
+	{
+	  emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	  emit_clobber (gen_rtx_REG (SImode, T_REG));
+	  emit_clobber (gen_rtx_REG (SImode, R1_REG));
+	  emit_clobber (gen_rtx_REG (SImode, R2_REG));
+	  emit_clobber (gen_rtx_REG (SImode, R3_REG));
+	  emit_clobber (gen_rtx_REG (SImode, MACL_REG));
+	}
     }
   else
     {
@@ -3502,6 +3593,11 @@
       rtx funcaddr = gen_reg_rtx (Pmode);
       rtx lab = function_symbol (funcaddr, "__ashlsi3_r0", SFUNC_STATIC).lab;
       emit_insn (gen_ashlsi3_d_call (operands[0], operands[2], funcaddr, lab));
+      if (sh_lra_p ())
+	{
+	  emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	  emit_clobber (gen_rtx_REG (SImode, T_REG));
+	}
 
       DONE;
     }
@@ -3948,6 +4044,11 @@
       rtx funcaddr = gen_reg_rtx (Pmode);
       rtx lab = function_symbol (funcaddr, "__lshrsi3_r0", SFUNC_STATIC).lab;
       emit_insn (gen_lshrsi3_d_call (operands[0], operands[2], funcaddr, lab));
+      if (sh_lra_p ())
+	{
+	  emit_clobber (gen_rtx_REG (SImode, PR_REG));
+	  emit_clobber (gen_rtx_REG (SImode, T_REG));
+	}
       DONE;
     }
 })
@@ -6625,14 +6726,14 @@
    (use (reg:SI FPSCR_MODES_REG))
    (use (reg:SI PIC_REG))
    (clobber (reg:SI PR_REG))
-   (clobber (reg:SI R1_REG))]
+   (clobber (reg:SI R3_REG))]
   "TARGET_SH2"
   "#"
   "reload_completed"
   [(const_int 0)]
 {
   rtx lab = PATTERN (gen_call_site ());
-  rtx scr = gen_rtx_REG (Pmode, R1_REG);
+  rtx scr = gen_rtx_REG (Pmode, R3_REG);
 
   sh_expand_sym_label2reg (scr, operands[0], lab, false);
   emit_call_insn (gen_calli_pcrel (scr, operands[1], copy_rtx (lab)));
@@ -6738,14 +6839,14 @@
    (use (reg:SI FPSCR_MODES_REG))
    (use (reg:SI PIC_REG))
    (clobber (reg:SI PR_REG))
-   (clobber (reg:SI R1_REG))]
+   (clobber (reg:SI R3_REG))]
   "TARGET_SH2"
   "#"
   "reload_completed"
   [(const_int 0)]
 {
   rtx lab = PATTERN (gen_call_site ());
-  rtx scr = gen_rtx_REG (Pmode, R1_REG);
+  rtx scr = gen_rtx_REG (Pmode, R3_REG);
 
   sh_expand_sym_label2reg (scr, operands[1], lab, false);
   emit_call_insn (gen_call_valuei_pcrel (operands[0], scr,
@@ -6965,7 +7066,7 @@
 	 (match_operand 1))
    (use (reg:SI FPSCR_MODES_REG))
    (use (reg:SI PIC_REG))
-   (clobber (reg:SI R1_REG))
+   (clobber (reg:SI R3_REG))
    (return)]
   "TARGET_SH2 && TARGET_FDPIC"
   "#"
@@ -6973,7 +7074,7 @@
   [(const_int 0)]
 {
   rtx lab = PATTERN (gen_call_site ());
-  rtx scr = gen_rtx_REG (Pmode, R1_REG);
+  rtx scr = gen_rtx_REG (Pmode, R3_REG);
 
   sh_expand_sym_label2reg (scr, operands[0], lab, true);
   rtx i = emit_call_insn (gen_sibcalli_pcrel_fdpic (scr, operands[1],
@@ -7105,7 +7206,7 @@
 	(call (mem:SI (match_operand:SI 1 "symbol_ref_operand" ""))
 	      (match_operand 2 "" "")))
    (use (reg:SI FPSCR_MODES_REG))
-   (clobber (reg:SI R1_REG))
+   (clobber (reg:SI R3_REG))
    (return)]
   "TARGET_SH2 && !TARGET_FDPIC"
   "#"
@@ -7113,7 +7214,7 @@
   [(const_int 0)]
 {
   rtx lab = PATTERN (gen_call_site ());
-  rtx tmp =  gen_rtx_REG (SImode, R1_REG);
+  rtx tmp =  gen_rtx_REG (SImode, R3_REG);
 
   sh_expand_sym_label2reg (tmp, operands[1], lab, true);
   rtx call_insn = emit_call_insn (gen_sibcall_valuei_pcrel (operands[0],
@@ -7137,7 +7238,7 @@
 	      (match_operand 2)))
    (use (reg:SI FPSCR_MODES_REG))
    (use (reg:SI PIC_REG))
-   (clobber (reg:SI R1_REG))
+   (clobber (reg:SI R3_REG))
    (return)]
   "TARGET_SH2 && TARGET_FDPIC"
   "#"
@@ -7145,7 +7246,7 @@
   [(const_int 0)]
 {
   rtx lab = PATTERN (gen_call_site ());
-  rtx tmp = gen_rtx_REG (SImode, R1_REG);
+  rtx tmp = gen_rtx_REG (SImode, R3_REG);
 
   sh_expand_sym_label2reg (tmp, operands[1], lab, true);
   rtx i = emit_call_insn (gen_sibcall_valuei_pcrel_fdpic (operands[0],
-- 
2.45.2

