#include <inttypes.h>
#include <stdint.h>
+#include INCLUDE_ENDIAN_H
+
#define XG_NEED_UNALIGNED
#include "xg_private.h"
#include "xg_dom_decompress.h"
#define likely(a) a
#define unlikely(a) a
-static inline uint_fast16_t le16_to_cpup(const unsigned char *buf)
+static inline uint16_t le16_to_cpu(uint16_t v)
{
- return buf[0] | (buf[1] << 8);
+#if BYTE_ORDER == BIG_ENDIAN
+ return __builtin_bswap16(v);
+#else
+ return v;
+#endif
}
#include "../../xen/include/xen/lz4.h"
#define noinline
#define unlikely(a) a
-static inline u16 be16_to_cpup(const u16 *p)
+static inline u16 be16_to_cpu(const u16 v)
{
- u16 v = *p;
#if BYTE_ORDER == LITTLE_ENDIAN
- return (((v & 0x00ffU) << 8) |
- ((v & 0xff00U) >> 8));
+ return __builtin_bswap16(v);
#else
return v;
#endif
}
-static inline u32 be32_to_cpup(const u32 *p)
+static inline u32 be32_to_cpup(const u32 v)
{
- u32 v = *p;
#if BYTE_ORDER == LITTLE_ENDIAN
- return (((v & 0x000000ffUL) << 24) |
- ((v & 0x0000ff00UL) << 8) |
- ((v & 0x00ff0000UL) >> 8) |
- ((v & 0xff000000UL) >> 24));
+ return __builtin_bswap32(v);
#else
return v;
#endif
static inline u32 cpu_to_le32(const u32 v)
{
#if BYTE_ORDER == BIG_ENDIAN
- return (((v & 0x000000ffUL) << 24) |
- ((v & 0x0000ff00UL) << 8) |
- ((v & 0x00ff0000UL) >> 8) |
- ((v & 0xff000000UL) >> 24));
+ return __builtin_bswap32(v);
#else
return v;
#endif
}
-static inline u32 le32_to_cpup(const u32 *p)
+static inline u32 le32_to_cpu(const u32 p)
{
- return cpu_to_le32(*p);
+#if BYTE_ORDER == BIG_ENDIAN
+ return __builtin_bswap32(v);
+#else
+ return v;
+#endif
}
#define __force
static inline u16 get_unaligned_le16(const void *p)
{
- return le16_to_cpup(p);
+ u16 v;
+
+ memcpy(&v, p, sizeof(v));
+
+ return le16_to_cpu(v);
}
#endif
static inline u16 get_unaligned_be16(const void *p)
{
- return be16_to_cpup(p);
+ u16 v;
+
+ memcpy(&v, p, sizeof(v));
+
+ return be16_to_cpu(v);
}
static inline u32 get_unaligned_be32(const void *p)
{
- return be32_to_cpup(p);
+ u32 v;
+
+ memcpy(&v, p, sizeof(v));
+
+ return be32_to_cpu(v);
}
#endif
static inline u32 get_unaligned_le32(const void *p)
{
- return le32_to_cpup(p);
+ u32 v;
+
+ memcpy(&v, p, sizeof(v));
+
+ return le32_to_cpu(v);
}
static inline void put_unaligned_le32(u32 val, void *p)
{
- *(__force __le32*)p = cpu_to_le32(val);
+ u32 v = cpu_to_le32(val);
+
+ memcpy(p, &v, sizeof(v));
}
#endif
-#define get_le32(p) le32_to_cpup((const uint32_t *)(p))
+#define get_le32(p) le32_to_cpu(*(const uint32_t *)(p))
#define false 0
#define true 1