aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2004-11-30 00:01:45 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2004-11-29 19:01:45 -0500
commit7acda5525160854c90dc9661f31b6684991b9721 (patch)
treedfbf6f2ea293600c13665faeb6960583e8f04567 /gcc/expr.c
parent0d0a0935545f258cd934235e5fc4dba4a21f242b (diff)
downloadgcc-7acda5525160854c90dc9661f31b6684991b9721.zip
gcc-7acda5525160854c90dc9661f31b6684991b9721.tar.gz
gcc-7acda5525160854c90dc9661f31b6684991b9721.tar.bz2
expr.c (expand_expr_real_1, [...]): Properly handle REDUCE_BIT_FIELD by applying it to result, not input, of conversion.
* expr.c (expand_expr_real_1, case NOP_EXPR): Properly handle REDUCE_BIT_FIELD by applying it to result, not input, of conversion. From-SVN: r91498
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 122c3e1..ec44ce3 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -7241,36 +7241,39 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
}
op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, modifier);
- op0 = REDUCE_BIT_FIELD (op0);
if (GET_MODE (op0) == mode)
- return op0;
+ ;
/* If OP0 is a constant, just convert it into the proper mode. */
- if (CONSTANT_P (op0))
+ else if (CONSTANT_P (op0))
{
tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
enum machine_mode inner_mode = TYPE_MODE (inner_type);
if (modifier == EXPAND_INITIALIZER)
- return simplify_gen_subreg (mode, op0, inner_mode,
- subreg_lowpart_offset (mode,
- inner_mode));
+ op0 = simplify_gen_subreg (mode, op0, inner_mode,
+ subreg_lowpart_offset (mode,
+ inner_mode));
else
- return convert_modes (mode, inner_mode, op0,
- TYPE_UNSIGNED (inner_type));
+ op0= convert_modes (mode, inner_mode, op0,
+ TYPE_UNSIGNED (inner_type));
}
- if (modifier == EXPAND_INITIALIZER)
- return gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, mode, op0);
+ else if (modifier == EXPAND_INITIALIZER)
+ op0 = gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, mode, op0);
- if (target == 0)
- return
- convert_to_mode (mode, op0,
- TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
+ else if (target == 0)
+ op0 = convert_to_mode (mode, op0,
+ TYPE_UNSIGNED (TREE_TYPE
+ (TREE_OPERAND (exp, 0))));
else
- convert_move (target, op0,
- TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
- return target;
+ {
+ convert_move (target, op0,
+ TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
+ op0 = target;
+ }
+
+ return REDUCE_BIT_FIELD (op0);
case VIEW_CONVERT_EXPR:
op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, modifier);