From: Richard Guenther <rguenther@suse.de>
To: Eric Botcazou <ebotcazou@adacore.com>
Cc: gcc-patches@gcc.gnu.org
Subject: Re: [PATCH] Cleanup expand_shift
Date: Thu, 05 May 2011 12:38:00 -0000 [thread overview]
Message-ID: <alpine.LNX.2.00.1105051426110.810@zhemvz.fhfr.qr> (raw)
In-Reply-To: <alpine.LNX.2.00.1105041807550.810@zhemvz.fhfr.qr>
On Wed, 4 May 2011, Richard Guenther wrote:
> On Wed, 4 May 2011, Eric Botcazou wrote:
>
> > > I think I did it that way because the old code tried to re-construct
> > > the type of the original amount. I can surely simply use op1 here
> > > if that is preferred.
> >
> > Right, but it used the value of OP1 so I think the new code should as well.
>
> Ok, I'll change it that way.
>
> > > Btw, do you happen to know any target that would excercise this code
> > > choosing from x86, ppc, s390 and ia64?
> >
> > All have rotate instructions so this seems to be a wash.
>
> Hm. I guess people will scream if something breaks (I can't imagine
> what though).
I have applied the following after re-bootstrapping and testing on
x86_64-unknown-linux-gnu and re-checking the mipsel cross testcase.
Richard.
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.
Index: gcc/expmed.c
===================================================================
*** gcc/expmed.c.orig 2011-05-04 11:07:08.000000000 +0200
--- gcc/expmed.c 2011-05-04 17:54:27.000000000 +0200
*************** expand_dec (rtx target, rtx dec)
*** 2032,2045 ****
\f
/* 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)
{
rtx op1, temp = 0;
int left = (code == LSHIFT_EXPR || code == LROTATE_EXPR);
--- 2032,2045 ----
\f
/* Output a shift instruction for expression code CODE,
with SHIFTED being the rtx for the value to shift,
! 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. */
! 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);
*************** expand_variable_shift (enum tree_code co
*** 2053,2059 ****
int attempt;
bool speed = optimize_insn_for_speed_p ();
! op1 = expand_normal (amount);
op1_mode = GET_MODE (op1);
/* Determine whether the shift/rotate amount is a vector, or scalar. If the
--- 2053,2059 ----
int attempt;
bool speed = optimize_insn_for_speed_p ();
! op1 = amount;
op1_mode = GET_MODE (op1);
/* Determine whether the shift/rotate amount is a vector, or scalar. If the
*************** expand_variable_shift (enum tree_code co
*** 2138,2162 ****
code below. */
rtx subtarget = target == shifted ? 0 : target;
! tree 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);
other_amount
! = fold_build2 (MINUS_EXPR, type,
! build_int_cst (type, GET_MODE_BITSIZE (mode)),
! new_amount);
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);
return expand_binop (mode, ior_optab, temp, temp1, target,
unsignedp, methods);
}
--- 2138,2159 ----
code below. */
rtx subtarget = target == shifted ? 0 : target;
! rtx new_amount, other_amount;
rtx temp1;
!
! new_amount = op1;
other_amount
! = simplify_gen_binary (MINUS, GET_MODE (op1),
! GEN_INT (GET_MODE_BITSIZE (mode)),
! op1);
shifted = force_reg (mode, shifted);
! 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);
}
*************** rtx
*** 2211,2222 ****
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);
}
\f
/* Indicates the type of fixup needed after a constant multiplication.
BASIC_VARIANT means no fixup is needed, NEGATE_VARIANT means that
--- 2208,2232 ----
expand_shift (enum tree_code code, enum machine_mode mode, rtx shifted,
int amount, rtx target, int 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);
+ }
+
\f
/* Indicates the type of fixup needed after a constant multiplication.
BASIC_VARIANT means no fixup is needed, NEGATE_VARIANT means that
next prev parent reply other threads:[~2011-05-05 12:27 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-03 14:42 Richard Guenther
2011-05-04 15:34 ` Eric Botcazou
2011-05-04 15:43 ` Richard Guenther
2011-05-04 16:09 ` Eric Botcazou
2011-05-04 16:10 ` Richard Guenther
2011-05-05 12:38 ` Richard Guenther [this message]
2011-05-06 4:50 ` Hans-Peter Nilsson
2011-05-06 9:39 ` Richard Guenther
2011-05-06 21:52 ` Eric Botcazou
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.LNX.2.00.1105051426110.810@zhemvz.fhfr.qr \
--to=rguenther@suse.de \
--cc=ebotcazou@adacore.com \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).