[Mesa-dev] [PATCH] Replace byte-swapping code with builtins in pack.c

Dylan Baker dylan at pnwbakers.com
Fri Oct 6 16:40:21 UTC 2017


Quoting Erik Faye-Lund (2017-10-06 00:31:20)
> On Thu, Oct 5, 2017 at 8:59 PM, Jochen Rollwagen <joro-2013 at t-online.de> wrote:
> > Am 04.10.2017 um 05:59 schrieb Matt Turner:
> >>
> >> 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.
> >
> > Fair enough. I've attached a new patch that optimizes the code on linux
> > systems only where there is byteswap.h containing (hopefully optimal)
> > functions. The other systems may be dealt with by a followup patch if
> > desired.
> >
> > From 327012410f75f77010b658ce9643a229c45bc308 Mon Sep 17 00:00:00 2001
> > From: Jochen Rollwagen <joro-2013 at t-online.de>
> > Date: Thu, 5 Oct 2017 20:48:46 +0200
> > Subject: [PATCH] Simplify byte swapping code in pack.c on Linux systems
> >
> > This patch replaces the code for byte swapping in pack.c with the function
> > from
> > byteswap.h on Linux systems
> > ---
> >  src/mesa/main/pack.c |    8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/mesa/main/pack.c b/src/mesa/main/pack.c
> > index 94a6d28..d8ab267 100644
> > --- a/src/mesa/main/pack.c
> > +++ b/src/mesa/main/pack.c
> > @@ -230,6 +230,12 @@ _mesa_pack_bitmap( GLint width, GLint height, const
> > GLubyte
> >  *source,
> >     }
> >  }
> >
> > +#ifdef __linux__
> > +#include <byteswap.h>
> > +
> > +#define SWAP2BYTE(VALUE) bswap_16(VALUE)
> > +#define SWAP4BYTE(VALUE) bswap_32(VALUE)
> > +#else
> 
> Another alternative would be to use:
> 
> AX_GCC_BUILTIN / HAVE___BUILTIN_BSWAP{16,32}
> 
> ...to check explicitly for the builtins, like we do for other
> builtins. We already do this for __builtin_bswap32 and
> __builtin_bswap64, so it would seem like a pretty straight-forward
> extension of that pattern.

Not withstanding Matt and Nicolai's points:

We already check for bswap builtins in configure (and meson), and would be the
right way to guard this since this isn't really linux specific, it's gcc/clang
specific, and I *think* the BSD's would benefit as well.

Dylan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: signature
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20171006/661dbddf/attachment.sig>


More information about the mesa-dev mailing list