mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-07-24 10:25:42 -04:00
bytesex: more endianness detection hacks
A few more tricks for sussing out endinanness, and add an ultimate fallback option. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
573112ee86
commit
53cd7c7bf0
@ -223,8 +223,42 @@ static inline uint64_t cpu_to_le64(uint64_t v)
|
|||||||
|
|
||||||
#else /* not WORDS_LITTLEENDIAN or WORDS_BIGENDIAN */
|
#else /* not WORDS_LITTLEENDIAN or WORDS_BIGENDIAN */
|
||||||
|
|
||||||
#error "Update byteord.h to include arbitrary byte orders"
|
static inline uint16_t cpu_to_le16(uint16_t v)
|
||||||
|
{
|
||||||
|
union u16 {
|
||||||
|
uint16_t v;
|
||||||
|
uint8_t c[2];
|
||||||
|
} x;
|
||||||
|
uint8_t *cp = &x.c;
|
||||||
|
|
||||||
|
WRITESHORT(cp, v);
|
||||||
|
return x.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t cpu_to_le32(uint32_t v)
|
||||||
|
{
|
||||||
|
union u32 {
|
||||||
|
uint32_t v;
|
||||||
|
uint8_t c[4];
|
||||||
|
} x;
|
||||||
|
uint8_t *cp = &x.c;
|
||||||
|
|
||||||
|
WRITELONG(cp, v);
|
||||||
|
return x.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint64_t cpu_to_le64(uint64_t v)
|
||||||
|
{
|
||||||
|
union u64 {
|
||||||
|
uint64_t v;
|
||||||
|
uint8_t c[8];
|
||||||
|
} x;
|
||||||
|
uint8_t *cp = &x.c;
|
||||||
|
|
||||||
|
WRITEDLONG(cp, v);
|
||||||
|
return x.v;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* NASM_BYTEORD_H */
|
#endif /* NASM_BYTESEX_H */
|
||||||
|
@ -96,11 +96,20 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we have BYTE_ORDER defined, trust it over what autoconf came up
|
* If we have BYTE_ORDER defined, or the compiler provides
|
||||||
* with, especially since autoconf obviously can't figure things out
|
* __BIG_ENDIAN__ or __LITTLE_ENDIAN__, trust it over what autoconf
|
||||||
* for a universal compiler.
|
* came up with, especially since autoconf obviously can't figure
|
||||||
|
* things out for a universal compiler.
|
||||||
*/
|
*/
|
||||||
#if defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN)
|
#if defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)
|
||||||
|
# undef WORDS_LITTLEENDIAN
|
||||||
|
# undef WORDS_BIGENDIAN
|
||||||
|
# define WORDS_BIGENDIAN 1
|
||||||
|
#elif defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
|
||||||
|
# undef WORDS_LITTLEENDIAN
|
||||||
|
# undef WORDS_BIGENDIAN
|
||||||
|
# define WORDS_LITTLEENDIAN 1
|
||||||
|
#elif defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN)
|
||||||
# undef WORDS_LITTLEENDIAN
|
# undef WORDS_LITTLEENDIAN
|
||||||
# undef WORDS_BIGENDIAN
|
# undef WORDS_BIGENDIAN
|
||||||
# if BYTE_ORDER == LITTLE_ENDIAN
|
# if BYTE_ORDER == LITTLE_ENDIAN
|
||||||
@ -112,15 +121,15 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Define this to 1 for faster performance if this is a littleendian
|
* Define this to 1 for faster performance if this is a littleendian
|
||||||
* platform which can do unaligned memory references. It is safe
|
* platform *and* it can do arbitrary unaligned memory references. It
|
||||||
* to leave it defined to 0 even if that is true.
|
* is safe to leave it defined to 0 even if that is true.
|
||||||
*/
|
*/
|
||||||
#if defined(__386__) || defined(__i386__) || defined(__x86_64__) \
|
#if defined(__386__) || defined(__i386__) || defined(__x86_64__) \
|
||||||
|| defined(_M_IX86) || defined(_M_X64)
|
|| defined(_M_IX86) || defined(_M_X64)
|
||||||
# define X86_MEMORY 1
|
# define X86_MEMORY 1
|
||||||
# ifndef WORDS_LITTLEENDIAN
|
# undef WORDS_BIGENDIAN
|
||||||
# define WORDS_LITTLEENDIAN 1
|
# undef WORDS_LITTLEENDIAN
|
||||||
# endif
|
# define WORDS_LITTLEENDIAN 1
|
||||||
#else
|
#else
|
||||||
# define X86_MEMORY 0
|
# define X86_MEMORY 0
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user