diff options
author | Richard Guenther <rguenther@suse.de> | 2011-05-05 12:26:05 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-05-05 12:26:05 +0000 |
commit | 86529a49175747a5d94ba95711e8850aad94f3b4 (patch) | |
tree | 6b5bb7c4ab2054ee711a211d7aa6d4c9fccd5e05 /gcc/expmed.c | |
parent | 82357998ddcc01654e9c542de84af98ec23d1bf5 (diff) | |
download | gcc-86529a49175747a5d94ba95711e8850aad94f3b4.zip gcc-86529a49175747a5d94ba95711e8850aad94f3b4.tar.gz gcc-86529a49175747a5d94ba95711e8850aad94f3b4.tar.bz2 |
expmed.c (expand_variable_shift): Rename to ...
2011-05-05 Richard Guenther <rguenther@suse.de>
* expmed.c (expand_variable_shift): Rename to ...
(expand_shift_1): ... this. Take an expanded shift amount.
For rotates recurse directly not building trees for the shift amount.
(expand_variable_shift): Wrap around expand_shift_1.
(expand_shift): Adjust.
From-SVN: r173428
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r-- | gcc/expmed.c | 58 |
1 files changed, 34 insertions, 24 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c index 7482747..4e1ea3a 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -2032,14 +2032,14 @@ expand_dec (rtx target, rtx dec) /* Output a shift instruction for expression code CODE, with SHIFTED being the rtx for the value to shift, - and AMOUNT the tree for the amount to shift by. + and AMOUNT the rtx for the amount to shift by. Store the result in the rtx TARGET, if that is convenient. If UNSIGNEDP is nonzero, do a logical shift; otherwise, arithmetic. Return the rtx for where the value is. */ -rtx -expand_variable_shift (enum tree_code code, enum machine_mode mode, rtx shifted, - tree amount, rtx target, int unsignedp) +static rtx +expand_shift_1 (enum tree_code code, enum machine_mode mode, rtx shifted, + rtx amount, rtx target, int unsignedp) { rtx op1, temp = 0; int left = (code == LSHIFT_EXPR || code == LROTATE_EXPR); @@ -2053,7 +2053,7 @@ expand_variable_shift (enum tree_code code, enum machine_mode mode, rtx shifted, int attempt; bool speed = optimize_insn_for_speed_p (); - op1 = expand_normal (amount); + op1 = amount; op1_mode = GET_MODE (op1); /* Determine whether the shift/rotate amount is a vector, or scalar. If the @@ -2138,25 +2138,22 @@ expand_variable_shift (enum tree_code code, enum machine_mode mode, rtx shifted, code below. */ rtx subtarget = target == shifted ? 0 : target; - tree new_amount, other_amount; + rtx new_amount, other_amount; rtx temp1; - tree type = TREE_TYPE (amount); - if (GET_MODE (op1) != TYPE_MODE (type) - && GET_MODE (op1) != VOIDmode) - op1 = convert_to_mode (TYPE_MODE (type), op1, 1); - new_amount = make_tree (type, op1); + + new_amount = op1; other_amount - = fold_build2 (MINUS_EXPR, type, - build_int_cst (type, GET_MODE_BITSIZE (mode)), - new_amount); + = simplify_gen_binary (MINUS, GET_MODE (op1), + GEN_INT (GET_MODE_BITSIZE (mode)), + op1); shifted = force_reg (mode, shifted); - temp = expand_variable_shift (left ? LSHIFT_EXPR : RSHIFT_EXPR, - mode, shifted, new_amount, 0, 1); - temp1 = expand_variable_shift (left ? RSHIFT_EXPR : LSHIFT_EXPR, - mode, shifted, other_amount, - subtarget, 1); + temp = expand_shift_1 (left ? LSHIFT_EXPR : RSHIFT_EXPR, + mode, shifted, new_amount, 0, 1); + temp1 = expand_shift_1 (left ? RSHIFT_EXPR : LSHIFT_EXPR, + mode, shifted, other_amount, + subtarget, 1); return expand_binop (mode, ior_optab, temp, temp1, target, unsignedp, methods); } @@ -2211,12 +2208,25 @@ rtx expand_shift (enum tree_code code, enum machine_mode mode, rtx shifted, int amount, rtx target, int unsignedp) { - /* ??? With re-writing expand_shift we could avoid going through a - tree for the shift amount and directly do GEN_INT (amount). */ - return expand_variable_shift (code, mode, shifted, - build_int_cst (integer_type_node, amount), - target, unsignedp); + return expand_shift_1 (code, mode, + shifted, GEN_INT (amount), target, unsignedp); +} + +/* Output a shift instruction for expression code CODE, + with SHIFTED being the rtx for the value to shift, + and AMOUNT the tree for the amount to shift by. + Store the result in the rtx TARGET, if that is convenient. + If UNSIGNEDP is nonzero, do a logical shift; otherwise, arithmetic. + Return the rtx for where the value is. */ + +rtx +expand_variable_shift (enum tree_code code, enum machine_mode mode, rtx shifted, + tree amount, rtx target, int unsignedp) +{ + return expand_shift_1 (code, mode, + shifted, expand_normal (amount), target, unsignedp); } + /* Indicates the type of fixup needed after a constant multiplication. BASIC_VARIANT means no fixup is needed, NEGATE_VARIANT means that |