On 05.10.2017 20:59, Jochen Rollwagen wrote:
Am 04.10.2017 um 05:59 schrieb Matt Turner:
On Tue, Oct 3, 2017 at 11:01 AM, Jochen Rollwagen <joro-2...@t-online.de> wrote:
 From 4cebe50a9bade6717923e104c954f3fad75f71bb Mon Sep 17 00:00:00 2001
From: Jochen Rollwagen <joro-2...@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.

This doesn't really address Matt's point that compilers are good at pattern matching byte swaps already.

Unless you can actually show with comparisons of the assembly and/or benchmarks that this results in better code, your patch makes the code base slightly worse because you've now added two different code paths where there was previously only one.

Cheers,
Nicolai



 From 327012410f75f77010b658ce9643a229c45bc308 Mon Sep 17 00:00:00 2001
From: Jochen Rollwagen <joro-2...@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

  #define SWAP2BYTE(VALUE)            \
     {                        \
@@ -249,7 +255,7 @@ _mesa_pack_bitmap( GLint width, GLint height, const GLubyte
*source,
        bytes[1] = bytes[2];            \
        bytes[2] = tmp;                \
     }
-
+#endif

  static void
  extract_uint_indexes(GLuint n, GLuint indexes[],


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to