Index: libphobos/libdruntime/config/mips/switchcontext.S
--- libphobos/libdruntime/config/mips/switchcontext.S.orig
+++ libphobos/libdruntime/config/mips/switchcontext.S
@@ -108,73 +108,98 @@ fiber_switchContext:
  * $a1 - void*  - new stack pointer
  *
  */
+#define ABOVE (10 * 8)
+#ifdef __mips_hard_float
+#define BELOW (8 * 8 + 8)
+#define TSTACK_OFFSET (10 * 8)
+#else
+#define BELOW 8
+#define TSTACK_OFFSET (2 * 8)
+#endif
+#define FRAME_SIZE (TSTACK_OFFSET + ABOVE)
+
     .text
     .globl fiber_switchContext
     .align 2
     .ent fiber_switchContext,0
 fiber_switchContext:
     .cfi_startproc
-    daddiu $sp, $sp, -(10 * 8)
+    daddiu $sp, $sp, -FRAME_SIZE
+    daddiu $v0, $sp, TSTACK_OFFSET
 
     // fp regs and return address are stored below the stack
     // because we don't want the GC to scan them.
 
 #ifdef __mips_hard_float
-#define BELOW (8 * 8 + 8)
-    s.d  $f24, (0 * 8 - BELOW)($sp)
-    s.d  $f25, (1 * 8 - BELOW)($sp)
-    s.d  $f26, (2 * 8 - BELOW)($sp)
-    s.d  $f27, (3 * 8 - BELOW)($sp)
-    s.d  $f28, (4 * 8 - BELOW)($sp)
-    s.d  $f29, (5 * 8 - BELOW)($sp)
-    s.d  $f30, (6 * 8 - BELOW)($sp)
-    s.d  $f31, (7 * 8 - BELOW)($sp)
+    s.d  $f24, (0 * 8 - BELOW)($v0)
+    s.d  $f25, (1 * 8 - BELOW)($v0)
+    s.d  $f26, (2 * 8 - BELOW)($v0)
+    s.d  $f27, (3 * 8 - BELOW)($v0)
+    s.d  $f28, (4 * 8 - BELOW)($v0)
+    s.d  $f29, (5 * 8 - BELOW)($v0)
+    s.d  $f30, (6 * 8 - BELOW)($v0)
+    s.d  $f31, (7 * 8 - BELOW)($v0)
 #endif
-    sd $ra, -8($sp)
+    sd $ra, -8($v0)
 
-    sd  $s0, (0 * 8)($sp)
-    sd  $s1, (1 * 8)($sp)
-    sd  $s2, (2 * 8)($sp)
-    sd  $s3, (3 * 8)($sp)
-    sd  $s4, (4 * 8)($sp)
-    sd  $s5, (5 * 8)($sp)
-    sd  $s6, (6 * 8)($sp)
-    sd  $s7, (7 * 8)($sp)
-    sd  $gp, (8 * 8)($sp)
-    sd  $fp, (9 * 8)($sp)
+    sd  $s0, (0 * 8)($v0)
+    sd  $s1, (1 * 8)($v0)
+    sd  $s2, (2 * 8)($v0)
+    sd  $s3, (3 * 8)($v0)
+    sd  $s4, (4 * 8)($v0)
+    sd  $s5, (5 * 8)($v0)
+    sd  $s6, (6 * 8)($v0)
+    sd  $s7, (7 * 8)($v0)
+    sd  $gp, (8 * 8)($v0)
+    sd  $fp, (9 * 8)($v0)
 
     // swap stack pointer
-    sd   $sp, 0($a0)
-    move $sp, $a1
+    sd   $v0, 0($a0)
+    move $v0, $a1
+    daddiu $sp, $v0, -TSTACK_OFFSET
 
 #ifdef __mips_hard_float
-    l.d  $f24, (0 * 8 - BELOW)($sp)
-    l.d  $f25, (1 * 8 - BELOW)($sp)
-    l.d  $f26, (2 * 8 - BELOW)($sp)
-    l.d  $f27, (3 * 8 - BELOW)($sp)
-    l.d  $f28, (4 * 8 - BELOW)($sp)
-    l.d  $f29, (5 * 8 - BELOW)($sp)
-    l.d  $f30, (6 * 8 - BELOW)($sp)
-    l.d  $f31, (7 * 8 - BELOW)($sp)
+    l.d  $f24, (0 * 8 - BELOW)($v0)
+    l.d  $f25, (1 * 8 - BELOW)($v0)
+    l.d  $f26, (2 * 8 - BELOW)($v0)
+    l.d  $f27, (3 * 8 - BELOW)($v0)
+    l.d  $f28, (4 * 8 - BELOW)($v0)
+    l.d  $f29, (5 * 8 - BELOW)($v0)
+    l.d  $f30, (6 * 8 - BELOW)($v0)
+    l.d  $f31, (7 * 8 - BELOW)($v0)
 #endif
-    ld $ra, -8($sp)
+    ld $ra, -8($v0)
 
-    ld $s0, (0 * 8)($sp)
-    ld $s1, (1 * 8)($sp)
-    ld $s2, (2 * 8)($sp)
-    ld $s3, (3 * 8)($sp)
-    ld $s4, (4 * 8)($sp)
-    ld $s5, (5 * 8)($sp)
-    ld $s6, (6 * 8)($sp)
-    ld $s7, (7 * 8)($sp)
-    ld $gp, (8 * 8)($sp)
-    ld $fp, (9 * 8)($sp)
+    ld $s0, (0 * 8)($v0)
+    ld $s1, (1 * 8)($v0)
+    ld $s2, (2 * 8)($v0)
+    ld $s3, (3 * 8)($v0)
+    ld $s4, (4 * 8)($v0)
+    ld $s5, (5 * 8)($v0)
+    ld $s6, (6 * 8)($v0)
+    ld $s7, (7 * 8)($v0)
+    ld $gp, (8 * 8)($v0)
+    ld $fp, (9 * 8)($v0)
 
-    daddiu $sp, $sp, (10 * 8)
+    daddiu $sp, $sp, FRAME_SIZE
 
     jr $ra // return
     .cfi_endproc
     .end fiber_switchContext
     .size fiber_switchContext,.-fiber_switchContext
+
+    .text
+    .globl fiber_trampoline
+    .align 2
+    .ent fiber_trampoline,0
+fiber_trampoline:
+    .cfi_startproc
+    .cfi_undefined 31
+    move $t9, $s0
+    move $ra, $zero
+    jr $t9
+    .cfi_endproc
+    .end fiber_trampoline
+    .size fiber_trampoline,.-fiber_trampoline
 
 #endif /* defined(__mips64) && _MIPS_SIM == _ABI64 */
