diff options
Diffstat (limited to '')
-rw-r--r-- | src/buildvm_ppc.dasc | 92 |
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 |