x64/LJ_GC64: Fix JIT glue code in interpreter.

Thanks to Peter Cawley.
This commit is contained in:
Mike Pall 2016-03-28 22:31:18 +02:00
parent d7145616ae
commit c24c8e5312

View File

@ -2325,7 +2325,8 @@ static void build_subroutines(BuildCtx *ctx)
|->cont_stitch: // Trace stitching.
|.if JIT
| // BASE = base, RC = result, RB = mbase
| mov ITYPEd, [RB-24] // Save previous trace number.
| mov TRACE:ITYPE, [RB-40] // Save previous trace.
| cleartp TRACE:ITYPE
| mov TMPRd, MULTRES
| movzx RAd, PC_RA
| lea RA, [BASE+RA*8] // Call base.
@ -2347,11 +2348,10 @@ static void build_subroutines(BuildCtx *ctx)
| cmp RC, RA
| ja >9 // More results wanted?
|
| mov RA, [DISPATCH+DISPATCH_J(trace)]
| mov TRACE:RD, [RA+ITYPE*8]
| test TRACE:RD, TRACE:RD
| test TRACE:ITYPE, TRACE:ITYPE
| jz ->cont_nop
| movzx RDd, word TRACE:RD->link
| movzx RBd, word TRACE:ITYPE->traceno
| movzx RDd, word TRACE:ITYPE->link
| cmp RDd, RBd
| je ->cont_nop // Blacklisted.
| test RDd, RDd
@ -2404,10 +2404,10 @@ static void build_subroutines(BuildCtx *ctx)
| mov [rbp-8], r15; mov [rbp-16], r14
| // Caveat: DISPATCH is rbx.
| mov DISPATCH, [ebp]
| mov RA, [DISPATCH+DISPATCH_GL(vmstate)] // Get trace number.
| mov RAd, [DISPATCH+DISPATCH_GL(vmstate)] // Get trace number.
| set_vmstate EXIT
| mov [DISPATCH+DISPATCH_J(exitno)], RC
| mov [DISPATCH+DISPATCH_J(parent)], RA
| mov [DISPATCH+DISPATCH_J(exitno)], RCd
| mov [DISPATCH+DISPATCH_J(parent)], RAd
|.if X64WIN
| sub rsp, 16*8+4*8 // Room for SSE regs + save area.
|.else
@ -2433,7 +2433,7 @@ static void build_subroutines(BuildCtx *ctx)
| mov CARG2, rsp
|.endif
| lea CARG1, [DISPATCH+GG_DISP2J]
| mov dword [DISPATCH+DISPATCH_GL(jit_base)], 0
| mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0
| call extern lj_trace_exit // (jit_State *J, ExitState *ex)
| // MULTRES or negated error code returned in eax (RD).
| mov RA, L:RB->cframe
@ -2480,7 +2480,7 @@ static void build_subroutines(BuildCtx *ctx)
| mov KBASE, LFUNC:KBASE->pc
| mov KBASE, [KBASE+PC2PROTO(k)]
| mov L:RB->base, BASE
| mov dword [DISPATCH+DISPATCH_GL(jit_base)], 0
| mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0
| set_vmstate INTERP
| // Modified copy of ins_next which handles function header dispatch, too.
| mov RCd, [PC]
@ -2504,7 +2504,7 @@ static void build_subroutines(BuildCtx *ctx)
| // Otherwise set KBASE for Lua function below fast function.
| movzx RCd, byte [RC-3]
| neg RC
| mov LFUNC:KBASE, [BASE+RC*8-24]
| mov LFUNC:KBASE, [BASE+RC*8-32]
| cleartp LFUNC:KBASE
| mov KBASE, LFUNC:KBASE->pc
| mov KBASE, [KBASE+PC2PROTO(k)]
@ -4050,7 +4050,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
| mov RC, [RA-24] // Copy control var. fb[1] = fb[-3].
| mov [RA], RB
| mov [RA+8], RC
| mov LFUNC:RB, [RA-40] // Copy callable. fb[-1] = fb[-5]
| mov LFUNC:RB, [RA-40] // Copy callable. fb[-2] = fb[-5]
| mov [RA-16], LFUNC:RB
| mov NARGS:RDd, 2+1 // Handle like a regular 2-arg call.
| checkfunc LFUNC:RB, ->vmeta_call