aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-09-13 21:26:27 +0200
committerMike Pall <mike>2010-09-13 21:26:27 +0200
commit0001916f8d85c6ce36cdf5f00fbc41529a9fef79 (patch)
tree5f76a459466131583fca0bcbcae6d7c0b7162770 /src
parent7a766c771d4562311e62477722cf41d86dba1950 (diff)
downloadluajit-0001916f8d85c6ce36cdf5f00fbc41529a9fef79.tar.gz
luajit-0001916f8d85c6ce36cdf5f00fbc41529a9fef79.tar.bz2
luajit-0001916f8d85c6ce36cdf5f00fbc41529a9fef79.zip
PPC: Add metamethod handlers for indexing instructions.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_ppc.dasc102
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 |