cleaner pointer alignment logic for autoconf-based builds
This commit is contained in:
parent
60a43f073f
commit
cebba2a5dc
@ -45,6 +45,16 @@ void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address)
|
|||||||
#ifdef FLAC__ALIGN_MALLOC_DATA
|
#ifdef FLAC__ALIGN_MALLOC_DATA
|
||||||
/* align on 32-byte (256-bit) boundary */
|
/* align on 32-byte (256-bit) boundary */
|
||||||
x = malloc(bytes+31);
|
x = malloc(bytes+31);
|
||||||
|
#ifdef SIZEOF_VOIDP
|
||||||
|
#if SIZEOF_VOIDP == 4
|
||||||
|
/* could do *aligned_address = x + ((unsigned) (32 - (((unsigned)x) & 31))) & 31; */
|
||||||
|
*aligned_address = (void*)(((unsigned)x + 31) & -32);
|
||||||
|
#elif SIZEOF_VOIDP == 8
|
||||||
|
*aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32)));
|
||||||
|
#else
|
||||||
|
# error Unsupported sizeof(void*)
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
/* there's got to be a better way to do this right for all archs */
|
/* there's got to be a better way to do this right for all archs */
|
||||||
if(sizeof(void*) == sizeof(unsigned))
|
if(sizeof(void*) == sizeof(unsigned))
|
||||||
*aligned_address = (void*)(((unsigned)x + 31) & -32);
|
*aligned_address = (void*)(((unsigned)x + 31) & -32);
|
||||||
@ -52,6 +62,7 @@ void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address)
|
|||||||
*aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32)));
|
*aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32)));
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
x = malloc(bytes);
|
x = malloc(bytes);
|
||||||
*aligned_address = x;
|
*aligned_address = x;
|
||||||
|
Loading…
Reference in New Issue
Block a user