1
0
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:
Adhemerval Zanella
2023-02-10 14:09:10 -03:00
parent 62d4c768a4
commit 5729e0e9af
10 changed files with 42 additions and 154 deletions

View File

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