sparc.c (sparc_compare_emitted): Remove.
authorPaolo Bonzini <bonzini@gnu.org>
Mon, 30 Mar 2009 09:09:52 +0000 (09:09 +0000)
committerPaolo Bonzini <bonzini@gcc.gnu.org>
Mon, 30 Mar 2009 09:09:52 +0000 (09:09 +0000)
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

gcc/ChangeLog
gcc/config/sparc/sparc.c
gcc/config/sparc/sparc.h
gcc/config/sparc/sparc.md

index 3e70130c4346135be94e70336cd897a0db2edaa9..552e97debce006dc9f05483899a7317a9efb39eb 100644 (file)
@@ -1,3 +1,14 @@
+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
index e20bfbdb45bf3d0976fe511281b9ee68b4c8e062..7e6a358f89b85f8f11f2e153841034809004e500 100644 (file)
@@ -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);
index 6271a943d195c5860cd0e555ef260837dae60d48..6a46093dfd35519447c9c9a35f78f0866e3f1c0b 100644 (file)
@@ -1558,12 +1558,10 @@ function_arg_padding ((MODE), (TYPE))
  ? 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
index e5098a5592d69ac816b572145f1dbc6e8fb3e617..dd282a28435b1d308dfa6472f88c2ac023296873 100644 (file)
   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;