diff options
| author | Mike Pall <mike> | 2010-09-13 21:26:27 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2010-09-13 21:26:27 +0200 |
| commit | 0001916f8d85c6ce36cdf5f00fbc41529a9fef79 (patch) | |
| tree | 5f76a459466131583fca0bcbcae6d7c0b7162770 | |
| parent | 7a766c771d4562311e62477722cf41d86dba1950 (diff) | |
| download | luajit-0001916f8d85c6ce36cdf5f00fbc41529a9fef79.tar.gz luajit-0001916f8d85c6ce36cdf5f00fbc41529a9fef79.tar.bz2 luajit-0001916f8d85c6ce36cdf5f00fbc41529a9fef79.zip | |
PPC: Add metamethod handlers for indexing instructions.
| -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 | | |
