aboutsummaryrefslogtreecommitdiff
path: root/src/vm_ppc.dasc
diff options
context:
space:
mode:
authorMike Pall <mike>2014-01-16 22:53:27 +0100
committerMike Pall <mike>2014-01-16 22:53:27 +0100
commitce9e8ed675d1fb7fe8e148a328fe0b892791a5f4 (patch)
tree34792c8d5acc204d5b3067a057a7b4a4e2af4008 /src/vm_ppc.dasc
parentba9dde2ce65f793017d7ccaa9e97fa57b3a87222 (diff)
downloadluajit-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.dasc20
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)