[Mesa-dev] [PATCH 6/7] glx: Avoid aliasing violations.
Matt Turner
mattst88 at gmail.com
Mon Jun 27 21:43:02 UTC 2016
Compilers are perfectly capable of generating efficient code for calls
like these to memcpy().
---
src/glx/packrender.h | 34 ++++++++++++++++++++--------------
src/glx/packsingle.h | 15 +++++----------
2 files changed, 25 insertions(+), 24 deletions(-)
diff --git a/src/glx/packrender.h b/src/glx/packrender.h
index f8f38ca..58094e0 100644
--- a/src/glx/packrender.h
+++ b/src/glx/packrender.h
@@ -155,28 +155,34 @@
/* Single item copy macros */
#define __GLX_PUT_CHAR(offset,a) \
- *((INT8 *) (pc + offset)) = a
+ do { \
+ int8_t __tmp = (a); \
+ memcpy((pc + offset), &__tmp, 1); \
+ } while (0)
#define __GLX_PUT_SHORT(offset,a) \
- *((INT16 *) (pc + offset)) = a
+ do { \
+ int16_t __tmp = (a); \
+ memcpy((pc + offset), &__tmp, 2); \
+ } while (0)
#define __GLX_PUT_LONG(offset,a) \
- *((INT32 *) (pc + offset)) = a
+ do { \
+ int32_t __tmp = (a); \
+ memcpy((pc + offset), &__tmp, 4); \
+ } while (0)
#define __GLX_PUT_FLOAT(offset,a) \
- *((FLOAT32 *) (pc + offset)) = a
+ do { \
+ float __tmp = (a); \
+ memcpy((pc + offset), &__tmp, 4); \
+ } while (0)
-#ifdef __GLX_ALIGN64
-/*
-** This can certainly be done better for a particular machine
-** architecture!
-*/
-#define __GLX_PUT_DOUBLE(offset,a) \
- __GLX_MEM_COPY(pc + offset, &a, 8)
-#else
#define __GLX_PUT_DOUBLE(offset,a) \
- *((FLOAT64 *) (pc + offset)) = a
-#endif
+ do { \
+ double __tmp = (a); \
+ memcpy((pc + offset), &__tmp, 8); \
+ } while (0)
#define __GLX_PUT_CHAR_ARRAY(offset,a,alen) \
__GLX_MEM_COPY(pc + offset, a, alen * __GLX_SIZE_INT8)
diff --git a/src/glx/packsingle.h b/src/glx/packsingle.h
index fddcbf1..e38e820 100644
--- a/src/glx/packsingle.h
+++ b/src/glx/packsingle.h
@@ -103,24 +103,19 @@
a = (GLint) reply.size
#define __GLX_SINGLE_GET_CHAR(p) \
- *p = *(GLbyte *)&reply.pad3;
+ memcpy(p, &reply.pad3, 1);
#define __GLX_SINGLE_GET_SHORT(p) \
- *p = *(GLshort *)&reply.pad3;
+ memcpy(p, &reply.pad3, 2);
#define __GLX_SINGLE_GET_LONG(p) \
- *p = *(GLint *)&reply.pad3;
+ memcpy(p, &reply.pad3, 4);
#define __GLX_SINGLE_GET_FLOAT(p) \
- *p = *(GLfloat *)&reply.pad3;
+ memcpy(p, &reply.pad3, 4);
-#ifdef __GLX_ALIGN64
#define __GLX_SINGLE_GET_DOUBLE(p) \
- __GLX_MEM_COPY(p, &reply.pad3, 8)
-#else
-#define __GLX_SINGLE_GET_DOUBLE(p) \
- *p = *(GLdouble *)&reply.pad3
-#endif
+ memcpy(p, &reply.pad3, 8);
/* Get an array of typed data */
#define __GLX_SINGLE_GET_VOID_ARRAY(a,alen) \
--
2.7.3
More information about the mesa-dev
mailing list