diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2011-03-06 19:52:43 +0100 |
---|---|---|
committer | Andreas Schwab <schwab@linux-m68k.org> | 2011-03-06 19:52:43 +0100 |
commit | fb3ed187478b4dfbf57c027e37354fb91e97e885 (patch) | |
tree | a67337377b3c543edd70d153e3d6fca31f748c20 /sysdeps/m68k | |
parent | 3447f0d785a18f1fc8efefefb0d22bd917044379 (diff) | |
download | glibc-fb3ed187478b4dfbf57c027e37354fb91e97e885.zip glibc-fb3ed187478b4dfbf57c027e37354fb91e97e885.tar.gz glibc-fb3ed187478b4dfbf57c027e37354fb91e97e885.tar.bz2 |
m68k: reimplement byteswap macros as inlines
Diffstat (limited to 'sysdeps/m68k')
-rw-r--r-- | sysdeps/m68k/bits/byteswap.h | 54 |
1 files changed, 21 insertions, 33 deletions
diff --git a/sysdeps/m68k/bits/byteswap.h b/sysdeps/m68k/bits/byteswap.h index a2546c9..4f31d95 100644 --- a/sysdeps/m68k/bits/byteswap.h +++ b/sysdeps/m68k/bits/byteswap.h @@ -1,5 +1,5 @@ /* Macros to swap the order of bytes in integer values. m68k version. - Copyright (C) 1997, 2002, 2008 Free Software Foundation, Inc. + Copyright (C) 1997, 2002, 2008, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -30,36 +30,29 @@ #define __bswap_constant_16(x) \ ((((x) >> 8) & 0xffu) | (((x) & 0xffu) << 8)) -#ifdef __GNUC__ -# define __bswap_16(x) \ - (__extension__ \ - ({ unsigned short int __bsx = (x); __bswap_constant_16 (__bsx); })) -#else static __inline unsigned short int __bswap_16 (unsigned short int __bsx) { return __bswap_constant_16 (__bsx); } -#endif /* Swap bytes in 32 bit value. */ #define __bswap_constant_32(x) \ ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) | \ (((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24)) -#if defined __GNUC__ && __GNUC__ >= 2 && !defined(__mcoldfire__) -# define __bswap_32(x) \ - __extension__ \ - ({ unsigned int __bswap_32_v; \ - if (__builtin_constant_p (x)) \ - __bswap_32_v = __bswap_constant_32 (x); \ - else \ - __asm__ __volatile__ ("ror%.w %#8, %0;" \ - "swap %0;" \ - "ror%.w %#8, %0" \ - : "=d" (__bswap_32_v) \ - : "0" ((unsigned int) (x))); \ - __bswap_32_v; }) +#if !defined(__mcoldfire__) +static __inline unsigned int +__bswap_32 (unsigned int __bsx) +{ + if (__builtin_constant_p (__bsx)) + return __bswap_constant_32 (__bsx); + __asm__ __volatile__ ("ror%.w %#8, %0;" + "swap %0;" + "ror%.w %#8, %0" + : "+d" (__bsx)); + return __bsx; +} #else static __inline unsigned int __bswap_32 (unsigned int __bsx) @@ -81,19 +74,14 @@ __bswap_32 (unsigned int __bsx) | (((x) & 0x00000000000000ffull) << 56)) /* Swap bytes in 64 bit value. */ -# define __bswap_64(x) \ - __extension__ \ - ({ union { unsigned long long int __ll; \ - unsigned long int __l[2]; } __bswap_64_v, __bswap_64_r; \ - if (__builtin_constant_p (x)) \ - __bswap_64_r.__ll = __bswap_constant_64 (x); \ - else \ - { \ - __bswap_64_v.__ll = (x); \ - __bswap_64_r.__l[0] = __bswap_32 (__bswap_64_v.__l[1]); \ - __bswap_64_r.__l[1] = __bswap_32 (__bswap_64_v.__l[0]); \ - } \ - __bswap_64_r.__ll; }) +static __inline unsigned long long +__bswap_64 (unsigned long long __bsx) +{ + if (__builtin_constant_p (__bsx)) + return __bswap_constant_64 (__bsx); + return (__bswap_32 (__bsx >> 32) + | ((unsigned long long) __bswap_32 (__bsx) << 32)); +} #endif #endif /* _BITS_BYTESWAP_H */ |