From: bonzini Date: Mon, 30 Mar 2009 09:09:52 +0000 (+0000) Subject: 2009-03-30 Paolo Bonzini X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bbc6e6c461d741065db7521e4c27cd8b06a3cefc;p=thirdparty%2Fgcc.git 2009-03-30 Paolo Bonzini * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145284 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3e70130c4346..552e97debce0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2009-03-30 Paolo Bonzini + + * 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 * bb-reorder.c (partition_hot_cold_basic_blocks): Do not diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index e20bfbdb45bf..7e6a358f89b8 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -282,7 +282,7 @@ static GTY(()) alias_set_type struct_value_alias_set; /* 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 @@ -2006,17 +2006,15 @@ select_cc_mode (enum rtx_code op, rtx x, rtx y ATTRIBUTE_UNUSED) 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 @@ -2198,7 +2196,7 @@ gen_v9_scc (enum rtx_code compare_code, register rtx *operands) 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, @@ -9026,7 +9024,8 @@ sparc_expand_compare_and_swap_12 (rtx result, rtx mem, rtx oldval, rtx newval) 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); diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index 6271a943d195..6a46093dfd35 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -1558,12 +1558,10 @@ function_arg_padding ((MODE), (TYPE)) ? 128 : PARM_BOUNDARY) /* 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; /* Generate the special assembly code needed to tell the assembler whatever diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md index e5098a5592d6..dd282a28435b 100644 --- a/gcc/config/sparc/sparc.md +++ b/gcc/config/sparc/sparc.md @@ -8076,9 +8076,8 @@ 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;