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