This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: RFC: using clz for comparing to zero on the tree level.
- From: Andrew Pinski <pinskia at physics dot uc dot edu>
- To: Richard dot Earnshaw at arm dot com
- Cc: Andrew Pinski <pinskia at physics dot uc dot edu>, Richard Henderson <rth at redhat dot com>, David Edelsohn <dje at watson dot ibm dot com>, gcc at gcc dot gnu dot org
- Date: Fri, 9 May 2003 10:46:17 -0400
- Subject: Re: RFC: using clz for comparing to zero on the tree level.
In the case I mainly was considering was x==0||y==0, where on PPC (and
mostly likely on ARM) the asm with clz would be shorter and faster,
PPC:
cntlzw tmp1,x
cntlzw tmp2,y
or tmp3,tmp1,temp2
srwi out, tmp3, 5
PPC (old way):
subfic tmp1, x, 0
adde tmp2, tmp1, x
subfic tmp4, x, 0
adde tmp3, tmp4, x
or out, tmp3, tmp1
See that in the way that I am proposing it takes only 4 instructions
instead of the current 5.
(in arm it will mostly do the same).
I think I have a patch for the rs6000 machine description that changes
seq to do the expand (I have bootstrapped on ppc-darwin), the only
problem is that it produces slower code for (i==0)+a ().
Thanks,
Andrew Pinski
On Friday, May 9, 2003, at 10:27 US/Eastern, Richard Earnshaw wrote:
On Thu, May 08, 2003 at 12:36:35PM -0400, David Edelsohn wrote:
Not Alpha and not ARM V5, which have single instruction clz?
PPC:
cntlz tmp, in
srwi out, tmp, 5
Alpha:
cmpeq in, 0, out
ARM:
cmp in, #0
movne out, #0
moveq out, #1
Hmm, so it might be a win for ARM. You'll have to work out
with Richard Earnshaw how you want to arrange these costs.
At the moment arm_rtx_costs doesn't tell you that the SEQ
operation takes 3 instructions.
for an seq expander the shortest (though not necessarily fastest)
sequence
on ARMv5 would be
clz t1, in
mov out, t1, lsr #5
But that's probably best left as a back-end expansion of the canonical
RTL:
(set (out) (eq (in) (const_int 0)))
which can be expanded after reload with a split pattern.
R.