1 /* ----------------------------------------------------------------------- *
3 * Copyright 2001-2008 H. Peter Anvin - All Rights Reserved
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,
8 * USA; either version 2 of the License, or (at your option) any later
9 * version; incorporated herein by reference.
11 * ----------------------------------------------------------------------- */
16 * Basic operations on unaligned, littleendian integers
24 /* These are unaligned, littleendian integer types */
26 typedef uint8_t le8_t
; /* 8-bit byte */
27 typedef uint8_t le16_t
[2]; /* 16-bit word */
28 typedef uint8_t le32_t
[4]; /* 32-bit dword */
30 /* Read/write these quantities */
32 static inline unsigned char
39 write8(le8_t
*_p
, uint8_t _v
)
44 #if defined(__i386__) || defined(__x86_64__)
46 /* Littleendian architectures which support unaligned memory accesses */
48 static inline unsigned short
51 return *((const uint16_t *)_p
);
55 write16(le16_t
*_p
, unsigned short _v
)
57 *((uint16_t *)_p
) = _v
;
60 static inline unsigned int
63 return *((const uint32_t *)_p
);
67 write32(le32_t
*_p
, uint32_t _v
)
69 *((uint32_t *)_p
) = _v
;
74 /* Generic, mostly portable versions */
76 static inline unsigned short
88 write16(le16_t
*_pp
, uint16_t _v
)
93 _p
[1] = (_v
>> 8) & 0xFF;
96 static inline unsigned int
110 write32(le32_t
*_pp
, uint32_t _v
)
115 _p
[1] = (_v
>> 8) & 0xFF;
116 _p
[2] = (_v
>> 16) & 0xFF;
117 _p
[3] = (_v
>> 24) & 0xFF;