aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2009-07-01 12:05:56 +0000
committerPaolo Bonzini <bonzini@gcc.gnu.org>2009-07-01 12:05:56 +0000
commit1ed20a40b8d4d65764e15cba77f33647a1c81597 (patch)
tree3cccf1dc8f8c8cbf2f3fa48998ad51dcb56a3e5d /gcc
parentce3aea3586776ef0f7a1cb4fd4db01ee472068c4 (diff)
downloadgcc-1ed20a40b8d4d65764e15cba77f33647a1c81597.zip
gcc-1ed20a40b8d4d65764e15cba77f33647a1c81597.tar.gz
gcc-1ed20a40b8d4d65764e15cba77f33647a1c81597.tar.bz2
re PR bootstrap/40597 (Powerpc bootstrap is broken due to changes in expmed.c)
2009-07-01 Paolo Bonzini <bonzini@gnu.org> PR bootstrap/40597 * expmed.c (emit_store_flag): Perform a conversion if necessary, after reducing a DImode cstore to SImode. From-SVN: r149137
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expmed.c32
2 files changed, 29 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5e0e00d..6891178 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2009-07-01 Paolo Bonzini <bonzini@gnu.org>
+ PR bootstrap/40597
+ * expmed.c (emit_store_flag): Perform a conversion if necessary,
+ after reducing a DImode cstore to SImode.
+
+2009-07-01 Paolo Bonzini <bonzini@gnu.org>
+
* expr.c (expand_expr_real_1): Reinstate fallthrough to
TRUTH_ANDIF_EXPR if do_store_flag returns NULL.
diff --git a/gcc/expmed.c b/gcc/expmed.c
index b10ad1b..3f94ac7 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -5295,19 +5295,19 @@ emit_store_flag_1 (rtx target, enum rtx_code code, rtx op0, rtx op1,
if ((code == EQ || code == NE)
&& (op1 == const0_rtx || op1 == constm1_rtx))
{
- rtx op00, op01, op0both;
+ rtx op00, op01;
/* Do a logical OR or AND of the two words and compare the
result. */
op00 = simplify_gen_subreg (word_mode, op0, mode, 0);
op01 = simplify_gen_subreg (word_mode, op0, mode, UNITS_PER_WORD);
- op0both = expand_binop (word_mode,
- op1 == const0_rtx ? ior_optab : and_optab,
- op00, op01, NULL_RTX, unsignedp,
- OPTAB_DIRECT);
+ tem = expand_binop (word_mode,
+ op1 == const0_rtx ? ior_optab : and_optab,
+ op00, op01, NULL_RTX, unsignedp,
+ OPTAB_DIRECT);
- if (op0both != 0)
- return emit_store_flag (target, code, op0both, op1, word_mode,
+ if (tem != 0)
+ tem = emit_store_flag (NULL_RTX, code, tem, op1, word_mode,
unsignedp, normalizep);
}
else if ((code == LT || code == GE) && op1 == const0_rtx)
@@ -5318,8 +5318,22 @@ emit_store_flag_1 (rtx target, enum rtx_code code, rtx op0, rtx op1,
op0h = simplify_gen_subreg (word_mode, op0, mode,
subreg_highpart_offset (word_mode,
mode));
- return emit_store_flag (target, code, op0h, op1, word_mode,
- unsignedp, normalizep);
+ tem = emit_store_flag (NULL_RTX, code, op0h, op1, word_mode,
+ unsignedp, normalizep);
+ }
+ else
+ tem = NULL_RTX;
+
+ if (tem)
+ {
+ if (target_mode == VOIDmode)
+ return tem;
+
+ convert_move (target, tem,
+ 0 == (STORE_FLAG_VALUE
+ & ((HOST_WIDE_INT) 1
+ << (GET_MODE_BITSIZE (word_mode) -1))));
+ return target;
}
}