diff options
author | Mike Pall <mike> | 2010-09-11 01:47:49 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-09-11 01:47:49 +0200 |
commit | cabcce1e1dad5f1d45427c435e33901d45c19de8 (patch) | |
tree | 849fc7a9f07d6136850cc9400d50a3b4f44f0a9e /src | |
parent | e15e4c4d95944da45092b4499b5f0e4d63f6bd01 (diff) | |
download | luajit-cabcce1e1dad5f1d45427c435e33901d45c19de8.tar.gz luajit-cabcce1e1dad5f1d45427c435e33901d45c19de8.tar.bz2 luajit-cabcce1e1dad5f1d45427c435e33901d45c19de8.zip |
PPC: Add metamethod handlers for arithmetic instructions.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_ppc.dasc | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 6a13cace..51b592f1 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -554,22 +554,52 @@ static void build_subroutines(BuildCtx *ctx) | |||
554 | |//-- Arithmetic metamethods --------------------------------------------- | 554 | |//-- Arithmetic metamethods --------------------------------------------- |
555 | | | 555 | | |
556 | |->vmeta_arith_vn: | 556 | |->vmeta_arith_vn: |
557 | | NYI | 557 | | add CARG3, BASE, RB |
558 | | add CARG4, KBASE, RC | ||
559 | | b >1 | ||
558 | | | 560 | | |
559 | |->vmeta_arith_nv: | 561 | |->vmeta_arith_nv: |
560 | | NYI | 562 | | add CARG3, KBASE, RC |
563 | | add CARG4, BASE, RB | ||
564 | | b >1 | ||
561 | | | 565 | | |
562 | |->vmeta_unm: | 566 | |->vmeta_unm: |
563 | | NYI | 567 | | add CARG3, BASE, RD |
568 | | mr CARG4, CARG3 | ||
569 | | b >1 | ||
564 | | | 570 | | |
565 | |->vmeta_arith_vv: | 571 | |->vmeta_arith_vv: |
566 | | NYI | 572 | | add CARG3, BASE, RB |
573 | | add CARG4, BASE, RC | ||
574 | |1: | ||
575 | | add CARG2, BASE, RA | ||
576 | | stw BASE, L->base | ||
577 | | mr CARG1, L | ||
578 | | stw PC, SAVE_PC | ||
579 | | decode_OP1 CARG5, INS // Caveat: CARG5 overlaps INS. | ||
580 | | bl extern lj_meta_arith // (lua_State *L, TValue *ra,*rb,*rc, BCReg op) | ||
581 | | // Returns NULL (finished) or TValue * (metamethod). | ||
582 | | cmplwi CRET1, 0 | ||
583 | | beq ->cont_nop | ||
567 | | | 584 | | |
585 | | // Call metamethod for binary op. | ||
568 | |->vmeta_binop: | 586 | |->vmeta_binop: |
569 | | NYI | 587 | | // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2 |
588 | | sub TMP1, CRET1, BASE | ||
589 | | stw PC, -16(CRET1) // [cont|PC] | ||
590 | | addi PC, TMP1, FRAME_CONT | ||
591 | | mr BASE, CRET1 | ||
592 | | li NARGS8:RC, 16 // 2 args for func(o1, o2). | ||
593 | | b ->vm_call_dispatch | ||
570 | | | 594 | | |
571 | |->vmeta_len: | 595 | |->vmeta_len: |
572 | | NYI | 596 | | add CARG2, BASE, RD |
597 | | stw BASE, L->base | ||
598 | | mr CARG1, L | ||
599 | | stw PC, SAVE_PC | ||
600 | | bl extern lj_meta_len // (lua_State *L, TValue *o) | ||
601 | | // Returns TValue * (metamethod base). | ||
602 | | b ->vmeta_binop // Binop call for compatibility. | ||
573 | | | 603 | | |
574 | |//-- Call metamethod ---------------------------------------------------- | 604 | |//-- Call metamethod ---------------------------------------------------- |
575 | | | 605 | | |