Avoid problems with reloading fpul in HImode
authorBernd Schmidt <bernds@redhat.co.uk>
Mon, 18 Sep 2000 17:12:32 +0000 (17:12 +0000)
committerBernd Schmidt <crux@gcc.gnu.org>
Mon, 18 Sep 2000 17:12:32 +0000 (17:12 +0000)
From-SVN: r36499

gcc/ChangeLog
gcc/config/sh/sh-protos.h
gcc/config/sh/sh.c
gcc/config/sh/sh.h
gcc/config/sh/sh.md

index bb20cc90d12dba895094fb04eb8197e4686ff6e5..11ce53b6a0217600252c8aa005dc6a46e0b77e71 100644 (file)
@@ -3,6 +3,12 @@
        * reload1.c (forget_old_reloads_1): If a hard reg is stored, clear
        its entry in spill_reg_store.
        * config/sh/lib1funcs.ams (movstr_i4 functions): Always compile in.
+       * sh.c (reg_no_subreg_operand): New function.
+       * sh-protos.h (reg_no_subreg_operand): Declare it.
+       * sh.h (PREDICATE_CODES): Add it.
+       * sh.md (floatsisf2_i4, floatsidf2_i, extendsfdf2_i4): Use it for
+       input operand that needs to be in fpul.
+       (fix_truncsfsi2, fix_truncsfsi2_i4): Use register_operand for output.
 
 2000-09-18  Alexandre Oliva  <aoliva@redhat.com>
 
index e62edf4dba0371b032e25b71ec0d98abd4fdcd72..e643d08f9bc74904d4bdaef1eb8890723ca8f078 100644 (file)
@@ -81,6 +81,7 @@ extern int system_reg_operand PARAMS ((rtx, enum machine_mode));
 extern int general_movsrc_operand PARAMS ((rtx, enum machine_mode));
 extern int general_movdst_operand PARAMS ((rtx, enum machine_mode));
 extern int arith_reg_operand PARAMS ((rtx, enum machine_mode));
+extern int reg_no_subreg_operand PARAMS ((rtx, enum machine_mode));
 extern int fp_arith_reg_operand PARAMS ((rtx, enum machine_mode));
 extern int fp_extended_operand PARAMS ((rtx, enum machine_mode));
 extern int arith_operand PARAMS ((rtx, enum machine_mode));
index 18079162287e78dc1c23003b857ddfacb9116713..bd2a3828de2ee511cf16340024d0e7a4267e28c2 100644 (file)
@@ -4645,6 +4645,20 @@ general_movdst_operand (op, mode)
   return general_operand (op, mode);
 }
 
+/* Accept a register, but not a subreg of any kind.  This allows us to
+   avoid pathological cases in reload wrt data movement common in 
+   int->fp conversion.  */
+
+int
+reg_no_subreg_operand (op, mode)
+     register rtx op;
+     enum machine_mode mode;
+{
+  if (GET_CODE (op) == SUBREG)
+    return 0;
+  return register_operand (op, mode);
+}
+
 /* Returns 1 if OP is a normal arithmetic register.  */
 
 int
index 1723634bac926fa874e5b264dcbca65fed2d4f89..eac81287f4a4c895cbb9aa42f245f3d476b97cce 100644 (file)
@@ -2231,6 +2231,7 @@ extern struct rtx_def *fpscr_rtx;
 #define PREDICATE_CODES \
   {"arith_operand", {SUBREG, REG, CONST_INT}},                         \
   {"arith_reg_operand", {SUBREG, REG}},                                        \
+  {"reg_no_subreg_operand", {REG}},                                    \
   {"arith_reg_or_0_operand", {SUBREG, REG, CONST_INT}},                        \
   {"binary_float_operator", {PLUS, MULT}},                             \
   {"commutative_float_operator", {PLUS, MULT}},                                \
index 2930b7ce377ed4a9849d8302f287540636e0de1c..59ec818dedabf3ff6b3f11b6635fc4ee9fa5917b 100644 (file)
@@ -4235,7 +4235,7 @@ else
 
 (define_insn "floatsisf2_i4"
   [(set (match_operand:SF 0 "arith_reg_operand" "=f")
-       (float:SF (match_operand:SI 1 "register_operand" "y")))
+       (float:SF (match_operand:SI 1 "reg_no_subreg_operand" "y")))
    (use (match_operand:PSI 2 "fpscr_operand" "c"))]
   "TARGET_SH3E"
   "float       %1,%0"
@@ -4251,7 +4251,7 @@ else
 ;;  [(set_attr "type" "fp")])
 
 (define_expand "fix_truncsfsi2"
-  [(set (match_operand:SI 0 "arith_reg_operand" "=y")
+  [(set (match_operand:SI 0 "register_operand" "=y")
        (fix:SI (match_operand:SF 1 "arith_reg_operand" "f")))]
   "TARGET_SH3E"
   "
@@ -4264,7 +4264,7 @@ else
 }")
 
 (define_insn "fix_truncsfsi2_i4"
-  [(set (match_operand:SI 0 "arith_reg_operand" "=y")
+  [(set (match_operand:SI 0 "register_operand" "=y")
        (fix:SI (match_operand:SF 1 "arith_reg_operand" "f")))
    (use (match_operand:PSI 2 "fpscr_operand" "c"))]
   "TARGET_SH4"
@@ -4490,7 +4490,7 @@ else
 
 (define_insn "floatsidf2_i"
   [(set (match_operand:DF 0 "arith_reg_operand" "=f")
-       (float:DF (match_operand:SI 1 "register_operand" "y")))
+       (float:DF (match_operand:SI 1 "reg_no_subreg_operand" "y")))
    (use (match_operand:PSI 2 "fpscr_operand" "c"))]
   "TARGET_SH4"
   "float       %1,%0"
@@ -4634,7 +4634,7 @@ else
 
 (define_insn "extendsfdf2_i4"
   [(set (match_operand:DF 0 "arith_reg_operand" "=f")
-       (float_extend:DF (match_operand:SF 1 "register_operand" "y")))
+       (float_extend:DF (match_operand:SF 1 "reg_no_subreg_operand" "y")))
    (use (match_operand:PSI 2 "fpscr_operand" "c"))]
   "TARGET_SH4"
   "fcnvsd  %1,%0"