words.h - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       words.h (1979B)
       ---
            1 //
            2 // Word access and byte-swapping functions specific to x86-32
            3 //
            4 #ifndef X86_32_WORDS_H
            5 #define X86_32_WORDS_H
            6 
            7 #include <inttypes.h>
            8 
            9 
           10 // Efficient byte-swap functions for x86-32
           11 static inline uint16_t
           12 bswap16(uint16_t v) {
           13         asm("xchgb %%al,%%ah" : "=a" (v) : "a" (v));
           14         return v;
           15 }
           16 
           17 static inline uint32_t
           18 bswap32(uint32_t v) {
           19         asm("bswapl %%eax" : "=a" (v) : "a" (v));
           20         return v;
           21 }
           22 
           23 static inline uint64_t
           24 bswap64(uint64_t v) {
           25         return ((uint64_t)bswap32(v) << 32) | bswap32(v >> 32);
           26 }
           27 
           28 
           29 // Utility macros/functions for converting
           30 // between host byte order and little-endian VX32 byte order.
           31 // The x86 is little-endian already, so these are no-ops.
           32 #define htol16(x)        (x)
           33 #define ltoh16(x)        (x)
           34 #define htol32(x)        (x)
           35 #define ltoh32(x)        (x)
           36 #define htol64(x)        (x)
           37 #define ltoh64(x)        (x)
           38 
           39 
           40 // Utility macros/functions for converting
           41 // between host byte order and big-endian ("network") byte order.
           42 #define htob16(x)        bswap16(x)
           43 #define btoh16(x)        bswap16(x)
           44 #define htob32(x)        bswap32(x)
           45 #define btoh32(x)        bswap32(x)
           46 #define htob64(x)        bswap64(x)
           47 #define btoh64(x)        bswap64(x)
           48 
           49 
           50 // Macros to access unaligned words in memory - trivial on the x86
           51 #define getu16(p)        (*(uint16_t*)(p))                // host byte order
           52 #define getu32(p)        (*(uint32_t*)(p))
           53 #define getu64(p)        (*(uint64_t*)(p))
           54 #define getu16l(p)        getu16(p)                        // little-endian
           55 #define getu32l(p)        getu32(p)
           56 #define getu64l(p)        getu64(p)
           57 #define getu16n(p)        bswap16(getu16(p))                // big-endian
           58 #define getu32n(p)        bswap32(getu32(p))
           59 #define getu64n(p)        bswap64(getu64(p))
           60 
           61 #define putu16(p, v)        (*(uint16_t*)(p) = (v))                // host byte order
           62 #define putu32(p, v)        (*(uint32_t*)(p) = (v))
           63 #define putu64(p, v)        (*(uint64_t*)(p) = (v))
           64 #define putu16l(p, v)        putu16((p), (v))                // little-endian
           65 #define putu32l(p, v)        putu32((p), (v))
           66 #define putu64l(p, v)        putu64((p), (v))
           67 #define putu16n(p, v)        putu16((p), bswap16(v))                // big-endian
           68 #define putu32n(p, v)        putu32((p), bswap32(v))
           69 #define putu64n(p, v)        putu64((p), bswap64(v))
           70 
           71 
           72 #endif        // X86_32_WORDS_H