summaryrefslogtreecommitdiff
path: root/lib/unaligned.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/unaligned.h')
-rw-r--r--lib/unaligned.h32
1 files changed, 31 insertions, 1 deletions
diff --git a/lib/unaligned.h b/lib/unaligned.h
index 29fcee99..53e32e5d 100644
--- a/lib/unaligned.h
+++ b/lib/unaligned.h
@@ -1,5 +1,5 @@
/*
- * Unaligned Data Accesses
+ * Unaligned Data Accesses -- Generic Version
*
* (c) 1998 Martin Mares <mj@ucw.cz>
*
@@ -9,4 +9,34 @@
#ifndef _BIRD_UNALIGNED_H_
#define _BIRD_UNALIGNED_H_
+#if CPU_NEEDS_ALIGN_WORD != 1 || CPU_NEEDS_ALIGN_LONG != 1
+#include <string.h>
+#endif
+
+#if CPU_NEEDS_ALIGN_WORD == 1
+#define unaligned_u16(p) (*((u16 *)(p)))
+#else
+static inline u16
+unaligned_u16(void *p)
+{
+ u16 x;
+
+ memcpy(&x, p, sizeof(x));
+ return x;
+}
+#endif
+
+#if CPU_NEEDS_ALIGN_LONG == 1
+#define unaligned_u32(p) (*((u32 *)(p)))
+#else
+static inline u32
+unaligned_u32(void *p)
+{
+ u32 x;
+
+ memcpy(&x, p, sizeof(x));
+ return x;
+}
+#endif
+
#endif