mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-08 17:42:12 +03:00
iconv: Remove _STRING_ARCH_unaligned usage for get/set macros
And use a packed structure instead. The compiler generates optimized unaligned code if the architecture supports it. Checked on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
This commit is contained in:
@@ -204,73 +204,6 @@
|
||||
#endif
|
||||
|
||||
|
||||
/* Define macros which can access unaligned buffers. These macros are
|
||||
supposed to be used only in code outside the inner loops. For the inner
|
||||
loops we have other definitions which allow optimized access. */
|
||||
#if _STRING_ARCH_unaligned
|
||||
/* We can handle unaligned memory access. */
|
||||
# define get16u(addr) *((const uint16_t *) (addr))
|
||||
# define get32u(addr) *((const uint32_t *) (addr))
|
||||
|
||||
/* We need no special support for writing values either. */
|
||||
# define put16u(addr, val) *((uint16_t *) (addr)) = (val)
|
||||
# define put32u(addr, val) *((uint32_t *) (addr)) = (val)
|
||||
#else
|
||||
/* Distinguish between big endian and little endian. */
|
||||
# if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
# define get16u(addr) \
|
||||
(((const unsigned char *) (addr))[1] << 8 \
|
||||
| ((const unsigned char *) (addr))[0])
|
||||
# define get32u(addr) \
|
||||
(((((const unsigned char *) (addr))[3] << 8 \
|
||||
| ((const unsigned char *) (addr))[2]) << 8 \
|
||||
| ((const unsigned char *) (addr))[1]) << 8 \
|
||||
| ((const unsigned char *) (addr))[0])
|
||||
|
||||
# define put16u(addr, val) \
|
||||
({ uint16_t __val = (val); \
|
||||
((unsigned char *) (addr))[0] = __val; \
|
||||
((unsigned char *) (addr))[1] = __val >> 8; \
|
||||
(void) 0; })
|
||||
# define put32u(addr, val) \
|
||||
({ uint32_t __val = (val); \
|
||||
((unsigned char *) (addr))[0] = __val; \
|
||||
__val >>= 8; \
|
||||
((unsigned char *) (addr))[1] = __val; \
|
||||
__val >>= 8; \
|
||||
((unsigned char *) (addr))[2] = __val; \
|
||||
__val >>= 8; \
|
||||
((unsigned char *) (addr))[3] = __val; \
|
||||
(void) 0; })
|
||||
# else
|
||||
# define get16u(addr) \
|
||||
(((const unsigned char *) (addr))[0] << 8 \
|
||||
| ((const unsigned char *) (addr))[1])
|
||||
# define get32u(addr) \
|
||||
(((((const unsigned char *) (addr))[0] << 8 \
|
||||
| ((const unsigned char *) (addr))[1]) << 8 \
|
||||
| ((const unsigned char *) (addr))[2]) << 8 \
|
||||
| ((const unsigned char *) (addr))[3])
|
||||
|
||||
# define put16u(addr, val) \
|
||||
({ uint16_t __val = (val); \
|
||||
((unsigned char *) (addr))[1] = __val; \
|
||||
((unsigned char *) (addr))[0] = __val >> 8; \
|
||||
(void) 0; })
|
||||
# define put32u(addr, val) \
|
||||
({ uint32_t __val = (val); \
|
||||
((unsigned char *) (addr))[3] = __val; \
|
||||
__val >>= 8; \
|
||||
((unsigned char *) (addr))[2] = __val; \
|
||||
__val >>= 8; \
|
||||
((unsigned char *) (addr))[1] = __val; \
|
||||
__val >>= 8; \
|
||||
((unsigned char *) (addr))[0] = __val; \
|
||||
(void) 0; })
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/* For conversions from a fixed width character set to another fixed width
|
||||
character set we can define RESET_INPUT_BUFFER in a very fast way. */
|
||||
#if !defined RESET_INPUT_BUFFER && !defined SAVE_RESET_STATE
|
||||
|
Reference in New Issue
Block a user