diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/platform.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/include/platform.h b/include/platform.h index b8c85dba0..5d6a18107 100644 --- a/include/platform.h +++ b/include/platform.h | |||
@@ -151,13 +151,19 @@ | |||
151 | 151 | ||
152 | /* ---- Unaligned access ------------------------------------ */ | 152 | /* ---- Unaligned access ------------------------------------ */ |
153 | 153 | ||
154 | /* parameter is supposed to be an uint32_t* ptr */ | 154 | /* NB: unaligned parameter should be a pointer, aligned one - |
155 | * a lvalue. This makes it more likely to not swap them by mistake | ||
156 | */ | ||
155 | #if defined(i386) || defined(__x86_64__) | 157 | #if defined(i386) || defined(__x86_64__) |
156 | #define get_unaligned_u32p(u32p) (*(u32p)) | 158 | #define move_from_unaligned16(v, u16p) ((v) = *(uint16_t*)(u16p)) |
159 | #define move_from_unaligned32(v, u32p) ((v) = *(uint32_t*)(u32p)) | ||
160 | #define move_to_unaligned32(u32p, v) (*(uint32_t*)(u32p) = (v)) | ||
157 | /* #elif ... - add your favorite arch today! */ | 161 | /* #elif ... - add your favorite arch today! */ |
158 | #else | 162 | #else |
159 | /* performs reasonably well (gcc usually inlines memcpy here) */ | 163 | /* performs reasonably well (gcc usually inlines memcpy here) */ |
160 | #define get_unaligned_u32p(u32p) ({ uint32_t __t; memcpy(&__t, (u32p), 4); __t; }) | 164 | #define move_from_unaligned16(v, u16p) (memcpy(&(v), (u16p), 2)) |
165 | #define move_from_unaligned32(v, u32p) (memcpy(&(v), (u32p), 4)) | ||
166 | #define move_to_unaligned32(u32p, v) (memcpy((u32p), &(v), 4)) | ||
161 | #endif | 167 | #endif |
162 | 168 | ||
163 | /* ---- Networking ------------------------------------------ */ | 169 | /* ---- Networking ------------------------------------------ */ |