summaryrefslogtreecommitdiff
path: root/src/buildvm_ppc.dasc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/buildvm_ppc.dasc92
1 files changed, 84 insertions, 8 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc
index 1cbf3a74..c26f3924 100644
--- a/src/buildvm_ppc.dasc
+++ b/src/buildvm_ppc.dasc
@@ -98,11 +98,14 @@
98| 98|
99|.macro saveregs 99|.macro saveregs
100| stwu sp, -CFRAME_SPACE(sp) 100| stwu sp, -CFRAME_SPACE(sp)
101| save_ 14; save_ 15; save_ 16; save_ 17; save_ 18; save_ 19 101| save_ 14; save_ 15; save_ 16
102| mflr r0; mfcr r12 102| mflr r0
103| save_ 20; save_ 21; save_ 22; save_ 23; save_ 24; save_ 25 103| save_ 17; save_ 18; save_ 19; save_ 20; save_ 21; save_ 22
104| stw r0, SAVE_LR; stw r12, SAVE_CR 104| stw r0, SAVE_LR
105| save_ 23; save_ 24; save_ 25
106| mfcr r0
105| save_ 26; save_ 27; save_ 28; save_ 29; save_ 30; save_ 31 107| save_ 26; save_ 27; save_ 28; save_ 29; save_ 30; save_ 31
108| stw r0, SAVE_CR
106|.endmacro 109|.endmacro
107| 110|
108|.macro restoreregs 111|.macro restoreregs
@@ -610,21 +613,29 @@ static void build_subroutines(BuildCtx *ctx)
610 | mr RB, BASE 613 | mr RB, BASE
611 | mr BASE, TMP2 // Restore caller BASE. 614 | mr BASE, TMP2 // Restore caller BASE.
612 | lwz LFUNC:TMP1, FRAME_FUNC(TMP2) 615 | lwz LFUNC:TMP1, FRAME_FUNC(TMP2)
613 | cmplwi TMP0, 0 616#if LJ_HASFFI
617 | cmplwi TMP0, 1
618#endif
614 | lwz PC, -16(RB) // Restore PC from [cont|PC]. 619 | lwz PC, -16(RB) // Restore PC from [cont|PC].
615 | beq >1
616 | subi TMP2, RD, 8 620 | subi TMP2, RD, 8
617 | lwz TMP1, LFUNC:TMP1->pc 621 | lwz TMP1, LFUNC:TMP1->pc
618 | stwx TISNIL, RA, TMP2 // Ensure one valid arg. 622 | stwx TISNIL, RA, TMP2 // Ensure one valid arg.
623#if LJ_HASFFI
624 | ble >1
625#endif
619 | lwz KBASE, PC2PROTO(k)(TMP1) 626 | lwz KBASE, PC2PROTO(k)(TMP1)
620 | // BASE = base, RA = resultptr, RB = meta base 627 | // BASE = base, RA = resultptr, RB = meta base
621 | mtctr TMP0 628 | mtctr TMP0
622 | bctr // Jump to continuation. 629 | bctr // Jump to continuation.
623 | 630 |
624 |1: // Tail call from C function. 631#if LJ_HASFFI
632 |1:
633 | beq ->cont_ffi_callback // cont = 1: return from FFI callback.
634 | // cont = 0: tailcall from C function.
625 | subi TMP1, RB, 16 635 | subi TMP1, RB, 16
626 | sub RC, TMP1, BASE 636 | sub RC, TMP1, BASE
627 | b ->vm_call_tail 637 | b ->vm_call_tail
638#endif
628 | 639 |
629 |->cont_cat: // RA = resultptr, RB = meta base 640 |->cont_cat: // RA = resultptr, RB = meta base
630 | lwz INS, -4(PC) 641 | lwz INS, -4(PC)
@@ -2490,7 +2501,7 @@ static void build_subroutines(BuildCtx *ctx)
2490 | lwz r0, 36(sp) 2501 | lwz r0, 36(sp)
2491 | fmul FARG1, FARG1, f15 2502 | fmul FARG1, FARG1, f15
2492 | mtlr r0 2503 | mtlr r0
2493 | fsub FARG1, f14, FARG1; 2504 | fsub FARG1, f14, FARG1
2494 | lfd f14, 16(sp); lfd f15, 24(sp); addi sp, sp, 32; blr 2505 | lfd f14, 16(sp); lfd f15, 24(sp); addi sp, sp, 32; blr
2495 |1: 2506 |1:
2496 | b extern pow 2507 | b extern pow
@@ -2527,6 +2538,71 @@ static void build_subroutines(BuildCtx *ctx)
2527 |//-- FFI helper functions ----------------------------------------------- 2538 |//-- FFI helper functions -----------------------------------------------
2528 |//----------------------------------------------------------------------- 2539 |//-----------------------------------------------------------------------
2529 | 2540 |
2541 |// Handler for callback functions. Callback slot number in r11, g in r12.
2542 |->vm_ffi_callback:
2543#if LJ_HASFFI
2544 |.type CTSTATE, CTState, PC
2545 | saveregs
2546 | lwz CTSTATE, GL:r12->ctype_state
2547 | addi DISPATCH, r12, GG_G2DISP
2548 | stw r11, CTSTATE->cb.slot
2549 | stw r3, CTSTATE->cb.gpr[0]
2550 | stfd f1, CTSTATE->cb.fpr[0]
2551 | stw r4, CTSTATE->cb.gpr[1]
2552 | stfd f2, CTSTATE->cb.fpr[1]
2553 | stw r5, CTSTATE->cb.gpr[2]
2554 | stfd f3, CTSTATE->cb.fpr[2]
2555 | stw r6, CTSTATE->cb.gpr[3]
2556 | stfd f4, CTSTATE->cb.fpr[3]
2557 | stw r7, CTSTATE->cb.gpr[4]
2558 | stfd f5, CTSTATE->cb.fpr[4]
2559 | stw r8, CTSTATE->cb.gpr[5]
2560 | stfd f6, CTSTATE->cb.fpr[5]
2561 | stw r9, CTSTATE->cb.gpr[6]
2562 | stfd f7, CTSTATE->cb.fpr[6]
2563 | stw r10, CTSTATE->cb.gpr[7]
2564 | stfd f8, CTSTATE->cb.fpr[7]
2565 | addi TMP0, sp, CFRAME_SPACE+8
2566 | stw TMP0, CTSTATE->cb.stack
2567 | mr CARG1, CTSTATE
2568 | stw CTSTATE, SAVE_PC // Any value outside of bytecode is ok.
2569 | mr CARG2, sp
2570 | bl extern lj_ccallback_enter // (CTState *cts, void *cf)
2571 | // Returns lua_State *.
2572 | lwz BASE, L:CRET1->base
2573 | li TISNUM, LJ_TISNUM // Setup type comparison constants.
2574 | lwz RC, L:CRET1->top
2575 | lus TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float).
2576 | li ZERO, 0
2577 | mr L, CRET1
2578 | stw TMP3, TMPD
2579 | lwz LFUNC:RB, FRAME_FUNC(BASE)
2580 | ori TMP3, TMP3, 0x0004 // TONUM = 2^52 + 2^51 + 2^31 (float).
2581 | li TISNIL, LJ_TNIL
2582 | li_vmstate INTERP
2583 | lfs TOBIT, TMPD
2584 | stw TMP3, TMPD
2585 | sub RC, RC, BASE
2586 | st_vmstate
2587 | lfs TONUM, TMPD
2588 | ins_callt
2589#endif
2590 |
2591 |->cont_ffi_callback: // Return from FFI callback.
2592#if LJ_HASFFI
2593 | lwz CTSTATE, DISPATCH_GL(ctype_state)(DISPATCH)
2594 | stw BASE, L->base
2595 | stw RB, L->top
2596 | stw L, CTSTATE->L
2597 | mr CARG1, CTSTATE
2598 | mr CARG2, RA
2599 | bl extern lj_ccallback_leave // (CTState *cts, TValue *o)
2600 | lwz CRET1, CTSTATE->cb.gpr[0]
2601 | lfd FARG1, CTSTATE->cb.fpr[0]
2602 | lwz CRET2, CTSTATE->cb.gpr[1]
2603 | b ->vm_leave_unw
2604#endif
2605 |
2530 |->vm_ffi_call: // Call C function via FFI. 2606 |->vm_ffi_call: // Call C function via FFI.
2531 | // Caveat: needs special frame unwinding, see below. 2607 | // Caveat: needs special frame unwinding, see below.
2532#if LJ_HASFFI 2608#if LJ_HASFFI