diff options
| author | Mike Pall <mike> | 2023-08-13 02:25:12 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2023-08-13 02:25:12 +0200 |
| commit | 119fd1fab0ebf235669456fbb57ee872fb05fc73 (patch) | |
| tree | 2445387dda68d8559bf3fc584e4889bc48230116 | |
| parent | 27af72e66f6a285298d1a9be370779aae945eb14 (diff) | |
| download | luajit-119fd1fab0ebf235669456fbb57ee872fb05fc73.tar.gz luajit-119fd1fab0ebf235669456fbb57ee872fb05fc73.tar.bz2 luajit-119fd1fab0ebf235669456fbb57ee872fb05fc73.zip | |
Ensure forward progress on trace exit to BC_ITERN.
Also use a safer way to force a static dispatch for BC_RET*.
Reported by Bartel Eerdekens. Analyzed by Peter Cawley. #1000 #1045
| -rw-r--r-- | src/lj_trace.c | 37 | ||||
| -rw-r--r-- | src/vm_arm.dasc | 17 | ||||
| -rw-r--r-- | src/vm_arm64.dasc | 21 | ||||
| -rw-r--r-- | src/vm_mips.dasc | 27 | ||||
| -rw-r--r-- | src/vm_mips64.dasc | 27 | ||||
| -rw-r--r-- | src/vm_ppc.dasc | 22 | ||||
| -rw-r--r-- | src/vm_x64.dasc | 13 | ||||
| -rw-r--r-- | src/vm_x86.dasc | 17 |
8 files changed, 146 insertions, 35 deletions
diff --git a/src/lj_trace.c b/src/lj_trace.c index 03c8d1d0..e019a79f 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c | |||
| @@ -431,6 +431,12 @@ static void trace_start(jit_State *J) | |||
| 431 | return; | 431 | return; |
| 432 | } | 432 | } |
| 433 | 433 | ||
| 434 | /* Ensuring forward progress for BC_ITERN can trigger hotcount again. */ | ||
| 435 | if (!J->parent && bc_op(*J->pc) == BC_JLOOP) { /* Already compiled. */ | ||
| 436 | J->state = LJ_TRACE_IDLE; /* Silently ignored. */ | ||
| 437 | return; | ||
| 438 | } | ||
| 439 | |||
| 434 | /* Get a new trace number. */ | 440 | /* Get a new trace number. */ |
| 435 | traceno = trace_findfree(J); | 441 | traceno = trace_findfree(J); |
| 436 | if (LJ_UNLIKELY(traceno == 0)) { /* No free trace? */ | 442 | if (LJ_UNLIKELY(traceno == 0)) { /* No free trace? */ |
| @@ -867,7 +873,7 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) | |||
| 867 | ExitDataCP exd; | 873 | ExitDataCP exd; |
| 868 | int errcode, exitcode = J->exitcode; | 874 | int errcode, exitcode = J->exitcode; |
| 869 | TValue exiterr; | 875 | TValue exiterr; |
| 870 | const BCIns *pc; | 876 | const BCIns *pc, *retpc; |
| 871 | void *cf; | 877 | void *cf; |
| 872 | GCtrace *T; | 878 | GCtrace *T; |
| 873 | 879 | ||
| @@ -919,22 +925,7 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) | |||
| 919 | } else { | 925 | } else { |
| 920 | trace_hotside(J, pc); | 926 | trace_hotside(J, pc); |
| 921 | } | 927 | } |
| 922 | if (bc_op(*pc) == BC_JLOOP) { | 928 | /* Return MULTRES or 0 or -17. */ |
| 923 | BCIns *retpc = &traceref(J, bc_d(*pc))->startins; | ||
| 924 | int isret = bc_isret(bc_op(*retpc)); | ||
| 925 | if (isret || bc_op(*retpc) == BC_ITERN) { | ||
| 926 | if (J->state == LJ_TRACE_RECORD) { | ||
| 927 | J->patchins = *pc; | ||
| 928 | J->patchpc = (BCIns *)pc; | ||
| 929 | *J->patchpc = *retpc; | ||
| 930 | J->bcskip = 1; | ||
| 931 | } else if (isret) { | ||
| 932 | pc = retpc; | ||
| 933 | setcframe_pc(cf, pc); | ||
| 934 | } | ||
| 935 | } | ||
| 936 | } | ||
| 937 | /* Return MULTRES or 0. */ | ||
| 938 | ERRNO_RESTORE | 929 | ERRNO_RESTORE |
| 939 | switch (bc_op(*pc)) { | 930 | switch (bc_op(*pc)) { |
| 940 | case BC_CALLM: case BC_CALLMT: | 931 | case BC_CALLM: case BC_CALLMT: |
| @@ -943,6 +934,18 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) | |||
| 943 | return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc) - bc_d(*pc)); | 934 | return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc) - bc_d(*pc)); |
| 944 | case BC_TSETM: | 935 | case BC_TSETM: |
| 945 | return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc)); | 936 | return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc)); |
| 937 | case BC_JLOOP: | ||
| 938 | retpc = &traceref(J, bc_d(*pc))->startins; | ||
| 939 | if (bc_isret(bc_op(*retpc)) || bc_op(*retpc) == BC_ITERN) { | ||
| 940 | /* Dispatch to original ins to ensure forward progress. */ | ||
| 941 | if (J->state != LJ_TRACE_RECORD) return -17; | ||
| 942 | /* Unpatch bytecode when recording. */ | ||
| 943 | J->patchins = *pc; | ||
| 944 | J->patchpc = (BCIns *)pc; | ||
| 945 | *J->patchpc = *retpc; | ||
| 946 | J->bcskip = 1; | ||
| 947 | } | ||
| 948 | return 0; | ||
| 946 | default: | 949 | default: |
| 947 | if (bc_op(*pc) >= BC_FUNCF) | 950 | if (bc_op(*pc) >= BC_FUNCF) |
| 948 | return (int)((BCReg)(L->top - L->base) + 1); | 951 | return (int)((BCReg)(L->top - L->base) + 1); |
diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc index 770c1602..4df4b488 100644 --- a/src/vm_arm.dasc +++ b/src/vm_arm.dasc | |||
| @@ -2196,8 +2196,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2196 | |.if JIT | 2196 | |.if JIT |
| 2197 | | ldr L, SAVE_L | 2197 | | ldr L, SAVE_L |
| 2198 | |1: | 2198 | |1: |
| 2199 | | cmp CARG1, #0 | 2199 | | cmn CARG1, #LUA_ERRERR |
| 2200 | | blt >9 // Check for error from exit. | 2200 | | bhs >9 // Check for error from exit. |
| 2201 | | lsl RC, CARG1, #3 | 2201 | | lsl RC, CARG1, #3 |
| 2202 | | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] | 2202 | | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] |
| 2203 | | str RC, SAVE_MULTRES | 2203 | | str RC, SAVE_MULTRES |
| @@ -2213,6 +2213,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2213 | | ldr INS, [PC], #4 | 2213 | | ldr INS, [PC], #4 |
| 2214 | | lsl MASKR8, MASKR8, #3 // MASKR8 = 255*8. | 2214 | | lsl MASKR8, MASKR8, #3 // MASKR8 = 255*8. |
| 2215 | | st_vmstate CARG4 | 2215 | | st_vmstate CARG4 |
| 2216 | | cmn CARG1, #17 // Static dispatch? | ||
| 2217 | | beq >5 | ||
| 2216 | | cmp OP, #BC_FUNCC+2 // Fast function? | 2218 | | cmp OP, #BC_FUNCC+2 // Fast function? |
| 2217 | | bhs >4 | 2219 | | bhs >4 |
| 2218 | |2: | 2220 | |2: |
| @@ -2238,6 +2240,17 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2238 | | ldr KBASE, [CARG3, #PC2PROTO(k)] | 2240 | | ldr KBASE, [CARG3, #PC2PROTO(k)] |
| 2239 | | b <2 | 2241 | | b <2 |
| 2240 | | | 2242 | | |
| 2243 | |5: // Dispatch to static entry of original ins replaced by BC_JLOOP. | ||
| 2244 | | ldr CARG1, [DISPATCH, #DISPATCH_J(trace)] | ||
| 2245 | | decode_RD RC, INS | ||
| 2246 | | ldr TRACE:CARG1, [CARG1, RC, lsl #2] | ||
| 2247 | | ldr INS, TRACE:CARG1->startins | ||
| 2248 | | decode_OP OP, INS | ||
| 2249 | | decode_RA8 RA, INS | ||
| 2250 | | add OP, DISPATCH, OP, lsl #2 | ||
| 2251 | | decode_RD RC, INS | ||
| 2252 | | ldr pc, [OP, #GG_DISP2STATIC] | ||
| 2253 | | | ||
| 2241 | |9: // Rethrow error from the right C frame. | 2254 | |9: // Rethrow error from the right C frame. |
| 2242 | | rsb CARG2, CARG1, #0 | 2255 | | rsb CARG2, CARG1, #0 |
| 2243 | | mov CARG1, L | 2256 | | mov CARG1, L |
diff --git a/src/vm_arm64.dasc b/src/vm_arm64.dasc index d45cc86b..effb8d91 100644 --- a/src/vm_arm64.dasc +++ b/src/vm_arm64.dasc | |||
| @@ -2005,8 +2005,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2005 | |.if JIT | 2005 | |.if JIT |
| 2006 | | ldr L, SAVE_L | 2006 | | ldr L, SAVE_L |
| 2007 | |1: | 2007 | |1: |
| 2008 | | cmp CARG1w, #0 | 2008 | | cmn CARG1w, #LUA_ERRERR |
| 2009 | | blt >9 // Check for error from exit. | 2009 | | bhs >9 // Check for error from exit. |
| 2010 | | lsl RC, CARG1, #3 | 2010 | | lsl RC, CARG1, #3 |
| 2011 | | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] | 2011 | | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] |
| 2012 | | movz TISNUM, #(LJ_TISNUM>>1)&0xffff, lsl #48 | 2012 | | movz TISNUM, #(LJ_TISNUM>>1)&0xffff, lsl #48 |
| @@ -2023,6 +2023,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2023 | | ldrb RBw, [PC, # OFS_OP] | 2023 | | ldrb RBw, [PC, # OFS_OP] |
| 2024 | | ldr INSw, [PC], #4 | 2024 | | ldr INSw, [PC], #4 |
| 2025 | | st_vmstate CARG4w | 2025 | | st_vmstate CARG4w |
| 2026 | | cmn CARG1w, #17 // Static dispatch? | ||
| 2027 | | beq >5 | ||
| 2026 | | cmp RBw, #BC_FUNCC+2 // Fast function? | 2028 | | cmp RBw, #BC_FUNCC+2 // Fast function? |
| 2027 | | add TMP1, GL, INS, uxtb #3 | 2029 | | add TMP1, GL, INS, uxtb #3 |
| 2028 | | bhs >4 | 2030 | | bhs >4 |
| @@ -2033,12 +2035,12 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2033 | | decode_RA RA, INS | 2035 | | decode_RA RA, INS |
| 2034 | | lsr TMP0, INS, #16 | 2036 | | lsr TMP0, INS, #16 |
| 2035 | | csel RC, TMP0, RC, lo | 2037 | | csel RC, TMP0, RC, lo |
| 2036 | | blo >5 | 2038 | | blo >3 |
| 2037 | | ldr CARG3, [BASE, FRAME_FUNC] | 2039 | | ldr CARG3, [BASE, FRAME_FUNC] |
| 2038 | | sub RC, RC, #8 | 2040 | | sub RC, RC, #8 |
| 2039 | | add RA, BASE, RA, lsl #3 // Yes: RA = BASE+framesize*8, RC = nargs*8 | 2041 | | add RA, BASE, RA, lsl #3 // Yes: RA = BASE+framesize*8, RC = nargs*8 |
| 2040 | | and LFUNC:CARG3, CARG3, #LJ_GCVMASK | 2042 | | and LFUNC:CARG3, CARG3, #LJ_GCVMASK |
| 2041 | |5: | 2043 | |3: |
| 2042 | | br_auth RB | 2044 | | br_auth RB |
| 2043 | | | 2045 | | |
| 2044 | |4: // Check frame below fast function. | 2046 | |4: // Check frame below fast function. |
| @@ -2055,6 +2057,17 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2055 | | ldr KBASE, [CARG3, #PC2PROTO(k)] | 2057 | | ldr KBASE, [CARG3, #PC2PROTO(k)] |
| 2056 | | b <2 | 2058 | | b <2 |
| 2057 | | | 2059 | | |
| 2060 | |5: // Dispatch to static entry of original ins replaced by BC_JLOOP. | ||
| 2061 | | ldr RA, [GL, #GL_J(trace)] | ||
| 2062 | | decode_RD RC, INS | ||
| 2063 | | ldr TRACE:RA, [RA, RC, lsl #3] | ||
| 2064 | | ldr INSw, TRACE:RA->startins | ||
| 2065 | | add TMP0, GL, INS, uxtb #3 | ||
| 2066 | | decode_RA RA, INS | ||
| 2067 | | ldr RB, [TMP0, #GG_G2DISP+GG_DISP2STATIC] | ||
| 2068 | | decode_RD RC, INS | ||
| 2069 | | br_auth RB | ||
| 2070 | | | ||
| 2058 | |9: // Rethrow error from the right C frame. | 2071 | |9: // Rethrow error from the right C frame. |
| 2059 | | neg CARG2w, CARG1w | 2072 | | neg CARG2w, CARG1w |
| 2060 | | mov CARG1, L | 2073 | | mov CARG1, L |
diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc index 34645bf1..bfdcfc1e 100644 --- a/src/vm_mips.dasc +++ b/src/vm_mips.dasc | |||
| @@ -2466,7 +2466,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2466 | | addiu DISPATCH, JGL, -GG_DISP2G-32768 | 2466 | | addiu DISPATCH, JGL, -GG_DISP2G-32768 |
| 2467 | | sw BASE, L->base | 2467 | | sw BASE, L->base |
| 2468 | |1: | 2468 | |1: |
| 2469 | | bltz CRET1, >9 // Check for error from exit. | 2469 | | sltiu TMP0, CRET1, -LUA_ERRERR // Check for error from exit. |
| 2470 | | beqz TMP0, >9 | ||
| 2470 | |. lw LFUNC:RB, FRAME_FUNC(BASE) | 2471 | |. lw LFUNC:RB, FRAME_FUNC(BASE) |
| 2471 | | .FPU lui TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). | 2472 | | .FPU lui TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). |
| 2472 | | sll MULTRES, CRET1, 3 | 2473 | | sll MULTRES, CRET1, 3 |
| @@ -2480,14 +2481,16 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2480 | | .FPU cvt.d.s TOBIT, TOBIT | 2481 | | .FPU cvt.d.s TOBIT, TOBIT |
| 2481 | | // Modified copy of ins_next which handles function header dispatch, too. | 2482 | | // Modified copy of ins_next which handles function header dispatch, too. |
| 2482 | | lw INS, 0(PC) | 2483 | | lw INS, 0(PC) |
| 2483 | | addiu PC, PC, 4 | 2484 | | addiu CRET1, CRET1, 17 // Static dispatch? |
| 2484 | | // Assumes TISNIL == ~LJ_VMST_INTERP == -1 | 2485 | | // Assumes TISNIL == ~LJ_VMST_INTERP == -1 |
| 2485 | | sw TISNIL, DISPATCH_GL(vmstate)(DISPATCH) | 2486 | | sw TISNIL, DISPATCH_GL(vmstate)(DISPATCH) |
| 2487 | | decode_RD8a RD, INS | ||
| 2488 | | beqz CRET1, >5 | ||
| 2489 | |. addiu PC, PC, 4 | ||
| 2486 | | decode_OP4a TMP1, INS | 2490 | | decode_OP4a TMP1, INS |
| 2487 | | decode_OP4b TMP1 | 2491 | | decode_OP4b TMP1 |
| 2488 | | sltiu TMP2, TMP1, BC_FUNCF*4 | ||
| 2489 | | addu TMP0, DISPATCH, TMP1 | 2492 | | addu TMP0, DISPATCH, TMP1 |
| 2490 | | decode_RD8a RD, INS | 2493 | | sltiu TMP2, TMP1, BC_FUNCF*4 |
| 2491 | | lw AT, 0(TMP0) | 2494 | | lw AT, 0(TMP0) |
| 2492 | | decode_RA8a RA, INS | 2495 | | decode_RA8a RA, INS |
| 2493 | | beqz TMP2, >2 | 2496 | | beqz TMP2, >2 |
| @@ -2515,6 +2518,22 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2515 | | jr AT | 2518 | | jr AT |
| 2516 | |. addu RA, RA, BASE | 2519 | |. addu RA, RA, BASE |
| 2517 | | | 2520 | | |
| 2521 | |5: // Dispatch to static entry of original ins replaced by BC_JLOOP. | ||
| 2522 | | lw TMP0, DISPATCH_J(trace)(DISPATCH) | ||
| 2523 | | decode_RD4b RD | ||
| 2524 | | addu TMP0, TMP0, RD | ||
| 2525 | | lw TRACE:TMP2, 0(TMP0) | ||
| 2526 | | lw INS, TRACE:TMP2->startins | ||
| 2527 | | decode_OP4a TMP1, INS | ||
| 2528 | | decode_OP4b TMP1 | ||
| 2529 | | addu TMP0, DISPATCH, TMP1 | ||
| 2530 | | decode_RD8a RD, INS | ||
| 2531 | | lw AT, GG_DISP2STATIC(TMP0) | ||
| 2532 | | decode_RA8a RA, INS | ||
| 2533 | | decode_RD8b RD | ||
| 2534 | | jr AT | ||
| 2535 | |. decode_RA8b RA | ||
| 2536 | | | ||
| 2518 | |9: // Rethrow error from the right C frame. | 2537 | |9: // Rethrow error from the right C frame. |
| 2519 | | load_got lj_err_trace | 2538 | | load_got lj_err_trace |
| 2520 | | sub CARG2, r0, CRET1 | 2539 | | sub CARG2, r0, CRET1 |
diff --git a/src/vm_mips64.dasc b/src/vm_mips64.dasc index 651bc42e..801087b3 100644 --- a/src/vm_mips64.dasc +++ b/src/vm_mips64.dasc | |||
| @@ -2571,7 +2571,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2571 | | daddiu DISPATCH, JGL, -GG_DISP2G-32768 | 2571 | | daddiu DISPATCH, JGL, -GG_DISP2G-32768 |
| 2572 | | sd BASE, L->base | 2572 | | sd BASE, L->base |
| 2573 | |1: | 2573 | |1: |
| 2574 | | bltz CRET1, >9 // Check for error from exit. | 2574 | | sltiu TMP0, CRET1, -LUA_ERRERR // Check for error from exit. |
| 2575 | | beqz TMP0, >9 | ||
| 2575 | |. ld LFUNC:RB, FRAME_FUNC(BASE) | 2576 | |. ld LFUNC:RB, FRAME_FUNC(BASE) |
| 2576 | | .FPU lui TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). | 2577 | | .FPU lui TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). |
| 2577 | | dsll MULTRES, CRET1, 3 | 2578 | | dsll MULTRES, CRET1, 3 |
| @@ -2586,14 +2587,16 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2586 | | .FPU cvt.d.s TOBIT, TOBIT | 2587 | | .FPU cvt.d.s TOBIT, TOBIT |
| 2587 | | // Modified copy of ins_next which handles function header dispatch, too. | 2588 | | // Modified copy of ins_next which handles function header dispatch, too. |
| 2588 | | lw INS, 0(PC) | 2589 | | lw INS, 0(PC) |
| 2589 | | daddiu PC, PC, 4 | 2590 | | addiu CRET1, CRET1, 17 // Static dispatch? |
| 2590 | | // Assumes TISNIL == ~LJ_VMST_INTERP == -1 | 2591 | | // Assumes TISNIL == ~LJ_VMST_INTERP == -1 |
| 2591 | | sw TISNIL, DISPATCH_GL(vmstate)(DISPATCH) | 2592 | | sw TISNIL, DISPATCH_GL(vmstate)(DISPATCH) |
| 2593 | | decode_RD8a RD, INS | ||
| 2594 | | beqz CRET1, >5 | ||
| 2595 | |. daddiu PC, PC, 4 | ||
| 2592 | | decode_OP8a TMP1, INS | 2596 | | decode_OP8a TMP1, INS |
| 2593 | | decode_OP8b TMP1 | 2597 | | decode_OP8b TMP1 |
| 2594 | | sltiu TMP2, TMP1, BC_FUNCF*8 | ||
| 2595 | | daddu TMP0, DISPATCH, TMP1 | 2598 | | daddu TMP0, DISPATCH, TMP1 |
| 2596 | | decode_RD8a RD, INS | 2599 | | sltiu TMP2, TMP1, BC_FUNCF*8 |
| 2597 | | ld AT, 0(TMP0) | 2600 | | ld AT, 0(TMP0) |
| 2598 | | decode_RA8a RA, INS | 2601 | | decode_RA8a RA, INS |
| 2599 | | beqz TMP2, >2 | 2602 | | beqz TMP2, >2 |
| @@ -2622,6 +2625,22 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2622 | | jr AT | 2625 | | jr AT |
| 2623 | |. daddu RA, RA, BASE | 2626 | |. daddu RA, RA, BASE |
| 2624 | | | 2627 | | |
| 2628 | |5: // Dispatch to static entry of original ins replaced by BC_JLOOP. | ||
| 2629 | | ld TMP0, DISPATCH_J(trace)(DISPATCH) | ||
| 2630 | | decode_RD8b RD | ||
| 2631 | | daddu TMP0, TMP0, RD | ||
| 2632 | | ld TRACE:TMP2, 0(TMP0) | ||
| 2633 | | lw INS, TRACE:TMP2->startins | ||
| 2634 | | decode_OP8a TMP1, INS | ||
| 2635 | | decode_OP8b TMP1 | ||
| 2636 | | daddu TMP0, DISPATCH, TMP1 | ||
| 2637 | | decode_RD8a RD, INS | ||
| 2638 | | ld AT, GG_DISP2STATIC(TMP0) | ||
| 2639 | | decode_RA8a RA, INS | ||
| 2640 | | decode_RD8b RD | ||
| 2641 | | jr AT | ||
| 2642 | |. decode_RA8b RA | ||
| 2643 | | | ||
| 2625 | |9: // Rethrow error from the right C frame. | 2644 | |9: // Rethrow error from the right C frame. |
| 2626 | | load_got lj_err_trace | 2645 | | load_got lj_err_trace |
| 2627 | | sub CARG2, r0, CRET1 | 2646 | | sub CARG2, r0, CRET1 |
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index 3cad37d2..73d60ae4 100644 --- a/src/vm_ppc.dasc +++ b/src/vm_ppc.dasc | |||
| @@ -3015,8 +3015,9 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 3015 | | addi DISPATCH, JGL, -GG_DISP2G-32768 | 3015 | | addi DISPATCH, JGL, -GG_DISP2G-32768 |
| 3016 | | stp BASE, L->base | 3016 | | stp BASE, L->base |
| 3017 | |1: | 3017 | |1: |
| 3018 | | cmpwi CARG1, 0 | 3018 | | li TMP2, -LUA_ERRERR |
| 3019 | | blt >9 // Check for error from exit. | 3019 | | cmplw CARG1, TMP2 |
| 3020 | | bge >9 // Check for error from exit. | ||
| 3020 | | lwz LFUNC:RB, FRAME_FUNC(BASE) | 3021 | | lwz LFUNC:RB, FRAME_FUNC(BASE) |
| 3021 | | slwi MULTRES, CARG1, 3 | 3022 | | slwi MULTRES, CARG1, 3 |
| 3022 | | li TMP2, 0 | 3023 | | li TMP2, 0 |
| @@ -3041,6 +3042,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 3041 | | addi PC, PC, 4 | 3042 | | addi PC, PC, 4 |
| 3042 | | // Assumes TISNIL == ~LJ_VMST_INTERP == -1. | 3043 | | // Assumes TISNIL == ~LJ_VMST_INTERP == -1. |
| 3043 | | stw TISNIL, DISPATCH_GL(vmstate)(DISPATCH) | 3044 | | stw TISNIL, DISPATCH_GL(vmstate)(DISPATCH) |
| 3045 | | cmpwi CARG1, -17 // Static dispatch? | ||
| 3046 | | beq >5 | ||
| 3044 | | decode_OPP TMP1, INS | 3047 | | decode_OPP TMP1, INS |
| 3045 | | decode_RA8 RA, INS | 3048 | | decode_RA8 RA, INS |
| 3046 | | lpx TMP0, DISPATCH, TMP1 | 3049 | | lpx TMP0, DISPATCH, TMP1 |
| @@ -3070,6 +3073,21 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 3070 | | add RA, RA, BASE | 3073 | | add RA, RA, BASE |
| 3071 | | bctr | 3074 | | bctr |
| 3072 | | | 3075 | | |
| 3076 | |5: // Dispatch to static entry of original ins replaced by BC_JLOOP. | ||
| 3077 | | lwz TMP1, DISPATCH_J(trace)(DISPATCH) | ||
| 3078 | | decode_RD4 RD, INS | ||
| 3079 | | lwzx TRACE:TMP1, TMP1, RD | ||
| 3080 | | lwz INS, TRACE:TMP1->startins | ||
| 3081 | | decode_OPP TMP1, INS | ||
| 3082 | | addi TMP1, TMP1, GG_DISP2STATIC | ||
| 3083 | | lpx TMP0, DISPATCH, TMP1 | ||
| 3084 | | mtctr TMP0 | ||
| 3085 | | decode_RB8 RB, INS | ||
| 3086 | | decode_RD8 RD, INS | ||
| 3087 | | decode_RA8 RA, INS | ||
| 3088 | | decode_RC8 RC, INS | ||
| 3089 | | bctr | ||
| 3090 | | | ||
| 3073 | |9: // Rethrow error from the right C frame. | 3091 | |9: // Rethrow error from the right C frame. |
| 3074 | | neg CARG2, CARG1 | 3092 | | neg CARG2, CARG1 |
| 3075 | | mr CARG1, L | 3093 | | mr CARG1, L |
diff --git a/src/vm_x64.dasc b/src/vm_x64.dasc index 03d96557..5983eeed 100644 --- a/src/vm_x64.dasc +++ b/src/vm_x64.dasc | |||
| @@ -2453,7 +2453,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2453 | | mov r12, [RA] | 2453 | | mov r12, [RA] |
| 2454 | | mov rsp, RA // Reposition stack to C frame. | 2454 | | mov rsp, RA // Reposition stack to C frame. |
| 2455 | |.endif | 2455 | |.endif |
| 2456 | | test RDd, RDd; js >9 // Check for error from exit. | 2456 | | cmp RDd, -LUA_ERRERR; jae >9 // Check for error from exit. |
| 2457 | | mov L:RB, SAVE_L | 2457 | | mov L:RB, SAVE_L |
| 2458 | | mov MULTRES, RDd | 2458 | | mov MULTRES, RDd |
| 2459 | | mov LFUNC:KBASE, [BASE-16] | 2459 | | mov LFUNC:KBASE, [BASE-16] |
| @@ -2469,6 +2469,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2469 | | movzx OP, RCL | 2469 | | movzx OP, RCL |
| 2470 | | add PC, 4 | 2470 | | add PC, 4 |
| 2471 | | shr RCd, 16 | 2471 | | shr RCd, 16 |
| 2472 | | cmp MULTRES, -17 // Static dispatch? | ||
| 2473 | | je >5 | ||
| 2472 | | cmp OP, BC_FUNCF // Function header? | 2474 | | cmp OP, BC_FUNCF // Function header? |
| 2473 | | jb >3 | 2475 | | jb >3 |
| 2474 | | cmp OP, BC_FUNCC+2 // Fast function? | 2476 | | cmp OP, BC_FUNCC+2 // Fast function? |
| @@ -2491,6 +2493,15 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2491 | | mov KBASE, [KBASE+PC2PROTO(k)] | 2493 | | mov KBASE, [KBASE+PC2PROTO(k)] |
| 2492 | | jmp <2 | 2494 | | jmp <2 |
| 2493 | | | 2495 | | |
| 2496 | |5: // Dispatch to static entry of original ins replaced by BC_JLOOP. | ||
| 2497 | | mov RA, [DISPATCH+DISPATCH_J(trace)] | ||
| 2498 | | mov TRACE:RA, [RA+RD*8] | ||
| 2499 | | mov RCd, TRACE:RA->startins | ||
| 2500 | | movzx RAd, RCH | ||
| 2501 | | movzx OP, RCL | ||
| 2502 | | shr RCd, 16 | ||
| 2503 | | jmp aword [DISPATCH+OP*8+GG_DISP2STATIC] | ||
| 2504 | | | ||
| 2494 | |9: // Rethrow error from the right C frame. | 2505 | |9: // Rethrow error from the right C frame. |
| 2495 | | mov CARG2d, RDd | 2506 | | mov CARG2d, RDd |
| 2496 | | mov CARG1, L:RB | 2507 | | mov CARG1, L:RB |
diff --git a/src/vm_x86.dasc b/src/vm_x86.dasc index 18ca87b5..f7847762 100644 --- a/src/vm_x86.dasc +++ b/src/vm_x86.dasc | |||
| @@ -2902,7 +2902,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2902 | | mov r13, TMPa | 2902 | | mov r13, TMPa |
| 2903 | | mov r12, TMPQ | 2903 | | mov r12, TMPQ |
| 2904 | |.endif | 2904 | |.endif |
| 2905 | | test RD, RD; js >9 // Check for error from exit. | 2905 | | cmp RD, -LUA_ERRERR; jae >9 // Check for error from exit. |
| 2906 | | mov L:RB, SAVE_L | 2906 | | mov L:RB, SAVE_L |
| 2907 | | mov MULTRES, RD | 2907 | | mov MULTRES, RD |
| 2908 | | mov LFUNC:KBASE, [BASE-8] | 2908 | | mov LFUNC:KBASE, [BASE-8] |
| @@ -2917,6 +2917,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2917 | | movzx OP, RCL | 2917 | | movzx OP, RCL |
| 2918 | | add PC, 4 | 2918 | | add PC, 4 |
| 2919 | | shr RC, 16 | 2919 | | shr RC, 16 |
| 2920 | | cmp MULTRES, -17 // Static dispatch? | ||
| 2921 | | je >5 | ||
| 2920 | | cmp OP, BC_FUNCF // Function header? | 2922 | | cmp OP, BC_FUNCF // Function header? |
| 2921 | | jb >3 | 2923 | | jb >3 |
| 2922 | | cmp OP, BC_FUNCC+2 // Fast function? | 2924 | | cmp OP, BC_FUNCC+2 // Fast function? |
| @@ -2942,6 +2944,19 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2942 | | mov KBASE, [KBASE+PC2PROTO(k)] | 2944 | | mov KBASE, [KBASE+PC2PROTO(k)] |
| 2943 | | jmp <2 | 2945 | | jmp <2 |
| 2944 | | | 2946 | | |
| 2947 | |5: // Dispatch to static entry of original ins replaced by BC_JLOOP. | ||
| 2948 | | mov RA, [DISPATCH+DISPATCH_J(trace)] | ||
| 2949 | | mov TRACE:RA, [RA+RD*4] | ||
| 2950 | | mov RC, TRACE:RA->startins | ||
| 2951 | | movzx RA, RCH | ||
| 2952 | | movzx OP, RCL | ||
| 2953 | | shr RC, 16 | ||
| 2954 | |.if X64 | ||
| 2955 | | jmp aword [DISPATCH+OP*8+GG_DISP2STATIC] | ||
| 2956 | |.else | ||
| 2957 | | jmp aword [DISPATCH+OP*4+GG_DISP2STATIC] | ||
| 2958 | |.endif | ||
| 2959 | | | ||
| 2945 | |9: // Rethrow error from the right C frame. | 2960 | |9: // Rethrow error from the right C frame. |
| 2946 | | mov FCARG2, RD | 2961 | | mov FCARG2, RD |
| 2947 | | mov FCARG1, L:RB | 2962 | | mov FCARG1, L:RB |
