From 089c55ab2971a5d73b5dc918c564a78e31d4f8e3 Mon Sep 17 00:00:00 2001 From: Luke Gorrie Date: Fri, 17 Nov 2017 09:50:46 +0000 Subject: [PATCH 1/9] lj_obj.h: Explicitly define implicit VM states Define enums for implicit VM states that make sense even though they are never explicitly stored in the g->vmstate field: jit head, jit loop, jit garbage collection, and ffi. --- src/lj_obj.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lj_obj.h b/src/lj_obj.h index 4025177843..c290f3e56d 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h @@ -438,6 +438,7 @@ typedef struct GCtab { /* VM states. */ enum { + /* VM states. */ LJ_VMST_INTERP, /* Interpreter. */ LJ_VMST_C, /* C function. */ LJ_VMST_GC, /* Garbage collector. */ @@ -445,6 +446,14 @@ enum { LJ_VMST_RECORD, /* Trace recorder. */ LJ_VMST_OPT, /* Optimizer. */ LJ_VMST_ASM, /* Assembler. */ + /* JIT trace states. + ** These are "abstract" states that logically exist but are never + ** directly used for the value of global_State.vmstate. + */ + LJ_VMST_HEAD, /* Trace mcode before loop */ + LJ_VMST_LOOP, /* Trace mcode inside loop */ + LJ_VMST_JGC, /* GC invoked from JIT mcode. */ + LJ_VMST_FFI, /* Other code outside trace mcode */ LJ_VMST__MAX }; From bd7266db907280d7c1359a2627364b8c49d5401f Mon Sep 17 00:00:00 2001 From: Luke Gorrie Date: Fri, 17 Nov 2017 09:51:08 +0000 Subject: [PATCH 2/9] Track last exited trace (lasttrace) in global_State The VM now keeps track of the previous vmstate from before the most recent exit to the interpreter. The field is global_State.lasttrace. This is intended to help with profiling and diagnostics ("which trace is to blame for all these expensive exits into the interpreter?") --- src/lj_obj.h | 1 + src/vm_x64.dasc | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/lj_obj.h b/src/lj_obj.h index c290f3e56d..2b4d954c1b 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h @@ -527,6 +527,7 @@ typedef struct global_State { GCState gc; /* Garbage collector. */ volatile int32_t vmstate; /* VM state or current JIT code trace number. */ volatile int32_t gcvmstate; /* Previous VM state (only when state is GC). */ + volatile int32_t lasttrace; /* VM state before exit to interpreter. */ SBuf tmpbuf; /* Temporary string buffer. */ GCstr strempty; /* Empty string. */ uint8_t stremptyz; /* Zero terminator of empty string. */ diff --git a/src/vm_x64.dasc b/src/vm_x64.dasc index 9161cea9e0..e188b9f14a 100644 --- a/src/vm_x64.dasc +++ b/src/vm_x64.dasc @@ -2061,6 +2061,10 @@ static void build_subroutines(BuildCtx *ctx) | mov KBASE, [KBASE+PC2PROTO(k)] | mov L:RB->base, BASE | mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0 + | mov TMPRd, dword [DISPATCH+DISPATCH_GL(vmstate)] + | // Record which trace exited to the interpreter, then switch state + | mov TMPRd, dword [DISPATCH+DISPATCH_GL(vmstate)] + | mov dword [DISPATCH+DISPATCH_GL(lasttrace)], TMPRd | set_vmstate INTERP | // Modified copy of ins_next which handles function header dispatch, too. | mov RCd, [PC] From 2b89796f68c3687d2c0231757553f7e7c8bcff3c Mon Sep 17 00:00:00 2001 From: Luke Gorrie Date: Fri, 17 Nov 2017 09:54:41 +0000 Subject: [PATCH 3/9] vmprofile 3.0 with more information This is an extension to the data collected by vmprofile and its file format: The overall vm state counters are extended with the new fine-grained definitions introduced in 089c55a that also covers JIT mode operation. Now the profiler will always bump exactly one VM state counter. So if you don't care about per-trace information you don't have to look at it, since the overall summary is complete in itself, and the per-trace information is only a supplementary breakdown. Traces now count 'interp' time, which is the time spent in the interpreter due to an exit at the end of that trace. This is for working out which trace to "blame" when the interpreter is hot. The 'other' counter is renamed to 'ffi' because in practice we always assume that is the reason. --- src/lj_vmprofile.c | 34 +++++++++++++++++++++++++++------- src/lj_vmprofile.h | 11 +++++++++-- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/lj_vmprofile.c b/src/lj_vmprofile.c index bb35e9bc54..6ceb9239d6 100644 --- a/src/lj_vmprofile.c +++ b/src/lj_vmprofile.c @@ -46,7 +46,7 @@ int vmprofile_get_profile_size() { void vmprofile_set_profile(void *counters) { profile = (VMProfile*)counters; profile->magic = 0x1d50f007; - profile->major = 2; + profile->major = 3; profile->minor = 0; } @@ -58,25 +58,45 @@ static void vmprofile_signal(int sig, siginfo_t *si, void *data) if (profile != NULL) { lua_State *L = gco2th(gcref(state.g->cur_L)); int vmstate = state.g->vmstate; - int trace = ~vmstate == LJ_VMST_GC ? state.g->gcvmstate : vmstate; - /* Not in a trace */ - if (trace < 0) { - profile->vm[~vmstate]++; - } else { + int trace = 0; + /* Get the relevant trace number */ + if (vmstate > 0) { + /* JIT mcode */ + trace = vmstate; + } else if (~vmstate == LJ_VMST_GC) { + /* JIT GC */ + trace = state.g->gcvmstate; + } else if (~vmstate == LJ_VMST_INTERP && state.g->lasttrace > 0) { + /* Interpreter entered at the end of some trace */ + trace = state.g->lasttrace; + } + if (trace > 0) { + /* JIT mode: Bump a global counter and a per-trace counter. */ int bucket = trace > LJ_VMPROFILE_TRACE_MAX ? 0 : trace; VMProfileTraceCount *count = &profile->trace[bucket]; GCtrace *T = traceref(L2J(L), (TraceNo)trace); intptr_t ip = (intptr_t)((ucontext_t*)data)->uc_mcontext.gregs[REG_RIP]; ptrdiff_t mcposition = ip - (intptr_t)T->mcode; + printf("trace %d interp %d\n", trace, ~vmstate == LJ_VMST_INTERP); if (~vmstate == LJ_VMST_GC) { + profile->vm[LJ_VMST_JGC]++; count->gc++; + } else if (~vmstate == LJ_VMST_INTERP) { + profile->vm[LJ_VMST_INTERP]++; + count->interp++; } else if ((mcposition < 0) || (mcposition >= T->szmcode)) { - count->other++; + profile->vm[LJ_VMST_FFI]++; + count->ffi++; } else if ((T->mcloop != 0) && (mcposition >= T->mcloop)) { + profile->vm[LJ_VMST_LOOP]++; count->loop++; } else { + profile->vm[LJ_VMST_HEAD]++; count->head++; } + } else { + /* Interpreter mode: Just bump a global counter. */ + profile->vm[~vmstate]++; } } } diff --git a/src/lj_vmprofile.h b/src/lj_vmprofile.h index b03c75e109..4fc7aab428 100644 --- a/src/lj_vmprofile.h +++ b/src/lj_vmprofile.h @@ -6,7 +6,6 @@ #ifndef _LJ_VMPROFILE_H #define _LJ_VMPROFILE_H - /* Counters are 64-bit to avoid overflow even in long running processes. */ typedef uint64_t VMProfileCount; @@ -18,15 +17,23 @@ typedef uint64_t VMProfileCount; typedef struct VMProfileTraceCount { VMProfileCount head; /* Head of the trace (non-looping part) */ VMProfileCount loop; /* Loop of the trace */ - VMProfileCount other; /* Outside the trace mcode (unidentified) */ + VMProfileCount ffi; /* Outside the trace mcode (assumed FFI) */ VMProfileCount gc; /* Garbage collection from this trace. */ + VMProfileCount interp; /* Interpreter due to exit from this trace. */ } VMProfileTraceCount; /* Complete set of counters for VM and traces. */ typedef struct VMProfile { uint32_t magic; /* 0x1d50f007 */ uint16_t major, minor; /* 2, 0 */ + /* The profiler always bumps exactly one VM state counter. */ VMProfileCount vm[LJ_VMST__MAX]; + /* The profiler also bumps exactly one per-trace counter for the + ** currently executing trace (JIT mode) or for the most recently + ** executing trace (interpreter mode.) This bump is skipped only if + ** no trace can be identified for some reason e.g. none have been + ** recorded. + **/ VMProfileTraceCount trace[LJ_VMPROFILE_TRACE_MAX+1]; } VMProfile; From 5cac382f4e4098841ca929738e752298d919205a Mon Sep 17 00:00:00 2001 From: Luke Gorrie Date: Mon, 20 Nov 2017 08:35:21 +0000 Subject: [PATCH 4/9] lj_vmprofile.c: Fix file header initialization There was a bug where the magic and version numbers would be left as zeros. --- src/lj_vmprofile.c | 2 +- src/lj_vmprofile.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lj_vmprofile.c b/src/lj_vmprofile.c index 6ceb9239d6..c449db5197 100644 --- a/src/lj_vmprofile.c +++ b/src/lj_vmprofile.c @@ -153,7 +153,7 @@ LUA_API int luaJIT_vmprofile_close(lua_State *L, void *ud) LUA_API int luaJIT_vmprofile_select(lua_State *L, void *ud) { setlightudV(L->base, checklightudptr(L, profile)); - profile = (VMProfile *)ud; + vmprofile_set_profile(ud); return 1; } diff --git a/src/lj_vmprofile.h b/src/lj_vmprofile.h index 4fc7aab428..4be8457cf7 100644 --- a/src/lj_vmprofile.h +++ b/src/lj_vmprofile.h @@ -25,7 +25,7 @@ typedef struct VMProfileTraceCount { /* Complete set of counters for VM and traces. */ typedef struct VMProfile { uint32_t magic; /* 0x1d50f007 */ - uint16_t major, minor; /* 2, 0 */ + uint16_t major, minor; /* 3, 0 */ /* The profiler always bumps exactly one VM state counter. */ VMProfileCount vm[LJ_VMST__MAX]; /* The profiler also bumps exactly one per-trace counter for the From c1659d94d901330a78e6aecfbdca7c8474ed1992 Mon Sep 17 00:00:00 2001 From: Luke Gorrie Date: Thu, 23 Nov 2017 15:47:04 +0000 Subject: [PATCH 5/9] VMProfile 4.0: File format revision Now data is stored in a 2D matrix indexed by VM state and trace number (0 for "other.") This holds for all VM states including interpreting, recording, etc. This makes the format simpler and more regular. Previously the samples were stored in two related sections, one global and one per-trace. Now it is all per-trace with 0 as a catch all. (Just sum the values for all traces to compute the total "global" values.) --- src/lj_vmprofile.c | 66 +++++++++++++++++++++------------------------- src/lj_vmprofile.h | 29 +++++++------------- 2 files changed, 40 insertions(+), 55 deletions(-) diff --git a/src/lj_vmprofile.c b/src/lj_vmprofile.c index c449db5197..e021a95e6d 100644 --- a/src/lj_vmprofile.c +++ b/src/lj_vmprofile.c @@ -46,7 +46,7 @@ int vmprofile_get_profile_size() { void vmprofile_set_profile(void *counters) { profile = (VMProfile*)counters; profile->magic = 0x1d50f007; - profile->major = 3; + profile->major = 4; profile->minor = 0; } @@ -56,48 +56,42 @@ void vmprofile_set_profile(void *counters) { static void vmprofile_signal(int sig, siginfo_t *si, void *data) { if (profile != NULL) { + int vmstate, trace; /* sample matrix indices */ lua_State *L = gco2th(gcref(state.g->cur_L)); - int vmstate = state.g->vmstate; - int trace = 0; - /* Get the relevant trace number */ - if (vmstate > 0) { - /* JIT mcode */ - trace = vmstate; - } else if (~vmstate == LJ_VMST_GC) { - /* JIT GC */ - trace = state.g->gcvmstate; - } else if (~vmstate == LJ_VMST_INTERP && state.g->lasttrace > 0) { - /* Interpreter entered at the end of some trace */ - trace = state.g->lasttrace; - } - if (trace > 0) { - /* JIT mode: Bump a global counter and a per-trace counter. */ - int bucket = trace > LJ_VMPROFILE_TRACE_MAX ? 0 : trace; - VMProfileTraceCount *count = &profile->trace[bucket]; - GCtrace *T = traceref(L2J(L), (TraceNo)trace); + /* + * The basic job of this function is to select the right indices + * into the profile counter matrix. That requires deciding which + * logical state the VM is in and which trace the sample should be + * attributed to. Heuristics are needed to pick appropriate values. + */ + if (state.g->vmstate > 0) { /* Running JIT mcode. */ + GCtrace *T = traceref(L2J(L), (TraceNo)state.g->vmstate); intptr_t ip = (intptr_t)((ucontext_t*)data)->uc_mcontext.gregs[REG_RIP]; ptrdiff_t mcposition = ip - (intptr_t)T->mcode; - printf("trace %d interp %d\n", trace, ~vmstate == LJ_VMST_INTERP); - if (~vmstate == LJ_VMST_GC) { - profile->vm[LJ_VMST_JGC]++; - count->gc++; - } else if (~vmstate == LJ_VMST_INTERP) { - profile->vm[LJ_VMST_INTERP]++; - count->interp++; - } else if ((mcposition < 0) || (mcposition >= T->szmcode)) { - profile->vm[LJ_VMST_FFI]++; - count->ffi++; + if ((mcposition < 0) || (mcposition >= T->szmcode)) { + vmstate = LJ_VMST_FFI; /* IP is outside the trace mcode. */ } else if ((T->mcloop != 0) && (mcposition >= T->mcloop)) { - profile->vm[LJ_VMST_LOOP]++; - count->loop++; + vmstate = LJ_VMST_LOOP; /* IP is inside the mcode loop. */ + } else { + vmstate = LJ_VMST_HEAD; /* IP is inside mcode but not loop. */ + } + trace = state.g->vmstate; + } else { /* Running VM code (not JIT mcode.) */ + if (~state.g->vmstate == LJ_VMST_GC && state.g->gcvmstate > 0) { + /* Special case: GC invoked from JIT mcode. */ + vmstate = LJ_VMST_JGC; + trace = state.g->gcvmstate; } else { - profile->vm[LJ_VMST_HEAD]++; - count->head++; + /* General case: count towards most recently exited trace. */ + vmstate = ~state.g->vmstate; + trace = state.g->lasttrace; } - } else { - /* Interpreter mode: Just bump a global counter. */ - profile->vm[~vmstate]++; } + /* Handle overflow from individual trace counters. */ + trace = trace <= LJ_VMPROFILE_TRACE_MAX ? trace : LJ_VMPROFILE_TRACE_MAX+1; + /* Phew! We have calculated the indices and now we can bump the counter. */ + assert(vmstate >= 0 && vmstate <= LJ_VMST__MAX); + profile->count[trace][vmstate]++; } } diff --git a/src/lj_vmprofile.h b/src/lj_vmprofile.h index 4be8457cf7..2cdce69640 100644 --- a/src/lj_vmprofile.h +++ b/src/lj_vmprofile.h @@ -10,31 +10,22 @@ typedef uint64_t VMProfileCount; /* Maximum trace number for distinct counter buckets. Traces with - higher numbers will be counted together in bucket zero. */ + higher numbers will be counted together in a shared overflow bucket. */ #define LJ_VMPROFILE_TRACE_MAX 4096 -/* Traces have separate counters for different machine code regions. */ -typedef struct VMProfileTraceCount { - VMProfileCount head; /* Head of the trace (non-looping part) */ - VMProfileCount loop; /* Loop of the trace */ - VMProfileCount ffi; /* Outside the trace mcode (assumed FFI) */ - VMProfileCount gc; /* Garbage collection from this trace. */ - VMProfileCount interp; /* Interpreter due to exit from this trace. */ -} VMProfileTraceCount; - /* Complete set of counters for VM and traces. */ typedef struct VMProfile { uint32_t magic; /* 0x1d50f007 */ - uint16_t major, minor; /* 3, 0 */ - /* The profiler always bumps exactly one VM state counter. */ - VMProfileCount vm[LJ_VMST__MAX]; - /* The profiler also bumps exactly one per-trace counter for the - ** currently executing trace (JIT mode) or for the most recently - ** executing trace (interpreter mode.) This bump is skipped only if - ** no trace can be identified for some reason e.g. none have been - ** recorded. + uint16_t major, minor; /* 4, 0 */ + /* Profile counters are stored in a 2D matrix of count[trace][state]. + ** + ** The profiler attempts to attribute each sample to one vmstate and + ** one trace. The vmstate is an LJ_VMST_* constant. The trace is + ** either 1..4096 (counter for one individual trace) or 0 (shared + ** counter for all higher-numbered traces and for samples that can't + ** be attributed to a specific trace at all.) **/ - VMProfileTraceCount trace[LJ_VMPROFILE_TRACE_MAX+1]; + VMProfileCount count[LJ_VMPROFILE_TRACE_MAX+1][LJ_VMST__MAX]; } VMProfile; /* Functions that should be accessed via FFI. */ From ae5c6aaed1c55a5f5b8bbaec6bf14fef572533ff Mon Sep 17 00:00:00 2001 From: Luke Gorrie Date: Fri, 24 Nov 2017 08:39:41 +0000 Subject: [PATCH 6/9] vm_x64.dasc: Fixes to ensure g.lasttrace is a trace number Had previously been clobbered by VM states in some cases. --- src/vm_x64.dasc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/vm_x64.dasc b/src/vm_x64.dasc index e188b9f14a..6d1c6b28cb 100644 --- a/src/vm_x64.dasc +++ b/src/vm_x64.dasc @@ -2018,6 +2018,7 @@ static void build_subroutines(BuildCtx *ctx) | set_vmstate EXIT | mov [DISPATCH+DISPATCH_J(exitno)], RCd | mov [DISPATCH+DISPATCH_J(parent)], RAd + | mov dword [DISPATCH+DISPATCH_GL(lasttrace)], RAd | sub rsp, 16*8 // Room for SSE regs. | add rbp, -128 | movsd qword [rbp-8], xmm15; movsd qword [rbp-16], xmm14 @@ -2048,6 +2049,11 @@ static void build_subroutines(BuildCtx *ctx) | // RD = MULTRES or negated error code, BASE, PC and DISPATCH set. | // Restore additional callee-save registers only used in compiled code. | lea RA, [rsp+16] + | // Record which trace exited to the interpreter (if called from a trace) + | mov TMPRd, dword [DISPATCH+DISPATCH_GL(vmstate)] + | cmp TMPRd, 1 + | jb >1 + | mov dword [DISPATCH+DISPATCH_GL(lasttrace)], TMPRd |1: | mov r13, [RA-8] | mov r12, [RA] @@ -2062,9 +2068,6 @@ static void build_subroutines(BuildCtx *ctx) | mov L:RB->base, BASE | mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0 | mov TMPRd, dword [DISPATCH+DISPATCH_GL(vmstate)] - | // Record which trace exited to the interpreter, then switch state - | mov TMPRd, dword [DISPATCH+DISPATCH_GL(vmstate)] - | mov dword [DISPATCH+DISPATCH_GL(lasttrace)], TMPRd | set_vmstate INTERP | // Modified copy of ins_next which handles function header dispatch, too. | mov RCd, [PC] From 0823d9683fa91f7b17ade2553b9768bf2303b44d Mon Sep 17 00:00:00 2001 From: Luke Gorrie Date: Fri, 24 Nov 2017 08:42:19 +0000 Subject: [PATCH 7/9] lj_vmprofile.c: Fix trace number overflow (into bucket 0) --- src/lj_vmprofile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lj_vmprofile.c b/src/lj_vmprofile.c index e021a95e6d..e6b49888fb 100644 --- a/src/lj_vmprofile.c +++ b/src/lj_vmprofile.c @@ -88,7 +88,7 @@ static void vmprofile_signal(int sig, siginfo_t *si, void *data) } } /* Handle overflow from individual trace counters. */ - trace = trace <= LJ_VMPROFILE_TRACE_MAX ? trace : LJ_VMPROFILE_TRACE_MAX+1; + trace = trace <= LJ_VMPROFILE_TRACE_MAX ? trace : 0; /* Phew! We have calculated the indices and now we can bump the counter. */ assert(vmstate >= 0 && vmstate <= LJ_VMST__MAX); profile->count[trace][vmstate]++; From a8b0f320bb626af1955a0b3768976236e41f277f Mon Sep 17 00:00:00 2001 From: Luke Gorrie Date: Fri, 24 Nov 2017 08:42:36 +0000 Subject: [PATCH 8/9] lj_vmprofile.c: Add assertions with lua_assert --- src/lj_vmprofile.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lj_vmprofile.c b/src/lj_vmprofile.c index e6b49888fb..eb2ef48792 100644 --- a/src/lj_vmprofile.c +++ b/src/lj_vmprofile.c @@ -90,7 +90,8 @@ static void vmprofile_signal(int sig, siginfo_t *si, void *data) /* Handle overflow from individual trace counters. */ trace = trace <= LJ_VMPROFILE_TRACE_MAX ? trace : 0; /* Phew! We have calculated the indices and now we can bump the counter. */ - assert(vmstate >= 0 && vmstate <= LJ_VMST__MAX); + lua_assert(vmstate >= 0 && vmstate <= LJ_VMST__MAX); + lua_assert(trace >= 0 && trace <= LJ_VMPROFILE_TRACE_MAX); profile->count[trace][vmstate]++; } } From 88cc35c3f24a8f6425f04bc22856f118980cf1c4 Mon Sep 17 00:00:00 2001 From: Luke Gorrie Date: Sun, 3 Dec 2017 16:34:07 +0000 Subject: [PATCH 9/9] reusevm: update generated code --- src/reusevm/host/buildvm_arch.h | 982 ++++++++++++++++---------------- src/reusevm/lj_vm.S | 146 ++--- 2 files changed, 569 insertions(+), 559 deletions(-) diff --git a/src/reusevm/host/buildvm_arch.h b/src/reusevm/host/buildvm_arch.h index b0208442f1..392216c124 100644 --- a/src/reusevm/host/buildvm_arch.h +++ b/src/reusevm/host/buildvm_arch.h @@ -22,7 +22,7 @@ #line 7 "vm_x64.dasc" //| //|.actionlist build_actionlist -static const unsigned char build_actionlist[15833] = { +static const unsigned char build_actionlist[15853] = { 254,1,248,10,252,247,195,237,15,132,244,11,72,131,227,252,248,72,41,218,72, 141,76,25,252,248,72,139,90,252,248,73,187,237,237,76,137,28,10,248,12,131, 192,1,15,132,244,13,137,4,36,72,252,247,195,237,15,132,244,14,248,15,72,129, @@ -425,142 +425,143 @@ static const unsigned char build_actionlist[15833] = { 237,72,131,193,8,252,233,244,3,248,151,65,85,65,84,65,83,65,82,65,81,65,80, 87,86,85,72,141,108,36,88,85,83,82,81,80,15,182,69,252,248,138,101,252,240, 76,137,125,252,248,76,137,117,252,240,65,139,142,233,255,65,199,134,233,237, - 65,137,134,233,65,137,142,233,72,129,252,236,239,72,131,197,128,252,242,68, - 15,17,125,252,248,252,242,68,15,17,117,252,240,252,242,68,15,17,109,232,252, - 242,68,15,17,101,224,252,242,68,15,17,93,216,252,242,68,15,17,85,208,252, - 242,68,15,17,77,200,252,242,68,15,17,69,192,252,242,15,17,125,184,252,242, - 15,17,117,176,252,242,15,17,109,168,252,242,15,17,101,160,252,242,15,17,93, - 152,252,242,15,17,85,144,252,242,15,17,77,136,252,242,15,17,69,128,73,139, - 174,233,73,139,150,233,73,137,174,233,72,137,149,233,72,137,230,73,141,190, - 233,73,199,134,233,0,0,0,0,232,251,1,45,72,139,141,233,72,129,225,239,72, - 137,169,233,72,139,149,233,72,139,153,233,252,233,244,247,248,152,255,72, - 141,76,36,16,248,1,76,139,105,252,248,76,139,33,72,137,204,133,192,15,136, + 65,137,134,233,65,137,142,233,65,137,142,233,72,129,252,236,239,72,131,197, + 128,252,242,68,15,17,125,252,248,252,242,68,15,17,117,252,240,252,242,68, + 15,17,109,232,252,242,68,15,17,101,224,252,242,68,15,17,93,216,252,242,68, + 15,17,85,208,252,242,68,15,17,77,200,252,242,68,15,17,69,192,252,242,15,17, + 125,184,252,242,15,17,117,176,252,242,15,17,109,168,252,242,15,17,101,160, + 252,242,15,17,93,152,252,242,15,17,85,144,252,242,15,17,77,136,252,242,15, + 17,69,128,73,139,174,233,73,139,150,233,73,137,174,233,72,137,149,233,72, + 137,230,73,141,190,233,73,199,134,233,0,0,0,0,232,251,1,45,72,139,141,233, + 72,129,225,239,72,137,169,233,72,139,149,233,72,139,153,233,252,233,244,247, + 248,152,255,72,141,76,36,16,69,139,150,233,65,131,252,250,1,15,130,244,247, + 69,137,150,233,248,1,76,139,105,252,248,76,139,33,72,137,204,133,192,15,136, 244,255,72,139,108,36,16,137,4,36,76,139,122,252,240,73,193,231,17,73,193, 252,239,17,77,139,191,233,77,139,191,233,72,137,149,233,73,199,134,233,0, - 0,0,0,65,199,134,233,237,139,3,15,182,204,15,182,232,72,131,195,4,193,232, - 16,129,252,253,239,15,130,244,249,129,252,253,239,15,131,244,250,248,2,139, - 4,36,248,3,65,252,255,36,252,238,248,4,72,139,66,252,248,169,237,255,15,133, - 244,2,15,182,64,252,253,72,252,247,216,76,139,124,194,224,73,193,231,17,73, - 193,252,239,17,77,139,191,233,77,139,191,233,252,233,244,2,248,9,72,252,247, - 216,72,137,252,239,72,137,198,232,251,1,1,248,153,248,97,72,184,237,237,102, - 72,15,110,208,72,184,237,237,102,72,15,110,216,15,40,200,102,15,84,202,102, - 15,46,217,15,134,244,247,102,15,85,208,252,242,15,88,203,252,242,15,92,203, - 102,15,86,202,72,184,237,237,102,72,15,110,208,252,242,15,194,193,1,102,15, - 84,194,252,242,15,92,200,15,40,193,248,1,195,248,154,248,99,72,184,237,237, - 255,102,72,15,110,208,72,184,237,237,102,72,15,110,216,15,40,200,102,15,84, - 202,102,15,46,217,15,134,244,247,102,15,85,208,252,242,15,88,203,252,242, - 15,92,203,102,15,86,202,72,184,237,237,102,72,15,110,208,252,242,15,194,193, - 6,102,15,84,194,252,242,15,92,200,15,40,193,248,1,195,248,155,248,156,72, - 184,237,237,102,72,15,110,208,72,184,237,237,102,72,15,110,216,15,40,200, - 102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208,15,40,193,252,242, - 15,88,203,252,242,15,92,203,72,184,237,237,102,72,15,110,216,252,242,15,194, - 193,1,102,15,84,195,252,242,15,92,200,102,15,86,202,15,40,193,248,1,195,248, - 157,255,15,40,232,252,242,15,94,193,72,184,237,237,102,72,15,110,208,72,184, - 237,237,102,72,15,110,216,15,40,224,102,15,84,226,102,15,46,220,15,134,244, - 247,102,15,85,208,252,242,15,88,227,252,242,15,92,227,102,15,86,226,72,184, - 237,237,102,72,15,110,208,252,242,15,194,196,1,102,15,84,194,252,242,15,92, - 224,15,40,197,252,242,15,89,204,252,242,15,92,193,195,248,1,252,242,15,89, - 200,15,40,197,252,242,15,92,193,195,248,158,131,252,248,1,15,142,244,252, - 248,1,169,1,0,0,0,15,133,244,248,252,242,15,89,192,209,232,252,233,244,1, - 248,2,209,232,15,132,244,251,255,15,40,200,248,3,252,242,15,89,192,209,232, - 15,132,244,250,15,131,244,3,252,242,15,89,200,252,233,244,3,248,4,252,242, - 15,89,193,248,5,195,248,6,15,132,244,5,15,130,244,253,252,247,216,232,244, - 1,72,184,237,237,102,72,15,110,200,252,242,15,94,200,15,40,193,195,248,7, - 72,184,237,237,255,102,72,15,110,192,195,248,159,137,252,248,83,49,201,15, - 162,137,6,137,94,4,137,78,8,137,86,12,91,195,248,160,255,204,255,204,248, - 161,83,65,87,65,86,65,85,65,84,72,131,252,236,40,76,141,181,233,72,139,157, - 233,15,183,192,137,131,233,72,137,187,233,72,137,179,233,72,137,147,233,72, - 137,139,233,252,242,15,17,131,233,252,242,15,17,139,233,252,242,15,17,147, - 233,252,242,15,17,155,233,72,141,132,253,36,233,76,137,131,233,76,137,139, - 233,252,242,15,17,163,233,252,242,15,17,171,233,252,242,15,17,179,233,252, - 242,15,17,187,233,255,72,137,131,233,72,137,230,72,137,92,36,24,72,137,223, - 232,251,1,46,65,199,134,233,237,72,139,144,233,72,139,128,233,72,41,208,72, - 139,106,252,240,72,193,229,17,72,193,252,237,17,72,193,232,3,72,131,192,1, - 72,139,157,233,139,11,15,182,252,233,15,182,205,72,131,195,4,65,252,255,36, - 252,238,248,33,72,139,76,36,16,73,139,158,233,72,137,139,233,72,137,145,233, - 72,137,169,233,72,137,223,72,137,198,232,251,1,47,72,139,131,233,252,242, - 15,16,131,233,252,233,244,17,248,162,85,72,137,229,83,72,137,252,251,139, - 131,233,72,41,196,15,182,139,233,131,252,233,1,15,136,244,248,248,1,255,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,15,40,147,233,15,40,155,233,131,252,248,4,15,134,244,251,255,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,72,139,93,252,248, - 201,195,255,249,255,76,139,28,202,72,139,44,194,76,137,217,72,137,232,73, - 193,252,251,47,72,193,252,253,47,65,129,252,251,239,15,131,244,50,129,252, - 253,239,15,131,244,50,248,1,102,72,15,110,192,248,2,102,72,15,110,201,248, - 3,72,131,195,4,102,15,46,193,255,15,134,244,247,255,15,135,244,247,255,15, - 131,244,247,255,15,183,67,252,254,72,141,156,253,131,233,248,1,139,3,15,182, - 204,15,182,232,72,131,195,4,193,232,16,65,252,255,36,252,238,255,72,139,44, - 194,76,139,28,202,72,131,195,4,72,137,232,76,137,217,72,193,252,253,47,73, - 193,252,251,47,129,252,253,239,15,131,244,251,65,129,252,251,239,15,131,244, - 251,102,72,15,110,200,248,1,102,72,15,110,193,248,2,102,15,46,193,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,72,141,156,253,131,233,248,2,255,248,2,15,183,67,252,254, - 72,141,156,253,131,233,248,1,255,248,5,129,252,253,239,15,132,244,55,65,129, - 252,251,239,15,132,244,55,72,57,193,15,132,244,1,68,57,221,15,133,244,2,129, - 252,253,239,15,135,244,2,72,193,225,17,72,193,252,233,17,72,139,169,233,72, - 133,252,237,15,132,244,2,252,246,133,233,235,255,15,133,244,2,255,49,252, - 237,255,189,1,0,0,0,255,252,233,244,54,255,248,3,65,129,252,251,239,15,133, - 244,2,252,233,244,55,255,72,252,247,208,72,139,44,202,72,131,195,4,73,137, - 252,235,72,193,229,17,72,193,252,237,17,73,193,252,251,47,65,129,252,251, - 239,15,133,244,249,73,59,44,199,255,72,139,44,202,72,131,195,4,73,137,252, - 235,73,193,252,251,47,65,129,252,251,239,15,131,244,249,248,1,252,242,65, - 15,16,4,199,248,2,102,15,46,4,202,248,4,255,72,252,247,208,72,139,44,202, - 72,193,252,253,47,72,131,195,4,57,197,255,15,133,244,249,15,183,67,252,254, - 72,141,156,253,131,233,248,2,139,3,15,182,204,15,182,232,72,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, - 55,255,15,132,244,248,129,252,253,239,15,132,244,55,15,183,67,252,254,72, - 141,156,253,131,233,248,2,139,3,15,182,204,15,182,232,72,131,195,4,193,232, - 16,65,252,255,36,252,238,255,76,139,28,194,72,131,195,4,255,76,137,221,255, - 72,137,44,202,255,72,139,44,202,72,193,252,253,47,1,197,15,133,244,56,139, + 0,0,0,69,139,150,233,65,199,134,233,237,139,3,15,182,204,15,182,232,72,131, + 195,4,193,232,16,129,252,253,239,15,130,244,249,129,252,253,239,15,131,244, + 250,248,2,255,139,4,36,248,3,65,252,255,36,252,238,248,4,72,139,66,252,248, + 169,237,15,133,244,2,15,182,64,252,253,72,252,247,216,76,139,124,194,224, + 73,193,231,17,73,193,252,239,17,77,139,191,233,77,139,191,233,252,233,244, + 2,248,9,72,252,247,216,72,137,252,239,72,137,198,232,251,1,1,248,153,248, + 97,72,184,237,237,102,72,15,110,208,72,184,237,237,102,72,15,110,216,15,40, + 200,102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208,252,242,15,88, + 203,252,242,15,92,203,102,15,86,202,72,184,237,237,255,102,72,15,110,208, + 252,242,15,194,193,1,102,15,84,194,252,242,15,92,200,15,40,193,248,1,195, + 248,154,248,99,72,184,237,237,102,72,15,110,208,72,184,237,237,102,72,15, + 110,216,15,40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208, + 252,242,15,88,203,252,242,15,92,203,102,15,86,202,72,184,237,237,102,72,15, + 110,208,252,242,15,194,193,6,102,15,84,194,252,242,15,92,200,15,40,193,248, + 1,195,248,155,248,156,72,184,237,237,102,72,15,110,208,72,184,237,237,102, + 72,15,110,216,15,40,200,102,15,84,202,102,15,46,217,15,134,244,247,255,102, + 15,85,208,15,40,193,252,242,15,88,203,252,242,15,92,203,72,184,237,237,102, + 72,15,110,216,252,242,15,194,193,1,102,15,84,195,252,242,15,92,200,102,15, + 86,202,15,40,193,248,1,195,248,157,15,40,232,252,242,15,94,193,72,184,237, + 237,102,72,15,110,208,72,184,237,237,102,72,15,110,216,15,40,224,102,15,84, + 226,102,15,46,220,15,134,244,247,102,15,85,208,252,242,15,88,227,252,242, + 15,92,227,102,15,86,226,72,184,237,237,102,72,15,110,208,252,242,15,194,196, + 1,102,15,84,194,252,242,15,92,224,15,40,197,252,242,15,89,204,252,242,15, + 92,193,195,248,1,252,242,15,89,200,15,40,197,252,242,15,92,193,195,248,158, + 131,252,248,1,15,142,244,252,248,1,169,1,0,0,0,15,133,244,248,255,252,242, + 15,89,192,209,232,252,233,244,1,248,2,209,232,15,132,244,251,15,40,200,248, + 3,252,242,15,89,192,209,232,15,132,244,250,15,131,244,3,252,242,15,89,200, + 252,233,244,3,248,4,252,242,15,89,193,248,5,195,248,6,15,132,244,5,15,130, + 244,253,255,252,247,216,232,244,1,72,184,237,237,102,72,15,110,200,252,242, + 15,94,200,15,40,193,195,248,7,72,184,237,237,102,72,15,110,192,195,248,159, + 137,252,248,83,49,201,15,162,137,6,137,94,4,137,78,8,137,86,12,91,195,248, + 160,255,204,255,204,248,161,83,65,87,65,86,65,85,65,84,72,131,252,236,40, + 76,141,181,233,72,139,157,233,15,183,192,137,131,233,72,137,187,233,72,137, + 179,233,72,137,147,233,72,137,139,233,252,242,15,17,131,233,252,242,15,17, + 139,233,252,242,15,17,147,233,252,242,15,17,155,233,72,141,132,253,36,233, + 76,137,131,233,76,137,139,233,252,242,15,17,163,233,252,242,15,17,171,233, + 252,242,15,17,179,233,252,242,15,17,187,233,255,72,137,131,233,72,137,230, + 72,137,92,36,24,72,137,223,232,251,1,46,65,199,134,233,237,72,139,144,233, + 72,139,128,233,72,41,208,72,139,106,252,240,72,193,229,17,72,193,252,237, + 17,72,193,232,3,72,131,192,1,72,139,157,233,139,11,15,182,252,233,15,182, + 205,72,131,195,4,65,252,255,36,252,238,248,33,72,139,76,36,16,73,139,158, + 233,72,137,139,233,72,137,145,233,72,137,169,233,72,137,223,72,137,198,232, + 251,1,47,72,139,131,233,252,242,15,16,131,233,252,233,244,17,248,162,85,72, + 137,229,83,72,137,252,251,139,131,233,72,41,196,15,182,139,233,131,252,233, + 1,15,136,244,248,248,1,255,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,15,40,147,233,15,40,155,233,131,252, + 248,4,15,134,244,251,255,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,72,139,93,252,248,201,195,255,249,255,76,139,28,202,72,139, + 44,194,76,137,217,72,137,232,73,193,252,251,47,72,193,252,253,47,65,129,252, + 251,239,15,131,244,50,129,252,253,239,15,131,244,50,248,1,102,72,15,110,192, + 248,2,102,72,15,110,201,248,3,72,131,195,4,102,15,46,193,255,15,135,244,247, + 255,15,131,244,247,255,15,183,67,252,254,72,141,156,253,131,233,248,1,139, 3,15,182,204,15,182,232,72,131,195,4,193,232,16,65,252,255,36,252,238,255, - 76,139,28,202,73,193,252,251,47,65,129,252,251,239,15,131,244,56,139,3,15, - 182,204,15,182,232,72,131,195,4,193,232,16,65,252,255,36,252,238,255,72,139, - 44,194,72,137,44,202,139,3,15,182,204,15,182,232,72,131,195,4,193,232,16, - 65,252,255,36,252,238,255,72,139,44,194,72,193,252,253,47,184,2,0,0,0,72, - 129,252,253,239,131,216,0,72,193,224,47,72,252,247,208,72,137,4,202,139,3, - 15,182,204,15,182,232,72,131,195,4,193,232,16,65,252,255,36,252,238,255,72, - 139,44,194,73,137,252,235,73,193,252,251,47,65,129,252,251,239,15,131,244, - 61,72,184,237,237,72,49,197,72,137,44,202,139,3,15,182,204,15,182,232,72, - 131,195,4,193,232,16,65,252,255,36,252,238,255,72,139,4,194,73,137,195,72, - 193,224,17,72,193,232,17,73,193,252,251,47,65,129,252,251,239,15,133,244, - 248,15,87,192,252,242,15,42,128,233,248,1,252,242,15,17,4,202,139,3,15,182, - 204,15,182,232,72,131,195,4,193,232,16,65,252,255,36,252,238,248,2,65,129, - 252,251,239,15,133,244,64,72,137,199,255,72,139,168,233,72,131,252,253,0, - 15,133,244,255,248,3,255,248,65,72,137,213,232,251,1,48,252,242,15,42,192, - 72,137,252,234,15,182,75,252,253,252,233,244,1,255,248,9,252,246,133,233, - 235,15,133,244,3,252,233,244,64,255,15,182,252,236,15,182,192,255,76,139, - 28,252,234,73,193,252,251,47,65,129,252,251,239,15,131,244,58,252,242,15, - 16,4,252,234,252,242,65,15,88,4,199,255,76,139,28,252,234,73,193,252,251, - 47,65,129,252,251,239,15,131,244,60,252,242,65,15,16,4,199,252,242,15,88, - 4,252,234,255,76,139,28,252,234,73,193,252,251,47,65,129,252,251,239,15,131, - 244,63,76,139,28,194,73,193,252,251,47,65,129,252,251,239,15,131,244,63,252, - 242,15,16,4,252,234,252,242,15,88,4,194,255,252,242,15,17,4,202,139,3,15, - 182,204,15,182,232,72,131,195,4,193,232,16,65,252,255,36,252,238,255,76,139, - 28,252,234,73,193,252,251,47,65,129,252,251,239,15,131,244,58,252,242,15, - 16,4,252,234,252,242,65,15,92,4,199,255,76,139,28,252,234,73,193,252,251, - 47,65,129,252,251,239,15,131,244,60,252,242,65,15,16,4,199,252,242,15,92, - 4,252,234,255,76,139,28,252,234,73,193,252,251,47,65,129,252,251,239,15,131, - 244,63,76,139,28,194,73,193,252,251,47,65,129,252,251,239,15,131,244,63,252, - 242,15,16,4,252,234,252,242,15,92,4,194,255,76,139,28,252,234,73,193,252, - 251,47,65,129,252,251,239,15,131,244,58,252,242,15,16,4,252,234,252,242,65, - 15,89,4,199,255,76,139,28,252,234,73,193,252,251,47,65,129,252,251,239,15, - 131,244,60,252,242,65,15,16,4,199,252,242,15,89,4,252,234,255,76,139,28,252, - 234,73,193,252,251,47,65,129,252,251,239,15,131,244,63,76,139,28,194,73,193, - 252,251,47,65,129,252,251,239,15,131,244,63,252,242,15,16,4,252,234,252,242, - 15,89,4,194,255,76,139,28,252,234,73,193,252,251,47,65,129,252,251,239,15, - 131,244,58,252,242,15,16,4,252,234,252,242,65,15,94,4,199,255,76,139,28,252, - 234,73,193,252,251,47,65,129,252,251,239,15,131,244,60,252,242,65,15,16,4, - 199,252,242,15,94,4,252,234,255,76,139,28,252,234,73,193,252,251,47,65,129, - 252,251,239,15,131,244,63,76,139,28,194,73,193,252,251,47,65,129,252,251, - 239,15,131,244,63,252,242,15,16,4,252,234,252,242,15,94,4,194,255,76,139, - 28,252,234,73,193,252,251,47,65,129,252,251,239,15,131,244,58,252,242,15, - 16,4,252,234,252,242,65,15,16,12,199,255,76,139,28,252,234,73,193,252,251, - 47,65,129,252,251,239,15,131,244,60,252,242,65,15,16,4,199,252,242,15,16, - 12,252,234,255,76,139,28,252,234,73,193,252,251,47,65,129,252,251,239,15, - 131,244,63,76,139,28,194,73,193,252,251,47,65,129,252,251,239,15,131,244, + 72,139,44,194,76,139,28,202,72,131,195,4,72,137,232,76,137,217,72,193,252, + 253,47,73,193,252,251,47,129,252,253,239,15,131,244,251,65,129,252,251,239, + 15,131,244,251,102,72,15,110,200,248,1,102,72,15,110,193,248,2,102,15,46, + 193,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,72,141,156,253,131,233,248,2,255,248,2,15, + 183,67,252,254,72,141,156,253,131,233,248,1,255,248,5,129,252,253,239,15, + 132,244,55,65,129,252,251,239,15,132,244,55,72,57,193,15,132,244,1,68,57, + 221,15,133,244,2,129,252,253,239,15,135,244,2,72,193,225,17,72,193,252,233, + 17,72,139,169,233,72,133,252,237,15,132,244,2,252,246,133,233,235,255,15, + 133,244,2,255,49,252,237,255,189,1,0,0,0,255,252,233,244,54,255,248,3,65, + 129,252,251,239,15,133,244,2,252,233,244,55,255,72,252,247,208,72,139,44, + 202,72,131,195,4,73,137,252,235,72,193,229,17,72,193,252,237,17,73,193,252, + 251,47,65,129,252,251,239,15,133,244,249,73,59,44,199,255,72,139,44,202,72, + 131,195,4,73,137,252,235,73,193,252,251,47,65,129,252,251,239,15,131,244, + 249,248,1,252,242,65,15,16,4,199,248,2,102,15,46,4,202,248,4,255,72,252,247, + 208,72,139,44,202,72,193,252,253,47,72,131,195,4,57,197,255,15,133,244,249, + 15,183,67,252,254,72,141,156,253,131,233,248,2,139,3,15,182,204,15,182,232, + 72,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,55,255,15,132,244,248,129,252,253,239,15,132,244,55,15, + 183,67,252,254,72,141,156,253,131,233,248,2,139,3,15,182,204,15,182,232,72, + 131,195,4,193,232,16,65,252,255,36,252,238,255,76,139,28,194,72,131,195,4, + 255,76,137,221,255,72,137,44,202,255,72,139,44,202,72,193,252,253,47,1,197, + 15,133,244,56,139,3,15,182,204,15,182,232,72,131,195,4,193,232,16,65,252, + 255,36,252,238,255,76,139,28,202,73,193,252,251,47,65,129,252,251,239,15, + 131,244,56,139,3,15,182,204,15,182,232,72,131,195,4,193,232,16,65,252,255, + 36,252,238,255,72,139,44,194,72,137,44,202,139,3,15,182,204,15,182,232,72, + 131,195,4,193,232,16,65,252,255,36,252,238,255,72,139,44,194,72,193,252,253, + 47,184,2,0,0,0,72,129,252,253,239,131,216,0,72,193,224,47,72,252,247,208, + 72,137,4,202,139,3,15,182,204,15,182,232,72,131,195,4,193,232,16,65,252,255, + 36,252,238,255,72,139,44,194,73,137,252,235,73,193,252,251,47,65,129,252, + 251,239,15,131,244,61,72,184,237,237,72,49,197,72,137,44,202,139,3,15,182, + 204,15,182,232,72,131,195,4,193,232,16,65,252,255,36,252,238,255,72,139,4, + 194,73,137,195,72,193,224,17,72,193,232,17,73,193,252,251,47,65,129,252,251, + 239,15,133,244,248,15,87,192,252,242,15,42,128,233,248,1,252,242,15,17,4, + 202,139,3,15,182,204,15,182,232,72,131,195,4,193,232,16,65,252,255,36,252, + 238,248,2,65,129,252,251,239,15,133,244,64,72,137,199,255,72,139,168,233, + 72,131,252,253,0,15,133,244,255,248,3,255,248,65,72,137,213,232,251,1,48, + 252,242,15,42,192,72,137,252,234,15,182,75,252,253,252,233,244,1,255,248, + 9,252,246,133,233,235,15,133,244,3,252,233,244,64,255,15,182,252,236,15,182, + 192,255,76,139,28,252,234,73,193,252,251,47,65,129,252,251,239,15,131,244, + 58,252,242,15,16,4,252,234,252,242,65,15,88,4,199,255,76,139,28,252,234,73, + 193,252,251,47,65,129,252,251,239,15,131,244,60,252,242,65,15,16,4,199,252, + 242,15,88,4,252,234,255,76,139,28,252,234,73,193,252,251,47,65,129,252,251, + 239,15,131,244,63,76,139,28,194,73,193,252,251,47,65,129,252,251,239,15,131, + 244,63,252,242,15,16,4,252,234,252,242,15,88,4,194,255,252,242,15,17,4,202, + 139,3,15,182,204,15,182,232,72,131,195,4,193,232,16,65,252,255,36,252,238, + 255,76,139,28,252,234,73,193,252,251,47,65,129,252,251,239,15,131,244,58, + 252,242,15,16,4,252,234,252,242,65,15,92,4,199,255,76,139,28,252,234,73,193, + 252,251,47,65,129,252,251,239,15,131,244,60,252,242,65,15,16,4,199,252,242, + 15,92,4,252,234,255,76,139,28,252,234,73,193,252,251,47,65,129,252,251,239, + 15,131,244,63,76,139,28,194,73,193,252,251,47,65,129,252,251,239,15,131,244, + 63,252,242,15,16,4,252,234,252,242,15,92,4,194,255,76,139,28,252,234,73,193, + 252,251,47,65,129,252,251,239,15,131,244,58,252,242,15,16,4,252,234,252,242, + 65,15,89,4,199,255,76,139,28,252,234,73,193,252,251,47,65,129,252,251,239, + 15,131,244,60,252,242,65,15,16,4,199,252,242,15,89,4,252,234,255,76,139,28, + 252,234,73,193,252,251,47,65,129,252,251,239,15,131,244,63,76,139,28,194, + 73,193,252,251,47,65,129,252,251,239,15,131,244,63,252,242,15,16,4,252,234, + 252,242,15,89,4,194,255,76,139,28,252,234,73,193,252,251,47,65,129,252,251, + 239,15,131,244,58,252,242,15,16,4,252,234,252,242,65,15,94,4,199,255,76,139, + 28,252,234,73,193,252,251,47,65,129,252,251,239,15,131,244,60,252,242,65, + 15,16,4,199,252,242,15,94,4,252,234,255,76,139,28,252,234,73,193,252,251, + 47,65,129,252,251,239,15,131,244,63,76,139,28,194,73,193,252,251,47,65,129, + 252,251,239,15,131,244,63,252,242,15,16,4,252,234,252,242,15,94,4,194,255, + 76,139,28,252,234,73,193,252,251,47,65,129,252,251,239,15,131,244,58,252, + 242,15,16,4,252,234,252,242,65,15,16,12,199,255,76,139,28,252,234,73,193, + 252,251,47,65,129,252,251,239,15,131,244,60,252,242,65,15,16,4,199,252,242, + 15,16,12,252,234,255,76,139,28,252,234,73,193,252,251,47,65,129,252,251,239, + 15,131,244,63,76,139,28,194,73,193,252,251,47,65,129,252,251,239,15,131,244, 63,252,242,15,16,4,252,234,252,242,15,16,12,194,255,248,163,232,244,157,252, 242,15,17,4,202,139,3,15,182,204,15,182,232,72,131,195,4,193,232,16,65,252, 255,36,252,238,255,252,233,244,163,255,72,137,213,232,251,1,30,15,182,75, @@ -3360,6 +3361,7 @@ static void build_subroutines(BuildCtx *ctx) #line 2019 "vm_x64.dasc" //| mov [DISPATCH+DISPATCH_J(exitno)], RCd //| mov [DISPATCH+DISPATCH_J(parent)], RAd + //| mov dword [DISPATCH+DISPATCH_GL(lasttrace)], RAd //| sub rsp, 16*8 // Room for SSE regs. //| add rbp, -128 //| movsd qword [rbp-8], xmm15; movsd qword [rbp-16], xmm14 @@ -3390,8 +3392,13 @@ static void build_subroutines(BuildCtx *ctx) //| // RD = MULTRES or negated error code, BASE, PC and DISPATCH set. //| // Restore additional callee-save registers only used in compiled code. //| lea RA, [rsp+16] - dasm_put(Dst, 8391, DISPATCH_GL(vmstate), ~LJ_VMST_EXIT, DISPATCH_J(exitno), DISPATCH_J(parent), 16*8, DISPATCH_GL(cur_L), DISPATCH_GL(jit_base), DISPATCH_J(L), Dt1(->base), GG_DISP2J, DISPATCH_GL(jit_base), Dt1(->cframe), CFRAME_RAWMASK, CFRAME_OFS_L, Dt1(->base), CFRAME_OFS_PC); -#line 2051 "vm_x64.dasc" + dasm_put(Dst, 8391, DISPATCH_GL(vmstate), ~LJ_VMST_EXIT, DISPATCH_J(exitno), DISPATCH_J(parent), DISPATCH_GL(lasttrace), 16*8, DISPATCH_GL(cur_L), DISPATCH_GL(jit_base), DISPATCH_J(L), Dt1(->base), GG_DISP2J, DISPATCH_GL(jit_base), Dt1(->cframe), CFRAME_RAWMASK, CFRAME_OFS_L, Dt1(->base), CFRAME_OFS_PC); +#line 2052 "vm_x64.dasc" + //| // Record which trace exited to the interpreter (if called from a trace) + //| mov TMPRd, dword [DISPATCH+DISPATCH_GL(vmstate)] + //| cmp TMPRd, 1 + //| jb >1 + //| mov dword [DISPATCH+DISPATCH_GL(lasttrace)], TMPRd //|1: //| mov r13, [RA-8] //| mov r12, [RA] @@ -3405,6 +3412,7 @@ static void build_subroutines(BuildCtx *ctx) //| mov KBASE, [KBASE+PC2PROTO(k)] //| mov L:RB->base, BASE //| mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0 + //| mov TMPRd, dword [DISPATCH+DISPATCH_GL(vmstate)] //| set_vmstate INTERP //| // Modified copy of ins_next which handles function header dispatch, too. //| mov RCd, [PC] @@ -3418,6 +3426,8 @@ static void build_subroutines(BuildCtx *ctx) //| jae >4 //|2: //| mov RCd, MULTRES // RC/RD holds nres+1. + dasm_put(Dst, 8585, DISPATCH_GL(vmstate), DISPATCH_GL(lasttrace), Dt7(->pc), PC2PROTO(k), Dt1(->base), DISPATCH_GL(jit_base), DISPATCH_GL(vmstate), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, BC_FUNCF, BC_FUNCC+2); +#line 2084 "vm_x64.dasc" //|3: //| jmp aword [DISPATCH+OP*8] //| @@ -3425,8 +3435,6 @@ static void build_subroutines(BuildCtx *ctx) //| mov RC, [BASE-8] //| test RCd, FRAME_TYPE //| jnz <2 // Trace stitching continuation? - dasm_put(Dst, 8581, Dt7(->pc), PC2PROTO(k), Dt1(->base), DISPATCH_GL(jit_base), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, BC_FUNCF, BC_FUNCC+2, FRAME_TYPE); -#line 2084 "vm_x64.dasc" //| // Otherwise set KBASE for Lua function below fast function. //| movzx RCd, byte [RC-3] //| neg RC @@ -3487,18 +3495,18 @@ static void build_subroutines(BuildCtx *ctx) //|.endmacro //| //| vm_round vm_floor, 0, 1 + dasm_put(Dst, 8711, FRAME_TYPE, Dt7(->pc), PC2PROTO(k), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); +#line 2151 "vm_x64.dasc" //| vm_round vm_ceil, 1, JIT - dasm_put(Dst, 8706, Dt7(->pc), PC2PROTO(k), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32)); -#line 2145 "vm_x64.dasc" //| vm_round vm_trunc, 2, JIT + dasm_put(Dst, 8847, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(bff00000,00000000)), (unsigned int)((U64x(bff00000,00000000))>>32), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32)); +#line 2153 "vm_x64.dasc" //| //|// FP modulo x%y. Called by BC_MOD* and vm_arith. //|->vm_mod: //|// Args in xmm0/xmm1, return value in xmm0. //|// Caveat: xmm0-xmm5 and RC (eax) modified! //| movaps xmm5, xmm0 - dasm_put(Dst, 8856, (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(bff00000,00000000)), (unsigned int)((U64x(bff00000,00000000))>>32), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); -#line 2152 "vm_x64.dasc" //| divsd xmm0, xmm1 //| sseconst_abs xmm2, RD //| sseconst_2p52 xmm3, RD @@ -3531,13 +3539,13 @@ static void build_subroutines(BuildCtx *ctx) //|1: // Handle leading zeros. //| test eax, 1; jnz >2 //| mulsd xmm0, xmm0 + dasm_put(Dst, 8996, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); +#line 2191 "vm_x64.dasc" //| shr eax, 1 //| jmp <1 //|2: //| shr eax, 1; jz >5 //| movaps xmm1, xmm0 - dasm_put(Dst, 9024, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); -#line 2189 "vm_x64.dasc" //|3: // Handle trailing bits. //| mulsd xmm0, xmm0 //| shr eax, 1; jz >4 @@ -3552,6 +3560,8 @@ static void build_subroutines(BuildCtx *ctx) //| je <5 // x^1 ==> x //| jb >7 // x^0 ==> 1 //| neg eax + dasm_put(Dst, 9184); +#line 2210 "vm_x64.dasc" //| call <1 //| sseconst_1 xmm1, RD //| divsd xmm1, xmm0 @@ -3559,8 +3569,6 @@ static void build_subroutines(BuildCtx *ctx) //| ret //|7: //| sseconst_1 xmm0, RD - dasm_put(Dst, 9178, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); -#line 2210 "vm_x64.dasc" //| ret //| //|//----------------------------------------------------------------------- @@ -3585,12 +3593,12 @@ static void build_subroutines(BuildCtx *ctx) //|//----------------------------------------------------------------------- //| //|->assert_bad_for_arg_type: - dasm_put(Dst, 9258); -#line 2234 "vm_x64.dasc" + dasm_put(Dst, 9253, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); +#line 2241 "vm_x64.dasc" #ifdef LUA_USE_ASSERT //| int3 - dasm_put(Dst, 9290); -#line 2236 "vm_x64.dasc" + dasm_put(Dst, 9315); +#line 2243 "vm_x64.dasc" #endif //| int3 //| @@ -3602,7 +3610,7 @@ static void build_subroutines(BuildCtx *ctx) //|->vm_ffi_callback: //|.type CTSTATE, CTState, PC #define DtF(_V) (int)(ptrdiff_t)&(((CTState *)0)_V) -#line 2246 "vm_x64.dasc" +#line 2253 "vm_x64.dasc" //| saveregs_ // ebp/rbp already saved. ebp now holds global_State *. //| lea DISPATCH, [ebp+GG_G2DISP] //| mov CTSTATE, GL:ebp->ctype_state @@ -3624,8 +3632,8 @@ static void build_subroutines(BuildCtx *ctx) //| movsd qword CTSTATE->cb.fpr[6], xmm6 //| movsd qword CTSTATE->cb.fpr[7], xmm7 //| mov CTSTATE->cb.stack, rax - dasm_put(Dst, 9292, GG_G2DISP, Dt2(->ctype_state), DtF(->cb.slot), DtF(->cb.gpr[0]), DtF(->cb.gpr[1]), DtF(->cb.gpr[2]), DtF(->cb.gpr[3]), DtF(->cb.fpr[0]), DtF(->cb.fpr[1]), DtF(->cb.fpr[2]), DtF(->cb.fpr[3]), CFRAME_SIZE, DtF(->cb.gpr[4]), DtF(->cb.gpr[5]), DtF(->cb.fpr[4]), DtF(->cb.fpr[5]), DtF(->cb.fpr[6]), DtF(->cb.fpr[7])); -#line 2267 "vm_x64.dasc" + dasm_put(Dst, 9317, GG_G2DISP, Dt2(->ctype_state), DtF(->cb.slot), DtF(->cb.gpr[0]), DtF(->cb.gpr[1]), DtF(->cb.gpr[2]), DtF(->cb.gpr[3]), DtF(->cb.fpr[0]), DtF(->cb.fpr[1]), DtF(->cb.fpr[2]), DtF(->cb.fpr[3]), CFRAME_SIZE, DtF(->cb.gpr[4]), DtF(->cb.gpr[5]), DtF(->cb.fpr[4]), DtF(->cb.fpr[5]), DtF(->cb.fpr[6]), DtF(->cb.fpr[7])); +#line 2274 "vm_x64.dasc" //| mov CARG2, rsp //| mov SAVE_PC, CTSTATE // Any value outside of bytecode is ok. //| mov CARG1, CTSTATE @@ -3658,7 +3666,7 @@ static void build_subroutines(BuildCtx *ctx) //| // Caveat: needs special frame unwinding, see below. //| .type CCSTATE, CCallState, rbx #define Dt10(_V) (int)(ptrdiff_t)&(((CCallState *)0)_V) -#line 2298 "vm_x64.dasc" +#line 2305 "vm_x64.dasc" //| push rbp; mov rbp, rsp; push rbx; mov CCSTATE, CARG1 //| //| // Readjust stack. @@ -3671,8 +3679,8 @@ static void build_subroutines(BuildCtx *ctx) //| js >2 //|1: //| mov rax, [CCSTATE+rcx*8+offsetof(CCallState, stack)] - dasm_put(Dst, 9402, DtF(->cb.stack), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top), Dt7(->pc), DISPATCH_GL(ctype_state), DtF(->L), Dt1(->base), Dt1(->top), DtF(->cb.gpr[0]), DtF(->cb.fpr[0]), Dt10(->spadj), Dt10(->nsp)); -#line 2310 "vm_x64.dasc" + dasm_put(Dst, 9427, DtF(->cb.stack), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top), Dt7(->pc), DISPATCH_GL(ctype_state), DtF(->L), Dt1(->base), Dt1(->top), DtF(->cb.gpr[0]), DtF(->cb.fpr[0]), Dt10(->spadj), Dt10(->nsp)); +#line 2317 "vm_x64.dasc" //| mov [rsp+rcx*8+CCALL_SPS_EXTRA*8], rax //| sub ecx, 1 //| jns <1 @@ -3692,8 +3700,8 @@ static void build_subroutines(BuildCtx *ctx) //| movaps xmm3, CCSTATE->fpr[3] //| cmp eax, 4; jbe >5 //| movaps xmm4, CCSTATE->fpr[4] - dasm_put(Dst, 9561, offsetof(CCallState, stack), CCALL_SPS_EXTRA*8, Dt10(->nfpr), Dt10(->gpr[0]), Dt10(->gpr[1]), Dt10(->gpr[2]), Dt10(->gpr[3]), Dt10(->gpr[4]), Dt10(->gpr[5]), Dt10(->fpr[0]), Dt10(->fpr[1]), Dt10(->fpr[2]), Dt10(->fpr[3])); -#line 2329 "vm_x64.dasc" + dasm_put(Dst, 9586, offsetof(CCallState, stack), CCALL_SPS_EXTRA*8, Dt10(->nfpr), Dt10(->gpr[0]), Dt10(->gpr[1]), Dt10(->gpr[2]), Dt10(->gpr[3]), Dt10(->gpr[4]), Dt10(->gpr[5]), Dt10(->fpr[0]), Dt10(->fpr[1]), Dt10(->fpr[2]), Dt10(->fpr[3])); +#line 2336 "vm_x64.dasc" //| movaps xmm5, CCSTATE->fpr[5] //| movaps xmm6, CCSTATE->fpr[6] //| movaps xmm7, CCSTATE->fpr[7] @@ -3710,8 +3718,8 @@ static void build_subroutines(BuildCtx *ctx) //|// Note: vm_ffi_call must be the last function in this object file! //| //|//----------------------------------------------------------------------- - dasm_put(Dst, 9642, Dt10(->fpr[4]), Dt10(->fpr[5]), Dt10(->fpr[6]), Dt10(->fpr[7]), Dt10(->func), Dt10(->gpr[0]), Dt10(->fpr[0]), Dt10(->gpr[1]), Dt10(->fpr[1])); -#line 2345 "vm_x64.dasc" + dasm_put(Dst, 9667, Dt10(->fpr[4]), Dt10(->fpr[5]), Dt10(->fpr[6]), Dt10(->fpr[7]), Dt10(->func), Dt10(->gpr[0]), Dt10(->fpr[0]), Dt10(->gpr[1]), Dt10(->fpr[1])); +#line 2352 "vm_x64.dasc" } /* Generate the code for a single instruction. */ @@ -3720,8 +3728,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) int vk = 0; //|// Note: aligning all instructions does not pay off. //|=>defop: - dasm_put(Dst, 9688, defop); -#line 2353 "vm_x64.dasc" + dasm_put(Dst, 9713, defop); +#line 2360 "vm_x64.dasc" switch (op) { @@ -3768,29 +3776,29 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| // Unordered: all of ZF CF PF set, ordered: PF clear. //| // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't. //| jmp_comp jbe, ja, jb, jae, >1 - dasm_put(Dst, 9690, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9715, LJ_TISNUM, LJ_TISNUM); switch (op) { case BC_ISLT: - dasm_put(Dst, 9756); + dasm_put(Dst, 8991); break; case BC_ISGE: - dasm_put(Dst, 9761); + dasm_put(Dst, 9781); break; case BC_ISLE: dasm_put(Dst, 2946); break; case BC_ISGT: - dasm_put(Dst, 9766); + dasm_put(Dst, 9786); break; default: break; /* Shut up GCC. */ } -#line 2399 "vm_x64.dasc" +#line 2406 "vm_x64.dasc" //| movzx RDd, PC_RD //| branchPC RD //|1: //| ins_next - dasm_put(Dst, 9771, -BCBIAS_J*4); -#line 2403 "vm_x64.dasc" + dasm_put(Dst, 9791, -BCBIAS_J*4); +#line 2410 "vm_x64.dasc" break; case BC_ISEQV: case BC_ISNEV: @@ -3811,19 +3819,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //|2: //| ucomisd xmm0, xmm1 //|4: - dasm_put(Dst, 9806, LJ_TISNUM, LJ_TISNUM); -#line 2423 "vm_x64.dasc" + dasm_put(Dst, 9826, LJ_TISNUM, LJ_TISNUM); +#line 2430 "vm_x64.dasc" iseqne_fp: if (vk) { //| jp >2 // Unordered means not equal. //| jne >2 - dasm_put(Dst, 9872); -#line 2427 "vm_x64.dasc" + dasm_put(Dst, 9892); +#line 2434 "vm_x64.dasc" } else { //| jp >2 // Unordered means not equal. //| je >1 - dasm_put(Dst, 9881); -#line 2430 "vm_x64.dasc" + dasm_put(Dst, 9901); +#line 2437 "vm_x64.dasc" } iseqne_end: if (vk) { @@ -3831,20 +3839,20 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| movzx RDd, PC_RD //| branchPC RD //|2: // NE: Fallthrough to next instruction. - dasm_put(Dst, 9890, -BCBIAS_J*4); -#line 2437 "vm_x64.dasc" + dasm_put(Dst, 9910, -BCBIAS_J*4); +#line 2444 "vm_x64.dasc" } else { //|2: // NE: Branch to the target. //| movzx RDd, PC_RD //| branchPC RD //|1: // EQ: Fallthrough to next instruction. - dasm_put(Dst, 9906, -BCBIAS_J*4); -#line 2442 "vm_x64.dasc" + dasm_put(Dst, 9926, -BCBIAS_J*4); +#line 2449 "vm_x64.dasc" } //| ins_next //| - dasm_put(Dst, 9784); -#line 2445 "vm_x64.dasc" + dasm_put(Dst, 9804); +#line 2452 "vm_x64.dasc" if (op == BC_ISEQV || op == BC_ISNEV) { //|5: // Either or both types are not numbers. //| cmp RBd, LJ_TCDATA; je ->vmeta_equal_cd @@ -3864,28 +3872,28 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| jz <2 // No metatable? //| test byte TAB:RB->nomm, 1<metatable), Dt6(->nomm), 1<metatable), Dt6(->nomm), 1<vmeta_equal // Handle __eq metamethod. - dasm_put(Dst, 10005); -#line 2470 "vm_x64.dasc" + dasm_put(Dst, 10025); +#line 2477 "vm_x64.dasc" } else { //|3: //| cmp ITYPEd, LJ_TCDATA //| jne <2 //| jmp ->vmeta_equal_cd - dasm_put(Dst, 10010, LJ_TCDATA); -#line 2475 "vm_x64.dasc" + dasm_put(Dst, 10030, LJ_TCDATA); +#line 2482 "vm_x64.dasc" } break; case BC_ISEQS: case BC_ISNES: @@ -3895,17 +3903,17 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| add PC, 4 //| checkstr RB, >3 //| cmp RB, [KBASE+RD*8] - dasm_put(Dst, 10026, LJ_TSTR); -#line 2484 "vm_x64.dasc" + dasm_put(Dst, 10046, LJ_TSTR); +#line 2491 "vm_x64.dasc" iseqne_test: if (vk) { //| jne >2 - dasm_put(Dst, 9876); -#line 2487 "vm_x64.dasc" + dasm_put(Dst, 9179); +#line 2494 "vm_x64.dasc" } else { //| je >1 dasm_put(Dst, 4107); -#line 2489 "vm_x64.dasc" +#line 2496 "vm_x64.dasc" } goto iseqne_end; case BC_ISEQN: case BC_ISNEN: @@ -3919,8 +3927,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //|2: //| ucomisd xmm0, qword [BASE+RA*8] //|4: - dasm_put(Dst, 10070, LJ_TISNUM); -#line 2502 "vm_x64.dasc" + dasm_put(Dst, 10090, LJ_TISNUM); +#line 2509 "vm_x64.dasc" goto iseqne_fp; case BC_ISEQP: case BC_ISNEP: vk = op == BC_ISEQP; @@ -3929,8 +3937,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| sar RB, 47 //| add PC, 4 //| cmp RBd, RDd - dasm_put(Dst, 10115); -#line 2510 "vm_x64.dasc" + dasm_put(Dst, 10135); +#line 2517 "vm_x64.dasc" if (!LJ_HASFFI) goto iseqne_test; if (vk) { //| jne >3 @@ -3941,8 +3949,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //|3: //| cmp RBd, LJ_TCDATA; jne <2 //| jmp ->vmeta_equal_cd - dasm_put(Dst, 10135, -BCBIAS_J*4, LJ_TCDATA); -#line 2520 "vm_x64.dasc" + dasm_put(Dst, 10155, -BCBIAS_J*4, LJ_TCDATA); +#line 2527 "vm_x64.dasc" } else { //| je >2 //| cmp RBd, LJ_TCDATA; je ->vmeta_equal_cd @@ -3950,8 +3958,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| branchPC RD //|2: //| ins_next - dasm_put(Dst, 10188, LJ_TCDATA, -BCBIAS_J*4); -#line 2527 "vm_x64.dasc" + dasm_put(Dst, 10208, LJ_TCDATA, -BCBIAS_J*4); +#line 2534 "vm_x64.dasc" } break; @@ -3961,37 +3969,37 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| ins_AD // RA = dst or unused, RD = src, JMP with RD = target //| mov ITYPE, [BASE+RD*8] //| add PC, 4 - dasm_put(Dst, 10235); -#line 2536 "vm_x64.dasc" + dasm_put(Dst, 10255); +#line 2543 "vm_x64.dasc" if (op == BC_ISTC || op == BC_ISFC) { //| mov RB, ITYPE - dasm_put(Dst, 10244); -#line 2538 "vm_x64.dasc" + dasm_put(Dst, 10264); +#line 2545 "vm_x64.dasc" } //| sar ITYPE, 47 //| cmp ITYPEd, LJ_TISTRUECOND dasm_put(Dst, 4503, LJ_TISTRUECOND); -#line 2541 "vm_x64.dasc" +#line 2548 "vm_x64.dasc" if (op == BC_IST || op == BC_ISTC) { //| jae >1 - dasm_put(Dst, 9766); -#line 2543 "vm_x64.dasc" + dasm_put(Dst, 9786); +#line 2550 "vm_x64.dasc" } else { //| jb >1 dasm_put(Dst, 2946); -#line 2545 "vm_x64.dasc" +#line 2552 "vm_x64.dasc" } if (op == BC_ISTC || op == BC_ISFC) { //| mov [BASE+RA*8], RB - dasm_put(Dst, 10248); -#line 2548 "vm_x64.dasc" + dasm_put(Dst, 10268); +#line 2555 "vm_x64.dasc" } //| movzx RDd, PC_RD //| branchPC RD //|1: // Fallthrough to the next instruction. //| ins_next - dasm_put(Dst, 9771, -BCBIAS_J*4); -#line 2553 "vm_x64.dasc" + dasm_put(Dst, 9791, -BCBIAS_J*4); +#line 2560 "vm_x64.dasc" break; case BC_ISTYPE: @@ -4001,15 +4009,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| add RBd, RDd //| jne ->vmeta_istype //| ins_next - dasm_put(Dst, 10253); -#line 2562 "vm_x64.dasc" + dasm_put(Dst, 10273); +#line 2569 "vm_x64.dasc" break; case BC_ISNUM: //| ins_AD // RA = src, RD = -(TISNUM-1) //| checknumtp [BASE+RA*8], ->vmeta_istype //| ins_next - dasm_put(Dst, 10290, LJ_TISNUM); -#line 2567 "vm_x64.dasc" + dasm_put(Dst, 10310, LJ_TISNUM); +#line 2574 "vm_x64.dasc" break; /* -- Unary ops --------------------------------------------------------- */ @@ -4019,8 +4027,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| mov RB, [BASE+RD*8] //| mov [BASE+RA*8], RB //| ins_next_ - dasm_put(Dst, 10330); -#line 2576 "vm_x64.dasc" + dasm_put(Dst, 10350); +#line 2583 "vm_x64.dasc" break; case BC_NOT: //| ins_AD // RA = dst, RD = src @@ -4033,8 +4041,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| not RC //| mov [BASE+RA*8], RC //| ins_next - dasm_put(Dst, 10360, LJ_TISTRUECOND); -#line 2588 "vm_x64.dasc" + dasm_put(Dst, 10380, LJ_TISTRUECOND); +#line 2595 "vm_x64.dasc" break; case BC_UNM: //| ins_AD // RA = dst, RD = src @@ -4044,8 +4052,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| xor RB, RD //| mov [BASE+RA*8], RB //| ins_next - dasm_put(Dst, 10416, LJ_TISNUM, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32)); -#line 2597 "vm_x64.dasc" + dasm_put(Dst, 10436, LJ_TISNUM, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32)); +#line 2604 "vm_x64.dasc" break; case BC_LEN: //| ins_AD // RA = dst, RD = src @@ -4059,15 +4067,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //|2: //| cmp ITYPEd, LJ_TTAB; jne ->vmeta_len //| mov TAB:CARG1, TAB:RD - dasm_put(Dst, 10471, LJ_TSTR, Dt5(->len), LJ_TTAB); -#line 2610 "vm_x64.dasc" + dasm_put(Dst, 10491, LJ_TSTR, Dt5(->len), LJ_TTAB); +#line 2617 "vm_x64.dasc" #if LJ_52 //| mov TAB:RB, TAB:RD->metatable //| cmp TAB:RB, 0 //| jnz >9 //|3: - dasm_put(Dst, 10553, Dt6(->metatable)); -#line 2615 "vm_x64.dasc" + dasm_put(Dst, 10573, Dt6(->metatable)); +#line 2622 "vm_x64.dasc" #endif //|->BC_LEN_Z: //| mov RB, BASE // Save BASE. @@ -4077,15 +4085,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| mov BASE, RB // Restore BASE. //| movzx RAd, PC_RA //| jmp <1 - dasm_put(Dst, 10569); -#line 2624 "vm_x64.dasc" + dasm_put(Dst, 10589); +#line 2631 "vm_x64.dasc" #if LJ_52 //|9: // Check for __len. //| test byte TAB:RB->nomm, 1<vmeta_len // 'no __len' flag NOT set: check. - dasm_put(Dst, 10597, Dt6(->nomm), 1<nomm), 1<BC_MODVN_Z: //| call ->vm_mod //| ins_arithpost //| ins_next - dasm_put(Dst, 11244); -#line 2726 "vm_x64.dasc" + dasm_put(Dst, 11264); +#line 2733 "vm_x64.dasc" break; case BC_MODNV: case BC_MODVV: //| ins_arithpre movsd, xmm1 - dasm_put(Dst, 10613); + dasm_put(Dst, 10633); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 11125, LJ_TISNUM); + dasm_put(Dst, 11145, LJ_TISNUM); break; case 1: - dasm_put(Dst, 11159, LJ_TISNUM); + dasm_put(Dst, 11179, LJ_TISNUM); break; default: - dasm_put(Dst, 11193, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 11213, LJ_TISNUM, LJ_TISNUM); break; } -#line 2729 "vm_x64.dasc" +#line 2736 "vm_x64.dasc" //| jmp ->BC_MODVN_Z // Avoid 3 copies. It's slow anyway. - dasm_put(Dst, 11277); -#line 2730 "vm_x64.dasc" + dasm_put(Dst, 11297); +#line 2737 "vm_x64.dasc" break; case BC_POW: //| ins_arithpre movsd, xmm1 - dasm_put(Dst, 10613); + dasm_put(Dst, 10633); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 11125, LJ_TISNUM); + dasm_put(Dst, 11145, LJ_TISNUM); break; case 1: - dasm_put(Dst, 11159, LJ_TISNUM); + dasm_put(Dst, 11179, LJ_TISNUM); break; default: - dasm_put(Dst, 11193, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 11213, LJ_TISNUM, LJ_TISNUM); break; } -#line 2733 "vm_x64.dasc" +#line 2740 "vm_x64.dasc" //| mov RB, BASE //| call extern pow //| movzx RAd, PC_RA //| mov BASE, RB //| ins_arithpost //| ins_next - dasm_put(Dst, 11282); -#line 2739 "vm_x64.dasc" + dasm_put(Dst, 11302); +#line 2746 "vm_x64.dasc" break; case BC_CAT: @@ -4326,8 +4334,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| mov RC, [BASE+RB*8] //| mov [BASE+RA*8], RC //| ins_next - dasm_put(Dst, 11326, Dt1(->base), Dt1(->base)); -#line 2761 "vm_x64.dasc" + dasm_put(Dst, 11346, Dt1(->base), Dt1(->base)); +#line 2768 "vm_x64.dasc" break; /* -- Constant ops ------------------------------------------------------ */ @@ -4338,8 +4346,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| settp RD, LJ_TSTR //| mov [BASE+RA*8], RD //| ins_next - dasm_put(Dst, 11418, (unsigned int)(((uint64_t)LJ_TSTR<<47)), (unsigned int)((((uint64_t)LJ_TSTR<<47))>>32)); -#line 2771 "vm_x64.dasc" + dasm_put(Dst, 11438, (unsigned int)(((uint64_t)LJ_TSTR<<47)), (unsigned int)((((uint64_t)LJ_TSTR<<47))>>32)); +#line 2778 "vm_x64.dasc" break; case BC_KCDATA: //| ins_AND // RA = dst, RD = cdata const (~) @@ -4347,8 +4355,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| settp RD, LJ_TCDATA //| mov [BASE+RA*8], RD //| ins_next - dasm_put(Dst, 11418, (unsigned int)(((uint64_t)LJ_TCDATA<<47)), (unsigned int)((((uint64_t)LJ_TCDATA<<47))>>32)); -#line 2778 "vm_x64.dasc" + dasm_put(Dst, 11438, (unsigned int)(((uint64_t)LJ_TCDATA<<47)), (unsigned int)((((uint64_t)LJ_TCDATA<<47))>>32)); +#line 2785 "vm_x64.dasc" break; case BC_KSHORT: //| ins_AD // RA = dst, RD = signed int16 literal @@ -4356,16 +4364,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| cvtsi2sd xmm0, RDd //| movsd qword [BASE+RA*8], xmm0 //| ins_next - dasm_put(Dst, 11459); -#line 2785 "vm_x64.dasc" + dasm_put(Dst, 11479); +#line 2792 "vm_x64.dasc" break; case BC_KNUM: //| ins_AD // RA = dst, RD = num const //| movsd xmm0, qword [KBASE+RD*8] //| movsd qword [BASE+RA*8], xmm0 //| ins_next - dasm_put(Dst, 11495); -#line 2791 "vm_x64.dasc" + dasm_put(Dst, 11515); +#line 2798 "vm_x64.dasc" break; case BC_KPRI: //| ins_AD // RA = dst, RD = primitive type (~) @@ -4373,8 +4381,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| not RD //| mov [BASE+RA*8], RD //| ins_next - dasm_put(Dst, 10382); -#line 2798 "vm_x64.dasc" + dasm_put(Dst, 10402); +#line 2805 "vm_x64.dasc" break; case BC_KNIL: //| ins_AD // RA = dst_start, RD = dst_end @@ -4388,8 +4396,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| cmp RA, RD //| jbe <1 //| ins_next - dasm_put(Dst, 11530, LJ_TNIL); -#line 2811 "vm_x64.dasc" + dasm_put(Dst, 11550, LJ_TNIL); +#line 2818 "vm_x64.dasc" break; /* -- Upvalue and function ops ------------------------------------------ */ @@ -4403,8 +4411,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| mov RD, [RB] //| mov [BASE+RA*8], RD //| ins_next - dasm_put(Dst, 11586, offsetof(GCfuncL, uvptr), DtA(->v)); -#line 2824 "vm_x64.dasc" + dasm_put(Dst, 11606, offsetof(GCfuncL, uvptr), DtA(->v)); +#line 2831 "vm_x64.dasc" break; case BC_USETV: #define TV2MARKOFS \ @@ -4435,15 +4443,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| jz <1 //| // Crossed a write barrier. Move the barrier forward. //| mov CARG2, RB - dasm_put(Dst, 11640, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TNUMX - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES); -#line 2854 "vm_x64.dasc" + dasm_put(Dst, 11660, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TNUMX - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES); +#line 2861 "vm_x64.dasc" //| mov RB, BASE // Save BASE. //| lea GL:CARG1, [DISPATCH+GG_DISP2G] //| call extern lj_gc_barrieruv // (global_State *g, TValue *tv) //| mov BASE, RB // Restore BASE. //| jmp <1 - dasm_put(Dst, 11752, GG_DISP2G); -#line 2859 "vm_x64.dasc" + dasm_put(Dst, 11772, GG_DISP2G); +#line 2866 "vm_x64.dasc" break; #undef TV2MARKOFS case BC_USETS: @@ -4472,8 +4480,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| call extern lj_gc_barrieruv // (global_State *g, TValue *tv) //| mov BASE, RB // Restore BASE. //| jmp <1 - dasm_put(Dst, 11776, offsetof(GCfuncL, uvptr), DtA(->v), (unsigned int)(((uint64_t)LJ_TSTR<<47)), (unsigned int)((((uint64_t)LJ_TSTR<<47))>>32), DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G); -#line 2887 "vm_x64.dasc" + dasm_put(Dst, 11796, offsetof(GCfuncL, uvptr), DtA(->v), (unsigned int)(((uint64_t)LJ_TSTR<<47)), (unsigned int)((((uint64_t)LJ_TSTR<<47))>>32), DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G); +#line 2894 "vm_x64.dasc" break; case BC_USETN: //| ins_AD // RA = upvalue #, RD = num const @@ -4484,8 +4492,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| mov RA, UPVAL:RB->v //| movsd qword [RA], xmm0 //| ins_next - dasm_put(Dst, 11892, offsetof(GCfuncL, uvptr), DtA(->v)); -#line 2897 "vm_x64.dasc" + dasm_put(Dst, 11912, offsetof(GCfuncL, uvptr), DtA(->v)); +#line 2904 "vm_x64.dasc" break; case BC_USETP: //| ins_AD // RA = upvalue #, RD = primitive type (~) @@ -4497,8 +4505,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| mov RA, UPVAL:RB->v //| mov [RA], RD //| ins_next - dasm_put(Dst, 11950, offsetof(GCfuncL, uvptr), DtA(->v)); -#line 2908 "vm_x64.dasc" + dasm_put(Dst, 11970, offsetof(GCfuncL, uvptr), DtA(->v)); +#line 2915 "vm_x64.dasc" break; case BC_UCLO: //| ins_AD // RA = level, RD = target @@ -4513,8 +4521,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| mov BASE, L:RB->base //|1: //| ins_next - dasm_put(Dst, 12007, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base)); -#line 2922 "vm_x64.dasc" + dasm_put(Dst, 12027, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base)); +#line 2929 "vm_x64.dasc" break; case BC_FNEW: @@ -4534,8 +4542,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| settp LFUNC:RC, LJ_TFUNC //| mov [BASE+RA*8], LFUNC:RC //| ins_next - dasm_put(Dst, 12071, Dt1(->base), Dt1(->base), (unsigned int)(((uint64_t)LJ_TFUNC<<47)), (unsigned int)((((uint64_t)LJ_TFUNC<<47))>>32)); -#line 2941 "vm_x64.dasc" + dasm_put(Dst, 12091, Dt1(->base), Dt1(->base), (unsigned int)(((uint64_t)LJ_TFUNC<<47)), (unsigned int)((((uint64_t)LJ_TFUNC<<47))>>32)); +#line 2948 "vm_x64.dasc" break; /* -- Table ops --------------------------------------------------------- */ @@ -4572,8 +4580,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| call extern lj_gc_step_fixtop // (lua_State *L) //| movzx RDd, PC_RD //| jmp <1 - dasm_put(Dst, 12157, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), (unsigned int)(((uint64_t)LJ_TTAB<<47)), (unsigned int)((((uint64_t)LJ_TTAB<<47))>>32)); -#line 2977 "vm_x64.dasc" + dasm_put(Dst, 12177, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), (unsigned int)(((uint64_t)LJ_TTAB<<47)), (unsigned int)((((uint64_t)LJ_TTAB<<47))>>32)); +#line 2984 "vm_x64.dasc" break; case BC_TDUP: //| ins_AND // RA = dst, RD = table const (~) (holding template table) @@ -4599,8 +4607,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| movzx RDd, PC_RD // Need to reload RD. //| not RD //| jmp <2 - dasm_put(Dst, 12291, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), (unsigned int)(((uint64_t)LJ_TTAB<<47)), (unsigned int)((((uint64_t)LJ_TTAB<<47))>>32)); -#line 3002 "vm_x64.dasc" + dasm_put(Dst, 12311, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), (unsigned int)(((uint64_t)LJ_TTAB<<47)), (unsigned int)((((uint64_t)LJ_TTAB<<47))>>32)); +#line 3009 "vm_x64.dasc" break; case BC_GGET: @@ -4610,8 +4618,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| mov TAB:RB, LFUNC:RB->env //| mov STR:RC, [KBASE+RD*8] //| jmp ->BC_TGETS_Z - dasm_put(Dst, 12400, Dt7(->env)); -#line 3011 "vm_x64.dasc" + dasm_put(Dst, 12420, Dt7(->env)); +#line 3018 "vm_x64.dasc" break; case BC_GSET: //| ins_AND // RA = src, RD = str const (~) @@ -4620,8 +4628,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| mov TAB:RB, LFUNC:RB->env //| mov STR:RC, [KBASE+RD*8] //| jmp ->BC_TSETS_Z - dasm_put(Dst, 12431, Dt7(->env)); -#line 3019 "vm_x64.dasc" + dasm_put(Dst, 12451, Dt7(->env)); +#line 3026 "vm_x64.dasc" break; case BC_TGETV: @@ -4655,8 +4663,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| test TAB:TMPR, TAB:TMPR //| jz <1 //| test byte TAB:TMPR->nomm, 1<asize), Dt6(->array), LJ_TNIL, Dt6(->metatable)); -#line 3052 "vm_x64.dasc" + dasm_put(Dst, 12482, LJ_TTAB, LJ_TISNUM, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable)); +#line 3059 "vm_x64.dasc" //| jz ->vmeta_tgetv // 'no __index' flag NOT set: check. //| jmp <1 //| @@ -4664,8 +4672,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| cmp ITYPEd, LJ_TSTR; jne ->vmeta_tgetv //| cleartp STR:RC //| jmp ->BC_TGETS_Z - dasm_put(Dst, 12612, Dt6(->nomm), 1<nomm), 1<5 // Key found, but nil value? //|2: //| mov [BASE+RA*8], ITYPE - dasm_put(Dst, 12650, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->node), (unsigned int)(((uint64_t)LJ_TSTR<<47)), (unsigned int)((((uint64_t)LJ_TSTR<<47))>>32), DtB(->key), DtB(->val), LJ_TNIL); -#line 3081 "vm_x64.dasc" + dasm_put(Dst, 12670, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->node), (unsigned int)(((uint64_t)LJ_TSTR<<47)), (unsigned int)((((uint64_t)LJ_TSTR<<47))>>32), DtB(->key), DtB(->val), LJ_TNIL); +#line 3088 "vm_x64.dasc" //| ins_next //| //|4: // Follow hash chain. @@ -4706,8 +4714,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| test byte TAB:TMPR->nomm, 1<vmeta_tgets // Caveat: preserve STR:RC. - dasm_put(Dst, 12748, DtB(->next), LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<next), LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<nomm, 1<vmeta_tgetb // 'no __index' flag NOT set: check. //| jmp <1 - dasm_put(Dst, 12818, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<BC_TGETR2_Z: //| mov [BASE+RA*8], ITYPE //| ins_next - dasm_put(Dst, 12934, Dt6(->asize), Dt6(->array)); -#line 3137 "vm_x64.dasc" + dasm_put(Dst, 12954, Dt6(->asize), Dt6(->array)); +#line 3144 "vm_x64.dasc" break; case BC_TSETV: @@ -4780,8 +4788,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| jnz >7 //|2: // Set array slot. //| mov RB, [BASE+RA*8] - dasm_put(Dst, 13008, LJ_TTAB, LJ_TISNUM, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK); -#line 3164 "vm_x64.dasc" + dasm_put(Dst, 13028, LJ_TTAB, LJ_TISNUM, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK); +#line 3171 "vm_x64.dasc" //| mov [RC], RB //| ins_next //| @@ -4800,11 +4808,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| //|7: // Possible table write barrier for the value. Skip valiswhite check. //| barrierback TAB:RB, TMPR - dasm_put(Dst, 13127, Dt6(->metatable), Dt6(->nomm), 1<marked), (uint8_t)~LJ_GC_BLACK); -#line 3182 "vm_x64.dasc" + dasm_put(Dst, 13147, Dt6(->metatable), Dt6(->nomm), 1<marked), (uint8_t)~LJ_GC_BLACK); +#line 3189 "vm_x64.dasc" //| jmp <2 - dasm_put(Dst, 13212, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); -#line 3183 "vm_x64.dasc" + dasm_put(Dst, 13232, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); +#line 3190 "vm_x64.dasc" break; case BC_TSETS: //| ins_ABC // RA = src, RB = table, RC = str const (~) @@ -4827,8 +4835,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| je >4 // Previous value is nil? //|2: //| test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table) - dasm_put(Dst, 13229, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), (unsigned int)(((uint64_t)LJ_TSTR<<47)), (unsigned int)((((uint64_t)LJ_TSTR<<47))>>32), DtB(->key), LJ_TNIL); -#line 3205 "vm_x64.dasc" + dasm_put(Dst, 13249, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), (unsigned int)(((uint64_t)LJ_TSTR<<47)), (unsigned int)((((uint64_t)LJ_TSTR<<47))>>32), DtB(->key), LJ_TNIL); +#line 3212 "vm_x64.dasc" //| jnz >7 //|3: // Set node value. //| mov ITYPE, [BASE+RA*8] @@ -4851,8 +4859,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| //| // But check for __newindex first. //| mov TAB:TMPR, TAB:RB->metatable - dasm_put(Dst, 13326, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<next)); -#line 3227 "vm_x64.dasc" + dasm_put(Dst, 13346, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<next)); +#line 3234 "vm_x64.dasc" //| test TAB:TMPR, TAB:TMPR //| jz >6 // No metatable: continue. //| test byte TAB:TMPR->nomm, 1<metatable), Dt6(->nomm), 1<base), Dt1(->base), Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); -#line 3249 "vm_x64.dasc" + dasm_put(Dst, 13426, Dt6(->metatable), Dt6(->nomm), 1<base), Dt1(->base), Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); +#line 3256 "vm_x64.dasc" break; case BC_TSETB: //| ins_ABC // RA = src, RB = table, RC = byte literal @@ -4901,16 +4909,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| test TAB:TMPR, TAB:TMPR //| jz <1 //| test byte TAB:TMPR->nomm, 1<asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable)); -#line 3273 "vm_x64.dasc" + dasm_put(Dst, 13523, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable)); +#line 3280 "vm_x64.dasc" //| jz ->vmeta_tsetb // 'no __newindex' flag NOT set: check. //| jmp <1 //| //|7: // Possible table write barrier for the value. Skip valiswhite check. //| barrierback TAB:RB, TMPR //| jmp <2 - dasm_put(Dst, 13619, Dt6(->nomm), 1<marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); -#line 3279 "vm_x64.dasc" + dasm_put(Dst, 13639, Dt6(->nomm), 1<marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); +#line 3286 "vm_x64.dasc" break; case BC_TSETR: //| ins_ABC // RA = src, RB = table, RC = key @@ -4933,8 +4941,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //|7: // Possible table write barrier for the value. Skip valiswhite check. //| barrierback TAB:RB, TMPR //| jmp <2 - dasm_put(Dst, 13656, Dt6(->marked), LJ_GC_BLACK, Dt6(->asize), Dt6(->array), Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); -#line 3301 "vm_x64.dasc" + dasm_put(Dst, 13676, Dt6(->marked), LJ_GC_BLACK, Dt6(->asize), Dt6(->array), Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); +#line 3308 "vm_x64.dasc" break; case BC_TSETM: @@ -4976,43 +4984,43 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| call extern lj_tab_reasize // (lua_State *L, GCtab *t, int nasize) //| mov BASE, L:RB->base //| movzx RAd, PC_RA // Restore RA. - dasm_put(Dst, 13761, Dt6(->marked), LJ_GC_BLACK, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base)); -#line 3342 "vm_x64.dasc" + dasm_put(Dst, 13781, Dt6(->marked), LJ_GC_BLACK, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base)); +#line 3349 "vm_x64.dasc" //| movzx RDd, PC_RD // Restore RD. //| jmp <1 // Retry. //| //|7: // Possible table write barrier for any value. Skip valiswhite check. //| barrierback TAB:RB, RD //| jmp <2 - dasm_put(Dst, 13908, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); -#line 3348 "vm_x64.dasc" + dasm_put(Dst, 13928, Dt6(->marked), (uint8_t)~LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); +#line 3355 "vm_x64.dasc" break; /* -- Calls and vararg handling ----------------------------------------- */ case BC_CALL: case BC_CALLM: //| ins_A_C // RA = base, (RB = nresults+1,) RC = nargs+1 | extra_nargs - dasm_put(Dst, 10617); -#line 3354 "vm_x64.dasc" + dasm_put(Dst, 10637); +#line 3361 "vm_x64.dasc" if (op == BC_CALLM) { //| add NARGS:RDd, MULTRES - dasm_put(Dst, 13945); -#line 3356 "vm_x64.dasc" + dasm_put(Dst, 13965); +#line 3363 "vm_x64.dasc" } //| mov LFUNC:RB, [BASE+RA*8] //| checkfunc LFUNC:RB, ->vmeta_call_ra //| lea BASE, [BASE+RA*8+16] //| ins_call - dasm_put(Dst, 13949, LJ_TFUNC, Dt7(->pc)); -#line 3361 "vm_x64.dasc" + dasm_put(Dst, 13969, LJ_TFUNC, Dt7(->pc)); +#line 3368 "vm_x64.dasc" break; case BC_CALLMT: //| ins_AD // RA = base, RD = extra_nargs //| add NARGS:RDd, MULTRES //| // Fall through. Assumes BC_CALLT follows and ins_AD is a no-op. - dasm_put(Dst, 13945); -#line 3367 "vm_x64.dasc" + dasm_put(Dst, 13965); +#line 3374 "vm_x64.dasc" break; case BC_CALLT: //| ins_AD // RA = base, RD = nargs+1 @@ -5045,8 +5053,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| ja >5 //|4: //| ins_callt - dasm_put(Dst, 14014, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->pc)); -#line 3399 "vm_x64.dasc" + dasm_put(Dst, 14034, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->pc)); +#line 3406 "vm_x64.dasc" //| //|5: // Tailcall to a fast function. //| test PCd, FRAME_TYPE // Lua frame below? @@ -5070,8 +5078,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //|8: //| add PCd, FRAME_VARG //| jmp <1 - dasm_put(Dst, 14134, FRAME_TYPE, Dt7(->pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP, FRAME_VARG); -#line 3422 "vm_x64.dasc" + dasm_put(Dst, 14154, FRAME_TYPE, Dt7(->pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP, FRAME_VARG); +#line 3429 "vm_x64.dasc" break; case BC_ITERC: @@ -5087,8 +5095,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| checkfunc LFUNC:RB, ->vmeta_call //| mov BASE, RA //| ins_call - dasm_put(Dst, 14238, 2+1, LJ_TFUNC, Dt7(->pc)); -#line 3437 "vm_x64.dasc" + dasm_put(Dst, 14258, 2+1, LJ_TFUNC, Dt7(->pc)); +#line 3444 "vm_x64.dasc" break; case BC_ITERN: @@ -5126,8 +5134,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //|6: //| cmp RCd, TAB:RB->hmask; ja <3 // End of iteration? Branch to ITERL+1. //| imul ITYPEd, RCd, #NODE - dasm_put(Dst, 14328, Dt6(->asize), Dt6(->array), LJ_TNIL, -BCBIAS_J*4, Dt6(->hmask)); -#line 3474 "vm_x64.dasc" + dasm_put(Dst, 14348, Dt6(->asize), Dt6(->array), LJ_TNIL, -BCBIAS_J*4, Dt6(->hmask)); +#line 3481 "vm_x64.dasc" //| add NODE:ITYPE, TAB:RB->node //| cmp aword NODE:ITYPE->val, LJ_TNIL; je >7 //| lea TMPRd, [RCd+TMPRd+1] @@ -5142,8 +5150,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //|7: // Skip holes in hash part. //| add RCd, 1 //| jmp <6 - dasm_put(Dst, 14467, sizeof(Node), Dt6(->node), DtB(->val), LJ_TNIL, DtB(->key), DtB(->val)); -#line 3488 "vm_x64.dasc" + dasm_put(Dst, 14487, sizeof(Node), Dt6(->node), DtB(->val), LJ_TNIL, DtB(->key), DtB(->val)); +#line 3495 "vm_x64.dasc" break; case BC_ISNEXT: @@ -5161,12 +5169,12 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //|5: // Despecialize bytecode if any of the checks fail. //| mov PC_OP, BC_JMP //| branchPC RD - dasm_put(Dst, 14526, LJ_TFUNC, LJ_TTAB, LJ_TNIL, Dt8(->ffid), FF_next_N, -BCBIAS_J*4, (unsigned int)(U64x(fffe7fff, 00000000)), (unsigned int)((U64x(fffe7fff, 00000000))>>32), BC_JMP); -#line 3505 "vm_x64.dasc" + dasm_put(Dst, 14546, LJ_TFUNC, LJ_TTAB, LJ_TNIL, Dt8(->ffid), FF_next_N, -BCBIAS_J*4, (unsigned int)(U64x(fffe7fff, 00000000)), (unsigned int)((U64x(fffe7fff, 00000000))>>32), BC_JMP); +#line 3512 "vm_x64.dasc" //| mov byte [PC], BC_ITERC //| jmp <1 - dasm_put(Dst, 14645, -BCBIAS_J*4, BC_ITERC); -#line 3507 "vm_x64.dasc" + dasm_put(Dst, 14665, -BCBIAS_J*4, BC_ITERC); +#line 3514 "vm_x64.dasc" break; case BC_VARG: @@ -5210,8 +5218,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| add RC, RA //| cmp RC, L:RB->maxstack //| ja >7 // Need to grow stack? - dasm_put(Dst, 14659, (16+FRAME_VARG), LJ_TNIL, Dt1(->maxstack)); -#line 3550 "vm_x64.dasc" + dasm_put(Dst, 14679, (16+FRAME_VARG), LJ_TNIL, Dt1(->maxstack)); +#line 3557 "vm_x64.dasc" //|6: // Copy all vararg slots. //| mov RC, [TMPR-16] //| add TMPR, 8 @@ -5236,8 +5244,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| mov RA, L:RB->top //| add TMPR, BASE //| jmp <6 - dasm_put(Dst, 14821, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top)); -#line 3574 "vm_x64.dasc" + dasm_put(Dst, 14841, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top)); +#line 3581 "vm_x64.dasc" break; /* -- Returns ----------------------------------------------------------- */ @@ -5246,24 +5254,24 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| ins_AD // RA = results, RD = extra_nresults //| add RDd, MULTRES // MULTRES >=1, so RD >=1. //| // Fall through. Assumes BC_RET follows and ins_AD is a no-op. - dasm_put(Dst, 13945); -#line 3582 "vm_x64.dasc" + dasm_put(Dst, 13965); +#line 3589 "vm_x64.dasc" break; case BC_RET: case BC_RET0: case BC_RET1: //| ins_AD // RA = results, RD = nresults+1 if (op != BC_RET0) { //| shl RAd, 3 - dasm_put(Dst, 14913); -#line 3588 "vm_x64.dasc" + dasm_put(Dst, 14933); +#line 3595 "vm_x64.dasc" } //|1: //| mov PC, [BASE-8] //| mov MULTRES, RDd // Save nresults+1. //| test PCd, FRAME_TYPE // Check frame type marker. //| jnz >7 // Not returning to a fixarg Lua func? - dasm_put(Dst, 14917, FRAME_TYPE); -#line 3594 "vm_x64.dasc" + dasm_put(Dst, 14937, FRAME_TYPE); +#line 3601 "vm_x64.dasc" switch (op) { case BC_RET: //|->BC_RET_Z: @@ -5282,21 +5290,21 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //|5: //| cmp RBd, RDd // More results expected? //| ja >6 - dasm_put(Dst, 14936); -#line 3612 "vm_x64.dasc" + dasm_put(Dst, 14956); +#line 3619 "vm_x64.dasc" break; case BC_RET1: //| mov RB, [BASE+RA] //| mov [BASE-16], RB - dasm_put(Dst, 14989); -#line 3616 "vm_x64.dasc" + dasm_put(Dst, 15009); +#line 3623 "vm_x64.dasc" /* fallthrough */ case BC_RET0: //|5: //| cmp PC_RB, RDL // More results expected? //| ja >6 - dasm_put(Dst, 14999); -#line 3621 "vm_x64.dasc" + dasm_put(Dst, 15019); +#line 3628 "vm_x64.dasc" default: break; } @@ -5310,17 +5318,17 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| ins_next //| //|6: // Fill up results with nil. - dasm_put(Dst, 15010, Dt7(->pc), PC2PROTO(k)); -#line 3634 "vm_x64.dasc" + dasm_put(Dst, 15030, Dt7(->pc), PC2PROTO(k)); +#line 3641 "vm_x64.dasc" if (op == BC_RET) { //| mov aword [KBASE-16], LJ_TNIL // Note: relies on shifted base. //| add KBASE, 8 - dasm_put(Dst, 15071, LJ_TNIL); -#line 3637 "vm_x64.dasc" + dasm_put(Dst, 15091, LJ_TNIL); +#line 3644 "vm_x64.dasc" } else { //| mov aword [BASE+RD*8-24], LJ_TNIL - dasm_put(Dst, 15082, LJ_TNIL); -#line 3639 "vm_x64.dasc" + dasm_put(Dst, 15102, LJ_TNIL); +#line 3646 "vm_x64.dasc" } //| add RD, 1 //| jmp <5 @@ -5331,16 +5339,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| jnz ->vm_return //| // Return from vararg function: relocate BASE down and RA up. //| sub BASE, RB - dasm_put(Dst, 15089, -FRAME_VARG, FRAME_TYPEP); -#line 3649 "vm_x64.dasc" + dasm_put(Dst, 15109, -FRAME_VARG, FRAME_TYPEP); +#line 3656 "vm_x64.dasc" if (op != BC_RET0) { //| add RA, RB - dasm_put(Dst, 15116); -#line 3651 "vm_x64.dasc" + dasm_put(Dst, 15136); +#line 3658 "vm_x64.dasc" } //| jmp <1 - dasm_put(Dst, 10592); -#line 3653 "vm_x64.dasc" + dasm_put(Dst, 10612); +#line 3660 "vm_x64.dasc" break; /* -- Loops and branches ------------------------------------------------ */ @@ -5353,8 +5361,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_FORL: //| hotloop RBd //| // Fall through. Assumes BC_IFORL follows and ins_AJ is a no-op. - dasm_put(Dst, 15121, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP); -#line 3665 "vm_x64.dasc" + dasm_put(Dst, 15141, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP); +#line 3672 "vm_x64.dasc" break; case BC_JFORI: @@ -5364,69 +5372,69 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) vk = (op == BC_IFORL || op == BC_JFORL); //| ins_AJ // RA = base, RD = target (after end of loop or start of loop) //| lea RA, [BASE+RA*8] - dasm_put(Dst, 15142); -#line 3674 "vm_x64.dasc" + dasm_put(Dst, 15162); +#line 3681 "vm_x64.dasc" if (!vk) { //| checknumtp FOR_IDX, ->vmeta_for //| checknumtp FOR_STOP, ->vmeta_for - dasm_put(Dst, 15147, LJ_TISNUM, LJ_TISNUM); -#line 3677 "vm_x64.dasc" + dasm_put(Dst, 15167, LJ_TISNUM, LJ_TISNUM); +#line 3684 "vm_x64.dasc" } else { #ifdef LUA_USE_ASSERT //| checknumtp FOR_STOP, ->assert_bad_for_arg_type //| checknumtp FOR_STEP, ->assert_bad_for_arg_type - dasm_put(Dst, 15183, LJ_TISNUM, LJ_TISNUM); -#line 3681 "vm_x64.dasc" + dasm_put(Dst, 15203, LJ_TISNUM, LJ_TISNUM); +#line 3688 "vm_x64.dasc" #endif } //| mov RB, FOR_STEP - dasm_put(Dst, 15220); -#line 3684 "vm_x64.dasc" + dasm_put(Dst, 15240); +#line 3691 "vm_x64.dasc" if (!vk) { //| checknum RB, ->vmeta_for - dasm_put(Dst, 15225, LJ_TISNUM); -#line 3686 "vm_x64.dasc" + dasm_put(Dst, 15245, LJ_TISNUM); +#line 3693 "vm_x64.dasc" } //| movsd xmm0, qword FOR_IDX //| movsd xmm1, qword FOR_STOP - dasm_put(Dst, 15244); -#line 3689 "vm_x64.dasc" + dasm_put(Dst, 15264); +#line 3696 "vm_x64.dasc" if (vk) { //| addsd xmm0, qword FOR_STEP //| movsd qword FOR_IDX, xmm0 //| test RB, RB; js >3 - dasm_put(Dst, 15256); -#line 3693 "vm_x64.dasc" + dasm_put(Dst, 15276); +#line 3700 "vm_x64.dasc" } else { //| jl >3 - dasm_put(Dst, 15276); -#line 3695 "vm_x64.dasc" + dasm_put(Dst, 15296); +#line 3702 "vm_x64.dasc" } //| ucomisd xmm1, xmm0 //|1: //| movsd qword FOR_EXT, xmm0 - dasm_put(Dst, 15281); -#line 3699 "vm_x64.dasc" + dasm_put(Dst, 15301); +#line 3706 "vm_x64.dasc" if (op == BC_FORI) { //| jnb >2 //| branchPC RD - dasm_put(Dst, 15294, -BCBIAS_J*4); -#line 3702 "vm_x64.dasc" + dasm_put(Dst, 15314, -BCBIAS_J*4); +#line 3709 "vm_x64.dasc" } else if (op == BC_JFORI) { //| branchPC RD //| movzx RDd, PC_RD //| jnb =>BC_JLOOP - dasm_put(Dst, 15305, -BCBIAS_J*4, BC_JLOOP); -#line 3706 "vm_x64.dasc" + dasm_put(Dst, 15325, -BCBIAS_J*4, BC_JLOOP); +#line 3713 "vm_x64.dasc" } else if (op == BC_IFORL) { //| jb >2 //| branchPC RD - dasm_put(Dst, 15320, -BCBIAS_J*4); -#line 3709 "vm_x64.dasc" + dasm_put(Dst, 15340, -BCBIAS_J*4); +#line 3716 "vm_x64.dasc" } else { //| jnb =>BC_JLOOP - dasm_put(Dst, 15316, BC_JLOOP); -#line 3711 "vm_x64.dasc" + dasm_put(Dst, 15336, BC_JLOOP); +#line 3718 "vm_x64.dasc" } //|2: //| ins_next @@ -5434,15 +5442,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //|3: // Invert comparison if step is negative. //| ucomisd xmm0, xmm1 //| jmp <1 - dasm_put(Dst, 15331); -#line 3718 "vm_x64.dasc" + dasm_put(Dst, 15351); +#line 3725 "vm_x64.dasc" break; case BC_ITERL: //| hotloop RBd //| // Fall through. Assumes BC_IITERL follows and ins_AJ is a no-op. - dasm_put(Dst, 15121, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP); -#line 3723 "vm_x64.dasc" + dasm_put(Dst, 15141, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP); +#line 3730 "vm_x64.dasc" break; case BC_JITERL: @@ -5451,23 +5459,23 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| lea RA, [BASE+RA*8] //| mov RB, [RA] //| cmp RB, LJ_TNIL; je >1 // Stop if iterator returned nil. - dasm_put(Dst, 15365, LJ_TNIL); -#line 3731 "vm_x64.dasc" + dasm_put(Dst, 15385, LJ_TNIL); +#line 3738 "vm_x64.dasc" if (op == BC_JITERL) { //| mov [RA-8], RB //| jmp =>BC_JLOOP - dasm_put(Dst, 15382, BC_JLOOP); -#line 3734 "vm_x64.dasc" + dasm_put(Dst, 15402, BC_JLOOP); +#line 3741 "vm_x64.dasc" } else { //| branchPC RD // Otherwise save control var + branch. //| mov [RA-8], RB - dasm_put(Dst, 15391, -BCBIAS_J*4); -#line 3737 "vm_x64.dasc" + dasm_put(Dst, 15411, -BCBIAS_J*4); +#line 3744 "vm_x64.dasc" } //|1: //| ins_next - dasm_put(Dst, 9782); -#line 3740 "vm_x64.dasc" + dasm_put(Dst, 9802); +#line 3747 "vm_x64.dasc" break; case BC_LOOP: @@ -5476,15 +5484,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| // This opcode does NOT jump, it's only purpose is to detect a hot loop. //| hotloop RBd //| // Fall through. Assumes BC_ILOOP follows and ins_A is a no-op. - dasm_put(Dst, 15121, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP); -#line 3748 "vm_x64.dasc" + dasm_put(Dst, 15141, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_LOOP); +#line 3755 "vm_x64.dasc" break; case BC_ILOOP: //| ins_A // RA = base, RD = target (loop extent) //| ins_next - dasm_put(Dst, 9784); -#line 3753 "vm_x64.dasc" + dasm_put(Dst, 9804); +#line 3760 "vm_x64.dasc" break; case BC_JLOOP: @@ -5500,16 +5508,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| mov [rsp+16], r12 //| mov [rsp+8], r13 //| jmp RD - dasm_put(Dst, 15403, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(tmpbuf.L)); -#line 3768 "vm_x64.dasc" + dasm_put(Dst, 15423, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(tmpbuf.L)); +#line 3775 "vm_x64.dasc" break; case BC_JMP: //| ins_AJ // RA = unused, RD = target //| branchPC RD //| ins_next - dasm_put(Dst, 15447, -BCBIAS_J*4); -#line 3774 "vm_x64.dasc" + dasm_put(Dst, 15467, -BCBIAS_J*4); +#line 3781 "vm_x64.dasc" break; /* -- Function headers -------------------------------------------------- */ @@ -5523,8 +5531,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_FUNCF: //| hotcall RBd - dasm_put(Dst, 15475, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL); -#line 3787 "vm_x64.dasc" + dasm_put(Dst, 15495, HOTCOUNT_PCMASK, GG_DISP2HOT, HOTCOUNT_CALL); +#line 3794 "vm_x64.dasc" case BC_FUNCV: /* NYI: compiled vararg functions. */ //| // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow and ins_AD is a no-op. break; @@ -5541,17 +5549,17 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| cmp NARGS:RDd, RAd // Check for missing parameters. //| jbe >3 //|2: - dasm_put(Dst, 15496, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams)); -#line 3803 "vm_x64.dasc" + dasm_put(Dst, 15516, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams)); +#line 3810 "vm_x64.dasc" if (op == BC_JFUNCF) { //| movzx RDd, PC_RD //| jmp =>BC_JLOOP - dasm_put(Dst, 15530, BC_JLOOP); -#line 3806 "vm_x64.dasc" + dasm_put(Dst, 15550, BC_JLOOP); +#line 3813 "vm_x64.dasc" } else { //| ins_next - dasm_put(Dst, 9784); -#line 3808 "vm_x64.dasc" + dasm_put(Dst, 9804); +#line 3815 "vm_x64.dasc" } //| //|3: // Clear missing parameters. @@ -5560,14 +5568,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| cmp NARGS:RDd, RAd //| jbe <3 //| jmp <2 - dasm_put(Dst, 15539, LJ_TNIL); -#line 3816 "vm_x64.dasc" + dasm_put(Dst, 15559, LJ_TNIL); +#line 3823 "vm_x64.dasc" break; case BC_JFUNCV: //| int3 // NYI: compiled vararg functions - dasm_put(Dst, 9290); -#line 3820 "vm_x64.dasc" + dasm_put(Dst, 9315); +#line 3827 "vm_x64.dasc" break; /* NYI: compiled vararg functions. */ case BC_IFUNCV: @@ -5598,18 +5606,18 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| sub RBd, 1 //| jnz <1 //|2: - dasm_put(Dst, 15562, FRAME_VARG+8, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL); -#line 3850 "vm_x64.dasc" + dasm_put(Dst, 15582, FRAME_VARG+8, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL); +#line 3857 "vm_x64.dasc" if (op == BC_JFUNCV) { //| movzx RDd, PC_RD //| jmp =>BC_JLOOP - dasm_put(Dst, 15530, BC_JLOOP); -#line 3853 "vm_x64.dasc" + dasm_put(Dst, 15550, BC_JLOOP); +#line 3860 "vm_x64.dasc" } else { //| mov KBASE, [PC-4+PC2PROTO(k)] //| ins_next - dasm_put(Dst, 15666, -4+PC2PROTO(k)); -#line 3856 "vm_x64.dasc" + dasm_put(Dst, 15686, -4+PC2PROTO(k)); +#line 3863 "vm_x64.dasc" } //| //|3: // Clear missing parameters. @@ -5618,8 +5626,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| sub RBd, 1 //| jnz <3 //| jmp <2 - dasm_put(Dst, 15692, LJ_TNIL); -#line 3864 "vm_x64.dasc" + dasm_put(Dst, 15712, LJ_TNIL); +#line 3871 "vm_x64.dasc" break; case BC_FUNCC: @@ -5634,31 +5642,31 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| lea RA, [RD+8*LUA_MINSTACK] //| cmp RA, L:RB->maxstack //| mov L:RB->top, RD - dasm_put(Dst, 15715, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top)); -#line 3878 "vm_x64.dasc" + dasm_put(Dst, 15735, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top)); +#line 3885 "vm_x64.dasc" if (op == BC_FUNCC) { //| mov CARG1, L:RB // Caveat: CARG1 may be RA. - dasm_put(Dst, 15761); -#line 3880 "vm_x64.dasc" + dasm_put(Dst, 15781); +#line 3887 "vm_x64.dasc" } else { //| mov CARG2, KBASE //| mov CARG1, L:RB // Caveat: CARG1 may be RA. - dasm_put(Dst, 15766); -#line 3883 "vm_x64.dasc" + dasm_put(Dst, 15786); +#line 3890 "vm_x64.dasc" } //| ja ->vm_growstack_c // Need to grow stack. //| set_vmstate C - dasm_put(Dst, 15775, DISPATCH_GL(vmstate), ~LJ_VMST_C); -#line 3886 "vm_x64.dasc" + dasm_put(Dst, 15795, DISPATCH_GL(vmstate), ~LJ_VMST_C); +#line 3893 "vm_x64.dasc" if (op == BC_FUNCC) { //| call KBASE // (lua_State *L) - dasm_put(Dst, 15785); -#line 3888 "vm_x64.dasc" + dasm_put(Dst, 15805); +#line 3895 "vm_x64.dasc" } else { //| // (lua_State *L, lua_CFunction f) //| call aword [DISPATCH+DISPATCH_GL(wrapf)] - dasm_put(Dst, 15790, DISPATCH_GL(wrapf)); -#line 3891 "vm_x64.dasc" + dasm_put(Dst, 15810, DISPATCH_GL(wrapf)); +#line 3898 "vm_x64.dasc" } //| // nresults returned in eax (RD). //| mov BASE, L:RB->base @@ -5669,8 +5677,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) //| add RA, L:RB->top // RA = (L->top-(L->base+nresults))*8 //| mov PC, [BASE-8] // Fetch PC of caller. //| jmp ->vm_returnc - dasm_put(Dst, 15796, Dt1(->base), DISPATCH_GL(cur_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->top)); -#line 3901 "vm_x64.dasc" + dasm_put(Dst, 15816, Dt1(->base), DISPATCH_GL(cur_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->top)); +#line 3908 "vm_x64.dasc" break; /* ---------------------------------------------------------------------- */ @@ -5688,8 +5696,8 @@ static int build_backend(BuildCtx *ctx) dasm_growpc(Dst, BC__MAX); build_subroutines(ctx); //|.code_op - dasm_put(Dst, 15831); -#line 3918 "vm_x64.dasc" + dasm_put(Dst, 15851); +#line 3925 "vm_x64.dasc" for (op = 0; op < BC__MAX; op++) build_ins(ctx, (BCOp)op, op); return BC__MAX; diff --git a/src/reusevm/lj_vm.S b/src/reusevm/lj_vm.S index 90961b3995..bb3be1c1c4 100644 --- a/src/reusevm/lj_vm.S +++ b/src/reusevm/lj_vm.S @@ -299,7 +299,7 @@ lj_BC_DIVVN: lj_BC_MODVN: .byte 15,182,236,15,182,192,76,139,28,234,73,193,251,47,65,131 .byte 251,242,15,131,168,28,0,0,242,15,16,4,234,242,65,15 - .byte 16,12,199,232,200,54,0,0,242,15,17,4,202,139,3,15 + .byte 16,12,199,232,234,54,0,0,242,15,17,4,202,139,3,15 .byte 182,204,15,182,232,72,131,195,4,193,232,16,65,255,36,238 .globl lj_BC_ADDNV @@ -502,7 +502,7 @@ lj_BC_USETV: .byte 232,72,131,195,4,193,232,16,65,255,36,238,72,137,200,72 .byte 193,248,47,131,232,252,131,248,246,118,222,72,193,225,17,72 .byte 193,233,17,246,65,8,3,116,208,72,137,238,72,137,213,73 - .byte 141,190,200,240,255,255 + .byte 141,190,192,240,255,255 call lj_gc_barrieruv .byte 72,137,234,235,185 @@ -516,7 +516,7 @@ lj_BC_USETS: .byte 0,0,0,128,253,255,73,9,203,76,137,24,246,69,8,4 .byte 117,19,139,3,15,182,204,15,182,232,72,131,195,4,193,232 .byte 16,65,255,36,238,246,65,8,3,116,231,128,125,10,0,116 - .byte 225,72,137,213,72,137,198,73,141,190,200,240,255,255 + .byte 225,72,137,213,72,137,198,73,141,190,192,240,255,255 call lj_gc_barrieruv .byte 72,137,234,235,202 @@ -569,8 +569,8 @@ lj_BC_FNEW: .type lj_BC_TNEW, @function .size lj_BC_TNEW, 122 lj_BC_TNEW: - .byte 72,139,108,36,16,72,137,85,32,73,139,142,232,240,255,255 - .byte 73,59,142,240,240,255,255,72,137,92,36,24,115,78,137,194 + .byte 72,139,108,36,16,72,137,85,32,73,139,142,224,240,255,255 + .byte 73,59,142,232,240,255,255,72,137,92,36,24,115,78,137,194 .byte 37,255,7,0,0,193,234,11,61,255,7,0,0,116,54,72 .byte 137,239,137,198 call lj_tab_new @@ -586,8 +586,8 @@ lj_BC_TNEW: .type lj_BC_TDUP, @function .size lj_BC_TDUP, 106 lj_BC_TDUP: - .byte 72,247,208,72,139,108,36,16,73,139,142,232,240,255,255,72 - .byte 137,92,36,24,73,59,142,240,240,255,255,72,137,85,32,115 + .byte 72,247,208,72,139,108,36,16,73,139,142,224,240,255,255,72 + .byte 137,92,36,24,73,59,142,232,240,255,255,72,137,85,32,115 .byte 56,73,139,52,199,72,137,239 call lj_tab_dup .byte 72,139,85,32,15,182,75,253,73,187,0,0,0,0,0,0 @@ -685,7 +685,7 @@ lj_BC_TSETV: .byte 238,76,139,85,32,77,133,210,116,215,65,246,66,10,2,15 .byte 132,73,17,0,0,235,202,65,131,251,251,15,133,61,17,0 .byte 0,72,193,224,17,72,193,232,17,235,66,128,101,8,251,77 - .byte 139,150,24,241,255,255,73,137,174,24,241,255,255,76,137,85 + .byte 139,150,16,241,255,255,73,137,174,16,241,255,255,76,137,85 .byte 24,235,164 .globl lj_BC_TSETS @@ -708,8 +708,8 @@ lj_BC_TSETS: .byte 137,238,72,137,92,36,24 call lj_tab_newkey .byte 72,139,124,36,16,72,139,87,32,73,137,194,15,182,75,253 - .byte 233,118,255,255,255,128,101,8,251,77,139,158,24,241,255,255 - .byte 73,137,174,24,241,255,255,76,137,93,24,233,101,255,255,255 + .byte 233,118,255,255,255,128,101,8,251,77,139,158,16,241,255,255 + .byte 73,137,174,16,241,255,255,76,137,93,24,233,101,255,255,255 .globl lj_BC_TSETB .hidden lj_BC_TSETB @@ -723,7 +723,7 @@ lj_BC_TSETB: .byte 139,28,202,76,137,24,139,3,15,182,204,15,182,232,72,131 .byte 195,4,193,232,16,65,255,36,238,76,139,85,32,77,133,210 .byte 116,215,65,246,66,10,2,15,132,159,15,0,0,235,202,128 - .byte 101,8,251,77,139,150,24,241,255,255,73,137,174,24,241,255 + .byte 101,8,251,77,139,150,16,241,255,255,73,137,174,16,241,255 .byte 255,76,137,85,24,235,184 .globl lj_BC_TSETM @@ -741,7 +741,7 @@ lj_BC_TSETM: .byte 24 call lj_tab_reasize .byte 72,139,85,32,15,182,75,253,15,183,67,254,233,121,255,255 - .byte 255,128,101,8,251,73,139,134,24,241,255,255,73,137,174,24 + .byte 255,128,101,8,251,73,139,134,16,241,255,255,73,137,174,16 .byte 241,255,255,72,137,69,24,233,120,255,255,255 .globl lj_BC_TSETR @@ -753,8 +753,8 @@ lj_BC_TSETR: .byte 237,17,242,15,44,4,194,246,69,8,4,117,42,59,69,48 .byte 15,131,84,15,0,0,193,224,3,72,3,69,16,76,139,28 .byte 202,76,137,24,139,3,15,182,204,15,182,232,72,131,195,4 - .byte 193,232,16,65,255,36,238,128,101,8,251,77,139,150,24,241 - .byte 255,255,73,137,174,24,241,255,255,76,137,85,24,235,190 + .byte 193,232,16,65,255,36,238,128,101,8,251,77,139,150,16,241 + .byte 255,255,73,137,174,16,241,255,255,76,137,85,24,235,190 .globl lj_BC_CALLM .hidden lj_BC_CALLM @@ -1097,9 +1097,9 @@ lj_BC_FUNCC: .byte 72,139,106,240,72,193,229,17,72,193,237,17,76,139,125,40 .byte 72,139,108,36,16,72,141,68,194,248,72,137,85,32,72,141 .byte 136,160,0,0,0,72,59,77,48,72,137,69,40,72,137,239 - .byte 15,135,31,2,0,0,65,199,134,72,241,255,255,254,255,255 + .byte 15,135,31,2,0,0,65,199,134,64,241,255,255,254,255,255 .byte 255,65,255,215,72,139,85,32,73,137,174,32,242,255,255,65 - .byte 199,134,72,241,255,255,255,255,255,255,72,141,12,194,72,247 + .byte 199,134,64,241,255,255,255,255,255,255,72,141,12,194,72,247 .byte 217,72,3,77,40,72,139,90,248,233,156,0,0,0 .globl lj_BC_FUNCCW @@ -1110,9 +1110,9 @@ lj_BC_FUNCCW: .byte 72,139,106,240,72,193,229,17,72,193,237,17,76,139,125,40 .byte 72,139,108,36,16,72,141,68,194,248,72,137,85,32,72,141 .byte 136,160,0,0,0,72,59,77,48,72,137,69,40,76,137,254 - .byte 72,137,239,15,135,174,1,0,0,65,199,134,72,241,255,255 + .byte 72,137,239,15,135,174,1,0,0,65,199,134,64,241,255,255 .byte 254,255,255,255,65,255,150,8,242,255,255,72,139,85,32,73 - .byte 137,174,32,242,255,255,65,199,134,72,241,255,255,255,255,255 + .byte 137,174,32,242,255,255,65,199,134,64,241,255,255,255,255,255 .byte 255,72,141,12,194,72,247,217,72,3,77,40,72,139,90,248 .byte 235,42 @@ -1138,7 +1138,7 @@ lj_vm_returnc: .type lj_vm_return, @function .size lj_vm_return, 83 lj_vm_return: - .byte 72,131,243,1,247,195,3,0,0,0,117,177,65,199,134,72 + .byte 72,131,243,1,247,195,3,0,0,0,117,177,65,199,134,64 .byte 241,255,255,254,255,255,255,72,131,227,248,72,41,211,72,247 .byte 219,131,232,1,116,17,72,139,44,10,72,137,106,240,72,131 .byte 194,8,131,232,1,117,239,72,139,108,36,16,72,137,93,32 @@ -1209,9 +1209,9 @@ lj_vm_unwind_ff: .size lj_vm_unwind_ff_eh, 73 lj_vm_unwind_ff_eh: .byte 72,139,108,36,16,184,2,0,0,0,72,139,85,32,76,139 - .byte 117,16,73,129,198,56,15,0,0,72,139,90,248,72,185,255 + .byte 117,16,73,129,198,64,15,0,0,72,139,90,248,72,185,255 .byte 255,255,255,255,127,255,255,72,139,42,72,137,74,240,72,137 - .byte 106,248,72,199,193,240,255,255,255,65,199,134,72,241,255,255 + .byte 106,248,72,199,193,240,255,255,255,65,199,134,64,241,255,255 .byte 255,255,255,255,233,181,254,255,255 .globl lj_vm_growstack_c @@ -1248,10 +1248,10 @@ lj_vm_growstack_f: lj_vm_resume: .byte 85,83,65,87,65,86,65,85,65,84,72,131,236,40,72,137 .byte 253,72,137,124,36,16,72,137,241,187,5,0,0,0,49,192 - .byte 76,141,124,36,1,76,139,117,16,73,129,198,56,15,0,0 + .byte 76,141,124,36,1,76,139,117,16,73,129,198,64,15,0,0 .byte 72,137,68,36,24,72,137,68,36,32,137,68,36,8,137,68 .byte 36,12,76,137,125,80,56,69,11,15,132,153,0,0,0,73 - .byte 137,174,32,242,255,255,65,199,134,72,241,255,255,255,255,255 + .byte 137,174,32,242,255,255,65,199,134,64,241,255,255,255,255,255 .byte 255,136,69,11,72,139,85,32,72,139,69,40,72,41,200,193 .byte 232,3,131,192,1,72,41,209,72,139,90,248,137,4,36,247 .byte 195,3,0,0,0,15,132,205,247,255,255,233,219,253,255,255 @@ -1272,8 +1272,8 @@ lj_vm_call: .byte 85,83,65,87,65,86,65,85,65,84,72,131,236,40,187,1 .byte 0,0,0,137,84,36,8,72,137,253,72,137,124,36,16,72 .byte 137,241,76,139,117,16,76,139,125,80,76,137,124,36,32,72 - .byte 137,108,36,24,73,129,198,56,15,0,0,72,137,101,80,73 - .byte 137,174,32,242,255,255,65,199,134,72,241,255,255,255,255,255 + .byte 137,108,36,24,73,129,198,64,15,0,0,72,137,101,80,73 + .byte 137,174,32,242,255,255,65,199,134,64,241,255,255,255,255,255 .byte 255,72,139,85,32,72,1,203,72,41,211,72,139,69,40,72 .byte 41,200,193,232,3,131,192,1 @@ -1301,7 +1301,7 @@ lj_vm_cpcall: .byte 85,83,65,87,65,86,65,85,65,84,72,131,236,40,72,137 .byte 253,72,137,124,36,16,72,137,108,36,24,76,139,125,56,76 .byte 43,125,40,76,139,117,16,199,68,36,12,0,0,0,0,68 - .byte 137,124,36,8,73,129,198,56,15,0,0,76,139,125,80,76 + .byte 137,124,36,8,73,129,198,64,15,0,0,76,139,125,80,76 .byte 137,124,36,32,72,137,101,80,73,137,174,32,242,255,255,255 .byte 209,72,133,192,15,132,27,253,255,255,72,137,193,187,5,0 .byte 0,0,233,56,255,255,255 @@ -1314,8 +1314,8 @@ lj_cont_dispatch: .byte 72,1,209,72,131,227,248,72,137,213,72,41,218,72,199,68 .byte 193,248,255,255,255,255,72,137,200,72,139,93,232,72,139,77 .byte 224,72,131,249,1,118,22,76,139,122,240,73,193,231,17,73 - .byte 193,239,17,77,139,127,32,77,139,127,184,255,225,15,132,244 - .byte 30,0,0,72,41,213,193,237,3,141,69,253,233,84,24,0 + .byte 193,239,17,77,139,127,32,77,139,127,184,255,225,15,132,22 + .byte 31,0,0,72,41,213,193,237,3,141,69,253,233,84,24,0 .byte 0 .globl lj_cont_cat @@ -1640,8 +1640,8 @@ lj_ff_setmetatable: .byte 18,0,0,72,139,74,8,73,137,203,72,193,225,17,72,193 .byte 233,17,73,193,251,47,65,131,251,244,15,133,21,18,0,0 .byte 72,137,77,32,72,139,90,248,76,137,82,240,246,69,8,4 - .byte 116,22,128,101,8,251,73,139,134,24,241,255,255,73,137,174 - .byte 24,241,255,255,72,137,69,24,233,149,6,0,0 + .byte 116,22,128,101,8,251,73,139,134,16,241,255,255,73,137,174 + .byte 16,241,255,255,72,137,69,24,233,149,6,0,0 .globl lj_ff_rawget .hidden lj_ff_rawget @@ -1674,7 +1674,7 @@ lj_ff_tostring: .byte 73,137,235,73,193,251,47,65,131,251,251,117,9,72,137,106 .byte 240,233,252,5,0,0,65,131,251,242,15,135,64,17,0,0 .byte 73,131,190,80,243,255,255,0,15,133,55,17,0,0,73,139 - .byte 174,232,240,255,255,73,59,174,240,240,255,255,114,5,232,217 + .byte 174,224,240,255,255,73,59,174,232,240,255,255,114,5,232,217 .byte 17,0,0,72,139,108,36,16,72,137,85,32,72,137,92,36 .byte 24,72,137,214,72,137,239 call lj_strfmt_num @@ -1791,7 +1791,7 @@ lj_ff_coroutine_resume: .byte 203,116,17,72,139,4,43,72,137,67,248,72,131,235,8,72 .byte 57,203,117,239,72,137,206,72,139,60,36,232,12,244,255,255 .byte 72,139,108,36,16,72,139,28,36,72,139,85,32,73,137,174 - .byte 32,242,255,255,65,199,134,72,241,255,255,255,255,255,255,131 + .byte 32,242,255,255,65,199,134,64,241,255,255,255,255,255,255,131 .byte 248,1,119,104,72,139,75,32,76,139,123,40,72,137,75,40 .byte 76,137,251,72,41,203,116,35,72,141,4,26,193,235,3,72 .byte 59,69,48,119,110,72,137,213,72,41,205,72,139,1,72,137 @@ -1822,7 +1822,7 @@ lj_ff_coroutine_wrap_aux: .byte 116,17,72,139,4,43,72,137,67,248,72,131,235,8,72,57 .byte 203,117,239,72,137,206,72,139,60,36,232,154,242,255,255,72 .byte 139,108,36,16,72,139,28,36,72,139,85,32,73,137,174,32 - .byte 242,255,255,65,199,134,72,241,255,255,255,255,255,255,131,248 + .byte 242,255,255,65,199,134,64,241,255,255,255,255,255,255,131,248 .byte 1,119,85,72,139,75,32,76,139,123,40,72,137,75,40,76 .byte 137,251,72,41,203,116,35,72,141,4,26,193,235,3,72,59 .byte 69,48,119,63,72,137,213,72,41,205,72,139,1,72,137,4 @@ -1898,7 +1898,7 @@ lj_fff_res_: .size lj_ff_math_floor, 28 lj_ff_math_floor: .byte 76,139,26,73,193,251,47,65,131,251,242,15,131,243,10,0 - .byte 0,242,15,16,2,232,40,15,0,0,235,140 + .byte 0,242,15,16,2,232,74,15,0,0,235,140 .globl lj_ff_math_ceil .hidden lj_ff_math_ceil @@ -1906,7 +1906,7 @@ lj_ff_math_floor: .size lj_ff_math_ceil, 31 lj_ff_math_ceil: .byte 76,139,26,73,193,251,47,65,131,251,242,15,131,215,10,0 - .byte 0,242,15,16,2,232,103,15,0,0,233,109,255,255,255 + .byte 0,242,15,16,2,232,137,15,0,0,233,109,255,255,255 .globl lj_ff_math_log .hidden lj_ff_math_log @@ -2149,7 +2149,7 @@ lj_ff_string_byte: .type lj_ff_string_char, @function .size lj_ff_string_char, 76 lj_ff_string_char: - .byte 73,139,174,232,240,255,255,73,59,174,240,240,255,255,114,5 + .byte 73,139,174,224,240,255,255,73,59,174,232,240,255,255,114,5 .byte 232,223,6,0,0,131,248,2,15,133,31,6,0,0,76,139 .byte 26,73,193,251,47,65,131,251,242,15,131,14,6,0,0,242 .byte 15,44,42,129,253,255,0,0,0,15,135,254,5,0,0,137 @@ -2177,7 +2177,7 @@ lj_fff_resstr: .type lj_ff_string_sub, @function .size lj_ff_string_sub, 174 lj_ff_string_sub: - .byte 73,139,174,232,240,255,255,73,59,174,240,240,255,255,114,5 + .byte 73,139,174,224,240,255,255,73,59,174,232,240,255,255,114,5 .byte 232,89,6,0,0,65,186,255,255,255,255,131,248,3,15,130 .byte 147,5,0,0,118,24,76,139,90,16,73,193,251,47,65,131 .byte 251,242,15,131,127,5,0,0,242,68,15,44,82,16,72,139 @@ -2201,8 +2201,8 @@ lj_fff_emptystr: .type lj_ff_string_reverse, @function .size lj_ff_string_reverse, 108 lj_ff_string_reverse: - .byte 131,248,2,15,130,251,4,0,0,73,139,174,232,240,255,255 - .byte 73,59,174,240,240,255,255,114,5,232,157,5,0,0,72,139 + .byte 131,248,2,15,130,251,4,0,0,73,139,174,224,240,255,255 + .byte 73,59,174,232,240,255,255,114,5,232,157,5,0,0,72,139 .byte 50,73,137,243,72,193,230,17,72,193,238,17,73,193,251,47 .byte 65,131,251,251,15,133,202,4,0,0,72,139,108,36,16,73 .byte 141,190,80,241,255,255,72,137,85,32,72,139,71,16,72,137 @@ -2217,8 +2217,8 @@ lj_ff_string_reverse: .type lj_ff_string_lower, @function .size lj_ff_string_lower, 108 lj_ff_string_lower: - .byte 131,248,2,15,130,143,4,0,0,73,139,174,232,240,255,255 - .byte 73,59,174,240,240,255,255,114,5,232,49,5,0,0,72,139 + .byte 131,248,2,15,130,143,4,0,0,73,139,174,224,240,255,255 + .byte 73,59,174,232,240,255,255,114,5,232,49,5,0,0,72,139 .byte 50,73,137,243,72,193,230,17,72,193,238,17,73,193,251,47 .byte 65,131,251,251,15,133,94,4,0,0,72,139,108,36,16,73 .byte 141,190,80,241,255,255,72,137,85,32,72,139,71,16,72,137 @@ -2233,8 +2233,8 @@ lj_ff_string_lower: .type lj_ff_string_upper, @function .size lj_ff_string_upper, 108 lj_ff_string_upper: - .byte 131,248,2,15,130,35,4,0,0,73,139,174,232,240,255,255 - .byte 73,59,174,240,240,255,255,114,5,232,197,4,0,0,72,139 + .byte 131,248,2,15,130,35,4,0,0,73,139,174,224,240,255,255 + .byte 73,59,174,232,240,255,255,114,5,232,197,4,0,0,72,139 .byte 50,73,137,243,72,193,230,17,72,193,238,17,73,193,251,47 .byte 65,131,251,251,15,133,242,3,0,0,72,139,108,36,16,73 .byte 141,190,80,241,255,255,72,137,85,32,72,139,71,16,72,137 @@ -2524,41 +2524,43 @@ lj_cont_stitch: .globl lj_vm_exit_handler .hidden lj_vm_exit_handler .type lj_vm_exit_handler, @function - .size lj_vm_exit_handler, 244 + .size lj_vm_exit_handler, 251 lj_vm_exit_handler: .byte 65,85,65,84,65,83,65,82,65,81,65,80,87,86,85,72 .byte 141,108,36,88,85,83,82,81,80,15,182,69,248,138,101,240 - .byte 76,137,125,248,76,137,117,240,65,139,142,72,241,255,255,65 - .byte 199,134,72,241,255,255,252,255,255,255,65,137,134,60,255,255 - .byte 255,65,137,142,56,255,255,255,72,129,236,128,0,0,0,72 - .byte 131,197,128,242,68,15,17,125,248,242,68,15,17,117,240,242 - .byte 68,15,17,109,232,242,68,15,17,101,224,242,68,15,17,93 - .byte 216,242,68,15,17,85,208,242,68,15,17,77,200,242,68,15 - .byte 17,69,192,242,15,17,125,184,242,15,17,117,176,242,15,17 - .byte 109,168,242,15,17,101,160,242,15,17,93,152,242,15,17,85 - .byte 144,242,15,17,77,136,242,15,17,69,128,73,139,174,32,242 - .byte 255,255,73,139,150,40,242,255,255,73,137,174,232,243,255,255 - .byte 72,137,85,32,72,137,230,73,141,190,104,243,255,255,73,199 - .byte 134,40,242,255,255,0,0,0,0 + .byte 76,137,125,248,76,137,117,240,65,139,142,64,241,255,255,65 + .byte 199,134,64,241,255,255,252,255,255,255,65,137,134,60,255,255 + .byte 255,65,137,142,56,255,255,255,65,137,142,72,241,255,255,72 + .byte 129,236,128,0,0,0,72,131,197,128,242,68,15,17,125,248 + .byte 242,68,15,17,117,240,242,68,15,17,109,232,242,68,15,17 + .byte 101,224,242,68,15,17,93,216,242,68,15,17,85,208,242,68 + .byte 15,17,77,200,242,68,15,17,69,192,242,15,17,125,184,242 + .byte 15,17,117,176,242,15,17,109,168,242,15,17,101,160,242,15 + .byte 17,93,152,242,15,17,85,144,242,15,17,77,136,242,15,17 + .byte 69,128,73,139,174,32,242,255,255,73,139,150,40,242,255,255 + .byte 73,137,174,232,243,255,255,72,137,85,32,72,137,230,73,141 + .byte 190,104,243,255,255,73,199,134,40,242,255,255,0,0,0,0 call lj_trace_exit .byte 72,139,77,80,72,131,225,252,72,137,105,16,72,139,85,32 - .byte 72,139,89,24,235,5 + .byte 72,139,89,24,235,25 .globl lj_vm_exit_interp .hidden lj_vm_exit_interp .type lj_vm_exit_interp, @function - .size lj_vm_exit_interp, 164 + .size lj_vm_exit_interp, 191 lj_vm_exit_interp: - .byte 72,141,76,36,16,76,139,105,248,76,139,33,72,137,204,133 - .byte 192,15,136,127,0,0,0,72,139,108,36,16,137,4,36,76 - .byte 139,122,240,73,193,231,17,73,193,239,17,77,139,127,32,77 - .byte 139,127,184,72,137,85,32,73,199,134,40,242,255,255,0,0 - .byte 0,0,65,199,134,72,241,255,255,255,255,255,255,139,3,15 - .byte 182,204,15,182,232,72,131,195,4,193,232,16,131,253,89,114 - .byte 8,131,253,97,115,7,139,4,36,65,255,36,238,72,139,66 - .byte 248,169,3,0,0,0,117,238,15,182,64,253,72,247,216,76 - .byte 139,124,194,224,73,193,231,17,73,193,239,17,77,139,127,32 - .byte 77,139,127,184,235,208,72,247,216,72,137,239,72,137,198 + .byte 72,141,76,36,16,69,139,150,64,241,255,255,65,131,250,1 + .byte 114,7,69,137,150,72,241,255,255,76,139,105,248,76,139,33 + .byte 72,137,204,133,192,15,136,134,0,0,0,72,139,108,36,16 + .byte 137,4,36,76,139,122,240,73,193,231,17,73,193,239,17,77 + .byte 139,127,32,77,139,127,184,72,137,85,32,73,199,134,40,242 + .byte 255,255,0,0,0,0,69,139,150,64,241,255,255,65,199,134 + .byte 64,241,255,255,255,255,255,255,139,3,15,182,204,15,182,232 + .byte 72,131,195,4,193,232,16,131,253,89,114,8,131,253,97,115 + .byte 7,139,4,36,65,255,36,238,72,139,66,248,169,3,0,0 + .byte 0,117,238,15,182,64,253,72,247,216,76,139,124,194,224,73 + .byte 193,231,17,73,193,239,17,77,139,127,32,77,139,127,184,235 + .byte 208,72,247,216,72,137,239,72,137,198 call lj_err_throw .globl lj_vm_floor_sse @@ -2663,7 +2665,7 @@ lj_assert_bad_for_arg_type: .size lj_vm_ffi_callback, 202 lj_vm_ffi_callback: .byte 83,65,87,65,86,65,85,65,84,72,131,236,40,76,141,181 - .byte 56,15,0,0,72,139,157,104,1,0,0,15,183,192,137,131 + .byte 64,15,0,0,72,139,157,112,1,0,0,15,183,192,137,131 .byte 208,0,0,0,72,137,123,112,72,137,115,120,72,137,147,128 .byte 0,0,0,72,137,139,136,0,0,0,242,15,17,67,48,242 .byte 15,17,75,56,242,15,17,83,64,242,15,17,91,72,72,141 @@ -2672,7 +2674,7 @@ lj_vm_ffi_callback: .byte 242,15,17,123,104,72,137,131,176,0,0,0,72,137,230,72 .byte 137,92,36,24,72,137,223 call lj_ccallback_enter - .byte 65,199,134,72,241,255,255,255,255,255,255,72,139,80,32,72 + .byte 65,199,134,64,241,255,255,255,255,255,255,72,139,80,32,72 .byte 139,64,40,72,41,208,72,139,106,240,72,193,229,17,72,193 .byte 237,17,72,193,232,3,72,131,192,1,72,139,93,32,139,11 .byte 15,182,233,15,182,205,72,131,195,4,65,255,36,238 @@ -2685,7 +2687,7 @@ lj_cont_ffi_callback: .byte 72,139,76,36,16,73,139,158,48,242,255,255,72,137,75,16 .byte 72,137,81,32,72,137,105,40,72,137,223,72,137,198 call lj_ccallback_leave - .byte 72,139,67,112,242,15,16,67,48,233,177,221,255,255 + .byte 72,139,67,112,242,15,16,67,48,233,143,221,255,255 .globl lj_vm_ffi_call .hidden lj_vm_ffi_call @@ -2729,7 +2731,7 @@ lj_vm_ffi_call: .LASFDE0: .long .Lframe0 .quad .Lbegin - .quad 16401 + .quad 16435 .byte 0xe .uleb128 96 .byte 0x86