https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97445
--- Comment #40 from Christophe Leroy <christophe.leroy at csgroup dot eu> ---
(In reply to Jakub Jelinek from comment #39)
> (In reply to Christophe Leroy from comment #38)
> > But on powerpc that's already the case and it doesn't solve the issue.
> >
> > static inline int fls(unsigned int x)
> > {
> > return 32 - __builtin_clz(x);
> > }
> >
> > static inline int fls64(__u64 x)
> > {
> > return 64 - __builtin_clzll(x);
> > }
>
> That is clearly a kernel bug (__builtin_clz* is documented undefined for 0,
> while fls* wants to be well defined there), and shouldn't change anything,
> because
> in the if (__builtin_constant_p (size))
> case get_order doesn't use fls*, but ilog2. And it is ilog2 that should be
> changed.
What's the bug ?
int f(int x)
{
return __builtin_clz(x);
}
Compiles into
<f>:
cntlzw r3, r3
blr
Powerpc 32 bits documentation says:
cntlzw : Count Leading Zeros Word
A count of the number of consecutive zero bits starting at bit 0 of rS is
placed into rA. This number ranges from 0 to 32, inclusive.
I can't see a problem when x == 0