diff options
author | Mike Pall <mike> | 2014-01-16 22:53:27 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2014-01-16 22:53:27 +0100 |
commit | ce9e8ed675d1fb7fe8e148a328fe0b892791a5f4 (patch) | |
tree | 34792c8d5acc204d5b3067a057a7b4a4e2af4008 /src/vm_ppc.dasc | |
parent | ba9dde2ce65f793017d7ccaa9e97fa57b3a87222 (diff) | |
download | luajit-ce9e8ed675d1fb7fe8e148a328fe0b892791a5f4.tar.gz luajit-ce9e8ed675d1fb7fe8e148a328fe0b892791a5f4.tar.bz2 luajit-ce9e8ed675d1fb7fe8e148a328fe0b892791a5f4.zip |
Fix KBASE for Lua functions below stitched fast functions.
Diffstat (limited to 'src/vm_ppc.dasc')
-rw-r--r-- | src/vm_ppc.dasc | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index c21f5c43..1d5446c2 100644 --- a/src/vm_ppc.dasc +++ b/src/vm_ppc.dasc | |||
@@ -2531,6 +2531,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
2531 | | | 2531 | | |
2532 | | slwi TMP2, TMP3, 2 | 2532 | | slwi TMP2, TMP3, 2 |
2533 | | lwzx TRACE:TMP2, TMP1, TMP2 | 2533 | | lwzx TRACE:TMP2, TMP1, TMP2 |
2534 | | cmpwi TRACE:TMP2, 0 | ||
2535 | | beq ->cont_nop | ||
2534 | | lhz RD, TRACE:TMP2->link | 2536 | | lhz RD, TRACE:TMP2->link |
2535 | | cmpw RD, TMP3 | 2537 | | cmpw RD, TMP3 |
2536 | | cmpwi cr1, RD, 0 | 2538 | | cmpwi cr1, RD, 0 |
@@ -2637,7 +2639,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
2637 | | stp BASE, L->base | 2639 | | stp BASE, L->base |
2638 | |1: | 2640 | |1: |
2639 | | cmpwi CARG1, 0 | 2641 | | cmpwi CARG1, 0 |
2640 | | blt >3 // Check for error from exit. | 2642 | | blt >9 // Check for error from exit. |
2641 | | lwz LFUNC:RB, FRAME_FUNC(BASE) | 2643 | | lwz LFUNC:RB, FRAME_FUNC(BASE) |
2642 | | slwi MULTRES, CARG1, 3 | 2644 | | slwi MULTRES, CARG1, 3 |
2643 | | li TMP2, 0 | 2645 | | li TMP2, 0 |
@@ -2673,11 +2675,25 @@ static void build_subroutines(BuildCtx *ctx) | |||
2673 | | decode_RC8 RC, INS | 2675 | | decode_RC8 RC, INS |
2674 | | bctr | 2676 | | bctr |
2675 | |2: | 2677 | |2: |
2678 | | cmplwi TMP1, (BC_FUNCC+2)*4 // Fast function? | ||
2679 | | blt >3 | ||
2680 | | // Check frame below fast function. | ||
2681 | | lwz TMP1, FRAME_PC(BASE) | ||
2682 | | andix. TMP0, TMP1, FRAME_TYPE | ||
2683 | | bney >3 // Trace stitching continuation? | ||
2684 | | // Otherwise set KBASE for Lua function below fast function. | ||
2685 | | lwz TMP2, -4(TMP1) | ||
2686 | | decode_RA8 TMP0, TMP2 | ||
2687 | | sub TMP1, BASE, TMP0 | ||
2688 | | lwz LFUNC:TMP2, -12(TMP1) | ||
2689 | | lwz TMP1, LFUNC:TMP2->pc | ||
2690 | | lwz KBASE, PC2PROTO(k)(TMP1) | ||
2691 | |3: | ||
2676 | | subi RC, MULTRES, 8 | 2692 | | subi RC, MULTRES, 8 |
2677 | | add RA, RA, BASE | 2693 | | add RA, RA, BASE |
2678 | | bctr | 2694 | | bctr |
2679 | | | 2695 | | |
2680 | |3: // Rethrow error from the right C frame. | 2696 | |9: // Rethrow error from the right C frame. |
2681 | | neg CARG2, CARG1 | 2697 | | neg CARG2, CARG1 |
2682 | | mr CARG1, L | 2698 | | mr CARG1, L |
2683 | | bl extern lj_err_throw // (lua_State *L, int errcode) | 2699 | | bl extern lj_err_throw // (lua_State *L, int errcode) |