]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/49880 (SuperH: ICE when -m4 is used with -mdiv=call-div1)
authorOleg Endo <olegendo@gcc.gnu.org>
Mon, 25 Mar 2013 22:55:56 +0000 (22:55 +0000)
committerOleg Endo <olegendo@gcc.gnu.org>
Mon, 25 Mar 2013 22:55:56 +0000 (22:55 +0000)
Backport from mainline:
2013-03-13  Oleg Endo  <olegendo@gcc.gnu.org>
2013-03-14  Kaz Kojima  <kkojima@gcc.gnu.org>

PR target/49880
* config/sh/sh.opt (FPU_SINGLE_ONLY): New mask.
(musermode): Convert to Var(TARGET_USERMODE).
* config/sh/sh.h (SELECT_SH2A_SINGLE_ONLY, SELECT_SH4_SINGLE_ONLY,
MASK_ARCH): Add MASK_FPU_SINGLE_ONLY.
* config/sh/sh.c (sh_option_override): Use
TARGET_FPU_DOUBLE || TARGET_FPU_SINGLE_ONLY for call-fp case.
* config/sh/sh.md (udivsi3_i1, divsi3_i1): Remove ! TARGET_SH4
condition.
(udivsi3_i4, divsi3_i4): Use TARGET_FPU_DOUBLE condition instead of
TARGET_SH4.
(udivsi3_i4_single, divsi3_i4_single): Use
TARGET_FPU_SINGLE_ONLY || TARGET_FPU_DOUBLE instead of TARGET_HARD_SH4.
* config/sh/linux.h (TARGET_DEFAULT): Remove MASK_USERMODE.
(SUBTARGET_OVERRIDE_OPTIONS): Set TARGET_USERMODE as default.
* config/sh/netbsd-elf.h (TARGET_DEFAULT): Remove MASK_USERMODE.
(SUBTARGET_OVERRIDE_OPTIONS): New.

Backport from mainline:
2013-03-13  Oleg Endo  <olegendo@gcc.gnu.org>

PR target/49880
* config/sh/lib1funcs.S (sdivsi3_i4, udivsi3_i4): Enable for SH2A.
(sdivsi3, udivsi3): Remove SH4 check and always compile these functions.

Backport from mainline:
2013-03-13  Oleg Endo  <olegendo@gcc.gnu.org>

PR target/49880
* gcc.target/sh/pr49880-1.c: New.
* gcc.target/sh/pr49880-2.c: New.
* gcc.target/sh/pr49880-3.c: New.
* gcc.target/sh/pr49880-4.c: New.
* gcc.target/sh/pr49880-5.c: New.

From-SVN: r197071

15 files changed:
gcc/ChangeLog
gcc/config/sh/linux.h
gcc/config/sh/netbsd-elf.h
gcc/config/sh/sh.c
gcc/config/sh/sh.h
gcc/config/sh/sh.md
gcc/config/sh/sh.opt
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/sh/pr49880-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/sh/pr49880-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/sh/pr49880-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/sh/pr49880-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/sh/pr49880-5.c [new file with mode: 0644]
libgcc/ChangeLog
libgcc/config/sh/lib1funcs.S

index 62247339439db0fb9f2441ea89173224934fe1e9..4d21bb824523027f0132f3e57c82514da997d0fd 100644 (file)
@@ -1,3 +1,27 @@
+2013-03-25  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       Backport from mainline:
+       2013-03-13  Oleg Endo  <olegendo@gcc.gnu.org>
+       2013-03-14  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       PR target/49880
+       * config/sh/sh.opt (FPU_SINGLE_ONLY): New mask.
+       (musermode): Convert to Var(TARGET_USERMODE).
+       * config/sh/sh.h (SELECT_SH2A_SINGLE_ONLY, SELECT_SH4_SINGLE_ONLY,
+       MASK_ARCH): Add MASK_FPU_SINGLE_ONLY.
+       * config/sh/sh.c (sh_option_override): Use
+       TARGET_FPU_DOUBLE || TARGET_FPU_SINGLE_ONLY for call-fp case.
+       * config/sh/sh.md (udivsi3_i1, divsi3_i1): Remove ! TARGET_SH4
+       condition.
+       (udivsi3_i4, divsi3_i4): Use TARGET_FPU_DOUBLE condition instead of
+       TARGET_SH4.
+       (udivsi3_i4_single, divsi3_i4_single): Use
+       TARGET_FPU_SINGLE_ONLY || TARGET_FPU_DOUBLE instead of TARGET_HARD_SH4.
+       * config/sh/linux.h (TARGET_DEFAULT): Remove MASK_USERMODE.
+       (SUBTARGET_OVERRIDE_OPTIONS): Set TARGET_USERMODE as default.
+       * config/sh/netbsd-elf.h (TARGET_DEFAULT): Remove MASK_USERMODE.
+       (SUBTARGET_OVERRIDE_OPTIONS): New.
+
 2013-03-25  Oleg Endo  <olegendo@gcc.gnu.org>
 
        Backport from mainline:
index a5c2734214b63acef51654e73c094be0cc4e4b4d..3dad514e6d01eb18d1677c9dfdcda77804829b7d 100644 (file)
@@ -40,7 +40,7 @@ along with GCC; see the file COPYING3.  If not see
 
 #undef TARGET_DEFAULT
 #define TARGET_DEFAULT \
-  (TARGET_CPU_DEFAULT | MASK_USERMODE | TARGET_ENDIAN_DEFAULT \
+  (TARGET_CPU_DEFAULT | TARGET_ENDIAN_DEFAULT \
    | TARGET_OPT_DEFAULT | MASK_SOFT_ATOMIC)
 
 #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
@@ -135,3 +135,13 @@ along with GCC; see the file COPYING3.  If not see
 /* Install the __sync libcalls.  */
 #undef TARGET_INIT_LIBFUNCS
 #define TARGET_INIT_LIBFUNCS  sh_init_sync_libfuncs
+
+#undef SUBTARGET_OVERRIDE_OPTIONS
+#define SUBTARGET_OVERRIDE_OPTIONS                                     \
+  do                                                                   \
+    {                                                                  \
+      /* Set -musermode if it hasn't been specified.  */               \
+      if (global_options_set.x_TARGET_USERMODE == 0)                   \
+       TARGET_USERMODE = true;                                         \
+    }                                                                  \
+  while (0)
index f5a820b136347a3683e9aff71969324a78246e1a..7add00e2bcae054911b1e3cd6247e36c02481a6c 100644 (file)
@@ -60,7 +60,7 @@ along with GCC; see the file COPYING3.  If not see
 
 #undef TARGET_DEFAULT
 #define TARGET_DEFAULT \
-  (TARGET_CPU_DEFAULT | MASK_USERMODE | TARGET_ENDIAN_DEFAULT)
+  (TARGET_CPU_DEFAULT | TARGET_ENDIAN_DEFAULT)
 
 /* Define because we use the label and we do not need them.  */
 #define NO_PROFILE_COUNTERS 1
@@ -96,3 +96,13 @@ while (0)
 #define SH_DIV_STRATEGY_DEFAULT SH_DIV_CALL2
 #undef SH_DIV_STR_FOR_SIZE
 #define SH_DIV_STR_FOR_SIZE "call2"
+
+#undef SUBTARGET_OVERRIDE_OPTIONS
+#define SUBTARGET_OVERRIDE_OPTIONS                                     \
+  do                                                                   \
+    {                                                                  \
+      /* Set -musermode if it hasn't been specified.  */               \
+      if (global_options_set.x_TARGET_USERMODE == 0)                   \
+       TARGET_USERMODE = true;                                         \
+    }                                                                  \
+  while (0)
index 1c1ab62cd1ea6c847489b69b869b07a7bd4cf639..1c7233f706db2911d4b0fd6defa199ae6466a5d9 100644 (file)
@@ -682,8 +682,7 @@ sh_option_override (void)
       if (! strcmp (sh_div_str, "call-div1"))
        sh_div_strategy = SH_DIV_CALL_DIV1;
       else if (! strcmp (sh_div_str, "call-fp")
-              && (TARGET_FPU_DOUBLE
-                  || (TARGET_HARD_SH4 && TARGET_SH2E)
+              && (TARGET_FPU_DOUBLE || TARGET_FPU_SINGLE_ONLY
                   || (TARGET_SHCOMPACT && TARGET_FPU_ANY)))
        sh_div_strategy = SH_DIV_CALL_FP;
       else if (! strcmp (sh_div_str, "call-table")
index 10e87f88c53eae909a3d7449cd9515b590e0000d..8b7dd1db81d92923e16ca053e670b073f94eca84 100644 (file)
@@ -208,14 +208,16 @@ do { \
                                  | MASK_SH2 | MASK_SH1)
 #define SELECT_SH2A_NOFPU        (MASK_HARD_SH2A | MASK_SH2 | MASK_SH1)
 #define SELECT_SH2A_SINGLE_ONLY  (MASK_SH_E | MASK_HARD_SH2A | MASK_SH2 \
-                                 | MASK_SH1 | MASK_FPU_SINGLE)
+                                 | MASK_SH1 | MASK_FPU_SINGLE \
+                                 | MASK_FPU_SINGLE_ONLY)
 #define SELECT_SH2A_SINGLE       (MASK_SH_E | MASK_HARD_SH2A \
                                  | MASK_FPU_SINGLE | MASK_HARD_SH2A_DOUBLE \
                                  | MASK_SH2 | MASK_SH1)
 #define SELECT_SH3               (MASK_SH3 | SELECT_SH2)
 #define SELECT_SH3E              (MASK_SH_E | MASK_FPU_SINGLE | SELECT_SH3)
 #define SELECT_SH4_NOFPU         (MASK_HARD_SH4 | SELECT_SH3)
-#define SELECT_SH4_SINGLE_ONLY   (MASK_HARD_SH4 | SELECT_SH3E)
+#define SELECT_SH4_SINGLE_ONLY   (MASK_HARD_SH4 | SELECT_SH3E \
+                                 | MASK_FPU_SINGLE_ONLY)
 #define SELECT_SH4               (MASK_SH4 | MASK_SH_E | MASK_HARD_SH4 \
                                  | SELECT_SH3)
 #define SELECT_SH4_SINGLE        (MASK_FPU_SINGLE | SELECT_SH4)
@@ -282,7 +284,8 @@ do { \
 /* Reset all target-selection flags.  */
 #define MASK_ARCH (MASK_SH1 | MASK_SH2 | MASK_SH3 | MASK_SH_E | MASK_SH4 \
                   | MASK_HARD_SH2A | MASK_HARD_SH2A_DOUBLE | MASK_SH4A \
-                  | MASK_HARD_SH4 | MASK_FPU_SINGLE | MASK_SH5)
+                  | MASK_HARD_SH4 | MASK_FPU_SINGLE | MASK_SH5 \
+                  | MASK_FPU_SINGLE_ONLY)
 
 /* This defaults us to big-endian.  */
 #ifndef TARGET_ENDIAN_DEFAULT
index 2d72d701a4f263592b1a19be34612f5b0dc50da3..cbe0b2c01b577c9f92ffdd6d31af2fb27f20fdc7 100644 (file)
    (clobber (reg:SI PR_REG))
    (clobber (reg:SI R4_REG))
    (use (match_operand:SI 1 "arith_reg_operand" "r"))]
-  "TARGET_SH1 && (! TARGET_SH4 || TARGET_DIVIDE_CALL_DIV1)"
+  "TARGET_SH1 && TARGET_DIVIDE_CALL_DIV1"
   "jsr @%1%#"
   [(set_attr "type" "sfunc")
    (set_attr "needs_delay_slot" "yes")])
    (clobber (reg:SI R5_REG))
    (use (reg:PSI FPSCR_REG))
    (use (match_operand:SI 1 "arith_reg_operand" "r"))]
-  "TARGET_SH4 && ! TARGET_FPU_SINGLE"
+  "TARGET_FPU_DOUBLE && ! TARGET_FPU_SINGLE"
   "jsr @%1%#"
   [(set_attr "type" "sfunc")
    (set_attr "fp_mode" "double")
    (clobber (reg:SI R4_REG))
    (clobber (reg:SI R5_REG))
    (use (match_operand:SI 1 "arith_reg_operand" "r"))]
-  "(TARGET_HARD_SH4 || TARGET_SHCOMPACT) && TARGET_FPU_SINGLE"
+  "(TARGET_FPU_SINGLE_ONLY || TARGET_FPU_DOUBLE || TARGET_SHCOMPACT)
+   && TARGET_FPU_SINGLE"
   "jsr @%1%#"
   [(set_attr "type" "sfunc")
    (set_attr "needs_delay_slot" "yes")])
    (clobber (reg:SI R2_REG))
    (clobber (reg:SI R3_REG))
    (use (match_operand:SI 1 "arith_reg_operand" "r"))]
-  "TARGET_SH1 && (! TARGET_SH4 || TARGET_DIVIDE_CALL_DIV1)"
+  "TARGET_SH1 && TARGET_DIVIDE_CALL_DIV1"
   "jsr @%1%#"
   [(set_attr "type" "sfunc")
    (set_attr "needs_delay_slot" "yes")])
    (clobber (reg:DF DR2_REG))
    (use (reg:PSI FPSCR_REG))
    (use (match_operand:SI 1 "arith_reg_operand" "r"))]
-  "TARGET_SH4 && ! TARGET_FPU_SINGLE"
+  "TARGET_FPU_DOUBLE && ! TARGET_FPU_SINGLE"
   "jsr @%1%#"
   [(set_attr "type" "sfunc")
    (set_attr "fp_mode" "double")
    (clobber (reg:DF DR2_REG))
    (clobber (reg:SI R2_REG))
    (use (match_operand:SI 1 "arith_reg_operand" "r"))]
-  "(TARGET_HARD_SH4 || TARGET_SHCOMPACT) && TARGET_FPU_SINGLE"
+  "(TARGET_FPU_SINGLE_ONLY || TARGET_FPU_DOUBLE || TARGET_SHCOMPACT)
+   && TARGET_FPU_SINGLE"
   "jsr @%1%#"
   [(set_attr "type" "sfunc")
    (set_attr "needs_delay_slot" "yes")])
index bf3f64d7a981c3b0bf13dab114c134cca3640082..0389fcea76ba02e5ded7b710386dbdcb9cb08867 100644 (file)
@@ -25,6 +25,10 @@ Mask(SH_E)
 ;; Set if the default precision of th FPU is single.
 Mask(FPU_SINGLE)
 
+;; Set if the a double-precision FPU is present but is restricted to
+;; single precision usage only.
+Mask(FPU_SINGLE_ONLY)
+
 ;; Set if we should generate code using type 2A insns.
 Mask(HARD_SH2A)
 
@@ -332,7 +336,7 @@ Target RejectNegative Joined UInteger Var(sh_multcost) Init(-1)
 Cost to assume for a multiply insn
 
 musermode
-Target Report RejectNegative Mask(USERMODE)
+Target Report RejectNegative Var(TARGET_USERMODE)
 Don't generate privileged-mode only code; implies -mno-inline-ic_invalidate if the inline code would not work in user mode.
 
 ;; We might want to enable this by default for TARGET_HARD_SH4, because
index eae340a83df2128fa87cc1c63056db36a92366a1..ad0f54170c895002c6f2454d69f69795f512f6f2 100644 (file)
@@ -1,3 +1,15 @@
+2013-03-25  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       Backport from mainline:
+       2013-03-13  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/49880
+       * gcc.target/sh/pr49880-1.c: New.
+       * gcc.target/sh/pr49880-2.c: New.
+       * gcc.target/sh/pr49880-3.c: New.
+       * gcc.target/sh/pr49880-4.c: New.
+       * gcc.target/sh/pr49880-5.c: New.
+
 2013-03-22  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/56560
diff --git a/gcc/testsuite/gcc.target/sh/pr49880-1.c b/gcc/testsuite/gcc.target/sh/pr49880-1.c
new file mode 100644 (file)
index 0000000..e19f1bf
--- /dev/null
@@ -0,0 +1,22 @@
+/* Check that the option -mdiv=call-div1 works.  */
+/* { dg-do link { target "sh*-*-*" } } */
+/* { dg-options "-mdiv=call-div1" }  */
+/* { dg-skip-if "" { "sh*-*-*" } { "-m5*"} { "" } }  */
+
+int
+test00 (int a, int b)
+{
+  return a / b;
+}
+
+unsigned int
+test01 (unsigned int a, unsigned b)
+{
+  return a / b;
+}
+
+int
+main (int argc, char** argv)
+{
+  return test00 (argc, 123) + test01 (argc, 123);
+}
diff --git a/gcc/testsuite/gcc.target/sh/pr49880-2.c b/gcc/testsuite/gcc.target/sh/pr49880-2.c
new file mode 100644 (file)
index 0000000..eef832e
--- /dev/null
@@ -0,0 +1,22 @@
+/* Check that the option -mdiv=call-fp works.  */
+/* { dg-do link { target "sh*-*-*" } } */
+/* { dg-options "-mdiv=call-fp" }  */
+/* { dg-skip-if "" { "sh*-*-*" } { "-m5*"} { "" } }  */
+
+int
+test00 (int a, int b)
+{
+  return a / b;
+}
+
+unsigned int
+test01 (unsigned int a, unsigned b)
+{
+  return a / b;
+}
+
+int
+main (int argc, char** argv)
+{
+  return test00 (argc, 123) + test01 (argc, 123);
+}
diff --git a/gcc/testsuite/gcc.target/sh/pr49880-3.c b/gcc/testsuite/gcc.target/sh/pr49880-3.c
new file mode 100644 (file)
index 0000000..80a7df5
--- /dev/null
@@ -0,0 +1,22 @@
+/* Check that the option -mdiv=call-table works.  */
+/* { dg-do link { target "sh*-*-*" } } */
+/* { dg-options "-mdiv=call-table" }  */
+/* { dg-skip-if "" { "sh*-*-*" } { "-m5*"} { "" } }  */
+
+int
+test00 (int a, int b)
+{
+  return a / b;
+}
+
+unsigned int
+test01 (unsigned int a, unsigned b)
+{
+  return a / b;
+}
+
+int
+main (int argc, char** argv)
+{
+  return test00 (argc, 123) + test01 (argc, 123);
+}
diff --git a/gcc/testsuite/gcc.target/sh/pr49880-4.c b/gcc/testsuite/gcc.target/sh/pr49880-4.c
new file mode 100644 (file)
index 0000000..998a8b6
--- /dev/null
@@ -0,0 +1,19 @@
+/* Check that the option -mdiv=call-fp does not produce calls to the
+   library function that uses FPU to implement integer division if FPU insns
+   are not supported or are disabled.  */
+/* { dg-do compile { target "sh*-*-*" } }  */
+/* { dg-options "-mdiv=call-fp" }  */
+/* { dg-skip-if "" { "sh*-*-*" } { "*"} { "-m1" "-m2" "-m3" "-m4al" "*nofpu" "-m4-340*" "-m4-400*" "-m4-500*" } }  */
+/* { dg-final { scan-assembler-not "sdivsi3_i4\n|udivsi3_i4\n" } }  */
+
+int
+test00 (int a, int b)
+{
+  return a / b;
+}
+
+unsigned int
+test01 (unsigned int a, unsigned b)
+{
+  return a / b;
+}
diff --git a/gcc/testsuite/gcc.target/sh/pr49880-5.c b/gcc/testsuite/gcc.target/sh/pr49880-5.c
new file mode 100644 (file)
index 0000000..09e99a8
--- /dev/null
@@ -0,0 +1,19 @@
+/* Check that the option -mdiv=call-fp results in the corresponding library
+   function calls on targets that have a double precision FPU.  */
+/* { dg-do compile { target "sh*-*-*" } }  */
+/* { dg-options "-mdiv=call-fp" }  */
+/* { dg-skip-if "" { "sh*-*-*" } { "*"} { "-m2a" "-m4" "-m4a" "*single-only" } }  */
+/* { dg-final { scan-assembler "sdivsi3_i4\n" } }  */
+/* { dg-final { scan-assembler "udivsi3_i4\n" } }  */
+
+int
+test00 (int a, int b)
+{
+  return a / b;
+}
+
+unsigned int
+test01 (unsigned int a, unsigned b)
+{
+  return a / b;
+}
index 5cb273043e40caef79fd6c004f8e6dd82a8d356f..277f6fd40dfc5f13a73dfca21432da2dc33afd24 100644 (file)
@@ -1,3 +1,12 @@
+2013-03-25  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       Backport from mainline:
+       2013-03-13  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/49880
+       * config/sh/lib1funcs.S (sdivsi3_i4, udivsi3_i4): Enable for SH2A.
+       (sdivsi3, udivsi3): Remove SH4 check and always compile these functions.
+
 2013-03-06  Oleg Endo  <olegendo@gcc.gnu.org>
 
        Backport from mainline.
index 84a42e79901a5c6949115ef3272c96146c1cf307..76e14df52c6fd444a60aee59b9dfabba25bcfd72 100644 (file)
@@ -973,7 +973,7 @@ hiset:      sts     macl,r0         ! r0 = bb*dd
 #ifdef L_sdivsi3_i4
        .title "SH DIVIDE"
 !! 4 byte integer Divide code for the Renesas SH
-#ifdef __SH4__
+#if defined (__SH4__) || defined (__SH2A__)
 !! args in r4 and r5, result in fpul, clobber dr0, dr2
 
        .global GLOBAL(sdivsi3_i4)
@@ -988,7 +988,7 @@ GLOBAL(sdivsi3_i4):
        ftrc dr0,fpul
 
        ENDFUNC(GLOBAL(sdivsi3_i4))
-#elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__)
+#elif defined (__SH2A_SINGLE__) || defined (__SH2A_SINGLE_ONLY__) || defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__)
 !! args in r4 and r5, result in fpul, clobber r2, dr0, dr2
 
 #if ! __SH5__ || __SH5__ == 32
@@ -1013,13 +1013,12 @@ GLOBAL(sdivsi3_i4):
 
        ENDFUNC(GLOBAL(sdivsi3_i4))
 #endif /* ! __SH5__ || __SH5__ == 32 */
-#endif /* ! __SH4__ */
+#endif /* ! __SH4__ || __SH2A__  */
 #endif
 
 #ifdef L_sdivsi3
 /* __SH4_SINGLE_ONLY__ keeps this part for link compatibility with
    sh2e/sh3e code.  */
-#if (! defined(__SH4__) && ! defined (__SH4_SINGLE__)) || defined (__linux__)
 !!
 !! Steve Chamberlain
 !! sac@cygnus.com
@@ -1336,13 +1335,12 @@ div0:   rts
 
        ENDFUNC(GLOBAL(sdivsi3))
 #endif /* ! __SHMEDIA__ */
-#endif /* ! __SH4__ */
 #endif
 #ifdef L_udivsi3_i4
 
        .title "SH DIVIDE"
 !! 4 byte integer Divide code for the Renesas SH
-#ifdef __SH4__
+#if defined (__SH4__) || defined (__SH2A__)
 !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4,
 !! and t bit
 
@@ -1384,7 +1382,7 @@ L1:
        .double 2147483648
 
        ENDFUNC(GLOBAL(udivsi3_i4))
-#elif defined (__SH5__) && ! defined (__SH4_NOFPU__)
+#elif defined (__SH5__) && ! defined (__SH4_NOFPU__) && ! defined (__SH2A_NOFPU__)
 #if ! __SH5__ || __SH5__ == 32
 !! args in r4 and r5, result in fpul, clobber r20, r21, dr0, fr33
        .mode   SHmedia
@@ -1405,7 +1403,7 @@ GLOBAL(udivsi3_i4):
 
        ENDFUNC(GLOBAL(udivsi3_i4))
 #endif /* ! __SH5__ || __SH5__ == 32 */
-#elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__)
+#elif defined (__SH2A_SINGLE__) || defined (__SH2A_SINGLE_ONLY__) || defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__)
 !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4
 
        .global GLOBAL(udivsi3_i4)
@@ -1460,7 +1458,6 @@ L1:
 #ifdef L_udivsi3
 /* __SH4_SINGLE_ONLY__ keeps this part for link compatibility with
    sh2e/sh3e code.  */
-#if (! defined(__SH4__) && ! defined (__SH4_SINGLE__)) || defined (__linux__)
 
 !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit
        .global GLOBAL(udivsi3)
@@ -1655,7 +1652,6 @@ LOCAL(large_divisor):
 
        ENDFUNC(GLOBAL(udivsi3))
 #endif /* ! __SHMEDIA__ */
-#endif /* __SH4__ */
 #endif /* L_udivsi3 */
 
 #ifdef L_udivdi3