diff options
-rw-r--r-- | src/buildvm_ppc.dasc | 102 |
1 files changed, 94 insertions, 8 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index b3461b32..76374446 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -527,26 +527,112 @@ static void build_subroutines(BuildCtx *ctx) | |||
527 | |//-- Table indexing metamethods ----------------------------------------- | 527 | |//-- Table indexing metamethods ----------------------------------------- |
528 | | | 528 | | |
529 | |->vmeta_tgets1: | 529 | |->vmeta_tgets1: |
530 | | evmergelo STR:RC, TISSTR, STR:RC | ||
531 | | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) | ||
532 | | decode_RB8 RB, INS | ||
533 | | evstdd STR:RC, 0(CARG3) | ||
534 | | add CARG2, BASE, RB | ||
535 | | b >1 | ||
536 | | | ||
530 | |->vmeta_tgets: | 537 | |->vmeta_tgets: |
531 | | NYI | 538 | | evmergelo TAB:RB, TISTAB, TAB:RB |
539 | | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) | ||
540 | | evmergelo STR:RC, TISSTR, STR:RC | ||
541 | | evstdd TAB:RB, 0(CARG2) | ||
542 | | la CARG3, DISPATCH_GL(tmptv2)(DISPATCH) | ||
543 | | evstdd STR:RC, 0(CARG3) | ||
544 | | b >1 | ||
532 | | | 545 | | |
533 | |->vmeta_tgetb: | 546 | |->vmeta_tgetb: // TMP0 = index |
534 | | NYI | 547 | | efdcfsi TMP0, TMP0 |
548 | | decode_RB8 RB, INS | ||
549 | | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) | ||
550 | | add CARG2, BASE, RB | ||
551 | | evstdd TMP0, 0(CARG3) | ||
552 | | b >1 | ||
535 | | | 553 | | |
536 | |->vmeta_tgetv: | 554 | |->vmeta_tgetv: |
537 | | NYI | 555 | | decode_RB8 RB, INS |
556 | | decode_RC8 RC, INS | ||
557 | | add CARG2, BASE, RB | ||
558 | | add CARG3, BASE, RC | ||
559 | |1: | ||
560 | | stw BASE, L->base | ||
561 | | mr CARG1, L | ||
562 | | stw PC, SAVE_PC | ||
563 | | bl extern lj_meta_tget // (lua_State *L, TValue *o, TValue *k) | ||
564 | | // Returns TValue * (finished) or NULL (metamethod). | ||
565 | | cmplwi CRET1, 0 | ||
566 | | beq >3 | ||
567 | | evldd TMP0, 0(CRET1) | ||
568 | | evstddx TMP0, BASE, RA | ||
569 | | ins_next | ||
570 | | | ||
571 | |3: // Call __index metamethod. | ||
572 | | // BASE = base, L->top = new base, stack = cont/func/t/k | ||
573 | | subfic TMP1, BASE, FRAME_CONT | ||
574 | | lwz BASE, L->top | ||
575 | | stw PC, -16(BASE) // [cont|PC] | ||
576 | | add PC, TMP1, BASE | ||
577 | | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. | ||
578 | | li NARGS8:RC, 16 // 2 args for func(t, k). | ||
579 | | b ->vm_call_dispatch_f | ||
538 | | | 580 | | |
539 | |//----------------------------------------------------------------------- | 581 | |//----------------------------------------------------------------------- |
540 | | | 582 | | |
541 | |->vmeta_tsets1: | 583 | |->vmeta_tsets1: |
584 | | evmergelo STR:RC, TISSTR, STR:RC | ||
585 | | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) | ||
586 | | decode_RB8 RB, INS | ||
587 | | evstdd STR:RC, 0(CARG3) | ||
588 | | add CARG2, BASE, RB | ||
589 | | b >1 | ||
590 | | | ||
542 | |->vmeta_tsets: | 591 | |->vmeta_tsets: |
543 | | NYI | 592 | | evmergelo TAB:RB, TISTAB, TAB:RB |
593 | | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) | ||
594 | | evmergelo STR:RC, TISSTR, STR:RC | ||
595 | | evstdd TAB:RB, 0(CARG2) | ||
596 | | la CARG3, DISPATCH_GL(tmptv2)(DISPATCH) | ||
597 | | evstdd STR:RC, 0(CARG3) | ||
598 | | b >1 | ||
544 | | | 599 | | |
545 | |->vmeta_tsetb: | 600 | |->vmeta_tsetb: // TMP0 = index |
546 | | NYI | 601 | | efdcfsi TMP0, TMP0 |
602 | | decode_RB8 RB, INS | ||
603 | | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) | ||
604 | | add CARG2, BASE, RB | ||
605 | | evstdd TMP0, 0(CARG3) | ||
606 | | b >1 | ||
547 | | | 607 | | |
548 | |->vmeta_tsetv: | 608 | |->vmeta_tsetv: |
549 | | NYI | 609 | | decode_RB8 RB, INS |
610 | | decode_RC8 RC, INS | ||
611 | | add CARG2, BASE, RB | ||
612 | | add CARG3, BASE, RC | ||
613 | |1: | ||
614 | | stw BASE, L->base | ||
615 | | mr CARG1, L | ||
616 | | stw PC, SAVE_PC | ||
617 | | bl extern lj_meta_tset // (lua_State *L, TValue *o, TValue *k) | ||
618 | | // Returns TValue * (finished) or NULL (metamethod). | ||
619 | | cmplwi CRET1, 0 | ||
620 | | evlddx TMP0, BASE, RA | ||
621 | | beq >3 | ||
622 | | // NOBARRIER: lj_meta_tset ensures the table is not black. | ||
623 | | evstdd TMP0, 0(CRET1) | ||
624 | | ins_next | ||
625 | | | ||
626 | |3: // Call __newindex metamethod. | ||
627 | | // BASE = base, L->top = new base, stack = cont/func/t/k/(v) | ||
628 | | subfic TMP1, BASE, FRAME_CONT | ||
629 | | lwz BASE, L->top | ||
630 | | stw PC, -16(BASE) // [cont|PC] | ||
631 | | add PC, TMP1, BASE | ||
632 | | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. | ||
633 | | li NARGS8:RC, 24 // 3 args for func(t, k, v) | ||
634 | | evstdd TMP0, 16(BASE) // Copy value to third argument. | ||
635 | | b ->vm_call_dispatch_f | ||
550 | | | 636 | | |
551 | |//-- Comparison metamethods --------------------------------------------- | 637 | |//-- Comparison metamethods --------------------------------------------- |
552 | | | 638 | | |