/* 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.
/* 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. */
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
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:
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;