summaryrefslogtreecommitdiff
path: root/src/buildvm_ppc.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildvm_ppc.dasc')
-rw-r--r--src/buildvm_ppc.dasc103
1 files changed, 91 insertions, 12 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc
index 90163e9d..892dccbf 100644
--- a/src/buildvm_ppc.dasc
+++ b/src/buildvm_ppc.dasc
@@ -2382,7 +2382,62 @@ static void build_subroutines(BuildCtx *ctx)
2382 | 2382 |
2383 |->vm_ffi_call: 2383 |->vm_ffi_call:
2384#if LJ_HASFFI 2384#if LJ_HASFFI
2385 | NYI 2385 | .type CCSTATE, CCallState, CARG1
2386 | lwz TMP1, CCSTATE->spadj
2387 | mflr TMP0
2388 | lbz CARG2, CCSTATE->nsp
2389 | lbz CARG3, CCSTATE->nfpr
2390 | neg TMP1, TMP1
2391 | stw TMP0, 4(sp)
2392 | cmpwi cr1, CARG3, 0
2393 | mr TMP2, sp
2394 | addic. CARG2, CARG2, -1
2395 | stwux sp, sp, TMP1
2396 | crnot 4*cr1+eq, 4*cr1+eq // For vararg calls.
2397 | stw CCSTATE, -4(TMP2)
2398 | li TMP3, 0
2399 | la TMP1, CCSTATE->stack
2400 | slwi CARG2, CARG2, 2
2401 | blt >2
2402 | la TMP2, 8(sp)
2403 |1:
2404 | lwzx TMP0, TMP1, CARG2
2405 | stwx TMP0, TMP2, CARG2
2406 | addic. CARG2, CARG2, -4
2407 | bge <1
2408 |2:
2409 | bne cr1, >3
2410 | lfd f1, CCSTATE->fpr[0]
2411 | lfd f2, CCSTATE->fpr[1]
2412 | lfd f3, CCSTATE->fpr[2]
2413 | lfd f4, CCSTATE->fpr[3]
2414 | lfd f5, CCSTATE->fpr[4]
2415 | lfd f6, CCSTATE->fpr[5]
2416 | lfd f7, CCSTATE->fpr[6]
2417 | lfd f8, CCSTATE->fpr[7]
2418 |3:
2419 | lwz TMP0, CCSTATE->func
2420 | lwz CARG2, CCSTATE->gpr[1]
2421 | lwz CARG3, CCSTATE->gpr[2]
2422 | lwz CARG4, CCSTATE->gpr[3]
2423 | lwz CARG5, CCSTATE->gpr[4]
2424 | mtctr TMP0
2425 | lwz r8, CCSTATE->gpr[5]
2426 | lwz r9, CCSTATE->gpr[6]
2427 | lwz r10, CCSTATE->gpr[7]
2428 | lwz CARG1, CCSTATE->gpr[0] // Do this last, since CCSTATE is CARG1.
2429 | bctrl
2430 | lwz TMP2, 0(sp)
2431 | lwz CCSTATE:TMP1, -4(TMP2)
2432 | lwz TMP0, 4(TMP2)
2433 | stw CARG1, CCSTATE:TMP1->gpr[0]
2434 | stfd FARG1, CCSTATE:TMP1->fpr[0]
2435 | stw CARG2, CCSTATE:TMP1->gpr[1]
2436 | mtlr TMP0
2437 | stw CARG3, CCSTATE:TMP1->gpr[2]
2438 | mr sp, TMP2
2439 | stw CARG4, CCSTATE:TMP1->gpr[3]
2440 | blr
2386#endif 2441#endif
2387 | 2442 |
2388 |//----------------------------------------------------------------------- 2443 |//-----------------------------------------------------------------------
@@ -2440,7 +2495,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2440 | tonum_i f1, CARG3 2495 | tonum_i f1, CARG3
2441 | b >5 2496 | b >5
2442 | 2497 |
2443 |8: // RA is an integer, RD is a number. 2498 |8: // RA is an integer, RD is not an integer.
2499 | bgt cr1, ->vmeta_comp
2500 | // RA is an integer, RD is a number.
2444 | tonum_i f0, CARG2 2501 | tonum_i f0, CARG2
2445 |4: 2502 |4:
2446 | lfd f1, 0(RD) 2503 | lfd f1, 0(RD)
@@ -2498,9 +2555,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2498 | lwz CARG2, 4(RA) 2555 | lwz CARG2, 4(RA)
2499 | lwzux TMP1, RD, BASE 2556 | lwzux TMP1, RD, BASE
2500 | checknum cr0, TMP0 2557 | checknum cr0, TMP0
2501 | lwz INS, -4(PC) 2558 | lwz TMP2, -4(PC)
2502 | checknum cr1, TMP1 2559 | checknum cr1, TMP1
2503 | decode_RD4 TMP2, INS 2560 | decode_RD4 TMP2, TMP2
2504 | lwz CARG3, 4(RD) 2561 | lwz CARG3, 4(RD)
2505 | cror 4*cr7+gt, 4*cr0+gt, 4*cr1+gt 2562 | cror 4*cr7+gt, 4*cr0+gt, 4*cr1+gt
2506 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) 2563 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
@@ -2538,10 +2595,20 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2538 | lwz CARG2, 4(RA) 2595 | lwz CARG2, 4(RA)
2539 | lwz CARG3, 4(RD) 2596 | lwz CARG3, 4(RD)
2540 } 2597 }
2598 if (LJ_HASFFI) {
2599 | cmpwi cr7, TMP0, LJ_TCDATA
2600 | cmpwi cr5, TMP1, LJ_TCDATA
2601 }
2541 | not TMP3, TMP0 2602 | not TMP3, TMP0
2542 | cmplw TMP0, TMP1 2603 | cmplw TMP0, TMP1
2543 | cmplwi cr1, TMP3, ~LJ_TISPRI // Primitive? 2604 | cmplwi cr1, TMP3, ~LJ_TISPRI // Primitive?
2605 if (LJ_HASFFI) {
2606 | cror 4*cr7+eq, 4*cr7+eq, 4*cr5+eq
2607 }
2544 | cmplwi cr6, TMP3, ~LJ_TISTABUD // Table or userdata? 2608 | cmplwi cr6, TMP3, ~LJ_TISTABUD // Table or userdata?
2609 if (LJ_HASFFI) {
2610 | beq cr7, ->vmeta_equal_cd
2611 }
2545 | cmplw cr5, CARG2, CARG3 2612 | cmplw cr5, CARG2, CARG3
2546 | crandc 4*cr0+gt, 4*cr0+eq, 4*cr1+gt // 2: Same type and primitive. 2613 | crandc 4*cr0+gt, 4*cr0+eq, 4*cr1+gt // 2: Same type and primitive.
2547 | crorc 4*cr0+lt, 4*cr5+eq, 4*cr0+eq // 1: Same tv or different type. 2614 | crorc 4*cr0+lt, 4*cr5+eq, 4*cr0+eq // 1: Same tv or different type.
@@ -2587,14 +2654,20 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2587 | lwzux TMP0, RA, BASE 2654 | lwzux TMP0, RA, BASE
2588 | srwi RD, RD, 1 2655 | srwi RD, RD, 1
2589 | lwz STR:TMP3, 4(RA) 2656 | lwz STR:TMP3, 4(RA)
2590 | lwz INS, 0(PC) 2657 | lwz TMP2, 0(PC)
2591 | subfic RD, RD, -4 2658 | subfic RD, RD, -4
2592 | addi PC, PC, 4 2659 | addi PC, PC, 4
2660 if (LJ_HASFFI) {
2661 | cmpwi TMP0, LJ_TCDATA
2662 }
2593 | lwzx STR:TMP1, KBASE, RD // KBASE-4-str_const*4 2663 | lwzx STR:TMP1, KBASE, RD // KBASE-4-str_const*4
2594 | subfic TMP0, TMP0, LJ_TSTR 2664 | subfic TMP0, TMP0, LJ_TSTR
2665 if (LJ_HASFFI) {
2666 | beq ->vmeta_equal_cd
2667 }
2595 | sub TMP1, STR:TMP1, STR:TMP3 2668 | sub TMP1, STR:TMP1, STR:TMP3
2596 | or TMP0, TMP0, TMP1 2669 | or TMP0, TMP0, TMP1
2597 | decode_RD4 TMP2, INS 2670 | decode_RD4 TMP2, TMP2
2598 | subfic TMP0, TMP0, 0 2671 | subfic TMP0, TMP0, 0
2599 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) 2672 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
2600 | subfe TMP1, TMP1, TMP1 2673 | subfe TMP1, TMP1, TMP1
@@ -2616,9 +2689,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2616 | lwz CARG2, 4(RA) 2689 | lwz CARG2, 4(RA)
2617 | lwzux TMP1, RD, KBASE 2690 | lwzux TMP1, RD, KBASE
2618 | checknum cr0, TMP0 2691 | checknum cr0, TMP0
2619 | lwz INS, -4(PC) 2692 | lwz TMP2, -4(PC)
2620 | checknum cr1, TMP1 2693 | checknum cr1, TMP1
2621 | decode_RD4 TMP2, INS 2694 | decode_RD4 TMP2, TMP2
2622 | lwz CARG3, 4(RD) 2695 | lwz CARG3, 4(RD)
2623 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) 2696 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
2624 if (vk) { 2697 if (vk) {
@@ -2639,9 +2712,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2639 | lwzx TMP0, BASE, RA 2712 | lwzx TMP0, BASE, RA
2640 | addi PC, PC, 4 2713 | addi PC, PC, 4
2641 | lfdx f0, BASE, RA 2714 | lfdx f0, BASE, RA
2642 | lwz INS, -4(PC) 2715 | lwz TMP2, -4(PC)
2643 | lfdx f1, KBASE, RD 2716 | lfdx f1, KBASE, RD
2644 | decode_RD4 TMP2, INS 2717 | decode_RD4 TMP2, TMP2
2645 | checknum TMP0 2718 | checknum TMP0
2646 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) 2719 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
2647 | bge >3 2720 | bge >3
@@ -2695,11 +2768,17 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2695 | // RA = src*8, RD = primitive_type*8 (~), JMP with RD = target 2768 | // RA = src*8, RD = primitive_type*8 (~), JMP with RD = target
2696 | lwzx TMP0, BASE, RA 2769 | lwzx TMP0, BASE, RA
2697 | srwi TMP1, RD, 3 2770 | srwi TMP1, RD, 3
2698 | lwz INS, 0(PC) 2771 | lwz TMP2, 0(PC)
2699 | not TMP1, TMP1 2772 | not TMP1, TMP1
2700 | addi PC, PC, 4 2773 | addi PC, PC, 4
2774 if (LJ_HASFFI) {
2775 | cmpwi TMP0, LJ_TCDATA
2776 }
2701 | sub TMP0, TMP0, TMP1 2777 | sub TMP0, TMP0, TMP1
2702 | decode_RD4 TMP2, INS 2778 if (LJ_HASFFI) {
2779 | beq ->vmeta_equal_cd
2780 }
2781 | decode_RD4 TMP2, TMP2
2703 | addic TMP0, TMP0, -1 2782 | addic TMP0, TMP0, -1
2704 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) 2783 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16)
2705 | subfe TMP1, TMP1, TMP1 2784 | subfe TMP1, TMP1, TMP1