aboutsummaryrefslogtreecommitdiff
path: root/src/vm_x86.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm_x86.dasc')
-rw-r--r--src/vm_x86.dasc63
1 files changed, 62 insertions, 1 deletions
diff --git a/src/vm_x86.dasc b/src/vm_x86.dasc
index 8ed6efd1..c2f03d80 100644
--- a/src/vm_x86.dasc
+++ b/src/vm_x86.dasc
@@ -2659,6 +2659,67 @@ static void build_subroutines(BuildCtx *ctx)
2659 | add NARGS:RD, 1 2659 | add NARGS:RD, 1
2660 | jmp RBa 2660 | jmp RBa
2661 | 2661 |
2662 |->cont_stitch: // Trace stitching.
2663 |.if JIT
2664 | // BASE = base, RC = result, RB = mbase
2665 | mov RA, [RB-24] // Save previous trace number.
2666 | mov TMP1, RA
2667 | mov TMP3, DISPATCH // Need one more register.
2668 | mov DISPATCH, MULTRES
2669 | movzx RA, PC_RA
2670 | lea RA, [BASE+RA*8] // Call base.
2671 | sub DISPATCH, 1
2672 | jz >2
2673 |1: // Move results down.
2674 |.if X64
2675 | mov RBa, [RC]
2676 | mov [RA], RBa
2677 |.else
2678 | mov RB, [RC]
2679 | mov [RA], RB
2680 | mov RB, [RC+4]
2681 | mov [RA+4], RB
2682 |.endif
2683 | add RC, 8
2684 | add RA, 8
2685 | sub DISPATCH, 1
2686 | jnz <1
2687 |2:
2688 | movzx RC, PC_RA
2689 | movzx RB, PC_RB
2690 | add RC, RB
2691 | lea RC, [BASE+RC*8-8]
2692 |3:
2693 | cmp RC, RA
2694 | ja >9 // More results wanted?
2695 |
2696 | mov DISPATCH, TMP3
2697 | mov RB, TMP1 // Get previous trace number.
2698 | mov RA, [DISPATCH+DISPATCH_J(trace)]
2699 | mov TRACE:RD, [RA+RB*4]
2700 | movzx RD, word TRACE:RD->link
2701 | cmp RD, RB
2702 | je ->cont_nop // Blacklisted.
2703 | test RD, RD
2704 | jne =>BC_JLOOP // Jump to stitched trace.
2705 |
2706 | // Stitch a new trace to the previous trace.
2707 | mov [DISPATCH+DISPATCH_J(exitno)], RB
2708 | mov L:RB, SAVE_L
2709 | mov L:RB->base, BASE
2710 | mov FCARG2, PC
2711 | lea FCARG1, [DISPATCH+GG_DISP2J]
2712 | mov aword [DISPATCH+DISPATCH_J(L)], L:RBa
2713 | call extern lj_dispatch_stitch@8 // (jit_State *J, const BCIns *pc)
2714 | mov BASE, L:RB->base
2715 | jmp ->cont_nop
2716 |
2717 |9: // Fill up results with nil.
2718 | mov dword [RA+4], LJ_TNIL
2719 | add RA, 8
2720 | jmp <3
2721 |.endif
2722 |
2662 |->vm_profhook: // Dispatch target for profiler hook. 2723 |->vm_profhook: // Dispatch target for profiler hook.
2663#if LJ_HASPROFILE 2724#if LJ_HASPROFILE
2664 | mov L:RB, SAVE_L 2725 | mov L:RB, SAVE_L
@@ -5382,7 +5443,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
5382 | ins_A // RA = base, RD = target (loop extent) 5443 | ins_A // RA = base, RD = target (loop extent)
5383 | // Note: RA/RD is only used by trace recorder to determine scope/extent 5444 | // Note: RA/RD is only used by trace recorder to determine scope/extent
5384 | // This opcode does NOT jump, it's only purpose is to detect a hot loop. 5445 | // This opcode does NOT jump, it's only purpose is to detect a hot loop.
5385 |.if JIT 5446 |.if JIT
5386 | hotloop RB 5447 | hotloop RB
5387 |.endif 5448 |.endif
5388 | // Fall through. Assumes BC_ILOOP follows and ins_A is a no-op. 5449 | // Fall through. Assumes BC_ILOOP follows and ins_A is a no-op.