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