From: Uros Bizjak Date: Sun, 13 May 2012 21:08:57 +0000 (+0200) Subject: backport: alpha.c (alpha_emit_conditional_branch): Handle ORDERED and UNORDERED condi... X-Git-Tag: releases/gcc-4.5.4~102 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c11df0a4c18a8bbdc9a071af0a122eec49113215;p=thirdparty%2Fgcc.git backport: alpha.c (alpha_emit_conditional_branch): Handle ORDERED and UNORDERED conditions. Backport from mainline 2012-05-12 Uros Bizjak * config/alpha/alpha.c (alpha_emit_conditional_branch): Handle ORDERED and UNORDERED conditions. From-SVN: r187445 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5bcdb70f9f6d..a66c193f3041 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-05-13 Uros Bizjak + + Backport from mainline + 2012-05-12 Uros Bizjak + + * config/alpha/alpha.c (alpha_emit_conditional_branch): Handle + ORDERED and UNORDERED conditions. + 2012-05-04 Uros Bizjak Backport from mainline diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index 7ad20dcee0c9..192e2abd40f4 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -2464,7 +2464,7 @@ alpha_emit_conditional_branch (rtx operands[], enum machine_mode cmp_mode) { case EQ: case LE: case LT: case LEU: case LTU: case UNORDERED: - /* We have these compares: */ + /* We have these compares. */ cmp_code = code, branch_code = NE; break; @@ -2701,13 +2701,15 @@ alpha_emit_conditional_move (rtx cmp, enum machine_mode mode) switch (code) { case EQ: case LE: case LT: case LEU: case LTU: + case UNORDERED: /* We have these compares. */ cmp_code = code, code = NE; break; case NE: - /* This must be reversed. */ - cmp_code = EQ, code = EQ; + case ORDERED: + /* These must be reversed. */ + cmp_code = reverse_condition (code), code = EQ; break; case GE: case GT: case GEU: case GTU: @@ -2727,6 +2729,14 @@ alpha_emit_conditional_move (rtx cmp, enum machine_mode mode) gcc_unreachable (); } + if (cmp_mode == DImode) + { + if (!reg_or_0_operand (op0, DImode)) + op0 = force_reg (DImode, op0); + if (!reg_or_8bit_operand (op1, DImode)) + op1 = force_reg (DImode, op1); + } + tem = gen_reg_rtx (cmp_mode); emit_insn (gen_rtx_SET (VOIDmode, tem, gen_rtx_fmt_ee (cmp_code, cmp_mode, @@ -2738,6 +2748,14 @@ alpha_emit_conditional_move (rtx cmp, enum machine_mode mode) local_fast_math = 1; } + if (cmp_mode == DImode) + { + if (!reg_or_0_operand (op0, DImode)) + op0 = force_reg (DImode, op0); + if (!reg_or_8bit_operand (op1, DImode)) + op1 = force_reg (DImode, op1); + } + /* We may be able to use a conditional move directly. This avoids emitting spurious compares. */ if (signed_comparison_operator (cmp, VOIDmode) @@ -2756,11 +2774,13 @@ alpha_emit_conditional_move (rtx cmp, enum machine_mode mode) switch (code) { case EQ: case LE: case LT: case LEU: case LTU: + case UNORDERED: /* We have these compares: */ break; case NE: - /* This must be reversed. */ + case ORDERED: + /* These must be reversed. */ code = reverse_condition (code); cmov_code = EQ; break;