Tested with

make -k check RUNTESTFLAGS="--target_board=sh-sim\{-m2/-ml,-m2/-mb,-m2a/-
mb,-m4/-ml,-m4/-mb,-m4a/-ml,-m4a/-mb}"

Committed to master.

Best regards,
Oleg Endo

gcc/ChangeLog:

        PR target/55212
        * config/sh/sh.cc (emit_fpu_switch): Delete and merge into...
        (fpscr_set_from_mem): ...this.
From 6e537f0237a464876fdc752b3b155d61babf4756 Mon Sep 17 00:00:00 2001
From: Oleg Endo <[email protected]>
Date: Sat, 4 Jul 2026 01:35:12 +0900
Subject: [PATCH] SH: Inline emit_fpu_switch into its only caller fpscr_set_from_mem

PR target/55212
	* config/sh/sh.cc (emit_fpu_switch): Delete and merge into...
	(fpscr_set_from_mem): ...this.
---
 gcc/config/sh/sh.cc | 66 +++++++++++++++++++++++++++++++-----------------------------------
 1 file changed, 31 insertions(+), 35 deletions(-)

diff --git a/gcc/config/sh/sh.cc b/gcc/config/sh/sh.cc
index abb7632..b6ea720 100644
--- a/gcc/config/sh/sh.cc
+++ b/gcc/config/sh/sh.cc
@@ -8847,39 +8847,6 @@ get_t_reg_rtx (void)
 
 static GTY(()) tree fpscr_values;
 
-static void
-emit_fpu_switch (rtx scratch, int index)
-{
-  if (fpscr_values == NULL)
-    {
-      tree t = build_index_type (integer_one_node);
-      t = build_array_type (integer_type_node, t);
-      t = build_decl (BUILTINS_LOCATION,
-		      VAR_DECL, get_identifier ("__fpscr_values"), t);
-      DECL_ARTIFICIAL (t) = 1;
-      DECL_IGNORED_P (t) = 1;
-      DECL_EXTERNAL (t) = 1;
-      TREE_STATIC (t) = 1;
-      TREE_PUBLIC (t) = 1;
-      TREE_USED (t) = 1;
-
-      fpscr_values = t;
-    }
-
-  rtx src = DECL_RTL (fpscr_values);
-  if (!can_create_pseudo_p ())
-    {
-      emit_move_insn (scratch, XEXP (src, 0));
-      if (index != 0)
-	emit_insn (gen_addsi3 (scratch, scratch, GEN_INT (index * 4)));
-      src = adjust_automodify_address (src, SImode, scratch, index * 4);
-    }
-  else
-    src = adjust_address (src, SImode, index * 4);
-
-  emit_insn (gen_lds_fpscr (src));
-}
-
 static rtx get_free_reg (HARD_REG_SET);
 
 /* This function returns a register to use to load the address to load
@@ -8914,9 +8881,38 @@ fpscr_set_from_mem (int mode, HARD_REG_SET regs_live)
 {
   enum attr_fp_mode fp_mode = (enum attr_fp_mode) mode;
   enum attr_fp_mode norm_mode = ACTUAL_NORMAL_MODE (FP_MODE);
+  int index = fp_mode == norm_mode;
+
+  rtx scratch = !can_create_pseudo_p () ? get_free_reg (regs_live) : NULL_RTX;
+
+  if (fpscr_values == NULL)
+    {
+      tree t = build_index_type (integer_one_node);
+      t = build_array_type (integer_type_node, t);
+      t = build_decl (BUILTINS_LOCATION,
+		      VAR_DECL, get_identifier ("__fpscr_values"), t);
+      DECL_ARTIFICIAL (t) = 1;
+      DECL_IGNORED_P (t) = 1;
+      DECL_EXTERNAL (t) = 1;
+      TREE_STATIC (t) = 1;
+      TREE_PUBLIC (t) = 1;
+      TREE_USED (t) = 1;
 
-  rtx addr_reg = !can_create_pseudo_p () ? get_free_reg (regs_live) : NULL_RTX;
-  emit_fpu_switch (addr_reg, fp_mode == norm_mode);
+      fpscr_values = t;
+    }
+
+  rtx src = DECL_RTL (fpscr_values);
+  if (!can_create_pseudo_p ())
+    {
+      emit_move_insn (scratch, XEXP (src, 0));
+      if (index != 0)
+	emit_insn (gen_addsi3 (scratch, scratch, GEN_INT (index * 4)));
+      src = adjust_automodify_address (src, SImode, scratch, index * 4);
+    }
+  else
+    src = adjust_address (src, SImode, index * 4);
+
+  emit_insn (gen_lds_fpscr (src));
 }
 
 /* Is the given character a logical line separator for the assembler?  */
--
libgit2 1.9.0

Reply via email to