--- a/include/tdep-mips/libunwind_i.h	2020-11-10 17:14:01.000000000 +0100
+++ b/include/tdep-mips/libunwind_i.h	2021-01-11 22:12:16.993539625 +0100
@@ -148,9 +148,10 @@
 static inline int
 read_s32 (struct dwarf_cursor *c, unw_word_t addr, unw_word_t *val)
 {
-  int offset = addr & 4;
   int ret;
   unw_word_t memval;
+#if _MIPS_SIM == _ABI64
+  int offset = addr & 4;
 
   ret = (*c->as->acc.access_mem) (c->as, addr - offset, &memval, 0, c->as_arg);
   if (ret < 0)
@@ -160,6 +161,13 @@
     *val = (int32_t) memval;
   else
     *val = (int32_t) (memval >> 32);
+#else
+  ret = (*c->as->acc.access_mem) (c->as, addr, &memval, 0, c->as_arg);
+  if (ret < 0)
+    return ret;
+
+  *val = (int32_t) memval;
+#endif
 
   return 0;
 }
@@ -167,9 +175,10 @@
 static inline int
 write_s32 (struct dwarf_cursor *c, unw_word_t addr, const unw_word_t *val)
 {
-  int offset = addr & 4;
-  int ret;
   unw_word_t memval;
+#if _MIPS_SIM == _ABI64
+  int offset = addr & 4;
+  int ret;
 
   ret = (*c->as->acc.access_mem) (c->as, addr - offset, &memval, 0, c->as_arg);
   if (ret < 0)
@@ -181,6 +190,10 @@
     memval = (memval & 0xffffffffLL) | (uint32_t) (*val << 32);
 
   return (*c->as->acc.access_mem) (c->as, addr - offset, &memval, 1, c->as_arg);
+#else
+  memval =  (uint32_t) *val;
+  return (*c->as->acc.access_mem) (c->as, addr, &memval, 1, c->as_arg);
+#endif
 }
 
 /* FIXME: Implement these for the MIPS FPU.  */
