On Fri, Oct 27, 2000 at 09:49:57PM +1100, Bruce Evans wrote: [...] > > NetBSD supports the ntohl family on constants, but only on some arches > (at least in last year's version). It takes fancier macros to support > constants. This gives an excuse to change the inline functions back to > macros :-). > Cool! My upcoming byte-swapping changes to IPv4 code would benefit from having these macros. Could you please review the attached patch (it was obtained from NetBSD)? <PS> BTW, converting from macros to inline functions slightly broke the things. It is currently impossible to simply include the <machine/endian.h>, since it now depends on <sys/inttypes.h>. </PS> -- Ruslan Ermilov Oracle Developer/DBA, [EMAIL PROTECTED] Sunbay Software AG, [EMAIL PROTECTED] FreeBSD committer, +380.652.512.251 Simferopol, Ukraine http://www.FreeBSD.org The Power To Serve http://www.oracle.com Enabling The Information Age
Index: endian.h =================================================================== RCS file: /home/ncvs/src/sys/i386/include/endian.h,v retrieving revision 1.21 diff -u -p -r1.21 endian.h --- endian.h 2000/10/16 17:06:48 1.21 +++ endian.h 2000/10/27 13:03:55 @@ -69,7 +69,7 @@ __END_DECLS #ifdef __GNUC__ static __inline uint32_t -__uint16_swap_uint32(uint32_t __x) +__uint16_swap_uint32_variable(uint32_t __x) { __asm ("rorl $16, %1" : "=r" (__x) : "0" (__x)); @@ -77,7 +77,7 @@ __uint16_swap_uint32(uint32_t __x) } static __inline uint32_t -__uint8_swap_uint32(uint32_t __x) +__uint8_swap_uint32_variable(uint32_t __x) { #if defined(_KERNEL) && (defined(I486_CPU) || defined(I586_CPU) || defined(I686_CPU)) && !defined(I386_CPU) __asm ("bswap %0" : "=r" (__x) : "0" (__x)); @@ -89,12 +89,36 @@ __uint8_swap_uint32(uint32_t __x) } static __inline uint16_t -__uint8_swap_uint16(uint16_t __x) +__uint8_swap_uint16_variable(uint16_t __x) { __asm ("xchgb %h1, %b1" : "=q" (__x) : "0" (__x)); return __x; } + +#ifdef __OPTIMIZE__ + +#define __uint8_swap_uint32_constant(x) \ + ((((x) & 0xff000000) >> 24) | \ + (((x) & 0x00ff0000) >> 8) | \ + (((x) & 0x0000ff00) << 8) | \ + (((x) & 0x000000ff) << 24)) +#define __uint8_swap_uint16_constant(x) \ + ((((x) & 0xff00) >> 8) | \ + (((x) & 0x00ff) << 8)) +#define __uint8_swap_uint32(x) \ + (__builtin_constant_p((x)) ? \ + __uint8_swap_uint32_constant(x) : __uint8_swap_uint32_variable(x)) +#define __uint8_swap_uint16(x) \ + (__builtin_constant_p((x)) ? \ + __uint8_swap_uint16_constant(x) : __uint8_swap_uint16_variable(x)) + +#else /* __OPTIMIZE__ */ + +#define __uint8_swap_uint32(x) __uint8_swap_uint32_variable(x) +#define __uint8_swap_uint16(x) __uint8_swap_uint16_variable(x) + +#endif /* __OPTIMIZE__ */ /* * Macros for network/external number representation conversion.