OSDN Git Service

Fix for x86 FP problem.
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 27 Apr 1998 19:24:06 +0000 (19:24 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 27 Apr 1998 19:24:06 +0000 (19:24 +0000)
* reg-stack.c: Revert last patch (Apr 20).
(convert_regs): Set insn to PREV_INSN (next) after do while loop.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@19437 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/reg-stack.c

index 5b049e6..05f05ab 100644 (file)
@@ -1,5 +1,8 @@
 Mon Apr 27 18:36:28 1998  Jim Wilson  <wilson@cygnus.com>
 
+       * reg-stack.c: Revert last patch (Apr 20).
+       (convert_regs): Set insn to PREV_INSN (next) after do while loop.
+
        * m68k/lb1sf68.asm (Laddsf$3): Fix typos in mcf5200 exg code.
 
        * loop.c (check_dbra_loop): New locals jump, first_compare, and
index d4ef06b..255cb38 100644 (file)
@@ -262,9 +262,9 @@ static void move_for_stack_reg              PROTO((rtx, stack, rtx));
 static void swap_rtx_condition         PROTO((rtx));
 static void compare_for_stack_reg      PROTO((rtx, stack, rtx));
 static void subst_stack_regs_pat       PROTO((rtx, stack, rtx));
-static rtx subst_asm_stack_regs                PROTO((rtx, stack, rtx *, rtx **,
+static void subst_asm_stack_regs       PROTO((rtx, stack, rtx *, rtx **,
                                               char **, int, int));
-static rtx subst_stack_regs            PROTO((rtx, stack));
+static void subst_stack_regs           PROTO((rtx, stack));
 static void change_stack               PROTO((rtx, stack, stack, rtx (*) ()));
 
 static void goto_block_pat             PROTO((rtx, stack, rtx));
@@ -2411,11 +2411,9 @@ subst_stack_regs_pat (insn, regstack, pat)
    stack-like regs in asm statements.  These rules are enforced by
    record_asm_stack_regs; see comments there for details.  Any
    asm_operands left in the RTL at this point may be assume to meet the
-   requirements, since record_asm_stack_regs removes any problem asm.
+   requirements, since record_asm_stack_regs removes any problem asm.  */
 
-   It returns the last new insn generated by this function. */
-
-static rtx
+static void
 subst_asm_stack_regs (insn, regstack, operands, operands_loc, constraints,
                      n_inputs, n_outputs)
      rtx insn;
@@ -2694,18 +2692,14 @@ subst_asm_stack_regs (insn, regstack, operands, operands_loc, constraints,
              break;
            }
       }
-
-  return insn;
 }
 \f
 /* Substitute stack hard reg numbers for stack virtual registers in
    INSN.  Non-stack register numbers are not changed.  REGSTACK is the
    current stack content.  Insns may be emitted as needed to arrange the
-   stack for the 387 based on the contents of the insn.
-
-   It returns the last new insn generated by this function. */
+   stack for the 387 based on the contents of the insn.  */
 
-static rtx
+static void
 subst_stack_regs (insn, regstack)
      rtx insn;
      stack regstack;
@@ -2761,9 +2755,9 @@ subst_stack_regs (insn, regstack)
          decode_asm_operands (body, operands, operands_loc,
                               constraints, NULL_PTR);
          get_asm_operand_lengths (body, n_operands, &n_inputs, &n_outputs);
-         return subst_asm_stack_regs (insn, regstack, operands,
-                                      operands_loc, constraints,
-                                      n_inputs, n_outputs);
+         subst_asm_stack_regs (insn, regstack, operands, operands_loc,
+                               constraints, n_inputs, n_outputs);
+         return;
        }
 
       if (GET_CODE (PATTERN (insn)) == PARALLEL)
@@ -2781,7 +2775,7 @@ subst_stack_regs (insn, regstack)
      REG_UNUSED will already have been dealt with, so just return.  */
 
   if (GET_CODE (insn) == NOTE)
-    return insn;
+    return;
 
   /* If there is a REG_UNUSED note on a stack register on this insn,
      the indicated reg must be popped.  The REG_UNUSED note is removed,
@@ -2797,8 +2791,6 @@ subst_stack_regs (insn, regstack)
       }
     else
       note_link = &XEXP (note, 1);
-
-  return insn;
 }
 \f
 /* Change the organization of the stack so that it fits a new basic
@@ -3039,7 +3031,7 @@ static void
 convert_regs ()
 {
   register int block, reg;
-  register rtx insn, next, new;
+  register rtx insn, next;
   struct stack_def regstack;
 
   for (block = 0; block < blocks; block++)
@@ -3065,7 +3057,6 @@ convert_regs ()
       do
        {
          insn = next;
-         new = insn;
          next = NEXT_INSN (insn);
 
          /* Don't bother processing unless there is a stack reg
@@ -3073,10 +3064,21 @@ convert_regs ()
             floating point values).  */
 
          if (GET_MODE (insn) == QImode || GET_CODE (insn) == CALL_INSN)
-           /* We may have generated some new instructions here. */
-           new = subst_stack_regs (insn, &regstack);
+           subst_stack_regs (insn, &regstack);
 
        } while (insn != block_end[block]);
+      
+      /* For all further actions, INSN needs to be the last insn in
+         this basic block.  If subst_stack_regs inserted additional
+         instructions after INSN, it is no longer the last one at
+         this point.  */
+      next = PREV_INSN (next);
+
+      /* If subst_stack_regs inserted something after a JUMP_INSN, that
+         is almost certainly a bug.  */
+      if (GET_CODE (insn) == JUMP_INSN && insn != next)
+       abort ();
+      insn = next;
 
       /* Something failed if the stack life doesn't match.  */
 
@@ -3097,7 +3099,7 @@ convert_regs ()
       /* Likewise handle the case where we fall into the next block.  */
 
       if ((block < blocks - 1) && block_drops_in[block+1])
-       change_stack (new, &regstack, &block_stack_in[block+1],
+       change_stack (insn, &regstack, &block_stack_in[block+1],
                      emit_insn_after);
     }