Date: Mon, 1 Feb 2021 05:02:46 GMT From: Mateusz Guzik <mjg@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: e6ff6154d203 - main - x86: use compiler intrinsics for bswap* Message-ID: <202102010502.11152kNF099033@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by mjg: URL: https://cgit.FreeBSD.org/src/commit/?id=e6ff6154d2034c13f3d0da73c1e00d69fdb36516 commit e6ff6154d2034c13f3d0da73c1e00d69fdb36516 Author: Mateusz Guzik <mjg@FreeBSD.org> AuthorDate: 2021-02-01 03:00:13 +0000 Commit: Mateusz Guzik <mjg@FreeBSD.org> CommitDate: 2021-02-01 04:53:23 +0000 x86: use compiler intrinsics for bswap* --- sys/x86/include/endian.h | 62 +++--------------------------------------------- 1 file changed, 3 insertions(+), 59 deletions(-) diff --git a/sys/x86/include/endian.h b/sys/x86/include/endian.h index 9c39f4fddf80..18d52fb8a6fa 100644 --- a/sys/x86/include/endian.h +++ b/sys/x86/include/endian.h @@ -65,65 +65,9 @@ #define BYTE_ORDER _BYTE_ORDER #endif -#define __bswap16_gen(x) (__uint16_t)((x) << 8 | (x) >> 8) -#define __bswap32_gen(x) \ - (((__uint32_t)__bswap16((x) & 0xffff) << 16) | __bswap16((x) >> 16)) -#define __bswap64_gen(x) \ - (((__uint64_t)__bswap32((x) & 0xffffffff) << 32) | __bswap32((x) >> 32)) - -#ifdef __GNUCLIKE_BUILTIN_CONSTANT_P -#define __bswap16(x) \ - ((__uint16_t)(__builtin_constant_p(x) ? \ - __bswap16_gen((__uint16_t)(x)) : __bswap16_var(x))) -#define __bswap32(x) \ - (__builtin_constant_p(x) ? \ - __bswap32_gen((__uint32_t)(x)) : __bswap32_var(x)) -#define __bswap64(x) \ - (__builtin_constant_p(x) ? \ - __bswap64_gen((__uint64_t)(x)) : __bswap64_var(x)) -#else -/* XXX these are broken for use in static initializers. */ -#define __bswap16(x) __bswap16_var(x) -#define __bswap32(x) __bswap32_var(x) -#define __bswap64(x) __bswap64_var(x) -#endif - -/* These are defined as functions to avoid multiple evaluation of x. */ - -static __inline __uint16_t -__bswap16_var(__uint16_t _x) -{ - - return (__bswap16_gen(_x)); -} - -static __inline __uint32_t -__bswap32_var(__uint32_t _x) -{ - -#ifdef __GNUCLIKE_ASM - __asm("bswap %0" : "+r" (_x)); - return (_x); -#else - return (__bswap32_gen(_x)); -#endif -} - -static __inline __uint64_t -__bswap64_var(__uint64_t _x) -{ - -#if defined(__amd64__) && defined(__GNUCLIKE_ASM) - __asm("bswap %0" : "+r" (_x)); - return (_x); -#else - /* - * It is important for the optimizations that the following is not - * really generic, but expands to 2 __bswap32_var()'s. - */ - return (__bswap64_gen(_x)); -#endif -} +#define __bswap16(x) __builtin_bswap16(x) +#define __bswap32(x) __builtin_bswap32(x) +#define __bswap64(x) __builtin_bswap64(x) #define __htonl(x) __bswap32(x) #define __htons(x) __bswap16(x)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202102010502.11152kNF099033>