aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2009-03-30 09:09:52 +0000
committerPaolo Bonzini <bonzini@gcc.gnu.org>2009-03-30 09:09:52 +0000
commit65c5ae8b1d8c9f86dd398f0c0313598fb5172f02 (patch)
tree8cea258def420209db5de2fb050cfcbf6909f08b /gcc
parentd25aa7ab77a7ffa75ba3a029d1b2fd6a4084e965 (diff)
downloadgcc-65c5ae8b1d8c9f86dd398f0c0313598fb5172f02.zip
gcc-65c5ae8b1d8c9f86dd398f0c0313598fb5172f02.tar.gz
gcc-65c5ae8b1d8c9f86dd398f0c0313598fb5172f02.tar.bz2
sparc.c (sparc_compare_emitted): Remove.
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. From-SVN: r145284
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/config/sparc/sparc.c25
-rw-r--r--gcc/config/sparc/sparc.h4
-rw-r--r--gcc/config/sparc/sparc.md5
4 files changed, 26 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3e70130..552e97d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,16 @@
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
enter/exit cfglayout mode.
(pass_partition_block): Require it.
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index e20bfbdb..7e6a358 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 6271a94..6a46093 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 e5098a5..dd282a2 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;