diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2008-03-18 17:11:30 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2008-03-18 17:11:30 +0000 |
commit | ac5dc795ad5d0d78956263ddbd525c4bc2a1f7a3 (patch) | |
tree | aeac937fae1469b6f5bd28ff19ae12702dc8fc49 /gcc/expr.c | |
parent | b80280f2c568097c1da9aacd9b540f74ad91cf22 (diff) | |
download | gcc-ac5dc795ad5d0d78956263ddbd525c4bc2a1f7a3.zip gcc-ac5dc795ad5d0d78956263ddbd525c4bc2a1f7a3.tar.gz gcc-ac5dc795ad5d0d78956263ddbd525c4bc2a1f7a3.tar.bz2 |
expr.c (store_expr): Assume lang_hooks.reduce_bit_field_operations is true.
2008-03-18 Paolo Bonzini <bonzini@gnu.org>
* expr.c (store_expr): Assume lang_hooks.reduce_bit_field_operations
is true.
(expand_expr_real_1) <REDUCE_BIT_FIELD>: Don't look at ignore.
(expand_expr_real_1): Assume lang_hooks.reduce_bit_field_operations
is true. Add "&& !ignore" condition to reduce_bit_field. Modify
target after ignore has been set, and move there also the commputation
of subtarget and original_target.
* langhooks-def.h (LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS): Delete.
(LANG_HOOKS_INITIALIZER): Remove it.
* langhooks.h (struct lang_hooks): Remove reduce_bit_field_operations.
ada:
2008-03-18 Paolo Bonzini <bonzini@gnu.org>
* misc.c (LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS): Delete.
cp:
2008-03-18 Paolo Bonzini <bonzini@gnu.org>
* cp-lang.c (LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS): Delete.
From-SVN: r133316
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 36 |
1 files changed, 17 insertions, 19 deletions
@@ -4484,9 +4484,8 @@ store_expr (tree exp, rtx target, int call_param_p, bool nontemporal) converting modes. */ if (INTEGRAL_TYPE_P (TREE_TYPE (exp)) && TREE_TYPE (TREE_TYPE (exp)) == 0 - && (!lang_hooks.reduce_bit_field_operations - || (GET_MODE_PRECISION (GET_MODE (target)) - == TYPE_PRECISION (TREE_TYPE (exp))))) + && GET_MODE_PRECISION (GET_MODE (target)) + == TYPE_PRECISION (TREE_TYPE (exp))) { if (TYPE_UNSIGNED (TREE_TYPE (exp)) != SUBREG_PROMOTED_UNSIGNED_P (target)) @@ -7134,8 +7133,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, rtx subtarget, original_target; int ignore; tree context, subexp0, subexp1; - bool reduce_bit_field = false; -#define REDUCE_BIT_FIELD(expr) (reduce_bit_field && !ignore \ + bool reduce_bit_field; +#define REDUCE_BIT_FIELD(expr) (reduce_bit_field \ ? reduce_to_bit_field_precision ((expr), \ target, \ type) \ @@ -7153,27 +7152,20 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, mode = TYPE_MODE (type); unsignedp = TYPE_UNSIGNED (type); } - if (lang_hooks.reduce_bit_field_operations - && TREE_CODE (type) == INTEGER_TYPE - && GET_MODE_PRECISION (mode) > TYPE_PRECISION (type)) - { - /* An operation in what may be a bit-field type needs the - result to be reduced to the precision of the bit-field type, - which is narrower than that of the type's mode. */ - reduce_bit_field = true; - if (modifier == EXPAND_STACK_PARM) - target = 0; - } - /* Use subtarget as the target for operand 0 of a binary operation. */ - subtarget = get_subtarget (target); - original_target = target; ignore = (target == const0_rtx || ((code == NON_LVALUE_EXPR || code == NOP_EXPR || code == CONVERT_EXPR || code == COND_EXPR || code == VIEW_CONVERT_EXPR) && TREE_CODE (type) == VOID_TYPE)); + /* An operation in what may be a bit-field type needs the + result to be reduced to the precision of the bit-field type, + which is narrower than that of the type's mode. */ + reduce_bit_field = (!ignore + && TREE_CODE (type) == INTEGER_TYPE + && GET_MODE_PRECISION (mode) > TYPE_PRECISION (type)); + /* If we are going to ignore this result, we need only do something if there is a side-effect somewhere in the expression. If there is, short-circuit the most common cases here. Note that we must @@ -7222,6 +7214,12 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, target = 0; } + if (reduce_bit_field && modifier == EXPAND_STACK_PARM) + target = 0; + + /* Use subtarget as the target for operand 0 of a binary operation. */ + subtarget = get_subtarget (target); + original_target = target; switch (code) { |