diff options
author | Mike Pall <mike> | 2013-12-25 02:55:25 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2013-12-25 02:55:25 +0100 |
commit | b5d741fa7e11a2a58df65f3c71489c58f8758f75 (patch) | |
tree | 3c33ec24c8fd363ca2ce797c998b21a8a0e39a5b /src/vm_ppc.dasc | |
parent | 6e02c210c485791a5451cc74731acf319b2067bb (diff) | |
download | luajit-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.dasc | 55 |
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. |