diff options
Diffstat (limited to 'gcc/config/sparc')
-rw-r--r-- | gcc/config/sparc/sparc.c | 25 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.h | 4 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.md | 15 |
3 files changed, 20 insertions, 24 deletions
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index e20bfbdb45b..7e6a358f89b 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 6271a943d19..6a46093dfd3 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 d78d6e93b43..8e8991129aa 100644 --- a/gcc/config/sparc/sparc.md +++ b/gcc/config/sparc/sparc.md @@ -7082,10 +7082,10 @@ [(unspec_volatile [(const_int 0)] UNSPECV_SETJMP)] "" { - if (! cfun->calls_alloca) + if (!cfun->calls_alloca) return ""; - if (! TARGET_V9) - return "\tta\t3\n"; + if (!TARGET_V9) + return "ta\t3"; fputs ("\tflushw\n", asm_out_file); if (flag_pic) fprintf (asm_out_file, "\tst%c\t%%l7, [%%sp+%d]\n", @@ -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; @@ -8173,7 +8172,7 @@ ;; (ior (not (op1)) (not (op2))) is the canonical form of NAND. -(define_insn "*nand<V64mode>_vis" +(define_insn "*nand<V64:mode>_vis" [(set (match_operand:V64 0 "register_operand" "=e") (ior:V64 (not:V64 (match_operand:V64 1 "register_operand" "e")) (not:V64 (match_operand:V64 2 "register_operand" "e"))))] @@ -8182,7 +8181,7 @@ [(set_attr "type" "fga") (set_attr "fptype" "double")]) -(define_insn "*nand<V32mode>_vis" +(define_insn "*nand<V32:mode>_vis" [(set (match_operand:V32 0 "register_operand" "=f") (ior:V32 (not:V32 (match_operand:V32 1 "register_operand" "f")) (not:V32 (match_operand:V32 2 "register_operand" "f"))))] |