+2009-03-30 Paolo Bonzini <bonzini@gnu.org>
+
+ * config/sparc/sparc.c (sparc_compare_emitted): Remove.
+ (gen_compare_reg, emit_v9_brxx_insn): Handle MODE_CC
+ sparc_compare_op0 like sparc_compare_emitted used to be handled.
+ (sparc_expand_compare_and_swap_12): Set sparc_compare_op0
+ instead of sparc_compare_emitted.
+ * config/sparc/sparc.h (sparc_compare_emitted): Remove.
+ * config/sparc/sparc.md (stack_protect_test): Set sparc_compare_op0
+ instead of sparc_compare_emitted.
+
2009-03-30 Paolo Bonzini <bonzini@gnu.org>
* bb-reorder.c (partition_hot_cold_basic_blocks): Do not
/* Save the operands last given to a compare for use when we
generate a scc or bcc insn. */
-rtx sparc_compare_op0, sparc_compare_op1, sparc_compare_emitted;
+rtx sparc_compare_op0, sparc_compare_op1;
/* Vector to say how input registers are mapped to output registers.
HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
rtx
gen_compare_reg (enum rtx_code code)
{
- rtx x = sparc_compare_op0;
- rtx y = sparc_compare_op1;
- enum machine_mode mode = SELECT_CC_MODE (code, x, y);
- rtx cc_reg;
+ enum machine_mode mode;
+ rtx x, y, cc_reg;
- if (sparc_compare_emitted != NULL_RTX)
- {
- cc_reg = sparc_compare_emitted;
- sparc_compare_emitted = NULL_RTX;
- return cc_reg;
- }
+ if (GET_MODE_CLASS (GET_MODE (sparc_compare_op0)) == MODE_CC)
+ return sparc_compare_op0;
+
+ x = sparc_compare_op0;
+ y = sparc_compare_op1;
+ mode = SELECT_CC_MODE (code, x, y);
/* ??? We don't have movcc patterns so we cannot generate pseudo regs for the
fcc regs (cse can't tell they're really call clobbered regs and will
void
emit_v9_brxx_insn (enum rtx_code code, rtx op0, rtx label)
{
- gcc_assert (sparc_compare_emitted == NULL_RTX);
+ gcc_assert (GET_MODE_CLASS (GET_MODE (sparc_compare_op0)) != MODE_CC);
emit_jump_insn (gen_rtx_SET (VOIDmode,
pc_rtx,
gen_rtx_IF_THEN_ELSE (VOIDmode,
emit_insn (gen_rtx_SET (VOIDmode, val, resv));
- sparc_compare_emitted = cc;
+ sparc_compare_op0 = cc;
+ sparc_compare_op1 = const0_rtx;
emit_jump_insn (gen_bne (loop_label));
emit_label (end_label);
? 128 : PARM_BOUNDARY)
\f
/* Define the information needed to generate branch and scc insns. This is
- stored from the compare operation. Note that we can't use "rtx" here
- since it hasn't been defined! */
+ stored from the compare operation. */
extern GTY(()) rtx sparc_compare_op0;
extern GTY(()) rtx sparc_compare_op1;
-extern GTY(()) rtx sparc_compare_emitted;
\f
/* Generate the special assembly code needed to tell the assembler whatever
else
{
emit_insn (gen_stack_protect_testsi (operands[0], operands[1]));
- sparc_compare_op0 = operands[0];
- sparc_compare_op1 = operands[1];
- sparc_compare_emitted = gen_rtx_REG (CCmode, SPARC_ICC_REG);
+ sparc_compare_op0 = gen_rtx_REG (CCmode, SPARC_ICC_REG);
+ sparc_compare_op1 = const0_rtx;
}
emit_jump_insn (gen_beq (operands[2]));
DONE;