OSDN Git Service

* reg-stack.c (subst_stack_regs_pat): Handle correctly USEs of
[pf3gnuchains/gcc-fork.git] / gcc / reg-stack.c
index 98b8778..2edd579 100644 (file)
@@ -1,5 +1,5 @@
 /* Register to Stack convert for GNU compiler.
-   Copyright (C) 1992, 93-98, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1992, 93-99, 2000 Free Software Foundation, Inc.
 
    This file is part of GNU CC.
 
@@ -229,36 +229,36 @@ static rtx nan;
 
 /* Forward declarations */
 
-static int stack_regs_mentioned_p      PROTO((rtx pat));
-static void straighten_stack           PROTO((rtx, stack));
-static void pop_stack                  PROTO((stack, int));
-static rtx *get_true_reg               PROTO((rtx *));
-
-static int check_asm_stack_operands    PROTO((rtx));
-static int get_asm_operand_n_inputs    PROTO((rtx));
-static rtx stack_result                        PROTO((tree));
-static void replace_reg                        PROTO((rtx *, int));
-static void remove_regno_note          PROTO((rtx, enum reg_note, int));
-static int get_hard_regnum             PROTO((stack, rtx));
-static void delete_insn_for_stacker    PROTO((rtx));
-static rtx emit_pop_insn               PROTO((rtx, stack, rtx,
+static int stack_regs_mentioned_p      PARAMS ((rtx pat));
+static void straighten_stack           PARAMS ((rtx, stack));
+static void pop_stack                  PARAMS ((stack, int));
+static rtx *get_true_reg               PARAMS ((rtx *));
+
+static int check_asm_stack_operands    PARAMS ((rtx));
+static int get_asm_operand_n_inputs    PARAMS ((rtx));
+static rtx stack_result                        PARAMS ((tree));
+static void replace_reg                        PARAMS ((rtx *, int));
+static void remove_regno_note          PARAMS ((rtx, enum reg_note, int));
+static int get_hard_regnum             PARAMS ((stack, rtx));
+static void delete_insn_for_stacker    PARAMS ((rtx));
+static rtx emit_pop_insn               PARAMS ((rtx, stack, rtx,
                                               enum emit_where));
-static void emit_swap_insn             PROTO((rtx, stack, rtx));
-static void move_for_stack_reg         PROTO((rtx, stack, rtx));
-static int swap_rtx_condition_1                PROTO((rtx));
-static int 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 void subst_asm_stack_regs       PROTO((rtx, stack));
-static void subst_stack_regs           PROTO((rtx, stack));
-static void change_stack               PROTO((rtx, stack, stack,
+static void emit_swap_insn             PARAMS ((rtx, stack, rtx));
+static void move_for_stack_reg         PARAMS ((rtx, stack, rtx));
+static int swap_rtx_condition_1                PARAMS ((rtx));
+static int swap_rtx_condition          PARAMS ((rtx));
+static void compare_for_stack_reg      PARAMS ((rtx, stack, rtx));
+static void subst_stack_regs_pat       PARAMS ((rtx, stack, rtx));
+static void subst_asm_stack_regs       PARAMS ((rtx, stack));
+static void subst_stack_regs           PARAMS ((rtx, stack));
+static void change_stack               PARAMS ((rtx, stack, stack,
                                               enum emit_where));
-static int convert_regs_entry          PROTO((void));
-static void convert_regs_exit          PROTO((void));
-static int convert_regs_1              PROTO((FILE *, basic_block));
-static int convert_regs_2              PROTO((FILE *, basic_block));
-static int convert_regs                        PROTO((FILE *));
-static void print_stack                PROTO((FILE *, stack));
+static int convert_regs_entry          PARAMS ((void));
+static void convert_regs_exit          PARAMS ((void));
+static int convert_regs_1              PARAMS ((FILE *, basic_block));
+static int convert_regs_2              PARAMS ((FILE *, basic_block));
+static int convert_regs                        PARAMS ((FILE *));
+static void print_stack                PARAMS ((FILE *, stack));
 \f
 /* Return non-zero if any stack register is mentioned somewhere within PAT.  */
 
@@ -589,7 +589,7 @@ check_asm_stack_operands (insn)
   char implicitly_dies[FIRST_PSEUDO_REGISTER];
   int alt;
 
-  rtx *clobber_reg;
+  rtx *clobber_reg = 0;
   int n_inputs, n_outputs;
 
   /* Find out what the constraints require.  If no constraint
@@ -1631,6 +1631,16 @@ subst_stack_regs_pat (insn, regstack, pat)
                SET_HARD_REG_BIT (regstack->reg_set, REGNO (*dest));
                replace_reg (dest, get_hard_regnum (regstack, *dest));
              }
+
+           /* Keep operand 1 maching with destination.  */
+           if (GET_RTX_CLASS (GET_CODE (pat_src)) == 'c'
+               && REG_P (*src1) && REG_P (*src2)
+               && REGNO (*src1) != REGNO (*dest))
+            {
+               rtx tmp = *src1;
+               *src1 = *src2;
+               *src2 = tmp;
+            }
            break;
 
          case UNSPEC:
@@ -1782,8 +1792,8 @@ subst_asm_stack_regs (insn, regstack)
   rtx **note_loc;              /* Address of REG field of each note */
   enum reg_note *note_kind;    /* The type of each note */
 
-  rtx *clobber_reg;
-  rtx **clobber_loc;
+  rtx *clobber_reg = 0;
+  rtx **clobber_loc = 0;
 
   struct stack_def temp_stack;
   int n_notes;