mirror of
https://git.tukaani.org/xz.git
synced 2026-03-28 21:01:22 +00:00
tuklib_integer: Fix inefficient aligned_writeXXne
The __builtin_assume_aligned was applied to the wrong argument which made aligned writes worse on strict-align archs. Aligned writes aren't used in liblzma, so this bug didn't matter in this package; tuklib_integer.h is meant to be usable elsewhere too.
This commit is contained in:
parent
685538271e
commit
2faa141bdb
@ -643,11 +643,10 @@ write64le(uint8_t *buf, uint64_t num)
|
||||
//
|
||||
// __builtin_assume_aligned is support by GCC >= 4.7 and clang >= 3.6.
|
||||
#ifdef HAVE___BUILTIN_ASSUME_ALIGNED
|
||||
# define tuklib_memcpy_aligned(dest, src, size) \
|
||||
memcpy(dest, __builtin_assume_aligned(src, size), size)
|
||||
# define tuklib_assume_aligned(ptr, align) \
|
||||
__builtin_assume_aligned(ptr, align)
|
||||
#else
|
||||
# define tuklib_memcpy_aligned(dest, src, size) \
|
||||
memcpy(dest, src, size)
|
||||
# define tuklib_assume_aligned(ptr, align) (ptr)
|
||||
# ifndef TUKLIB_FAST_UNALIGNED_ACCESS
|
||||
# define TUKLIB_USE_UNSAFE_ALIGNED_READS 1
|
||||
# endif
|
||||
@ -662,7 +661,7 @@ aligned_read16ne(const uint8_t *buf)
|
||||
return *(const uint16_t *)buf;
|
||||
#else
|
||||
uint16_t num;
|
||||
tuklib_memcpy_aligned(&num, buf, sizeof(num));
|
||||
memcpy(&num, tuklib_assume_aligned(buf, sizeof(num)), sizeof(num));
|
||||
return num;
|
||||
#endif
|
||||
}
|
||||
@ -676,7 +675,7 @@ aligned_read32ne(const uint8_t *buf)
|
||||
return *(const uint32_t *)buf;
|
||||
#else
|
||||
uint32_t num;
|
||||
tuklib_memcpy_aligned(&num, buf, sizeof(num));
|
||||
memcpy(&num, tuklib_assume_aligned(buf, sizeof(num)), sizeof(num));
|
||||
return num;
|
||||
#endif
|
||||
}
|
||||
@ -690,7 +689,7 @@ aligned_read64ne(const uint8_t *buf)
|
||||
return *(const uint64_t *)buf;
|
||||
#else
|
||||
uint64_t num;
|
||||
tuklib_memcpy_aligned(&num, buf, sizeof(num));
|
||||
memcpy(&num, tuklib_assume_aligned(buf, sizeof(num)), sizeof(num));
|
||||
return num;
|
||||
#endif
|
||||
}
|
||||
@ -702,7 +701,7 @@ aligned_write16ne(uint8_t *buf, uint16_t num)
|
||||
#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING
|
||||
*(uint16_t *)buf = num;
|
||||
#else
|
||||
tuklib_memcpy_aligned(buf, &num, sizeof(num));
|
||||
memcpy(tuklib_assume_aligned(buf, sizeof(num)), &num, sizeof(num));
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
@ -714,7 +713,7 @@ aligned_write32ne(uint8_t *buf, uint32_t num)
|
||||
#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING
|
||||
*(uint32_t *)buf = num;
|
||||
#else
|
||||
tuklib_memcpy_aligned(buf, &num, sizeof(num));
|
||||
memcpy(tuklib_assume_aligned(buf, sizeof(num)), &num, sizeof(num));
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
@ -726,7 +725,7 @@ aligned_write64ne(uint8_t *buf, uint64_t num)
|
||||
#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING
|
||||
*(uint64_t *)buf = num;
|
||||
#else
|
||||
tuklib_memcpy_aligned(buf, &num, sizeof(num));
|
||||
memcpy(tuklib_assume_aligned(buf, sizeof(num)), &num, sizeof(num));
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user