Fix for m68k -O0 libstdc++ compiler abort.
authorJim Wilson <wilson@cygnus.com>
Tue, 13 Oct 1998 17:52:36 +0000 (17:52 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Tue, 13 Oct 1998 17:52:36 +0000 (10:52 -0700)
* config/m68k/m68k.h (HARD_REGNO_MODE_OK): For FP regs, add REGNO >= 16
check.  Add comment to document problems with TARGET_SUN_FPA version
of this macro.
* config/m68k/m68k.md (movxf+1): Support 'r'/'r' moves.

From-SVN: r23056

gcc/ChangeLog
gcc/config/m68k/m68k.h
gcc/config/m68k/m68k.md

index 24f62e8c80f3f6b2904f2c3667882804c17010a6..fa0cf17e78bec8e63a11450a2f0c5f0aa3aa9e18 100644 (file)
@@ -1,3 +1,10 @@
+Tue Oct 13 17:51:04 1998  Jim Wilson  <wilson@cygnus.com>
+
+       * config/m68k/m68k.h (HARD_REGNO_MODE_OK): For FP regs, add REGNO >= 16
+       check.  Add comment to document problems with TARGET_SUN_FPA version
+       of this macro.
+       * config/m68k/m68k.md (movxf+1): Support 'r'/'r' moves.
+
 Tue Oct 13 17:46:18 1998  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * Makefile.in (gencheck.o): Depend on gansidecl.h.
index a4bfef9a638419d04decc464297b8d291094ff3a..42eb7939cf9375ca32d7b4c304f0728985326e21 100644 (file)
@@ -471,8 +471,8 @@ extern int target_flags;
 
 #define HARD_REGNO_MODE_OK(REGNO, MODE) \
   (((REGNO) < 16                                       \
-   && !((REGNO) < 8 && (REGNO) + GET_MODE_SIZE ((MODE)) / 4 > 8))      \
-   || ((REGNO) < 24                                    \
+    && !((REGNO) < 8 && (REGNO) + GET_MODE_SIZE (MODE) / 4 > 8))       \
+   || ((REGNO) >= 16 && (REGNO) < 24                                   \
        && TARGET_68881                                  \
        && (GET_MODE_CLASS (MODE) == MODE_FLOAT         \
           || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT)))
@@ -486,6 +486,11 @@ extern int target_flags;
    (apparently) hold whatever you feel like putting in them.
    If using the fpa, don't put a double in d7/a0.  */
 
+/* ??? This is confused.  The check to prohibit d7/a0 overlaps should always
+   be enabled regardless of whether TARGET_FPA is specified.  It isn't clear
+   what the other d/a register checks are for.  Every check using REGNO
+   actually needs to use a range, e.g. 24>=X<56 not <56.  There is probably
+   no one using this code anymore.  */
 #define HARD_REGNO_MODE_OK(REGNO, MODE) \
 (((REGNO) < 16                                                         \
   && !(TARGET_FPA                                                      \
index dfe0cbc313e8929394fa88c7b8690535956d0202..a648ec80548ebf3ad5668ea02419b93a18610b15 100644 (file)
 }")
 
 (define_insn ""
-  [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,!r,!f")
-       (match_operand:XF 1 "nonimmediate_operand" "m,f,f,f,r"))]
+  [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,!r,!f,!r")
+       (match_operand:XF 1 "nonimmediate_operand" "m,f,f,f,r,!r"))]
   "TARGET_68881"
   "*
 {
         return \"fmove%.x %1,%0\";
       return \"fmove%.x %f1,%0\";
     }
-  if (REG_P (operands[0]))
+  if (FP_REG_P (operands[1]))
     {
-      output_asm_insn (\"fmove%.x %f1,%-\;move%.l %+,%0\", operands);
-      operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
-      output_asm_insn (\"move%.l %+,%0\", operands);
-      operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
-      return \"move%.l %+,%0\";
+      if (REG_P (operands[0]))
+       {
+         output_asm_insn (\"fmove%.x %f1,%-\;move%.l %+,%0\", operands);
+         operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
+         output_asm_insn (\"move%.l %+,%0\", operands);
+         operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
+         return \"move%.l %+,%0\";
+       }
+      /* Must be memory destination.  */
+      return \"fmove%.x %f1,%0\";
     }
-  return \"fmove%.x %f1,%0\";
+  return output_move_double (operands);
 }
 ")