From aaaf0e0f5fe573e7c089ece1bd491a8f8b8b3e9a Mon Sep 17 00:00:00 2001
From: Mike Pall <mike>
Date: Fri, 30 Mar 2012 01:33:07 +0200
Subject: MIPS: Interpreter/JIT integration

---
 src/buildvm_mips.dasc | 127 +++++++++-
 src/buildvm_mips.h    | 669 ++++++++++++++++++++++++++++++++++----------------
 2 files changed, 577 insertions(+), 219 deletions(-)

(limited to 'src')

diff --git a/src/buildvm_mips.dasc b/src/buildvm_mips.dasc
index 6b3103dd..9e984189 100644
--- a/src/buildvm_mips.dasc
+++ b/src/buildvm_mips.dasc
@@ -270,7 +270,13 @@
 |.macro jmp_extern; jr CFUNCADDR; .endmacro
 |
 |.macro hotcheck, delta, target
-|NYI
+|  srl TMP1, PC, 1
+|  andi TMP1, TMP1, 126
+|  addu TMP1, TMP1, DISPATCH
+|  lhu TMP2, GG_DISP2HOT(TMP1)
+|  addiu TMP2, TMP2, -delta
+|  bltz TMP2, target
+|.  sh TMP2, GG_DISP2HOT(TMP1)
 |.endmacro
 |
 |.macro hotloop
@@ -1995,7 +2001,21 @@ static void build_subroutines(BuildCtx *ctx)
   |
   |->vm_hotloop:			// Hot loop counter underflow.
 #if LJ_HASJIT
-  |NYI
+  |  lw LFUNC:TMP1, FRAME_FUNC(BASE)
+  |   addiu CARG1, DISPATCH, GG_DISP2J
+  |   sw PC, SAVE_PC
+  |  lw TMP1, LFUNC:TMP1->pc
+  |   move CARG2, PC
+  |   sw L, DISPATCH_J(L)(DISPATCH)
+  |  lbu TMP1, PC2PROTO(framesize)(TMP1)
+  |  load_got lj_trace_hot
+  |   sw BASE, L->base
+  |  sll TMP1, TMP1, 3
+  |  addu TMP1, BASE, TMP1
+  |  call_intern lj_trace_hot		// (jit_State *J, const BCIns *pc)
+  |.  sw TMP1, L->top
+  |  b <3
+  |.  nop
 #endif
   |
   |->vm_callhook:			// Dispatch target for call hooks.
@@ -2031,13 +2051,102 @@ static void build_subroutines(BuildCtx *ctx)
   |//-- Trace exit handler -------------------------------------------------
   |//-----------------------------------------------------------------------
   |
+  |.macro savex_, a, b
+  |  sdc1 f..a, 16+a*8(sp)
+  |  sw r..a, 16+32*8+a*4(sp)
+  |  sw r..b, 16+32*8+b*4(sp)
+  |.endmacro
+  |
   |->vm_exit_handler:
 #if LJ_HASJIT
-  |NYI
+  |  addiu sp, sp, -(16+32*8+32*4)
+  |  savex_ 0, 1
+  |  savex_ 2, 3
+  |  savex_ 4, 5
+  |  savex_ 6, 7
+  |  savex_ 8, 9
+  |  savex_ 10, 11
+  |  savex_ 12, 13
+  |  savex_ 14, 15
+  |  savex_ 16, 17
+  |  savex_ 18, 19
+  |  savex_ 20, 21
+  |  savex_ 22, 23
+  |  savex_ 24, 25
+  |  savex_ 26, 27
+  |  sdc1 f28, 16+28*8(sp)
+  |  sw r28, 16+32*8+28*4(sp)
+  |  sdc1 f30, 16+30*8(sp)
+  |  sw r30, 16+32*8+30*4(sp)
+  |  sw r0, 16+32*8+31*4(sp)		// Clear RID_TMP.
+  |  li_vmstate EXIT
+  |   addiu TMP2, sp, 16+32*8+32*4	// Recompute original value of sp.
+  |  addiu DISPATCH, JGL, -GG_DISP2G-32768
+  |  lw TMP1, 0(TMP2)			// Load exit number.
+  |  st_vmstate
+  |   sw TMP2, 16+32*8+29*4(sp)		// Store sp in RID_SP.
+  |  lw L, DISPATCH_GL(jit_L)(DISPATCH)
+  |  lw BASE, DISPATCH_GL(jit_base)(DISPATCH)
+  |  load_got lj_trace_exit
+  |  sw L, DISPATCH_J(L)(DISPATCH)
+  |  sw ra, DISPATCH_J(parent)(DISPATCH)  // Store trace number.
+  |  sw TMP1, DISPATCH_J(exitno)(DISPATCH)  // Store exit number.
+  |  addiu CARG1, DISPATCH, GG_DISP2J
+  |  sw BASE, L->base
+  |  call_intern lj_trace_exit		// (jit_State *J, ExitState *ex)
+  |.  addiu CARG2, sp, 16
+  |  // Returns MULTRES (unscaled) or negated error code.
+  |  lw TMP1, L->cframe
+  |  li AT, -4
+  |   lw BASE, L->base
+  |  and sp, TMP1, AT
+  |   lw PC, SAVE_PC			// Get SAVE_PC.
+  |  b >1
+  |.  sw L, SAVE_L			// Set SAVE_L (on-trace resume/yield).
 #endif
   |->vm_exit_interp:
 #if LJ_HASJIT
-  |NYI
+  |  // CRET1 = MULTRES or negated error code, BASE, PC and JGL set.
+  |  lw L, SAVE_L
+  |  addiu DISPATCH, JGL, -GG_DISP2G-32768
+  |1:
+  |  bltz CRET1, >3			// Check for error from exit.
+  |.  lw LFUNC:TMP1, FRAME_FUNC(BASE)
+  |    lui TMP3, 0x59c0			// TOBIT = 2^52 + 2^51 (float).
+  |  sll MULTRES, CRET1, 3
+  |    li TISNIL, LJ_TNIL
+  |  sw MULTRES, SAVE_MULTRES
+  |    mtc1 TMP3, TOBIT
+  |  lw TMP1, LFUNC:TMP1->pc
+  |   sw r0, DISPATCH_GL(jit_L)(DISPATCH)
+  |  lw KBASE, PC2PROTO(k)(TMP1)
+  |    cvt.d.s TOBIT, TOBIT
+  |  // Modified copy of ins_next which handles function header dispatch, too.
+  |  lw INS, 0(PC)
+  |   addiu PC, PC, 4
+  |    // Assumes TISNIL == ~LJ_VMST_INTERP == -1
+  |    sw TISNIL, DISPATCH_GL(vmstate)(DISPATCH)
+  |  decode_OP4a TMP1, INS
+  |  decode_OP4b TMP1
+  |    sltiu TMP2, TMP1, BC_FUNCF*4	// Function header?
+  |  addu TMP0, DISPATCH, TMP1
+  |   decode_RD8a RD, INS
+  |  lw AT, 0(TMP0)
+  |   decode_RA8a RA, INS
+  |    beqz TMP2, >2
+  |.  decode_RA8b RA
+  |  jr AT
+  |.  decode_RD8b RD
+  |2:
+  |  addiu RC, MULTRES, -8
+  |  jr AT
+  |.  add RA, RA, BASE
+  |
+  |3:  // Rethrow error from the right C frame.
+  |  load_got lj_err_throw
+  |  negu CARG2, CRET1
+  |  call_intern lj_err_throw		// (lua_State *L, int errcode)
+  |.  move CARG1, L
 #endif
   |
   |//-----------------------------------------------------------------------
@@ -3739,13 +3848,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     if (op == BC_JFORI) {
       |  li TMP1, 1
       |  li TMP2, 1
-      |   lw INS, -4(PC)
+      |   addu TMP0, RD, TMP0
       |  slt TMP3, TMP3, r0
-      |  movt TMP1, r0, 0
-      |  movt TMP2, r0, 1
-      |    addu PC, RD, TMP0
+      |  movf TMP1, r0, 0
+      |   addu PC, PC, TMP0
+      |  movf TMP2, r0, 1
+      |   lhu RD, -4+OFS_RD(PC)
       |  movn TMP1, TMP2, TMP3
-      |   decode_RD8a RD, INS
       |  bnez TMP1, =>BC_JLOOP
       |.  decode_RD8b RD
     } else if (op == BC_JFORL) {
diff --git a/src/buildvm_mips.h b/src/buildvm_mips.h
index 948f7d49..7c0f90bf 100644
--- a/src/buildvm_mips.h
+++ b/src/buildvm_mips.h
@@ -12,7 +12,7 @@
 #define DASM_SECTION_CODE_OP	0
 #define DASM_SECTION_CODE_SUB	1
 #define DASM_MAXSECTION		2
-static const unsigned int build_actionlist[6076] = {
+static const unsigned int build_actionlist[6323] = {
 0xff010001,
 0xff060014,
 0x32410000,
@@ -3060,7 +3060,30 @@ static const unsigned int build_actionlist[6076] = {
 0xff098200,
 0xff060090,
 0xff000000,
-0xf0f0f0f0,
+0x8e0d0000,
+0xff098200,
+0x26640000,
+0xff098200,
+0xafb20014,
+0x8dad0000,
+0xff098200,
+0x02402821,
+0xae740000,
+0xff098200,
+0x91ad0000,
+0xff098200,
+0x8e790000,
+0xff098200,
+0xae900000,
+0xff098200,
+0x000d68c0,
+0x020d6821,
+0x0320f809,
+0xae8d0000,
+0xff098200,
+0x10000000,
+0xff05080d,
+0x00000000,
 0xff000000,
 0xff060091,
 0xff000000,
@@ -3097,11 +3120,194 @@ static const unsigned int build_actionlist[6076] = {
 0x8e4bfffc,
 0xff060093,
 0xff000000,
-0xf0f0f0f0,
+0x27bd0000,
+0xff098200,
+0xf7a00000,
+0xff098200,
+0xafa00000,
+0xff098200,
+0xafa10000,
+0xff098200,
+0xf7a20000,
+0xff098200,
+0xafa20000,
+0xff098200,
+0xafa30000,
+0xff098200,
+0xf7a40000,
+0xff098200,
+0xafa40000,
+0xff098200,
+0xafa50000,
+0xff098200,
+0xf7a60000,
+0xff098200,
+0xafa60000,
+0xff098200,
+0xafa70000,
+0xff098200,
+0xf7a80000,
+0xff098200,
+0xafa80000,
+0xff098200,
+0xafa90000,
+0xff098200,
+0xf7aa0000,
+0xff098200,
+0xafaa0000,
+0xff098200,
+0xafab0000,
+0xff098200,
+0xf7ac0000,
+0xff098200,
+0xafac0000,
+0xff098200,
+0xafad0000,
+0xff098200,
+0xf7ae0000,
+0xff098200,
+0xff000000,
+0xafae0000,
+0xff098200,
+0xafaf0000,
+0xff098200,
+0xf7b00000,
+0xff098200,
+0xafb00000,
+0xff098200,
+0xafb10000,
+0xff098200,
+0xf7b20000,
+0xff098200,
+0xafb20000,
+0xff098200,
+0xafb30000,
+0xff098200,
+0xf7b40000,
+0xff098200,
+0xafb40000,
+0xff098200,
+0xafb50000,
+0xff098200,
+0xf7b60000,
+0xff098200,
+0xafb60000,
+0xff098200,
+0xafb70000,
+0xff098200,
+0xf7b80000,
+0xff098200,
+0xafb80000,
+0xff098200,
+0xafb90000,
+0xff098200,
+0xf7ba0000,
+0xff098200,
+0xafba0000,
+0xff098200,
+0xafbb0000,
+0xff098200,
+0xf7bc0000,
+0xff098200,
+0xafbc0000,
+0xff098200,
+0xf7be0000,
+0xff098200,
+0xff000000,
+0xafbe0000,
+0xff098200,
+0xafa00000,
+0xff098200,
+0x240c0000,
+0xff098200,
+0x27ae0000,
+0xff098200,
+0x27d30000,
+0xff098200,
+0x8dcd0000,
+0xae6c0000,
+0xff098200,
+0xafae0000,
+0xff098200,
+0x8e740000,
+0xff098200,
+0x8e700000,
+0xff098200,
+0x8e790000,
+0xff098200,
+0xae740000,
+0xff098200,
+0xae7f0000,
+0xff098200,
+0xae6d0000,
+0xff098200,
+0x26640000,
+0xff098200,
+0xae900000,
+0xff098200,
+0x0320f809,
+0x27a50010,
+0x8e8d0000,
+0xff098200,
+0x2401fffc,
+0x8e900000,
+0xff098200,
+0x01a1e824,
+0x8fb20014,
+0x10000000,
+0xff050801,
+0xafb40070,
 0xff000000,
 0xff060094,
 0xff000000,
-0xf0f0f0f0,
+0x8fb40070,
+0x27d30000,
+0xff098200,
+0xff06000b,
+0x04400000,
+0xff050803,
+0x8e0d0000,
+0xff098200,
+0x3c0f59c0,
+0x0002a8c0,
+0x241e0000,
+0xff098200,
+0xafb50010,
+0x448ff000,
+0x8dad0000,
+0xff098200,
+0xae600000,
+0xff098200,
+0x8db10000,
+0xff098200,
+0x4600f7a1,
+0x8e4b0000,
+0x26520004,
+0xae7e0000,
+0xff098200,
+0x316d00ff,
+0x000d6880,
+0x2dae0000,
+0xff098200,
+0x026d6021,
+0x000b5402,
+0x8d810000,
+0x000bb942,
+0x11c00000,
+0xff050802,
+0x32f707f8,
+0x00200008,
+0x000a50c0,
+0xff06000c,
+0x26a9fff8,
+0x00200008,
+0x02f0b820,
+0xff06000d,
+0x8e790000,
+0xff098200,
+0x00022823,
+0x0320f809,
+0x02802021,
 0xff000000,
 0xff06005b,
 0x3c0c4330,
@@ -5762,7 +5968,17 @@ static const unsigned int build_actionlist[6076] = {
 0xadde0000,
 0xff098200,
 0xff000000,
-0xf0f0f0f0,
+0x00126842,
+0x31ad007e,
+0x01b36821,
+0x95ae0000,
+0xff098200,
+0x25ce0000,
+0xff098200,
+0x05c00000,
+0xff050890,
+0xa5ae0000,
+0xff098200,
 0xff000000,
 0x0217b821,
 0xff000000,
@@ -5810,13 +6026,14 @@ static const unsigned int build_actionlist[6076] = {
 0xff000000,
 0x240d0001,
 0x240e0001,
-0x8e4bfffc,
+0x014c6021,
 0x01e0782a,
-0x00016801,
-0x00057001,
-0x014c9021,
+0x00006801,
+0x024c9021,
+0x00047001,
+0x964a0000,
+0xff098200,
 0x01cf680b,
-0x000b5402,
 0x15a00000,
 0xff070800,
 0x000a50c0,
@@ -5856,7 +6073,17 @@ static const unsigned int build_actionlist[6076] = {
 0x00200008,
 0x32f707f8,
 0xff000000,
-0xf0f0f0f0,
+0x00126842,
+0x31ad007e,
+0x01b36821,
+0x95ae0000,
+0xff098200,
+0x25ce0000,
+0xff098200,
+0x05c00000,
+0xff050890,
+0xa5ae0000,
+0xff098200,
 0xff000000,
 0x0217b821,
 0x8eed0000,
@@ -5896,7 +6123,17 @@ static const unsigned int build_actionlist[6076] = {
 0x00200008,
 0x32f707f8,
 0xff000000,
-0xf0f0f0f0,
+0x00126842,
+0x31ad007e,
+0x01b36821,
+0x95ae0000,
+0xff098200,
+0x25ce0000,
+0xff098200,
+0x05c00000,
+0xff050890,
+0xa5ae0000,
+0xff098200,
 0xff000000,
 0x8e4b0000,
 0x26520004,
@@ -5945,7 +6182,17 @@ static const unsigned int build_actionlist[6076] = {
 0x00200008,
 0x32f707f8,
 0xff000000,
-0xf0f0f0f0,
+0x00126842,
+0x31ad007e,
+0x01b36821,
+0x95ae0000,
+0xff098200,
+0x25ce0000,
+0xff098200,
+0x05c00000,
+0xff050892,
+0xa5ae0000,
+0xff098200,
 0xff000000,
 0x8e8e0000,
 0xff098200,
@@ -6496,42 +6743,44 @@ static void build_subroutines(BuildCtx *ctx)
   dasm_put(Dst, 2980, DISPATCH_GL(hookmask), HOOK_ACTIVE, GG_DISP2STATIC, DISPATCH_GL(hookmask), DISPATCH_GL(hookcount), HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount), LUA_MASKLINE, DISPATCH_GOT(lj_dispatch_ins), Dt1(->base), Dt1(->base));
   dasm_put(Dst, 3028, GG_DISP2STATIC, -24+LJ_ENDIAN_SELECT(0,4));
 #if LJ_HASJIT
-  dasm_put(Dst, 3047);
+  dasm_put(Dst, 3047, LJ_ENDIAN_SELECT(-8,-4), GG_DISP2J, Dt7(->pc), DISPATCH_J(L), PC2PROTO(framesize), DISPATCH_GOT(lj_trace_hot), Dt1(->base), Dt1(->top));
 #endif
-  dasm_put(Dst, 3049);
+  dasm_put(Dst, 3072);
 #if LJ_HASJIT
-  dasm_put(Dst, 3051);
+  dasm_put(Dst, 3074);
 #endif
-  dasm_put(Dst, 3054);
+  dasm_put(Dst, 3077);
 #if LJ_HASJIT
-  dasm_put(Dst, 3057);
+  dasm_put(Dst, 3080);
 #endif
-  dasm_put(Dst, 3060, DISPATCH_GOT(lj_dispatch_call), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top), LJ_ENDIAN_SELECT(-8,-4));
+  dasm_put(Dst, 3083, DISPATCH_GOT(lj_dispatch_call), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top), LJ_ENDIAN_SELECT(-8,-4));
 #if LJ_HASJIT
-  dasm_put(Dst, 3084);
+  dasm_put(Dst, 3107, -(16+32*8+32*4), 16+0*8, 16+32*8+0*4, 16+32*8+1*4, 16+2*8, 16+32*8+2*4, 16+32*8+3*4, 16+4*8, 16+32*8+4*4, 16+32*8+5*4, 16+6*8, 16+32*8+6*4, 16+32*8+7*4, 16+8*8, 16+32*8+8*4, 16+32*8+9*4, 16+10*8, 16+32*8+10*4, 16+32*8+11*4, 16+12*8, 16+32*8+12*4, 16+32*8+13*4, 16+14*8);
+  dasm_put(Dst, 3154, 16+32*8+14*4, 16+32*8+15*4, 16+16*8, 16+32*8+16*4, 16+32*8+17*4, 16+18*8, 16+32*8+18*4, 16+32*8+19*4, 16+20*8, 16+32*8+20*4, 16+32*8+21*4, 16+22*8, 16+32*8+22*4, 16+32*8+23*4, 16+24*8, 16+32*8+24*4, 16+32*8+25*4, 16+26*8, 16+32*8+26*4, 16+32*8+27*4, 16+28*8, 16+32*8+28*4, 16+30*8);
+  dasm_put(Dst, 3201, 16+32*8+30*4, 16+32*8+31*4, ~LJ_VMST_EXIT, 16+32*8+32*4, -GG_DISP2G-32768, DISPATCH_GL(vmstate), 16+32*8+29*4, DISPATCH_GL(jit_L), DISPATCH_GL(jit_base), DISPATCH_GOT(lj_trace_exit), DISPATCH_J(L), DISPATCH_J(parent), DISPATCH_J(exitno), GG_DISP2J, Dt1(->base), Dt1(->cframe), Dt1(->base));
 #endif
-  dasm_put(Dst, 3086);
+  dasm_put(Dst, 3245);
 #if LJ_HASJIT
-  dasm_put(Dst, 3088);
+  dasm_put(Dst, 3247, -GG_DISP2G-32768, LJ_ENDIAN_SELECT(-8,-4), LJ_TNIL, Dt7(->pc), DISPATCH_GL(jit_L), PC2PROTO(k), DISPATCH_GL(vmstate), BC_FUNCF*4, DISPATCH_GOT(lj_err_throw));
 #endif
-  dasm_put(Dst, 3090);
+  dasm_put(Dst, 3296);
 #if LJ_HASJIT
-  dasm_put(Dst, 3138);
+  dasm_put(Dst, 3344);
 #endif
-  dasm_put(Dst, 3161);
+  dasm_put(Dst, 3367);
 #if LJ_HASFFI
 #define DtE(_V) (int)(ptrdiff_t)&(((CTState *)0)_V)
-  dasm_put(Dst, 3163, 72+9*4, 72+8*4, 24+5*8, 72+7*4, 72+6*4, 24+4*8, 72+5*4, 72+4*4, 24+3*8, 72+3*4, 72+2*4, 24+2*8, 72+1*4, 72+0*4, 24+1*8, 24+0*8, Dt2(->ctype_state), GG_G2DISP, DISPATCH_GOT(lj_ccallback_enter), DtE(->cb.slot), DtE(->cb.gpr[0]), DtE(->cb.gpr[1]), DtE(->cb.fpr[0]));
-  dasm_put(Dst, 3211, DtE(->cb.gpr[2]), DtE(->cb.gpr[3]), DtE(->cb.fpr[1]), 112+16, DtE(->cb.stack), Dt1(->base), Dt1(->top), LJ_ENDIAN_SELECT(-8,-4), ~LJ_VMST_INTERP, LJ_TNIL, DISPATCH_GL(vmstate), Dt7(->pc));
+  dasm_put(Dst, 3369, 72+9*4, 72+8*4, 24+5*8, 72+7*4, 72+6*4, 24+4*8, 72+5*4, 72+4*4, 24+3*8, 72+3*4, 72+2*4, 24+2*8, 72+1*4, 72+0*4, 24+1*8, 24+0*8, Dt2(->ctype_state), GG_G2DISP, DISPATCH_GOT(lj_ccallback_enter), DtE(->cb.slot), DtE(->cb.gpr[0]), DtE(->cb.gpr[1]), DtE(->cb.fpr[0]));
+  dasm_put(Dst, 3417, DtE(->cb.gpr[2]), DtE(->cb.gpr[3]), DtE(->cb.fpr[1]), 112+16, DtE(->cb.stack), Dt1(->base), Dt1(->top), LJ_ENDIAN_SELECT(-8,-4), ~LJ_VMST_INTERP, LJ_TNIL, DISPATCH_GL(vmstate), Dt7(->pc));
 #endif
-  dasm_put(Dst, 3255);
+  dasm_put(Dst, 3461);
 #if LJ_HASFFI
-  dasm_put(Dst, 3257, DISPATCH_GOT(lj_ccallback_leave), DISPATCH_GL(ctype_state), Dt1(->base), Dt1(->top), DtE(->L), DtE(->cb.gpr[0]), DtE(->cb.fpr[0]), DtE(->cb.gpr[1]), DtE(->cb.fpr[1]));
+  dasm_put(Dst, 3463, DISPATCH_GOT(lj_ccallback_leave), DISPATCH_GL(ctype_state), Dt1(->base), Dt1(->top), DtE(->L), DtE(->cb.gpr[0]), DtE(->cb.fpr[0]), DtE(->cb.gpr[1]), DtE(->cb.fpr[1]));
 #endif
-  dasm_put(Dst, 3281);
+  dasm_put(Dst, 3487);
 #if LJ_HASFFI
 #define DtF(_V) (int)(ptrdiff_t)&(((CCallState *)0)_V)
-  dasm_put(Dst, 3283, DtF(->spadj), DtF(->nsp), offsetof(CCallState, stack), DtF(->func), DtF(->gpr[1]), DtF(->gpr[2]), DtF(->gpr[3]), DtF(->fpr[0]), DtF(->fpr[1]), DtF(->gpr[0]), DtF(->gpr[0]), DtF(->gpr[1]), DtF(->fpr[0]), DtF(->fpr[1]));
+  dasm_put(Dst, 3489, DtF(->spadj), DtF(->nsp), offsetof(CCallState, stack), DtF(->func), DtF(->gpr[1]), DtF(->gpr[2]), DtF(->gpr[3]), DtF(->fpr[0]), DtF(->fpr[1]), DtF(->gpr[0]), DtF(->gpr[0]), DtF(->gpr[1]), DtF(->fpr[0]), DtF(->fpr[1]));
 #endif
 }
 
@@ -6539,7 +6788,7 @@ static void build_subroutines(BuildCtx *ctx)
 static void build_ins(BuildCtx *ctx, BCOp op, int defop)
 {
   int vk = 0;
-  dasm_put(Dst, 3339, defop);
+  dasm_put(Dst, 3545, defop);
 
   switch (op) {
 
@@ -6548,138 +6797,138 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
   /* Remember: all ops branch for a true comparison, fall through otherwise. */
 
   case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:
-    dasm_put(Dst, 3341, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM, LJ_ENDIAN_SELECT(2,0), (-(BCBIAS_J*4 >> 16) & 65535));
+    dasm_put(Dst, 3547, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM, LJ_ENDIAN_SELECT(2,0), (-(BCBIAS_J*4 >> 16) & 65535));
     if (op == BC_ISLT || op == BC_ISGE) {
-      dasm_put(Dst, 3364);
+      dasm_put(Dst, 3570);
     } else {
-      dasm_put(Dst, 3366);
+      dasm_put(Dst, 3572);
     }
     if (op == BC_ISLT || op == BC_ISLE) {
-      dasm_put(Dst, 3368);
+      dasm_put(Dst, 3574);
     } else {
-      dasm_put(Dst, 3370);
+      dasm_put(Dst, 3576);
     }
-    dasm_put(Dst, 3372);
+    dasm_put(Dst, 3578);
     break;
 
   case BC_ISEQV: case BC_ISNEV:
     vk = op == BC_ISEQV;
-    dasm_put(Dst, 3386, LJ_ENDIAN_SELECT(4,0), -4+LJ_ENDIAN_SELECT(2,0), LJ_ENDIAN_SELECT(4,0), (-(BCBIAS_J*4 >> 16) & 65535), LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 3592, LJ_ENDIAN_SELECT(4,0), -4+LJ_ENDIAN_SELECT(2,0), LJ_ENDIAN_SELECT(4,0), (-(BCBIAS_J*4 >> 16) & 65535), LJ_TISNUM, LJ_TISNUM);
     if (vk) {
-      dasm_put(Dst, 3410);
+      dasm_put(Dst, 3616);
     } else {
-      dasm_put(Dst, 3412);
+      dasm_put(Dst, 3618);
     }
-    dasm_put(Dst, 3414, LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(0,4));
+    dasm_put(Dst, 3620, LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(0,4));
     if (LJ_HASFFI) {
-      dasm_put(Dst, 3433, LJ_TCDATA);
+      dasm_put(Dst, 3639, LJ_TCDATA);
     }
-    dasm_put(Dst, 3438, LJ_TISPRI);
+    dasm_put(Dst, 3644, LJ_TISPRI);
     if (LJ_HASFFI) {
-      dasm_put(Dst, 3441);
+      dasm_put(Dst, 3647);
     }
-    dasm_put(Dst, 3444, LJ_TISTABUD+1);
+    dasm_put(Dst, 3650, LJ_TISTABUD+1);
     if (vk) {
-      dasm_put(Dst, 3455);
+      dasm_put(Dst, 3661);
     } else {
-      dasm_put(Dst, 3457);
+      dasm_put(Dst, 3663);
     }
-    dasm_put(Dst, 3459, Dt6(->metatable), Dt6(->nomm), 1<<MM_eq, 1-vk);
+    dasm_put(Dst, 3665, Dt6(->metatable), Dt6(->nomm), 1<<MM_eq, 1-vk);
     break;
 
   case BC_ISEQS: case BC_ISNES:
     vk = op == BC_ISEQS;
-    dasm_put(Dst, 3476, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), -4+LJ_ENDIAN_SELECT(2,0));
+    dasm_put(Dst, 3682, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), -4+LJ_ENDIAN_SELECT(2,0));
     if (LJ_HASFFI) {
-      dasm_put(Dst, 3487, LJ_TCDATA);
+      dasm_put(Dst, 3693, LJ_TCDATA);
     }
-    dasm_put(Dst, 3492, -LJ_TSTR, (-(BCBIAS_J*4 >> 16) & 65535));
+    dasm_put(Dst, 3698, -LJ_TSTR, (-(BCBIAS_J*4 >> 16) & 65535));
     if (vk) {
-      dasm_put(Dst, 3502);
+      dasm_put(Dst, 3708);
     } else {
-      dasm_put(Dst, 3504);
+      dasm_put(Dst, 3710);
     }
-    dasm_put(Dst, 3506);
+    dasm_put(Dst, 3712);
     break;
 
   case BC_ISEQN: case BC_ISNEN:
     vk = op == BC_ISEQN;
-    dasm_put(Dst, 3519, LJ_ENDIAN_SELECT(4,0), -4+LJ_ENDIAN_SELECT(2,0), (-(BCBIAS_J*4 >> 16) & 65535), LJ_TISNUM);
+    dasm_put(Dst, 3725, LJ_ENDIAN_SELECT(4,0), -4+LJ_ENDIAN_SELECT(2,0), (-(BCBIAS_J*4 >> 16) & 65535), LJ_TISNUM);
     if (LJ_HASFFI) {
-      dasm_put(Dst, 3534);
+      dasm_put(Dst, 3740);
     } else {
-      dasm_put(Dst, 3537);
+      dasm_put(Dst, 3743);
     }
-    dasm_put(Dst, 3540);
+    dasm_put(Dst, 3746);
     if (vk) {
-      dasm_put(Dst, 3543);
+      dasm_put(Dst, 3749);
     } else {
-      dasm_put(Dst, 3547);
+      dasm_put(Dst, 3753);
     }
-    dasm_put(Dst, 3551);
+    dasm_put(Dst, 3757);
     if (LJ_HASFFI) {
-      dasm_put(Dst, 3563, LJ_TCDATA);
+      dasm_put(Dst, 3769, LJ_TCDATA);
     }
     break;
 
   case BC_ISEQP: case BC_ISNEP:
     vk = op == BC_ISEQP;
-    dasm_put(Dst, 3573, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(2,0));
+    dasm_put(Dst, 3779, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(2,0));
     if (LJ_HASFFI) {
-      dasm_put(Dst, 3582, LJ_TCDATA);
+      dasm_put(Dst, 3788, LJ_TCDATA);
     }
-    dasm_put(Dst, 3587, (-(BCBIAS_J*4 >> 16) & 65535));
+    dasm_put(Dst, 3793, (-(BCBIAS_J*4 >> 16) & 65535));
     if (vk) {
-      dasm_put(Dst, 3593);
+      dasm_put(Dst, 3799);
     } else {
-      dasm_put(Dst, 3595);
+      dasm_put(Dst, 3801);
     }
-    dasm_put(Dst, 3597);
+    dasm_put(Dst, 3803);
     break;
 
   /* -- Unary test and copy ops ------------------------------------------- */
 
   case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:
-    dasm_put(Dst, 3610, LJ_ENDIAN_SELECT(2,0), LJ_ENDIAN_SELECT(4,0));
+    dasm_put(Dst, 3816, LJ_ENDIAN_SELECT(2,0), LJ_ENDIAN_SELECT(4,0));
     if (op == BC_IST || op == BC_ISF) {
-      dasm_put(Dst, 3617, LJ_TISTRUECOND, (-(BCBIAS_J*4 >> 16) & 65535));
+      dasm_put(Dst, 3823, LJ_TISTRUECOND, (-(BCBIAS_J*4 >> 16) & 65535));
       if (op == BC_IST) {
-	dasm_put(Dst, 3624);
+	dasm_put(Dst, 3830);
       } else {
-	dasm_put(Dst, 3626);
+	dasm_put(Dst, 3832);
       }
-      dasm_put(Dst, 3628);
+      dasm_put(Dst, 3834);
     } else {
-      dasm_put(Dst, 3630, LJ_TISTRUECOND);
+      dasm_put(Dst, 3836, LJ_TISTRUECOND);
       if (op == BC_ISTC) {
-	dasm_put(Dst, 3634);
+	dasm_put(Dst, 3840);
       } else {
-	dasm_put(Dst, 3637);
+	dasm_put(Dst, 3843);
       }
-      dasm_put(Dst, 3640, (-(BCBIAS_J*4 >> 16) & 65535));
+      dasm_put(Dst, 3846, (-(BCBIAS_J*4 >> 16) & 65535));
     }
-    dasm_put(Dst, 3649);
+    dasm_put(Dst, 3855);
     break;
 
   /* -- Unary ops --------------------------------------------------------- */
 
   case BC_MOV:
-    dasm_put(Dst, 3661);
+    dasm_put(Dst, 3867);
     break;
   case BC_NOT:
-    dasm_put(Dst, 3677, LJ_ENDIAN_SELECT(4,0), LJ_TFALSE, LJ_TISTRUECOND, LJ_TTRUE, LJ_ENDIAN_SELECT(4,0));
+    dasm_put(Dst, 3883, LJ_ENDIAN_SELECT(4,0), LJ_TFALSE, LJ_TISTRUECOND, LJ_TTRUE, LJ_ENDIAN_SELECT(4,0));
     break;
   case BC_UNM:
-    dasm_put(Dst, 3701, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 3907, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
     break;
   case BC_LEN:
-    dasm_put(Dst, 3724, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_TSTR, LJ_TTAB, Dt5(->len));
+    dasm_put(Dst, 3930, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_TSTR, LJ_TTAB, Dt5(->len));
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
-    dasm_put(Dst, 3758, Dt6(->metatable));
+    dasm_put(Dst, 3964, Dt6(->metatable));
 #endif
-    dasm_put(Dst, 3765, DISPATCH_GOT(lj_tab_len));
+    dasm_put(Dst, 3971, DISPATCH_GOT(lj_tab_len));
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
-    dasm_put(Dst, 3774, Dt6(->nomm), 1<<MM_len);
+    dasm_put(Dst, 3980, Dt6(->nomm), 1<<MM_len);
 #endif
     break;
 
@@ -6688,273 +6937,273 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
 
   case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
-    dasm_put(Dst, 3786);
+    dasm_put(Dst, 3992);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 3790, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 3996, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 3799, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 4005, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 3808, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 4014, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 3822);
+    dasm_put(Dst, 4028);
     break;
   case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
-    dasm_put(Dst, 3839);
+    dasm_put(Dst, 4045);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 3843, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 4049, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 3852, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 4058, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 3861, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 4067, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 3875);
+    dasm_put(Dst, 4081);
     break;
   case BC_MULVN: case BC_MULNV: case BC_MULVV:
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
-    dasm_put(Dst, 3892);
+    dasm_put(Dst, 4098);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 3896, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 4102, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 3905, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 4111, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 3914, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 4120, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 3928);
+    dasm_put(Dst, 4134);
     break;
   case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
-    dasm_put(Dst, 3945);
+    dasm_put(Dst, 4151);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 3949, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 4155, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 3958, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 4164, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 3967, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 4173, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 3981);
+    dasm_put(Dst, 4187);
     break;
   case BC_MODVN:
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
-    dasm_put(Dst, 3998);
+    dasm_put(Dst, 4204);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 4002, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 4208, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 4011, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 4217, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 4020, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 4226, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 4034);
+    dasm_put(Dst, 4240);
     break;
   case BC_MODNV: case BC_MODVV:
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
-    dasm_put(Dst, 4056);
+    dasm_put(Dst, 4262);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 4060, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 4266, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 4069, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
+    dasm_put(Dst, 4275, LJ_ENDIAN_SELECT(4,0), LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 4078, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 4284, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 4092);
+    dasm_put(Dst, 4298);
     break;
   case BC_POW:
-    dasm_put(Dst, 4099, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM, DISPATCH_GOT(pow));
+    dasm_put(Dst, 4305, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM, DISPATCH_GOT(pow));
     break;
 
   case BC_CAT:
-    dasm_put(Dst, 4135, Dt1(->base), DISPATCH_GOT(lj_meta_cat), Dt1(->base));
+    dasm_put(Dst, 4341, Dt1(->base), DISPATCH_GOT(lj_meta_cat), Dt1(->base));
     break;
 
   /* -- Constant ops ------------------------------------------------------ */
 
   case BC_KSTR:
-    dasm_put(Dst, 4170, LJ_TSTR, LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0));
+    dasm_put(Dst, 4376, LJ_TSTR, LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0));
     break;
   case BC_KCDATA:
 #if LJ_HASFFI
-    dasm_put(Dst, 4192, LJ_TCDATA, LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0));
+    dasm_put(Dst, 4398, LJ_TCDATA, LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0));
 #endif
     break;
   case BC_KSHORT:
-    dasm_put(Dst, 4214);
+    dasm_put(Dst, 4420);
     break;
   case BC_KNUM:
-    dasm_put(Dst, 4231);
+    dasm_put(Dst, 4437);
     break;
   case BC_KPRI:
-    dasm_put(Dst, 4247, LJ_ENDIAN_SELECT(4,0));
+    dasm_put(Dst, 4453, LJ_ENDIAN_SELECT(4,0));
     break;
   case BC_KNIL:
-    dasm_put(Dst, 4264, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0));
+    dasm_put(Dst, 4470, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0));
     break;
 
   /* -- Upvalue and function ops ------------------------------------------ */
 
   case BC_UGET:
-    dasm_put(Dst, 4288, LJ_ENDIAN_SELECT(-8,-4), Dt7(->uvptr), DtA(->v));
+    dasm_put(Dst, 4494, LJ_ENDIAN_SELECT(-8,-4), Dt7(->uvptr), DtA(->v));
     break;
   case BC_USETV:
-    dasm_put(Dst, 4311, LJ_ENDIAN_SELECT(-8,-4), Dt7(->uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, DtA(->closed), LJ_ENDIAN_SELECT(4,0), LJ_GC_BLACK|1, -(LJ_TISNUM+1), LJ_TISGCV - (LJ_TISNUM+1), LJ_ENDIAN_SELECT(0,4), Dt4(->gch.marked), LJ_GC_WHITES, DISPATCH_GOT(lj_gc_barrieruv), GG_DISP2G);
+    dasm_put(Dst, 4517, LJ_ENDIAN_SELECT(-8,-4), Dt7(->uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, DtA(->closed), LJ_ENDIAN_SELECT(4,0), LJ_GC_BLACK|1, -(LJ_TISNUM+1), LJ_TISGCV - (LJ_TISNUM+1), LJ_ENDIAN_SELECT(0,4), Dt4(->gch.marked), LJ_GC_WHITES, DISPATCH_GOT(lj_gc_barrieruv), GG_DISP2G);
     break;
   case BC_USETS:
-    dasm_put(Dst, 4371, LJ_ENDIAN_SELECT(-8,-4), Dt7(->uvptr), DtA(->marked), DtA(->v), Dt5(->marked), LJ_GC_BLACK, DtA(->closed), LJ_TSTR, LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0), LJ_GC_WHITES, DISPATCH_GOT(lj_gc_barrieruv), GG_DISP2G);
+    dasm_put(Dst, 4577, LJ_ENDIAN_SELECT(-8,-4), Dt7(->uvptr), DtA(->marked), DtA(->v), Dt5(->marked), LJ_GC_BLACK, DtA(->closed), LJ_TSTR, LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0), LJ_GC_WHITES, DISPATCH_GOT(lj_gc_barrieruv), GG_DISP2G);
     break;
   case BC_USETN:
-    dasm_put(Dst, 4426, LJ_ENDIAN_SELECT(-8,-4), Dt7(->uvptr), DtA(->v));
+    dasm_put(Dst, 4632, LJ_ENDIAN_SELECT(-8,-4), Dt7(->uvptr), DtA(->v));
     break;
   case BC_USETP:
-    dasm_put(Dst, 4449, LJ_ENDIAN_SELECT(-8,-4), Dt7(->uvptr), DtA(->v), LJ_ENDIAN_SELECT(4,0));
+    dasm_put(Dst, 4655, LJ_ENDIAN_SELECT(-8,-4), Dt7(->uvptr), DtA(->v), LJ_ENDIAN_SELECT(4,0));
     break;
 
   case BC_UCLO:
-    dasm_put(Dst, 4473, Dt1(->openupval), (-(BCBIAS_J*4 >> 16) & 65535), DISPATCH_GOT(lj_func_closeuv), Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 4679, Dt1(->openupval), (-(BCBIAS_J*4 >> 16) & 65535), DISPATCH_GOT(lj_func_closeuv), Dt1(->base), Dt1(->base));
     break;
 
   case BC_FNEW:
-    dasm_put(Dst, 4504, DISPATCH_GOT(lj_func_newL_gc), LJ_ENDIAN_SELECT(-8,-4), Dt1(->base), Dt1(->base), LJ_TFUNC, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4));
+    dasm_put(Dst, 4710, DISPATCH_GOT(lj_func_newL_gc), LJ_ENDIAN_SELECT(-8,-4), Dt1(->base), Dt1(->base), LJ_TFUNC, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4));
     break;
 
   /* -- Table ops --------------------------------------------------------- */
 
   case BC_TNEW:
   case BC_TDUP:
-    dasm_put(Dst, 4537, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base));
+    dasm_put(Dst, 4743, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base));
     if (op == BC_TNEW) {
-      dasm_put(Dst, 4549, DISPATCH_GOT(lj_tab_new));
+      dasm_put(Dst, 4755, DISPATCH_GOT(lj_tab_new));
     } else {
-      dasm_put(Dst, 4560, DISPATCH_GOT(lj_tab_dup));
+      dasm_put(Dst, 4766, DISPATCH_GOT(lj_tab_dup));
     }
-    dasm_put(Dst, 4568, Dt1(->base), LJ_TTAB, LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0), DISPATCH_GOT(lj_gc_step_fixtop));
+    dasm_put(Dst, 4774, Dt1(->base), LJ_TTAB, LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0), DISPATCH_GOT(lj_gc_step_fixtop));
     break;
 
   case BC_GGET:
   case BC_GSET:
-    dasm_put(Dst, 4598, LJ_ENDIAN_SELECT(-8,-4), Dt7(->env));
+    dasm_put(Dst, 4804, LJ_ENDIAN_SELECT(-8,-4), Dt7(->env));
     if (op == BC_GGET) {
-      dasm_put(Dst, 4606);
+      dasm_put(Dst, 4812);
     } else {
-      dasm_put(Dst, 4609);
+      dasm_put(Dst, 4815);
     }
-    dasm_put(Dst, 4612);
+    dasm_put(Dst, 4818);
     break;
 
   case BC_TGETV:
-    dasm_put(Dst, 4614, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_TTAB, LJ_TISNUM, LJ_TSTR, Dt6(->asize), Dt6(->array), LJ_ENDIAN_SELECT(4,0), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
-    dasm_put(Dst, 4689, LJ_ENDIAN_SELECT(0,4));
+    dasm_put(Dst, 4820, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_TTAB, LJ_TISNUM, LJ_TSTR, Dt6(->asize), Dt6(->array), LJ_ENDIAN_SELECT(4,0), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 4895, LJ_ENDIAN_SELECT(0,4));
     break;
   case BC_TGETS:
-    dasm_put(Dst, 4695, LJ_ENDIAN_SELECT(4,0), LJ_TTAB, LJ_ENDIAN_SELECT(0,4), Dt6(->hmask), Dt5(->hash), Dt6(->node), offsetof(Node, key)+LJ_ENDIAN_SELECT(4,0), offsetof(Node, key)+LJ_ENDIAN_SELECT(0,4), DtB(->next), offsetof(Node, val)+LJ_ENDIAN_SELECT(4,0), -LJ_TSTR, Dt6(->metatable), offsetof(Node, val)+LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4));
-    dasm_put(Dst, 4764, LJ_TNIL, Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 4901, LJ_ENDIAN_SELECT(4,0), LJ_TTAB, LJ_ENDIAN_SELECT(0,4), Dt6(->hmask), Dt5(->hash), Dt6(->node), offsetof(Node, key)+LJ_ENDIAN_SELECT(4,0), offsetof(Node, key)+LJ_ENDIAN_SELECT(0,4), DtB(->next), offsetof(Node, val)+LJ_ENDIAN_SELECT(4,0), -LJ_TSTR, Dt6(->metatable), offsetof(Node, val)+LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4));
+    dasm_put(Dst, 4970, LJ_TNIL, Dt6(->nomm), 1<<MM_index);
     break;
   case BC_TGETB:
-    dasm_put(Dst, 4781, LJ_ENDIAN_SELECT(4,0), LJ_TTAB, LJ_ENDIAN_SELECT(0,4), Dt6(->asize), Dt6(->array), LJ_ENDIAN_SELECT(4,0), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 4987, LJ_ENDIAN_SELECT(4,0), LJ_TTAB, LJ_ENDIAN_SELECT(0,4), Dt6(->asize), Dt6(->array), LJ_ENDIAN_SELECT(4,0), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
     break;
 
   case BC_TSETV:
-    dasm_put(Dst, 4838, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_TTAB, LJ_TISNUM, LJ_TSTR, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_ENDIAN_SELECT(4,0), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex);
-    dasm_put(Dst, 4911, LJ_ENDIAN_SELECT(0,4), DISPATCH_GL(gc.grayagain), ~LJ_GC_BLACK & 255, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
+    dasm_put(Dst, 5044, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_TTAB, LJ_TISNUM, LJ_TSTR, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_ENDIAN_SELECT(4,0), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex);
+    dasm_put(Dst, 5117, LJ_ENDIAN_SELECT(0,4), DISPATCH_GL(gc.grayagain), ~LJ_GC_BLACK & 255, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
     break;
   case BC_TSETS:
-    dasm_put(Dst, 4939, LJ_ENDIAN_SELECT(4,0), LJ_TTAB, LJ_ENDIAN_SELECT(0,4), Dt6(->hmask), Dt5(->hash), Dt6(->node), Dt6(->nomm), offsetof(Node, key)+LJ_ENDIAN_SELECT(4,0), offsetof(Node, key)+LJ_ENDIAN_SELECT(0,4), LJ_TSTR, DtB(->next), offsetof(Node, val)+LJ_ENDIAN_SELECT(4,0), Dt6(->marked), Dt6(->metatable), LJ_GC_BLACK);
-    dasm_put(Dst, 4997, DtB(->val), Dt6(->nomm), 1<<MM_newindex, Dt6(->metatable), DISPATCH_GL(tmptv), Dt6(->nomm), 1<<MM_newindex, LJ_TSTR, DISPATCH_GOT(lj_tab_newkey), LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0), Dt1(->base), Dt1(->base));
-    dasm_put(Dst, 5059, DISPATCH_GL(gc.grayagain), ~LJ_GC_BLACK & 255, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
+    dasm_put(Dst, 5145, LJ_ENDIAN_SELECT(4,0), LJ_TTAB, LJ_ENDIAN_SELECT(0,4), Dt6(->hmask), Dt5(->hash), Dt6(->node), Dt6(->nomm), offsetof(Node, key)+LJ_ENDIAN_SELECT(4,0), offsetof(Node, key)+LJ_ENDIAN_SELECT(0,4), LJ_TSTR, DtB(->next), offsetof(Node, val)+LJ_ENDIAN_SELECT(4,0), Dt6(->marked), Dt6(->metatable), LJ_GC_BLACK);
+    dasm_put(Dst, 5203, DtB(->val), Dt6(->nomm), 1<<MM_newindex, Dt6(->metatable), DISPATCH_GL(tmptv), Dt6(->nomm), 1<<MM_newindex, LJ_TSTR, DISPATCH_GOT(lj_tab_newkey), LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0), Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 5265, DISPATCH_GL(gc.grayagain), ~LJ_GC_BLACK & 255, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
     break;
   case BC_TSETB:
-    dasm_put(Dst, 5076, LJ_ENDIAN_SELECT(4,0), LJ_TTAB, LJ_ENDIAN_SELECT(0,4), Dt6(->asize), Dt6(->array), LJ_ENDIAN_SELECT(4,0), Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain));
-    dasm_put(Dst, 5143, ~LJ_GC_BLACK & 255, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
+    dasm_put(Dst, 5282, LJ_ENDIAN_SELECT(4,0), LJ_TTAB, LJ_ENDIAN_SELECT(0,4), Dt6(->asize), Dt6(->array), LJ_ENDIAN_SELECT(4,0), Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain));
+    dasm_put(Dst, 5349, ~LJ_GC_BLACK & 255, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
     break;
 
   case BC_TSETM:
-    dasm_put(Dst, 5154, -8+LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(0,4), Dt6(->asize), Dt6(->marked), Dt6(->array), LJ_GC_BLACK, DISPATCH_GOT(lj_tab_reasize), Dt1(->base), Dt1(->base), DISPATCH_GL(gc.grayagain), ~LJ_GC_BLACK & 255, DISPATCH_GL(gc.grayagain), Dt6(->marked));
-    dasm_put(Dst, 5227, Dt6(->gclist));
+    dasm_put(Dst, 5360, -8+LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(0,4), Dt6(->asize), Dt6(->marked), Dt6(->array), LJ_GC_BLACK, DISPATCH_GOT(lj_tab_reasize), Dt1(->base), Dt1(->base), DISPATCH_GL(gc.grayagain), ~LJ_GC_BLACK & 255, DISPATCH_GL(gc.grayagain), Dt6(->marked));
+    dasm_put(Dst, 5433, Dt6(->gclist));
     break;
 
   /* -- Calls and vararg handling ----------------------------------------- */
 
   case BC_CALLM:
-    dasm_put(Dst, 5232);
+    dasm_put(Dst, 5438);
     break;
   case BC_CALL:
-    dasm_put(Dst, 5237, LJ_TFUNC, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(-4,-8), Dt7(->pc));
+    dasm_put(Dst, 5443, LJ_TFUNC, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(-4,-8), Dt7(->pc));
     break;
 
   case BC_CALLMT:
-    dasm_put(Dst, 5266);
+    dasm_put(Dst, 5472);
     break;
   case BC_CALLT:
-    dasm_put(Dst, 5268, LJ_TFUNC, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(-4,-8), FRAME_TYPE, Dt7(->ffid), FRAME_VARG, LJ_ENDIAN_SELECT(-8,-4), Dt7(->pc), -8+LJ_ENDIAN_SELECT(-8,-4), Dt7(->pc));
-    dasm_put(Dst, 5337, PC2PROTO(k), FRAME_TYPEP, LJ_ENDIAN_SELECT(-4,-8), FRAME_TYPE);
+    dasm_put(Dst, 5474, LJ_TFUNC, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(-4,-8), FRAME_TYPE, Dt7(->ffid), FRAME_VARG, LJ_ENDIAN_SELECT(-8,-4), Dt7(->pc), -8+LJ_ENDIAN_SELECT(-8,-4), Dt7(->pc));
+    dasm_put(Dst, 5543, PC2PROTO(k), FRAME_TYPEP, LJ_ENDIAN_SELECT(-4,-8), FRAME_TYPE);
     break;
 
   case BC_ITERC:
-    dasm_put(Dst, 5353, LJ_TFUNC, -24+LJ_ENDIAN_SELECT(4,0), -24+LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(-4,-8), Dt7(->pc));
+    dasm_put(Dst, 5559, LJ_TFUNC, -24+LJ_ENDIAN_SELECT(4,0), -24+LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(-4,-8), Dt7(->pc));
     break;
 
   case BC_ITERN:
 #if LJ_HASJIT
 #endif
-    dasm_put(Dst, 5388, -16+LJ_ENDIAN_SELECT(0,4), -8+LJ_ENDIAN_SELECT(0,4), Dt6(->asize), Dt6(->array), LJ_ENDIAN_SELECT(4,0), -4+LJ_ENDIAN_SELECT(2,0), (-(BCBIAS_J*4 >> 16) & 65535), -8+LJ_ENDIAN_SELECT(0,4), Dt6(->hmask), Dt6(->node), LJ_ENDIAN_SELECT(4,0), -4+LJ_ENDIAN_SELECT(2,0), DtB(->key), (-(BCBIAS_J*4 >> 16) & 65535));
-    dasm_put(Dst, 5470, -8+LJ_ENDIAN_SELECT(0,4));
+    dasm_put(Dst, 5594, -16+LJ_ENDIAN_SELECT(0,4), -8+LJ_ENDIAN_SELECT(0,4), Dt6(->asize), Dt6(->array), LJ_ENDIAN_SELECT(4,0), -4+LJ_ENDIAN_SELECT(2,0), (-(BCBIAS_J*4 >> 16) & 65535), -8+LJ_ENDIAN_SELECT(0,4), Dt6(->hmask), Dt6(->node), LJ_ENDIAN_SELECT(4,0), -4+LJ_ENDIAN_SELECT(2,0), DtB(->key), (-(BCBIAS_J*4 >> 16) & 65535));
+    dasm_put(Dst, 5676, -8+LJ_ENDIAN_SELECT(0,4));
     break;
 
   case BC_ISNEXT:
-    dasm_put(Dst, 5473, -24+LJ_ENDIAN_SELECT(4,0), -24+LJ_ENDIAN_SELECT(0,4), -16+LJ_ENDIAN_SELECT(4,0), -8+LJ_ENDIAN_SELECT(4,0), LJ_TFUNC, -LJ_TTAB, Dt8(->ffid), -LJ_TNIL, -FF_next_N, (-(BCBIAS_J*4 >> 16) & 65535), -8+LJ_ENDIAN_SELECT(0,4), BC_JMP, BC_ITERC, -4+LJ_ENDIAN_SELECT(0,3), LJ_ENDIAN_SELECT(0,3));
+    dasm_put(Dst, 5679, -24+LJ_ENDIAN_SELECT(4,0), -24+LJ_ENDIAN_SELECT(0,4), -16+LJ_ENDIAN_SELECT(4,0), -8+LJ_ENDIAN_SELECT(4,0), LJ_TFUNC, -LJ_TTAB, Dt8(->ffid), -LJ_TNIL, -FF_next_N, (-(BCBIAS_J*4 >> 16) & 65535), -8+LJ_ENDIAN_SELECT(0,4), BC_JMP, BC_ITERC, -4+LJ_ENDIAN_SELECT(0,3), LJ_ENDIAN_SELECT(0,3));
     break;
 
   case BC_VARG:
-    dasm_put(Dst, 5530, LJ_ENDIAN_SELECT(-4,-8), FRAME_VARG, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), Dt1(->maxstack), DISPATCH_GOT(lj_state_growstack), Dt1(->top), Dt1(->base), Dt1(->base));
-    dasm_put(Dst, 5617);
+    dasm_put(Dst, 5736, LJ_ENDIAN_SELECT(-4,-8), FRAME_VARG, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), Dt1(->maxstack), DISPATCH_GOT(lj_state_growstack), Dt1(->top), Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 5823);
     break;
 
   /* -- Returns ----------------------------------------------------------- */
 
   case BC_RETM:
-    dasm_put(Dst, 5619);
+    dasm_put(Dst, 5825);
     break;
 
   case BC_RET:
-    dasm_put(Dst, 5621, LJ_ENDIAN_SELECT(-4,-8), FRAME_TYPE, FRAME_VARG, LJ_ENDIAN_SELECT(-8,-4), Dt7(->pc), PC2PROTO(k), LJ_ENDIAN_SELECT(4,0), FRAME_TYPEP, LJ_ENDIAN_SELECT(-4,-8));
+    dasm_put(Dst, 5827, LJ_ENDIAN_SELECT(-4,-8), FRAME_TYPE, FRAME_VARG, LJ_ENDIAN_SELECT(-8,-4), Dt7(->pc), PC2PROTO(k), LJ_ENDIAN_SELECT(4,0), FRAME_TYPEP, LJ_ENDIAN_SELECT(-4,-8));
     break;
 
   case BC_RET0: case BC_RET1:
-    dasm_put(Dst, 5693, LJ_ENDIAN_SELECT(-4,-8), FRAME_TYPE, FRAME_VARG);
+    dasm_put(Dst, 5899, LJ_ENDIAN_SELECT(-4,-8), FRAME_TYPE, FRAME_VARG);
     if (op == BC_RET1) {
-      dasm_put(Dst, 5706);
+      dasm_put(Dst, 5912);
     }
-    dasm_put(Dst, 5708);
+    dasm_put(Dst, 5914);
     if (op == BC_RET1) {
-      dasm_put(Dst, 5713);
+      dasm_put(Dst, 5919);
     }
-    dasm_put(Dst, 5715, LJ_ENDIAN_SELECT(-8,-4), Dt7(->pc), PC2PROTO(k));
+    dasm_put(Dst, 5921, LJ_ENDIAN_SELECT(-8,-4), Dt7(->pc), PC2PROTO(k));
     if (op == BC_RET1) {
-      dasm_put(Dst, 5743, LJ_ENDIAN_SELECT(4,0));
+      dasm_put(Dst, 5949, LJ_ENDIAN_SELECT(4,0));
     } else {
-      dasm_put(Dst, 5746, -8+LJ_ENDIAN_SELECT(4,0));
+      dasm_put(Dst, 5952, -8+LJ_ENDIAN_SELECT(4,0));
     }
     break;
 
@@ -6962,7 +7211,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
 
   case BC_FORL:
 #if LJ_HASJIT
-    dasm_put(Dst, 5749);
+    dasm_put(Dst, 5955, GG_DISP2HOT, -HOTCOUNT_LOOP, GG_DISP2HOT);
 #endif
     break;
 
@@ -6974,35 +7223,35 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
   case BC_FORI:
   case BC_IFORL:
     vk = (op == BC_IFORL || op == BC_JFORL);
-    dasm_put(Dst, 5751);
+    dasm_put(Dst, 5967);
     if (vk) {
-      dasm_put(Dst, 5753, FORL_IDX*8, FORL_STEP*8, FORL_STOP*8, FORL_STEP*8+LJ_ENDIAN_SELECT(4,0), FORL_IDX*8);
+      dasm_put(Dst, 5969, FORL_IDX*8, FORL_STEP*8, FORL_STOP*8, FORL_STEP*8+LJ_ENDIAN_SELECT(4,0), FORL_IDX*8);
     } else {
-      dasm_put(Dst, 5765, FORL_IDX*8+LJ_ENDIAN_SELECT(4,0), FORL_STEP*8+LJ_ENDIAN_SELECT(4,0), FORL_STOP*8+LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM, LJ_TISNUM, FORL_IDX*8, FORL_STOP*8);
+      dasm_put(Dst, 5981, FORL_IDX*8+LJ_ENDIAN_SELECT(4,0), FORL_STEP*8+LJ_ENDIAN_SELECT(4,0), FORL_STOP*8+LJ_ENDIAN_SELECT(4,0), LJ_TISNUM, LJ_TISNUM, LJ_TISNUM, FORL_IDX*8, FORL_STOP*8);
     }
     if (op != BC_JFORL) {
-      dasm_put(Dst, 5786, (-(BCBIAS_J*4 >> 16) & 65535));
+      dasm_put(Dst, 6002, (-(BCBIAS_J*4 >> 16) & 65535));
     }
-    dasm_put(Dst, 5790, FORL_EXT*8);
+    dasm_put(Dst, 6006, FORL_EXT*8);
     if (op == BC_JFORI) {
-      dasm_put(Dst, 5795, BC_JLOOP);
+      dasm_put(Dst, 6011, -4+LJ_ENDIAN_SELECT(2,0), BC_JLOOP);
     } else if (op == BC_JFORL) {
-      dasm_put(Dst, 5808, BC_JLOOP);
+      dasm_put(Dst, 6025, BC_JLOOP);
     } else {
-      dasm_put(Dst, 5818);
+      dasm_put(Dst, 6035);
       if (op == BC_FORI) {
-	dasm_put(Dst, 5822);
+	dasm_put(Dst, 6039);
       } else {
-	dasm_put(Dst, 5825);
+	dasm_put(Dst, 6042);
       }
-      dasm_put(Dst, 5828);
+      dasm_put(Dst, 6045);
     }
-    dasm_put(Dst, 5831);
+    dasm_put(Dst, 6048);
     break;
 
   case BC_ITERL:
 #if LJ_HASJIT
-    dasm_put(Dst, 5843);
+    dasm_put(Dst, 6060, GG_DISP2HOT, -HOTCOUNT_LOOP, GG_DISP2HOT);
 #endif
     break;
 
@@ -7011,40 +7260,40 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     break;
 #endif
   case BC_IITERL:
-    dasm_put(Dst, 5845, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4));
+    dasm_put(Dst, 6072, LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4));
     if (op == BC_JITERL) {
-      dasm_put(Dst, 5853, -8+LJ_ENDIAN_SELECT(4,0), BC_JLOOP, -8+LJ_ENDIAN_SELECT(0,4));
+      dasm_put(Dst, 6080, -8+LJ_ENDIAN_SELECT(4,0), BC_JLOOP, -8+LJ_ENDIAN_SELECT(0,4));
     } else {
-      dasm_put(Dst, 5860, (-(BCBIAS_J*4 >> 16) & 65535), -8+LJ_ENDIAN_SELECT(4,0), -8+LJ_ENDIAN_SELECT(0,4));
+      dasm_put(Dst, 6087, (-(BCBIAS_J*4 >> 16) & 65535), -8+LJ_ENDIAN_SELECT(4,0), -8+LJ_ENDIAN_SELECT(0,4));
     }
-    dasm_put(Dst, 5870);
+    dasm_put(Dst, 6097);
     break;
 
   case BC_LOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 5883);
+    dasm_put(Dst, 6110, GG_DISP2HOT, -HOTCOUNT_LOOP, GG_DISP2HOT);
 #endif
     break;
 
   case BC_ILOOP:
-    dasm_put(Dst, 5885);
+    dasm_put(Dst, 6122);
     break;
 
   case BC_JLOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 5897, DISPATCH_J(trace), DISPATCH_GL(vmstate), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L), DtD(->mcode), GG_DISP2G+32768);
+    dasm_put(Dst, 6134, DISPATCH_J(trace), DISPATCH_GL(vmstate), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L), DtD(->mcode), GG_DISP2G+32768);
 #endif
     break;
 
   case BC_JMP:
-    dasm_put(Dst, 5915, (-(BCBIAS_J*4 >> 16) & 65535));
+    dasm_put(Dst, 6152, (-(BCBIAS_J*4 >> 16) & 65535));
     break;
 
   /* -- Function headers -------------------------------------------------- */
 
   case BC_FUNCF:
 #if LJ_HASJIT
-    dasm_put(Dst, 5932);
+    dasm_put(Dst, 6169, GG_DISP2HOT, -HOTCOUNT_CALL, GG_DISP2HOT);
 #endif
   case BC_FUNCV:  /* NYI: compiled vararg functions. */
     break;
@@ -7054,42 +7303,42 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     break;
 #endif
   case BC_IFUNCF:
-    dasm_put(Dst, 5934, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k));
+    dasm_put(Dst, 6181, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k));
     if (op != BC_JFUNCF) {
-      dasm_put(Dst, 5945);
+      dasm_put(Dst, 6192);
     }
-    dasm_put(Dst, 5948);
+    dasm_put(Dst, 6195);
     if (op == BC_JFUNCF) {
-      dasm_put(Dst, 5954, BC_JLOOP);
+      dasm_put(Dst, 6201, BC_JLOOP);
     } else {
-      dasm_put(Dst, 5959);
+      dasm_put(Dst, 6206);
     }
-    dasm_put(Dst, 5969, LJ_ENDIAN_SELECT(4,0));
+    dasm_put(Dst, 6216, LJ_ENDIAN_SELECT(4,0));
     break;
 
   case BC_JFUNCV:
 #if !LJ_HASJIT
     break;
 #endif
-    dasm_put(Dst, 5976);
+    dasm_put(Dst, 6223);
     break;  /* NYI: compiled vararg functions. */
 
   case BC_IFUNCV:
-    dasm_put(Dst, 5978, Dt1(->maxstack), LJ_ENDIAN_SELECT(0,4), 8+FRAME_VARG, -4+PC2PROTO(k), LJ_ENDIAN_SELECT(4,0), -4+PC2PROTO(numparams), LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), 8+LJ_ENDIAN_SELECT(0,4), 8+LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0));
+    dasm_put(Dst, 6225, Dt1(->maxstack), LJ_ENDIAN_SELECT(0,4), 8+FRAME_VARG, -4+PC2PROTO(k), LJ_ENDIAN_SELECT(4,0), -4+PC2PROTO(numparams), LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(0,4), 8+LJ_ENDIAN_SELECT(0,4), 8+LJ_ENDIAN_SELECT(4,0), LJ_ENDIAN_SELECT(4,0));
     break;
 
   case BC_FUNCC:
   case BC_FUNCCW:
     if (op == BC_FUNCC) {
-      dasm_put(Dst, 6033, Dt8(->f));
+      dasm_put(Dst, 6280, Dt8(->f));
     } else {
-      dasm_put(Dst, 6036, DISPATCH_GL(wrapf));
+      dasm_put(Dst, 6283, DISPATCH_GL(wrapf));
     }
-    dasm_put(Dst, 6039, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C);
+    dasm_put(Dst, 6286, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C);
     if (op == BC_FUNCCW) {
-      dasm_put(Dst, 6051, Dt8(->f));
+      dasm_put(Dst, 6298, Dt8(->f));
     }
-    dasm_put(Dst, 6054, DISPATCH_GL(vmstate), Dt1(->base), Dt1(->top), ~LJ_VMST_INTERP, LJ_ENDIAN_SELECT(-4,-8), DISPATCH_GL(vmstate));
+    dasm_put(Dst, 6301, DISPATCH_GL(vmstate), Dt1(->base), Dt1(->top), ~LJ_VMST_INTERP, LJ_ENDIAN_SELECT(-4,-8), DISPATCH_GL(vmstate));
     break;
 
   /* ---------------------------------------------------------------------- */
@@ -7109,7 +7358,7 @@ static int build_backend(BuildCtx *ctx)
 
   build_subroutines(ctx);
 
-  dasm_put(Dst, 6075);
+  dasm_put(Dst, 6322);
   for (op = 0; op < BC__MAX; op++)
     build_ins(ctx, (BCOp)op, op);
 
-- 
cgit v1.2.3-55-g6feb