diff --git a/libc/arch-arm/include/endian.h b/libc/arch-arm/include/endian.h index e34872fcb..6de0889ef 100644 --- a/libc/arch-arm/include/endian.h +++ b/libc/arch-arm/include/endian.h @@ -33,14 +33,14 @@ #ifdef __GNUC__ -/* NOTE: header could not be included directly - * since it defines extra macros, such as PLD. +/* + * REV and REV16 weren't available on ARM5 or ARM4. + * We don't include because it pollutes the + * namespace with macros like PLD. */ -#if defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || \ - defined(__ARM_ARCH_7__) || \ - defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \ - defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || \ - defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) +#if !defined __ARM_ARCH_5__ && !defined __ARM_ARCH_5T__ && \ + !defined __ARM_ARCH_5TE__ && !defined __ARM_ARCH_5TEJ__ && \ + !defined __ARM_ARCH_4T__ && !defined __ARM_ARCH_4__ /* According to RealView Assembler User's Guide, REV and REV16 are available * in Thumb code and 16-bit instructions when used in Thumb-2 code. @@ -50,44 +50,40 @@ * * REV16 Rd, Rm * Rd and Rm must both be Lo registers. + * + * The +l constraint takes care of this without constraining us in ARM mode. */ -#ifdef __thumb__ -#define REV_LO_REG asm("r4") -#else -#define REV_LO_REG -#endif - -#define __swap16md(x) ({ \ - register u_int16_t _x REV_LO_REG = (x); \ - __asm volatile ("rev16 %0, %0" : "+r" (_x)); \ - _x; \ +#define __swap16md(x) ({ \ + register u_int16_t _x = (x); \ + __asm volatile ("rev16 %0, %0" : "+l" (_x)); \ + _x; \ }) -#define __swap32md(x) ({ \ - register u_int32_t _x REV_LO_REG = (x); \ - __asm volatile ("rev %0, %0" : "+r" (_x)); \ - _x; \ +#define __swap32md(x) ({ \ + register u_int32_t _x = (x); \ + __asm volatile ("rev %0, %0" : "+l" (_x)); \ + _x; \ }) -#define __swap64md(x) ({ \ - u_int64_t _x = (x); \ - (u_int64_t) __swap32md(_x >> 32) | \ - (u_int64_t) __swap32md(_x & 0xffffffff) << 32; \ +#define __swap64md(x) ({ \ + u_int64_t _swap64md_x = (x); \ + (u_int64_t) __swap32md(_swap64md_x >> 32) | \ + (u_int64_t) __swap32md(_swap64md_x & 0xffffffff) << 32; \ }) /* Tell sys/endian.h we have MD variants of the swap macros. */ #define MD_SWAP -#endif /* __ARM_ARCH__ */ -#endif /* __GNUC__ */ +#endif /* __ARM_ARCH__ */ +#endif /* __GNUC__ */ #ifdef __ARMEB__ #define _BYTE_ORDER _BIG_ENDIAN #else #define _BYTE_ORDER _LITTLE_ENDIAN #endif -#define __STRICT_ALIGNMENT +#define __STRICT_ALIGNMENT #include #include -#endif /* !_ARM_ENDIAN_H_ */ +#endif /* !_ARM_ENDIAN_H_ */ diff --git a/libc/include/byteswap.h b/libc/include/byteswap.h index 16d2ad4f9..74b0e9180 100644 --- a/libc/include/byteswap.h +++ b/libc/include/byteswap.h @@ -28,7 +28,8 @@ #ifndef _BYTESWAP_H_ #define _BYTESWAP_H_ -#include +/* endian.h rather than sys/endian.h so we get the machine-specific file. */ +#include #define bswap_16(x) swap16(x) #define bswap_32(x) swap32(x)