glx: Avoid aliasing violations.

Compilers are perfectly capable of generating efficient code for calls
like these to memcpy().

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Matt Turner 2015-06-23 18:41:38 -07:00
parent 2a1d2874f1
commit 5ed3299822
2 changed files with 25 additions and 24 deletions

View file

@ -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)

View file

@ -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) \