[Mesa-dev] [PATCH] Replace byte-swapping code with builtins in pack.c
Matt Turner
mattst88 at gmail.com
Wed Oct 4 03:59:29 UTC 2017
On Tue, Oct 3, 2017 at 11:01 AM, Jochen Rollwagen <joro-2013 at t-online.de> wrote:
> From 4cebe50a9bade6717923e104c954f3fad75f71bb Mon Sep 17 00:00:00 2001
> From: Jochen Rollwagen <joro-2013 at t-online.de>
> Date: Tue, 3 Oct 2017 19:54:10 +0200
> Subject: [PATCH] Replace byte-swapping code with builtins in pack.c
>
> This patch replaces some code for byte-swapping in pack.c with the builtin
> functions allowing the compiler to do its optimization magic
> ---
> src/mesa/main/pack.c | 22 ++--------------------
> 1 file changed, 2 insertions(+), 20 deletions(-)
>
> diff --git a/src/mesa/main/pack.c b/src/mesa/main/pack.c
> index 94a6d28..9bfde39 100644
> --- a/src/mesa/main/pack.c
> +++ b/src/mesa/main/pack.c
> @@ -230,26 +230,8 @@ _mesa_pack_bitmap( GLint width, GLint height, const
> GLubyte
> *source,
> }
> }
>
> -
> -#define SWAP2BYTE(VALUE) \
> - { \
> - GLubyte *bytes = (GLubyte *) &(VALUE); \
> - GLubyte tmp = bytes[0]; \
> - bytes[0] = bytes[1]; \
> - bytes[1] = tmp; \
> - }
> -
> -#define SWAP4BYTE(VALUE) \
> - { \
> - GLubyte *bytes = (GLubyte *) &(VALUE); \
> - GLubyte tmp = bytes[0]; \
> - bytes[0] = bytes[3]; \
> - bytes[3] = tmp; \
> - tmp = bytes[1]; \
> - bytes[1] = bytes[2]; \
> - bytes[2] = tmp; \
> - }
> -
> +#define SWAP2BYTE(VALUE) __builtin_bswap16(VALUE)
> +#define SWAP4BYTE(VALUE) __builtin_bswap32(VALUE)
In my experience it's much simpler to just write these as
return ((x & 0xff) << 8) | ((x >> 8) & 0xff);
and
return ((x & 0xff) << 24) |
((x & 0xff00) << 8) |
((x & 0xff0000) >> 8) |
((x >> 24) & 0xff);
and not have to deal with compiler intrinsics. Compilers will
recognize these patterns and use the appropriate instructions (rol for
2-bytes and bswap for 4-bytes).
You should be able to count the numbers of those instructions before
and after such a patch to confirm it's working as expected.
More information about the mesa-dev
mailing list