From 7d4098a0ee68dd4dd19c6126b850a79d672f2ad5 Mon Sep 17 00:00:00 2001 From: bonzini Date: Wed, 1 Jul 2009 12:05:56 +0000 Subject: [PATCH] 2009-07-01 Paolo Bonzini PR bootstrap/40597 * expmed.c (emit_store_flag): Perform a conversion if necessary, after reducing a DImode cstore to SImode. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@149137 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/expmed.c | 32 +++++++++++++++++++++++--------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e0e00d94c3..68911788d79 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2009-07-01 Paolo Bonzini + 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 + * 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 b10ad1baea8..3f94ac779b9 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; } } -- 2.11.4.GIT