Browse Source

PPC/e500: Fix tailcall from fast function (esp. tostring).

Mike Pall 13 years ago
parent
commit
10b9ed37e0
2 changed files with 173 additions and 171 deletions
  1. 1 0
      src/buildvm_ppcspe.dasc
  2. 172 171
      src/buildvm_ppcspe.h

+ 1 - 0
src/buildvm_ppcspe.dasc

@@ -1813,6 +1813,7 @@ static void build_subroutines(BuildCtx *ctx)
   |  bne >3
   |  bne >3
   |  lwz INS, -4(PC)
   |  lwz INS, -4(PC)
   |  decode_RA8 TMP1, INS
   |  decode_RA8 TMP1, INS
+  |  addi TMP1, TMP1, 8
   |3:
   |3:
   |  sub TMP2, BASE, TMP1
   |  sub TMP2, BASE, TMP1
   |  b ->vm_call_dispatch		// Resolve again for tailcall.
   |  b ->vm_call_dispatch		// Resolve again for tailcall.

+ 172 - 171
src/buildvm_ppcspe.h

@@ -12,7 +12,7 @@
 #define DASM_SECTION_CODE_OP	0
 #define DASM_SECTION_CODE_OP	0
 #define DASM_SECTION_CODE_SUB	1
 #define DASM_SECTION_CODE_SUB	1
 #define DASM_MAXSECTION		2
 #define DASM_MAXSECTION		2
-static const unsigned int build_actionlist[4995] = {
+static const unsigned int build_actionlist[4996] = {
 0x00010001,
 0x00010001,
 0x00060014,
 0x00060014,
 0x72000000,
 0x72000000,
@@ -2516,6 +2516,7 @@ static const unsigned int build_actionlist[4995] = {
 0x00050803,
 0x00050803,
 0x80f0fffc,
 0x80f0fffc,
 0x54e8dd78,
 0x54e8dd78,
+0x39080008,
 0x0006000d,
 0x0006000d,
 0x7d287050,
 0x7d287050,
 0x48000000,
 0x48000000,
@@ -5433,38 +5434,38 @@ static void build_subroutines(BuildCtx *ctx)
   dasm_put(Dst, 2417, Dt8(->f), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->base), 31-3, Dt1(->top), Dt7(->pc));
   dasm_put(Dst, 2417, Dt8(->f), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->base), 31-3, Dt1(->top), Dt7(->pc));
   dasm_put(Dst, 2496, FRAME_TYPE, LUA_MINSTACK, Dt1(->base), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));
   dasm_put(Dst, 2496, FRAME_TYPE, LUA_MINSTACK, Dt1(->base), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));
 #if LJ_HASJIT
 #if LJ_HASJIT
-  dasm_put(Dst, 2538);
+  dasm_put(Dst, 2539);
 #endif
 #endif
-  dasm_put(Dst, 2540, DISPATCH_GL(hookmask), HOOK_ACTIVE, GG_DISP2STATIC, DISPATCH_GL(hookmask), DISPATCH_GL(hookcount), HOOK_ACTIVE, 31-LUA_HOOKLINE, DISPATCH_GL(hookcount), Dt1(->base), Dt1(->base));
-  dasm_put(Dst, 2587, GG_DISP2STATIC);
+  dasm_put(Dst, 2541, DISPATCH_GL(hookmask), HOOK_ACTIVE, GG_DISP2STATIC, DISPATCH_GL(hookmask), DISPATCH_GL(hookcount), HOOK_ACTIVE, 31-LUA_HOOKLINE, DISPATCH_GL(hookcount), Dt1(->base), Dt1(->base));
+  dasm_put(Dst, 2588, GG_DISP2STATIC);
 #if LJ_HASJIT
 #if LJ_HASJIT
-  dasm_put(Dst, 2605);
+  dasm_put(Dst, 2606);
 #endif
 #endif
-  dasm_put(Dst, 2607);
+  dasm_put(Dst, 2608);
 #if LJ_HASJIT
 #if LJ_HASJIT
-  dasm_put(Dst, 2610);
+  dasm_put(Dst, 2611);
 #endif
 #endif
-  dasm_put(Dst, 2613);
+  dasm_put(Dst, 2614);
 #if LJ_HASJIT
 #if LJ_HASJIT
-  dasm_put(Dst, 2615);
+  dasm_put(Dst, 2616);
 #endif
 #endif
-  dasm_put(Dst, 2618, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));
+  dasm_put(Dst, 2619, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));
 #if LJ_HASJIT
 #if LJ_HASJIT
-  dasm_put(Dst, 2640);
+  dasm_put(Dst, 2641);
 #endif
 #endif
-  dasm_put(Dst, 2642);
+  dasm_put(Dst, 2643);
 #if LJ_HASJIT
 #if LJ_HASJIT
-  dasm_put(Dst, 2644);
+  dasm_put(Dst, 2645);
 #endif
 #endif
-  dasm_put(Dst, 2646);
+  dasm_put(Dst, 2647);
 #if LJ_HASJIT
 #if LJ_HASJIT
-  dasm_put(Dst, 2730);
+  dasm_put(Dst, 2731);
 #else
 #else
-  dasm_put(Dst, 2753);
+  dasm_put(Dst, 2754);
 #endif
 #endif
-  dasm_put(Dst, 2756);
+  dasm_put(Dst, 2757);
 #if LJ_HASFFI
 #if LJ_HASFFI
-  dasm_put(Dst, 2819);
+  dasm_put(Dst, 2820);
 #endif
 #endif
 }
 }
 
 
@@ -5472,7 +5473,7 @@ static void build_subroutines(BuildCtx *ctx)
 static void build_ins(BuildCtx *ctx, BCOp op, int defop)
 static void build_ins(BuildCtx *ctx, BCOp op, int defop)
 {
 {
   int vk = 0;
   int vk = 0;
-  dasm_put(Dst, 2821, defop);
+  dasm_put(Dst, 2822, defop);
 
 
   switch (op) {
   switch (op) {
 
 
@@ -5481,118 +5482,118 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
   /* Remember: all ops branch for a true comparison, fall through otherwise. */
   /* Remember: all ops branch for a true comparison, fall through otherwise. */
 
 
   case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:
   case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:
-    dasm_put(Dst, 2823, -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 2824, -(BCBIAS_J*4 >> 16));
     if (op == BC_ISLE || op == BC_ISGT) {
     if (op == BC_ISLE || op == BC_ISGT) {
-      dasm_put(Dst, 2837);
+      dasm_put(Dst, 2838);
     }
     }
     if (op == BC_ISLT || op == BC_ISLE) {
     if (op == BC_ISLT || op == BC_ISLE) {
-      dasm_put(Dst, 2840);
+      dasm_put(Dst, 2841);
     } else {
     } else {
-      dasm_put(Dst, 2842);
+      dasm_put(Dst, 2843);
     }
     }
-    dasm_put(Dst, 2844);
+    dasm_put(Dst, 2845);
     break;
     break;
 
 
   case BC_ISEQV: case BC_ISNEV:
   case BC_ISEQV: case BC_ISNEV:
     vk = op == BC_ISEQV;
     vk = op == BC_ISEQV;
-    dasm_put(Dst, 2855, -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 2856, -(BCBIAS_J*4 >> 16));
     if (vk) {
     if (vk) {
-      dasm_put(Dst, 2869);
+      dasm_put(Dst, 2870);
     } else {
     } else {
-      dasm_put(Dst, 2871);
+      dasm_put(Dst, 2872);
     }
     }
-    dasm_put(Dst, 2873, ~LJ_TISPRI, ~LJ_TISTABUD);
+    dasm_put(Dst, 2874, ~LJ_TISPRI, ~LJ_TISTABUD);
     if (vk) {
     if (vk) {
-      dasm_put(Dst, 2895);
+      dasm_put(Dst, 2896);
     } else {
     } else {
-      dasm_put(Dst, 2897);
+      dasm_put(Dst, 2898);
     }
     }
-    dasm_put(Dst, 2899);
+    dasm_put(Dst, 2900);
     if (vk) {
     if (vk) {
-      dasm_put(Dst, 2901);
+      dasm_put(Dst, 2902);
     } else {
     } else {
-      dasm_put(Dst, 2903);
+      dasm_put(Dst, 2904);
     }
     }
-    dasm_put(Dst, 2905, Dt6(->metatable), 1-vk, Dt6(->nomm), 1<<MM_eq);
+    dasm_put(Dst, 2906, Dt6(->metatable), 1-vk, Dt6(->nomm), 1<<MM_eq);
     break;
     break;
 
 
   case BC_ISEQS: case BC_ISNES:
   case BC_ISEQS: case BC_ISNES:
     vk = op == BC_ISEQS;
     vk = op == BC_ISEQS;
-    dasm_put(Dst, 2926, 32-1, -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 2927, 32-1, -(BCBIAS_J*4 >> 16));
     if (vk) {
     if (vk) {
-      dasm_put(Dst, 2940);
+      dasm_put(Dst, 2941);
     } else {
     } else {
-      dasm_put(Dst, 2942);
+      dasm_put(Dst, 2943);
     }
     }
-    dasm_put(Dst, 2944);
+    dasm_put(Dst, 2945);
     break;
     break;
 
 
   case BC_ISEQN: case BC_ISNEN:
   case BC_ISEQN: case BC_ISNEN:
     vk = op == BC_ISEQN;
     vk = op == BC_ISEQN;
-    dasm_put(Dst, 2955, -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 2956, -(BCBIAS_J*4 >> 16));
     if (vk) {
     if (vk) {
-      dasm_put(Dst, 2969);
+      dasm_put(Dst, 2970);
     } else {
     } else {
-      dasm_put(Dst, 2972);
+      dasm_put(Dst, 2973);
     }
     }
-    dasm_put(Dst, 2974);
+    dasm_put(Dst, 2975);
     if (!vk) {
     if (!vk) {
-      dasm_put(Dst, 2986);
+      dasm_put(Dst, 2987);
     }
     }
     break;
     break;
 
 
   case BC_ISEQP: case BC_ISNEP:
   case BC_ISEQP: case BC_ISNEP:
     vk = op == BC_ISEQP;
     vk = op == BC_ISEQP;
-    dasm_put(Dst, 2992, 32-3, -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 2993, 32-3, -(BCBIAS_J*4 >> 16));
     if (vk) {
     if (vk) {
-      dasm_put(Dst, 3004);
+      dasm_put(Dst, 3005);
     } else {
     } else {
-      dasm_put(Dst, 3006);
+      dasm_put(Dst, 3007);
     }
     }
-    dasm_put(Dst, 3008);
+    dasm_put(Dst, 3009);
     break;
     break;
 
 
   /* -- Unary test and copy ops ------------------------------------------- */
   /* -- Unary test and copy ops ------------------------------------------- */
 
 
   case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:
   case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:
-    dasm_put(Dst, 3019);
+    dasm_put(Dst, 3020);
     if (op == BC_IST || op == BC_ISF) {
     if (op == BC_IST || op == BC_ISF) {
-      dasm_put(Dst, 3025, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 3026, -(BCBIAS_J*4 >> 16));
       if (op == BC_IST) {
       if (op == BC_IST) {
-	dasm_put(Dst, 3030);
+	dasm_put(Dst, 3031);
       } else {
       } else {
-	dasm_put(Dst, 3032);
+	dasm_put(Dst, 3033);
       }
       }
     } else {
     } else {
       if (op == BC_ISTC) {
       if (op == BC_ISTC) {
-	dasm_put(Dst, 3034);
+	dasm_put(Dst, 3035);
       } else {
       } else {
-	dasm_put(Dst, 3037);
+	dasm_put(Dst, 3038);
       }
       }
-      dasm_put(Dst, 3040, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 3041, -(BCBIAS_J*4 >> 16));
     }
     }
-    dasm_put(Dst, 3047);
+    dasm_put(Dst, 3048);
     break;
     break;
 
 
   /* -- Unary ops --------------------------------------------------------- */
   /* -- Unary ops --------------------------------------------------------- */
 
 
   case BC_MOV:
   case BC_MOV:
-    dasm_put(Dst, 3058);
+    dasm_put(Dst, 3059);
     break;
     break;
   case BC_NOT:
   case BC_NOT:
-    dasm_put(Dst, 3071, LJ_TTRUE);
+    dasm_put(Dst, 3072, LJ_TTRUE);
     break;
     break;
   case BC_UNM:
   case BC_UNM:
-    dasm_put(Dst, 3087);
+    dasm_put(Dst, 3088);
     break;
     break;
   case BC_LEN:
   case BC_LEN:
-    dasm_put(Dst, 3104, Dt5(->len));
+    dasm_put(Dst, 3105, Dt5(->len));
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
-    dasm_put(Dst, 3128, Dt6(->metatable));
+    dasm_put(Dst, 3129, Dt6(->metatable));
 #endif
 #endif
-    dasm_put(Dst, 3135);
+    dasm_put(Dst, 3136);
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
-    dasm_put(Dst, 3141, Dt6(->nomm), 1<<MM_len);
+    dasm_put(Dst, 3142, Dt6(->nomm), 1<<MM_len);
 #endif
 #endif
     break;
     break;
 
 
@@ -5603,262 +5604,262 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     switch (vk) {
     case 0:
     case 0:
-    dasm_put(Dst, 3151);
+    dasm_put(Dst, 3152);
       break;
       break;
     case 1:
     case 1:
-    dasm_put(Dst, 3157);
+    dasm_put(Dst, 3158);
       break;
       break;
     default:
     default:
-    dasm_put(Dst, 3163);
+    dasm_put(Dst, 3164);
       break;
       break;
     }
     }
-    dasm_put(Dst, 3170);
+    dasm_put(Dst, 3171);
     break;
     break;
   case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:
   case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     switch (vk) {
     case 0:
     case 0:
-    dasm_put(Dst, 3183);
+    dasm_put(Dst, 3184);
       break;
       break;
     case 1:
     case 1:
-    dasm_put(Dst, 3189);
+    dasm_put(Dst, 3190);
       break;
       break;
     default:
     default:
-    dasm_put(Dst, 3195);
+    dasm_put(Dst, 3196);
       break;
       break;
     }
     }
-    dasm_put(Dst, 3202);
+    dasm_put(Dst, 3203);
     break;
     break;
   case BC_MULVN: case BC_MULNV: case BC_MULVV:
   case BC_MULVN: case BC_MULNV: case BC_MULVV:
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     switch (vk) {
     case 0:
     case 0:
-    dasm_put(Dst, 3215);
+    dasm_put(Dst, 3216);
       break;
       break;
     case 1:
     case 1:
-    dasm_put(Dst, 3221);
+    dasm_put(Dst, 3222);
       break;
       break;
     default:
     default:
-    dasm_put(Dst, 3227);
+    dasm_put(Dst, 3228);
       break;
       break;
     }
     }
-    dasm_put(Dst, 3234);
+    dasm_put(Dst, 3235);
     break;
     break;
   case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:
   case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     switch (vk) {
     case 0:
     case 0:
-    dasm_put(Dst, 3247);
+    dasm_put(Dst, 3248);
       break;
       break;
     case 1:
     case 1:
-    dasm_put(Dst, 3253);
+    dasm_put(Dst, 3254);
       break;
       break;
     default:
     default:
-    dasm_put(Dst, 3259);
+    dasm_put(Dst, 3260);
       break;
       break;
     }
     }
-    dasm_put(Dst, 3266);
+    dasm_put(Dst, 3267);
     break;
     break;
   case BC_MODVN:
   case BC_MODVN:
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     switch (vk) {
     case 0:
     case 0:
-    dasm_put(Dst, 3279);
+    dasm_put(Dst, 3280);
       break;
       break;
     case 1:
     case 1:
-    dasm_put(Dst, 3285);
+    dasm_put(Dst, 3286);
       break;
       break;
     default:
     default:
-    dasm_put(Dst, 3291);
+    dasm_put(Dst, 3292);
       break;
       break;
     }
     }
-    dasm_put(Dst, 3298);
+    dasm_put(Dst, 3299);
     break;
     break;
   case BC_MODNV: case BC_MODVV:
   case BC_MODNV: case BC_MODVV:
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     switch (vk) {
     case 0:
     case 0:
-    dasm_put(Dst, 3316);
+    dasm_put(Dst, 3317);
       break;
       break;
     case 1:
     case 1:
-    dasm_put(Dst, 3322);
+    dasm_put(Dst, 3323);
       break;
       break;
     default:
     default:
-    dasm_put(Dst, 3328);
+    dasm_put(Dst, 3329);
       break;
       break;
     }
     }
-    dasm_put(Dst, 3335);
+    dasm_put(Dst, 3336);
     break;
     break;
   case BC_POW:
   case BC_POW:
-    dasm_put(Dst, 3338);
+    dasm_put(Dst, 3339);
     break;
     break;
 
 
   case BC_CAT:
   case BC_CAT:
-    dasm_put(Dst, 3360, Dt1(->base), 32-3, Dt1(->base));
+    dasm_put(Dst, 3361, Dt1(->base), 32-3, Dt1(->base));
     break;
     break;
 
 
   /* -- Constant ops ------------------------------------------------------ */
   /* -- Constant ops ------------------------------------------------------ */
 
 
   case BC_KSTR:
   case BC_KSTR:
-    dasm_put(Dst, 3390, 32-1);
+    dasm_put(Dst, 3391, 32-1);
     break;
     break;
   case BC_KCDATA:
   case BC_KCDATA:
 #if LJ_HASFFI
 #if LJ_HASFFI
-    dasm_put(Dst, 3407, 32-1, LJ_TCDATA);
+    dasm_put(Dst, 3408, 32-1, LJ_TCDATA);
 #endif
 #endif
     break;
     break;
   case BC_KSHORT:
   case BC_KSHORT:
-    dasm_put(Dst, 3426, 32-3);
+    dasm_put(Dst, 3427, 32-3);
     break;
     break;
   case BC_KNUM:
   case BC_KNUM:
-    dasm_put(Dst, 3442);
+    dasm_put(Dst, 3443);
     break;
     break;
   case BC_KPRI:
   case BC_KPRI:
-    dasm_put(Dst, 3455, 32-3);
+    dasm_put(Dst, 3456, 32-3);
     break;
     break;
   case BC_KNIL:
   case BC_KNIL:
-    dasm_put(Dst, 3470);
+    dasm_put(Dst, 3471);
     break;
     break;
 
 
   /* -- Upvalue and function ops ------------------------------------------ */
   /* -- Upvalue and function ops ------------------------------------------ */
 
 
   case BC_UGET:
   case BC_UGET:
-    dasm_put(Dst, 3489, 32-1, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 3490, 32-1, offsetof(GCfuncL, uvptr), DtA(->v));
     break;
     break;
   case BC_USETV:
   case BC_USETV:
-    dasm_put(Dst, 3510, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, DtA(->closed), -(LJ_TISNUM+1), LJ_TISGCV - (LJ_TISNUM+1), Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G);
+    dasm_put(Dst, 3511, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, DtA(->closed), -(LJ_TISNUM+1), LJ_TISGCV - (LJ_TISNUM+1), Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G);
     break;
     break;
   case BC_USETS:
   case BC_USETS:
-    dasm_put(Dst, 3562, 32-1, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, Dt5(->marked), DtA(->closed), LJ_GC_WHITES, GG_DISP2G);
+    dasm_put(Dst, 3563, 32-1, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, Dt5(->marked), DtA(->closed), LJ_GC_WHITES, GG_DISP2G);
     break;
     break;
   case BC_USETN:
   case BC_USETN:
-    dasm_put(Dst, 3611, 32-1, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 3612, 32-1, offsetof(GCfuncL, uvptr), DtA(->v));
     break;
     break;
   case BC_USETP:
   case BC_USETP:
-    dasm_put(Dst, 3632, 32-1, offsetof(GCfuncL, uvptr), 32-3, DtA(->v));
+    dasm_put(Dst, 3633, 32-1, offsetof(GCfuncL, uvptr), 32-3, DtA(->v));
     break;
     break;
 
 
   case BC_UCLO:
   case BC_UCLO:
-    dasm_put(Dst, 3655, Dt1(->openupval), 32-1, -(BCBIAS_J*4 >> 16), Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 3656, Dt1(->openupval), 32-1, -(BCBIAS_J*4 >> 16), Dt1(->base), Dt1(->base));
     break;
     break;
 
 
   case BC_FNEW:
   case BC_FNEW:
-    dasm_put(Dst, 3685, 32-1, Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 3686, 32-1, Dt1(->base), Dt1(->base));
     break;
     break;
 
 
   /* -- Table ops --------------------------------------------------------- */
   /* -- Table ops --------------------------------------------------------- */
 
 
   case BC_TNEW:
   case BC_TNEW:
   case BC_TDUP:
   case BC_TDUP:
-    dasm_put(Dst, 3711, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base));
+    dasm_put(Dst, 3712, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base));
     if (op == BC_TNEW) {
     if (op == BC_TNEW) {
-      dasm_put(Dst, 3724);
+      dasm_put(Dst, 3725);
     } else {
     } else {
-      dasm_put(Dst, 3732, 32-1);
+      dasm_put(Dst, 3733, 32-1);
     }
     }
-    dasm_put(Dst, 3739, Dt1(->base));
+    dasm_put(Dst, 3740, Dt1(->base));
     break;
     break;
 
 
   case BC_GGET:
   case BC_GGET:
   case BC_GSET:
   case BC_GSET:
-    dasm_put(Dst, 3762, 32-1, Dt7(->env));
+    dasm_put(Dst, 3763, 32-1, Dt7(->env));
     if (op == BC_GGET) {
     if (op == BC_GGET) {
-      dasm_put(Dst, 3770);
+      dasm_put(Dst, 3771);
     } else {
     } else {
-      dasm_put(Dst, 3773);
+      dasm_put(Dst, 3774);
     }
     }
     break;
     break;
 
 
   case BC_TGETV:
   case BC_TGETV:
-    dasm_put(Dst, 3776, Dt6(->asize), Dt6(->array), 31-3, Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 3777, Dt6(->asize), Dt6(->array), 31-3, Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
     break;
     break;
   case BC_TGETS:
   case BC_TGETS:
-    dasm_put(Dst, 3834, 32-1, Dt6(->hmask), Dt5(->hash), Dt6(->node), 31-5, 31-3, DtB(->key), DtB(->val), DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
-    dasm_put(Dst, 3898);
+    dasm_put(Dst, 3835, 32-1, Dt6(->hmask), Dt5(->hash), Dt6(->node), 31-5, 31-3, DtB(->key), DtB(->val), DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 3899);
     break;
     break;
   case BC_TGETB:
   case BC_TGETB:
-    dasm_put(Dst, 3903, 32-3, Dt6(->asize), Dt6(->array), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 3904, 32-3, Dt6(->asize), Dt6(->array), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
     break;
     break;
 
 
   case BC_TSETV:
   case BC_TSETV:
-    dasm_put(Dst, 3947, Dt6(->asize), Dt6(->array), 31-3, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex);
-    dasm_put(Dst, 4014, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
+    dasm_put(Dst, 3948, Dt6(->asize), Dt6(->array), 31-3, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex);
+    dasm_put(Dst, 4015, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
     break;
     break;
   case BC_TSETS:
   case BC_TSETS:
-    dasm_put(Dst, 4026, 32-1, Dt6(->hmask), Dt5(->hash), Dt6(->node), Dt6(->nomm), 31-5, 31-3, Dt6(->marked), DtB(->key), DtB(->val), LJ_GC_BLACK, DtB(->val), Dt6(->metatable));
-    dasm_put(Dst, 4087, Dt6(->nomm), 1<<MM_newindex, DtB(->next), Dt6(->metatable), DISPATCH_GL(tmptv), Dt1(->base), Dt6(->nomm), 1<<MM_newindex, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain));
-    dasm_put(Dst, 4138, Dt6(->marked), Dt6(->gclist));
+    dasm_put(Dst, 4027, 32-1, Dt6(->hmask), Dt5(->hash), Dt6(->node), Dt6(->nomm), 31-5, 31-3, Dt6(->marked), DtB(->key), DtB(->val), LJ_GC_BLACK, DtB(->val), Dt6(->metatable));
+    dasm_put(Dst, 4088, Dt6(->nomm), 1<<MM_newindex, DtB(->next), Dt6(->metatable), DISPATCH_GL(tmptv), Dt1(->base), Dt6(->nomm), 1<<MM_newindex, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain));
+    dasm_put(Dst, 4139, Dt6(->marked), Dt6(->gclist));
     break;
     break;
   case BC_TSETB:
   case BC_TSETB:
-    dasm_put(Dst, 4145, 32-3, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked));
-    dasm_put(Dst, 4205, Dt6(->gclist));
+    dasm_put(Dst, 4146, 32-3, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked));
+    dasm_put(Dst, 4206, Dt6(->gclist));
     break;
     break;
 
 
   case BC_TSETM:
   case BC_TSETM:
-    dasm_put(Dst, 4210, 32-3, Dt6(->asize), 31-3, Dt6(->marked), Dt6(->array), LJ_GC_BLACK, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
-    dasm_put(Dst, 4279);
+    dasm_put(Dst, 4211, 32-3, Dt6(->asize), 31-3, Dt6(->marked), Dt6(->array), LJ_GC_BLACK, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
+    dasm_put(Dst, 4280);
     break;
     break;
 
 
   /* -- Calls and vararg handling ----------------------------------------- */
   /* -- Calls and vararg handling ----------------------------------------- */
 
 
   case BC_CALLM:
   case BC_CALLM:
-    dasm_put(Dst, 4282);
+    dasm_put(Dst, 4283);
     break;
     break;
   case BC_CALL:
   case BC_CALL:
-    dasm_put(Dst, 4284, Dt7(->pc));
+    dasm_put(Dst, 4285, Dt7(->pc));
     break;
     break;
 
 
   case BC_CALLMT:
   case BC_CALLMT:
-    dasm_put(Dst, 4304);
+    dasm_put(Dst, 4305);
     break;
     break;
   case BC_CALLT:
   case BC_CALLT:
-    dasm_put(Dst, 4306, FRAME_TYPE, Dt7(->ffid), FRAME_VARG, Dt7(->pc), -4-8, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP);
-    dasm_put(Dst, 4371, FRAME_TYPE);
+    dasm_put(Dst, 4307, FRAME_TYPE, Dt7(->ffid), FRAME_VARG, Dt7(->pc), -4-8, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP);
+    dasm_put(Dst, 4372, FRAME_TYPE);
     break;
     break;
 
 
   case BC_ITERC:
   case BC_ITERC:
-    dasm_put(Dst, 4378, Dt7(->pc));
+    dasm_put(Dst, 4379, Dt7(->pc));
     break;
     break;
 
 
   case BC_ITERN:
   case BC_ITERN:
 #if LJ_HASJIT
 #if LJ_HASJIT
 #endif
 #endif
-    dasm_put(Dst, 4404, Dt6(->asize), Dt6(->array), 31-3, -(BCBIAS_J*4 >> 16), Dt6(->hmask), Dt6(->node), 31-5, 31-3, DtB(->key), -(BCBIAS_J*4 >> 16));
-    dasm_put(Dst, 4483);
+    dasm_put(Dst, 4405, Dt6(->asize), Dt6(->array), 31-3, -(BCBIAS_J*4 >> 16), Dt6(->hmask), Dt6(->node), 31-5, 31-3, DtB(->key), -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 4484);
     break;
     break;
 
 
   case BC_ISNEXT:
   case BC_ISNEXT:
-    dasm_put(Dst, 4487, LJ_TTAB, LJ_TFUNC, LJ_TNIL, Dt8(->ffid), FF_next_N, 32-1, -(BCBIAS_J*4 >> 16), BC_JMP, BC_ITERC, -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 4488, LJ_TTAB, LJ_TFUNC, LJ_TNIL, Dt8(->ffid), FF_next_N, 32-1, -(BCBIAS_J*4 >> 16), BC_JMP, BC_ITERC, -(BCBIAS_J*4 >> 16));
     break;
     break;
 
 
   case BC_VARG:
   case BC_VARG:
-    dasm_put(Dst, 4538, FRAME_VARG, Dt1(->maxstack), Dt1(->top), Dt1(->base), 32-3, Dt1(->base));
-    dasm_put(Dst, 4618);
+    dasm_put(Dst, 4539, FRAME_VARG, Dt1(->maxstack), Dt1(->top), Dt1(->base), 32-3, Dt1(->base));
+    dasm_put(Dst, 4619);
     break;
     break;
 
 
   /* -- Returns ----------------------------------------------------------- */
   /* -- Returns ----------------------------------------------------------- */
 
 
   case BC_RETM:
   case BC_RETM:
-    dasm_put(Dst, 4624);
+    dasm_put(Dst, 4625);
     break;
     break;
 
 
   case BC_RET:
   case BC_RET:
-    dasm_put(Dst, 4626, FRAME_TYPE, FRAME_VARG, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP);
+    dasm_put(Dst, 4627, FRAME_TYPE, FRAME_VARG, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP);
     break;
     break;
 
 
   case BC_RET0: case BC_RET1:
   case BC_RET0: case BC_RET1:
-    dasm_put(Dst, 4696, FRAME_TYPE, FRAME_VARG);
+    dasm_put(Dst, 4697, FRAME_TYPE, FRAME_VARG);
     if (op == BC_RET1) {
     if (op == BC_RET1) {
-      dasm_put(Dst, 4709);
+      dasm_put(Dst, 4710);
     }
     }
-    dasm_put(Dst, 4712, Dt7(->pc), PC2PROTO(k));
+    dasm_put(Dst, 4713, Dt7(->pc), PC2PROTO(k));
     break;
     break;
 
 
   /* -- Loops and branches ------------------------------------------------ */
   /* -- Loops and branches ------------------------------------------------ */
 
 
   case BC_FORL:
   case BC_FORL:
 #if LJ_HASJIT
 #if LJ_HASJIT
-    dasm_put(Dst, 4740);
+    dasm_put(Dst, 4741);
 #endif
 #endif
     break;
     break;
 
 
@@ -5870,35 +5871,35 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
   case BC_FORI:
   case BC_FORI:
   case BC_IFORL:
   case BC_IFORL:
     vk = (op == BC_IFORL || op == BC_JFORL);
     vk = (op == BC_IFORL || op == BC_JFORL);
-    dasm_put(Dst, 4742, FORL_IDX*8, FORL_STEP*8, FORL_STOP*8);
+    dasm_put(Dst, 4743, FORL_IDX*8, FORL_STEP*8, FORL_STOP*8);
     if (!vk) {
     if (!vk) {
-      dasm_put(Dst, 4750);
+      dasm_put(Dst, 4751);
     }
     }
     if (vk) {
     if (vk) {
-      dasm_put(Dst, 4758, FORL_IDX*8);
+      dasm_put(Dst, 4759, FORL_IDX*8);
     }
     }
-    dasm_put(Dst, 4762, FORL_EXT*8);
+    dasm_put(Dst, 4763, FORL_EXT*8);
     if (op != BC_JFORL) {
     if (op != BC_JFORL) {
-      dasm_put(Dst, 4770, 32-1);
+      dasm_put(Dst, 4771, 32-1);
       if (op == BC_JFORI) {
       if (op == BC_JFORI) {
-	dasm_put(Dst, 4774, -(BCBIAS_J*4 >> 16));
+	dasm_put(Dst, 4775, -(BCBIAS_J*4 >> 16));
       } else {
       } else {
-	dasm_put(Dst, 4777, -(BCBIAS_J*4 >> 16));
+	dasm_put(Dst, 4778, -(BCBIAS_J*4 >> 16));
       }
       }
     }
     }
     if (op == BC_FORI) {
     if (op == BC_FORI) {
-      dasm_put(Dst, 4780);
+      dasm_put(Dst, 4781);
     } else if (op == BC_IFORL) {
     } else if (op == BC_IFORL) {
-      dasm_put(Dst, 4782);
+      dasm_put(Dst, 4783);
     } else {
     } else {
-      dasm_put(Dst, 4784, BC_JLOOP);
+      dasm_put(Dst, 4785, BC_JLOOP);
     }
     }
-    dasm_put(Dst, 4787);
+    dasm_put(Dst, 4788);
     break;
     break;
 
 
   case BC_ITERL:
   case BC_ITERL:
 #if LJ_HASJIT
 #if LJ_HASJIT
-    dasm_put(Dst, 4802);
+    dasm_put(Dst, 4803);
 #endif
 #endif
     break;
     break;
 
 
@@ -5907,40 +5908,40 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     break;
     break;
 #endif
 #endif
   case BC_IITERL:
   case BC_IITERL:
-    dasm_put(Dst, 4804);
+    dasm_put(Dst, 4805);
     if (op == BC_JITERL) {
     if (op == BC_JITERL) {
-      dasm_put(Dst, 4810);
+      dasm_put(Dst, 4811);
     } else {
     } else {
-      dasm_put(Dst, 4812, 32-1, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 4813, 32-1, -(BCBIAS_J*4 >> 16));
     }
     }
-    dasm_put(Dst, 4819);
+    dasm_put(Dst, 4820);
     break;
     break;
 
 
   case BC_LOOP:
   case BC_LOOP:
 #if LJ_HASJIT
 #if LJ_HASJIT
-    dasm_put(Dst, 4831);
+    dasm_put(Dst, 4832);
 #endif
 #endif
     break;
     break;
 
 
   case BC_ILOOP:
   case BC_ILOOP:
-    dasm_put(Dst, 4833);
+    dasm_put(Dst, 4834);
     break;
     break;
 
 
   case BC_JLOOP:
   case BC_JLOOP:
 #if LJ_HASJIT
 #if LJ_HASJIT
-    dasm_put(Dst, 4844);
+    dasm_put(Dst, 4845);
 #endif
 #endif
     break;
     break;
 
 
   case BC_JMP:
   case BC_JMP:
-    dasm_put(Dst, 4846, 32-1, -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 4847, 32-1, -(BCBIAS_J*4 >> 16));
     break;
     break;
 
 
   /* -- Function headers -------------------------------------------------- */
   /* -- Function headers -------------------------------------------------- */
 
 
   case BC_FUNCF:
   case BC_FUNCF:
 #if LJ_HASJIT
 #if LJ_HASJIT
-    dasm_put(Dst, 4862);
+    dasm_put(Dst, 4863);
 #endif
 #endif
   case BC_FUNCV:  /* NYI: compiled vararg functions. */
   case BC_FUNCV:  /* NYI: compiled vararg functions. */
     break;
     break;
@@ -5950,38 +5951,38 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     break;
     break;
 #endif
 #endif
   case BC_IFUNCF:
   case BC_IFUNCF:
-    dasm_put(Dst, 4864, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k), 31-3);
+    dasm_put(Dst, 4865, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k), 31-3);
     if (op == BC_JFUNCF) {
     if (op == BC_JFUNCF) {
-      dasm_put(Dst, 4882);
+      dasm_put(Dst, 4883);
     } else {
     } else {
-      dasm_put(Dst, 4884);
+      dasm_put(Dst, 4885);
     }
     }
-    dasm_put(Dst, 4893);
+    dasm_put(Dst, 4894);
     break;
     break;
 
 
   case BC_JFUNCV:
   case BC_JFUNCV:
 #if !LJ_HASJIT
 #if !LJ_HASJIT
     break;
     break;
 #endif
 #endif
-    dasm_put(Dst, 4899);
+    dasm_put(Dst, 4900);
     break;  /* NYI: compiled vararg functions. */
     break;  /* NYI: compiled vararg functions. */
 
 
   case BC_IFUNCV:
   case BC_IFUNCV:
-    dasm_put(Dst, 4901, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams));
+    dasm_put(Dst, 4902, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams));
     break;
     break;
 
 
   case BC_FUNCC:
   case BC_FUNCC:
   case BC_FUNCCW:
   case BC_FUNCCW:
     if (op == BC_FUNCC) {
     if (op == BC_FUNCC) {
-      dasm_put(Dst, 4951, Dt8(->f));
+      dasm_put(Dst, 4952, Dt8(->f));
     } else {
     } else {
-      dasm_put(Dst, 4954, DISPATCH_GL(wrapf));
+      dasm_put(Dst, 4955, DISPATCH_GL(wrapf));
     }
     }
-    dasm_put(Dst, 4957, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C);
+    dasm_put(Dst, 4958, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C);
     if (op == BC_FUNCCW) {
     if (op == BC_FUNCCW) {
-      dasm_put(Dst, 4970, Dt8(->f));
+      dasm_put(Dst, 4971, Dt8(->f));
     }
     }
-    dasm_put(Dst, 4973, DISPATCH_GL(vmstate), Dt1(->top), 31-3, Dt1(->base), ~LJ_VMST_INTERP, DISPATCH_GL(vmstate));
+    dasm_put(Dst, 4974, DISPATCH_GL(vmstate), Dt1(->top), 31-3, Dt1(->base), ~LJ_VMST_INTERP, DISPATCH_GL(vmstate));
     break;
     break;
 
 
   /* ---------------------------------------------------------------------- */
   /* ---------------------------------------------------------------------- */
@@ -6001,7 +6002,7 @@ static int build_backend(BuildCtx *ctx)
 
 
   build_subroutines(ctx);
   build_subroutines(ctx);
 
 
-  dasm_put(Dst, 4994);
+  dasm_put(Dst, 4995);
   for (op = 0; op < BC__MAX; op++)
   for (op = 0; op < BC__MAX; op++)
     build_ins(ctx, (BCOp)op, op);
     build_ins(ctx, (BCOp)op, op);