From: Jim Wilson Date: Mon, 15 Apr 1996 23:06:00 +0000 (-0700) Subject: (do_store_flag): Before calling exact_log2, remove any X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=21b2a157ce0498394301452f8744bd782078825d;p=gcc.git (do_store_flag): Before calling exact_log2, remove any sign extension bits. From-SVN: r11803 --- diff --git a/gcc/expr.c b/gcc/expr.c index 26fcd36b651..e29b404b69e 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -10558,10 +10558,21 @@ do_store_flag (exp, target, mode, only_cheap) && TYPE_PRECISION (type) <= HOST_BITS_PER_WIDE_INT) { tree inner = TREE_OPERAND (arg0, 0); - int bitnum = exact_log2 (INTVAL (expand_expr (TREE_OPERAND (arg0, 1), - NULL_RTX, VOIDmode, 0))); + HOST_WIDE_INT tem; + int bitnum; int ops_unsignedp; + tem = INTVAL (expand_expr (TREE_OPERAND (arg0, 1), + NULL_RTX, VOIDmode, 0)); + /* In this case, immed_double_const will sign extend the value to make + it look the same on the host and target. We must remove the + sign-extension before calling exact_log2, since exact_log2 will + fail for negative values. */ + if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT + && BITS_PER_WORD == GET_MODE_BITSIZE (TYPE_MODE (type))) + tem = tem & (((HOST_WIDE_INT) 1 << BITS_PER_WORD) - 1); + bitnum = exact_log2 (tem); + /* If INNER is a right shift of a constant and it plus BITNUM does not overflow, adjust BITNUM and INNER. */