]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
FFI: Add unwind definitions for lj_vm_ffi_call.
authorMike Pall <mike>
Fri, 11 Nov 2011 21:10:31 +0000 (22:10 +0100)
committerMike Pall <mike>
Sat, 12 Nov 2011 00:16:10 +0000 (01:16 +0100)
Adds exception interoperability for C/C++ functions called via FFI
from the interpreter.

12 files changed:
doc/ext_ffi_semantics.html
src/buildvm_arm.dasc
src/buildvm_arm.h
src/buildvm_asm.c
src/buildvm_peobj.c
src/buildvm_ppc.dasc
src/buildvm_ppc.h
src/buildvm_x64.h
src/buildvm_x64win.h
src/buildvm_x86.dasc
src/buildvm_x86.h
src/lj_ccall.h

index b8c839c2e7f30a6f28b3094b85a61aafe93abfd4..79f25510a9476bbb5f471563f6d6fe2cf47fdde3 100644 (file)
@@ -1005,7 +1005,8 @@ Other missing features:
 <li>Callbacks from C&nbsp;code to Lua functions.</li>
 <li>Passing structs by value to vararg C&nbsp;functions.</li>
 <li><a href="extensions.html#exceptions">C++ exception interoperability</a>
-does not extend to C&nbsp;functions called via the FFI.</li>
+does not extend to C&nbsp;functions called via the FFI, if the call is
+compiled.</li>
 </ul>
 <br class="flush">
 </div>
index 9b40ad188dcfd2e99cb44690491333db2da67180..29c616e01bf269c18918f205148b6b7b0bb253d1 100644 (file)
@@ -2178,7 +2178,8 @@ static void build_subroutines(BuildCtx *ctx)
   |//-- FFI helper functions -----------------------------------------------
   |//-----------------------------------------------------------------------
   |
-  |->vm_ffi_call:
+  |->vm_ffi_call:                      // Call C function via FFI.
+  |  // Caveat: needs special frame unwinding, see below.
 #if LJ_HASFFI
   |  .type CCSTATE, CCallState, r4
   |  push {CCSTATE, r5, r11, lr}
@@ -2207,6 +2208,7 @@ static void build_subroutines(BuildCtx *ctx)
   |  str CRET2, CCSTATE->gpr[1]
   |  pop {CCSTATE, r5, r11, pc}
 #endif
+  |// Note: vm_ffi_call must be the last function in this object file!
   |
   |//-----------------------------------------------------------------------
 }
@@ -4003,6 +4005,7 @@ static int build_backend(BuildCtx *ctx)
 /* Emit pseudo frame-info for all assembler functions. */
 static void emit_asm_debug(BuildCtx *ctx)
 {
+  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);
   int i;
   switch (ctx->mode) {
   case BUILD_elfasm:
@@ -4028,13 +4031,30 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.long .Lbegin\n"
        "\t.long %d\n"
        "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
-       "\t.byte 0x8e\n\t.uleb128 1\n",         /* Restore lr. */
-       (int)ctx->codesz, CFRAME_SIZE);
-    for (i = 11; i >= 4; i--)  /* Restore r4-r11. */
+       "\t.byte 0x8e\n\t.uleb128 1\n",         /* offset lr */
+       fcofs, CFRAME_SIZE);
+    for (i = 11; i >= 4; i--)  /* offset r4-r11 */
       fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 2+(11-i));
     fprintf(ctx->fp,
        "\t.align 2\n"
        ".LEFDE0:\n\n");
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".LSFDE1:\n"
+       "\t.long .LEFDE1-.LASFDE1\n"
+       ".LASFDE1:\n"
+       "\t.long .Lframe0\n"
+       "\t.long lj_vm_ffi_call\n"
+       "\t.long %d\n"
+       "\t.byte 0xe\n\t.uleb128 16\n"          /* def_cfa_offset */
+       "\t.byte 0x8e\n\t.uleb128 1\n"          /* offset lr */
+       "\t.byte 0x8b\n\t.uleb128 2\n"          /* offset r11 */
+       "\t.byte 0x85\n\t.uleb128 3\n"          /* offset r5 */
+       "\t.byte 0x84\n\t.uleb128 4\n"          /* offset r4 */
+       "\t.byte 0xd\n\t.uleb128 0xb\n"         /* def_cfa_register r11 */
+       "\t.align 2\n"
+       ".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
+#endif
     break;
   default:
     break;
index 0c2d9f399674cf97e602fcc9c805825e8c41ad3a..bdb0038bc9d11b7c77a88dced303415e4fc8f88e 100644 (file)
@@ -7332,6 +7332,7 @@ static int build_backend(BuildCtx *ctx)
 /* Emit pseudo frame-info for all assembler functions. */
 static void emit_asm_debug(BuildCtx *ctx)
 {
+  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);
   int i;
   switch (ctx->mode) {
   case BUILD_elfasm:
@@ -7357,13 +7358,30 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.long .Lbegin\n"
        "\t.long %d\n"
        "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
-       "\t.byte 0x8e\n\t.uleb128 1\n",         /* Restore lr. */
-       (int)ctx->codesz, CFRAME_SIZE);
-    for (i = 11; i >= 4; i--)  /* Restore r4-r11. */
+       "\t.byte 0x8e\n\t.uleb128 1\n",         /* offset lr */
+       fcofs, CFRAME_SIZE);
+    for (i = 11; i >= 4; i--)  /* offset r4-r11 */
       fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 2+(11-i));
     fprintf(ctx->fp,
        "\t.align 2\n"
        ".LEFDE0:\n\n");
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".LSFDE1:\n"
+       "\t.long .LEFDE1-.LASFDE1\n"
+       ".LASFDE1:\n"
+       "\t.long .Lframe0\n"
+       "\t.long lj_vm_ffi_call\n"
+       "\t.long %d\n"
+       "\t.byte 0xe\n\t.uleb128 16\n"          /* def_cfa_offset */
+       "\t.byte 0x8e\n\t.uleb128 1\n"          /* offset lr */
+       "\t.byte 0x8b\n\t.uleb128 2\n"          /* offset r11 */
+       "\t.byte 0x85\n\t.uleb128 3\n"          /* offset r5 */
+       "\t.byte 0x84\n\t.uleb128 4\n"          /* offset r4 */
+       "\t.byte 0xd\n\t.uleb128 0xb\n"         /* def_cfa_register r11 */
+       "\t.align 2\n"
+       ".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
+#endif
     break;
   default:
     break;
index 6a860c9ff7151cbdad3a279cbced8b13b8843e2c..01330456ae5d0346d1b439855117822968d1360a 100644 (file)
@@ -202,6 +202,17 @@ void emit_asm(BuildCtx *ctx)
   for (i = rel = 0; i < ctx->nsym; i++) {
     int32_t ofs = ctx->sym[i].ofs;
     int32_t next = ctx->sym[i+1].ofs;
+#if LJ_TARGET_ARM && defined(__GNUC__) && !defined(LUAJIT_NO_UNWIND) && \
+    LJ_HASFFI
+    if (!strcmp(ctx->sym[i].name, "lj_vm_ffi_call"))
+      fprintf(ctx->fp,
+             ".globl lj_err_unwind_arm\n"
+             ".personality lj_err_unwind_arm\n"
+             ".fnend\n"
+             ".fnstart\n"
+             ".save {r4, r5, r11, lr}\n"
+             ".setfp r11, sp\n");
+#endif
     emit_asm_label(ctx, ctx->sym[i].name, next - ofs, 1);
     while (rel < ctx->nreloc && ctx->reloc[rel].ofs <= next) {
       BuildReloc *r = &ctx->reloc[rel];
@@ -229,8 +240,10 @@ void emit_asm(BuildCtx *ctx)
 
 #if LJ_TARGET_ARM && defined(__GNUC__) && !defined(LUAJIT_NO_UNWIND)
   fprintf(ctx->fp,
+#if !LJ_HASFFI
          ".globl lj_err_unwind_arm\n"
          ".personality lj_err_unwind_arm\n"
+#endif
          ".fnend\n");
 #endif
 
index b97a5b03885b3bea3bb3ef3876c730cfe98df583..eb1d345fdf0e71fc6a6db4e5cc911d7742d4c824 100644 (file)
@@ -191,15 +191,15 @@ void emit_peobj(BuildCtx *ctx)
 #if LJ_TARGET_X64
   memcpy(pesect[PEOBJ_SECT_PDATA].name, ".pdata", sizeof(".pdata")-1);
   pesect[PEOBJ_SECT_PDATA].ofs = sofs;
-  sofs += (pesect[PEOBJ_SECT_PDATA].size = 3*4);
+  sofs += (pesect[PEOBJ_SECT_PDATA].size = 6*4);
   pesect[PEOBJ_SECT_PDATA].relocofs = sofs;
-  sofs += (pesect[PEOBJ_SECT_PDATA].nreloc = 3) * PEOBJ_RELOC_SIZE;
+  sofs += (pesect[PEOBJ_SECT_PDATA].nreloc = 6) * PEOBJ_RELOC_SIZE;
   /* Flags: 40 = read, 30 = align4, 40 = initialized data. */
   pesect[PEOBJ_SECT_PDATA].flags = 0x40300040;
 
   memcpy(pesect[PEOBJ_SECT_XDATA].name, ".xdata", sizeof(".xdata")-1);
   pesect[PEOBJ_SECT_XDATA].ofs = sofs;
-  sofs += (pesect[PEOBJ_SECT_XDATA].size = 8*2+4);  /* See below. */
+  sofs += (pesect[PEOBJ_SECT_XDATA].size = 8*2+4+6*2);  /* See below. */
   pesect[PEOBJ_SECT_XDATA].relocofs = sofs;
   sofs += (pesect[PEOBJ_SECT_XDATA].nreloc = 1) * PEOBJ_RELOC_SIZE;
   /* Flags: 40 = read, 30 = align4, 40 = initialized data. */
@@ -247,9 +247,12 @@ void emit_peobj(BuildCtx *ctx)
 
 #if LJ_TARGET_X64
   { /* Write .pdata section. */
+    uint32_t fcofs = (uint32_t)ctx->sym[ctx->nsym-1].ofs;
     uint32_t pdata[3];  /* Start of .text, end of .text and .xdata. */
     PEreloc reloc;
-    pdata[0] = 0; pdata[1] = (uint32_t)ctx->codesz; pdata[2] = 0;
+    pdata[0] = 0; pdata[1] = fcofs; pdata[2] = 0;
+    owrite(ctx, &pdata, sizeof(pdata));
+    pdata[0] = fcofs; pdata[1] = (uint32_t)ctx->codesz; pdata[2] = 20;
     owrite(ctx, &pdata, sizeof(pdata));
     reloc.vaddr = 0; reloc.symidx = 1+2+nrsym+2+2+1;
     reloc.type = PEOBJ_RELOC_ADDR32NB;
@@ -260,12 +263,21 @@ void emit_peobj(BuildCtx *ctx)
     reloc.vaddr = 8; reloc.symidx = 1+2+nrsym+2;
     reloc.type = PEOBJ_RELOC_ADDR32NB;
     owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);
+    reloc.vaddr = 12; reloc.symidx = 1+2+nrsym+2+2+1;
+    reloc.type = PEOBJ_RELOC_ADDR32NB;
+    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);
+    reloc.vaddr = 16; reloc.symidx = 1+2+nrsym+2+2+1;
+    reloc.type = PEOBJ_RELOC_ADDR32NB;
+    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);
+    reloc.vaddr = 20; reloc.symidx = 1+2+nrsym+2;
+    reloc.type = PEOBJ_RELOC_ADDR32NB;
+    owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);
   }
   { /* Write .xdata section. */
-    uint16_t xdata[8+2];
+    uint16_t xdata[8+2+6];
     PEreloc reloc;
-    xdata[0] = 0x01|0x08|0x10;  /* Ver. 1, uhander/ehandler, prolog size 0. */
-    xdata[1] = 5;  /* Number of unwind codes, no frame pointer. */
+    xdata[0] = 0x01|0x08|0x10;  /* Ver. 1, uhandler/ehandler, prolog size 0. */
+    xdata[1] = 0x0005;  /* Number of unwind codes, no frame pointer. */
     xdata[2] = 0x4200;  /* Stack offset 4*8+8 = aword*5. */
     xdata[3] = 0x3000;  /* Push rbx. */
     xdata[4] = 0x6000;  /* Push rsi. */
@@ -273,8 +285,14 @@ void emit_peobj(BuildCtx *ctx)
     xdata[6] = 0x5000;  /* Push rbp. */
     xdata[7] = 0;  /* Alignment. */
     xdata[8] = xdata[9] = 0;  /* Relocated address of exception handler. */
+    xdata[10] = 0x01;  /* Ver. 1, no handler, prolog size 0. */
+    xdata[11] = 0x1504;  /* Number of unwind codes, fp = rbp, fpofs = 16. */
+    xdata[12] = 0x0300;  /* set_fpreg. */
+    xdata[13] = 0x0200;  /* stack offset 0*8+8 = aword*1. */
+    xdata[14] = 0x3000;  /* Push rbx. */
+    xdata[15] = 0x5000;  /* Push rbp. */
     owrite(ctx, &xdata, sizeof(xdata));
-    reloc.vaddr = sizeof(xdata)-4; reloc.symidx = 1+2+nrsym+2+2;
+    reloc.vaddr = 2*8; reloc.symidx = 1+2+nrsym+2+2;
     reloc.type = PEOBJ_RELOC_ADDR32NB;
     owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);
   }
index 0bcc5ad7e9024dd1828b0a331c9619d62195e05a..1cbf3a748d254a9f5b97c7cc816b7e9ab66d03dd 100644 (file)
@@ -2527,7 +2527,8 @@ static void build_subroutines(BuildCtx *ctx)
   |//-- FFI helper functions -----------------------------------------------
   |//-----------------------------------------------------------------------
   |
-  |->vm_ffi_call:
+  |->vm_ffi_call:                      // Call C function via FFI.
+  |  // Caveat: needs special frame unwinding, see below.
 #if LJ_HASFFI
   |  .type CCSTATE, CCallState, CARG1
   |  lwz TMP1, CCSTATE->spadj
@@ -2541,8 +2542,10 @@ static void build_subroutines(BuildCtx *ctx)
   |   addic. CARG2, CARG2, -1
   |  stwux sp, sp, TMP1
   |   crnot 4*cr1+eq, 4*cr1+eq         // For vararg calls.
-  |  stw CCSTATE, -4(TMP2)
+  |  stw r14, -4(TMP2)
   |   li TMP3, 0
+  |  stw CCSTATE, -8(TMP2)
+  |  mr r14, TMP2
   |  la TMP1, CCSTATE->stack
   |   slwi CARG2, CARG2, 2
   |   blty >2
@@ -2574,18 +2577,20 @@ static void build_subroutines(BuildCtx *ctx)
   |  lwz r10, CCSTATE->gpr[7]
   |  lwz CARG1, CCSTATE->gpr[0]                // Do this last, since CCSTATE is CARG1.
   |   bctrl
-  |  lwz TMP2, 0(sp)
-  |  lwz CCSTATE:TMP1, -4(TMP2)
-  |   lwz TMP0, 4(TMP2)
+  |  lwz CCSTATE:TMP1, -8(r14)
+  |  lwz TMP2, -4(r14)
+  |   lwz TMP0, 4(r14)
   |  stw CARG1, CCSTATE:TMP1->gpr[0]
   |  stfd FARG1, CCSTATE:TMP1->fpr[0]
   |  stw CARG2, CCSTATE:TMP1->gpr[1]
   |   mtlr TMP0
   |  stw CARG3, CCSTATE:TMP1->gpr[2]
-  |   mr sp, TMP2
+  |   mr sp, r14
   |  stw CARG4, CCSTATE:TMP1->gpr[3]
+  |   mr r14, TMP2
   |  blr
 #endif
+  |// Note: vm_ffi_call must be the last function in this object file!
   |
   |//-----------------------------------------------------------------------
 }
@@ -4665,6 +4670,7 @@ static int build_backend(BuildCtx *ctx)
 /* Emit pseudo frame-info for all assembler functions. */
 static void emit_asm_debug(BuildCtx *ctx)
 {
+  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);
   int i;
   switch (ctx->mode) {
   case BUILD_elfasm:
@@ -4692,7 +4698,7 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.byte 0xe\n\t.uleb128 %d\n"
        "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"
        "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n",
-       (int)ctx->codesz, CFRAME_SIZE);
+       fcofs, CFRAME_SIZE);
     for (i = 14; i <= 31; i++)
       fprintf(ctx->fp,
        "\t.byte %d\n\t.uleb128 %d\n"
@@ -4701,6 +4707,20 @@ static void emit_asm_debug(BuildCtx *ctx)
     fprintf(ctx->fp,
        "\t.align 2\n"
        ".LEFDE0:\n\n");
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".LSFDE1:\n"
+       "\t.long .LEFDE1-.LASFDE1\n"
+       ".LASFDE1:\n"
+       "\t.long .Lframe0\n"
+       "\t.long lj_vm_ffi_call\n"
+       "\t.long %d\n"
+       "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"
+       "\t.byte 0x8e\n\t.uleb128 2\n"
+       "\t.byte 0xd\n\t.uleb128 0xe\n"
+       "\t.align 2\n"
+       ".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
+#endif
     fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");
     fprintf(ctx->fp,
        ".Lframe1:\n"
@@ -4720,17 +4740,17 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.align 2\n"
        ".LECIE1:\n\n");
     fprintf(ctx->fp,
-       ".LSFDE1:\n"
-       "\t.long .LEFDE1-.LASFDE1\n"
-       ".LASFDE1:\n"
-       "\t.long .LASFDE1-.Lframe1\n"
+       ".LSFDE2:\n"
+       "\t.long .LEFDE2-.LASFDE2\n"
+       ".LASFDE2:\n"
+       "\t.long .LASFDE2-.Lframe1\n"
        "\t.long .Lbegin-.\n"
        "\t.long %d\n"
        "\t.uleb128 0\n"                        /* augmentation length */
        "\t.byte 0xe\n\t.uleb128 %d\n"
        "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"
        "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n",
-       (int)ctx->codesz, CFRAME_SIZE);
+       fcofs, CFRAME_SIZE);
     for (i = 14; i <= 31; i++)
       fprintf(ctx->fp,
        "\t.byte %d\n\t.uleb128 %d\n"
@@ -4738,7 +4758,37 @@ static void emit_asm_debug(BuildCtx *ctx)
        0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i));
     fprintf(ctx->fp,
        "\t.align 2\n"
-       ".LEFDE1:\n\n");
+       ".LEFDE2:\n\n");
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".Lframe2:\n"
+       "\t.long .LECIE2-.LSCIE2\n"
+       ".LSCIE2:\n"
+       "\t.long 0\n"
+       "\t.byte 0x1\n"
+       "\t.string \"zR\"\n"
+       "\t.uleb128 0x1\n"
+       "\t.sleb128 -4\n"
+       "\t.byte 65\n"
+       "\t.uleb128 1\n"                        /* augmentation length */
+       "\t.byte 0x1b\n"                        /* pcrel|sdata4 */
+       "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"
+       "\t.align 2\n"
+       ".LECIE2:\n\n");
+    fprintf(ctx->fp,
+       ".LSFDE3:\n"
+       "\t.long .LEFDE3-.LASFDE3\n"
+       ".LASFDE3:\n"
+       "\t.long .LASFDE3-.Lframe2\n"
+       "\t.long lj_vm_ffi_call-.\n"
+       "\t.long %d\n"
+       "\t.uleb128 0\n"                        /* augmentation length */
+       "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"
+       "\t.byte 0x8e\n\t.uleb128 2\n"
+       "\t.byte 0xd\n\t.uleb128 0xe\n"
+       "\t.align 2\n"
+       ".LEFDE3:\n\n", (int)ctx->codesz - fcofs);
+#endif
     break;
   default:
     break;
index ea35c99093296000d16fcecfe380a9d77aa7bf95..80d713c906ef498e7c18c358ff95aed4c35c709d 100644 (file)
@@ -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[7577] = {
+static const unsigned int build_actionlist[7580] = {
 0x00010001,
 0x00060014,
 0x72000000,
@@ -4112,8 +4112,10 @@ static const unsigned int build_actionlist[7577] = {
 0x3484ffff,
 0x7c21416e,
 0x4cc63042,
-0x9069fffc,
+0x91c9fffc,
 0x38c00000,
+0x9069fff8,
+0x7d2e4b78,
 0x39030000,
 0x00098200,
 0x54841000,
@@ -4168,9 +4170,9 @@ static const unsigned int build_actionlist[7577] = {
 0x80630000,
 0x00098200,
 0x4e800421,
-0x81210000,
-0x8109fffc,
-0x80090004,
+0x810efff8,
+0x812efffc,
+0x800e0004,
 0x90680000,
 0x00098200,
 0xd8280000,
@@ -4180,9 +4182,10 @@ static const unsigned int build_actionlist[7577] = {
 0x7c0803a6,
 0x90a80000,
 0x00098200,
-0x7d214b78,
+0x7dc17378,
 0x90c80000,
 0x00098200,
+0x7d2e4b78,
 0x4e800020,
 0x00000000,
 0x00080000,
@@ -8349,7 +8352,7 @@ static void build_subroutines(BuildCtx *ctx)
 #if LJ_HASFFI
 #define DtE(_V) (int)(ptrdiff_t)&(((CCallState *)0)_V)
   dasm_put(Dst, 4085, DtE(->spadj), DtE(->nsp), DtE(->nfpr), DtE(->stack), 31-2, DtE(->fpr[0]), DtE(->fpr[1]), DtE(->fpr[2]), DtE(->fpr[3]), DtE(->fpr[4]), DtE(->fpr[5]), DtE(->fpr[6]), DtE(->fpr[7]), DtE(->func), DtE(->gpr[1]), DtE(->gpr[2]));
-  dasm_put(Dst, 4141, DtE(->gpr[3]), DtE(->gpr[4]), DtE(->gpr[5]), DtE(->gpr[6]), DtE(->gpr[7]), DtE(->gpr[0]), DtE(->gpr[0]), DtE(->fpr[0]), DtE(->gpr[1]), DtE(->gpr[2]), DtE(->gpr[3]));
+  dasm_put(Dst, 4143, DtE(->gpr[3]), DtE(->gpr[4]), DtE(->gpr[5]), DtE(->gpr[6]), DtE(->gpr[7]), DtE(->gpr[0]), DtE(->gpr[0]), DtE(->fpr[0]), DtE(->gpr[1]), DtE(->gpr[2]), DtE(->gpr[3]));
 #endif
 }
 
@@ -8357,7 +8360,7 @@ static void build_subroutines(BuildCtx *ctx)
 static void build_ins(BuildCtx *ctx, BCOp op, int defop)
 {
   int vk = 0;
-  dasm_put(Dst, 4172, defop);
+  dasm_put(Dst, 4175, defop);
 
   switch (op) {
 
@@ -8367,224 +8370,224 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
 
   case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 4174, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 4177, -(BCBIAS_J*4 >> 16));
       if (op == BC_ISLT) {
-       dasm_put(Dst, 4191);
-      } else if (op == BC_ISGE) {
        dasm_put(Dst, 4194);
-      } else if (op == BC_ISLE) {
+      } else if (op == BC_ISGE) {
        dasm_put(Dst, 4197);
-      } else {
+      } else if (op == BC_ISLE) {
        dasm_put(Dst, 4200);
+      } else {
+       dasm_put(Dst, 4203);
       }
-      dasm_put(Dst, 4203);
+      dasm_put(Dst, 4206);
       if (op == BC_ISLT) {
-       dasm_put(Dst, 4242);
-      } else if (op == BC_ISGE) {
        dasm_put(Dst, 4245);
-      } else if (op == BC_ISLE) {
+      } else if (op == BC_ISGE) {
        dasm_put(Dst, 4248);
+      } else if (op == BC_ISLE) {
+       dasm_put(Dst, 4251);
       } else {
-       dasm_put(Dst, 4252);
+       dasm_put(Dst, 4255);
       }
-      dasm_put(Dst, 4256);
+      dasm_put(Dst, 4259);
     } else {
-      dasm_put(Dst, 4259, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 4262, -(BCBIAS_J*4 >> 16));
       if (op == BC_ISLT) {
-       dasm_put(Dst, 4276);
-      } else if (op == BC_ISGE) {
        dasm_put(Dst, 4279);
-      } else if (op == BC_ISLE) {
+      } else if (op == BC_ISGE) {
        dasm_put(Dst, 4282);
+      } else if (op == BC_ISLE) {
+       dasm_put(Dst, 4285);
       } else {
-       dasm_put(Dst, 4286);
+       dasm_put(Dst, 4289);
       }
-      dasm_put(Dst, 4290);
+      dasm_put(Dst, 4293);
     }
     break;
 
   case BC_ISEQV: case BC_ISNEV:
     vk = op == BC_ISEQV;
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 4303, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 4306, -(BCBIAS_J*4 >> 16));
       if (vk) {
-       dasm_put(Dst, 4316);
-      } else {
        dasm_put(Dst, 4319);
+      } else {
+       dasm_put(Dst, 4322);
       }
     } else {
-      dasm_put(Dst, 4322, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 4325, -(BCBIAS_J*4 >> 16));
       if (vk) {
-       dasm_put(Dst, 4339);
+       dasm_put(Dst, 4342);
       } else {
-       dasm_put(Dst, 4343);
+       dasm_put(Dst, 4346);
       }
-      dasm_put(Dst, 4347);
+      dasm_put(Dst, 4350);
     }
-    dasm_put(Dst, 4359);
+    dasm_put(Dst, 4362);
     if (!LJ_DUALNUM) {
-      dasm_put(Dst, 4361);
+      dasm_put(Dst, 4364);
     }
     if (LJ_HASFFI) {
-      dasm_put(Dst, 4364, LJ_TCDATA, LJ_TCDATA);
+      dasm_put(Dst, 4367, LJ_TCDATA, LJ_TCDATA);
     }
-    dasm_put(Dst, 4369, ~LJ_TISPRI);
+    dasm_put(Dst, 4372, ~LJ_TISPRI);
     if (LJ_HASFFI) {
-      dasm_put(Dst, 4374);
+      dasm_put(Dst, 4377);
     }
-    dasm_put(Dst, 4376, ~LJ_TISTABUD);
+    dasm_put(Dst, 4379, ~LJ_TISTABUD);
     if (LJ_HASFFI) {
-      dasm_put(Dst, 4379);
+      dasm_put(Dst, 4382);
     }
-    dasm_put(Dst, 4382);
+    dasm_put(Dst, 4385);
     if (vk) {
-      dasm_put(Dst, 4390);
+      dasm_put(Dst, 4393);
     } else {
-      dasm_put(Dst, 4395);
+      dasm_put(Dst, 4398);
     }
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 4400);
+      dasm_put(Dst, 4403);
     } else {
-      dasm_put(Dst, 4415);
+      dasm_put(Dst, 4418);
     }
-    dasm_put(Dst, 4418, Dt6(->metatable), 1-vk, Dt6(->nomm), 1<<MM_eq);
+    dasm_put(Dst, 4421, Dt6(->metatable), 1-vk, Dt6(->nomm), 1<<MM_eq);
     break;
 
   case BC_ISEQS: case BC_ISNES:
     vk = op == BC_ISEQS;
-    dasm_put(Dst, 4437, 32-1);
+    dasm_put(Dst, 4440, 32-1);
     if (LJ_HASFFI) {
-      dasm_put(Dst, 4445, LJ_TCDATA);
+      dasm_put(Dst, 4448, LJ_TCDATA);
     }
-    dasm_put(Dst, 4448, LJ_TSTR);
+    dasm_put(Dst, 4451, LJ_TSTR);
     if (LJ_HASFFI) {
-      dasm_put(Dst, 4452);
+      dasm_put(Dst, 4455);
     }
-    dasm_put(Dst, 4455, -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 4458, -(BCBIAS_J*4 >> 16));
     if (vk) {
-      dasm_put(Dst, 4463);
+      dasm_put(Dst, 4466);
     } else {
-      dasm_put(Dst, 4465);
+      dasm_put(Dst, 4468);
     }
-    dasm_put(Dst, 4467);
+    dasm_put(Dst, 4470);
     break;
 
   case BC_ISEQN: case BC_ISNEN:
     vk = op == BC_ISEQN;
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 4479, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 4482, -(BCBIAS_J*4 >> 16));
       if (vk) {
-       dasm_put(Dst, 4491);
+       dasm_put(Dst, 4494);
       } else {
-       dasm_put(Dst, 4493);
+       dasm_put(Dst, 4496);
       }
-      dasm_put(Dst, 4495);
+      dasm_put(Dst, 4498);
     } else {
       if (vk) {
-       dasm_put(Dst, 4502);
+       dasm_put(Dst, 4505);
       } else {
-       dasm_put(Dst, 4504);
+       dasm_put(Dst, 4507);
       }
-      dasm_put(Dst, 4506, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 4509, -(BCBIAS_J*4 >> 16));
     }
     if (vk) {
-      dasm_put(Dst, 4519);
+      dasm_put(Dst, 4522);
       if (!LJ_HASFFI) {
-       dasm_put(Dst, 4524);
+       dasm_put(Dst, 4527);
       }
     } else {
-      dasm_put(Dst, 4526);
+      dasm_put(Dst, 4529);
       if (!LJ_HASFFI) {
-       dasm_put(Dst, 4530);
+       dasm_put(Dst, 4533);
       }
-      dasm_put(Dst, 4532);
+      dasm_put(Dst, 4535);
     }
-    dasm_put(Dst, 4535);
+    dasm_put(Dst, 4538);
     if (LJ_HASFFI) {
-      dasm_put(Dst, 4546, LJ_TCDATA);
+      dasm_put(Dst, 4549, LJ_TCDATA);
     }
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 4554);
+      dasm_put(Dst, 4557);
     }
     break;
 
   case BC_ISEQP: case BC_ISNEP:
     vk = op == BC_ISEQP;
-    dasm_put(Dst, 4578, 32-3);
+    dasm_put(Dst, 4581, 32-3);
     if (LJ_HASFFI) {
-      dasm_put(Dst, 4585, LJ_TCDATA);
+      dasm_put(Dst, 4588, LJ_TCDATA);
     }
-    dasm_put(Dst, 4588);
+    dasm_put(Dst, 4591);
     if (LJ_HASFFI) {
-      dasm_put(Dst, 4590);
+      dasm_put(Dst, 4593);
     }
-    dasm_put(Dst, 4593, -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 4596, -(BCBIAS_J*4 >> 16));
     if (vk) {
-      dasm_put(Dst, 4599);
+      dasm_put(Dst, 4602);
     } else {
-      dasm_put(Dst, 4601);
+      dasm_put(Dst, 4604);
     }
-    dasm_put(Dst, 4603);
+    dasm_put(Dst, 4606);
     break;
 
   /* -- Unary test and copy ops ------------------------------------------- */
 
   case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:
-    dasm_put(Dst, 4615);
+    dasm_put(Dst, 4618);
     if (op == BC_IST || op == BC_ISF) {
-      dasm_put(Dst, 4619, LJ_TTRUE, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 4622, LJ_TTRUE, -(BCBIAS_J*4 >> 16));
       if (op == BC_IST) {
-       dasm_put(Dst, 4626);
+       dasm_put(Dst, 4629);
       } else {
-       dasm_put(Dst, 4628);
+       dasm_put(Dst, 4631);
       }
-      dasm_put(Dst, 4630);
+      dasm_put(Dst, 4633);
     } else {
-      dasm_put(Dst, 4632, LJ_TFALSE);
+      dasm_put(Dst, 4635, LJ_TFALSE);
       if (op == BC_ISTC) {
-       dasm_put(Dst, 4637);
-      } else {
        dasm_put(Dst, 4640);
+      } else {
+       dasm_put(Dst, 4643);
       }
-      dasm_put(Dst, 4643, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 4646, -(BCBIAS_J*4 >> 16));
     }
-    dasm_put(Dst, 4650);
+    dasm_put(Dst, 4653);
     break;
 
   /* -- Unary ops --------------------------------------------------------- */
 
   case BC_MOV:
-    dasm_put(Dst, 4661);
+    dasm_put(Dst, 4664);
     break;
   case BC_NOT:
-    dasm_put(Dst, 4674, LJ_TTRUE);
+    dasm_put(Dst, 4677, LJ_TTRUE);
     break;
   case BC_UNM:
-    dasm_put(Dst, 4690);
+    dasm_put(Dst, 4693);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 4694);
+      dasm_put(Dst, 4697);
     }
-    dasm_put(Dst, 4722);
+    dasm_put(Dst, 4725);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 4732);
-    } else {
       dasm_put(Dst, 4735);
+    } else {
+      dasm_put(Dst, 4738);
     }
     break;
   case BC_LEN:
-    dasm_put(Dst, 4744, LJ_TSTR, Dt5(->len));
+    dasm_put(Dst, 4747, LJ_TSTR, Dt5(->len));
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 4754);
+      dasm_put(Dst, 4757);
     } else {
-      dasm_put(Dst, 4759);
+      dasm_put(Dst, 4762);
     }
-    dasm_put(Dst, 4766, LJ_TTAB);
+    dasm_put(Dst, 4769, LJ_TTAB);
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
-    dasm_put(Dst, 4780, Dt6(->metatable));
+    dasm_put(Dst, 4783, Dt6(->metatable));
 #endif
-    dasm_put(Dst, 4787);
+    dasm_put(Dst, 4790);
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
-    dasm_put(Dst, 4793, Dt6(->nomm), 1<<MM_len);
+    dasm_put(Dst, 4796, Dt6(->nomm), 1<<MM_len);
 #endif
     break;
 
@@ -8596,77 +8599,77 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 4803);
+    dasm_put(Dst, 4806);
       break;
     case 1:
-    dasm_put(Dst, 4809);
+    dasm_put(Dst, 4812);
       break;
     default:
-    dasm_put(Dst, 4815);
+    dasm_put(Dst, 4818);
       break;
     }
-    dasm_put(Dst, 4821);
+    dasm_put(Dst, 4824);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 4848);
+    dasm_put(Dst, 4851);
       break;
     case 1:
-    dasm_put(Dst, 4851);
+    dasm_put(Dst, 4854);
       break;
     default:
-    dasm_put(Dst, 4854);
+    dasm_put(Dst, 4857);
       break;
     }
-    dasm_put(Dst, 4857);
+    dasm_put(Dst, 4860);
     if (vk == 1) {
-    dasm_put(Dst, 4859);
+    dasm_put(Dst, 4862);
     } else {
-    dasm_put(Dst, 4863);
+    dasm_put(Dst, 4866);
     }
     switch (vk) {
     case 0:
-    dasm_put(Dst, 4867);
+    dasm_put(Dst, 4870);
       break;
     case 1:
-    dasm_put(Dst, 4870);
+    dasm_put(Dst, 4873);
       break;
     default:
-    dasm_put(Dst, 4873);
+    dasm_put(Dst, 4876);
       break;
     }
-    dasm_put(Dst, 4876);
+    dasm_put(Dst, 4879);
     } else {
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 4883);
+    dasm_put(Dst, 4886);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 4885);
+    dasm_put(Dst, 4888);
     }
-    dasm_put(Dst, 4887);
-    if (LJ_DUALNUM) {
     dasm_put(Dst, 4890);
+    if (LJ_DUALNUM) {
+    dasm_put(Dst, 4893);
     } else {
-    dasm_put(Dst, 4896);
+    dasm_put(Dst, 4899);
     }
       break;
     case 1:
-    dasm_put(Dst, 4900);
+    dasm_put(Dst, 4903);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 4902);
+    dasm_put(Dst, 4905);
     }
-    dasm_put(Dst, 4904);
-    if (LJ_DUALNUM) {
     dasm_put(Dst, 4907);
+    if (LJ_DUALNUM) {
+    dasm_put(Dst, 4910);
     } else {
-    dasm_put(Dst, 4913);
+    dasm_put(Dst, 4916);
     }
       break;
     default:
-    dasm_put(Dst, 4917);
+    dasm_put(Dst, 4920);
       break;
     }
-    dasm_put(Dst, 4927);
+    dasm_put(Dst, 4930);
     }
     break;
   case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:
@@ -8674,77 +8677,77 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 4940);
+    dasm_put(Dst, 4943);
       break;
     case 1:
-    dasm_put(Dst, 4946);
+    dasm_put(Dst, 4949);
       break;
     default:
-    dasm_put(Dst, 4952);
+    dasm_put(Dst, 4955);
       break;
     }
-    dasm_put(Dst, 4958);
+    dasm_put(Dst, 4961);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 4985);
+    dasm_put(Dst, 4988);
       break;
     case 1:
-    dasm_put(Dst, 4988);
+    dasm_put(Dst, 4991);
       break;
     default:
-    dasm_put(Dst, 4991);
+    dasm_put(Dst, 4994);
       break;
     }
-    dasm_put(Dst, 4994);
+    dasm_put(Dst, 4997);
     if (vk == 1) {
-    dasm_put(Dst, 4996);
+    dasm_put(Dst, 4999);
     } else {
-    dasm_put(Dst, 5000);
+    dasm_put(Dst, 5003);
     }
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5004);
+    dasm_put(Dst, 5007);
       break;
     case 1:
-    dasm_put(Dst, 5007);
+    dasm_put(Dst, 5010);
       break;
     default:
-    dasm_put(Dst, 5010);
+    dasm_put(Dst, 5013);
       break;
     }
-    dasm_put(Dst, 5013);
+    dasm_put(Dst, 5016);
     } else {
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5020);
+    dasm_put(Dst, 5023);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 5022);
+    dasm_put(Dst, 5025);
     }
-    dasm_put(Dst, 5024);
-    if (LJ_DUALNUM) {
     dasm_put(Dst, 5027);
+    if (LJ_DUALNUM) {
+    dasm_put(Dst, 5030);
     } else {
-    dasm_put(Dst, 5033);
+    dasm_put(Dst, 5036);
     }
       break;
     case 1:
-    dasm_put(Dst, 5037);
+    dasm_put(Dst, 5040);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 5039);
+    dasm_put(Dst, 5042);
     }
-    dasm_put(Dst, 5041);
-    if (LJ_DUALNUM) {
     dasm_put(Dst, 5044);
+    if (LJ_DUALNUM) {
+    dasm_put(Dst, 5047);
     } else {
-    dasm_put(Dst, 5050);
+    dasm_put(Dst, 5053);
     }
       break;
     default:
-    dasm_put(Dst, 5054);
+    dasm_put(Dst, 5057);
       break;
     }
-    dasm_put(Dst, 5064);
+    dasm_put(Dst, 5067);
     }
     break;
   case BC_MULVN: case BC_MULNV: case BC_MULVV:
@@ -8752,188 +8755,188 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5077);
+    dasm_put(Dst, 5080);
       break;
     case 1:
-    dasm_put(Dst, 5083);
+    dasm_put(Dst, 5086);
       break;
     default:
-    dasm_put(Dst, 5089);
+    dasm_put(Dst, 5092);
       break;
     }
-    dasm_put(Dst, 5095);
+    dasm_put(Dst, 5098);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5122);
+    dasm_put(Dst, 5125);
       break;
     case 1:
-    dasm_put(Dst, 5125);
+    dasm_put(Dst, 5128);
       break;
     default:
-    dasm_put(Dst, 5128);
+    dasm_put(Dst, 5131);
       break;
     }
-    dasm_put(Dst, 5131);
+    dasm_put(Dst, 5134);
     if (vk == 1) {
-    dasm_put(Dst, 5133);
+    dasm_put(Dst, 5136);
     } else {
-    dasm_put(Dst, 5137);
+    dasm_put(Dst, 5140);
     }
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5141);
+    dasm_put(Dst, 5144);
       break;
     case 1:
-    dasm_put(Dst, 5144);
+    dasm_put(Dst, 5147);
       break;
     default:
-    dasm_put(Dst, 5147);
+    dasm_put(Dst, 5150);
       break;
     }
-    dasm_put(Dst, 5150);
+    dasm_put(Dst, 5153);
     } else {
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5157);
+    dasm_put(Dst, 5160);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 5159);
+    dasm_put(Dst, 5162);
     }
-    dasm_put(Dst, 5161);
-    if (LJ_DUALNUM) {
     dasm_put(Dst, 5164);
+    if (LJ_DUALNUM) {
+    dasm_put(Dst, 5167);
     } else {
-    dasm_put(Dst, 5170);
+    dasm_put(Dst, 5173);
     }
       break;
     case 1:
-    dasm_put(Dst, 5174);
+    dasm_put(Dst, 5177);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 5176);
+    dasm_put(Dst, 5179);
     }
-    dasm_put(Dst, 5178);
-    if (LJ_DUALNUM) {
     dasm_put(Dst, 5181);
+    if (LJ_DUALNUM) {
+    dasm_put(Dst, 5184);
     } else {
-    dasm_put(Dst, 5187);
+    dasm_put(Dst, 5190);
     }
       break;
     default:
-    dasm_put(Dst, 5191);
+    dasm_put(Dst, 5194);
       break;
     }
-    dasm_put(Dst, 5201);
+    dasm_put(Dst, 5204);
     }
     break;
   case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5214);
+    dasm_put(Dst, 5217);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 5216);
+    dasm_put(Dst, 5219);
     }
-    dasm_put(Dst, 5218);
-    if (LJ_DUALNUM) {
     dasm_put(Dst, 5221);
+    if (LJ_DUALNUM) {
+    dasm_put(Dst, 5224);
     } else {
-    dasm_put(Dst, 5227);
+    dasm_put(Dst, 5230);
     }
       break;
     case 1:
-    dasm_put(Dst, 5231);
+    dasm_put(Dst, 5234);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 5233);
+    dasm_put(Dst, 5236);
     }
-    dasm_put(Dst, 5235);
-    if (LJ_DUALNUM) {
     dasm_put(Dst, 5238);
+    if (LJ_DUALNUM) {
+    dasm_put(Dst, 5241);
     } else {
-    dasm_put(Dst, 5244);
+    dasm_put(Dst, 5247);
     }
       break;
     default:
-    dasm_put(Dst, 5248);
+    dasm_put(Dst, 5251);
       break;
     }
-    dasm_put(Dst, 5258);
+    dasm_put(Dst, 5261);
     break;
   case BC_MODVN:
     if (LJ_DUALNUM) {
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5271);
+    dasm_put(Dst, 5274);
       break;
     case 1:
-    dasm_put(Dst, 5277);
+    dasm_put(Dst, 5280);
       break;
     default:
-    dasm_put(Dst, 5283);
+    dasm_put(Dst, 5286);
       break;
     }
-    dasm_put(Dst, 5289);
+    dasm_put(Dst, 5292);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5317);
+    dasm_put(Dst, 5320);
       break;
     case 1:
-    dasm_put(Dst, 5320);
+    dasm_put(Dst, 5323);
       break;
     default:
-    dasm_put(Dst, 5323);
+    dasm_put(Dst, 5326);
       break;
     }
-    dasm_put(Dst, 5326);
+    dasm_put(Dst, 5329);
     if (vk == 1) {
-    dasm_put(Dst, 5328);
+    dasm_put(Dst, 5331);
     } else {
-    dasm_put(Dst, 5332);
+    dasm_put(Dst, 5335);
     }
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5336);
+    dasm_put(Dst, 5339);
       break;
     case 1:
-    dasm_put(Dst, 5339);
+    dasm_put(Dst, 5342);
       break;
     default:
-    dasm_put(Dst, 5342);
+    dasm_put(Dst, 5345);
       break;
     }
-    dasm_put(Dst, 5345);
+    dasm_put(Dst, 5348);
     } else {
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5357);
+    dasm_put(Dst, 5360);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 5359);
+    dasm_put(Dst, 5362);
     }
-    dasm_put(Dst, 5361);
-    if (LJ_DUALNUM) {
     dasm_put(Dst, 5364);
+    if (LJ_DUALNUM) {
+    dasm_put(Dst, 5367);
     } else {
-    dasm_put(Dst, 5370);
+    dasm_put(Dst, 5373);
     }
       break;
     case 1:
-    dasm_put(Dst, 5374);
+    dasm_put(Dst, 5377);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 5376);
+    dasm_put(Dst, 5379);
     }
-    dasm_put(Dst, 5378);
-    if (LJ_DUALNUM) {
     dasm_put(Dst, 5381);
+    if (LJ_DUALNUM) {
+    dasm_put(Dst, 5384);
     } else {
-    dasm_put(Dst, 5387);
+    dasm_put(Dst, 5390);
     }
       break;
     default:
-    dasm_put(Dst, 5391);
+    dasm_put(Dst, 5394);
       break;
     }
-    dasm_put(Dst, 5401);
+    dasm_put(Dst, 5404);
     }
     break;
   case BC_MODNV: case BC_MODVV:
@@ -8941,298 +8944,298 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5419);
+    dasm_put(Dst, 5422);
       break;
     case 1:
-    dasm_put(Dst, 5425);
+    dasm_put(Dst, 5428);
       break;
     default:
-    dasm_put(Dst, 5431);
+    dasm_put(Dst, 5434);
       break;
     }
-    dasm_put(Dst, 5437);
+    dasm_put(Dst, 5440);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5465);
+    dasm_put(Dst, 5468);
       break;
     case 1:
-    dasm_put(Dst, 5468);
+    dasm_put(Dst, 5471);
       break;
     default:
-    dasm_put(Dst, 5471);
+    dasm_put(Dst, 5474);
       break;
     }
-    dasm_put(Dst, 5474);
+    dasm_put(Dst, 5477);
     if (vk == 1) {
-    dasm_put(Dst, 5476);
+    dasm_put(Dst, 5479);
     } else {
-    dasm_put(Dst, 5480);
+    dasm_put(Dst, 5483);
     }
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5484);
+    dasm_put(Dst, 5487);
       break;
     case 1:
-    dasm_put(Dst, 5487);
+    dasm_put(Dst, 5490);
       break;
     default:
-    dasm_put(Dst, 5490);
+    dasm_put(Dst, 5493);
       break;
     }
-    dasm_put(Dst, 5493);
+    dasm_put(Dst, 5496);
     } else {
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 5496);
+    dasm_put(Dst, 5499);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 5498);
+    dasm_put(Dst, 5501);
     }
-    dasm_put(Dst, 5500);
-    if (LJ_DUALNUM) {
     dasm_put(Dst, 5503);
+    if (LJ_DUALNUM) {
+    dasm_put(Dst, 5506);
     } else {
-    dasm_put(Dst, 5509);
+    dasm_put(Dst, 5512);
     }
       break;
     case 1:
-    dasm_put(Dst, 5513);
+    dasm_put(Dst, 5516);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 5515);
+    dasm_put(Dst, 5518);
     }
-    dasm_put(Dst, 5517);
-    if (LJ_DUALNUM) {
     dasm_put(Dst, 5520);
+    if (LJ_DUALNUM) {
+    dasm_put(Dst, 5523);
     } else {
-    dasm_put(Dst, 5526);
+    dasm_put(Dst, 5529);
     }
       break;
     default:
-    dasm_put(Dst, 5530);
+    dasm_put(Dst, 5533);
       break;
     }
-    dasm_put(Dst, 5540);
+    dasm_put(Dst, 5543);
     }
     break;
   case BC_POW:
-    dasm_put(Dst, 5543);
+    dasm_put(Dst, 5546);
     break;
 
   case BC_CAT:
-    dasm_put(Dst, 5566, Dt1(->base), 32-3, Dt1(->base));
+    dasm_put(Dst, 5569, Dt1(->base), 32-3, Dt1(->base));
     break;
 
   /* -- Constant ops ------------------------------------------------------ */
 
   case BC_KSTR:
-    dasm_put(Dst, 5596, 32-1, LJ_TSTR);
+    dasm_put(Dst, 5599, 32-1, LJ_TSTR);
     break;
   case BC_KCDATA:
 #if LJ_HASFFI
-    dasm_put(Dst, 5615, 32-1, LJ_TCDATA);
+    dasm_put(Dst, 5618, 32-1, LJ_TCDATA);
 #endif
     break;
   case BC_KSHORT:
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 5634, 31-13);
+      dasm_put(Dst, 5637, 31-13);
     } else {
-      dasm_put(Dst, 5650, 31-13, 31-20);
+      dasm_put(Dst, 5653, 31-13, 31-20);
     }
     break;
   case BC_KNUM:
-    dasm_put(Dst, 5678);
+    dasm_put(Dst, 5681);
     break;
   case BC_KPRI:
-    dasm_put(Dst, 5691, 32-3);
+    dasm_put(Dst, 5694, 32-3);
     break;
   case BC_KNIL:
-    dasm_put(Dst, 5706);
+    dasm_put(Dst, 5709);
     break;
 
   /* -- Upvalue and function ops ------------------------------------------ */
 
   case BC_UGET:
-    dasm_put(Dst, 5725, 32-1, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 5728, 32-1, offsetof(GCfuncL, uvptr), DtA(->v));
     break;
   case BC_USETV:
-    dasm_put(Dst, 5746, 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, 5749, 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;
   case BC_USETS:
-    dasm_put(Dst, 5799, 32-1, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, Dt5(->marked), DtA(->closed), LJ_TSTR, LJ_GC_WHITES, GG_DISP2G);
+    dasm_put(Dst, 5802, 32-1, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, Dt5(->marked), DtA(->closed), LJ_TSTR, LJ_GC_WHITES, GG_DISP2G);
     break;
   case BC_USETN:
-    dasm_put(Dst, 5850, 32-1, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 5853, 32-1, offsetof(GCfuncL, uvptr), DtA(->v));
     break;
   case BC_USETP:
-    dasm_put(Dst, 5871, 32-1, 32-3, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 5874, 32-1, 32-3, offsetof(GCfuncL, uvptr), DtA(->v));
     break;
 
   case BC_UCLO:
-    dasm_put(Dst, 5894, Dt1(->openupval), 32-1, -(BCBIAS_J*4 >> 16), Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 5897, Dt1(->openupval), 32-1, -(BCBIAS_J*4 >> 16), Dt1(->base), Dt1(->base));
     break;
 
   case BC_FNEW:
-    dasm_put(Dst, 5924, 32-1, Dt1(->base), Dt1(->base), LJ_TFUNC);
+    dasm_put(Dst, 5927, 32-1, Dt1(->base), Dt1(->base), LJ_TFUNC);
     break;
 
   /* -- Table ops --------------------------------------------------------- */
 
   case BC_TNEW:
   case BC_TDUP:
-    dasm_put(Dst, 5952, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base));
+    dasm_put(Dst, 5955, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base));
     if (op == BC_TNEW) {
-      dasm_put(Dst, 5965);
+      dasm_put(Dst, 5968);
     } else {
-      dasm_put(Dst, 5974, 32-1);
+      dasm_put(Dst, 5977, 32-1);
     }
-    dasm_put(Dst, 5981, Dt1(->base), LJ_TTAB);
+    dasm_put(Dst, 5984, Dt1(->base), LJ_TTAB);
     if (op == BC_TNEW) {
-      dasm_put(Dst, 5998);
+      dasm_put(Dst, 6001);
     }
-    dasm_put(Dst, 6003);
+    dasm_put(Dst, 6006);
     break;
 
   case BC_GGET:
   case BC_GSET:
-    dasm_put(Dst, 6012, 32-1, Dt7(->env));
+    dasm_put(Dst, 6015, 32-1, Dt7(->env));
     if (op == BC_GGET) {
-      dasm_put(Dst, 6020);
-    } else {
       dasm_put(Dst, 6023);
+    } else {
+      dasm_put(Dst, 6026);
     }
     break;
 
   case BC_TGETV:
-    dasm_put(Dst, 6026);
+    dasm_put(Dst, 6029);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 6030);
+      dasm_put(Dst, 6033);
     } else {
-      dasm_put(Dst, 6032);
+      dasm_put(Dst, 6035);
     }
-    dasm_put(Dst, 6034, LJ_TTAB);
+    dasm_put(Dst, 6037, LJ_TTAB);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 6040, Dt6(->asize), Dt6(->array), 31-3);
+      dasm_put(Dst, 6043, Dt6(->asize), Dt6(->array), 31-3);
     } else {
-      dasm_put(Dst, 6050, Dt6(->asize), Dt6(->array), 31-3);
+      dasm_put(Dst, 6053, Dt6(->asize), Dt6(->array), 31-3);
     }
-    dasm_put(Dst, 6067, LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<<MM_index, LJ_TSTR);
+    dasm_put(Dst, 6070, LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<<MM_index, LJ_TSTR);
     if (!LJ_DUALNUM) {
-      dasm_put(Dst, 6107);
+      dasm_put(Dst, 6110);
     }
-    dasm_put(Dst, 6109);
+    dasm_put(Dst, 6112);
     break;
   case BC_TGETS:
-    dasm_put(Dst, 6112, 32-1, LJ_TTAB, Dt6(->hmask), Dt5(->hash), Dt6(->node), 31-5, 31-3, DtB(->key), 4+offsetof(Node, key), DtB(->val), 4+offsetof(Node, val), LJ_TSTR, LJ_TNIL, DtB(->next));
-    dasm_put(Dst, 6173, LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 6115, 32-1, LJ_TTAB, Dt6(->hmask), Dt5(->hash), Dt6(->node), 31-5, 31-3, DtB(->key), 4+offsetof(Node, key), DtB(->val), 4+offsetof(Node, val), LJ_TSTR, LJ_TNIL, DtB(->next));
+    dasm_put(Dst, 6176, LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
     break;
   case BC_TGETB:
-    dasm_put(Dst, 6193, 32-3, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 6196, 32-3, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
     break;
 
   case BC_TSETV:
-    dasm_put(Dst, 6241);
+    dasm_put(Dst, 6244);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 6245);
+      dasm_put(Dst, 6248);
     } else {
-      dasm_put(Dst, 6247);
+      dasm_put(Dst, 6250);
     }
-    dasm_put(Dst, 6249, LJ_TTAB);
+    dasm_put(Dst, 6252, LJ_TTAB);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 6255, Dt6(->asize), Dt6(->array), 31-3);
+      dasm_put(Dst, 6258, Dt6(->asize), Dt6(->array), 31-3);
     } else {
-      dasm_put(Dst, 6265, Dt6(->asize), Dt6(->array), 31-3);
+      dasm_put(Dst, 6268, Dt6(->asize), Dt6(->array), 31-3);
     }
-    dasm_put(Dst, 6282, Dt6(->marked), LJ_TNIL, LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, LJ_TSTR);
+    dasm_put(Dst, 6285, Dt6(->marked), LJ_TNIL, LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, LJ_TSTR);
     if (!LJ_DUALNUM) {
-      dasm_put(Dst, 6329);
+      dasm_put(Dst, 6332);
     }
-    dasm_put(Dst, 6331, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
+    dasm_put(Dst, 6334, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
     break;
-    dasm_put(Dst, 6346, LJ_TSTR, LJ_TNIL);
+    dasm_put(Dst, 6349, LJ_TSTR, LJ_TNIL);
   case BC_TSETS:
-    dasm_put(Dst, 6372, 32-1, LJ_TTAB, Dt6(->hmask), Dt5(->hash), Dt6(->node), Dt6(->nomm), 31-5, 31-3, Dt6(->marked), DtB(->key), 4+offsetof(Node, key), DtB(->val), 4+offsetof(Node, val), LJ_TSTR, LJ_TNIL);
-    dasm_put(Dst, 6423, LJ_GC_BLACK, DtB(->val), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DtB(->next), Dt6(->metatable), DISPATCH_GL(tmptv), Dt1(->base), Dt6(->nomm), 1<<MM_newindex);
-    dasm_put(Dst, 6479, LJ_TSTR, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
+    dasm_put(Dst, 6375, 32-1, LJ_TTAB, Dt6(->hmask), Dt5(->hash), Dt6(->node), Dt6(->nomm), 31-5, 31-3, Dt6(->marked), DtB(->key), 4+offsetof(Node, key), DtB(->val), 4+offsetof(Node, val), LJ_TSTR, LJ_TNIL);
+    dasm_put(Dst, 6426, LJ_GC_BLACK, DtB(->val), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DtB(->next), Dt6(->metatable), DISPATCH_GL(tmptv), Dt1(->base), Dt6(->nomm), 1<<MM_newindex);
+    dasm_put(Dst, 6482, LJ_TSTR, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
     break;
   case BC_TSETB:
-    dasm_put(Dst, 6504, 32-3, LJ_TTAB, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_TNIL, LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain));
-    dasm_put(Dst, 6562, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
+    dasm_put(Dst, 6507, 32-3, LJ_TTAB, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_TNIL, LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain));
+    dasm_put(Dst, 6565, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
     break;
 
   case BC_TSETM:
-    dasm_put(Dst, 6572, 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, 6641);
+    dasm_put(Dst, 6575, 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, 6644);
     break;
 
   /* -- Calls and vararg handling ----------------------------------------- */
 
   case BC_CALLM:
-    dasm_put(Dst, 6644);
+    dasm_put(Dst, 6647);
     break;
   case BC_CALL:
-    dasm_put(Dst, 6646, LJ_TFUNC, Dt7(->pc));
+    dasm_put(Dst, 6649, LJ_TFUNC, Dt7(->pc));
     break;
 
   case BC_CALLMT:
-    dasm_put(Dst, 6667);
+    dasm_put(Dst, 6670);
     break;
   case BC_CALLT:
-    dasm_put(Dst, 6669, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), FRAME_VARG, Dt7(->pc), -4-8, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP);
-    dasm_put(Dst, 6733, FRAME_TYPE);
+    dasm_put(Dst, 6672, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), FRAME_VARG, Dt7(->pc), -4-8, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP);
+    dasm_put(Dst, 6736, FRAME_TYPE);
     break;
 
   case BC_ITERC:
-    dasm_put(Dst, 6742, LJ_TFUNC, Dt7(->pc));
+    dasm_put(Dst, 6745, LJ_TFUNC, Dt7(->pc));
     break;
 
   case BC_ITERN:
 #if LJ_HASJIT
 #endif
-    dasm_put(Dst, 6769, Dt6(->asize), Dt6(->array), 31-3, LJ_TNIL);
+    dasm_put(Dst, 6772, Dt6(->asize), Dt6(->array), 31-3, LJ_TNIL);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 6791);
-    } else {
       dasm_put(Dst, 6794);
+    } else {
+      dasm_put(Dst, 6797);
     }
-    dasm_put(Dst, 6798, -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 6801, -(BCBIAS_J*4 >> 16));
     if (!LJ_DUALNUM) {
-      dasm_put(Dst, 6806);
+      dasm_put(Dst, 6809);
     }
-    dasm_put(Dst, 6808, Dt6(->hmask), Dt6(->node), 31-5, 31-3, LJ_TNIL, DtB(->key), -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 6811, Dt6(->hmask), Dt6(->node), 31-5, 31-3, LJ_TNIL, DtB(->key), -(BCBIAS_J*4 >> 16));
     break;
 
   case BC_ISNEXT:
-    dasm_put(Dst, 6864, 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, 6867, 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;
 
   case BC_VARG:
-    dasm_put(Dst, 6914, FRAME_VARG, Dt1(->maxstack), Dt1(->top), Dt1(->base), 32-3, Dt1(->base));
-    dasm_put(Dst, 6994);
+    dasm_put(Dst, 6917, FRAME_VARG, Dt1(->maxstack), Dt1(->top), Dt1(->base), 32-3, Dt1(->base));
+    dasm_put(Dst, 6997);
     break;
 
   /* -- Returns ----------------------------------------------------------- */
 
   case BC_RETM:
-    dasm_put(Dst, 7000);
+    dasm_put(Dst, 7003);
     break;
 
   case BC_RET:
-    dasm_put(Dst, 7002, FRAME_TYPE, FRAME_VARG, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP);
+    dasm_put(Dst, 7005, FRAME_TYPE, FRAME_VARG, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP);
     break;
 
   case BC_RET0: case BC_RET1:
-    dasm_put(Dst, 7072, FRAME_TYPE, FRAME_VARG);
+    dasm_put(Dst, 7075, FRAME_TYPE, FRAME_VARG);
     if (op == BC_RET1) {
-      dasm_put(Dst, 7085);
+      dasm_put(Dst, 7088);
     }
-    dasm_put(Dst, 7088, Dt7(->pc), PC2PROTO(k));
+    dasm_put(Dst, 7091, Dt7(->pc), PC2PROTO(k));
     break;
 
   /* -- Loops and branches ------------------------------------------------ */
 
   case BC_FORL:
 #if LJ_HASJIT
-    dasm_put(Dst, 7116, GG_DISP2HOT, -HOTCOUNT_LOOP);
+    dasm_put(Dst, 7119, GG_DISP2HOT, -HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -9245,100 +9248,100 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
   case BC_IFORL:
     vk = (op == BC_IFORL || op == BC_JFORL);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 7126, FORL_IDX*8+4);
+      dasm_put(Dst, 7129, FORL_IDX*8+4);
       if (vk) {
-       dasm_put(Dst, 7131, FORL_STEP*8+4, FORL_STOP*8+4, FORL_IDX*8+4);
+       dasm_put(Dst, 7134, FORL_STEP*8+4, FORL_STOP*8+4, FORL_IDX*8+4);
       } else {
-       dasm_put(Dst, 7145, FORL_STEP*8, FORL_STEP*8+4, FORL_STOP*8, FORL_STOP*8+4);
+       dasm_put(Dst, 7148, FORL_STEP*8, FORL_STEP*8+4, FORL_STOP*8, FORL_STOP*8+4);
       }
-      dasm_put(Dst, 7161, FORL_EXT*8);
+      dasm_put(Dst, 7164, FORL_EXT*8);
       if (op != BC_JFORL) {
-       dasm_put(Dst, 7168, 32-1);
+       dasm_put(Dst, 7171, 32-1);
       }
-      dasm_put(Dst, 7171, FORL_EXT*8+4);
+      dasm_put(Dst, 7174, FORL_EXT*8+4);
       if (op != BC_JFORL) {
-       dasm_put(Dst, 7174);
+       dasm_put(Dst, 7177);
       }
       if (op == BC_FORI) {
-       dasm_put(Dst, 7176);
+       dasm_put(Dst, 7179);
       } else if (op == BC_JFORI) {
-       dasm_put(Dst, 7179, -(BCBIAS_J*4 >> 16));
+       dasm_put(Dst, 7182, -(BCBIAS_J*4 >> 16));
       } else if (op == BC_IFORL) {
-       dasm_put(Dst, 7184, -(BCBIAS_J*4 >> 16));
+       dasm_put(Dst, 7187, -(BCBIAS_J*4 >> 16));
       } else {
-       dasm_put(Dst, 7189, BC_JLOOP);
+       dasm_put(Dst, 7192, BC_JLOOP);
       }
-      dasm_put(Dst, 7192);
+      dasm_put(Dst, 7195);
       if (vk) {
-       dasm_put(Dst, 7208);
+       dasm_put(Dst, 7211);
       }
     }
     if (vk) {
       if (LJ_DUALNUM) {
-       dasm_put(Dst, 7215, FORL_IDX*8);
+       dasm_put(Dst, 7218, FORL_IDX*8);
       } else {
-       dasm_put(Dst, 7219);
+       dasm_put(Dst, 7222);
       }
-      dasm_put(Dst, 7221, FORL_STEP*8, FORL_STOP*8, FORL_STEP*8, FORL_IDX*8);
+      dasm_put(Dst, 7224, FORL_STEP*8, FORL_STOP*8, FORL_STEP*8, FORL_IDX*8);
     } else {
       if (LJ_DUALNUM) {
-       dasm_put(Dst, 7231);
+       dasm_put(Dst, 7234);
       } else {
-       dasm_put(Dst, 7233, FORL_STEP*8, FORL_STOP*8);
+       dasm_put(Dst, 7236, FORL_STEP*8, FORL_STOP*8);
       }
-      dasm_put(Dst, 7242, FORL_IDX*8, FORL_STEP*8, FORL_STOP*8);
+      dasm_put(Dst, 7245, FORL_IDX*8, FORL_STEP*8, FORL_STOP*8);
     }
-    dasm_put(Dst, 7253);
+    dasm_put(Dst, 7256);
     if (op != BC_JFORL) {
-      dasm_put(Dst, 7255, 32-1);
+      dasm_put(Dst, 7258, 32-1);
     }
-    dasm_put(Dst, 7258, FORL_EXT*8);
+    dasm_put(Dst, 7261, FORL_EXT*8);
     if (op != BC_JFORL) {
-      dasm_put(Dst, 7261);
+      dasm_put(Dst, 7264);
     }
-    dasm_put(Dst, 7263);
+    dasm_put(Dst, 7266);
     if (op == BC_JFORI) {
-      dasm_put(Dst, 7265, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 7268, -(BCBIAS_J*4 >> 16));
     }
-    dasm_put(Dst, 7268);
+    dasm_put(Dst, 7271);
     if (op == BC_FORI) {
-      dasm_put(Dst, 7271);
+      dasm_put(Dst, 7274);
     } else if (op == BC_IFORL) {
       if (LJ_DUALNUM) {
-       dasm_put(Dst, 7274);
-      } else {
        dasm_put(Dst, 7277);
+      } else {
+       dasm_put(Dst, 7280);
       }
-      dasm_put(Dst, 7280, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 7283, -(BCBIAS_J*4 >> 16));
     } else if (op == BC_JFORI) {
-      dasm_put(Dst, 7284);
+      dasm_put(Dst, 7287);
     } else {
-      dasm_put(Dst, 7287, BC_JLOOP);
+      dasm_put(Dst, 7290, BC_JLOOP);
     }
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 7290);
-    } else {
       dasm_put(Dst, 7293);
+    } else {
+      dasm_put(Dst, 7296);
     }
-    dasm_put(Dst, 7305);
+    dasm_put(Dst, 7308);
     if (op == BC_FORI) {
-      dasm_put(Dst, 7307, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 7310, -(BCBIAS_J*4 >> 16));
     } else if (op == BC_IFORL) {
-      dasm_put(Dst, 7313);
-    } else if (op == BC_JFORI) {
       dasm_put(Dst, 7316);
+    } else if (op == BC_JFORI) {
+      dasm_put(Dst, 7319);
     } else {
-      dasm_put(Dst, 7319, BC_JLOOP);
+      dasm_put(Dst, 7322, BC_JLOOP);
     }
-    dasm_put(Dst, 7322);
+    dasm_put(Dst, 7325);
     if (op == BC_JFORI) {
-      dasm_put(Dst, 7325, BC_JLOOP);
+      dasm_put(Dst, 7328, BC_JLOOP);
     }
     break;
 
   case BC_ITERL:
 #if LJ_HASJIT
-    dasm_put(Dst, 7331, GG_DISP2HOT, -HOTCOUNT_LOOP);
+    dasm_put(Dst, 7334, GG_DISP2HOT, -HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -9347,40 +9350,40 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     break;
 #endif
   case BC_IITERL:
-    dasm_put(Dst, 7341, LJ_TNIL);
+    dasm_put(Dst, 7344, LJ_TNIL);
     if (op == BC_JITERL) {
-      dasm_put(Dst, 7348, BC_JLOOP);
+      dasm_put(Dst, 7351, BC_JLOOP);
     } else {
-      dasm_put(Dst, 7353, 32-1, -(BCBIAS_J*4 >> 16));
+      dasm_put(Dst, 7356, 32-1, -(BCBIAS_J*4 >> 16));
     }
-    dasm_put(Dst, 7361);
+    dasm_put(Dst, 7364);
     break;
 
   case BC_LOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 7373, GG_DISP2HOT, -HOTCOUNT_LOOP);
+    dasm_put(Dst, 7376, GG_DISP2HOT, -HOTCOUNT_LOOP);
 #endif
     break;
 
   case BC_ILOOP:
-    dasm_put(Dst, 7383);
+    dasm_put(Dst, 7386);
     break;
 
   case BC_JLOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 7394, DISPATCH_J(trace), 32-1, DISPATCH_GL(vmstate), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L), GG_DISP2G+32768);
+    dasm_put(Dst, 7397, DISPATCH_J(trace), 32-1, DISPATCH_GL(vmstate), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L), GG_DISP2G+32768);
 #endif
     break;
 
   case BC_JMP:
-    dasm_put(Dst, 7413, 32-1, -(BCBIAS_J*4 >> 16));
+    dasm_put(Dst, 7416, 32-1, -(BCBIAS_J*4 >> 16));
     break;
 
   /* -- Function headers -------------------------------------------------- */
 
   case BC_FUNCF:
 #if LJ_HASJIT
-    dasm_put(Dst, 7429, GG_DISP2HOT, -HOTCOUNT_CALL);
+    dasm_put(Dst, 7432, GG_DISP2HOT, -HOTCOUNT_CALL);
 #endif
   case BC_FUNCV:  /* NYI: compiled vararg functions. */
     break;
@@ -9390,42 +9393,42 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     break;
 #endif
   case BC_IFUNCF:
-    dasm_put(Dst, 7439, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k), 31-3);
+    dasm_put(Dst, 7442, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k), 31-3);
     if (op != BC_JFUNCF) {
-      dasm_put(Dst, 7451);
+      dasm_put(Dst, 7454);
     }
-    dasm_put(Dst, 7454);
+    dasm_put(Dst, 7457);
     if (op == BC_JFUNCF) {
-      dasm_put(Dst, 7459, BC_JLOOP);
+      dasm_put(Dst, 7462, BC_JLOOP);
     } else {
-      dasm_put(Dst, 7463);
+      dasm_put(Dst, 7466);
     }
-    dasm_put(Dst, 7472);
+    dasm_put(Dst, 7475);
     break;
 
   case BC_JFUNCV:
 #if !LJ_HASJIT
     break;
 #endif
-    dasm_put(Dst, 7478);
+    dasm_put(Dst, 7481);
     break;  /* NYI: compiled vararg functions. */
 
   case BC_IFUNCV:
-    dasm_put(Dst, 7480, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams), LJ_TNIL);
+    dasm_put(Dst, 7483, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams), LJ_TNIL);
     break;
 
   case BC_FUNCC:
   case BC_FUNCCW:
     if (op == BC_FUNCC) {
-      dasm_put(Dst, 7533, Dt8(->f));
+      dasm_put(Dst, 7536, Dt8(->f));
     } else {
-      dasm_put(Dst, 7536, DISPATCH_GL(wrapf));
+      dasm_put(Dst, 7539, DISPATCH_GL(wrapf));
     }
-    dasm_put(Dst, 7539, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C);
+    dasm_put(Dst, 7542, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C);
     if (op == BC_FUNCCW) {
-      dasm_put(Dst, 7552, Dt8(->f));
+      dasm_put(Dst, 7555, Dt8(->f));
     }
-    dasm_put(Dst, 7555, DISPATCH_GL(vmstate), Dt1(->base), 31-3, Dt1(->top), ~LJ_VMST_INTERP, DISPATCH_GL(vmstate));
+    dasm_put(Dst, 7558, DISPATCH_GL(vmstate), Dt1(->base), 31-3, Dt1(->top), ~LJ_VMST_INTERP, DISPATCH_GL(vmstate));
     break;
 
   /* ---------------------------------------------------------------------- */
@@ -9445,7 +9448,7 @@ static int build_backend(BuildCtx *ctx)
 
   build_subroutines(ctx);
 
-  dasm_put(Dst, 7576);
+  dasm_put(Dst, 7579);
   for (op = 0; op < BC__MAX; op++)
     build_ins(ctx, (BCOp)op, op);
 
@@ -9455,6 +9458,7 @@ static int build_backend(BuildCtx *ctx)
 /* Emit pseudo frame-info for all assembler functions. */
 static void emit_asm_debug(BuildCtx *ctx)
 {
+  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);
   int i;
   switch (ctx->mode) {
   case BUILD_elfasm:
@@ -9482,7 +9486,7 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.byte 0xe\n\t.uleb128 %d\n"
        "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"
        "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n",
-       (int)ctx->codesz, CFRAME_SIZE);
+       fcofs, CFRAME_SIZE);
     for (i = 14; i <= 31; i++)
       fprintf(ctx->fp,
        "\t.byte %d\n\t.uleb128 %d\n"
@@ -9491,6 +9495,20 @@ static void emit_asm_debug(BuildCtx *ctx)
     fprintf(ctx->fp,
        "\t.align 2\n"
        ".LEFDE0:\n\n");
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".LSFDE1:\n"
+       "\t.long .LEFDE1-.LASFDE1\n"
+       ".LASFDE1:\n"
+       "\t.long .Lframe0\n"
+       "\t.long lj_vm_ffi_call\n"
+       "\t.long %d\n"
+       "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"
+       "\t.byte 0x8e\n\t.uleb128 2\n"
+       "\t.byte 0xd\n\t.uleb128 0xe\n"
+       "\t.align 2\n"
+       ".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
+#endif
     fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");
     fprintf(ctx->fp,
        ".Lframe1:\n"
@@ -9510,17 +9528,17 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.align 2\n"
        ".LECIE1:\n\n");
     fprintf(ctx->fp,
-       ".LSFDE1:\n"
-       "\t.long .LEFDE1-.LASFDE1\n"
-       ".LASFDE1:\n"
-       "\t.long .LASFDE1-.Lframe1\n"
+       ".LSFDE2:\n"
+       "\t.long .LEFDE2-.LASFDE2\n"
+       ".LASFDE2:\n"
+       "\t.long .LASFDE2-.Lframe1\n"
        "\t.long .Lbegin-.\n"
        "\t.long %d\n"
        "\t.uleb128 0\n"                        /* augmentation length */
        "\t.byte 0xe\n\t.uleb128 %d\n"
        "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"
        "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n",
-       (int)ctx->codesz, CFRAME_SIZE);
+       fcofs, CFRAME_SIZE);
     for (i = 14; i <= 31; i++)
       fprintf(ctx->fp,
        "\t.byte %d\n\t.uleb128 %d\n"
@@ -9528,7 +9546,37 @@ static void emit_asm_debug(BuildCtx *ctx)
        0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i));
     fprintf(ctx->fp,
        "\t.align 2\n"
-       ".LEFDE1:\n\n");
+       ".LEFDE2:\n\n");
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".Lframe2:\n"
+       "\t.long .LECIE2-.LSCIE2\n"
+       ".LSCIE2:\n"
+       "\t.long 0\n"
+       "\t.byte 0x1\n"
+       "\t.string \"zR\"\n"
+       "\t.uleb128 0x1\n"
+       "\t.sleb128 -4\n"
+       "\t.byte 65\n"
+       "\t.uleb128 1\n"                        /* augmentation length */
+       "\t.byte 0x1b\n"                        /* pcrel|sdata4 */
+       "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"
+       "\t.align 2\n"
+       ".LECIE2:\n\n");
+    fprintf(ctx->fp,
+       ".LSFDE3:\n"
+       "\t.long .LEFDE3-.LASFDE3\n"
+       ".LASFDE3:\n"
+       "\t.long .LASFDE3-.Lframe2\n"
+       "\t.long lj_vm_ffi_call-.\n"
+       "\t.long %d\n"
+       "\t.uleb128 0\n"                        /* augmentation length */
+       "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"
+       "\t.byte 0x8e\n\t.uleb128 2\n"
+       "\t.byte 0xd\n\t.uleb128 0xe\n"
+       "\t.align 2\n"
+       ".LEFDE3:\n\n", (int)ctx->codesz - fcofs);
+#endif
     break;
   default:
     break;
index bd4ab408a06db2acb0dcb385ab2eccfd9dbbd594..06d6b0383d292a752927afeab0dd06500ab7a45f 100644 (file)
@@ -12,7 +12,7 @@
 #define DASM_SECTION_CODE_OP   0
 #define DASM_SECTION_CODE_SUB  1
 #define DASM_MAXSECTION                2
-static const unsigned char build_actionlist[16164] = {
+static const unsigned char build_actionlist[16165] = {
   254,1,248,10,252,247,195,237,15,132,244,11,131,227,252,248,41,218,72,141,
   76,25,252,248,139,90,252,252,199,68,10,4,237,248,12,131,192,1,137,68,36,4,
   252,247,195,237,15,132,244,13,248,14,129,252,243,239,252,247,195,237,15,133,
@@ -489,75 +489,75 @@ static const unsigned char build_actionlist[16164] = {
   223,224,252,246,196,1,15,132,244,248,217,201,248,2,221,216,195,248,1,221,
   225,223,224,252,246,196,1,15,133,244,248,217,201,248,2,221,216,195,255,248,
   163,137,252,248,83,15,162,137,6,137,94,4,137,78,8,137,86,12,91,195,248,164,
-  255,85,72,137,229,83,72,137,252,251,139,131,233,72,41,196,255,15,182,139,
-  233,131,252,233,1,15,136,244,248,248,1,72,139,132,253,203,233,72,137,132,
-  253,204,233,131,252,233,1,15,137,244,1,248,2,15,182,131,233,72,139,187,233,
-  72,139,179,233,72,139,147,233,72,139,139,233,76,139,131,233,76,139,139,233,
-  133,192,15,132,244,251,15,40,131,233,15,40,139,233,255,15,40,147,233,15,40,
-  155,233,131,252,248,4,15,134,244,251,15,40,163,233,15,40,171,233,15,40,179,
-  233,15,40,187,233,248,5,252,255,147,233,72,137,131,233,15,41,131,233,72,137,
-  147,233,15,41,139,233,255,72,139,93,252,248,201,195,255,248,165,255,249,255,
-  129,124,253,202,4,239,15,133,244,253,129,124,253,194,4,239,15,133,244,254,
-  139,44,202,131,195,4,59,44,194,255,15,141,244,255,255,15,140,244,255,255,
-  15,143,244,255,255,15,142,244,255,255,248,6,15,183,67,252,254,141,156,253,
-  131,233,248,9,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,
-  36,252,238,248,7,15,135,244,43,129,124,253,194,4,239,15,130,244,247,15,133,
-  244,43,255,252,242,15,42,4,194,252,233,244,248,255,221,4,202,219,4,194,252,
-  233,244,249,255,248,8,15,135,244,43,255,252,242,15,42,12,202,252,242,15,16,
-  4,194,131,195,4,102,15,46,193,255,15,134,244,9,255,15,135,244,9,255,15,130,
-  244,9,255,15,131,244,9,255,252,233,244,6,255,219,4,202,252,233,244,248,255,
-  129,124,253,202,4,239,15,131,244,43,129,124,253,194,4,239,15,131,244,43,255,
-  248,1,252,242,15,16,4,194,248,2,131,195,4,102,15,46,4,202,248,3,255,248,1,
-  221,4,202,248,2,221,4,194,248,3,131,195,4,255,223,252,233,221,216,255,218,
-  252,233,223,224,158,255,15,134,244,247,255,15,135,244,247,255,15,130,244,
-  247,255,15,131,244,247,255,15,183,67,252,254,141,156,253,131,233,248,1,139,
-  3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,139,
-  108,194,4,131,195,4,255,129,252,253,239,15,133,244,253,129,124,253,202,4,
-  239,15,133,244,254,139,44,194,59,44,202,255,15,133,244,255,255,15,132,244,
-  255,255,15,183,67,252,254,141,156,253,131,233,248,9,139,3,15,182,204,15,182,
-  232,131,195,4,193,232,16,65,252,255,36,252,238,248,7,15,135,244,251,129,124,
-  253,202,4,239,15,130,244,247,15,133,244,251,255,252,242,15,42,4,202,255,219,
-  4,202,255,252,233,244,248,248,8,15,135,244,251,255,252,242,15,42,4,194,102,
-  15,46,4,202,255,219,4,194,221,4,202,255,252,233,244,250,255,129,252,253,239,
-  15,131,244,251,129,124,253,202,4,239,15,131,244,251,255,248,1,252,242,15,
-  16,4,202,248,2,102,15,46,4,194,248,4,255,248,1,221,4,202,248,2,221,4,194,
-  248,4,255,15,138,244,248,15,133,244,248,255,15,138,244,248,15,132,244,247,
-  255,248,1,15,183,67,252,254,141,156,253,131,233,248,2,255,248,2,15,183,67,
-  252,254,141,156,253,131,233,248,1,255,252,233,244,9,255,248,5,255,129,252,
-  253,239,15,132,244,48,129,124,253,202,4,239,15,132,244,48,255,57,108,202,
-  4,15,133,244,2,129,252,253,239,15,131,244,1,139,12,202,139,4,194,57,193,15,
-  132,244,1,129,252,253,239,15,135,244,2,129,252,253,239,15,130,244,2,139,169,
-  233,133,252,237,15,132,244,2,252,246,133,233,235,15,133,244,2,255,49,252,
-  237,255,189,1,0,0,0,255,252,233,244,47,255,248,3,129,252,253,239,255,15,133,
-  244,9,255,252,233,244,48,255,72,252,247,208,139,108,202,4,131,195,4,129,252,
-  253,239,15,133,244,249,139,12,202,65,59,12,135,255,139,108,202,4,131,195,
-  4,255,129,252,253,239,15,133,244,253,65,129,124,253,199,4,239,15,133,244,
-  254,65,139,44,199,59,44,202,255,15,183,67,252,254,141,156,253,131,233,248,
-  9,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,
-  248,7,15,135,244,249,65,129,124,253,199,4,239,15,130,244,247,255,252,242,
-  65,15,42,4,199,255,65,219,4,199,255,252,233,244,248,248,8,255,252,242,15,
-  42,4,202,102,65,15,46,4,199,255,219,4,202,65,221,4,199,255,129,252,253,239,
-  15,131,244,249,255,248,1,252,242,65,15,16,4,199,248,2,102,15,46,4,202,248,
-  4,255,248,1,65,221,4,199,248,2,221,4,202,248,4,255,72,252,247,208,139,108,
-  202,4,131,195,4,57,197,255,15,133,244,249,15,183,67,252,254,141,156,253,131,
-  233,248,2,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,
-  252,238,248,3,129,252,253,239,15,133,244,2,252,233,244,48,255,15,132,244,
-  248,129,252,253,239,15,132,244,48,15,183,67,252,254,141,156,253,131,233,248,
-  2,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,
-  255,139,108,194,4,131,195,4,129,252,253,239,255,137,108,202,4,139,44,194,
-  137,44,202,255,72,139,44,194,72,137,44,202,139,3,15,182,204,15,182,232,131,
-  195,4,193,232,16,65,252,255,36,252,238,255,49,252,237,129,124,253,194,4,239,
-  129,213,239,137,108,202,4,139,3,15,182,204,15,182,232,131,195,4,193,232,16,
-  65,252,255,36,252,238,255,129,124,253,194,4,239,15,133,244,251,139,44,194,
-  252,247,221,15,128,244,250,199,68,202,4,237,137,44,202,248,9,139,3,15,182,
-  204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,4,199,68,202,
-  4,0,0,224,65,199,4,202,0,0,0,0,252,233,244,9,248,5,15,135,244,53,255,129,
-  124,253,194,4,239,15,131,244,53,255,252,242,15,16,4,194,72,184,237,237,102,
-  72,15,110,200,15,87,193,252,242,15,17,4,202,255,221,4,194,217,224,221,28,
-  202,255,129,124,253,194,4,239,15,133,244,248,139,4,194,255,139,128,233,248,
-  1,199,68,202,4,237,137,4,202,255,15,87,192,252,242,15,42,128,233,248,1,252,
-  242,15,17,4,202,255,219,128,233,248,1,221,28,202,255,139,3,15,182,204,15,
-  182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,2,129,124,253,194,
+  255,204,248,165,255,85,72,137,229,83,72,137,252,251,139,131,233,72,41,196,
+  255,15,182,139,233,131,252,233,1,15,136,244,248,248,1,72,139,132,253,203,
+  233,72,137,132,253,204,233,131,252,233,1,15,137,244,1,248,2,15,182,131,233,
+  72,139,187,233,72,139,179,233,72,139,147,233,72,139,139,233,76,139,131,233,
+  76,139,139,233,133,192,15,132,244,251,15,40,131,233,15,40,139,233,255,15,
+  40,147,233,15,40,155,233,131,252,248,4,15,134,244,251,15,40,163,233,15,40,
+  171,233,15,40,179,233,15,40,187,233,248,5,252,255,147,233,72,137,131,233,
+  15,41,131,233,72,137,147,233,15,41,139,233,255,72,139,93,252,248,201,195,
+  255,249,255,129,124,253,202,4,239,15,133,244,253,129,124,253,194,4,239,15,
+  133,244,254,139,44,202,131,195,4,59,44,194,255,15,141,244,255,255,15,140,
+  244,255,255,15,143,244,255,255,15,142,244,255,255,248,6,15,183,67,252,254,
+  141,156,253,131,233,248,9,139,3,15,182,204,15,182,232,131,195,4,193,232,16,
+  65,252,255,36,252,238,248,7,15,135,244,43,129,124,253,194,4,239,15,130,244,
+  247,15,133,244,43,255,252,242,15,42,4,194,252,233,244,248,255,221,4,202,219,
+  4,194,252,233,244,249,255,248,8,15,135,244,43,255,252,242,15,42,12,202,252,
+  242,15,16,4,194,131,195,4,102,15,46,193,255,15,134,244,9,255,15,135,244,9,
+  255,15,130,244,9,255,15,131,244,9,255,252,233,244,6,255,219,4,202,252,233,
+  244,248,255,129,124,253,202,4,239,15,131,244,43,129,124,253,194,4,239,15,
+  131,244,43,255,248,1,252,242,15,16,4,194,248,2,131,195,4,102,15,46,4,202,
+  248,3,255,248,1,221,4,202,248,2,221,4,194,248,3,131,195,4,255,223,252,233,
+  221,216,255,218,252,233,223,224,158,255,15,134,244,247,255,15,135,244,247,
+  255,15,130,244,247,255,15,131,244,247,255,15,183,67,252,254,141,156,253,131,
+  233,248,1,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,
+  252,238,255,139,108,194,4,131,195,4,255,129,252,253,239,15,133,244,253,129,
+  124,253,202,4,239,15,133,244,254,139,44,194,59,44,202,255,15,133,244,255,
+  255,15,132,244,255,255,15,183,67,252,254,141,156,253,131,233,248,9,139,3,
+  15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,7,15,
+  135,244,251,129,124,253,202,4,239,15,130,244,247,15,133,244,251,255,252,242,
+  15,42,4,202,255,219,4,202,255,252,233,244,248,248,8,15,135,244,251,255,252,
+  242,15,42,4,194,102,15,46,4,202,255,219,4,194,221,4,202,255,252,233,244,250,
+  255,129,252,253,239,15,131,244,251,129,124,253,202,4,239,15,131,244,251,255,
+  248,1,252,242,15,16,4,202,248,2,102,15,46,4,194,248,4,255,248,1,221,4,202,
+  248,2,221,4,194,248,4,255,15,138,244,248,15,133,244,248,255,15,138,244,248,
+  15,132,244,247,255,248,1,15,183,67,252,254,141,156,253,131,233,248,2,255,
+  248,2,15,183,67,252,254,141,156,253,131,233,248,1,255,252,233,244,9,255,248,
+  5,255,129,252,253,239,15,132,244,48,129,124,253,202,4,239,15,132,244,48,255,
+  57,108,202,4,15,133,244,2,129,252,253,239,15,131,244,1,139,12,202,139,4,194,
+  57,193,15,132,244,1,129,252,253,239,15,135,244,2,129,252,253,239,15,130,244,
+  2,139,169,233,133,252,237,15,132,244,2,252,246,133,233,235,15,133,244,2,255,
+  49,252,237,255,189,1,0,0,0,255,252,233,244,47,255,248,3,129,252,253,239,255,
+  15,133,244,9,255,252,233,244,48,255,72,252,247,208,139,108,202,4,131,195,
+  4,129,252,253,239,15,133,244,249,139,12,202,65,59,12,135,255,139,108,202,
+  4,131,195,4,255,129,252,253,239,15,133,244,253,65,129,124,253,199,4,239,15,
+  133,244,254,65,139,44,199,59,44,202,255,15,183,67,252,254,141,156,253,131,
+  233,248,9,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,
+  252,238,248,7,15,135,244,249,65,129,124,253,199,4,239,15,130,244,247,255,
+  252,242,65,15,42,4,199,255,65,219,4,199,255,252,233,244,248,248,8,255,252,
+  242,15,42,4,202,102,65,15,46,4,199,255,219,4,202,65,221,4,199,255,129,252,
+  253,239,15,131,244,249,255,248,1,252,242,65,15,16,4,199,248,2,102,15,46,4,
+  202,248,4,255,248,1,65,221,4,199,248,2,221,4,202,248,4,255,72,252,247,208,
+  139,108,202,4,131,195,4,57,197,255,15,133,244,249,15,183,67,252,254,141,156,
+  253,131,233,248,2,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,
+  255,36,252,238,248,3,129,252,253,239,15,133,244,2,252,233,244,48,255,15,132,
+  244,248,129,252,253,239,15,132,244,48,15,183,67,252,254,141,156,253,131,233,
+  248,2,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,
+  238,255,139,108,194,4,131,195,4,129,252,253,239,255,137,108,202,4,139,44,
+  194,137,44,202,255,72,139,44,194,72,137,44,202,139,3,15,182,204,15,182,232,
+  131,195,4,193,232,16,65,252,255,36,252,238,255,49,252,237,129,124,253,194,
+  4,239,129,213,239,137,108,202,4,139,3,15,182,204,15,182,232,131,195,4,193,
+  232,16,65,252,255,36,252,238,255,129,124,253,194,4,239,15,133,244,251,139,
+  44,194,252,247,221,15,128,244,250,199,68,202,4,237,137,44,202,248,9,139,3,
+  15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,4,199,
+  68,202,4,0,0,224,65,199,4,202,0,0,0,0,252,233,244,9,248,5,15,135,244,53,255,
+  129,124,253,194,4,239,15,131,244,53,255,252,242,15,16,4,194,72,184,237,237,
+  102,72,15,110,200,15,87,193,252,242,15,17,4,202,255,221,4,194,217,224,221,
+  28,202,255,129,124,253,194,4,239,15,133,244,248,139,4,194,255,139,128,233,
+  248,1,199,68,202,4,237,137,4,202,255,15,87,192,252,242,15,42,128,233,248,
+  1,252,242,15,17,4,202,255,219,128,233,248,1,221,28,202,255,139,3,15,182,204,
+  15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,2,129,124,253,194,
   4,239,15,133,244,56,139,60,194,255,139,175,233,131,252,253,0,15,133,244,255,
   248,3,255,248,57,137,213,232,251,1,21,255,252,242,15,42,192,255,137,252,234,
   15,182,75,252,253,252,233,244,1,255,248,9,252,246,133,233,235,15,133,244,
@@ -754,8 +754,8 @@ static const unsigned char build_actionlist[16164] = {
   255,1,252,233,255,137,221,209,252,237,129,229,239,102,65,129,172,253,46,233,
   238,15,130,244,148,255,141,12,202,255,129,121,253,4,239,15,133,244,255,255,
   129,121,253,12,239,15,133,244,60,129,121,253,20,239,15,133,244,60,139,41,
-  131,121,16,0,15,140,244,251,255,129,121,253,12,239,15,133,244,165,129,121,
-  253,20,239,15,133,244,165,255,139,105,16,133,252,237,15,136,244,251,3,41,
+  131,121,16,0,15,140,244,251,255,129,121,253,12,239,15,133,244,164,129,121,
+  253,20,239,15,133,244,164,255,139,105,16,133,252,237,15,136,244,251,3,41,
   15,128,244,247,137,41,255,59,105,8,199,65,28,237,137,105,24,255,15,142,244,
   253,248,1,248,6,141,156,253,131,233,255,141,156,253,131,233,15,183,67,252,
   254,15,142,245,248,1,248,6,255,15,143,244,253,248,6,141,156,253,131,233,248,
@@ -763,7 +763,7 @@ static const unsigned char build_actionlist[16164] = {
   252,238,248,5,255,3,41,15,128,244,1,137,41,255,15,141,244,7,255,141,156,253,
   131,233,15,183,67,252,254,15,141,245,255,15,140,244,7,255,252,233,244,6,248,
   9,255,129,121,253,4,239,255,15,131,244,60,129,121,253,12,239,15,131,244,60,
-  255,129,121,253,12,239,15,131,244,165,129,121,253,20,239,15,131,244,165,255,
+  255,129,121,253,12,239,15,131,244,164,129,121,253,20,239,15,131,244,164,255,
   139,105,20,255,129,252,253,239,15,131,244,60,255,252,242,15,16,1,252,242,
   15,16,73,8,255,252,242,15,88,65,16,252,242,15,17,1,133,252,237,15,136,244,
   249,255,15,140,244,249,255,102,15,46,200,248,1,252,242,15,17,65,24,255,221,
@@ -950,8 +950,8 @@ enum {
   GLOB_vm_foldfpm,
   GLOB_vm_foldarith,
   GLOB_vm_cpuid,
-  GLOB_vm_ffi_call,
   GLOB_assert_bad_for_arg_type,
+  GLOB_vm_ffi_call,
   GLOB_BC_MODVN_Z,
   GLOB_BC_TGETS_Z,
   GLOB_BC_TSETS_Z,
@@ -1112,8 +1112,8 @@ static const char *const globnames[] = {
   "vm_foldfpm",
   "vm_foldarith",
   "vm_cpuid",
-  "vm_ffi_call@4",
   "assert_bad_for_arg_type",
+  "vm_ffi_call@4",
   "BC_MODVN_Z",
   "BC_TGETS_Z",
   "BC_TSETS_Z",
@@ -1834,29 +1834,28 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
     dasm_put(Dst, 9411);
   }
   dasm_put(Dst, 9829);
+#ifdef LUA_USE_ASSERT
+  dasm_put(Dst, 9413);
+#endif
+  dasm_put(Dst, 9853);
 #if LJ_HASFFI
 #define DtE(_V) (int)(ptrdiff_t)&(((CCallState *)0)_V)
-  dasm_put(Dst, 9853, DtE(->spadj));
+  dasm_put(Dst, 9857, DtE(->spadj));
 #if LJ_TARGET_WINDOWS
 #endif
-  dasm_put(Dst, 9869, DtE(->nsp), offsetof(CCallState, stack), CCALL_SPS_EXTRA*8, DtE(->nfpr), DtE(->gpr[0]), DtE(->gpr[1]), DtE(->gpr[2]), DtE(->gpr[3]), DtE(->gpr[4]), DtE(->gpr[5]), DtE(->fpr[0]), DtE(->fpr[1]));
-  dasm_put(Dst, 9948, DtE(->fpr[2]), DtE(->fpr[3]), DtE(->fpr[4]), DtE(->fpr[5]), DtE(->fpr[6]), DtE(->fpr[7]), DtE(->func), DtE(->gpr[0]), DtE(->fpr[0]), DtE(->gpr[1]), DtE(->fpr[1]));
+  dasm_put(Dst, 9873, DtE(->nsp), offsetof(CCallState, stack), CCALL_SPS_EXTRA*8, DtE(->nfpr), DtE(->gpr[0]), DtE(->gpr[1]), DtE(->gpr[2]), DtE(->gpr[3]), DtE(->gpr[4]), DtE(->gpr[5]), DtE(->fpr[0]), DtE(->fpr[1]));
+  dasm_put(Dst, 9952, DtE(->fpr[2]), DtE(->fpr[3]), DtE(->fpr[4]), DtE(->fpr[5]), DtE(->fpr[6]), DtE(->fpr[7]), DtE(->func), DtE(->gpr[0]), DtE(->fpr[0]), DtE(->gpr[1]), DtE(->fpr[1]));
 #if LJ_TARGET_WINDOWS
 #endif
-  dasm_put(Dst, 10003);
-#endif
-  dasm_put(Dst, 10011);
-#ifdef LUA_USE_ASSERT
-  dasm_put(Dst, 9413);
+  dasm_put(Dst, 10007);
 #endif
-  dasm_put(Dst, 9413);
 }
 
 /* Generate the code for a single instruction. */
 static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 {
   int vk = 0;
-  dasm_put(Dst, 10014, defop);
+  dasm_put(Dst, 10015, defop);
 
   switch (op) {
 
@@ -1867,145 +1866,145 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 10016, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 10017, LJ_TISNUM, LJ_TISNUM);
       switch (op) {
       case BC_ISLT:
-      dasm_put(Dst, 10046);
+      dasm_put(Dst, 10047);
       break;
       case BC_ISGE:
-      dasm_put(Dst, 10051);
+      dasm_put(Dst, 10052);
       break;
       case BC_ISLE:
-      dasm_put(Dst, 10056);
+      dasm_put(Dst, 10057);
       break;
       case BC_ISGT:
-      dasm_put(Dst, 10061);
+      dasm_put(Dst, 10062);
       break;
       default: break;  /* Shut up GCC. */
       }
-      dasm_put(Dst, 10066, -BCBIAS_J*4, LJ_TISNUM);
+      dasm_put(Dst, 10067, -BCBIAS_J*4, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 10121);
+       dasm_put(Dst, 10122);
       } else {
-       dasm_put(Dst, 10132);
+       dasm_put(Dst, 10133);
       }
-      dasm_put(Dst, 10143);
+      dasm_put(Dst, 10144);
       if (sse) {
-       dasm_put(Dst, 10150);
+       dasm_put(Dst, 10151);
        switch (op) {
        case BC_ISLT:
-       dasm_put(Dst, 10170);
+       dasm_put(Dst, 10171);
        break;
        case BC_ISGE:
-       dasm_put(Dst, 10175);
+       dasm_put(Dst, 10176);
        break;
        case BC_ISLE:
-       dasm_put(Dst, 10180);
+       dasm_put(Dst, 10181);
        break;
        case BC_ISGT:
-       dasm_put(Dst, 10185);
+       dasm_put(Dst, 10186);
        break;
        default: break;  /* Shut up GCC. */
        }
-       dasm_put(Dst, 10190);
+       dasm_put(Dst, 10191);
       } else {
-       dasm_put(Dst, 10195);
+       dasm_put(Dst, 10196);
       }
     } else {
-      dasm_put(Dst, 10203, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 10204, LJ_TISNUM, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 10224);
+      dasm_put(Dst, 10225);
     } else {
-      dasm_put(Dst, 10245);
+      dasm_put(Dst, 10246);
       if (cmov) {
-      dasm_put(Dst, 10261);
+      dasm_put(Dst, 10262);
       } else {
-      dasm_put(Dst, 10267);
+      dasm_put(Dst, 10268);
       }
     }
     if (LJ_DUALNUM) {
       switch (op) {
       case BC_ISLT:
-      dasm_put(Dst, 10170);
+      dasm_put(Dst, 10171);
       break;
       case BC_ISGE:
-      dasm_put(Dst, 10175);
+      dasm_put(Dst, 10176);
       break;
       case BC_ISLE:
-      dasm_put(Dst, 10180);
+      dasm_put(Dst, 10181);
       break;
       case BC_ISGT:
-      dasm_put(Dst, 10185);
+      dasm_put(Dst, 10186);
       break;
       default: break;  /* Shut up GCC. */
       }
-      dasm_put(Dst, 10190);
+      dasm_put(Dst, 10191);
     } else {
       switch (op) {
       case BC_ISLT:
-      dasm_put(Dst, 10274);
+      dasm_put(Dst, 10275);
       break;
       case BC_ISGE:
-      dasm_put(Dst, 10279);
+      dasm_put(Dst, 10280);
       break;
       case BC_ISLE:
-      dasm_put(Dst, 10284);
+      dasm_put(Dst, 10285);
       break;
       case BC_ISGT:
-      dasm_put(Dst, 10289);
+      dasm_put(Dst, 10290);
       break;
       default: break;  /* Shut up GCC. */
       }
-      dasm_put(Dst, 10294, -BCBIAS_J*4);
+      dasm_put(Dst, 10295, -BCBIAS_J*4);
     }
     break;
 
   case BC_ISEQV: case BC_ISNEV:
     vk = op == BC_ISEQV;
-    dasm_put(Dst, 10327);
+    dasm_put(Dst, 10328);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 10335, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 10336, LJ_TISNUM, LJ_TISNUM);
       if (vk) {
-       dasm_put(Dst, 10360);
+       dasm_put(Dst, 10361);
       } else {
-       dasm_put(Dst, 10365);
+       dasm_put(Dst, 10366);
       }
-      dasm_put(Dst, 10370, -BCBIAS_J*4, LJ_TISNUM);
+      dasm_put(Dst, 10371, -BCBIAS_J*4, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 10423);
+       dasm_put(Dst, 10424);
       } else {
-       dasm_put(Dst, 10430);
+       dasm_put(Dst, 10431);
       }
-      dasm_put(Dst, 10434);
+      dasm_put(Dst, 10435);
       if (sse) {
-       dasm_put(Dst, 10445);
+       dasm_put(Dst, 10446);
       } else {
-       dasm_put(Dst, 10457);
+       dasm_put(Dst, 10458);
       }
-      dasm_put(Dst, 10464);
+      dasm_put(Dst, 10465);
     } else {
-      dasm_put(Dst, 10469, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 10470, LJ_TISNUM, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 10488);
+      dasm_put(Dst, 10489);
     } else {
-      dasm_put(Dst, 10506);
+      dasm_put(Dst, 10507);
       if (cmov) {
-      dasm_put(Dst, 10261);
+      dasm_put(Dst, 10262);
       } else {
-      dasm_put(Dst, 10267);
+      dasm_put(Dst, 10268);
       }
     }
   iseqne_fp:
     if (vk) {
-      dasm_put(Dst, 10519);
+      dasm_put(Dst, 10520);
     } else {
-      dasm_put(Dst, 10528);
+      dasm_put(Dst, 10529);
     }
   iseqne_end:
     if (vk) {
-      dasm_put(Dst, 10537, -BCBIAS_J*4);
+      dasm_put(Dst, 10538, -BCBIAS_J*4);
       if (!LJ_HASFFI) {
        dasm_put(Dst, 4675);
       }
@@ -2013,156 +2012,156 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
       if (!LJ_HASFFI) {
        dasm_put(Dst, 4675);
       }
-      dasm_put(Dst, 10552, -BCBIAS_J*4);
+      dasm_put(Dst, 10553, -BCBIAS_J*4);
     }
     if (LJ_DUALNUM && (op == BC_ISEQV || op == BC_ISNEV ||
                       op == BC_ISEQN || op == BC_ISNEN)) {
-      dasm_put(Dst, 10567);
+      dasm_put(Dst, 10568);
     } else {
-      dasm_put(Dst, 10306);
+      dasm_put(Dst, 10307);
     }
     if (op == BC_ISEQV || op == BC_ISNEV) {
-      dasm_put(Dst, 10572);
+      dasm_put(Dst, 10573);
       if (LJ_HASFFI) {
-       dasm_put(Dst, 10575, LJ_TCDATA, LJ_TCDATA);
+       dasm_put(Dst, 10576, LJ_TCDATA, LJ_TCDATA);
       }
-      dasm_put(Dst, 10594, LJ_TISPRI, LJ_TISTABUD, LJ_TUDATA, Dt6(->metatable), Dt6(->nomm), 1<<MM_eq);
+      dasm_put(Dst, 10595, LJ_TISPRI, LJ_TISTABUD, LJ_TUDATA, Dt6(->metatable), Dt6(->nomm), 1<<MM_eq);
       if (vk) {
-       dasm_put(Dst, 10658);
+       dasm_put(Dst, 10659);
       } else {
-       dasm_put(Dst, 10662);
+       dasm_put(Dst, 10663);
       }
-      dasm_put(Dst, 10668);
+      dasm_put(Dst, 10669);
     } else if (LJ_HASFFI) {
-      dasm_put(Dst, 10673, LJ_TCDATA);
+      dasm_put(Dst, 10674, LJ_TCDATA);
       if (LJ_DUALNUM && vk) {
-       dasm_put(Dst, 10680);
+       dasm_put(Dst, 10681);
       } else {
-       dasm_put(Dst, 10653);
+       dasm_put(Dst, 10654);
       }
-      dasm_put(Dst, 10685);
+      dasm_put(Dst, 10686);
     }
     break;
   case BC_ISEQS: case BC_ISNES:
     vk = op == BC_ISEQS;
-    dasm_put(Dst, 10690, LJ_TSTR);
+    dasm_put(Dst, 10691, LJ_TSTR);
   iseqne_test:
     if (vk) {
-      dasm_put(Dst, 10523);
+      dasm_put(Dst, 10524);
     } else {
       dasm_put(Dst, 814);
     }
     goto iseqne_end;
   case BC_ISEQN: case BC_ISNEN:
     vk = op == BC_ISEQN;
-    dasm_put(Dst, 10717);
+    dasm_put(Dst, 10718);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 10725, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 10726, LJ_TISNUM, LJ_TISNUM);
       if (vk) {
-       dasm_put(Dst, 10360);
+       dasm_put(Dst, 10361);
       } else {
-       dasm_put(Dst, 10365);
+       dasm_put(Dst, 10366);
       }
-      dasm_put(Dst, 10752, -BCBIAS_J*4, LJ_TISNUM);
+      dasm_put(Dst, 10753, -BCBIAS_J*4, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 10802);
+       dasm_put(Dst, 10803);
       } else {
-       dasm_put(Dst, 10810);
+       dasm_put(Dst, 10811);
       }
-      dasm_put(Dst, 10815);
+      dasm_put(Dst, 10816);
       if (sse) {
-       dasm_put(Dst, 10822);
+       dasm_put(Dst, 10823);
       } else {
-       dasm_put(Dst, 10835);
+       dasm_put(Dst, 10836);
       }
-      dasm_put(Dst, 10464);
+      dasm_put(Dst, 10465);
     } else {
-      dasm_put(Dst, 10843, LJ_TISNUM);
+      dasm_put(Dst, 10844, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 10852);
+      dasm_put(Dst, 10853);
     } else {
-      dasm_put(Dst, 10871);
+      dasm_put(Dst, 10872);
       if (cmov) {
-      dasm_put(Dst, 10261);
+      dasm_put(Dst, 10262);
       } else {
-      dasm_put(Dst, 10267);
+      dasm_put(Dst, 10268);
       }
     }
     goto iseqne_fp;
   case BC_ISEQP: case BC_ISNEP:
     vk = op == BC_ISEQP;
-    dasm_put(Dst, 10885);
+    dasm_put(Dst, 10886);
     if (!LJ_HASFFI) goto iseqne_test;
     if (vk) {
-      dasm_put(Dst, 10899, -BCBIAS_J*4, LJ_TCDATA);
+      dasm_put(Dst, 10900, -BCBIAS_J*4, LJ_TCDATA);
     } else {
-      dasm_put(Dst, 10950, LJ_TCDATA, -BCBIAS_J*4);
+      dasm_put(Dst, 10951, LJ_TCDATA, -BCBIAS_J*4);
     }
     break;
 
   /* -- Unary test and copy ops ------------------------------------------- */
 
   case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:
-    dasm_put(Dst, 10995, LJ_TISTRUECOND);
+    dasm_put(Dst, 10996, LJ_TISTRUECOND);
     if (op == BC_IST || op == BC_ISTC) {
-      dasm_put(Dst, 10289);
+      dasm_put(Dst, 10290);
     } else {
-      dasm_put(Dst, 10284);
+      dasm_put(Dst, 10285);
     }
     if (op == BC_ISTC || op == BC_ISFC) {
-      dasm_put(Dst, 11007);
+      dasm_put(Dst, 11008);
     }
-    dasm_put(Dst, 10294, -BCBIAS_J*4);
+    dasm_put(Dst, 10295, -BCBIAS_J*4);
     break;
 
   /* -- Unary ops --------------------------------------------------------- */
 
   case BC_MOV:
-    dasm_put(Dst, 11018);
+    dasm_put(Dst, 11019);
     break;
   case BC_NOT:
-    dasm_put(Dst, 11047, LJ_TISTRUECOND, LJ_TTRUE);
+    dasm_put(Dst, 11048, LJ_TISTRUECOND, LJ_TTRUE);
     break;
   case BC_UNM:
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 11084, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 11085, LJ_TISNUM, LJ_TISNUM);
     } else {
-      dasm_put(Dst, 11162, LJ_TISNUM);
+      dasm_put(Dst, 11163, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 11173, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32));
+      dasm_put(Dst, 11174, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32));
     } else {
-      dasm_put(Dst, 11198);
+      dasm_put(Dst, 11199);
     }
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 10567);
+      dasm_put(Dst, 10568);
     } else {
-      dasm_put(Dst, 10306);
+      dasm_put(Dst, 10307);
     }
     break;
   case BC_LEN:
-    dasm_put(Dst, 11207, LJ_TSTR);
+    dasm_put(Dst, 11208, LJ_TSTR);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 11221, Dt5(->len), LJ_TISNUM);
+      dasm_put(Dst, 11222, Dt5(->len), LJ_TISNUM);
     } else if (sse) {
-      dasm_put(Dst, 11235, Dt5(->len));
+      dasm_put(Dst, 11236, Dt5(->len));
     } else {
-      dasm_put(Dst, 11253, Dt5(->len));
+      dasm_put(Dst, 11254, Dt5(->len));
     }
-    dasm_put(Dst, 11262, LJ_TTAB);
+    dasm_put(Dst, 11263, LJ_TTAB);
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
-    dasm_put(Dst, 11298, Dt6(->metatable));
+    dasm_put(Dst, 11299, Dt6(->metatable));
 #endif
-    dasm_put(Dst, 11312);
+    dasm_put(Dst, 11313);
     if (LJ_DUALNUM) {
     } else if (sse) {
-      dasm_put(Dst, 11321);
+      dasm_put(Dst, 11322);
     } else {
     }
-    dasm_put(Dst, 11327);
+    dasm_put(Dst, 11328);
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
-    dasm_put(Dst, 11340, Dt6(->nomm), 1<<MM_len);
+    dasm_put(Dst, 11341, Dt6(->nomm), 1<<MM_len);
 #endif
     break;
 
@@ -2171,603 +2170,603 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11356);
+    dasm_put(Dst, 11357);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11364, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11365, LJ_TISNUM, LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 11399, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11400, LJ_TISNUM, LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 11434, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11435, LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 11467, LJ_TISNUM);
+    dasm_put(Dst, 11468, LJ_TISNUM);
     if (vk == 1) {
-    dasm_put(Dst, 11231);
+    dasm_put(Dst, 11232);
     } else {
-    dasm_put(Dst, 11014);
+    dasm_put(Dst, 11015);
     }
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     } else {
-    dasm_put(Dst, 11356);
+    dasm_put(Dst, 11357);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11473, LJ_TISNUM);
+    dasm_put(Dst, 11474, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11485, LJ_TISNUM);
+    dasm_put(Dst, 11486, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11497);
+    dasm_put(Dst, 11498);
     } else {
-    dasm_put(Dst, 11512);
+    dasm_put(Dst, 11513);
     }
       break;
     case 1:
-    dasm_put(Dst, 11521, LJ_TISNUM);
+    dasm_put(Dst, 11522, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11533, LJ_TISNUM);
+    dasm_put(Dst, 11534, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11545);
+    dasm_put(Dst, 11546);
     } else {
-    dasm_put(Dst, 11560);
+    dasm_put(Dst, 11561);
     }
       break;
     default:
-    dasm_put(Dst, 11569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 11591);
+    dasm_put(Dst, 11592);
     } else {
-    dasm_put(Dst, 11605);
+    dasm_put(Dst, 11606);
     }
       break;
     }
     if (sse) {
-    dasm_put(Dst, 11191);
+    dasm_put(Dst, 11192);
     } else {
-    dasm_put(Dst, 11203);
+    dasm_put(Dst, 11204);
     }
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     }
     break;
   case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11356);
+    dasm_put(Dst, 11357);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11613, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11614, LJ_TISNUM, LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 11648, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11649, LJ_TISNUM, LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 11683, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11684, LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 11467, LJ_TISNUM);
+    dasm_put(Dst, 11468, LJ_TISNUM);
     if (vk == 1) {
-    dasm_put(Dst, 11231);
+    dasm_put(Dst, 11232);
     } else {
-    dasm_put(Dst, 11014);
+    dasm_put(Dst, 11015);
     }
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     } else {
-    dasm_put(Dst, 11356);
+    dasm_put(Dst, 11357);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11473, LJ_TISNUM);
+    dasm_put(Dst, 11474, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11485, LJ_TISNUM);
+    dasm_put(Dst, 11486, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11716);
+    dasm_put(Dst, 11717);
     } else {
-    dasm_put(Dst, 11731);
+    dasm_put(Dst, 11732);
     }
       break;
     case 1:
-    dasm_put(Dst, 11521, LJ_TISNUM);
+    dasm_put(Dst, 11522, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11533, LJ_TISNUM);
+    dasm_put(Dst, 11534, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11740);
+    dasm_put(Dst, 11741);
     } else {
-    dasm_put(Dst, 11755);
+    dasm_put(Dst, 11756);
     }
       break;
     default:
-    dasm_put(Dst, 11569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 11764);
+    dasm_put(Dst, 11765);
     } else {
-    dasm_put(Dst, 11778);
+    dasm_put(Dst, 11779);
     }
       break;
     }
     if (sse) {
-    dasm_put(Dst, 11191);
+    dasm_put(Dst, 11192);
     } else {
-    dasm_put(Dst, 11203);
+    dasm_put(Dst, 11204);
     }
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     }
     break;
   case BC_MULVN: case BC_MULNV: case BC_MULVV:
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11356);
+    dasm_put(Dst, 11357);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11786, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11787, LJ_TISNUM, LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 11822, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11823, LJ_TISNUM, LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 11858, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11859, LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 11467, LJ_TISNUM);
+    dasm_put(Dst, 11468, LJ_TISNUM);
     if (vk == 1) {
-    dasm_put(Dst, 11231);
+    dasm_put(Dst, 11232);
     } else {
-    dasm_put(Dst, 11014);
+    dasm_put(Dst, 11015);
     }
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     } else {
-    dasm_put(Dst, 11356);
+    dasm_put(Dst, 11357);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11473, LJ_TISNUM);
+    dasm_put(Dst, 11474, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11485, LJ_TISNUM);
+    dasm_put(Dst, 11486, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11892);
+    dasm_put(Dst, 11893);
     } else {
-    dasm_put(Dst, 11907);
+    dasm_put(Dst, 11908);
     }
       break;
     case 1:
-    dasm_put(Dst, 11521, LJ_TISNUM);
+    dasm_put(Dst, 11522, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11533, LJ_TISNUM);
+    dasm_put(Dst, 11534, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11916);
+    dasm_put(Dst, 11917);
     } else {
-    dasm_put(Dst, 11931);
+    dasm_put(Dst, 11932);
     }
       break;
     default:
-    dasm_put(Dst, 11569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 11940);
+    dasm_put(Dst, 11941);
     } else {
-    dasm_put(Dst, 11954);
+    dasm_put(Dst, 11955);
     }
       break;
     }
     if (sse) {
-    dasm_put(Dst, 11191);
+    dasm_put(Dst, 11192);
     } else {
-    dasm_put(Dst, 11203);
+    dasm_put(Dst, 11204);
     }
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     }
     break;
   case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:
-    dasm_put(Dst, 11356);
+    dasm_put(Dst, 11357);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11473, LJ_TISNUM);
+    dasm_put(Dst, 11474, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11485, LJ_TISNUM);
+    dasm_put(Dst, 11486, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11962);
+    dasm_put(Dst, 11963);
     } else {
-    dasm_put(Dst, 11977);
+    dasm_put(Dst, 11978);
     }
       break;
     case 1:
-    dasm_put(Dst, 11521, LJ_TISNUM);
+    dasm_put(Dst, 11522, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11533, LJ_TISNUM);
+    dasm_put(Dst, 11534, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11986);
+    dasm_put(Dst, 11987);
     } else {
-    dasm_put(Dst, 12001);
+    dasm_put(Dst, 12002);
     }
       break;
     default:
-    dasm_put(Dst, 11569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 12010);
+    dasm_put(Dst, 12011);
     } else {
-    dasm_put(Dst, 12024);
+    dasm_put(Dst, 12025);
     }
       break;
     }
     if (sse) {
-    dasm_put(Dst, 11191);
+    dasm_put(Dst, 11192);
     } else {
-    dasm_put(Dst, 11203);
+    dasm_put(Dst, 11204);
     }
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     break;
   case BC_MODVN:
-    dasm_put(Dst, 11356);
+    dasm_put(Dst, 11357);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11473, LJ_TISNUM);
+    dasm_put(Dst, 11474, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11485, LJ_TISNUM);
+    dasm_put(Dst, 11486, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12032);
+    dasm_put(Dst, 12033);
     } else {
-    dasm_put(Dst, 12047);
+    dasm_put(Dst, 12048);
     }
       break;
     case 1:
-    dasm_put(Dst, 11521, LJ_TISNUM);
+    dasm_put(Dst, 11522, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11533, LJ_TISNUM);
+    dasm_put(Dst, 11534, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12056);
+    dasm_put(Dst, 12057);
     } else {
-    dasm_put(Dst, 12071);
+    dasm_put(Dst, 12072);
     }
       break;
     default:
-    dasm_put(Dst, 11569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 12080);
+    dasm_put(Dst, 12081);
     } else {
-    dasm_put(Dst, 12094);
+    dasm_put(Dst, 12095);
     }
       break;
     }
-    dasm_put(Dst, 12102);
+    dasm_put(Dst, 12103);
     if (sse) {
-    dasm_put(Dst, 11191);
+    dasm_put(Dst, 11192);
     } else {
-    dasm_put(Dst, 11203);
+    dasm_put(Dst, 11204);
     }
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     break;
   case BC_MODNV: case BC_MODVV:
-    dasm_put(Dst, 11356);
+    dasm_put(Dst, 11357);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11473, LJ_TISNUM);
+    dasm_put(Dst, 11474, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11485, LJ_TISNUM);
+    dasm_put(Dst, 11486, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12032);
+    dasm_put(Dst, 12033);
     } else {
-    dasm_put(Dst, 12047);
+    dasm_put(Dst, 12048);
     }
       break;
     case 1:
-    dasm_put(Dst, 11521, LJ_TISNUM);
+    dasm_put(Dst, 11522, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11533, LJ_TISNUM);
+    dasm_put(Dst, 11534, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12056);
+    dasm_put(Dst, 12057);
     } else {
-    dasm_put(Dst, 12071);
+    dasm_put(Dst, 12072);
     }
       break;
     default:
-    dasm_put(Dst, 11569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 12080);
+    dasm_put(Dst, 12081);
     } else {
-    dasm_put(Dst, 12094);
+    dasm_put(Dst, 12095);
     }
       break;
     }
-    dasm_put(Dst, 12108);
+    dasm_put(Dst, 12109);
     break;
   case BC_POW:
-    dasm_put(Dst, 11356);
+    dasm_put(Dst, 11357);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11473, LJ_TISNUM);
+    dasm_put(Dst, 11474, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11485, LJ_TISNUM);
+    dasm_put(Dst, 11486, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12032);
+    dasm_put(Dst, 12033);
     } else {
-    dasm_put(Dst, 12047);
+    dasm_put(Dst, 12048);
     }
       break;
     case 1:
-    dasm_put(Dst, 11521, LJ_TISNUM);
+    dasm_put(Dst, 11522, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11533, LJ_TISNUM);
+    dasm_put(Dst, 11534, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12056);
+    dasm_put(Dst, 12057);
     } else {
-    dasm_put(Dst, 12071);
+    dasm_put(Dst, 12072);
     }
       break;
     default:
-    dasm_put(Dst, 11569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 12080);
+    dasm_put(Dst, 12081);
     } else {
-    dasm_put(Dst, 12094);
+    dasm_put(Dst, 12095);
     }
       break;
     }
-    dasm_put(Dst, 12113);
+    dasm_put(Dst, 12114);
     if (sse) {
-    dasm_put(Dst, 11191);
+    dasm_put(Dst, 11192);
     } else {
-    dasm_put(Dst, 11203);
+    dasm_put(Dst, 11204);
     }
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     break;
 
   case BC_CAT:
-    dasm_put(Dst, 12117, Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 12118, Dt1(->base), Dt1(->base));
     break;
 
   /* -- Constant ops ------------------------------------------------------ */
 
   case BC_KSTR:
-    dasm_put(Dst, 12201, LJ_TSTR);
+    dasm_put(Dst, 12202, LJ_TSTR);
     break;
   case BC_KCDATA:
 #if LJ_HASFFI
-    dasm_put(Dst, 12201, LJ_TCDATA);
+    dasm_put(Dst, 12202, LJ_TCDATA);
 #endif
     break;
   case BC_KSHORT:
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 12238, LJ_TISNUM);
+      dasm_put(Dst, 12239, LJ_TISNUM);
     } else if (sse) {
-      dasm_put(Dst, 12250);
+      dasm_put(Dst, 12251);
     } else {
-      dasm_put(Dst, 12265);
+      dasm_put(Dst, 12266);
     }
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     break;
   case BC_KNUM:
     if (sse) {
-      dasm_put(Dst, 12273);
+      dasm_put(Dst, 12274);
     } else {
-      dasm_put(Dst, 12287);
+      dasm_put(Dst, 12288);
     }
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     break;
   case BC_KPRI:
-    dasm_put(Dst, 12295);
+    dasm_put(Dst, 12296);
     break;
   case BC_KNIL:
-    dasm_put(Dst, 12324, LJ_TNIL);
+    dasm_put(Dst, 12325, LJ_TNIL);
     break;
 
   /* -- Upvalue and function ops ------------------------------------------ */
 
   case BC_UGET:
-    dasm_put(Dst, 12372, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 12373, offsetof(GCfuncL, uvptr), DtA(->v));
     break;
   case BC_USETV:
 #define TV2MARKOFS \
  ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv))
-    dasm_put(Dst, 12413, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TISNUM - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G);
-    dasm_put(Dst, 12509);
+    dasm_put(Dst, 12414, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TISNUM - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G);
+    dasm_put(Dst, 12510);
     break;
 #undef TV2MARKOFS
   case BC_USETS:
-    dasm_put(Dst, 12521, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G);
+    dasm_put(Dst, 12522, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G);
     break;
   case BC_USETN:
-    dasm_put(Dst, 12617);
+    dasm_put(Dst, 12618);
     if (sse) {
-      dasm_put(Dst, 12622);
+      dasm_put(Dst, 12623);
     } else {
-      dasm_put(Dst, 10838);
+      dasm_put(Dst, 10839);
     }
-    dasm_put(Dst, 12630, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 12631, offsetof(GCfuncL, uvptr), DtA(->v));
     if (sse) {
-      dasm_put(Dst, 12639);
+      dasm_put(Dst, 12640);
     } else {
-      dasm_put(Dst, 12645);
+      dasm_put(Dst, 12646);
     }
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     break;
   case BC_USETP:
-    dasm_put(Dst, 12648, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 12649, offsetof(GCfuncL, uvptr), DtA(->v));
     break;
   case BC_UCLO:
-    dasm_put(Dst, 12688, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 12689, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base));
     break;
 
   case BC_FNEW:
-    dasm_put(Dst, 12744, Dt1(->base), Dt1(->base), LJ_TFUNC);
+    dasm_put(Dst, 12745, Dt1(->base), Dt1(->base), LJ_TFUNC);
     break;
 
   /* -- Table ops --------------------------------------------------------- */
 
   case BC_TNEW:
-    dasm_put(Dst, 12811, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), LJ_TTAB);
+    dasm_put(Dst, 12812, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), LJ_TTAB);
     break;
   case BC_TDUP:
-    dasm_put(Dst, 12935, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB);
+    dasm_put(Dst, 12936, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB);
     break;
 
   case BC_GGET:
-    dasm_put(Dst, 13034, Dt7(->env));
+    dasm_put(Dst, 13035, Dt7(->env));
     break;
   case BC_GSET:
-    dasm_put(Dst, 13054, Dt7(->env));
+    dasm_put(Dst, 13055, Dt7(->env));
     break;
 
   case BC_TGETV:
-    dasm_put(Dst, 13074, LJ_TTAB);
+    dasm_put(Dst, 13075, LJ_TTAB);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 13097, LJ_TISNUM);
+      dasm_put(Dst, 13098, LJ_TISNUM);
     } else {
-      dasm_put(Dst, 13111, LJ_TISNUM);
+      dasm_put(Dst, 13112, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 13122);
+       dasm_put(Dst, 13123);
       } else {
       }
-      dasm_put(Dst, 13143);
+      dasm_put(Dst, 13144);
     }
-    dasm_put(Dst, 13148, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index, LJ_TNIL);
-    dasm_put(Dst, 13240, LJ_TSTR);
+    dasm_put(Dst, 13149, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index, LJ_TNIL);
+    dasm_put(Dst, 13241, LJ_TSTR);
     break;
   case BC_TGETS:
-    dasm_put(Dst, 13258, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);
-    dasm_put(Dst, 13343, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 13259, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);
+    dasm_put(Dst, 13344, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
     break;
   case BC_TGETB:
-    dasm_put(Dst, 13415, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
-    dasm_put(Dst, 13511, LJ_TNIL);
+    dasm_put(Dst, 13416, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 13512, LJ_TNIL);
     break;
 
   case BC_TSETV:
-    dasm_put(Dst, 13528, LJ_TTAB);
+    dasm_put(Dst, 13529, LJ_TTAB);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 13097, LJ_TISNUM);
+      dasm_put(Dst, 13098, LJ_TISNUM);
     } else {
-      dasm_put(Dst, 13111, LJ_TISNUM);
+      dasm_put(Dst, 13112, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 13122);
+       dasm_put(Dst, 13123);
       } else {
       }
-      dasm_put(Dst, 13551);
+      dasm_put(Dst, 13552);
     }
-    dasm_put(Dst, 13556, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex);
-    dasm_put(Dst, 13637, LJ_TSTR, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
+    dasm_put(Dst, 13557, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex);
+    dasm_put(Dst, 13638, LJ_TSTR, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
     break;
   case BC_TSETS:
-    dasm_put(Dst, 13696, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);
-    dasm_put(Dst, 13773, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DtB(->next));
-    dasm_put(Dst, 13860, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, LJ_TSTR, Dt1(->base), Dt1(->base), Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
+    dasm_put(Dst, 13697, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);
+    dasm_put(Dst, 13774, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DtB(->next));
+    dasm_put(Dst, 13861, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, LJ_TSTR, Dt1(->base), Dt1(->base), Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
     break;
   case BC_TSETB:
-    dasm_put(Dst, 13952, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable));
-    dasm_put(Dst, 14047, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
+    dasm_put(Dst, 13953, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable));
+    dasm_put(Dst, 14048, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
     break;
 
   case BC_TSETM:
-    dasm_put(Dst, 14095, Dt6(->marked), LJ_GC_BLACK, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base));
-    dasm_put(Dst, 14245, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
+    dasm_put(Dst, 14096, Dt6(->marked), LJ_GC_BLACK, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 14246, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
     break;
 
   /* -- Calls and vararg handling ----------------------------------------- */
 
   case BC_CALL: case BC_CALLM:
-    dasm_put(Dst, 11360);
+    dasm_put(Dst, 11361);
     if (op == BC_CALLM) {
-      dasm_put(Dst, 14265);
+      dasm_put(Dst, 14266);
     }
-    dasm_put(Dst, 14270, LJ_TFUNC, Dt7(->pc));
+    dasm_put(Dst, 14271, LJ_TFUNC, Dt7(->pc));
     break;
 
   case BC_CALLMT:
-    dasm_put(Dst, 14265);
+    dasm_put(Dst, 14266);
     break;
   case BC_CALLT:
-    dasm_put(Dst, 14313, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->pc));
-    dasm_put(Dst, 14431, FRAME_TYPE, Dt7(->pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP, FRAME_VARG);
+    dasm_put(Dst, 14314, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->pc));
+    dasm_put(Dst, 14432, FRAME_TYPE, Dt7(->pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP, FRAME_VARG);
     break;
 
   case BC_ITERC:
-    dasm_put(Dst, 14505, LJ_TFUNC, 2+1, Dt7(->pc));
+    dasm_put(Dst, 14506, LJ_TFUNC, 2+1, Dt7(->pc));
     break;
 
   case BC_ITERN:
 #if LJ_HASJIT
 #endif
-    dasm_put(Dst, 14577, Dt6(->asize), Dt6(->array), LJ_TNIL);
+    dasm_put(Dst, 14578, Dt6(->asize), Dt6(->array), LJ_TNIL);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 11226, LJ_TISNUM);
+      dasm_put(Dst, 11227, LJ_TISNUM);
     } else if (sse) {
-      dasm_put(Dst, 11321);
+      dasm_put(Dst, 11322);
     } else {
-      dasm_put(Dst, 14629);
+      dasm_put(Dst, 14630);
     }
-    dasm_put(Dst, 14635);
+    dasm_put(Dst, 14636);
     if (LJ_DUALNUM) {
     } else if (sse) {
-      dasm_put(Dst, 11191);
+      dasm_put(Dst, 11192);
     } else {
-      dasm_put(Dst, 11203);
+      dasm_put(Dst, 11204);
     }
-    dasm_put(Dst, 14648, -BCBIAS_J*4);
+    dasm_put(Dst, 14649, -BCBIAS_J*4);
     if (!LJ_DUALNUM && !sse) {
-      dasm_put(Dst, 14702);
+      dasm_put(Dst, 14703);
     }
-    dasm_put(Dst, 14708, Dt6(->hmask), sizeof(Node), Dt6(->node), DtB(->val.it), LJ_TNIL, DtB(->key), DtB(->val));
+    dasm_put(Dst, 14709, Dt6(->hmask), sizeof(Node), Dt6(->node), DtB(->val.it), LJ_TNIL, DtB(->key), DtB(->val));
     break;
 
   case BC_ISNEXT:
-    dasm_put(Dst, 14787, LJ_TFUNC, LJ_TTAB, LJ_TNIL, Dt8(->ffid), FF_next_N, -BCBIAS_J*4, BC_JMP, -BCBIAS_J*4, BC_ITERC);
+    dasm_put(Dst, 14788, LJ_TFUNC, LJ_TTAB, LJ_TNIL, Dt8(->ffid), FF_next_N, -BCBIAS_J*4, BC_JMP, -BCBIAS_J*4, BC_ITERC);
     break;
 
   case BC_VARG:
-    dasm_put(Dst, 14888, (8+FRAME_VARG), LJ_TNIL, Dt1(->maxstack));
-    dasm_put(Dst, 15055, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));
+    dasm_put(Dst, 14889, (8+FRAME_VARG), LJ_TNIL, Dt1(->maxstack));
+    dasm_put(Dst, 15056, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));
     break;
 
   /* -- Returns ----------------------------------------------------------- */
 
   case BC_RETM:
-    dasm_put(Dst, 14265);
+    dasm_put(Dst, 14266);
     break;
 
   case BC_RET: case BC_RET0: case BC_RET1:
     if (op != BC_RET0) {
-      dasm_put(Dst, 15125);
+      dasm_put(Dst, 15126);
     }
-    dasm_put(Dst, 15129, FRAME_TYPE);
+    dasm_put(Dst, 15130, FRAME_TYPE);
     switch (op) {
     case BC_RET:
-      dasm_put(Dst, 15148);
+      dasm_put(Dst, 15149);
       break;
     case BC_RET1:
-      dasm_put(Dst, 15202);
+      dasm_put(Dst, 15203);
       /* fallthrough */
     case BC_RET0:
-      dasm_put(Dst, 15212);
+      dasm_put(Dst, 15213);
     default:
       break;
     }
-    dasm_put(Dst, 15223, Dt7(->pc), PC2PROTO(k));
+    dasm_put(Dst, 15224, Dt7(->pc), PC2PROTO(k));
     if (op == BC_RET) {
-      dasm_put(Dst, 15271, LJ_TNIL);
+      dasm_put(Dst, 15272, LJ_TNIL);
     } else {
-      dasm_put(Dst, 15282, LJ_TNIL);
+      dasm_put(Dst, 15283, LJ_TNIL);
     }
-    dasm_put(Dst, 15289, -FRAME_VARG, FRAME_TYPEP);
+    dasm_put(Dst, 15290, -FRAME_VARG, FRAME_TYPEP);
     if (op != BC_RET0) {
-      dasm_put(Dst, 15313);
+      dasm_put(Dst, 15314);
     }
     dasm_put(Dst, 4752);
     break;
@@ -2777,7 +2776,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_FORL:
 #if LJ_HASJIT
-    dasm_put(Dst, 15317, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
+    dasm_put(Dst, 15318, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -2789,111 +2788,111 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
   case BC_FORI:
   case BC_IFORL:
     vk = (op == BC_IFORL || op == BC_JFORL);
-    dasm_put(Dst, 15338);
+    dasm_put(Dst, 15339);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 15342, LJ_TISNUM);
+      dasm_put(Dst, 15343, LJ_TISNUM);
       if (!vk) {
-       dasm_put(Dst, 15352, LJ_TISNUM, LJ_TISNUM);
+       dasm_put(Dst, 15353, LJ_TISNUM, LJ_TISNUM);
       } else {
 #ifdef LUA_USE_ASSERT
-       dasm_put(Dst, 15381, LJ_TISNUM, LJ_TISNUM);
+       dasm_put(Dst, 15382, LJ_TISNUM, LJ_TISNUM);
 #endif
-       dasm_put(Dst, 15400);
+       dasm_put(Dst, 15401);
       }
-      dasm_put(Dst, 15419, LJ_TISNUM);
+      dasm_put(Dst, 15420, LJ_TISNUM);
       if (op == BC_FORI) {
-       dasm_put(Dst, 15430, -BCBIAS_J*4);
+       dasm_put(Dst, 15431, -BCBIAS_J*4);
       } else if (op == BC_JFORI) {
-       dasm_put(Dst, 15444, -BCBIAS_J*4, BC_JLOOP);
+       dasm_put(Dst, 15445, -BCBIAS_J*4, BC_JLOOP);
       } else if (op == BC_IFORL) {
-       dasm_put(Dst, 15462, -BCBIAS_J*4);
+       dasm_put(Dst, 15463, -BCBIAS_J*4);
       } else {
-       dasm_put(Dst, 15454, BC_JLOOP);
+       dasm_put(Dst, 15455, BC_JLOOP);
       }
-      dasm_put(Dst, 15476);
+      dasm_put(Dst, 15477);
       if (vk) {
-       dasm_put(Dst, 15501);
+       dasm_put(Dst, 15502);
       }
-      dasm_put(Dst, 15419, LJ_TISNUM);
+      dasm_put(Dst, 15420, LJ_TISNUM);
       if (op == BC_FORI) {
-       dasm_put(Dst, 15510);
+       dasm_put(Dst, 15511);
       } else if (op == BC_JFORI) {
-       dasm_put(Dst, 15515, -BCBIAS_J*4, BC_JLOOP);
+       dasm_put(Dst, 15516, -BCBIAS_J*4, BC_JLOOP);
       } else if (op == BC_IFORL) {
-       dasm_put(Dst, 15529);
+       dasm_put(Dst, 15530);
       } else {
-       dasm_put(Dst, 15525, BC_JLOOP);
+       dasm_put(Dst, 15526, BC_JLOOP);
       }
-      dasm_put(Dst, 15534);
+      dasm_put(Dst, 15535);
     } else if (!vk) {
-      dasm_put(Dst, 15541, LJ_TISNUM);
+      dasm_put(Dst, 15542, LJ_TISNUM);
     }
     if (!vk) {
-      dasm_put(Dst, 15547, LJ_TISNUM);
+      dasm_put(Dst, 15548, LJ_TISNUM);
     } else {
 #ifdef LUA_USE_ASSERT
-      dasm_put(Dst, 15561, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 15562, LJ_TISNUM, LJ_TISNUM);
 #endif
     }
-    dasm_put(Dst, 15580);
+    dasm_put(Dst, 15581);
     if (!vk) {
-      dasm_put(Dst, 15584, LJ_TISNUM);
+      dasm_put(Dst, 15585, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 15593);
+      dasm_put(Dst, 15594);
       if (vk) {
-       dasm_put(Dst, 15605);
+       dasm_put(Dst, 15606);
       } else {
-       dasm_put(Dst, 15624);
+       dasm_put(Dst, 15625);
       }
-      dasm_put(Dst, 15629);
+      dasm_put(Dst, 15630);
     } else {
-      dasm_put(Dst, 15642);
+      dasm_put(Dst, 15643);
       if (vk) {
-       dasm_put(Dst, 15648);
+       dasm_put(Dst, 15649);
       } else {
-       dasm_put(Dst, 15664);
+       dasm_put(Dst, 15665);
       }
-      dasm_put(Dst, 15672);
+      dasm_put(Dst, 15673);
       if (cmov) {
-      dasm_put(Dst, 10261);
+      dasm_put(Dst, 10262);
       } else {
-      dasm_put(Dst, 10267);
+      dasm_put(Dst, 10268);
       }
       if (!cmov) {
-       dasm_put(Dst, 15677);
+       dasm_put(Dst, 15678);
       }
     }
     if (op == BC_FORI) {
       if (LJ_DUALNUM) {
-       dasm_put(Dst, 15683);
+       dasm_put(Dst, 15684);
       } else {
-       dasm_put(Dst, 15688, -BCBIAS_J*4);
+       dasm_put(Dst, 15689, -BCBIAS_J*4);
       }
     } else if (op == BC_JFORI) {
-      dasm_put(Dst, 15698, -BCBIAS_J*4, BC_JLOOP);
+      dasm_put(Dst, 15699, -BCBIAS_J*4, BC_JLOOP);
     } else if (op == BC_IFORL) {
       if (LJ_DUALNUM) {
-       dasm_put(Dst, 15712);
+       dasm_put(Dst, 15713);
       } else {
-       dasm_put(Dst, 15717, -BCBIAS_J*4);
+       dasm_put(Dst, 15718, -BCBIAS_J*4);
       }
     } else {
-      dasm_put(Dst, 15708, BC_JLOOP);
+      dasm_put(Dst, 15709, BC_JLOOP);
     }
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 10190);
+      dasm_put(Dst, 10191);
     } else {
-      dasm_put(Dst, 10972);
+      dasm_put(Dst, 10973);
     }
     if (sse) {
-      dasm_put(Dst, 15727);
+      dasm_put(Dst, 15728);
     }
     break;
 
   case BC_ITERL:
 #if LJ_HASJIT
-    dasm_put(Dst, 15317, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
+    dasm_put(Dst, 15318, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -2902,33 +2901,33 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     break;
 #endif
   case BC_IITERL:
-    dasm_put(Dst, 15738, LJ_TNIL);
+    dasm_put(Dst, 15739, LJ_TNIL);
     if (op == BC_JITERL) {
-      dasm_put(Dst, 15753, BC_JLOOP);
+      dasm_put(Dst, 15754, BC_JLOOP);
     } else {
-      dasm_put(Dst, 15767, -BCBIAS_J*4);
+      dasm_put(Dst, 15768, -BCBIAS_J*4);
     }
-    dasm_put(Dst, 10304);
+    dasm_put(Dst, 10305);
     break;
 
   case BC_LOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 15317, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
+    dasm_put(Dst, 15318, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
   case BC_ILOOP:
-    dasm_put(Dst, 10306);
+    dasm_put(Dst, 10307);
     break;
 
   case BC_JLOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 15783, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L));
+    dasm_put(Dst, 15784, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L));
 #endif
     break;
 
   case BC_JMP:
-    dasm_put(Dst, 15824, -BCBIAS_J*4);
+    dasm_put(Dst, 15825, -BCBIAS_J*4);
     break;
 
   /* -- Function headers -------------------------------------------------- */
@@ -2942,7 +2941,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_FUNCF:
 #if LJ_HASJIT
-    dasm_put(Dst, 15850, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);
+    dasm_put(Dst, 15851, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);
 #endif
   case BC_FUNCV:  /* NYI: compiled vararg functions. */
     break;
@@ -2952,13 +2951,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     break;
 #endif
   case BC_IFUNCF:
-    dasm_put(Dst, 15871, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams));
+    dasm_put(Dst, 15872, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams));
     if (op == BC_JFUNCF) {
-      dasm_put(Dst, 15902, BC_JLOOP);
+      dasm_put(Dst, 15903, BC_JLOOP);
     } else {
-      dasm_put(Dst, 10306);
+      dasm_put(Dst, 10307);
     }
-    dasm_put(Dst, 15911, LJ_TNIL);
+    dasm_put(Dst, 15912, LJ_TNIL);
     break;
 
   case BC_JFUNCV:
@@ -2969,30 +2968,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     break;  /* NYI: compiled vararg functions. */
 
   case BC_IFUNCV:
-    dasm_put(Dst, 15933, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL);
+    dasm_put(Dst, 15934, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL);
     if (op == BC_JFUNCV) {
-      dasm_put(Dst, 15902, BC_JLOOP);
+      dasm_put(Dst, 15903, BC_JLOOP);
     } else {
-      dasm_put(Dst, 16030, -4+PC2PROTO(k));
+      dasm_put(Dst, 16031, -4+PC2PROTO(k));
     }
-    dasm_put(Dst, 16055, LJ_TNIL);
+    dasm_put(Dst, 16056, LJ_TNIL);
     break;
 
   case BC_FUNCC:
   case BC_FUNCCW:
-    dasm_put(Dst, 16077, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top));
+    dasm_put(Dst, 16078, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top));
     if (op == BC_FUNCC) {
       dasm_put(Dst, 2424);
     } else {
-      dasm_put(Dst, 16107);
+      dasm_put(Dst, 16108);
     }
-    dasm_put(Dst, 16115, DISPATCH_GL(vmstate), ~LJ_VMST_C);
+    dasm_put(Dst, 16116, DISPATCH_GL(vmstate), ~LJ_VMST_C);
     if (op == BC_FUNCC) {
-      dasm_put(Dst, 16125);
+      dasm_put(Dst, 16126);
     } else {
-      dasm_put(Dst, 16130, DISPATCH_GL(wrapf));
+      dasm_put(Dst, 16131, DISPATCH_GL(wrapf));
     }
-    dasm_put(Dst, 16136, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top));
+    dasm_put(Dst, 16137, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top));
     break;
 
   /* ---------------------------------------------------------------------- */
@@ -3020,7 +3019,7 @@ static int build_backend(BuildCtx *ctx)
 
   build_subroutines(ctx, cmov, sse);
 
-  dasm_put(Dst, 16162);
+  dasm_put(Dst, 16163);
   for (op = 0; op < BC__MAX; op++)
     build_ins(ctx, (BCOp)op, op, cmov, sse);
 
@@ -3030,6 +3029,7 @@ static int build_backend(BuildCtx *ctx)
 /* Emit pseudo frame-info for all assembler functions. */
 static void emit_asm_debug(BuildCtx *ctx)
 {
+  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);
 #if LJ_64
 #define SZPTR  "8"
 #define BSZPTR "3"
@@ -3063,22 +3063,49 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.long .LEFDE0-.LASFDE0\n"
        ".LASFDE0:\n"
        "\t.long .Lframe0\n"
-       "\t.long .Lbegin\n"
-       "\t.long %d\n"
-       "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
 #if LJ_64
+       "\t.quad .Lbegin\n"
+       "\t.quad %d\n"
+       "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
        "\t.byte 0x86\n\t.uleb128 0x2\n"        /* offset rbp */
        "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
        "\t.byte 0x8f\n\t.uleb128 0x4\n"        /* offset r15 */
        "\t.byte 0x8e\n\t.uleb128 0x5\n"        /* offset r14 */
 #else
+       "\t.long .Lbegin\n"
+       "\t.long %d\n"
+       "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
        "\t.byte 0x85\n\t.uleb128 0x2\n"        /* offset ebp */
        "\t.byte 0x87\n\t.uleb128 0x3\n"        /* offset edi */
        "\t.byte 0x86\n\t.uleb128 0x4\n"        /* offset esi */
        "\t.byte 0x83\n\t.uleb128 0x5\n"        /* offset ebx */
 #endif
        "\t.align " SZPTR "\n"
-       ".LEFDE0:\n\n", (int)ctx->codesz, CFRAME_SIZE);
+       ".LEFDE0:\n\n", fcofs, CFRAME_SIZE);
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".LSFDE1:\n"
+       "\t.long .LEFDE1-.LASFDE1\n"
+       ".LASFDE1:\n"
+       "\t.long .Lframe0\n"
+#if LJ_64
+       "\t.quad lj_vm_ffi_call\n"
+       "\t.quad %d\n"
+       "\t.byte 0xe\n\t.uleb128 16\n"          /* def_cfa_offset */
+       "\t.byte 0x86\n\t.uleb128 0x2\n"        /* offset rbp */
+       "\t.byte 0xd\n\t.uleb128 0x6\n"         /* def_cfa_register rbp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
+#else
+       "\t.long lj_vm_ffi_call\n"
+       "\t.long %d\n"
+       "\t.byte 0xe\n\t.uleb128 8\n"           /* def_cfa_offset */
+       "\t.byte 0x85\n\t.uleb128 0x2\n"        /* offset ebp */
+       "\t.byte 0xd\n\t.uleb128 0x5\n"         /* def_cfa_register ebp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset ebx */
+#endif
+       "\t.align " SZPTR "\n"
+       ".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
+#endif
 #if (defined(__sun__) && defined(__svr4__)) || defined(__solaris_)
     fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n");
 #else
@@ -3103,10 +3130,10 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.align " SZPTR "\n"
        ".LECIE1:\n\n");
     fprintf(ctx->fp,
-       ".LSFDE1:\n"
-       "\t.long .LEFDE1-.LASFDE1\n"
-       ".LASFDE1:\n"
-       "\t.long .LASFDE1-.Lframe1\n"
+       ".LSFDE2:\n"
+       "\t.long .LEFDE2-.LASFDE2\n"
+       ".LASFDE2:\n"
+       "\t.long .LASFDE2-.Lframe1\n"
        "\t.long .Lbegin-.\n"
        "\t.long %d\n"
        "\t.uleb128 0\n"                        /* augmentation length */
@@ -3123,7 +3150,46 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.byte 0x83\n\t.uleb128 0x5\n"        /* offset ebx */
 #endif
        "\t.align " SZPTR "\n"
-       ".LEFDE1:\n\n", (int)ctx->codesz, CFRAME_SIZE);
+       ".LEFDE2:\n\n", fcofs, CFRAME_SIZE);
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".Lframe2:\n"
+       "\t.long .LECIE2-.LSCIE2\n"
+       ".LSCIE2:\n"
+       "\t.long 0\n"
+       "\t.byte 0x1\n"
+       "\t.string \"zR\"\n"
+       "\t.uleb128 0x1\n"
+       "\t.sleb128 -" SZPTR "\n"
+       "\t.byte " REG_RA "\n"
+       "\t.uleb128 1\n"                        /* augmentation length */
+       "\t.byte 0x1b\n"                        /* pcrel|sdata4 */
+       "\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"
+       "\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"
+       "\t.align " SZPTR "\n"
+       ".LECIE2:\n\n");
+    fprintf(ctx->fp,
+       ".LSFDE3:\n"
+       "\t.long .LEFDE3-.LASFDE3\n"
+       ".LASFDE3:\n"
+       "\t.long .LASFDE3-.Lframe2\n"
+       "\t.long lj_vm_ffi_call-.\n"
+       "\t.long %d\n"
+       "\t.uleb128 0\n"                        /* augmentation length */
+#if LJ_64
+       "\t.byte 0xe\n\t.uleb128 16\n"          /* def_cfa_offset */
+       "\t.byte 0x86\n\t.uleb128 0x2\n"        /* offset rbp */
+       "\t.byte 0xd\n\t.uleb128 0x6\n"         /* def_cfa_register rbp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
+#else
+       "\t.byte 0xe\n\t.uleb128 8\n"           /* def_cfa_offset */
+       "\t.byte 0x85\n\t.uleb128 0x2\n"        /* offset ebp */
+       "\t.byte 0xd\n\t.uleb128 0x5\n"         /* def_cfa_register ebp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset ebx */
+#endif
+       "\t.align " SZPTR "\n"
+       ".LEFDE3:\n\n", (int)ctx->codesz - fcofs);
+#endif
     break;
   case BUILD_coffasm:
     fprintf(ctx->fp, "\t.section .eh_frame,\"dr\"\n");
@@ -3174,6 +3240,9 @@ static void emit_asm_debug(BuildCtx *ctx)
   ** Or a linker. Or a plastic case. But I digress.
   */
   case BUILD_machasm: {
+#if LJ_HASFFI
+    int fcsize = 0;
+#endif
     int i;
     fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n");
     fprintf(ctx->fp,
@@ -3205,6 +3274,9 @@ static void emit_asm_debug(BuildCtx *ctx)
       const char *name = ctx->sym[i].name;
       int32_t size = ctx->sym[i+1].ofs - ctx->sym[i].ofs;
       if (size == 0) continue;
+#if LJ_HASFFI
+      if (!strcmp(name, "_lj_vm_ffi_call")) { fcsize = size; continue; }
+#endif
       fprintf(ctx->fp,
          "%s.eh:\n"
          "LSFDE%d:\n"
@@ -3214,23 +3286,72 @@ static void emit_asm_debug(BuildCtx *ctx)
          "\t.long LASFDE%d-EH_frame1\n"
          "\t.long %s-.\n"
          "\t.long %d\n"
-         "\t.byte 0\n"                 /* augmentation length */
+         "\t.byte 0\n"                         /* augmentation length */
          "\t.byte 0xe\n\t.byte %d\n"           /* def_cfa_offset */
 #if LJ_64
-         "\t.byte 0x86\n\t.byte 0x2\n" /* offset rbp */
-         "\t.byte 0x83\n\t.byte 0x3\n" /* offset rbx */
-         "\t.byte 0x8f\n\t.byte 0x4\n" /* offset r15 */
-         "\t.byte 0x8e\n\t.byte 0x5\n" /* offset r14 */
+         "\t.byte 0x86\n\t.byte 0x2\n"         /* offset rbp */
+         "\t.byte 0x83\n\t.byte 0x3\n"         /* offset rbx */
+         "\t.byte 0x8f\n\t.byte 0x4\n"         /* offset r15 */
+         "\t.byte 0x8e\n\t.byte 0x5\n"         /* offset r14 */
 #else
-         "\t.byte 0x84\n\t.byte 0x2\n" /* offset ebp (4 for MACH-O)*/
-         "\t.byte 0x87\n\t.byte 0x3\n" /* offset edi */
-         "\t.byte 0x86\n\t.byte 0x4\n" /* offset esi */
-         "\t.byte 0x83\n\t.byte 0x5\n" /* offset ebx */
+         "\t.byte 0x84\n\t.byte 0x2\n"         /* offset ebp (4 for MACH-O)*/
+         "\t.byte 0x87\n\t.byte 0x3\n"         /* offset edi */
+         "\t.byte 0x86\n\t.byte 0x4\n"         /* offset esi */
+         "\t.byte 0x83\n\t.byte 0x5\n"         /* offset ebx */
 #endif
          "\t.align " BSZPTR "\n"
          "LEFDE%d:\n\n",
          name, i, i, i, i, i, i, i, name, size, CFRAME_SIZE, i);
     }
+#if LJ_HASFFI
+    if (fcsize) {
+      fprintf(ctx->fp,
+         "EH_frame2:\n"
+         "\t.set L$set$y,LECIEY-LSCIEY\n"
+         "\t.long L$set$y\n"
+         "LSCIEY:\n"
+         "\t.long 0\n"
+         "\t.byte 0x1\n"
+         "\t.ascii \"zR\\0\"\n"
+         "\t.byte 0x1\n"
+         "\t.byte 128-" SZPTR "\n"
+         "\t.byte " REG_RA "\n"
+         "\t.byte 1\n"                         /* augmentation length */
+#if LJ_64
+         "\t.byte 0x1b\n"                      /* pcrel|sdata4 */
+         "\t.byte 0xc\n\t.byte " REG_SP "\n\t.byte " SZPTR "\n"
+#else
+         "\t.byte 0x1b\n"                      /* pcrel|sdata4 */
+         "\t.byte 0xc\n\t.byte 0x5\n\t.byte 0x4\n"  /* esp=5 on 32 bit MACH. */
+#endif
+         "\t.byte 0x80+" REG_RA "\n\t.byte 0x1\n"
+         "\t.align " BSZPTR "\n"
+         "LECIEY:\n\n");
+      fprintf(ctx->fp,
+         "_lj_vm_ffi_call.eh:\n"
+         "LSFDEY:\n"
+         "\t.set L$set$yy,LEFDEY-LASFDEY\n"
+         "\t.long L$set$yy\n"
+         "LASFDEY:\n"
+         "\t.long LASFDEY-EH_frame2\n"
+         "\t.long _lj_vm_ffi_call-.\n"
+         "\t.long %d\n"
+         "\t.byte 0\n"                         /* augmentation length */
+#if LJ_64
+         "\t.byte 0xe\n\t.byte 16\n"           /* def_cfa_offset */
+         "\t.byte 0x86\n\t.byte 0x2\n"         /* offset rbp */
+         "\t.byte 0xd\n\t.uleb128 0x6\n"       /* def_cfa_register rbp */
+         "\t.byte 0x83\n\t.byte 0x3\n"         /* offset rbx */
+#else
+         "\t.byte 0xe\n\t.byte 8\n"            /* def_cfa_offset */
+         "\t.byte 0x84\n\t.byte 0x2\n"         /* offset ebp (4 for MACH-O)*/
+         "\t.byte 0xd\n\t.uleb128 0x4\n"       /* def_cfa_register ebp */
+         "\t.byte 0x83\n\t.byte 0x3\n"         /* offset ebx */
+#endif
+         "\t.align " BSZPTR "\n"
+         "LEFDEY:\n\n", fcsize);
+    }
+#endif
 #if LJ_64
     fprintf(ctx->fp, "\t.subsections_via_symbols\n");
 #else
index a3c8ed74ca5c3505d0f396ec7bdcecaa1d62c180..b051974cccad0f06cb78fe1a2a97fddb7607baec 100644 (file)
@@ -12,7 +12,7 @@
 #define DASM_SECTION_CODE_OP   0
 #define DASM_SECTION_CODE_SUB  1
 #define DASM_MAXSECTION                2
-static const unsigned char build_actionlist[16019] = {
+static const unsigned char build_actionlist[16020] = {
   254,1,248,10,252,247,198,237,15,132,244,11,131,230,252,248,41,252,242,72,
   141,76,49,252,248,139,114,252,252,199,68,10,4,237,248,12,131,192,1,137,68,
   36,84,252,247,198,237,15,132,244,13,248,14,129,252,246,239,252,247,198,237,
@@ -490,18 +490,18 @@ static const unsigned char build_actionlist[16019] = {
   252,233,218,209,221,217,195,255,221,225,223,224,252,246,196,1,15,132,244,
   248,217,201,248,2,221,216,195,248,1,221,225,223,224,252,246,196,1,15,133,
   244,248,217,201,248,2,221,216,195,255,248,163,137,200,86,72,137,214,83,15,
-  162,137,6,137,94,4,137,78,8,137,86,12,91,94,195,248,164,255,85,72,137,229,
-  83,72,137,203,139,131,233,72,41,196,255,15,182,139,233,131,252,233,1,15,136,
-  244,248,248,1,72,139,132,253,203,233,72,137,132,253,204,233,131,252,233,1,
-  15,137,244,1,248,2,15,182,131,233,72,139,139,233,72,139,147,233,76,139,131,
-  233,76,139,139,233,133,192,15,132,244,251,15,40,131,233,15,40,139,233,15,
-  40,147,233,15,40,155,233,248,5,255,252,255,147,233,72,137,131,233,15,41,131,
-  233,255,72,139,93,252,248,201,195,255,248,165,255,249,255,129,124,253,202,
-  4,239,15,133,244,253,129,124,253,194,4,239,15,133,244,254,139,44,202,131,
-  198,4,59,44,194,255,15,141,244,255,255,15,140,244,255,255,15,143,244,255,
-  255,15,142,244,255,255,248,6,15,183,70,252,254,141,180,253,134,233,248,9,
-  139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,7,
-  15,135,244,43,129,124,253,194,4,239,15,130,244,247,15,133,244,43,255,252,
+  162,137,6,137,94,4,137,78,8,137,86,12,91,94,195,248,164,255,204,248,165,255,
+  85,72,137,229,83,72,137,203,139,131,233,72,41,196,255,15,182,139,233,131,
+  252,233,1,15,136,244,248,248,1,72,139,132,253,203,233,72,137,132,253,204,
+  233,131,252,233,1,15,137,244,1,248,2,15,182,131,233,72,139,139,233,72,139,
+  147,233,76,139,131,233,76,139,139,233,133,192,15,132,244,251,15,40,131,233,
+  15,40,139,233,15,40,147,233,15,40,155,233,248,5,255,252,255,147,233,72,137,
+  131,233,15,41,131,233,255,72,139,93,252,248,201,195,255,249,255,129,124,253,
+  202,4,239,15,133,244,253,129,124,253,194,4,239,15,133,244,254,139,44,202,
+  131,198,4,59,44,194,255,15,141,244,255,255,15,140,244,255,255,15,143,244,
+  255,255,15,142,244,255,255,248,6,15,183,70,252,254,141,180,253,134,233,248,
+  9,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,
+  7,15,135,244,43,129,124,253,194,4,239,15,130,244,247,15,133,244,43,255,252,
   242,15,42,4,194,252,233,244,248,255,221,4,202,219,4,194,252,233,244,249,255,
   248,8,15,135,244,43,255,252,242,15,42,12,202,252,242,15,16,4,194,131,198,
   4,102,15,46,193,255,15,134,244,9,255,15,135,244,9,255,15,130,244,9,255,15,
@@ -749,7 +749,7 @@ static const unsigned char build_actionlist[16019] = {
   252,237,129,229,239,102,129,172,253,43,233,238,15,130,244,148,255,141,12,
   202,255,129,121,253,4,239,15,133,244,255,255,129,121,253,12,239,15,133,244,
   60,129,121,253,20,239,15,133,244,60,139,41,131,121,16,0,15,140,244,251,255,
-  129,121,253,12,239,15,133,244,165,129,121,253,20,239,15,133,244,165,255,139,
+  129,121,253,12,239,15,133,244,164,129,121,253,20,239,15,133,244,164,255,139,
   105,16,133,252,237,15,136,244,251,3,41,15,128,244,247,137,41,255,59,105,8,
   199,65,28,237,137,105,24,255,15,142,244,253,248,1,248,6,141,180,253,134,233,
   255,141,180,253,134,233,15,183,70,252,254,15,142,245,248,1,248,6,255,15,143,
@@ -758,7 +758,7 @@ static const unsigned char build_actionlist[16019] = {
   41,255,15,141,244,7,255,141,180,253,134,233,15,183,70,252,254,15,141,245,
   255,15,140,244,7,255,252,233,244,6,248,9,255,129,121,253,4,239,255,15,131,
   244,60,129,121,253,12,239,15,131,244,60,255,129,121,253,12,239,15,131,244,
-  165,129,121,253,20,239,15,131,244,165,255,139,105,20,255,129,252,253,239,
+  164,129,121,253,20,239,15,131,244,164,255,139,105,20,255,129,252,253,239,
   15,131,244,60,255,252,242,15,16,1,252,242,15,16,73,8,255,252,242,15,88,65,
   16,252,242,15,17,1,133,252,237,15,136,244,249,255,15,140,244,249,255,102,
   15,46,200,248,1,252,242,15,17,65,24,255,221,65,8,221,1,255,220,65,16,221,
@@ -947,8 +947,8 @@ enum {
   GLOB_vm_foldfpm,
   GLOB_vm_foldarith,
   GLOB_vm_cpuid,
-  GLOB_vm_ffi_call,
   GLOB_assert_bad_for_arg_type,
+  GLOB_vm_ffi_call,
   GLOB_BC_MODVN_Z,
   GLOB_BC_TGETS_Z,
   GLOB_BC_TSETS_Z,
@@ -1109,8 +1109,8 @@ static const char *const globnames[] = {
   "vm_foldfpm",
   "vm_foldarith",
   "vm_cpuid",
-  "vm_ffi_call@4",
   "assert_bad_for_arg_type",
+  "vm_ffi_call@4",
   "BC_MODVN_Z",
   "BC_TGETS_Z",
   "BC_TSETS_Z",
@@ -1832,29 +1832,28 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
     dasm_put(Dst, 9398);
   }
   dasm_put(Dst, 9816);
+#ifdef LUA_USE_ASSERT
+  dasm_put(Dst, 9400);
+#endif
+  dasm_put(Dst, 9844);
 #if LJ_HASFFI
 #define DtE(_V) (int)(ptrdiff_t)&(((CCallState *)0)_V)
-  dasm_put(Dst, 9844, DtE(->spadj));
+  dasm_put(Dst, 9848, DtE(->spadj));
 #if LJ_TARGET_WINDOWS
 #endif
-  dasm_put(Dst, 9859, DtE(->nsp), offsetof(CCallState, stack), CCALL_SPS_EXTRA*8, DtE(->nfpr), DtE(->gpr[0]), DtE(->gpr[1]), DtE(->gpr[2]), DtE(->gpr[3]), DtE(->fpr[0]), DtE(->fpr[1]), DtE(->fpr[2]), DtE(->fpr[3]));
-  dasm_put(Dst, 9940, DtE(->func), DtE(->gpr[0]), DtE(->fpr[0]));
+  dasm_put(Dst, 9863, DtE(->nsp), offsetof(CCallState, stack), CCALL_SPS_EXTRA*8, DtE(->nfpr), DtE(->gpr[0]), DtE(->gpr[1]), DtE(->gpr[2]), DtE(->gpr[3]), DtE(->fpr[0]), DtE(->fpr[1]), DtE(->fpr[2]), DtE(->fpr[3]));
+  dasm_put(Dst, 9944, DtE(->func), DtE(->gpr[0]), DtE(->fpr[0]));
 #if LJ_TARGET_WINDOWS
 #endif
-  dasm_put(Dst, 9953);
-#endif
-  dasm_put(Dst, 9961);
-#ifdef LUA_USE_ASSERT
-  dasm_put(Dst, 9400);
+  dasm_put(Dst, 9957);
 #endif
-  dasm_put(Dst, 9400);
 }
 
 /* Generate the code for a single instruction. */
 static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 {
   int vk = 0;
-  dasm_put(Dst, 9964, defop);
+  dasm_put(Dst, 9965, defop);
 
   switch (op) {
 
@@ -1865,145 +1864,145 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 9966, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 9967, LJ_TISNUM, LJ_TISNUM);
       switch (op) {
       case BC_ISLT:
-      dasm_put(Dst, 9996);
+      dasm_put(Dst, 9997);
       break;
       case BC_ISGE:
-      dasm_put(Dst, 10001);
+      dasm_put(Dst, 10002);
       break;
       case BC_ISLE:
-      dasm_put(Dst, 10006);
+      dasm_put(Dst, 10007);
       break;
       case BC_ISGT:
-      dasm_put(Dst, 10011);
+      dasm_put(Dst, 10012);
       break;
       default: break;  /* Shut up GCC. */
       }
-      dasm_put(Dst, 10016, -BCBIAS_J*4, LJ_TISNUM);
+      dasm_put(Dst, 10017, -BCBIAS_J*4, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 10070);
+       dasm_put(Dst, 10071);
       } else {
-       dasm_put(Dst, 10081);
+       dasm_put(Dst, 10082);
       }
-      dasm_put(Dst, 10092);
+      dasm_put(Dst, 10093);
       if (sse) {
-       dasm_put(Dst, 10099);
+       dasm_put(Dst, 10100);
        switch (op) {
        case BC_ISLT:
-       dasm_put(Dst, 10119);
+       dasm_put(Dst, 10120);
        break;
        case BC_ISGE:
-       dasm_put(Dst, 10124);
+       dasm_put(Dst, 10125);
        break;
        case BC_ISLE:
-       dasm_put(Dst, 10129);
+       dasm_put(Dst, 10130);
        break;
        case BC_ISGT:
-       dasm_put(Dst, 10134);
+       dasm_put(Dst, 10135);
        break;
        default: break;  /* Shut up GCC. */
        }
-       dasm_put(Dst, 10139);
+       dasm_put(Dst, 10140);
       } else {
-       dasm_put(Dst, 10144);
+       dasm_put(Dst, 10145);
       }
     } else {
-      dasm_put(Dst, 10152, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 10153, LJ_TISNUM, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 10173);
+      dasm_put(Dst, 10174);
     } else {
-      dasm_put(Dst, 10194);
+      dasm_put(Dst, 10195);
       if (cmov) {
-      dasm_put(Dst, 10210);
+      dasm_put(Dst, 10211);
       } else {
-      dasm_put(Dst, 10216);
+      dasm_put(Dst, 10217);
       }
     }
     if (LJ_DUALNUM) {
       switch (op) {
       case BC_ISLT:
-      dasm_put(Dst, 10119);
+      dasm_put(Dst, 10120);
       break;
       case BC_ISGE:
-      dasm_put(Dst, 10124);
+      dasm_put(Dst, 10125);
       break;
       case BC_ISLE:
-      dasm_put(Dst, 10129);
+      dasm_put(Dst, 10130);
       break;
       case BC_ISGT:
-      dasm_put(Dst, 10134);
+      dasm_put(Dst, 10135);
       break;
       default: break;  /* Shut up GCC. */
       }
-      dasm_put(Dst, 10139);
+      dasm_put(Dst, 10140);
     } else {
       switch (op) {
       case BC_ISLT:
-      dasm_put(Dst, 10223);
+      dasm_put(Dst, 10224);
       break;
       case BC_ISGE:
-      dasm_put(Dst, 10228);
+      dasm_put(Dst, 10229);
       break;
       case BC_ISLE:
-      dasm_put(Dst, 10233);
+      dasm_put(Dst, 10234);
       break;
       case BC_ISGT:
-      dasm_put(Dst, 10238);
+      dasm_put(Dst, 10239);
       break;
       default: break;  /* Shut up GCC. */
       }
-      dasm_put(Dst, 10243, -BCBIAS_J*4);
+      dasm_put(Dst, 10244, -BCBIAS_J*4);
     }
     break;
 
   case BC_ISEQV: case BC_ISNEV:
     vk = op == BC_ISEQV;
-    dasm_put(Dst, 10275);
+    dasm_put(Dst, 10276);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 10283, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 10284, LJ_TISNUM, LJ_TISNUM);
       if (vk) {
-       dasm_put(Dst, 10308);
+       dasm_put(Dst, 10309);
       } else {
-       dasm_put(Dst, 10313);
+       dasm_put(Dst, 10314);
       }
-      dasm_put(Dst, 10318, -BCBIAS_J*4, LJ_TISNUM);
+      dasm_put(Dst, 10319, -BCBIAS_J*4, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 10370);
+       dasm_put(Dst, 10371);
       } else {
-       dasm_put(Dst, 10377);
+       dasm_put(Dst, 10378);
       }
-      dasm_put(Dst, 10381);
+      dasm_put(Dst, 10382);
       if (sse) {
-       dasm_put(Dst, 10392);
+       dasm_put(Dst, 10393);
       } else {
-       dasm_put(Dst, 10404);
+       dasm_put(Dst, 10405);
       }
-      dasm_put(Dst, 10411);
+      dasm_put(Dst, 10412);
     } else {
-      dasm_put(Dst, 10416, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 10417, LJ_TISNUM, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 10435);
+      dasm_put(Dst, 10436);
     } else {
-      dasm_put(Dst, 10453);
+      dasm_put(Dst, 10454);
       if (cmov) {
-      dasm_put(Dst, 10210);
+      dasm_put(Dst, 10211);
       } else {
-      dasm_put(Dst, 10216);
+      dasm_put(Dst, 10217);
       }
     }
   iseqne_fp:
     if (vk) {
-      dasm_put(Dst, 10466);
+      dasm_put(Dst, 10467);
     } else {
-      dasm_put(Dst, 10475);
+      dasm_put(Dst, 10476);
     }
   iseqne_end:
     if (vk) {
-      dasm_put(Dst, 10484, -BCBIAS_J*4);
+      dasm_put(Dst, 10485, -BCBIAS_J*4);
       if (!LJ_HASFFI) {
        dasm_put(Dst, 4629);
       }
@@ -2011,156 +2010,156 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
       if (!LJ_HASFFI) {
        dasm_put(Dst, 4629);
       }
-      dasm_put(Dst, 10499, -BCBIAS_J*4);
+      dasm_put(Dst, 10500, -BCBIAS_J*4);
     }
     if (LJ_DUALNUM && (op == BC_ISEQV || op == BC_ISNEV ||
                       op == BC_ISEQN || op == BC_ISNEN)) {
-      dasm_put(Dst, 10514);
+      dasm_put(Dst, 10515);
     } else {
-      dasm_put(Dst, 10255);
+      dasm_put(Dst, 10256);
     }
     if (op == BC_ISEQV || op == BC_ISNEV) {
-      dasm_put(Dst, 9937);
+      dasm_put(Dst, 9941);
       if (LJ_HASFFI) {
-       dasm_put(Dst, 10519, LJ_TCDATA, LJ_TCDATA);
+       dasm_put(Dst, 10520, LJ_TCDATA, LJ_TCDATA);
       }
-      dasm_put(Dst, 10538, LJ_TISPRI, LJ_TISTABUD, LJ_TUDATA, Dt6(->metatable), Dt6(->nomm), 1<<MM_eq);
+      dasm_put(Dst, 10539, LJ_TISPRI, LJ_TISTABUD, LJ_TUDATA, Dt6(->metatable), Dt6(->nomm), 1<<MM_eq);
       if (vk) {
-       dasm_put(Dst, 10602);
+       dasm_put(Dst, 10603);
       } else {
-       dasm_put(Dst, 10606);
+       dasm_put(Dst, 10607);
       }
-      dasm_put(Dst, 10612);
+      dasm_put(Dst, 10613);
     } else if (LJ_HASFFI) {
-      dasm_put(Dst, 10617, LJ_TCDATA);
+      dasm_put(Dst, 10618, LJ_TCDATA);
       if (LJ_DUALNUM && vk) {
-       dasm_put(Dst, 10624);
+       dasm_put(Dst, 10625);
       } else {
-       dasm_put(Dst, 10597);
+       dasm_put(Dst, 10598);
       }
-      dasm_put(Dst, 10629);
+      dasm_put(Dst, 10630);
     }
     break;
   case BC_ISEQS: case BC_ISNES:
     vk = op == BC_ISEQS;
-    dasm_put(Dst, 10634, LJ_TSTR);
+    dasm_put(Dst, 10635, LJ_TSTR);
   iseqne_test:
     if (vk) {
-      dasm_put(Dst, 10470);
+      dasm_put(Dst, 10471);
     } else {
       dasm_put(Dst, 765);
     }
     goto iseqne_end;
   case BC_ISEQN: case BC_ISNEN:
     vk = op == BC_ISEQN;
-    dasm_put(Dst, 10660);
+    dasm_put(Dst, 10661);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 10668, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 10669, LJ_TISNUM, LJ_TISNUM);
       if (vk) {
-       dasm_put(Dst, 10308);
+       dasm_put(Dst, 10309);
       } else {
-       dasm_put(Dst, 10313);
+       dasm_put(Dst, 10314);
       }
-      dasm_put(Dst, 10693, -BCBIAS_J*4, LJ_TISNUM);
+      dasm_put(Dst, 10694, -BCBIAS_J*4, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 10741);
+       dasm_put(Dst, 10742);
       } else {
-       dasm_put(Dst, 10748);
+       dasm_put(Dst, 10749);
       }
-      dasm_put(Dst, 10752);
+      dasm_put(Dst, 10753);
       if (sse) {
-       dasm_put(Dst, 10759);
+       dasm_put(Dst, 10760);
       } else {
-       dasm_put(Dst, 10771);
+       dasm_put(Dst, 10772);
       }
-      dasm_put(Dst, 10411);
+      dasm_put(Dst, 10412);
     } else {
-      dasm_put(Dst, 10778, LJ_TISNUM);
+      dasm_put(Dst, 10779, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 10787);
+      dasm_put(Dst, 10788);
     } else {
-      dasm_put(Dst, 10805);
+      dasm_put(Dst, 10806);
       if (cmov) {
-      dasm_put(Dst, 10210);
+      dasm_put(Dst, 10211);
       } else {
-      dasm_put(Dst, 10216);
+      dasm_put(Dst, 10217);
       }
     }
     goto iseqne_fp;
   case BC_ISEQP: case BC_ISNEP:
     vk = op == BC_ISEQP;
-    dasm_put(Dst, 10818);
+    dasm_put(Dst, 10819);
     if (!LJ_HASFFI) goto iseqne_test;
     if (vk) {
-      dasm_put(Dst, 10832, -BCBIAS_J*4, LJ_TCDATA);
+      dasm_put(Dst, 10833, -BCBIAS_J*4, LJ_TCDATA);
     } else {
-      dasm_put(Dst, 10882, LJ_TCDATA, -BCBIAS_J*4);
+      dasm_put(Dst, 10883, LJ_TCDATA, -BCBIAS_J*4);
     }
     break;
 
   /* -- Unary test and copy ops ------------------------------------------- */
 
   case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:
-    dasm_put(Dst, 10926, LJ_TISTRUECOND);
+    dasm_put(Dst, 10927, LJ_TISTRUECOND);
     if (op == BC_IST || op == BC_ISTC) {
-      dasm_put(Dst, 10238);
+      dasm_put(Dst, 10239);
     } else {
-      dasm_put(Dst, 10233);
+      dasm_put(Dst, 10234);
     }
     if (op == BC_ISTC || op == BC_ISFC) {
-      dasm_put(Dst, 10938);
+      dasm_put(Dst, 10939);
     }
-    dasm_put(Dst, 10243, -BCBIAS_J*4);
+    dasm_put(Dst, 10244, -BCBIAS_J*4);
     break;
 
   /* -- Unary ops --------------------------------------------------------- */
 
   case BC_MOV:
-    dasm_put(Dst, 10949);
+    dasm_put(Dst, 10950);
     break;
   case BC_NOT:
-    dasm_put(Dst, 10977, LJ_TISTRUECOND, LJ_TTRUE);
+    dasm_put(Dst, 10978, LJ_TISTRUECOND, LJ_TTRUE);
     break;
   case BC_UNM:
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 11013, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 11014, LJ_TISNUM, LJ_TISNUM);
     } else {
-      dasm_put(Dst, 11090, LJ_TISNUM);
+      dasm_put(Dst, 11091, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 11101, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32));
+      dasm_put(Dst, 11102, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32));
     } else {
-      dasm_put(Dst, 11126);
+      dasm_put(Dst, 11127);
     }
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 10514);
+      dasm_put(Dst, 10515);
     } else {
-      dasm_put(Dst, 10255);
+      dasm_put(Dst, 10256);
     }
     break;
   case BC_LEN:
-    dasm_put(Dst, 11135, LJ_TSTR);
+    dasm_put(Dst, 11136, LJ_TSTR);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 11149, Dt5(->len), LJ_TISNUM);
+      dasm_put(Dst, 11150, Dt5(->len), LJ_TISNUM);
     } else if (sse) {
-      dasm_put(Dst, 11163, Dt5(->len));
+      dasm_put(Dst, 11164, Dt5(->len));
     } else {
-      dasm_put(Dst, 11181, Dt5(->len));
+      dasm_put(Dst, 11182, Dt5(->len));
     }
-    dasm_put(Dst, 11190, LJ_TTAB);
+    dasm_put(Dst, 11191, LJ_TTAB);
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
-    dasm_put(Dst, 11225, Dt6(->metatable));
+    dasm_put(Dst, 11226, Dt6(->metatable));
 #endif
-    dasm_put(Dst, 11239);
+    dasm_put(Dst, 11240);
     if (LJ_DUALNUM) {
     } else if (sse) {
-      dasm_put(Dst, 11248);
+      dasm_put(Dst, 11249);
     } else {
     }
-    dasm_put(Dst, 11254);
+    dasm_put(Dst, 11255);
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
-    dasm_put(Dst, 11267, Dt6(->nomm), 1<<MM_len);
+    dasm_put(Dst, 11268, Dt6(->nomm), 1<<MM_len);
 #endif
     break;
 
@@ -2169,603 +2168,603 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11283);
+    dasm_put(Dst, 11284);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11291, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11292, LJ_TISNUM, LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 11324, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11325, LJ_TISNUM, LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 11357, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11358, LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 11390, LJ_TISNUM);
+    dasm_put(Dst, 11391, LJ_TISNUM);
     if (vk == 1) {
-    dasm_put(Dst, 11159);
+    dasm_put(Dst, 11160);
     } else {
-    dasm_put(Dst, 10945);
+    dasm_put(Dst, 10946);
     }
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     } else {
-    dasm_put(Dst, 11283);
+    dasm_put(Dst, 11284);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11396, LJ_TISNUM);
+    dasm_put(Dst, 11397, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11408, LJ_TISNUM);
+    dasm_put(Dst, 11409, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11419);
+    dasm_put(Dst, 11420);
     } else {
-    dasm_put(Dst, 11433);
+    dasm_put(Dst, 11434);
     }
       break;
     case 1:
-    dasm_put(Dst, 11441, LJ_TISNUM);
+    dasm_put(Dst, 11442, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11453, LJ_TISNUM);
+    dasm_put(Dst, 11454, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11464);
+    dasm_put(Dst, 11465);
     } else {
-    dasm_put(Dst, 11478);
+    dasm_put(Dst, 11479);
     }
       break;
     default:
-    dasm_put(Dst, 11486, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11487, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 11508);
+    dasm_put(Dst, 11509);
     } else {
-    dasm_put(Dst, 11522);
+    dasm_put(Dst, 11523);
     }
       break;
     }
     if (sse) {
-    dasm_put(Dst, 11119);
+    dasm_put(Dst, 11120);
     } else {
-    dasm_put(Dst, 11131);
+    dasm_put(Dst, 11132);
     }
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     }
     break;
   case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11283);
+    dasm_put(Dst, 11284);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11530, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11531, LJ_TISNUM, LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 11563, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11564, LJ_TISNUM, LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 11596, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11597, LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 11390, LJ_TISNUM);
+    dasm_put(Dst, 11391, LJ_TISNUM);
     if (vk == 1) {
-    dasm_put(Dst, 11159);
+    dasm_put(Dst, 11160);
     } else {
-    dasm_put(Dst, 10945);
+    dasm_put(Dst, 10946);
     }
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     } else {
-    dasm_put(Dst, 11283);
+    dasm_put(Dst, 11284);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11396, LJ_TISNUM);
+    dasm_put(Dst, 11397, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11408, LJ_TISNUM);
+    dasm_put(Dst, 11409, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11629);
+    dasm_put(Dst, 11630);
     } else {
-    dasm_put(Dst, 11643);
+    dasm_put(Dst, 11644);
     }
       break;
     case 1:
-    dasm_put(Dst, 11441, LJ_TISNUM);
+    dasm_put(Dst, 11442, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11453, LJ_TISNUM);
+    dasm_put(Dst, 11454, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11651);
+    dasm_put(Dst, 11652);
     } else {
-    dasm_put(Dst, 11665);
+    dasm_put(Dst, 11666);
     }
       break;
     default:
-    dasm_put(Dst, 11486, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11487, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 11673);
+    dasm_put(Dst, 11674);
     } else {
-    dasm_put(Dst, 11687);
+    dasm_put(Dst, 11688);
     }
       break;
     }
     if (sse) {
-    dasm_put(Dst, 11119);
+    dasm_put(Dst, 11120);
     } else {
-    dasm_put(Dst, 11131);
+    dasm_put(Dst, 11132);
     }
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     }
     break;
   case BC_MULVN: case BC_MULNV: case BC_MULVV:
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11283);
+    dasm_put(Dst, 11284);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11695, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11696, LJ_TISNUM, LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 11729, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11730, LJ_TISNUM, LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 11763, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11764, LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 11390, LJ_TISNUM);
+    dasm_put(Dst, 11391, LJ_TISNUM);
     if (vk == 1) {
-    dasm_put(Dst, 11159);
+    dasm_put(Dst, 11160);
     } else {
-    dasm_put(Dst, 10945);
+    dasm_put(Dst, 10946);
     }
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     } else {
-    dasm_put(Dst, 11283);
+    dasm_put(Dst, 11284);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11396, LJ_TISNUM);
+    dasm_put(Dst, 11397, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11408, LJ_TISNUM);
+    dasm_put(Dst, 11409, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11797);
+    dasm_put(Dst, 11798);
     } else {
-    dasm_put(Dst, 11811);
+    dasm_put(Dst, 11812);
     }
       break;
     case 1:
-    dasm_put(Dst, 11441, LJ_TISNUM);
+    dasm_put(Dst, 11442, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11453, LJ_TISNUM);
+    dasm_put(Dst, 11454, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11819);
+    dasm_put(Dst, 11820);
     } else {
-    dasm_put(Dst, 11833);
+    dasm_put(Dst, 11834);
     }
       break;
     default:
-    dasm_put(Dst, 11486, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11487, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 11841);
+    dasm_put(Dst, 11842);
     } else {
-    dasm_put(Dst, 11855);
+    dasm_put(Dst, 11856);
     }
       break;
     }
     if (sse) {
-    dasm_put(Dst, 11119);
+    dasm_put(Dst, 11120);
     } else {
-    dasm_put(Dst, 11131);
+    dasm_put(Dst, 11132);
     }
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     }
     break;
   case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:
-    dasm_put(Dst, 11283);
+    dasm_put(Dst, 11284);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11396, LJ_TISNUM);
+    dasm_put(Dst, 11397, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11408, LJ_TISNUM);
+    dasm_put(Dst, 11409, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11863);
+    dasm_put(Dst, 11864);
     } else {
-    dasm_put(Dst, 11877);
+    dasm_put(Dst, 11878);
     }
       break;
     case 1:
-    dasm_put(Dst, 11441, LJ_TISNUM);
+    dasm_put(Dst, 11442, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11453, LJ_TISNUM);
+    dasm_put(Dst, 11454, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11885);
+    dasm_put(Dst, 11886);
     } else {
-    dasm_put(Dst, 11899);
+    dasm_put(Dst, 11900);
     }
       break;
     default:
-    dasm_put(Dst, 11486, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11487, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 11907);
+    dasm_put(Dst, 11908);
     } else {
-    dasm_put(Dst, 11921);
+    dasm_put(Dst, 11922);
     }
       break;
     }
     if (sse) {
-    dasm_put(Dst, 11119);
+    dasm_put(Dst, 11120);
     } else {
-    dasm_put(Dst, 11131);
+    dasm_put(Dst, 11132);
     }
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     break;
   case BC_MODVN:
-    dasm_put(Dst, 11283);
+    dasm_put(Dst, 11284);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11396, LJ_TISNUM);
+    dasm_put(Dst, 11397, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11408, LJ_TISNUM);
+    dasm_put(Dst, 11409, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11929);
+    dasm_put(Dst, 11930);
     } else {
-    dasm_put(Dst, 11943);
+    dasm_put(Dst, 11944);
     }
       break;
     case 1:
-    dasm_put(Dst, 11441, LJ_TISNUM);
+    dasm_put(Dst, 11442, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11453, LJ_TISNUM);
+    dasm_put(Dst, 11454, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11951);
+    dasm_put(Dst, 11952);
     } else {
-    dasm_put(Dst, 11965);
+    dasm_put(Dst, 11966);
     }
       break;
     default:
-    dasm_put(Dst, 11486, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11487, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 11973);
+    dasm_put(Dst, 11974);
     } else {
-    dasm_put(Dst, 11987);
+    dasm_put(Dst, 11988);
     }
       break;
     }
-    dasm_put(Dst, 11995);
+    dasm_put(Dst, 11996);
     if (sse) {
-    dasm_put(Dst, 11119);
+    dasm_put(Dst, 11120);
     } else {
-    dasm_put(Dst, 11131);
+    dasm_put(Dst, 11132);
     }
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     break;
   case BC_MODNV: case BC_MODVV:
-    dasm_put(Dst, 11283);
+    dasm_put(Dst, 11284);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11396, LJ_TISNUM);
+    dasm_put(Dst, 11397, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11408, LJ_TISNUM);
+    dasm_put(Dst, 11409, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11929);
+    dasm_put(Dst, 11930);
     } else {
-    dasm_put(Dst, 11943);
+    dasm_put(Dst, 11944);
     }
       break;
     case 1:
-    dasm_put(Dst, 11441, LJ_TISNUM);
+    dasm_put(Dst, 11442, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11453, LJ_TISNUM);
+    dasm_put(Dst, 11454, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11951);
+    dasm_put(Dst, 11952);
     } else {
-    dasm_put(Dst, 11965);
+    dasm_put(Dst, 11966);
     }
       break;
     default:
-    dasm_put(Dst, 11486, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11487, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 11973);
+    dasm_put(Dst, 11974);
     } else {
-    dasm_put(Dst, 11987);
+    dasm_put(Dst, 11988);
     }
       break;
     }
-    dasm_put(Dst, 12001);
+    dasm_put(Dst, 12002);
     break;
   case BC_POW:
-    dasm_put(Dst, 11283);
+    dasm_put(Dst, 11284);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 11396, LJ_TISNUM);
+    dasm_put(Dst, 11397, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11408, LJ_TISNUM);
+    dasm_put(Dst, 11409, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11929);
+    dasm_put(Dst, 11930);
     } else {
-    dasm_put(Dst, 11943);
+    dasm_put(Dst, 11944);
     }
       break;
     case 1:
-    dasm_put(Dst, 11441, LJ_TISNUM);
+    dasm_put(Dst, 11442, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 11453, LJ_TISNUM);
+    dasm_put(Dst, 11454, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 11951);
+    dasm_put(Dst, 11952);
     } else {
-    dasm_put(Dst, 11965);
+    dasm_put(Dst, 11966);
     }
       break;
     default:
-    dasm_put(Dst, 11486, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 11487, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 11973);
+    dasm_put(Dst, 11974);
     } else {
-    dasm_put(Dst, 11987);
+    dasm_put(Dst, 11988);
     }
       break;
     }
-    dasm_put(Dst, 12006);
+    dasm_put(Dst, 12007);
     if (sse) {
-    dasm_put(Dst, 11119);
+    dasm_put(Dst, 11120);
     } else {
-    dasm_put(Dst, 11131);
+    dasm_put(Dst, 11132);
     }
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     break;
 
   case BC_CAT:
-    dasm_put(Dst, 12010, Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 12011, Dt1(->base), Dt1(->base));
     break;
 
   /* -- Constant ops ------------------------------------------------------ */
 
   case BC_KSTR:
-    dasm_put(Dst, 12093, LJ_TSTR);
+    dasm_put(Dst, 12094, LJ_TSTR);
     break;
   case BC_KCDATA:
 #if LJ_HASFFI
-    dasm_put(Dst, 12093, LJ_TCDATA);
+    dasm_put(Dst, 12094, LJ_TCDATA);
 #endif
     break;
   case BC_KSHORT:
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 12128, LJ_TISNUM);
+      dasm_put(Dst, 12129, LJ_TISNUM);
     } else if (sse) {
-      dasm_put(Dst, 12140);
+      dasm_put(Dst, 12141);
     } else {
-      dasm_put(Dst, 12155);
+      dasm_put(Dst, 12156);
     }
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     break;
   case BC_KNUM:
     if (sse) {
-      dasm_put(Dst, 12163);
+      dasm_put(Dst, 12164);
     } else {
-      dasm_put(Dst, 12176);
+      dasm_put(Dst, 12177);
     }
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     break;
   case BC_KPRI:
-    dasm_put(Dst, 12183);
+    dasm_put(Dst, 12184);
     break;
   case BC_KNIL:
-    dasm_put(Dst, 12211, LJ_TNIL);
+    dasm_put(Dst, 12212, LJ_TNIL);
     break;
 
   /* -- Upvalue and function ops ------------------------------------------ */
 
   case BC_UGET:
-    dasm_put(Dst, 12258, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 12259, offsetof(GCfuncL, uvptr), DtA(->v));
     break;
   case BC_USETV:
 #define TV2MARKOFS \
  ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv))
-    dasm_put(Dst, 12298, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TISNUM - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G);
-    dasm_put(Dst, 12389);
+    dasm_put(Dst, 12299, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TISNUM - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G);
+    dasm_put(Dst, 12390);
     break;
 #undef TV2MARKOFS
   case BC_USETS:
-    dasm_put(Dst, 12401, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G);
+    dasm_put(Dst, 12402, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G);
     break;
   case BC_USETN:
-    dasm_put(Dst, 12494);
+    dasm_put(Dst, 12495);
     if (sse) {
-      dasm_put(Dst, 12499);
+      dasm_put(Dst, 12500);
     } else {
-      dasm_put(Dst, 10774);
+      dasm_put(Dst, 10775);
     }
-    dasm_put(Dst, 12506, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 12507, offsetof(GCfuncL, uvptr), DtA(->v));
     if (sse) {
-      dasm_put(Dst, 12515);
+      dasm_put(Dst, 12516);
     } else {
-      dasm_put(Dst, 12521);
+      dasm_put(Dst, 12522);
     }
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     break;
   case BC_USETP:
-    dasm_put(Dst, 12524, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 12525, offsetof(GCfuncL, uvptr), DtA(->v));
     break;
   case BC_UCLO:
-    dasm_put(Dst, 12563, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 12564, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base));
     break;
 
   case BC_FNEW:
-    dasm_put(Dst, 12618, Dt1(->base), Dt1(->base), LJ_TFUNC);
+    dasm_put(Dst, 12619, Dt1(->base), Dt1(->base), LJ_TFUNC);
     break;
 
   /* -- Table ops --------------------------------------------------------- */
 
   case BC_TNEW:
-    dasm_put(Dst, 12684, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), LJ_TTAB);
+    dasm_put(Dst, 12685, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), LJ_TTAB);
     break;
   case BC_TDUP:
-    dasm_put(Dst, 12806, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB);
+    dasm_put(Dst, 12807, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB);
     break;
 
   case BC_GGET:
-    dasm_put(Dst, 12901, Dt7(->env));
+    dasm_put(Dst, 12902, Dt7(->env));
     break;
   case BC_GSET:
-    dasm_put(Dst, 12920, Dt7(->env));
+    dasm_put(Dst, 12921, Dt7(->env));
     break;
 
   case BC_TGETV:
-    dasm_put(Dst, 12939, LJ_TTAB);
+    dasm_put(Dst, 12940, LJ_TTAB);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 12962, LJ_TISNUM);
+      dasm_put(Dst, 12963, LJ_TISNUM);
     } else {
-      dasm_put(Dst, 12976, LJ_TISNUM);
+      dasm_put(Dst, 12977, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 12987);
+       dasm_put(Dst, 12988);
       } else {
       }
-      dasm_put(Dst, 13008);
+      dasm_put(Dst, 13009);
     }
-    dasm_put(Dst, 13013, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index, LJ_TNIL);
-    dasm_put(Dst, 13104, LJ_TSTR);
+    dasm_put(Dst, 13014, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index, LJ_TNIL);
+    dasm_put(Dst, 13105, LJ_TSTR);
     break;
   case BC_TGETS:
-    dasm_put(Dst, 13122, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);
-    dasm_put(Dst, 13206, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 13123, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);
+    dasm_put(Dst, 13207, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
     break;
   case BC_TGETB:
-    dasm_put(Dst, 13277, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
-    dasm_put(Dst, 13372, LJ_TNIL);
+    dasm_put(Dst, 13278, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 13373, LJ_TNIL);
     break;
 
   case BC_TSETV:
-    dasm_put(Dst, 13389, LJ_TTAB);
+    dasm_put(Dst, 13390, LJ_TTAB);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 12962, LJ_TISNUM);
+      dasm_put(Dst, 12963, LJ_TISNUM);
     } else {
-      dasm_put(Dst, 12976, LJ_TISNUM);
+      dasm_put(Dst, 12977, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 12987);
+       dasm_put(Dst, 12988);
       } else {
       }
-      dasm_put(Dst, 13412);
+      dasm_put(Dst, 13413);
     }
-    dasm_put(Dst, 13417, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex);
-    dasm_put(Dst, 13497, LJ_TSTR, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
+    dasm_put(Dst, 13418, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex);
+    dasm_put(Dst, 13498, LJ_TSTR, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
     break;
   case BC_TSETS:
-    dasm_put(Dst, 13554, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);
-    dasm_put(Dst, 13630, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DtB(->next));
-    dasm_put(Dst, 13718, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, LJ_TSTR, Dt1(->base), Dt1(->base), Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
+    dasm_put(Dst, 13555, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);
+    dasm_put(Dst, 13631, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DtB(->next));
+    dasm_put(Dst, 13719, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, LJ_TSTR, Dt1(->base), Dt1(->base), Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
     break;
   case BC_TSETB:
-    dasm_put(Dst, 13809, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable));
-    dasm_put(Dst, 13903, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
+    dasm_put(Dst, 13810, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable));
+    dasm_put(Dst, 13904, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
     break;
 
   case BC_TSETM:
-    dasm_put(Dst, 13949, Dt6(->marked), LJ_GC_BLACK, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base));
-    dasm_put(Dst, 14092, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
+    dasm_put(Dst, 13950, Dt6(->marked), LJ_GC_BLACK, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 14093, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
     break;
 
   /* -- Calls and vararg handling ----------------------------------------- */
 
   case BC_CALL: case BC_CALLM:
-    dasm_put(Dst, 11287);
+    dasm_put(Dst, 11288);
     if (op == BC_CALLM) {
-      dasm_put(Dst, 14110);
+      dasm_put(Dst, 14111);
     }
-    dasm_put(Dst, 14115, LJ_TFUNC, Dt7(->pc));
+    dasm_put(Dst, 14116, LJ_TFUNC, Dt7(->pc));
     break;
 
   case BC_CALLMT:
-    dasm_put(Dst, 14110);
+    dasm_put(Dst, 14111);
     break;
   case BC_CALLT:
-    dasm_put(Dst, 14157, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->pc));
-    dasm_put(Dst, 14272, FRAME_TYPE, Dt7(->pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP, FRAME_VARG);
+    dasm_put(Dst, 14158, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->pc));
+    dasm_put(Dst, 14273, FRAME_TYPE, Dt7(->pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP, FRAME_VARG);
     break;
 
   case BC_ITERC:
-    dasm_put(Dst, 14343, LJ_TFUNC, 2+1, Dt7(->pc));
+    dasm_put(Dst, 14344, LJ_TFUNC, 2+1, Dt7(->pc));
     break;
 
   case BC_ITERN:
 #if LJ_HASJIT
 #endif
-    dasm_put(Dst, 14414, Dt6(->asize), Dt6(->array), LJ_TNIL);
+    dasm_put(Dst, 14415, Dt6(->asize), Dt6(->array), LJ_TNIL);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 11154, LJ_TISNUM);
+      dasm_put(Dst, 11155, LJ_TISNUM);
     } else if (sse) {
-      dasm_put(Dst, 11248);
+      dasm_put(Dst, 11249);
     } else {
-      dasm_put(Dst, 14460);
+      dasm_put(Dst, 14461);
     }
-    dasm_put(Dst, 14466);
+    dasm_put(Dst, 14467);
     if (LJ_DUALNUM) {
     } else if (sse) {
-      dasm_put(Dst, 11119);
+      dasm_put(Dst, 11120);
     } else {
-      dasm_put(Dst, 11131);
+      dasm_put(Dst, 11132);
     }
-    dasm_put(Dst, 14479, -BCBIAS_J*4);
+    dasm_put(Dst, 14480, -BCBIAS_J*4);
     if (!LJ_DUALNUM && !sse) {
-      dasm_put(Dst, 14531);
+      dasm_put(Dst, 14532);
     }
-    dasm_put(Dst, 14537, Dt6(->hmask), sizeof(Node), Dt6(->node), DtB(->val.it), LJ_TNIL, DtB(->key), DtB(->val));
+    dasm_put(Dst, 14538, Dt6(->hmask), sizeof(Node), Dt6(->node), DtB(->val.it), LJ_TNIL, DtB(->key), DtB(->val));
     break;
 
   case BC_ISNEXT:
-    dasm_put(Dst, 14609, LJ_TFUNC, LJ_TTAB, LJ_TNIL, Dt8(->ffid), FF_next_N, -BCBIAS_J*4, BC_JMP, -BCBIAS_J*4, BC_ITERC);
+    dasm_put(Dst, 14610, LJ_TFUNC, LJ_TTAB, LJ_TNIL, Dt8(->ffid), FF_next_N, -BCBIAS_J*4, BC_JMP, -BCBIAS_J*4, BC_ITERC);
     break;
 
   case BC_VARG:
-    dasm_put(Dst, 14709, (8+FRAME_VARG), LJ_TNIL, Dt1(->maxstack));
-    dasm_put(Dst, 14869, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));
+    dasm_put(Dst, 14710, (8+FRAME_VARG), LJ_TNIL, Dt1(->maxstack));
+    dasm_put(Dst, 14870, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));
     break;
 
   /* -- Returns ----------------------------------------------------------- */
 
   case BC_RETM:
-    dasm_put(Dst, 14110);
+    dasm_put(Dst, 14111);
     break;
 
   case BC_RET: case BC_RET0: case BC_RET1:
     if (op != BC_RET0) {
-      dasm_put(Dst, 14935);
+      dasm_put(Dst, 14936);
     }
-    dasm_put(Dst, 14939, FRAME_TYPE);
+    dasm_put(Dst, 14940, FRAME_TYPE);
     switch (op) {
     case BC_RET:
-      dasm_put(Dst, 14958);
+      dasm_put(Dst, 14959);
       break;
     case BC_RET1:
-      dasm_put(Dst, 15010);
+      dasm_put(Dst, 15011);
       /* fallthrough */
     case BC_RET0:
-      dasm_put(Dst, 15020);
+      dasm_put(Dst, 15021);
     default:
       break;
     }
-    dasm_put(Dst, 15031, Dt7(->pc), PC2PROTO(k));
+    dasm_put(Dst, 15032, Dt7(->pc), PC2PROTO(k));
     if (op == BC_RET) {
-      dasm_put(Dst, 15075, LJ_TNIL);
+      dasm_put(Dst, 15076, LJ_TNIL);
     } else {
-      dasm_put(Dst, 15084, LJ_TNIL);
+      dasm_put(Dst, 15085, LJ_TNIL);
     }
-    dasm_put(Dst, 15091, -FRAME_VARG, FRAME_TYPEP);
+    dasm_put(Dst, 15092, -FRAME_VARG, FRAME_TYPEP);
     if (op != BC_RET0) {
-      dasm_put(Dst, 15115);
+      dasm_put(Dst, 15116);
     }
     dasm_put(Dst, 4708);
     break;
@@ -2775,7 +2774,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_FORL:
 #if LJ_HASJIT
-    dasm_put(Dst, 15119, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
+    dasm_put(Dst, 15120, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -2787,111 +2786,111 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
   case BC_FORI:
   case BC_IFORL:
     vk = (op == BC_IFORL || op == BC_JFORL);
-    dasm_put(Dst, 15140);
+    dasm_put(Dst, 15141);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 15144, LJ_TISNUM);
+      dasm_put(Dst, 15145, LJ_TISNUM);
       if (!vk) {
-       dasm_put(Dst, 15154, LJ_TISNUM, LJ_TISNUM);
+       dasm_put(Dst, 15155, LJ_TISNUM, LJ_TISNUM);
       } else {
 #ifdef LUA_USE_ASSERT
-       dasm_put(Dst, 15183, LJ_TISNUM, LJ_TISNUM);
+       dasm_put(Dst, 15184, LJ_TISNUM, LJ_TISNUM);
 #endif
-       dasm_put(Dst, 15202);
+       dasm_put(Dst, 15203);
       }
-      dasm_put(Dst, 15221, LJ_TISNUM);
+      dasm_put(Dst, 15222, LJ_TISNUM);
       if (op == BC_FORI) {
-       dasm_put(Dst, 15232, -BCBIAS_J*4);
+       dasm_put(Dst, 15233, -BCBIAS_J*4);
       } else if (op == BC_JFORI) {
-       dasm_put(Dst, 15246, -BCBIAS_J*4, BC_JLOOP);
+       dasm_put(Dst, 15247, -BCBIAS_J*4, BC_JLOOP);
       } else if (op == BC_IFORL) {
-       dasm_put(Dst, 15264, -BCBIAS_J*4);
+       dasm_put(Dst, 15265, -BCBIAS_J*4);
       } else {
-       dasm_put(Dst, 15256, BC_JLOOP);
+       dasm_put(Dst, 15257, BC_JLOOP);
       }
-      dasm_put(Dst, 15278);
+      dasm_put(Dst, 15279);
       if (vk) {
-       dasm_put(Dst, 15302);
+       dasm_put(Dst, 15303);
       }
-      dasm_put(Dst, 15221, LJ_TISNUM);
+      dasm_put(Dst, 15222, LJ_TISNUM);
       if (op == BC_FORI) {
-       dasm_put(Dst, 15311);
+       dasm_put(Dst, 15312);
       } else if (op == BC_JFORI) {
-       dasm_put(Dst, 15316, -BCBIAS_J*4, BC_JLOOP);
+       dasm_put(Dst, 15317, -BCBIAS_J*4, BC_JLOOP);
       } else if (op == BC_IFORL) {
-       dasm_put(Dst, 15330);
+       dasm_put(Dst, 15331);
       } else {
-       dasm_put(Dst, 15326, BC_JLOOP);
+       dasm_put(Dst, 15327, BC_JLOOP);
       }
-      dasm_put(Dst, 15335);
+      dasm_put(Dst, 15336);
     } else if (!vk) {
-      dasm_put(Dst, 15342, LJ_TISNUM);
+      dasm_put(Dst, 15343, LJ_TISNUM);
     }
     if (!vk) {
-      dasm_put(Dst, 15348, LJ_TISNUM);
+      dasm_put(Dst, 15349, LJ_TISNUM);
     } else {
 #ifdef LUA_USE_ASSERT
-      dasm_put(Dst, 15362, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 15363, LJ_TISNUM, LJ_TISNUM);
 #endif
     }
-    dasm_put(Dst, 15381);
+    dasm_put(Dst, 15382);
     if (!vk) {
-      dasm_put(Dst, 15385, LJ_TISNUM);
+      dasm_put(Dst, 15386, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 15394);
+      dasm_put(Dst, 15395);
       if (vk) {
-       dasm_put(Dst, 15406);
+       dasm_put(Dst, 15407);
       } else {
-       dasm_put(Dst, 15425);
+       dasm_put(Dst, 15426);
       }
-      dasm_put(Dst, 15430);
+      dasm_put(Dst, 15431);
     } else {
-      dasm_put(Dst, 15443);
+      dasm_put(Dst, 15444);
       if (vk) {
-       dasm_put(Dst, 15449);
+       dasm_put(Dst, 15450);
       } else {
-       dasm_put(Dst, 15465);
+       dasm_put(Dst, 15466);
       }
-      dasm_put(Dst, 15473);
+      dasm_put(Dst, 15474);
       if (cmov) {
-      dasm_put(Dst, 10210);
+      dasm_put(Dst, 10211);
       } else {
-      dasm_put(Dst, 10216);
+      dasm_put(Dst, 10217);
       }
       if (!cmov) {
-       dasm_put(Dst, 15478);
+       dasm_put(Dst, 15479);
       }
     }
     if (op == BC_FORI) {
       if (LJ_DUALNUM) {
-       dasm_put(Dst, 15484);
+       dasm_put(Dst, 15485);
       } else {
-       dasm_put(Dst, 15489, -BCBIAS_J*4);
+       dasm_put(Dst, 15490, -BCBIAS_J*4);
       }
     } else if (op == BC_JFORI) {
-      dasm_put(Dst, 15499, -BCBIAS_J*4, BC_JLOOP);
+      dasm_put(Dst, 15500, -BCBIAS_J*4, BC_JLOOP);
     } else if (op == BC_IFORL) {
       if (LJ_DUALNUM) {
-       dasm_put(Dst, 15513);
+       dasm_put(Dst, 15514);
       } else {
-       dasm_put(Dst, 15518, -BCBIAS_J*4);
+       dasm_put(Dst, 15519, -BCBIAS_J*4);
       }
     } else {
-      dasm_put(Dst, 15509, BC_JLOOP);
+      dasm_put(Dst, 15510, BC_JLOOP);
     }
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 10139);
+      dasm_put(Dst, 10140);
     } else {
-      dasm_put(Dst, 10904);
+      dasm_put(Dst, 10905);
     }
     if (sse) {
-      dasm_put(Dst, 15528);
+      dasm_put(Dst, 15529);
     }
     break;
 
   case BC_ITERL:
 #if LJ_HASJIT
-    dasm_put(Dst, 15119, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
+    dasm_put(Dst, 15120, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -2900,33 +2899,33 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     break;
 #endif
   case BC_IITERL:
-    dasm_put(Dst, 15539, LJ_TNIL);
+    dasm_put(Dst, 15540, LJ_TNIL);
     if (op == BC_JITERL) {
-      dasm_put(Dst, 15554, BC_JLOOP);
+      dasm_put(Dst, 15555, BC_JLOOP);
     } else {
-      dasm_put(Dst, 15568, -BCBIAS_J*4);
+      dasm_put(Dst, 15569, -BCBIAS_J*4);
     }
-    dasm_put(Dst, 10253);
+    dasm_put(Dst, 10254);
     break;
 
   case BC_LOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 15119, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
+    dasm_put(Dst, 15120, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
   case BC_ILOOP:
-    dasm_put(Dst, 10255);
+    dasm_put(Dst, 10256);
     break;
 
   case BC_JLOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 15584, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L), 9*16+4*8, -1*16, -2*16, -3*16, -4*16, -5*16, -6*16, -7*16, -8*16, -9*16);
+    dasm_put(Dst, 15585, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L), 9*16+4*8, -1*16, -2*16, -3*16, -4*16, -5*16, -6*16, -7*16, -8*16, -9*16);
 #endif
     break;
 
   case BC_JMP:
-    dasm_put(Dst, 15693, -BCBIAS_J*4);
+    dasm_put(Dst, 15694, -BCBIAS_J*4);
     break;
 
   /* -- Function headers -------------------------------------------------- */
@@ -2940,7 +2939,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_FUNCF:
 #if LJ_HASJIT
-    dasm_put(Dst, 15718, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);
+    dasm_put(Dst, 15719, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);
 #endif
   case BC_FUNCV:  /* NYI: compiled vararg functions. */
     break;
@@ -2950,13 +2949,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     break;
 #endif
   case BC_IFUNCF:
-    dasm_put(Dst, 15739, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams));
+    dasm_put(Dst, 15740, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams));
     if (op == BC_JFUNCF) {
-      dasm_put(Dst, 15769, BC_JLOOP);
+      dasm_put(Dst, 15770, BC_JLOOP);
     } else {
-      dasm_put(Dst, 10255);
+      dasm_put(Dst, 10256);
     }
-    dasm_put(Dst, 15778, LJ_TNIL);
+    dasm_put(Dst, 15779, LJ_TNIL);
     break;
 
   case BC_JFUNCV:
@@ -2967,30 +2966,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     break;  /* NYI: compiled vararg functions. */
 
   case BC_IFUNCV:
-    dasm_put(Dst, 15800, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL);
+    dasm_put(Dst, 15801, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL);
     if (op == BC_JFUNCV) {
-      dasm_put(Dst, 15769, BC_JLOOP);
+      dasm_put(Dst, 15770, BC_JLOOP);
     } else {
-      dasm_put(Dst, 15891, -4+PC2PROTO(k));
+      dasm_put(Dst, 15892, -4+PC2PROTO(k));
     }
-    dasm_put(Dst, 15914, LJ_TNIL);
+    dasm_put(Dst, 15915, LJ_TNIL);
     break;
 
   case BC_FUNCC:
   case BC_FUNCCW:
-    dasm_put(Dst, 15936, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top));
+    dasm_put(Dst, 15937, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top));
     if (op == BC_FUNCC) {
       dasm_put(Dst, 2372);
     } else {
-      dasm_put(Dst, 15966);
+      dasm_put(Dst, 15967);
     }
-    dasm_put(Dst, 15974, DISPATCH_GL(vmstate), ~LJ_VMST_C);
+    dasm_put(Dst, 15975, DISPATCH_GL(vmstate), ~LJ_VMST_C);
     if (op == BC_FUNCC) {
-      dasm_put(Dst, 15983);
+      dasm_put(Dst, 15984);
     } else {
-      dasm_put(Dst, 15987, DISPATCH_GL(wrapf));
+      dasm_put(Dst, 15988, DISPATCH_GL(wrapf));
     }
-    dasm_put(Dst, 15992, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top));
+    dasm_put(Dst, 15993, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top));
     break;
 
   /* ---------------------------------------------------------------------- */
@@ -3018,7 +3017,7 @@ static int build_backend(BuildCtx *ctx)
 
   build_subroutines(ctx, cmov, sse);
 
-  dasm_put(Dst, 16017);
+  dasm_put(Dst, 16018);
   for (op = 0; op < BC__MAX; op++)
     build_ins(ctx, (BCOp)op, op, cmov, sse);
 
@@ -3028,6 +3027,7 @@ static int build_backend(BuildCtx *ctx)
 /* Emit pseudo frame-info for all assembler functions. */
 static void emit_asm_debug(BuildCtx *ctx)
 {
+  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);
 #if LJ_64
 #define SZPTR  "8"
 #define BSZPTR "3"
@@ -3061,22 +3061,49 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.long .LEFDE0-.LASFDE0\n"
        ".LASFDE0:\n"
        "\t.long .Lframe0\n"
-       "\t.long .Lbegin\n"
-       "\t.long %d\n"
-       "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
 #if LJ_64
+       "\t.quad .Lbegin\n"
+       "\t.quad %d\n"
+       "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
        "\t.byte 0x86\n\t.uleb128 0x2\n"        /* offset rbp */
        "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
        "\t.byte 0x8f\n\t.uleb128 0x4\n"        /* offset r15 */
        "\t.byte 0x8e\n\t.uleb128 0x5\n"        /* offset r14 */
 #else
+       "\t.long .Lbegin\n"
+       "\t.long %d\n"
+       "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
        "\t.byte 0x85\n\t.uleb128 0x2\n"        /* offset ebp */
        "\t.byte 0x87\n\t.uleb128 0x3\n"        /* offset edi */
        "\t.byte 0x86\n\t.uleb128 0x4\n"        /* offset esi */
        "\t.byte 0x83\n\t.uleb128 0x5\n"        /* offset ebx */
 #endif
        "\t.align " SZPTR "\n"
-       ".LEFDE0:\n\n", (int)ctx->codesz, CFRAME_SIZE);
+       ".LEFDE0:\n\n", fcofs, CFRAME_SIZE);
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".LSFDE1:\n"
+       "\t.long .LEFDE1-.LASFDE1\n"
+       ".LASFDE1:\n"
+       "\t.long .Lframe0\n"
+#if LJ_64
+       "\t.quad lj_vm_ffi_call\n"
+       "\t.quad %d\n"
+       "\t.byte 0xe\n\t.uleb128 16\n"          /* def_cfa_offset */
+       "\t.byte 0x86\n\t.uleb128 0x2\n"        /* offset rbp */
+       "\t.byte 0xd\n\t.uleb128 0x6\n"         /* def_cfa_register rbp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
+#else
+       "\t.long lj_vm_ffi_call\n"
+       "\t.long %d\n"
+       "\t.byte 0xe\n\t.uleb128 8\n"           /* def_cfa_offset */
+       "\t.byte 0x85\n\t.uleb128 0x2\n"        /* offset ebp */
+       "\t.byte 0xd\n\t.uleb128 0x5\n"         /* def_cfa_register ebp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset ebx */
+#endif
+       "\t.align " SZPTR "\n"
+       ".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
+#endif
 #if (defined(__sun__) && defined(__svr4__)) || defined(__solaris_)
     fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n");
 #else
@@ -3101,10 +3128,10 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.align " SZPTR "\n"
        ".LECIE1:\n\n");
     fprintf(ctx->fp,
-       ".LSFDE1:\n"
-       "\t.long .LEFDE1-.LASFDE1\n"
-       ".LASFDE1:\n"
-       "\t.long .LASFDE1-.Lframe1\n"
+       ".LSFDE2:\n"
+       "\t.long .LEFDE2-.LASFDE2\n"
+       ".LASFDE2:\n"
+       "\t.long .LASFDE2-.Lframe1\n"
        "\t.long .Lbegin-.\n"
        "\t.long %d\n"
        "\t.uleb128 0\n"                        /* augmentation length */
@@ -3121,7 +3148,46 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.byte 0x83\n\t.uleb128 0x5\n"        /* offset ebx */
 #endif
        "\t.align " SZPTR "\n"
-       ".LEFDE1:\n\n", (int)ctx->codesz, CFRAME_SIZE);
+       ".LEFDE2:\n\n", fcofs, CFRAME_SIZE);
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".Lframe2:\n"
+       "\t.long .LECIE2-.LSCIE2\n"
+       ".LSCIE2:\n"
+       "\t.long 0\n"
+       "\t.byte 0x1\n"
+       "\t.string \"zR\"\n"
+       "\t.uleb128 0x1\n"
+       "\t.sleb128 -" SZPTR "\n"
+       "\t.byte " REG_RA "\n"
+       "\t.uleb128 1\n"                        /* augmentation length */
+       "\t.byte 0x1b\n"                        /* pcrel|sdata4 */
+       "\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"
+       "\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"
+       "\t.align " SZPTR "\n"
+       ".LECIE2:\n\n");
+    fprintf(ctx->fp,
+       ".LSFDE3:\n"
+       "\t.long .LEFDE3-.LASFDE3\n"
+       ".LASFDE3:\n"
+       "\t.long .LASFDE3-.Lframe2\n"
+       "\t.long lj_vm_ffi_call-.\n"
+       "\t.long %d\n"
+       "\t.uleb128 0\n"                        /* augmentation length */
+#if LJ_64
+       "\t.byte 0xe\n\t.uleb128 16\n"          /* def_cfa_offset */
+       "\t.byte 0x86\n\t.uleb128 0x2\n"        /* offset rbp */
+       "\t.byte 0xd\n\t.uleb128 0x6\n"         /* def_cfa_register rbp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
+#else
+       "\t.byte 0xe\n\t.uleb128 8\n"           /* def_cfa_offset */
+       "\t.byte 0x85\n\t.uleb128 0x2\n"        /* offset ebp */
+       "\t.byte 0xd\n\t.uleb128 0x5\n"         /* def_cfa_register ebp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset ebx */
+#endif
+       "\t.align " SZPTR "\n"
+       ".LEFDE3:\n\n", (int)ctx->codesz - fcofs);
+#endif
     break;
   case BUILD_coffasm:
     fprintf(ctx->fp, "\t.section .eh_frame,\"dr\"\n");
@@ -3172,6 +3238,9 @@ static void emit_asm_debug(BuildCtx *ctx)
   ** Or a linker. Or a plastic case. But I digress.
   */
   case BUILD_machasm: {
+#if LJ_HASFFI
+    int fcsize = 0;
+#endif
     int i;
     fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n");
     fprintf(ctx->fp,
@@ -3203,6 +3272,9 @@ static void emit_asm_debug(BuildCtx *ctx)
       const char *name = ctx->sym[i].name;
       int32_t size = ctx->sym[i+1].ofs - ctx->sym[i].ofs;
       if (size == 0) continue;
+#if LJ_HASFFI
+      if (!strcmp(name, "_lj_vm_ffi_call")) { fcsize = size; continue; }
+#endif
       fprintf(ctx->fp,
          "%s.eh:\n"
          "LSFDE%d:\n"
@@ -3212,23 +3284,72 @@ static void emit_asm_debug(BuildCtx *ctx)
          "\t.long LASFDE%d-EH_frame1\n"
          "\t.long %s-.\n"
          "\t.long %d\n"
-         "\t.byte 0\n"                 /* augmentation length */
+         "\t.byte 0\n"                         /* augmentation length */
          "\t.byte 0xe\n\t.byte %d\n"           /* def_cfa_offset */
 #if LJ_64
-         "\t.byte 0x86\n\t.byte 0x2\n" /* offset rbp */
-         "\t.byte 0x83\n\t.byte 0x3\n" /* offset rbx */
-         "\t.byte 0x8f\n\t.byte 0x4\n" /* offset r15 */
-         "\t.byte 0x8e\n\t.byte 0x5\n" /* offset r14 */
+         "\t.byte 0x86\n\t.byte 0x2\n"         /* offset rbp */
+         "\t.byte 0x83\n\t.byte 0x3\n"         /* offset rbx */
+         "\t.byte 0x8f\n\t.byte 0x4\n"         /* offset r15 */
+         "\t.byte 0x8e\n\t.byte 0x5\n"         /* offset r14 */
 #else
-         "\t.byte 0x84\n\t.byte 0x2\n" /* offset ebp (4 for MACH-O)*/
-         "\t.byte 0x87\n\t.byte 0x3\n" /* offset edi */
-         "\t.byte 0x86\n\t.byte 0x4\n" /* offset esi */
-         "\t.byte 0x83\n\t.byte 0x5\n" /* offset ebx */
+         "\t.byte 0x84\n\t.byte 0x2\n"         /* offset ebp (4 for MACH-O)*/
+         "\t.byte 0x87\n\t.byte 0x3\n"         /* offset edi */
+         "\t.byte 0x86\n\t.byte 0x4\n"         /* offset esi */
+         "\t.byte 0x83\n\t.byte 0x5\n"         /* offset ebx */
 #endif
          "\t.align " BSZPTR "\n"
          "LEFDE%d:\n\n",
          name, i, i, i, i, i, i, i, name, size, CFRAME_SIZE, i);
     }
+#if LJ_HASFFI
+    if (fcsize) {
+      fprintf(ctx->fp,
+         "EH_frame2:\n"
+         "\t.set L$set$y,LECIEY-LSCIEY\n"
+         "\t.long L$set$y\n"
+         "LSCIEY:\n"
+         "\t.long 0\n"
+         "\t.byte 0x1\n"
+         "\t.ascii \"zR\\0\"\n"
+         "\t.byte 0x1\n"
+         "\t.byte 128-" SZPTR "\n"
+         "\t.byte " REG_RA "\n"
+         "\t.byte 1\n"                         /* augmentation length */
+#if LJ_64
+         "\t.byte 0x1b\n"                      /* pcrel|sdata4 */
+         "\t.byte 0xc\n\t.byte " REG_SP "\n\t.byte " SZPTR "\n"
+#else
+         "\t.byte 0x1b\n"                      /* pcrel|sdata4 */
+         "\t.byte 0xc\n\t.byte 0x5\n\t.byte 0x4\n"  /* esp=5 on 32 bit MACH. */
+#endif
+         "\t.byte 0x80+" REG_RA "\n\t.byte 0x1\n"
+         "\t.align " BSZPTR "\n"
+         "LECIEY:\n\n");
+      fprintf(ctx->fp,
+         "_lj_vm_ffi_call.eh:\n"
+         "LSFDEY:\n"
+         "\t.set L$set$yy,LEFDEY-LASFDEY\n"
+         "\t.long L$set$yy\n"
+         "LASFDEY:\n"
+         "\t.long LASFDEY-EH_frame2\n"
+         "\t.long _lj_vm_ffi_call-.\n"
+         "\t.long %d\n"
+         "\t.byte 0\n"                         /* augmentation length */
+#if LJ_64
+         "\t.byte 0xe\n\t.byte 16\n"           /* def_cfa_offset */
+         "\t.byte 0x86\n\t.byte 0x2\n"         /* offset rbp */
+         "\t.byte 0xd\n\t.uleb128 0x6\n"       /* def_cfa_register rbp */
+         "\t.byte 0x83\n\t.byte 0x3\n"         /* offset rbx */
+#else
+         "\t.byte 0xe\n\t.byte 8\n"            /* def_cfa_offset */
+         "\t.byte 0x84\n\t.byte 0x2\n"         /* offset ebp (4 for MACH-O)*/
+         "\t.byte 0xd\n\t.uleb128 0x4\n"       /* def_cfa_register ebp */
+         "\t.byte 0x83\n\t.byte 0x3\n"         /* offset ebx */
+#endif
+         "\t.align " BSZPTR "\n"
+         "LEFDEY:\n\n", fcsize);
+    }
+#endif
 #if LJ_64
     fprintf(ctx->fp, "\t.subsections_via_symbols\n");
 #else
index a667bcb698f6532ea1568660bf5628d25f72a4bf..dd409c5c0202fe2b79c133e989cc3c387a0d9884 100644 (file)
@@ -3687,10 +3687,21 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
   |.endif
   |
   |//-----------------------------------------------------------------------
+  |//-- Assertions ---------------------------------------------------------
+  |//-----------------------------------------------------------------------
+  |
+  |->assert_bad_for_arg_type:
+#ifdef LUA_USE_ASSERT
+  |  int3
+#endif
+  |  int3
+  |
+  |//-----------------------------------------------------------------------
   |//-- FFI helper functions -----------------------------------------------
   |//-----------------------------------------------------------------------
   |
-  |->vm_ffi_call@4:
+  |->vm_ffi_call@4:                    // Call C function via FFI.
+  |  // Caveat: needs special frame unwinding, see below.
 #if LJ_HASFFI
   |.if X64
   |  .type CCSTATE, CCallState, rbx
@@ -3786,16 +3797,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
   |  mov ebx, [ebp-4]; leave; ret
   |.endif
 #endif
-  |
-  |//-----------------------------------------------------------------------
-  |//-- Assertions ---------------------------------------------------------
-  |//-----------------------------------------------------------------------
-  |
-  |->assert_bad_for_arg_type:
-#ifdef LUA_USE_ASSERT
-  |  int3
-#endif
-  |  int3
+  |// Note: vm_ffi_call must be the last function in this object file!
   |
   |//-----------------------------------------------------------------------
 }
@@ -6001,6 +6003,7 @@ static int build_backend(BuildCtx *ctx)
 /* Emit pseudo frame-info for all assembler functions. */
 static void emit_asm_debug(BuildCtx *ctx)
 {
+  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);
 #if LJ_64
 #define SZPTR  "8"
 #define BSZPTR "3"
@@ -6034,22 +6037,49 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.long .LEFDE0-.LASFDE0\n"
        ".LASFDE0:\n"
        "\t.long .Lframe0\n"
-       "\t.long .Lbegin\n"
-       "\t.long %d\n"
-       "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
 #if LJ_64
+       "\t.quad .Lbegin\n"
+       "\t.quad %d\n"
+       "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
        "\t.byte 0x86\n\t.uleb128 0x2\n"        /* offset rbp */
        "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
        "\t.byte 0x8f\n\t.uleb128 0x4\n"        /* offset r15 */
        "\t.byte 0x8e\n\t.uleb128 0x5\n"        /* offset r14 */
 #else
+       "\t.long .Lbegin\n"
+       "\t.long %d\n"
+       "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
        "\t.byte 0x85\n\t.uleb128 0x2\n"        /* offset ebp */
        "\t.byte 0x87\n\t.uleb128 0x3\n"        /* offset edi */
        "\t.byte 0x86\n\t.uleb128 0x4\n"        /* offset esi */
        "\t.byte 0x83\n\t.uleb128 0x5\n"        /* offset ebx */
 #endif
        "\t.align " SZPTR "\n"
-       ".LEFDE0:\n\n", (int)ctx->codesz, CFRAME_SIZE);
+       ".LEFDE0:\n\n", fcofs, CFRAME_SIZE);
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".LSFDE1:\n"
+       "\t.long .LEFDE1-.LASFDE1\n"
+       ".LASFDE1:\n"
+       "\t.long .Lframe0\n"
+#if LJ_64
+       "\t.quad lj_vm_ffi_call\n"
+       "\t.quad %d\n"
+       "\t.byte 0xe\n\t.uleb128 16\n"          /* def_cfa_offset */
+       "\t.byte 0x86\n\t.uleb128 0x2\n"        /* offset rbp */
+       "\t.byte 0xd\n\t.uleb128 0x6\n"         /* def_cfa_register rbp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
+#else
+       "\t.long lj_vm_ffi_call\n"
+       "\t.long %d\n"
+       "\t.byte 0xe\n\t.uleb128 8\n"           /* def_cfa_offset */
+       "\t.byte 0x85\n\t.uleb128 0x2\n"        /* offset ebp */
+       "\t.byte 0xd\n\t.uleb128 0x5\n"         /* def_cfa_register ebp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset ebx */
+#endif
+       "\t.align " SZPTR "\n"
+       ".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
+#endif
 #if (defined(__sun__) && defined(__svr4__)) || defined(__solaris_)
     fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n");
 #else
@@ -6074,10 +6104,10 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.align " SZPTR "\n"
        ".LECIE1:\n\n");
     fprintf(ctx->fp,
-       ".LSFDE1:\n"
-       "\t.long .LEFDE1-.LASFDE1\n"
-       ".LASFDE1:\n"
-       "\t.long .LASFDE1-.Lframe1\n"
+       ".LSFDE2:\n"
+       "\t.long .LEFDE2-.LASFDE2\n"
+       ".LASFDE2:\n"
+       "\t.long .LASFDE2-.Lframe1\n"
        "\t.long .Lbegin-.\n"
        "\t.long %d\n"
        "\t.uleb128 0\n"                        /* augmentation length */
@@ -6094,7 +6124,46 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.byte 0x83\n\t.uleb128 0x5\n"        /* offset ebx */
 #endif
        "\t.align " SZPTR "\n"
-       ".LEFDE1:\n\n", (int)ctx->codesz, CFRAME_SIZE);
+       ".LEFDE2:\n\n", fcofs, CFRAME_SIZE);
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".Lframe2:\n"
+       "\t.long .LECIE2-.LSCIE2\n"
+       ".LSCIE2:\n"
+       "\t.long 0\n"
+       "\t.byte 0x1\n"
+       "\t.string \"zR\"\n"
+       "\t.uleb128 0x1\n"
+       "\t.sleb128 -" SZPTR "\n"
+       "\t.byte " REG_RA "\n"
+       "\t.uleb128 1\n"                        /* augmentation length */
+       "\t.byte 0x1b\n"                        /* pcrel|sdata4 */
+       "\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"
+       "\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"
+       "\t.align " SZPTR "\n"
+       ".LECIE2:\n\n");
+    fprintf(ctx->fp,
+       ".LSFDE3:\n"
+       "\t.long .LEFDE3-.LASFDE3\n"
+       ".LASFDE3:\n"
+       "\t.long .LASFDE3-.Lframe2\n"
+       "\t.long lj_vm_ffi_call-.\n"
+       "\t.long %d\n"
+       "\t.uleb128 0\n"                        /* augmentation length */
+#if LJ_64
+       "\t.byte 0xe\n\t.uleb128 16\n"          /* def_cfa_offset */
+       "\t.byte 0x86\n\t.uleb128 0x2\n"        /* offset rbp */
+       "\t.byte 0xd\n\t.uleb128 0x6\n"         /* def_cfa_register rbp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
+#else
+       "\t.byte 0xe\n\t.uleb128 8\n"           /* def_cfa_offset */
+       "\t.byte 0x85\n\t.uleb128 0x2\n"        /* offset ebp */
+       "\t.byte 0xd\n\t.uleb128 0x5\n"         /* def_cfa_register ebp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset ebx */
+#endif
+       "\t.align " SZPTR "\n"
+       ".LEFDE3:\n\n", (int)ctx->codesz - fcofs);
+#endif
     break;
   case BUILD_coffasm:
     fprintf(ctx->fp, "\t.section .eh_frame,\"dr\"\n");
@@ -6145,6 +6214,9 @@ static void emit_asm_debug(BuildCtx *ctx)
   ** Or a linker. Or a plastic case. But I digress.
   */
   case BUILD_machasm: {
+#if LJ_HASFFI
+    int fcsize = 0;
+#endif
     int i;
     fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n");
     fprintf(ctx->fp,
@@ -6176,6 +6248,9 @@ static void emit_asm_debug(BuildCtx *ctx)
       const char *name = ctx->sym[i].name;
       int32_t size = ctx->sym[i+1].ofs - ctx->sym[i].ofs;
       if (size == 0) continue;
+#if LJ_HASFFI
+      if (!strcmp(name, "_lj_vm_ffi_call")) { fcsize = size; continue; }
+#endif
       fprintf(ctx->fp,
          "%s.eh:\n"
          "LSFDE%d:\n"
@@ -6185,23 +6260,72 @@ static void emit_asm_debug(BuildCtx *ctx)
          "\t.long LASFDE%d-EH_frame1\n"
          "\t.long %s-.\n"
          "\t.long %d\n"
-         "\t.byte 0\n"                 /* augmentation length */
+         "\t.byte 0\n"                         /* augmentation length */
          "\t.byte 0xe\n\t.byte %d\n"           /* def_cfa_offset */
 #if LJ_64
-         "\t.byte 0x86\n\t.byte 0x2\n" /* offset rbp */
-         "\t.byte 0x83\n\t.byte 0x3\n" /* offset rbx */
-         "\t.byte 0x8f\n\t.byte 0x4\n" /* offset r15 */
-         "\t.byte 0x8e\n\t.byte 0x5\n" /* offset r14 */
+         "\t.byte 0x86\n\t.byte 0x2\n"         /* offset rbp */
+         "\t.byte 0x83\n\t.byte 0x3\n"         /* offset rbx */
+         "\t.byte 0x8f\n\t.byte 0x4\n"         /* offset r15 */
+         "\t.byte 0x8e\n\t.byte 0x5\n"         /* offset r14 */
 #else
-         "\t.byte 0x84\n\t.byte 0x2\n" /* offset ebp (4 for MACH-O)*/
-         "\t.byte 0x87\n\t.byte 0x3\n" /* offset edi */
-         "\t.byte 0x86\n\t.byte 0x4\n" /* offset esi */
-         "\t.byte 0x83\n\t.byte 0x5\n" /* offset ebx */
+         "\t.byte 0x84\n\t.byte 0x2\n"         /* offset ebp (4 for MACH-O)*/
+         "\t.byte 0x87\n\t.byte 0x3\n"         /* offset edi */
+         "\t.byte 0x86\n\t.byte 0x4\n"         /* offset esi */
+         "\t.byte 0x83\n\t.byte 0x5\n"         /* offset ebx */
 #endif
          "\t.align " BSZPTR "\n"
          "LEFDE%d:\n\n",
          name, i, i, i, i, i, i, i, name, size, CFRAME_SIZE, i);
     }
+#if LJ_HASFFI
+    if (fcsize) {
+      fprintf(ctx->fp,
+         "EH_frame2:\n"
+         "\t.set L$set$y,LECIEY-LSCIEY\n"
+         "\t.long L$set$y\n"
+         "LSCIEY:\n"
+         "\t.long 0\n"
+         "\t.byte 0x1\n"
+         "\t.ascii \"zR\\0\"\n"
+         "\t.byte 0x1\n"
+         "\t.byte 128-" SZPTR "\n"
+         "\t.byte " REG_RA "\n"
+         "\t.byte 1\n"                         /* augmentation length */
+#if LJ_64
+         "\t.byte 0x1b\n"                      /* pcrel|sdata4 */
+         "\t.byte 0xc\n\t.byte " REG_SP "\n\t.byte " SZPTR "\n"
+#else
+         "\t.byte 0x1b\n"                      /* pcrel|sdata4 */
+         "\t.byte 0xc\n\t.byte 0x5\n\t.byte 0x4\n"  /* esp=5 on 32 bit MACH. */
+#endif
+         "\t.byte 0x80+" REG_RA "\n\t.byte 0x1\n"
+         "\t.align " BSZPTR "\n"
+         "LECIEY:\n\n");
+      fprintf(ctx->fp,
+         "_lj_vm_ffi_call.eh:\n"
+         "LSFDEY:\n"
+         "\t.set L$set$yy,LEFDEY-LASFDEY\n"
+         "\t.long L$set$yy\n"
+         "LASFDEY:\n"
+         "\t.long LASFDEY-EH_frame2\n"
+         "\t.long _lj_vm_ffi_call-.\n"
+         "\t.long %d\n"
+         "\t.byte 0\n"                         /* augmentation length */
+#if LJ_64
+         "\t.byte 0xe\n\t.byte 16\n"           /* def_cfa_offset */
+         "\t.byte 0x86\n\t.byte 0x2\n"         /* offset rbp */
+         "\t.byte 0xd\n\t.uleb128 0x6\n"       /* def_cfa_register rbp */
+         "\t.byte 0x83\n\t.byte 0x3\n"         /* offset rbx */
+#else
+         "\t.byte 0xe\n\t.byte 8\n"            /* def_cfa_offset */
+         "\t.byte 0x84\n\t.byte 0x2\n"         /* offset ebp (4 for MACH-O)*/
+         "\t.byte 0xd\n\t.uleb128 0x4\n"       /* def_cfa_register ebp */
+         "\t.byte 0x83\n\t.byte 0x3\n"         /* offset ebx */
+#endif
+         "\t.align " BSZPTR "\n"
+         "LEFDEY:\n\n", fcsize);
+    }
+#endif
 #if LJ_64
     fprintf(ctx->fp, "\t.subsections_via_symbols\n");
 #else
index a9b74642d12b85560cd4f01f0d60211bc503e57e..8add07c5daff08a7dd27b8ed1b1c129ad423c85d 100644 (file)
@@ -12,7 +12,7 @@
 #define DASM_SECTION_CODE_OP   0
 #define DASM_SECTION_CODE_SUB  1
 #define DASM_MAXSECTION                2
-static const unsigned char build_actionlist[17111] = {
+static const unsigned char build_actionlist[17112] = {
   254,1,248,10,252,247,198,237,15,132,244,11,131,230,252,248,41,252,242,141,
   76,49,252,248,139,114,252,252,199,68,10,4,237,248,12,131,192,1,137,68,36,
   20,252,247,198,237,15,132,244,13,248,14,129,252,246,239,252,247,198,237,15,
@@ -540,26 +540,26 @@ static const unsigned char build_actionlist[17111] = {
   223,224,252,246,196,1,15,133,244,248,217,201,248,2,221,216,195,255,248,163,
   156,90,137,209,129,252,242,0,0,32,0,82,157,156,90,49,192,57,209,15,132,244,
   247,139,68,36,4,87,83,15,162,139,124,36,16,137,7,137,95,4,137,79,8,137,87,
-  12,91,95,248,1,195,248,164,255,85,137,229,83,137,203,43,163,233,255,137,163,
-  233,255,15,182,139,233,131,252,233,1,15,136,244,248,248,1,139,132,253,139,
-  233,137,4,140,131,252,233,1,15,137,244,1,248,2,139,139,233,139,147,233,252,
-  255,147,233,137,131,233,137,147,233,128,187,233,1,15,130,244,253,15,132,244,
-  252,221,155,233,252,233,244,253,248,6,255,217,155,233,248,7,255,41,163,233,
-  255,139,93,252,252,201,195,255,248,165,255,249,255,129,124,253,202,4,239,
-  15,133,244,253,129,124,253,194,4,239,15,133,244,254,139,44,202,131,198,4,
-  59,44,194,255,15,141,244,255,255,15,140,244,255,255,15,143,244,255,255,15,
-  142,244,255,255,248,6,15,183,70,252,254,141,180,253,134,233,248,9,139,6,15,
-  182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,248,7,15,135,244,43,
-  129,124,253,194,4,239,15,130,244,247,15,133,244,43,255,252,242,15,42,4,194,
-  252,233,244,248,255,221,4,202,219,4,194,252,233,244,249,255,248,8,15,135,
-  244,43,255,252,242,15,42,12,202,252,242,15,16,4,194,131,198,4,102,15,46,193,
-  255,15,134,244,9,255,15,135,244,9,255,15,130,244,9,255,15,131,244,9,255,252,
-  233,244,6,255,219,4,202,252,233,244,248,255,129,124,253,202,4,239,15,131,
-  244,43,129,124,253,194,4,239,15,131,244,43,255,248,1,252,242,15,16,4,194,
-  248,2,131,198,4,102,15,46,4,202,248,3,255,248,1,221,4,202,248,2,221,4,194,
-  248,3,131,198,4,255,15,134,244,247,255,15,135,244,247,255,15,130,244,247,
-  255,15,131,244,247,255,15,183,70,252,254,141,180,253,134,233,248,1,139,6,
-  15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,255,139,108,194,
+  12,91,95,248,1,195,248,164,255,204,248,165,255,85,137,229,83,137,203,43,163,
+  233,255,137,163,233,255,15,182,139,233,131,252,233,1,15,136,244,248,248,1,
+  139,132,253,139,233,137,4,140,131,252,233,1,15,137,244,1,248,2,139,139,233,
+  139,147,233,252,255,147,233,137,131,233,137,147,233,128,187,233,1,15,130,
+  244,253,15,132,244,252,221,155,233,252,233,244,253,248,6,255,217,155,233,
+  248,7,255,41,163,233,255,139,93,252,252,201,195,255,249,255,129,124,253,202,
+  4,239,15,133,244,253,129,124,253,194,4,239,15,133,244,254,139,44,202,131,
+  198,4,59,44,194,255,15,141,244,255,255,15,140,244,255,255,15,143,244,255,
+  255,15,142,244,255,255,248,6,15,183,70,252,254,141,180,253,134,233,248,9,
+  139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,248,7,15,
+  135,244,43,129,124,253,194,4,239,15,130,244,247,15,133,244,43,255,252,242,
+  15,42,4,194,252,233,244,248,255,221,4,202,219,4,194,252,233,244,249,255,248,
+  8,15,135,244,43,255,252,242,15,42,12,202,252,242,15,16,4,194,131,198,4,102,
+  15,46,193,255,15,134,244,9,255,15,135,244,9,255,15,130,244,9,255,15,131,244,
+  9,255,252,233,244,6,255,219,4,202,252,233,244,248,255,129,124,253,202,4,239,
+  15,131,244,43,129,124,253,194,4,239,15,131,244,43,255,248,1,252,242,15,16,
+  4,194,248,2,131,198,4,102,15,46,4,202,248,3,255,248,1,221,4,202,248,2,221,
+  4,194,248,3,131,198,4,255,15,134,244,247,255,15,135,244,247,255,15,130,244,
+  247,255,15,131,244,247,255,15,183,70,252,254,141,180,253,134,233,248,1,139,
+  6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,255,139,108,194,
   4,131,198,4,255,129,252,253,239,15,133,244,253,129,124,253,202,4,239,15,133,
   244,254,139,44,194,59,44,202,255,15,133,244,255,255,15,132,244,255,255,15,
   183,70,252,254,141,180,253,134,233,248,9,139,6,15,182,204,15,182,232,131,
@@ -801,8 +801,8 @@ static const unsigned char build_actionlist[17111] = {
   137,252,245,209,252,237,129,229,239,102,129,172,253,43,233,238,15,130,244,
   148,255,141,12,202,255,129,121,253,4,239,15,133,244,255,255,129,121,253,12,
   239,15,133,244,60,129,121,253,20,239,15,133,244,60,139,41,131,121,16,0,15,
-  140,244,251,255,129,121,253,12,239,15,133,244,165,129,121,253,20,239,15,133,
-  244,165,255,139,105,16,133,252,237,15,136,244,251,3,41,15,128,244,247,137,
+  140,244,251,255,129,121,253,12,239,15,133,244,164,129,121,253,20,239,15,133,
+  244,164,255,139,105,16,133,252,237,15,136,244,251,3,41,15,128,244,247,137,
   41,255,59,105,8,199,65,28,237,137,105,24,255,15,142,244,253,248,1,248,6,141,
   180,253,134,233,255,141,180,253,134,233,15,183,70,252,254,15,142,245,248,
   1,248,6,255,15,143,244,253,248,6,141,180,253,134,233,248,1,255,248,7,139,
@@ -810,7 +810,7 @@ static const unsigned char build_actionlist[17111] = {
   15,128,244,1,137,41,255,15,141,244,7,255,141,180,253,134,233,15,183,70,252,
   254,15,141,245,255,15,140,244,7,255,252,233,244,6,248,9,255,129,121,253,4,
   239,255,15,131,244,60,129,121,253,12,239,15,131,244,60,255,129,121,253,12,
-  239,15,131,244,165,129,121,253,20,239,15,131,244,165,255,139,105,20,255,129,
+  239,15,131,244,164,129,121,253,20,239,15,131,244,164,255,139,105,20,255,129,
   252,253,239,15,131,244,60,255,252,242,15,16,1,252,242,15,16,73,8,255,252,
   242,15,88,65,16,252,242,15,17,1,133,252,237,15,136,244,249,255,15,140,244,
   249,255,102,15,46,200,248,1,252,242,15,17,65,24,255,221,65,8,221,1,255,220,
@@ -995,8 +995,8 @@ enum {
   GLOB_vm_foldfpm,
   GLOB_vm_foldarith,
   GLOB_vm_cpuid,
-  GLOB_vm_ffi_call,
   GLOB_assert_bad_for_arg_type,
+  GLOB_vm_ffi_call,
   GLOB_BC_MODVN_Z,
   GLOB_BC_TGETS_Z,
   GLOB_BC_TSETS_Z,
@@ -1157,8 +1157,8 @@ static const char *const globnames[] = {
   "vm_foldfpm",
   "vm_foldarith",
   "vm_cpuid",
-  "vm_ffi_call@4",
   "assert_bad_for_arg_type",
+  "vm_ffi_call@4",
   "BC_MODVN_Z",
   "BC_TGETS_Z",
   "BC_TSETS_Z",
@@ -1972,31 +1972,30 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
     dasm_put(Dst, 10434);
   }
   dasm_put(Dst, 10899);
+#ifdef LUA_USE_ASSERT
+  dasm_put(Dst, 10436);
+#endif
+  dasm_put(Dst, 10955);
 #if LJ_HASFFI
 #define DtE(_V) (int)(ptrdiff_t)&(((CCallState *)0)_V)
-  dasm_put(Dst, 10955, DtE(->spadj));
+  dasm_put(Dst, 10959, DtE(->spadj));
 #if LJ_TARGET_WINDOWS
-  dasm_put(Dst, 10965, DtE(->spadj));
+  dasm_put(Dst, 10969, DtE(->spadj));
 #endif
-  dasm_put(Dst, 10969, DtE(->nsp), offsetof(CCallState, stack), DtE(->gpr[0]), DtE(->gpr[1]), DtE(->func), DtE(->gpr[0]), DtE(->gpr[1]), DtE(->resx87), DtE(->fpr[0].d[0]));
-  dasm_put(Dst, 11039, DtE(->fpr[0].f[0]));
+  dasm_put(Dst, 10973, DtE(->nsp), offsetof(CCallState, stack), DtE(->gpr[0]), DtE(->gpr[1]), DtE(->func), DtE(->gpr[0]), DtE(->gpr[1]), DtE(->resx87), DtE(->fpr[0].d[0]));
+  dasm_put(Dst, 11043, DtE(->fpr[0].f[0]));
 #if LJ_TARGET_WINDOWS
-  dasm_put(Dst, 11045, DtE(->spadj));
-#endif
-  dasm_put(Dst, 11049);
+  dasm_put(Dst, 11049, DtE(->spadj));
 #endif
-  dasm_put(Dst, 11056);
-#ifdef LUA_USE_ASSERT
-  dasm_put(Dst, 10436);
+  dasm_put(Dst, 11053);
 #endif
-  dasm_put(Dst, 10436);
 }
 
 /* Generate the code for a single instruction. */
 static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 {
   int vk = 0;
-  dasm_put(Dst, 11059, defop);
+  dasm_put(Dst, 11060, defop);
 
   switch (op) {
 
@@ -2007,57 +2006,57 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT:
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 11061, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 11062, LJ_TISNUM, LJ_TISNUM);
       switch (op) {
       case BC_ISLT:
-      dasm_put(Dst, 11091);
+      dasm_put(Dst, 11092);
       break;
       case BC_ISGE:
-      dasm_put(Dst, 11096);
+      dasm_put(Dst, 11097);
       break;
       case BC_ISLE:
-      dasm_put(Dst, 11101);
+      dasm_put(Dst, 11102);
       break;
       case BC_ISGT:
-      dasm_put(Dst, 11106);
+      dasm_put(Dst, 11107);
       break;
       default: break;  /* Shut up GCC. */
       }
-      dasm_put(Dst, 11111, -BCBIAS_J*4, LJ_TISNUM);
+      dasm_put(Dst, 11112, -BCBIAS_J*4, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 11164);
+       dasm_put(Dst, 11165);
       } else {
-       dasm_put(Dst, 11175);
+       dasm_put(Dst, 11176);
       }
-      dasm_put(Dst, 11186);
+      dasm_put(Dst, 11187);
       if (sse) {
-       dasm_put(Dst, 11193);
+       dasm_put(Dst, 11194);
        switch (op) {
        case BC_ISLT:
-       dasm_put(Dst, 11213);
+       dasm_put(Dst, 11214);
        break;
        case BC_ISGE:
-       dasm_put(Dst, 11218);
+       dasm_put(Dst, 11219);
        break;
        case BC_ISLE:
-       dasm_put(Dst, 11223);
+       dasm_put(Dst, 11224);
        break;
        case BC_ISGT:
-       dasm_put(Dst, 11228);
+       dasm_put(Dst, 11229);
        break;
        default: break;  /* Shut up GCC. */
        }
-       dasm_put(Dst, 11233);
+       dasm_put(Dst, 11234);
       } else {
-       dasm_put(Dst, 11238);
+       dasm_put(Dst, 11239);
       }
     } else {
-      dasm_put(Dst, 11246, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 11247, LJ_TISNUM, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 11267);
+      dasm_put(Dst, 11268);
     } else {
-      dasm_put(Dst, 11288);
+      dasm_put(Dst, 11289);
       if (cmov) {
       dasm_put(Dst, 3944);
       } else {
@@ -2067,70 +2066,70 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     if (LJ_DUALNUM) {
       switch (op) {
       case BC_ISLT:
-      dasm_put(Dst, 11213);
+      dasm_put(Dst, 11214);
       break;
       case BC_ISGE:
-      dasm_put(Dst, 11218);
+      dasm_put(Dst, 11219);
       break;
       case BC_ISLE:
-      dasm_put(Dst, 11223);
+      dasm_put(Dst, 11224);
       break;
       case BC_ISGT:
-      dasm_put(Dst, 11228);
+      dasm_put(Dst, 11229);
       break;
       default: break;  /* Shut up GCC. */
       }
-      dasm_put(Dst, 11233);
+      dasm_put(Dst, 11234);
     } else {
       switch (op) {
       case BC_ISLT:
-      dasm_put(Dst, 11304);
+      dasm_put(Dst, 11305);
       break;
       case BC_ISGE:
-      dasm_put(Dst, 11309);
+      dasm_put(Dst, 11310);
       break;
       case BC_ISLE:
-      dasm_put(Dst, 11314);
+      dasm_put(Dst, 11315);
       break;
       case BC_ISGT:
-      dasm_put(Dst, 11319);
+      dasm_put(Dst, 11320);
       break;
       default: break;  /* Shut up GCC. */
       }
-      dasm_put(Dst, 11324, -BCBIAS_J*4);
+      dasm_put(Dst, 11325, -BCBIAS_J*4);
     }
     break;
 
   case BC_ISEQV: case BC_ISNEV:
     vk = op == BC_ISEQV;
-    dasm_put(Dst, 11355);
+    dasm_put(Dst, 11356);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 11363, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 11364, LJ_TISNUM, LJ_TISNUM);
       if (vk) {
-       dasm_put(Dst, 11388);
+       dasm_put(Dst, 11389);
       } else {
-       dasm_put(Dst, 11393);
+       dasm_put(Dst, 11394);
       }
-      dasm_put(Dst, 11398, -BCBIAS_J*4, LJ_TISNUM);
+      dasm_put(Dst, 11399, -BCBIAS_J*4, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 11449);
+       dasm_put(Dst, 11450);
       } else {
-       dasm_put(Dst, 11456);
+       dasm_put(Dst, 11457);
       }
-      dasm_put(Dst, 11460);
+      dasm_put(Dst, 11461);
       if (sse) {
-       dasm_put(Dst, 11471);
+       dasm_put(Dst, 11472);
       } else {
-       dasm_put(Dst, 11483);
+       dasm_put(Dst, 11484);
       }
-      dasm_put(Dst, 11490);
+      dasm_put(Dst, 11491);
     } else {
-      dasm_put(Dst, 11495, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 11496, LJ_TISNUM, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 11514);
+      dasm_put(Dst, 11515);
     } else {
-      dasm_put(Dst, 11532);
+      dasm_put(Dst, 11533);
       if (cmov) {
       dasm_put(Dst, 3944);
       } else {
@@ -2139,13 +2138,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     }
   iseqne_fp:
     if (vk) {
-      dasm_put(Dst, 11545);
+      dasm_put(Dst, 11546);
     } else {
-      dasm_put(Dst, 11554);
+      dasm_put(Dst, 11555);
     }
   iseqne_end:
     if (vk) {
-      dasm_put(Dst, 11563, -BCBIAS_J*4);
+      dasm_put(Dst, 11564, -BCBIAS_J*4);
       if (!LJ_HASFFI) {
        dasm_put(Dst, 4844);
       }
@@ -2153,76 +2152,76 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
       if (!LJ_HASFFI) {
        dasm_put(Dst, 4844);
       }
-      dasm_put(Dst, 11578, -BCBIAS_J*4);
+      dasm_put(Dst, 11579, -BCBIAS_J*4);
     }
     if (LJ_DUALNUM && (op == BC_ISEQV || op == BC_ISNEV ||
                       op == BC_ISEQN || op == BC_ISNEN)) {
-      dasm_put(Dst, 11593);
+      dasm_put(Dst, 11594);
     } else {
-      dasm_put(Dst, 11336);
+      dasm_put(Dst, 11337);
     }
     if (op == BC_ISEQV || op == BC_ISNEV) {
-      dasm_put(Dst, 11598);
+      dasm_put(Dst, 11599);
       if (LJ_HASFFI) {
-       dasm_put(Dst, 11601, LJ_TCDATA, LJ_TCDATA);
+       dasm_put(Dst, 11602, LJ_TCDATA, LJ_TCDATA);
       }
-      dasm_put(Dst, 11620, LJ_TISPRI, LJ_TISTABUD, Dt6(->metatable), Dt6(->nomm), 1<<MM_eq);
+      dasm_put(Dst, 11621, LJ_TISPRI, LJ_TISTABUD, Dt6(->metatable), Dt6(->nomm), 1<<MM_eq);
       if (vk) {
-       dasm_put(Dst, 11676);
+       dasm_put(Dst, 11677);
       } else {
-       dasm_put(Dst, 11680);
+       dasm_put(Dst, 11681);
       }
-      dasm_put(Dst, 11686);
+      dasm_put(Dst, 11687);
     } else if (LJ_HASFFI) {
-      dasm_put(Dst, 11691, LJ_TCDATA);
+      dasm_put(Dst, 11692, LJ_TCDATA);
       if (LJ_DUALNUM && vk) {
-       dasm_put(Dst, 11698);
+       dasm_put(Dst, 11699);
       } else {
-       dasm_put(Dst, 11671);
+       dasm_put(Dst, 11672);
       }
-      dasm_put(Dst, 11703);
+      dasm_put(Dst, 11704);
     }
     break;
   case BC_ISEQS: case BC_ISNES:
     vk = op == BC_ISEQS;
-    dasm_put(Dst, 11708, LJ_TSTR);
+    dasm_put(Dst, 11709, LJ_TSTR);
   iseqne_test:
     if (vk) {
-      dasm_put(Dst, 11549);
+      dasm_put(Dst, 11550);
     } else {
       dasm_put(Dst, 748);
     }
     goto iseqne_end;
   case BC_ISEQN: case BC_ISNEN:
     vk = op == BC_ISEQN;
-    dasm_put(Dst, 11733);
+    dasm_put(Dst, 11734);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 11741, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 11742, LJ_TISNUM, LJ_TISNUM);
       if (vk) {
-       dasm_put(Dst, 11388);
+       dasm_put(Dst, 11389);
       } else {
-       dasm_put(Dst, 11393);
+       dasm_put(Dst, 11394);
       }
-      dasm_put(Dst, 11766, -BCBIAS_J*4, LJ_TISNUM);
+      dasm_put(Dst, 11767, -BCBIAS_J*4, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 11813);
+       dasm_put(Dst, 11814);
       } else {
-       dasm_put(Dst, 11820);
+       dasm_put(Dst, 11821);
       }
-      dasm_put(Dst, 11824);
+      dasm_put(Dst, 11825);
       if (sse) {
-       dasm_put(Dst, 11831);
+       dasm_put(Dst, 11832);
       } else {
-       dasm_put(Dst, 11843);
+       dasm_put(Dst, 11844);
       }
-      dasm_put(Dst, 11490);
+      dasm_put(Dst, 11491);
     } else {
-      dasm_put(Dst, 11850, LJ_TISNUM);
+      dasm_put(Dst, 11851, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 11859);
+      dasm_put(Dst, 11860);
     } else {
-      dasm_put(Dst, 11877);
+      dasm_put(Dst, 11878);
       if (cmov) {
       dasm_put(Dst, 3944);
       } else {
@@ -2232,78 +2231,78 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     goto iseqne_fp;
   case BC_ISEQP: case BC_ISNEP:
     vk = op == BC_ISEQP;
-    dasm_put(Dst, 11890);
+    dasm_put(Dst, 11891);
     if (!LJ_HASFFI) goto iseqne_test;
     if (vk) {
-      dasm_put(Dst, 11903, -BCBIAS_J*4, LJ_TCDATA);
+      dasm_put(Dst, 11904, -BCBIAS_J*4, LJ_TCDATA);
     } else {
-      dasm_put(Dst, 11952, LJ_TCDATA, -BCBIAS_J*4);
+      dasm_put(Dst, 11953, LJ_TCDATA, -BCBIAS_J*4);
     }
     break;
 
   /* -- Unary test and copy ops ------------------------------------------- */
 
   case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF:
-    dasm_put(Dst, 11995, LJ_TISTRUECOND);
+    dasm_put(Dst, 11996, LJ_TISTRUECOND);
     if (op == BC_IST || op == BC_ISTC) {
-      dasm_put(Dst, 11319);
+      dasm_put(Dst, 11320);
     } else {
-      dasm_put(Dst, 11314);
+      dasm_put(Dst, 11315);
     }
     if (op == BC_ISTC || op == BC_ISFC) {
-      dasm_put(Dst, 12007);
+      dasm_put(Dst, 12008);
     }
-    dasm_put(Dst, 11324, -BCBIAS_J*4);
+    dasm_put(Dst, 11325, -BCBIAS_J*4);
     break;
 
   /* -- Unary ops --------------------------------------------------------- */
 
   case BC_MOV:
-    dasm_put(Dst, 12018);
+    dasm_put(Dst, 12019);
     break;
   case BC_NOT:
-    dasm_put(Dst, 12051, LJ_TISTRUECOND, LJ_TTRUE);
+    dasm_put(Dst, 12052, LJ_TISTRUECOND, LJ_TTRUE);
     break;
   case BC_UNM:
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 12086, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 12087, LJ_TISNUM, LJ_TISNUM);
     } else {
-      dasm_put(Dst, 12162, LJ_TISNUM);
+      dasm_put(Dst, 12163, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 12173);
+      dasm_put(Dst, 12174);
     } else {
-      dasm_put(Dst, 12203);
+      dasm_put(Dst, 12204);
     }
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 11593);
+      dasm_put(Dst, 11594);
     } else {
-      dasm_put(Dst, 11336);
+      dasm_put(Dst, 11337);
     }
     break;
   case BC_LEN:
-    dasm_put(Dst, 12212, LJ_TSTR);
+    dasm_put(Dst, 12213, LJ_TSTR);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 12226, Dt5(->len), LJ_TISNUM);
+      dasm_put(Dst, 12227, Dt5(->len), LJ_TISNUM);
     } else if (sse) {
-      dasm_put(Dst, 12240, Dt5(->len));
+      dasm_put(Dst, 12241, Dt5(->len));
     } else {
-      dasm_put(Dst, 12258, Dt5(->len));
+      dasm_put(Dst, 12259, Dt5(->len));
     }
-    dasm_put(Dst, 12267, LJ_TTAB);
+    dasm_put(Dst, 12268, LJ_TTAB);
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
-    dasm_put(Dst, 12301, Dt6(->metatable));
+    dasm_put(Dst, 12302, Dt6(->metatable));
 #endif
-    dasm_put(Dst, 12315);
+    dasm_put(Dst, 12316);
     if (LJ_DUALNUM) {
     } else if (sse) {
-      dasm_put(Dst, 12324);
+      dasm_put(Dst, 12325);
     } else {
-      dasm_put(Dst, 12330);
+      dasm_put(Dst, 12331);
     }
-    dasm_put(Dst, 12337);
+    dasm_put(Dst, 12338);
 #ifdef LUAJIT_ENABLE_LUA52COMPAT
-    dasm_put(Dst, 12350, Dt6(->nomm), 1<<MM_len);
+    dasm_put(Dst, 12351, Dt6(->nomm), 1<<MM_len);
 #endif
     break;
 
@@ -2312,471 +2311,471 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12366);
+    dasm_put(Dst, 12367);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 12374, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12375, LJ_TISNUM, LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 12407, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12408, LJ_TISNUM, LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 12440, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12441, LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 12473, LJ_TISNUM);
+    dasm_put(Dst, 12474, LJ_TISNUM);
     if (vk == 1) {
-    dasm_put(Dst, 12236);
+    dasm_put(Dst, 12237);
     } else {
-    dasm_put(Dst, 12014);
+    dasm_put(Dst, 12015);
     }
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     } else {
-    dasm_put(Dst, 12366);
+    dasm_put(Dst, 12367);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 12479, LJ_TISNUM);
+    dasm_put(Dst, 12480, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12491, LJ_TISNUM);
+    dasm_put(Dst, 12492, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12502);
+    dasm_put(Dst, 12503);
     } else {
-    dasm_put(Dst, 12516);
+    dasm_put(Dst, 12517);
     }
       break;
     case 1:
-    dasm_put(Dst, 12524, LJ_TISNUM);
+    dasm_put(Dst, 12525, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12536, LJ_TISNUM);
+    dasm_put(Dst, 12537, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12547);
+    dasm_put(Dst, 12548);
     } else {
-    dasm_put(Dst, 12561);
+    dasm_put(Dst, 12562);
     }
       break;
     default:
-    dasm_put(Dst, 12569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 12591);
+    dasm_put(Dst, 12592);
     } else {
-    dasm_put(Dst, 12605);
+    dasm_put(Dst, 12606);
     }
       break;
     }
     if (sse) {
-    dasm_put(Dst, 12196);
+    dasm_put(Dst, 12197);
     } else {
-    dasm_put(Dst, 12208);
+    dasm_put(Dst, 12209);
     }
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     }
     break;
   case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12366);
+    dasm_put(Dst, 12367);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 12613, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12614, LJ_TISNUM, LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 12646, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12647, LJ_TISNUM, LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 12679, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12680, LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 12473, LJ_TISNUM);
+    dasm_put(Dst, 12474, LJ_TISNUM);
     if (vk == 1) {
-    dasm_put(Dst, 12236);
+    dasm_put(Dst, 12237);
     } else {
-    dasm_put(Dst, 12014);
+    dasm_put(Dst, 12015);
     }
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     } else {
-    dasm_put(Dst, 12366);
+    dasm_put(Dst, 12367);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 12479, LJ_TISNUM);
+    dasm_put(Dst, 12480, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12491, LJ_TISNUM);
+    dasm_put(Dst, 12492, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12712);
+    dasm_put(Dst, 12713);
     } else {
-    dasm_put(Dst, 12726);
+    dasm_put(Dst, 12727);
     }
       break;
     case 1:
-    dasm_put(Dst, 12524, LJ_TISNUM);
+    dasm_put(Dst, 12525, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12536, LJ_TISNUM);
+    dasm_put(Dst, 12537, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12734);
+    dasm_put(Dst, 12735);
     } else {
-    dasm_put(Dst, 12748);
+    dasm_put(Dst, 12749);
     }
       break;
     default:
-    dasm_put(Dst, 12569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 12756);
+    dasm_put(Dst, 12757);
     } else {
-    dasm_put(Dst, 12770);
+    dasm_put(Dst, 12771);
     }
       break;
     }
     if (sse) {
-    dasm_put(Dst, 12196);
+    dasm_put(Dst, 12197);
     } else {
-    dasm_put(Dst, 12208);
+    dasm_put(Dst, 12209);
     }
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     }
     break;
   case BC_MULVN: case BC_MULNV: case BC_MULVV:
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12366);
+    dasm_put(Dst, 12367);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 12778, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12779, LJ_TISNUM, LJ_TISNUM);
       break;
     case 1:
-    dasm_put(Dst, 12812, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12813, LJ_TISNUM, LJ_TISNUM);
       break;
     default:
-    dasm_put(Dst, 12846, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12847, LJ_TISNUM, LJ_TISNUM);
       break;
     }
-    dasm_put(Dst, 12473, LJ_TISNUM);
+    dasm_put(Dst, 12474, LJ_TISNUM);
     if (vk == 1) {
-    dasm_put(Dst, 12236);
+    dasm_put(Dst, 12237);
     } else {
-    dasm_put(Dst, 12014);
+    dasm_put(Dst, 12015);
     }
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     } else {
-    dasm_put(Dst, 12366);
+    dasm_put(Dst, 12367);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 12479, LJ_TISNUM);
+    dasm_put(Dst, 12480, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12491, LJ_TISNUM);
+    dasm_put(Dst, 12492, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12880);
+    dasm_put(Dst, 12881);
     } else {
-    dasm_put(Dst, 12894);
+    dasm_put(Dst, 12895);
     }
       break;
     case 1:
-    dasm_put(Dst, 12524, LJ_TISNUM);
+    dasm_put(Dst, 12525, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12536, LJ_TISNUM);
+    dasm_put(Dst, 12537, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12902);
+    dasm_put(Dst, 12903);
     } else {
-    dasm_put(Dst, 12916);
+    dasm_put(Dst, 12917);
     }
       break;
     default:
-    dasm_put(Dst, 12569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 12924);
+    dasm_put(Dst, 12925);
     } else {
-    dasm_put(Dst, 12938);
+    dasm_put(Dst, 12939);
     }
       break;
     }
     if (sse) {
-    dasm_put(Dst, 12196);
+    dasm_put(Dst, 12197);
     } else {
-    dasm_put(Dst, 12208);
+    dasm_put(Dst, 12209);
     }
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     }
     break;
   case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:
-    dasm_put(Dst, 12366);
+    dasm_put(Dst, 12367);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 12479, LJ_TISNUM);
+    dasm_put(Dst, 12480, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12491, LJ_TISNUM);
+    dasm_put(Dst, 12492, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12946);
+    dasm_put(Dst, 12947);
     } else {
-    dasm_put(Dst, 12960);
+    dasm_put(Dst, 12961);
     }
       break;
     case 1:
-    dasm_put(Dst, 12524, LJ_TISNUM);
+    dasm_put(Dst, 12525, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12536, LJ_TISNUM);
+    dasm_put(Dst, 12537, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 12968);
+    dasm_put(Dst, 12969);
     } else {
-    dasm_put(Dst, 12982);
+    dasm_put(Dst, 12983);
     }
       break;
     default:
-    dasm_put(Dst, 12569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 12990);
+    dasm_put(Dst, 12991);
     } else {
-    dasm_put(Dst, 13004);
+    dasm_put(Dst, 13005);
     }
       break;
     }
     if (sse) {
-    dasm_put(Dst, 12196);
+    dasm_put(Dst, 12197);
     } else {
-    dasm_put(Dst, 12208);
+    dasm_put(Dst, 12209);
     }
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     break;
   case BC_MODVN:
-    dasm_put(Dst, 12366);
+    dasm_put(Dst, 12367);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 12479, LJ_TISNUM);
+    dasm_put(Dst, 12480, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12491, LJ_TISNUM);
+    dasm_put(Dst, 12492, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 13012);
+    dasm_put(Dst, 13013);
     } else {
-    dasm_put(Dst, 13026);
+    dasm_put(Dst, 13027);
     }
       break;
     case 1:
-    dasm_put(Dst, 12524, LJ_TISNUM);
+    dasm_put(Dst, 12525, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12536, LJ_TISNUM);
+    dasm_put(Dst, 12537, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 13034);
+    dasm_put(Dst, 13035);
     } else {
-    dasm_put(Dst, 13048);
+    dasm_put(Dst, 13049);
     }
       break;
     default:
-    dasm_put(Dst, 12569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 13056);
+    dasm_put(Dst, 13057);
     } else {
-    dasm_put(Dst, 13070);
+    dasm_put(Dst, 13071);
     }
       break;
     }
-    dasm_put(Dst, 13078);
+    dasm_put(Dst, 13079);
     if (sse) {
-    dasm_put(Dst, 12196);
+    dasm_put(Dst, 12197);
     } else {
-    dasm_put(Dst, 12208);
+    dasm_put(Dst, 12209);
     }
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     break;
   case BC_MODNV: case BC_MODVV:
-    dasm_put(Dst, 12366);
+    dasm_put(Dst, 12367);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 12479, LJ_TISNUM);
+    dasm_put(Dst, 12480, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12491, LJ_TISNUM);
+    dasm_put(Dst, 12492, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 13012);
+    dasm_put(Dst, 13013);
     } else {
-    dasm_put(Dst, 13026);
+    dasm_put(Dst, 13027);
     }
       break;
     case 1:
-    dasm_put(Dst, 12524, LJ_TISNUM);
+    dasm_put(Dst, 12525, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12536, LJ_TISNUM);
+    dasm_put(Dst, 12537, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 13034);
+    dasm_put(Dst, 13035);
     } else {
-    dasm_put(Dst, 13048);
+    dasm_put(Dst, 13049);
     }
       break;
     default:
-    dasm_put(Dst, 12569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 13056);
+    dasm_put(Dst, 13057);
     } else {
-    dasm_put(Dst, 13070);
+    dasm_put(Dst, 13071);
     }
       break;
     }
-    dasm_put(Dst, 13084);
+    dasm_put(Dst, 13085);
     break;
   case BC_POW:
-    dasm_put(Dst, 12366);
+    dasm_put(Dst, 12367);
     vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
     switch (vk) {
     case 0:
-    dasm_put(Dst, 12479, LJ_TISNUM);
+    dasm_put(Dst, 12480, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12491, LJ_TISNUM);
+    dasm_put(Dst, 12492, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 13012);
+    dasm_put(Dst, 13013);
     } else {
-    dasm_put(Dst, 13026);
+    dasm_put(Dst, 13027);
     }
       break;
     case 1:
-    dasm_put(Dst, 12524, LJ_TISNUM);
+    dasm_put(Dst, 12525, LJ_TISNUM);
     if (LJ_DUALNUM) {
-    dasm_put(Dst, 12536, LJ_TISNUM);
+    dasm_put(Dst, 12537, LJ_TISNUM);
     }
     if (sse) {
-    dasm_put(Dst, 13034);
+    dasm_put(Dst, 13035);
     } else {
-    dasm_put(Dst, 13048);
+    dasm_put(Dst, 13049);
     }
       break;
     default:
-    dasm_put(Dst, 12569, LJ_TISNUM, LJ_TISNUM);
+    dasm_put(Dst, 12570, LJ_TISNUM, LJ_TISNUM);
     if (sse) {
-    dasm_put(Dst, 13056);
+    dasm_put(Dst, 13057);
     } else {
-    dasm_put(Dst, 13070);
+    dasm_put(Dst, 13071);
     }
       break;
     }
-    dasm_put(Dst, 13089);
+    dasm_put(Dst, 13090);
     if (sse) {
-    dasm_put(Dst, 12196);
+    dasm_put(Dst, 12197);
     } else {
-    dasm_put(Dst, 12208);
+    dasm_put(Dst, 12209);
     }
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     break;
 
   case BC_CAT:
-    dasm_put(Dst, 13093, Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 13094, Dt1(->base), Dt1(->base));
     break;
 
   /* -- Constant ops ------------------------------------------------------ */
 
   case BC_KSTR:
-    dasm_put(Dst, 13187, LJ_TSTR);
+    dasm_put(Dst, 13188, LJ_TSTR);
     break;
   case BC_KCDATA:
 #if LJ_HASFFI
-    dasm_put(Dst, 13187, LJ_TCDATA);
+    dasm_put(Dst, 13188, LJ_TCDATA);
 #endif
     break;
   case BC_KSHORT:
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 13220, LJ_TISNUM);
+      dasm_put(Dst, 13221, LJ_TISNUM);
     } else if (sse) {
-      dasm_put(Dst, 13232);
+      dasm_put(Dst, 13233);
     } else {
-      dasm_put(Dst, 13247);
+      dasm_put(Dst, 13248);
     }
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     break;
   case BC_KNUM:
     if (sse) {
-      dasm_put(Dst, 13255);
+      dasm_put(Dst, 13256);
     } else {
-      dasm_put(Dst, 13268);
+      dasm_put(Dst, 13269);
     }
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     break;
   case BC_KPRI:
-    dasm_put(Dst, 13275);
+    dasm_put(Dst, 13276);
     break;
   case BC_KNIL:
-    dasm_put(Dst, 13301, LJ_TNIL);
+    dasm_put(Dst, 13302, LJ_TNIL);
     break;
 
   /* -- Upvalue and function ops ------------------------------------------ */
 
   case BC_UGET:
-    dasm_put(Dst, 13347, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 13348, offsetof(GCfuncL, uvptr), DtA(->v));
     break;
   case BC_USETV:
 #define TV2MARKOFS \
  ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv))
-    dasm_put(Dst, 13391, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TISNUM - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G);
-    dasm_put(Dst, 13481);
+    dasm_put(Dst, 13392, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TISNUM - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G);
+    dasm_put(Dst, 13482);
     break;
 #undef TV2MARKOFS
   case BC_USETS:
-    dasm_put(Dst, 13493, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G);
+    dasm_put(Dst, 13494, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G);
     break;
   case BC_USETN:
-    dasm_put(Dst, 13584);
+    dasm_put(Dst, 13585);
     if (sse) {
-      dasm_put(Dst, 13589);
+      dasm_put(Dst, 13590);
     } else {
-      dasm_put(Dst, 11846);
+      dasm_put(Dst, 11847);
     }
-    dasm_put(Dst, 13596, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 13597, offsetof(GCfuncL, uvptr), DtA(->v));
     if (sse) {
-      dasm_put(Dst, 13605);
+      dasm_put(Dst, 13606);
     } else {
-      dasm_put(Dst, 13611);
+      dasm_put(Dst, 13612);
     }
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     break;
   case BC_USETP:
-    dasm_put(Dst, 13614, offsetof(GCfuncL, uvptr), DtA(->v));
+    dasm_put(Dst, 13615, offsetof(GCfuncL, uvptr), DtA(->v));
     break;
   case BC_UCLO:
-    dasm_put(Dst, 13651, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 13652, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base));
     break;
 
   case BC_FNEW:
-    dasm_put(Dst, 13705, Dt1(->base), Dt1(->base), LJ_TFUNC);
+    dasm_put(Dst, 13706, Dt1(->base), Dt1(->base), LJ_TFUNC);
     break;
 
   /* -- Table ops --------------------------------------------------------- */
 
   case BC_TNEW:
-    dasm_put(Dst, 13776, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), LJ_TTAB);
+    dasm_put(Dst, 13777, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), LJ_TTAB);
     break;
   case BC_TDUP:
-    dasm_put(Dst, 13902, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB);
+    dasm_put(Dst, 13903, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB);
     break;
 
   case BC_GGET:
-    dasm_put(Dst, 13994, Dt7(->env));
+    dasm_put(Dst, 13995, Dt7(->env));
     break;
   case BC_GSET:
-    dasm_put(Dst, 14012, Dt7(->env));
+    dasm_put(Dst, 14013, Dt7(->env));
     break;
 
   case BC_TGETV:
-    dasm_put(Dst, 14030, LJ_TTAB);
+    dasm_put(Dst, 14031, LJ_TTAB);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 14053, LJ_TISNUM);
+      dasm_put(Dst, 14054, LJ_TISNUM);
     } else {
-      dasm_put(Dst, 14067, LJ_TISNUM);
+      dasm_put(Dst, 14068, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 14078);
+       dasm_put(Dst, 14079);
       } else {
-       dasm_put(Dst, 14099);
+       dasm_put(Dst, 14100);
        if (cmov) {
        dasm_put(Dst, 3944);
        } else {
@@ -2784,30 +2783,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
        }
        dasm_put(Dst, 2680);
       }
-      dasm_put(Dst, 14109);
+      dasm_put(Dst, 14110);
     }
-    dasm_put(Dst, 14114, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index, LJ_TNIL);
-    dasm_put(Dst, 14209, LJ_TSTR);
+    dasm_put(Dst, 14115, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index, LJ_TNIL);
+    dasm_put(Dst, 14210, LJ_TSTR);
     break;
   case BC_TGETS:
-    dasm_put(Dst, 14227, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);
-    dasm_put(Dst, 14315, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 14228, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);
+    dasm_put(Dst, 14316, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
     break;
   case BC_TGETB:
-    dasm_put(Dst, 14385, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
-    dasm_put(Dst, 14484, LJ_TNIL);
+    dasm_put(Dst, 14386, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_index);
+    dasm_put(Dst, 14485, LJ_TNIL);
     break;
 
   case BC_TSETV:
-    dasm_put(Dst, 14501, LJ_TTAB);
+    dasm_put(Dst, 14502, LJ_TTAB);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 14053, LJ_TISNUM);
+      dasm_put(Dst, 14054, LJ_TISNUM);
     } else {
-      dasm_put(Dst, 14067, LJ_TISNUM);
+      dasm_put(Dst, 14068, LJ_TISNUM);
       if (sse) {
-       dasm_put(Dst, 14078);
+       dasm_put(Dst, 14079);
       } else {
-       dasm_put(Dst, 14099);
+       dasm_put(Dst, 14100);
        if (cmov) {
        dasm_put(Dst, 3944);
        } else {
@@ -2815,115 +2814,115 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
        }
        dasm_put(Dst, 2680);
       }
-      dasm_put(Dst, 14524);
+      dasm_put(Dst, 14525);
     }
-    dasm_put(Dst, 14529, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex);
-    dasm_put(Dst, 14613, LJ_TSTR, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
+    dasm_put(Dst, 14530, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex);
+    dasm_put(Dst, 14614, LJ_TSTR, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
     break;
   case BC_TSETS:
-    dasm_put(Dst, 14670, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);
-    dasm_put(Dst, 14745, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DtB(->next));
-    dasm_put(Dst, 14837, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, LJ_TSTR, Dt1(->base), Dt1(->base), Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
+    dasm_put(Dst, 14671, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL);
+    dasm_put(Dst, 14746, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DtB(->next));
+    dasm_put(Dst, 14838, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, LJ_TSTR, Dt1(->base), Dt1(->base), Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
     break;
   case BC_TSETB:
-    dasm_put(Dst, 14933, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable));
-    dasm_put(Dst, 15031, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
+    dasm_put(Dst, 14934, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable));
+    dasm_put(Dst, 15032, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
     break;
 
   case BC_TSETM:
-    dasm_put(Dst, 15077, Dt6(->marked), LJ_GC_BLACK, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base));
-    dasm_put(Dst, 15226, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
+    dasm_put(Dst, 15078, Dt6(->marked), LJ_GC_BLACK, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base));
+    dasm_put(Dst, 15227, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist));
     break;
 
   /* -- Calls and vararg handling ----------------------------------------- */
 
   case BC_CALL: case BC_CALLM:
-    dasm_put(Dst, 12370);
+    dasm_put(Dst, 12371);
     if (op == BC_CALLM) {
-      dasm_put(Dst, 15244);
+      dasm_put(Dst, 15245);
     }
-    dasm_put(Dst, 15249, LJ_TFUNC, Dt7(->pc));
+    dasm_put(Dst, 15250, LJ_TFUNC, Dt7(->pc));
     break;
 
   case BC_CALLMT:
-    dasm_put(Dst, 15244);
+    dasm_put(Dst, 15245);
     break;
   case BC_CALLT:
-    dasm_put(Dst, 15290, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->pc));
-    dasm_put(Dst, 15408, FRAME_TYPE, Dt7(->pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP, FRAME_VARG);
+    dasm_put(Dst, 15291, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->pc));
+    dasm_put(Dst, 15409, FRAME_TYPE, Dt7(->pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP, FRAME_VARG);
     break;
 
   case BC_ITERC:
-    dasm_put(Dst, 15478, LJ_TFUNC, 2+1, Dt7(->pc));
+    dasm_put(Dst, 15479, LJ_TFUNC, 2+1, Dt7(->pc));
     break;
 
   case BC_ITERN:
 #if LJ_HASJIT
 #endif
-    dasm_put(Dst, 15558, Dt6(->asize), Dt6(->array), LJ_TNIL);
+    dasm_put(Dst, 15559, Dt6(->asize), Dt6(->array), LJ_TNIL);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 12231, LJ_TISNUM);
+      dasm_put(Dst, 12232, LJ_TISNUM);
     } else if (sse) {
-      dasm_put(Dst, 12324);
+      dasm_put(Dst, 12325);
     } else {
-      dasm_put(Dst, 15604);
+      dasm_put(Dst, 15605);
     }
-    dasm_put(Dst, 15610);
+    dasm_put(Dst, 15611);
     if (LJ_DUALNUM) {
     } else if (sse) {
-      dasm_put(Dst, 12196);
+      dasm_put(Dst, 12197);
     } else {
-      dasm_put(Dst, 12208);
+      dasm_put(Dst, 12209);
     }
-    dasm_put(Dst, 15629, -BCBIAS_J*4);
+    dasm_put(Dst, 15630, -BCBIAS_J*4);
     if (!LJ_DUALNUM && !sse) {
-      dasm_put(Dst, 15680);
+      dasm_put(Dst, 15681);
     }
-    dasm_put(Dst, 15686, Dt6(->hmask), sizeof(Node), Dt6(->node), DtB(->val.it), LJ_TNIL, DtB(->key.gcr), DtB(->key.it), DtB(->val.gcr), DtB(->val.it));
-    dasm_put(Dst, 15761);
+    dasm_put(Dst, 15687, Dt6(->hmask), sizeof(Node), Dt6(->node), DtB(->val.it), LJ_TNIL, DtB(->key.gcr), DtB(->key.it), DtB(->val.gcr), DtB(->val.it));
+    dasm_put(Dst, 15762);
     break;
 
   case BC_ISNEXT:
-    dasm_put(Dst, 15769, LJ_TFUNC, LJ_TTAB, LJ_TNIL, Dt8(->ffid), FF_next_N, -BCBIAS_J*4, BC_JMP, -BCBIAS_J*4, BC_ITERC);
+    dasm_put(Dst, 15770, LJ_TFUNC, LJ_TTAB, LJ_TNIL, Dt8(->ffid), FF_next_N, -BCBIAS_J*4, BC_JMP, -BCBIAS_J*4, BC_ITERC);
     break;
 
   case BC_VARG:
-    dasm_put(Dst, 15868, (8+FRAME_VARG), LJ_TNIL, Dt1(->maxstack));
-    dasm_put(Dst, 16032, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));
+    dasm_put(Dst, 15869, (8+FRAME_VARG), LJ_TNIL, Dt1(->maxstack));
+    dasm_put(Dst, 16033, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top));
     break;
 
   /* -- Returns ----------------------------------------------------------- */
 
   case BC_RETM:
-    dasm_put(Dst, 15244);
+    dasm_put(Dst, 15245);
     break;
 
   case BC_RET: case BC_RET0: case BC_RET1:
     if (op != BC_RET0) {
-      dasm_put(Dst, 16103);
+      dasm_put(Dst, 16104);
     }
-    dasm_put(Dst, 16107, FRAME_TYPE);
+    dasm_put(Dst, 16108, FRAME_TYPE);
     switch (op) {
     case BC_RET:
-      dasm_put(Dst, 16126);
+      dasm_put(Dst, 16127);
       break;
     case BC_RET1:
-      dasm_put(Dst, 16184);
+      dasm_put(Dst, 16185);
       /* fallthrough */
     case BC_RET0:
-      dasm_put(Dst, 16200);
+      dasm_put(Dst, 16201);
     default:
       break;
     }
-    dasm_put(Dst, 16211, Dt7(->pc), PC2PROTO(k));
+    dasm_put(Dst, 16212, Dt7(->pc), PC2PROTO(k));
     if (op == BC_RET) {
-      dasm_put(Dst, 16253, LJ_TNIL);
+      dasm_put(Dst, 16254, LJ_TNIL);
     } else {
-      dasm_put(Dst, 16262, LJ_TNIL);
+      dasm_put(Dst, 16263, LJ_TNIL);
     }
-    dasm_put(Dst, 16269, -FRAME_VARG, FRAME_TYPEP);
+    dasm_put(Dst, 16270, -FRAME_VARG, FRAME_TYPEP);
     if (op != BC_RET0) {
-      dasm_put(Dst, 16293);
+      dasm_put(Dst, 16294);
     }
     dasm_put(Dst, 4928);
     break;
@@ -2933,7 +2932,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_FORL:
 #if LJ_HASJIT
-    dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
+    dasm_put(Dst, 16298, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -2945,111 +2944,111 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
   case BC_FORI:
   case BC_IFORL:
     vk = (op == BC_IFORL || op == BC_JFORL);
-    dasm_put(Dst, 16318);
+    dasm_put(Dst, 16319);
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 16322, LJ_TISNUM);
+      dasm_put(Dst, 16323, LJ_TISNUM);
       if (!vk) {
-       dasm_put(Dst, 16332, LJ_TISNUM, LJ_TISNUM);
+       dasm_put(Dst, 16333, LJ_TISNUM, LJ_TISNUM);
       } else {
 #ifdef LUA_USE_ASSERT
-       dasm_put(Dst, 16361, LJ_TISNUM, LJ_TISNUM);
+       dasm_put(Dst, 16362, LJ_TISNUM, LJ_TISNUM);
 #endif
-       dasm_put(Dst, 16380);
+       dasm_put(Dst, 16381);
       }
-      dasm_put(Dst, 16399, LJ_TISNUM);
+      dasm_put(Dst, 16400, LJ_TISNUM);
       if (op == BC_FORI) {
-       dasm_put(Dst, 16410, -BCBIAS_J*4);
+       dasm_put(Dst, 16411, -BCBIAS_J*4);
       } else if (op == BC_JFORI) {
-       dasm_put(Dst, 16424, -BCBIAS_J*4, BC_JLOOP);
+       dasm_put(Dst, 16425, -BCBIAS_J*4, BC_JLOOP);
       } else if (op == BC_IFORL) {
-       dasm_put(Dst, 16442, -BCBIAS_J*4);
+       dasm_put(Dst, 16443, -BCBIAS_J*4);
       } else {
-       dasm_put(Dst, 16434, BC_JLOOP);
+       dasm_put(Dst, 16435, BC_JLOOP);
       }
-      dasm_put(Dst, 16456);
+      dasm_put(Dst, 16457);
       if (vk) {
-       dasm_put(Dst, 16479);
+       dasm_put(Dst, 16480);
       }
-      dasm_put(Dst, 16399, LJ_TISNUM);
+      dasm_put(Dst, 16400, LJ_TISNUM);
       if (op == BC_FORI) {
-       dasm_put(Dst, 16488);
+       dasm_put(Dst, 16489);
       } else if (op == BC_JFORI) {
-       dasm_put(Dst, 16493, -BCBIAS_J*4, BC_JLOOP);
+       dasm_put(Dst, 16494, -BCBIAS_J*4, BC_JLOOP);
       } else if (op == BC_IFORL) {
-       dasm_put(Dst, 16507);
+       dasm_put(Dst, 16508);
       } else {
-       dasm_put(Dst, 16503, BC_JLOOP);
+       dasm_put(Dst, 16504, BC_JLOOP);
       }
-      dasm_put(Dst, 16512);
+      dasm_put(Dst, 16513);
     } else if (!vk) {
-      dasm_put(Dst, 16519, LJ_TISNUM);
+      dasm_put(Dst, 16520, LJ_TISNUM);
     }
     if (!vk) {
-      dasm_put(Dst, 16525, LJ_TISNUM);
+      dasm_put(Dst, 16526, LJ_TISNUM);
     } else {
 #ifdef LUA_USE_ASSERT
-      dasm_put(Dst, 16539, LJ_TISNUM, LJ_TISNUM);
+      dasm_put(Dst, 16540, LJ_TISNUM, LJ_TISNUM);
 #endif
     }
-    dasm_put(Dst, 16558);
+    dasm_put(Dst, 16559);
     if (!vk) {
-      dasm_put(Dst, 16562, LJ_TISNUM);
+      dasm_put(Dst, 16563, LJ_TISNUM);
     }
     if (sse) {
-      dasm_put(Dst, 16571);
+      dasm_put(Dst, 16572);
       if (vk) {
-       dasm_put(Dst, 16583);
+       dasm_put(Dst, 16584);
       } else {
-       dasm_put(Dst, 16602);
+       dasm_put(Dst, 16603);
       }
-      dasm_put(Dst, 16607);
+      dasm_put(Dst, 16608);
     } else {
-      dasm_put(Dst, 16620);
+      dasm_put(Dst, 16621);
       if (vk) {
-       dasm_put(Dst, 16626);
+       dasm_put(Dst, 16627);
       } else {
-       dasm_put(Dst, 16642);
+       dasm_put(Dst, 16643);
       }
-      dasm_put(Dst, 16650);
+      dasm_put(Dst, 16651);
       if (cmov) {
       dasm_put(Dst, 3944);
       } else {
       dasm_put(Dst, 3950);
       }
       if (!cmov) {
-       dasm_put(Dst, 16655);
+       dasm_put(Dst, 16656);
       }
     }
     if (op == BC_FORI) {
       if (LJ_DUALNUM) {
-       dasm_put(Dst, 16661);
+       dasm_put(Dst, 16662);
       } else {
-       dasm_put(Dst, 16666, -BCBIAS_J*4);
+       dasm_put(Dst, 16667, -BCBIAS_J*4);
       }
     } else if (op == BC_JFORI) {
-      dasm_put(Dst, 16676, -BCBIAS_J*4, BC_JLOOP);
+      dasm_put(Dst, 16677, -BCBIAS_J*4, BC_JLOOP);
     } else if (op == BC_IFORL) {
       if (LJ_DUALNUM) {
-       dasm_put(Dst, 16690);
+       dasm_put(Dst, 16691);
       } else {
-       dasm_put(Dst, 16695, -BCBIAS_J*4);
+       dasm_put(Dst, 16696, -BCBIAS_J*4);
       }
     } else {
-      dasm_put(Dst, 16686, BC_JLOOP);
+      dasm_put(Dst, 16687, BC_JLOOP);
     }
     if (LJ_DUALNUM) {
-      dasm_put(Dst, 11233);
+      dasm_put(Dst, 11234);
     } else {
-      dasm_put(Dst, 11974);
+      dasm_put(Dst, 11975);
     }
     if (sse) {
-      dasm_put(Dst, 16705);
+      dasm_put(Dst, 16706);
     }
     break;
 
   case BC_ITERL:
 #if LJ_HASJIT
-    dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
+    dasm_put(Dst, 16298, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
@@ -3058,33 +3057,33 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     break;
 #endif
   case BC_IITERL:
-    dasm_put(Dst, 16716, LJ_TNIL);
+    dasm_put(Dst, 16717, LJ_TNIL);
     if (op == BC_JITERL) {
-      dasm_put(Dst, 16731, BC_JLOOP);
+      dasm_put(Dst, 16732, BC_JLOOP);
     } else {
-      dasm_put(Dst, 16745, -BCBIAS_J*4);
+      dasm_put(Dst, 16746, -BCBIAS_J*4);
     }
-    dasm_put(Dst, 11334);
+    dasm_put(Dst, 11335);
     break;
 
   case BC_LOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 16297, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
+    dasm_put(Dst, 16298, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP);
 #endif
     break;
 
   case BC_ILOOP:
-    dasm_put(Dst, 11336);
+    dasm_put(Dst, 11337);
     break;
 
   case BC_JLOOP:
 #if LJ_HASJIT
-    dasm_put(Dst, 16761, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L));
+    dasm_put(Dst, 16762, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L));
 #endif
     break;
 
   case BC_JMP:
-    dasm_put(Dst, 16784, -BCBIAS_J*4);
+    dasm_put(Dst, 16785, -BCBIAS_J*4);
     break;
 
   /* -- Function headers -------------------------------------------------- */
@@ -3098,7 +3097,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
 
   case BC_FUNCF:
 #if LJ_HASJIT
-    dasm_put(Dst, 16808, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);
+    dasm_put(Dst, 16809, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL);
 #endif
   case BC_FUNCV:  /* NYI: compiled vararg functions. */
     break;
@@ -3108,13 +3107,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     break;
 #endif
   case BC_IFUNCF:
-    dasm_put(Dst, 16829, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams));
+    dasm_put(Dst, 16830, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams));
     if (op == BC_JFUNCF) {
-      dasm_put(Dst, 16859, BC_JLOOP);
+      dasm_put(Dst, 16860, BC_JLOOP);
     } else {
-      dasm_put(Dst, 11336);
+      dasm_put(Dst, 11337);
     }
-    dasm_put(Dst, 16868, LJ_TNIL);
+    dasm_put(Dst, 16869, LJ_TNIL);
     break;
 
   case BC_JFUNCV:
@@ -3125,30 +3124,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     break;  /* NYI: compiled vararg functions. */
 
   case BC_IFUNCV:
-    dasm_put(Dst, 16890, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL);
+    dasm_put(Dst, 16891, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL);
     if (op == BC_JFUNCV) {
-      dasm_put(Dst, 16859, BC_JLOOP);
+      dasm_put(Dst, 16860, BC_JLOOP);
     } else {
-      dasm_put(Dst, 16981, -4+PC2PROTO(k));
+      dasm_put(Dst, 16982, -4+PC2PROTO(k));
     }
-    dasm_put(Dst, 17003, LJ_TNIL);
+    dasm_put(Dst, 17004, LJ_TNIL);
     break;
 
   case BC_FUNCC:
   case BC_FUNCCW:
-    dasm_put(Dst, 17025, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top));
+    dasm_put(Dst, 17026, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top));
     if (op == BC_FUNCC) {
-      dasm_put(Dst, 17054);
+      dasm_put(Dst, 17055);
     } else {
-      dasm_put(Dst, 17058);
+      dasm_put(Dst, 17059);
     }
-    dasm_put(Dst, 17066, DISPATCH_GL(vmstate), ~LJ_VMST_C);
+    dasm_put(Dst, 17067, DISPATCH_GL(vmstate), ~LJ_VMST_C);
     if (op == BC_FUNCC) {
-      dasm_put(Dst, 17075);
+      dasm_put(Dst, 17076);
     } else {
-      dasm_put(Dst, 17079, DISPATCH_GL(wrapf));
+      dasm_put(Dst, 17080, DISPATCH_GL(wrapf));
     }
-    dasm_put(Dst, 17084, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top));
+    dasm_put(Dst, 17085, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top));
     break;
 
   /* ---------------------------------------------------------------------- */
@@ -3176,7 +3175,7 @@ static int build_backend(BuildCtx *ctx)
 
   build_subroutines(ctx, cmov, sse);
 
-  dasm_put(Dst, 17109);
+  dasm_put(Dst, 17110);
   for (op = 0; op < BC__MAX; op++)
     build_ins(ctx, (BCOp)op, op, cmov, sse);
 
@@ -3186,6 +3185,7 @@ static int build_backend(BuildCtx *ctx)
 /* Emit pseudo frame-info for all assembler functions. */
 static void emit_asm_debug(BuildCtx *ctx)
 {
+  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);
 #if LJ_64
 #define SZPTR  "8"
 #define BSZPTR "3"
@@ -3219,22 +3219,49 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.long .LEFDE0-.LASFDE0\n"
        ".LASFDE0:\n"
        "\t.long .Lframe0\n"
-       "\t.long .Lbegin\n"
-       "\t.long %d\n"
-       "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
 #if LJ_64
+       "\t.quad .Lbegin\n"
+       "\t.quad %d\n"
+       "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
        "\t.byte 0x86\n\t.uleb128 0x2\n"        /* offset rbp */
        "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
        "\t.byte 0x8f\n\t.uleb128 0x4\n"        /* offset r15 */
        "\t.byte 0x8e\n\t.uleb128 0x5\n"        /* offset r14 */
 #else
+       "\t.long .Lbegin\n"
+       "\t.long %d\n"
+       "\t.byte 0xe\n\t.uleb128 %d\n"          /* def_cfa_offset */
        "\t.byte 0x85\n\t.uleb128 0x2\n"        /* offset ebp */
        "\t.byte 0x87\n\t.uleb128 0x3\n"        /* offset edi */
        "\t.byte 0x86\n\t.uleb128 0x4\n"        /* offset esi */
        "\t.byte 0x83\n\t.uleb128 0x5\n"        /* offset ebx */
 #endif
        "\t.align " SZPTR "\n"
-       ".LEFDE0:\n\n", (int)ctx->codesz, CFRAME_SIZE);
+       ".LEFDE0:\n\n", fcofs, CFRAME_SIZE);
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".LSFDE1:\n"
+       "\t.long .LEFDE1-.LASFDE1\n"
+       ".LASFDE1:\n"
+       "\t.long .Lframe0\n"
+#if LJ_64
+       "\t.quad lj_vm_ffi_call\n"
+       "\t.quad %d\n"
+       "\t.byte 0xe\n\t.uleb128 16\n"          /* def_cfa_offset */
+       "\t.byte 0x86\n\t.uleb128 0x2\n"        /* offset rbp */
+       "\t.byte 0xd\n\t.uleb128 0x6\n"         /* def_cfa_register rbp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
+#else
+       "\t.long lj_vm_ffi_call\n"
+       "\t.long %d\n"
+       "\t.byte 0xe\n\t.uleb128 8\n"           /* def_cfa_offset */
+       "\t.byte 0x85\n\t.uleb128 0x2\n"        /* offset ebp */
+       "\t.byte 0xd\n\t.uleb128 0x5\n"         /* def_cfa_register ebp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset ebx */
+#endif
+       "\t.align " SZPTR "\n"
+       ".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
+#endif
 #if (defined(__sun__) && defined(__svr4__)) || defined(__solaris_)
     fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n");
 #else
@@ -3259,10 +3286,10 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.align " SZPTR "\n"
        ".LECIE1:\n\n");
     fprintf(ctx->fp,
-       ".LSFDE1:\n"
-       "\t.long .LEFDE1-.LASFDE1\n"
-       ".LASFDE1:\n"
-       "\t.long .LASFDE1-.Lframe1\n"
+       ".LSFDE2:\n"
+       "\t.long .LEFDE2-.LASFDE2\n"
+       ".LASFDE2:\n"
+       "\t.long .LASFDE2-.Lframe1\n"
        "\t.long .Lbegin-.\n"
        "\t.long %d\n"
        "\t.uleb128 0\n"                        /* augmentation length */
@@ -3279,7 +3306,46 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.byte 0x83\n\t.uleb128 0x5\n"        /* offset ebx */
 #endif
        "\t.align " SZPTR "\n"
-       ".LEFDE1:\n\n", (int)ctx->codesz, CFRAME_SIZE);
+       ".LEFDE2:\n\n", fcofs, CFRAME_SIZE);
+#if LJ_HASFFI
+    fprintf(ctx->fp,
+       ".Lframe2:\n"
+       "\t.long .LECIE2-.LSCIE2\n"
+       ".LSCIE2:\n"
+       "\t.long 0\n"
+       "\t.byte 0x1\n"
+       "\t.string \"zR\"\n"
+       "\t.uleb128 0x1\n"
+       "\t.sleb128 -" SZPTR "\n"
+       "\t.byte " REG_RA "\n"
+       "\t.uleb128 1\n"                        /* augmentation length */
+       "\t.byte 0x1b\n"                        /* pcrel|sdata4 */
+       "\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n"
+       "\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n"
+       "\t.align " SZPTR "\n"
+       ".LECIE2:\n\n");
+    fprintf(ctx->fp,
+       ".LSFDE3:\n"
+       "\t.long .LEFDE3-.LASFDE3\n"
+       ".LASFDE3:\n"
+       "\t.long .LASFDE3-.Lframe2\n"
+       "\t.long lj_vm_ffi_call-.\n"
+       "\t.long %d\n"
+       "\t.uleb128 0\n"                        /* augmentation length */
+#if LJ_64
+       "\t.byte 0xe\n\t.uleb128 16\n"          /* def_cfa_offset */
+       "\t.byte 0x86\n\t.uleb128 0x2\n"        /* offset rbp */
+       "\t.byte 0xd\n\t.uleb128 0x6\n"         /* def_cfa_register rbp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
+#else
+       "\t.byte 0xe\n\t.uleb128 8\n"           /* def_cfa_offset */
+       "\t.byte 0x85\n\t.uleb128 0x2\n"        /* offset ebp */
+       "\t.byte 0xd\n\t.uleb128 0x5\n"         /* def_cfa_register ebp */
+       "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset ebx */
+#endif
+       "\t.align " SZPTR "\n"
+       ".LEFDE3:\n\n", (int)ctx->codesz - fcofs);
+#endif
     break;
   case BUILD_coffasm:
     fprintf(ctx->fp, "\t.section .eh_frame,\"dr\"\n");
@@ -3330,6 +3396,9 @@ static void emit_asm_debug(BuildCtx *ctx)
   ** Or a linker. Or a plastic case. But I digress.
   */
   case BUILD_machasm: {
+#if LJ_HASFFI
+    int fcsize = 0;
+#endif
     int i;
     fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n");
     fprintf(ctx->fp,
@@ -3361,6 +3430,9 @@ static void emit_asm_debug(BuildCtx *ctx)
       const char *name = ctx->sym[i].name;
       int32_t size = ctx->sym[i+1].ofs - ctx->sym[i].ofs;
       if (size == 0) continue;
+#if LJ_HASFFI
+      if (!strcmp(name, "_lj_vm_ffi_call")) { fcsize = size; continue; }
+#endif
       fprintf(ctx->fp,
          "%s.eh:\n"
          "LSFDE%d:\n"
@@ -3370,23 +3442,72 @@ static void emit_asm_debug(BuildCtx *ctx)
          "\t.long LASFDE%d-EH_frame1\n"
          "\t.long %s-.\n"
          "\t.long %d\n"
-         "\t.byte 0\n"                 /* augmentation length */
+         "\t.byte 0\n"                         /* augmentation length */
          "\t.byte 0xe\n\t.byte %d\n"           /* def_cfa_offset */
 #if LJ_64
-         "\t.byte 0x86\n\t.byte 0x2\n" /* offset rbp */
-         "\t.byte 0x83\n\t.byte 0x3\n" /* offset rbx */
-         "\t.byte 0x8f\n\t.byte 0x4\n" /* offset r15 */
-         "\t.byte 0x8e\n\t.byte 0x5\n" /* offset r14 */
+         "\t.byte 0x86\n\t.byte 0x2\n"         /* offset rbp */
+         "\t.byte 0x83\n\t.byte 0x3\n"         /* offset rbx */
+         "\t.byte 0x8f\n\t.byte 0x4\n"         /* offset r15 */
+         "\t.byte 0x8e\n\t.byte 0x5\n"         /* offset r14 */
 #else
-         "\t.byte 0x84\n\t.byte 0x2\n" /* offset ebp (4 for MACH-O)*/
-         "\t.byte 0x87\n\t.byte 0x3\n" /* offset edi */
-         "\t.byte 0x86\n\t.byte 0x4\n" /* offset esi */
-         "\t.byte 0x83\n\t.byte 0x5\n" /* offset ebx */
+         "\t.byte 0x84\n\t.byte 0x2\n"         /* offset ebp (4 for MACH-O)*/
+         "\t.byte 0x87\n\t.byte 0x3\n"         /* offset edi */
+         "\t.byte 0x86\n\t.byte 0x4\n"         /* offset esi */
+         "\t.byte 0x83\n\t.byte 0x5\n"         /* offset ebx */
 #endif
          "\t.align " BSZPTR "\n"
          "LEFDE%d:\n\n",
          name, i, i, i, i, i, i, i, name, size, CFRAME_SIZE, i);
     }
+#if LJ_HASFFI
+    if (fcsize) {
+      fprintf(ctx->fp,
+         "EH_frame2:\n"
+         "\t.set L$set$y,LECIEY-LSCIEY\n"
+         "\t.long L$set$y\n"
+         "LSCIEY:\n"
+         "\t.long 0\n"
+         "\t.byte 0x1\n"
+         "\t.ascii \"zR\\0\"\n"
+         "\t.byte 0x1\n"
+         "\t.byte 128-" SZPTR "\n"
+         "\t.byte " REG_RA "\n"
+         "\t.byte 1\n"                         /* augmentation length */
+#if LJ_64
+         "\t.byte 0x1b\n"                      /* pcrel|sdata4 */
+         "\t.byte 0xc\n\t.byte " REG_SP "\n\t.byte " SZPTR "\n"
+#else
+         "\t.byte 0x1b\n"                      /* pcrel|sdata4 */
+         "\t.byte 0xc\n\t.byte 0x5\n\t.byte 0x4\n"  /* esp=5 on 32 bit MACH. */
+#endif
+         "\t.byte 0x80+" REG_RA "\n\t.byte 0x1\n"
+         "\t.align " BSZPTR "\n"
+         "LECIEY:\n\n");
+      fprintf(ctx->fp,
+         "_lj_vm_ffi_call.eh:\n"
+         "LSFDEY:\n"
+         "\t.set L$set$yy,LEFDEY-LASFDEY\n"
+         "\t.long L$set$yy\n"
+         "LASFDEY:\n"
+         "\t.long LASFDEY-EH_frame2\n"
+         "\t.long _lj_vm_ffi_call-.\n"
+         "\t.long %d\n"
+         "\t.byte 0\n"                         /* augmentation length */
+#if LJ_64
+         "\t.byte 0xe\n\t.byte 16\n"           /* def_cfa_offset */
+         "\t.byte 0x86\n\t.byte 0x2\n"         /* offset rbp */
+         "\t.byte 0xd\n\t.uleb128 0x6\n"       /* def_cfa_register rbp */
+         "\t.byte 0x83\n\t.byte 0x3\n"         /* offset rbx */
+#else
+         "\t.byte 0xe\n\t.byte 8\n"            /* def_cfa_offset */
+         "\t.byte 0x84\n\t.byte 0x2\n"         /* offset ebp (4 for MACH-O)*/
+         "\t.byte 0xd\n\t.uleb128 0x4\n"       /* def_cfa_register ebp */
+         "\t.byte 0x83\n\t.byte 0x3\n"         /* offset ebx */
+#endif
+         "\t.align " BSZPTR "\n"
+         "LEFDEY:\n\n", fcsize);
+    }
+#endif
 #if LJ_64
     fprintf(ctx->fp, "\t.subsections_via_symbols\n");
 #else
index 890f665d3aafdf9e750498c9a0757bb5a3429432..14f61924a316a1b688f6163eb50d0f19442a408f 100644 (file)
@@ -64,8 +64,8 @@ typedef intptr_t GPRArg;
 #define CCALL_NARG_FPR         8
 #define CCALL_NRET_GPR         4       /* For complex double. */
 #define CCALL_NRET_FPR         1
-#define CCALL_SPS_EXTRA                3
-#define CCALL_SPS_FREE         1
+#define CCALL_SPS_EXTRA                4
+#define CCALL_SPS_FREE         0
 
 typedef intptr_t GPRArg;
 typedef double FPRArg;