summaryrefslogtreecommitdiffstats
path: root/src/glx/packrender.h
diff options
context:
space:
mode:
authorMatt Turner <[email protected]>2015-06-23 18:41:38 -0700
committerMatt Turner <[email protected]>2016-07-26 12:12:27 -0700
commit5ed3299822c1eec29d95f20c19ee334dd767ec2a (patch)
tree4474be0c5d41271035a8a9267e861a68596c0a49 /src/glx/packrender.h
parent2a1d2874f1f98a41d62174091cb3c303c120ca3d (diff)
glx: Avoid aliasing violations.
Compilers are perfectly capable of generating efficient code for calls like these to memcpy(). Reviewed-by: Brian Paul <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/glx/packrender.h')
-rw-r--r--src/glx/packrender.h34
1 files changed, 20 insertions, 14 deletions
diff --git a/src/glx/packrender.h b/src/glx/packrender.h
index f8f38ca2ec5..461180cd7b1 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)