diff --git a/src/bitvector.h b/src/bitvector.h index 3e7de8c9f1f1a777396bd8bb223402c5a68d7c3e..302d85819d5b56c20d308e770245cf0caa85f5da 100644 --- a/src/bitvector.h +++ b/src/bitvector.h @@ -252,43 +252,63 @@ static inline unsigned INT32 ctz64(const unsigned INT64 i) { #endif /* SIZEOF_LONG == 8 || SIZEOF_LONG_LONG == 8 */ -#define hton8(x) (x) +static INLINE unsigned INT32 bswap32(unsigned INT32 x) { +#ifdef HAS___BUILTIN_BSWAP32 + return __builtin_bswap32(x); +#elif defined(HAS__BSWAP) + return _bswap(x); +#elif defined(HAS__BYTESWAP_ULONG) + return _byteswap_ulong((unsigned long)x); +#else + return (((x & 0xff000000) >> 24) | ((x & 0x000000ff) << 24) + | ((x & 0x00ff0000) >> 8) | ((x & 0x0000ff00) << 8)); +#endif +} + +static INLINE unsigned INT64 bswap64(unsigned INT64 x) { +#ifdef HAS___BUILTIN_BSWAP64 + return __builtin_bswap64(x); +#elif defined(HAS__BSWAP64) + return _bswap64(x); +#elif defined(HAS__BYTESWAP_UINT64) + return _byteswap_uint64((unsigned INT64)x); +#else + return bswap32(x >> 32) | (unsigned INT64)bswap32(x & 0xffffffff) << 32; +#endif +} + +#define bswap16(x) ((unsigned INT16)bswap32((unsigned INT32)x << 16)) -#if !(defined(PIKE_BYTEORDER)) -# error "Byte order could not be decided." +#if PIKE_BYTEORDER == 1234 +#define get_unaligned_le16 get_unaligned16 +#define get_unaligned_le32 get_unaligned32 +#define get_unaligned_le64 get_unaligned64 +#define set_unaligned_le16 set_unaligned16 +#define set_unaligned_le32 set_unaligned32 +#define set_unaligned_le64 set_unaligned64 +#define get_unaligned_be16(x) bswap16(get_unaligned16(x)) +#define get_unaligned_be32(x) bswap32(get_unaligned32(x)) +#define get_unaligned_be64(x) bswap64(get_unaligned64(x)) +#define set_unaligned_be16(x) set_unaligned16(bswap16(x)) +#define set_unaligned_be32(x) set_unaligned32(bswap32(x)) +#define set_unaligned_be64(x) set_unaligned64(bswap64(x)) +#define hton32(x) bswap32(x) +#define hton64(x) bswap64(x) #else -# if PIKE_BYTEORDER == 1234 -/* # warning "little endian" */ -# define LBITMASK(type, n) ((type)1 << (type)(n)) -# define LBITN(type, p, n) (!!((p) & LBITMASK(type, n))) -# ifdef HAS___BUILTIN_BSWAP32 -# define hton32(x) __builtin_bswap32(x) -# elif defined(HAS__BSWAP) -# define hton32(x) _bswap(x) -# elif defined(HAS__BYTESWAP_ULONG) -# define hton32(x) _byteswap_ulong((unsigned long)x) -# else -# define hton32(x) ((((x) & 0xff000000) >> 24) | (((x) & 0x000000ff) << 24) \ - | (((x) & 0x00ff0000) >> 8) | (((x) & 0x0000ff00) << 8)) -# endif -# ifdef HAS___BUILTIN_BSWAP64 -# define hton64(x) __builtin_bswap64(x) -# elif defined(HAS__BSWAP64) -# define hton64(x) _bswap64(x) -# elif defined(HAS__BYTESWAP_UINT64) -# define hton64(x) _byteswap_uint64((unsigned __int64)x) -# else -# define hton64(x) ((INT64)hton32((int)((x) >> 32))\ - | (((INT64)hton32((int)((x) & 0x00000000ffffffff))) << 32)) -# endif -# else /* PIKE_BYTEORDER = 1234 */ -/* # warning "big endian" */ -# define hton64(x) (x) -# define hton32(x) (x) -# define LBITMASK(type, n) ((type)1 << (type)((sizeof(type) \ - - ((type)(n)<<8) - 1)*8 + (type)(n)&7)) -# define LBITN(type, p, n) (!!((p) & LBITMASK(type, n))) -# endif /* PIKE_BYTEORDER == 1234 */ +#define get_unaligned_be16 get_unaligned16 +#define get_unaligned_be32 get_unaligned32 +#define get_unaligned_be64 get_unaligned64 +#define set_unaligned_be16 set_unaligned16 +#define set_unaligned_be32 set_unaligned32 +#define set_unaligned_be64 set_unaligned64 +#define get_unaligned_le16(x) bswap16(get_unaligned16(x)) +#define get_unaligned_le32(x) bswap32(get_unaligned32(x)) +#define get_unaligned_le64(x) bswap64(get_unaligned64(x)) +#define set_unaligned_le16(x) set_unaligned16(bswap16(x)) +#define set_unaligned_le32(x) set_unaligned32(bswap32(x)) +#define set_unaligned_le64(x) set_unaligned64(bswap64(x)) +#define hton32(x) (x) +#define hton64(x) (x) #endif #endif /* BITVECTOR_H */ diff --git a/src/pike_memory.h b/src/pike_memory.h index 358b064e2cb00ae2e3df9d4bd224063b7196b733..96c17966345bb65c73cc9880264c866fa79b71d1 100644 --- a/src/pike_memory.h +++ b/src/pike_memory.h @@ -158,6 +158,36 @@ static INLINE void * guaranteed_memset(void * p, int c, size_t n) { return (void *)p; } +static INLINE unsigned INT64 get_unaligned64(const void * ptr) { + unsigned INT64 v; + memcpy(&v, ptr, 8); + return v; +} + +static INLINE void set_unaligned64(void * ptr, unsigned INT64 v) { + memcpy(ptr, &v, 8); +} + +static INLINE unsigned INT64 get_unaligned32(const void * ptr) { + unsigned INT32 v; + memcpy(&v, ptr, 4); + return v; +} + +static INLINE void set_unaligned32(void * ptr, unsigned INT32 v) { + memcpy(ptr, &v, 4); +} + +static INLINE unsigned INT16 get_unaligned16(const void * ptr) { + unsigned INT16 v; + memcpy(&v, ptr, 2); + return v; +} + +static INLINE void set_unaligned16(void * ptr, unsigned INT16 v) { + memcpy(ptr, &v, 2); +} + #include "pike_search.h" #include "block_alloc_h.h" diff --git a/src/post_modules/CritBit/critbit/key_pikestring.h b/src/post_modules/CritBit/critbit/key_pikestring.h index 68623794ae137c7f9528fb1fa5a8c4e1b014c382..7c4dc4cefe38e71f578537df95605d2e33c3ad0f 100644 --- a/src/post_modules/CritBit/critbit/key_pikestring.h +++ b/src/post_modules/CritBit/critbit/key_pikestring.h @@ -16,6 +16,8 @@ typedef p_wchar2 CB_NAME(char); #endif #define cb_char CB_NAME(char) +#define hton8(x) (x) + #ifdef CB_SOURCE #define CB_ADD_KEY_REF(x) do { if ((x).str) add_ref((x).str); } while(0) #define CB_FREE_KEY(x) do { if ((x).str) free_string((x).str); } while(0)