[PATCH v2 9/10] Tilera (and Linux asm-generic) support for glibc

Chris Metcalf cmetcalf@tilera.com
Fri Nov 11 20:42:00 GMT 2011


On 11/11/2011 3:17 PM, Andrew Pinski wrote:
> On Fri, Nov 11, 2011 at 12:13 PM, Chris Metcalf<cmetcalf@tilera.com>  wrote:
>> I'm cc'ing the gcc mailing list with this reply, so if someone there
>> can provide an authoritative statement, that would be great.  It looks
>> like right now the i386/x86_64, ia64, and s390 architecture don't use
>> this header anyway, so it's less important for them.  But powerpc and
>> sparc do use the header (in the core glibc), and most of the
>> architectures in the "ports" part of glibc do as well.
>>
>> Roland, Joseph, if we don't hear something definitive from the gcc
>> folks, I'm inclined to revert this piece back to what I had in the v1
>> patch, where I provide a tile-specific byteswap.h using
>> __builtin_bswapNN(), so our gcc 4.4 will generate good code.
> Right now it does not emit good code for MIPS 32/64 R2.  Though I have
> patches to emit better code for that target.
In retrospect, I guess the right question is not whether it produces
bad code per se, but whether it produces worse code than for the
standard generic byteswap.h:

#define __bswap_16(x) \
      ((((x)>>  8)&  0xff) | (((x)&  0xff)<<  8))

#define __bswap_32(x) \
      ((((x)&  0xff000000)>>  24) | (((x)&  0x00ff0000)>>   8) |               \
       (((x)&  0x0000ff00)<<   8) | (((x)&  0x000000ff)<<  24))

#define __bswap_64(x) \
      ((((x)&  0xff00000000000000ull)>>  56)                                   \
       | (((x)&  0x00ff000000000000ull)>>  40)                                 \
       | (((x)&  0x0000ff0000000000ull)>>  24)                                 \
       | (((x)&  0x000000ff00000000ull)>>  8)                                  \
       | (((x)&  0x00000000ff000000ull)<<  8)                                  \
       | (((x)&  0x0000000000ff0000ull)<<  24)                                 \
       | (((x)&  0x000000000000ff00ull)<<  40)                                 \
       | (((x)&  0x00000000000000ffull)<<  56))

(The 16-bit swap would be done via __builtin_bswap32(x)>>  16.)
If it's no worse for any platform, and better for some, that's
probably sufficient reason to make the change in glibc to use it.

-- 
Chris Metcalf, Tilera Corp.
http://www.tilera.com



More information about the Libc-alpha mailing list