--- a/c/common/platform.h
+++ b/c/common/platform.h
@@ -318,19 +326,34 @@
 #else  /* not BROTLI_USE_PACKED_FOR_UNALIGNED */
 
 static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) {
+#if defined(__mips__) && (!defined(__mips_isa_rev) || __mips_isa_rev < 6)
+  const struct { uint16_t x; } __attribute__((__packed__)) *t = p;
+  return t->x;
+#else
   uint16_t t;
   memcpy(&t, p, sizeof t);
   return t;
+#endif
 }
 static BROTLI_INLINE uint32_t BrotliUnalignedRead32(const void* p) {
+#if defined(__mips__) && (!defined(__mips_isa_rev) || __mips_isa_rev < 6)
+  const struct { uint32_t x; } __attribute__((__packed__)) *t = p;
+  return t->x;
+#else
   uint32_t t;
   memcpy(&t, p, sizeof t);
   return t;
+#endif
 }
 static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) {
+#if defined(__mips__) && (!defined(__mips_isa_rev) || __mips_isa_rev < 6)
+  const struct { uint64_t x; } __attribute__((__packed__)) *t = p;
+  return t->x;
+#else
   uint64_t t;
   memcpy(&t, p, sizeof t);
   return t;
+#endif
 }
 static BROTLI_INLINE size_t BrotliUnalignedReadSizeT(const void* p) {
   size_t t;
@@ -338,7 +361,12 @@
   return t;
 }
 static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) {
+#if defined(__mips__) && (!defined(__mips_isa_rev) || __mips_isa_rev < 6)
+  struct { uint64_t x; } __attribute__((__packed__)) *t = p;
+  t->x = v;
+#else
   memcpy(p, &v, sizeof v);
+#endif
 }
 
 #endif  /* BROTLI_USE_PACKED_FOR_UNALIGNED */
