le.h: add 64-bit functions, minor cleanups
authorH. Peter Anvin <hpa@zytor.com>
Thu, 27 May 2010 14:20:39 +0000 (07:20 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Thu, 27 May 2010 14:20:39 +0000 (07:20 -0700)
Add 64-bit functions; we don't use them right now but probably will in
the future.  Also test for __386__, since some non-gcc compilers use
__386__ instead of __i386__.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
le.h

diff --git a/le.h b/le.h
index d51d2c2..953db22 100644 (file)
--- a/le.h
+++ b/le.h
@@ -21,7 +21,7 @@
 
 #include <inttypes.h>
 
-#if defined(__i386__) || defined(__x86_64__)
+#if defined(__386__) || defined(__i386__) || defined(__x86_64__)
 
 /* Littleendian architecture, unaligned accesses permitted */
 
@@ -35,6 +35,11 @@ static inline uint32_t rdle32(const uint32_t *p)
        return *p;
 }
 
+static inline uint64_t rdle64(const uint64_t *p)
+{
+       return *p;
+}
+
 static inline void wrle16(uint16_t v, uint16_t *p)
 {
        *p = v;
@@ -45,18 +50,52 @@ static inline void wrle32(uint32_t v, uint32_t *p)
        *p = v;
 }
 
+static inline void wrle64(uint64_t v, uint64_t *p)
+{
+       *p = v;
+}
+
 #else
 
 static inline uint16_t rdle16(const uint16_t *p)
 {
        const uint8_t *_p = (const uint8_t *)p;
-       return _p[0] + (_p[1] << 8);
+       uint16_t _v;
+
+       _v  = (uint16_t)_p[0];
+       _v += (uint16_t)_p[1] << 8;
+
+       return _v;
 }
 
 static inline uint32_t rdle32(const uint32_t *p)
 {
        const uint8_t *_p = (const uint8_t *)p;
-       return _p[0] + (_p[1] << 8) + (_p[2] << 16) + (_p[3] << 24);
+       uint32_t _v;
+
+       _v  = (uint32_t)_p[0];
+       _v += (uint32_t)_p[1] << 8;
+       _v += (uint32_t)_p[2] << 16;
+       _v += (uint32_t)_p[3] << 24;
+
+       return _v;
+}
+
+static inline uint64_t rdle64(const uint64_t *p)
+{
+       const uint8_t *_p = (const uint8_t *)p;
+       uint64_t _v;
+
+       _v  = (uint64_t)_p[0];
+       _v += (uint64_t)_p[1] << 8;
+       _v += (uint64_t)_p[2] << 16;
+       _v += (uint64_t)_p[3] << 24;
+       _v += (uint64_t)_p[4] << 32;
+       _v += (uint64_t)_p[5] << 40;
+       _v += (uint64_t)_p[6] << 48;
+       _v += (uint64_t)_p[7] << 56;
+
+       return _v;
 }
 
 static inline void wrle16(uint16_t v, uint16_t *p)
@@ -77,6 +116,20 @@ static inline void wrle32(uint32_t v, uint32_t *p)
        _p[3] = v >> 24;
 }
 
+static inline void wrle64(uint64_t v, uint64_t *p)
+{
+       uint8_t *_p = (uint8_t *)p;
+
+       _p[0] = v;
+       _p[1] = v >> 8;
+       _p[2] = v >> 16;
+       _p[3] = v >> 24;
+       _p[4] = v >> 32;
+       _p[5] = v >> 40;
+       _p[6] = v >> 48;
+       _p[7] = v >> 56;
+}
+
 #endif
 
 #endif /* LE_H */