summaryrefslogtreecommitdiff
path: root/src/buildvm_x86.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildvm_x86.dasc')
-rw-r--r--src/buildvm_x86.dasc20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc
index 4d3b081c..e0a70daa 100644
--- a/src/buildvm_x86.dasc
+++ b/src/buildvm_x86.dasc
@@ -2668,16 +2668,30 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
2668 | mov r13, TMPa 2668 | mov r13, TMPa
2669 | mov r12, TMPQ 2669 | mov r12, TMPQ
2670 |.endif 2670 |.endif
2671 | test RD, RD; js >2 // Check for error from exit. 2671 | test RD, RD; js >3 // Check for error from exit.
2672 | mov MULTRES, RD 2672 | mov MULTRES, RD
2673 | mov LFUNC:KBASE, [BASE-8] 2673 | mov LFUNC:KBASE, [BASE-8]
2674 | mov KBASE, LFUNC:KBASE->pc 2674 | mov KBASE, LFUNC:KBASE->pc
2675 | mov KBASE, [KBASE+PC2PROTO(k)] 2675 | mov KBASE, [KBASE+PC2PROTO(k)]
2676 | mov dword [DISPATCH+DISPATCH_GL(jit_L)], 0 2676 | mov dword [DISPATCH+DISPATCH_GL(jit_L)], 0
2677 | set_vmstate INTERP 2677 | set_vmstate INTERP
2678 | ins_next 2678 | // Modified copy of ins_next which handles function header dispatch, too.
2679 | mov RC, [PC]
2680 | movzx RA, RCH
2681 | movzx OP, RCL
2682 | add PC, 4
2683 | shr RC, 16
2684 | cmp OP, BC_FUNCF // Function header?
2685 | jb >2
2686 | mov RC, MULTRES // RC/RD holds nres+1.
2687 |2:
2688 |.if X64
2689 | jmp aword [DISPATCH+OP*8]
2690 |.else
2691 | jmp aword [DISPATCH+OP*4]
2692 |.endif
2679 | 2693 |
2680 |2: // Rethrow error from the right C frame. 2694 |3: // Rethrow error from the right C frame.
2681 | neg RD 2695 | neg RD
2682 | mov FCARG1, L:RB 2696 | mov FCARG1, L:RB
2683 | mov FCARG2, RD 2697 | mov FCARG2, RD