diff --git a/include/dvbsi++/byte_stream.h b/include/dvbsi++/byte_stream.h
index 0387a15..204f9a9 100644
--- a/include/dvbsi++/byte_stream.h
+++ b/include/dvbsi++/byte_stream.h
@@ -23,8 +23,14 @@
 #define w32(p,v)	do { *(uint32_t * const)(p) = ((const uint32_t)v) } while (0)
 #define w64(p,v)	do { *(uint64_t * const)(p) = ((const uint64_t)v) } while (0)
 #else
+#ifdef __sh__
+/* SuperH does not like unaligned accesses, so work around that */
+#define r16(p)		((((uint8_t *)p)[0]) <<  8 | (((uint8_t *)p)[1]))
+#define r32(p)		((((uint8_t *)p)[0]) << 24 | (((uint8_t *)p)[1]) << 16 | (((uint8_t *)p)[2]) << 8 | ((uint8_t *)p)[3])
+#else
 #define r16(p)		bswap_16(*(const uint16_t * const)p)
 #define r32(p)		bswap_32(*(const uint32_t * const)p)
+#endif
 #define r64(p)		bswap_64(*(const uint64_t * const)p)
 #define w16(p,v)	do { *(uint16_t * const)(p) = bswap_16((const uint16_t)v) } while (0)
 #define w32(p,v)	do { *(uint32_t * const)(p) = bswap_32((const uint32_t)v) } while (0)