This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH 10/11] hppa: Add haszero.h and whichzero.h
On 12/19/2016 06:54 AM, Adhemerval Zanella wrote:
>> +static inline unsigned long int
>> +haszero(unsigned long int x)
>> +{
>> +#if __GNUC_PREREQ(4, 5)
>> + /* It's more useful to expose a control transfer to the compiler
>> + than to expose a proper boolean result. */
>> + if (sizeof(x) == 8)
>> + asm goto ("uxor,*sbz %%r0,%0,%%r0\n\tb,n %l1" : : "r"(x) : : nbz);
>> + else
>> + asm goto ("uxor,sbz %%r0,%0,%%r0\n\tb,n %l1" : : "r"(x) : : nbz);
>> + return 1;
>> + nbz:
>> + return 0;
>> +#else
>
> Since current GLIBC requires GCC 4.7 as minimum compiler I think we
> can get rid of snippets for old compilers. Same for the other
> override functios.
Ah good. I'd meant to go back and look for the minimum required gcc.
>> + /* Since we have no clz insn, direct tests of the bytes is faster
>> + than loading up the constants to do the masking. */
>> + asm ("extrw,u,= %1,23,8,%%r0\n\t"
>> + "extrw,u,<> %2,23,8,%%r0\n\t"
>> + "ldi 2,%0\n\t"
>> + "extrw,u,= %1,15,8,%%r0\n\t"
>> + "extrw,u,<> %2,15,8,%%r0\n\t"
>> + "ldi 1,%0\n\t"
>> + "extrw,u,= %1,7,8,%%r0\n\t"
>> + "extrw,u,<> %2,7,8,%%r0\n\t"
>> + "ldi 0,%0"
>> + : "=r"(ret) : "r"(x1), "r"(x2), "0"(3));
>> +
>> + return ret;
>> +}
>> +
>> +#endif /* whichzero.h */
>
> I am far from a hppa expert, but can't we code the same snippet in C? How
> bad would it be compared to this optimized asm?
The compiler is not great at this. It only attempts nullification on
comparisons (not directly as a result of an operation like extract), and it
never attempts double nullification as above.
So for whichzero gcc will use 10 insns instead of my 7; for whichzero2 gcc will
use 19 insns instead of my 10.
r~