diff options
Diffstat (limited to 'src/vm_x86.dasc')
-rw-r--r-- | src/vm_x86.dasc | 63 |
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. |