aboutsummaryrefslogtreecommitdiff
path: root/src/vm_ppc.dasc
diff options
context:
space:
mode:
authorMike Pall <mike>2013-12-25 02:55:25 +0100
committerMike Pall <mike>2013-12-25 02:55:25 +0100
commitb5d741fa7e11a2a58df65f3c71489c58f8758f75 (patch)
tree3c33ec24c8fd363ca2ce797c998b21a8a0e39a5b /src/vm_ppc.dasc
parent6e02c210c485791a5451cc74731acf319b2067bb (diff)
downloadluajit-b5d741fa7e11a2a58df65f3c71489c58f8758f75.tar.gz
luajit-b5d741fa7e11a2a58df65f3c71489c58f8758f75.tar.bz2
luajit-b5d741fa7e11a2a58df65f3c71489c58f8758f75.zip
Add trace stitching.
Diffstat (limited to 'src/vm_ppc.dasc')
-rw-r--r--src/vm_ppc.dasc55
1 files changed, 52 insertions, 3 deletions
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc
index 91de682d..c21f5c43 100644
--- a/src/vm_ppc.dasc
+++ b/src/vm_ppc.dasc
@@ -2505,6 +2505,55 @@ static void build_subroutines(BuildCtx *ctx)
2505 | mtctr CRET1 2505 | mtctr CRET1
2506 | bctr 2506 | bctr
2507 | 2507 |
2508 |->cont_stitch: // Trace stitching.
2509 |.if JIT
2510 | // RA = resultptr, RB = meta base
2511 | lwz INS, -4(PC)
2512 | lwz TMP3, -20(RB) // Save previous trace number.
2513 | addic. TMP1, MULTRES, -8
2514 | decode_RA8 RC, INS // Call base.
2515 | beq >2
2516 |1: // Move results down.
2517 | lfd f0, 0(RA)
2518 | addic. TMP1, TMP1, -8
2519 | addi RA, RA, 8
2520 | stfdx f0, BASE, RC
2521 | addi RC, RC, 8
2522 | bne <1
2523 |2:
2524 | decode_RA8 RA, INS
2525 | decode_RB8 RB, INS
2526 | add RA, RA, RB
2527 | lwz TMP1, DISPATCH_J(trace)(DISPATCH)
2528 |3:
2529 | cmplw RA, RC
2530 | bgt >9 // More results wanted?
2531 |
2532 | slwi TMP2, TMP3, 2
2533 | lwzx TRACE:TMP2, TMP1, TMP2
2534 | lhz RD, TRACE:TMP2->link
2535 | cmpw RD, TMP3
2536 | cmpwi cr1, RD, 0
2537 | beq ->cont_nop // Blacklisted.
2538 | slwi RD, RD, 3
2539 | bne cr1, =>BC_JLOOP // Jump to stitched trace.
2540 |
2541 | // Stitch a new trace to the previous trace.
2542 | stw TMP3, DISPATCH_J(exitno)(DISPATCH)
2543 | stp L, DISPATCH_J(L)(DISPATCH)
2544 | stp BASE, L->base
2545 | addi CARG1, DISPATCH, GG_DISP2J
2546 | mr CARG2, PC
2547 | bl extern lj_dispatch_stitch // (jit_State *J, const BCIns *pc)
2548 | lp BASE, L->base
2549 | b ->cont_nop
2550 |
2551 |9:
2552 | stwx TISNIL, BASE, RC
2553 | addi RC, RC, 8
2554 | b <3
2555 |.endif
2556 |
2508 |->vm_profhook: // Dispatch target for profiler hook. 2557 |->vm_profhook: // Dispatch target for profiler hook.
2509#if LJ_HASPROFILE 2558#if LJ_HASPROFILE
2510 | mr CARG1, L 2559 | mr CARG1, L
@@ -2557,7 +2606,7 @@ static void build_subroutines(BuildCtx *ctx)
2557 | sub CARG3, TMP0, CARG3 // Compute exit number. 2606 | sub CARG3, TMP0, CARG3 // Compute exit number.
2558 | lp BASE, DISPATCH_GL(jit_base)(DISPATCH) 2607 | lp BASE, DISPATCH_GL(jit_base)(DISPATCH)
2559 | srwi CARG3, CARG3, 2 2608 | srwi CARG3, CARG3, 2
2560 | stw L, DISPATCH_J(L)(DISPATCH) 2609 | stp L, DISPATCH_J(L)(DISPATCH)
2561 | subi CARG3, CARG3, 2 2610 | subi CARG3, CARG3, 2
2562 | stp BASE, L->base 2611 | stp BASE, L->base
2563 | stw CARG4, DISPATCH_J(parent)(DISPATCH) 2612 | stw CARG4, DISPATCH_J(parent)(DISPATCH)
@@ -2589,11 +2638,11 @@ static void build_subroutines(BuildCtx *ctx)
2589 |1: 2638 |1:
2590 | cmpwi CARG1, 0 2639 | cmpwi CARG1, 0
2591 | blt >3 // Check for error from exit. 2640 | blt >3 // Check for error from exit.
2592 | lwz LFUNC:TMP1, FRAME_FUNC(BASE) 2641 | lwz LFUNC:RB, FRAME_FUNC(BASE)
2593 | slwi MULTRES, CARG1, 3 2642 | slwi MULTRES, CARG1, 3
2594 | li TMP2, 0 2643 | li TMP2, 0
2595 | stw MULTRES, SAVE_MULTRES 2644 | stw MULTRES, SAVE_MULTRES
2596 | lwz TMP1, LFUNC:TMP1->pc 2645 | lwz TMP1, LFUNC:RB->pc
2597 | stw TMP2, DISPATCH_GL(jit_base)(DISPATCH) 2646 | stw TMP2, DISPATCH_GL(jit_base)(DISPATCH)
2598 | lwz KBASE, PC2PROTO(k)(TMP1) 2647 | lwz KBASE, PC2PROTO(k)(TMP1)
2599 | // Setup type comparison constants. 2648 | // Setup type comparison constants.