aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-04-08 02:57:22 +0200
committerMike Pall <mike>2011-04-08 02:57:22 +0200
commitb1912f33258dca7476d8c608204b24cbb46b6cb5 (patch)
tree28ac1b6d1508d99f86e42880b982b07867410630 /src
parentaee129a7898a422ebed288b4110657908de8fb23 (diff)
downloadluajit-b1912f33258dca7476d8c608204b24cbb46b6cb5.tar.gz
luajit-b1912f33258dca7476d8c608204b24cbb46b6cb5.tar.bz2
luajit-b1912f33258dca7476d8c608204b24cbb46b6cb5.zip
ARM: Add missing metamethod handlers and continuations.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_arm.dasc95
1 files changed, 84 insertions, 11 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc
index f24d8190..7b2d3ce7 100644
--- a/src/buildvm_arm.dasc
+++ b/src/buildvm_arm.dasc
@@ -443,7 +443,19 @@ static void build_subroutines(BuildCtx *ctx)
443 |//-- Continuation dispatch ---------------------------------------------- 443 |//-- Continuation dispatch ----------------------------------------------
444 | 444 |
445 |->cont_dispatch: 445 |->cont_dispatch:
446 | NYI 446 | // BASE = meta base, RA = resultptr, RC = (nresults+1)*8
447 | ldr LFUNC:CARG3, [RB, FRAME_FUNC]
448 | mov CARG4, BASE
449 | mov BASE, RB // Restore caller BASE.
450 | ldr PC, [CARG4, #-12] // Restore PC from [cont|PC].
451 | ldr CARG3, LFUNC:CARG3->field_pc
452 | mvn INS, #~LJ_TNIL
453 | add CARG2, RA, RC
454 | ldr CARG1, [CARG4, #-16] // Get continuation.
455 | str INS, [CARG2, #-4] // Ensure one valid arg.
456 | ldr KBASE, [CARG3, #PC2PROTO(k)]
457 | // BASE = base, RA = resultptr, CARG4 = meta base
458 | bx CARG1
447 | 459 |
448 |->cont_cat: 460 |->cont_cat:
449 | NYI 461 | NYI
@@ -561,22 +573,53 @@ static void build_subroutines(BuildCtx *ctx)
561 |//-- Comparison metamethods --------------------------------------------- 573 |//-- Comparison metamethods ---------------------------------------------
562 | 574 |
563 |->vmeta_comp: 575 |->vmeta_comp:
564 | NYI 576 | mov CARG1, L
565 | 577 | sub PC, PC, #4
578 | mov CARG2, RA
579 | str BASE, L->base
580 | mov CARG3, RC
581 | str PC, SAVE_PC
582 | decode_OP CARG4, INS
583 | bl extern lj_meta_comp // (lua_State *L, TValue *o1, *o2, int op)
584 | // Returns 0/1 or TValue * (metamethod).
585 |3:
586 | cmp CRET1, #1
587 | bhi ->vmeta_binop
588 |4:
589 | ldrh RB, [PC, #2]
590 | add PC, PC, #4
591 | add RB, PC, RB, lsl #2
592 | subhs PC, RB, #0x20000
566 |->cont_nop: 593 |->cont_nop:
567 | ins_next 594 | ins_next
568 | 595 |
569 |->cont_ra: // RA = resultptr 596 |->cont_ra: // RA = resultptr
570 | NYI 597 | ldr INS, [PC, #-4]
598 | ldrd CARG12, [RA]
599 | decode_RA8 CARG3, INS
600 | strd CARG12, [BASE, CARG3]
601 | b ->cont_nop
571 | 602 |
572 |->cont_condt: // RA = resultptr 603 |->cont_condt: // RA = resultptr
573 | NYI 604 | ldr CARG2, [RA, #4]
605 | mvn CARG1, #~LJ_TTRUE
606 | cmp CARG1, CARG2 // Branch if result is true.
607 | b <4
574 | 608 |
575 |->cont_condf: // RA = resultptr 609 |->cont_condf: // RA = resultptr
576 | NYI 610 | ldr CARG2, [RA, #4]
611 | checktp CARG2, LJ_TFALSE // Branch if result is false.
612 | b <4
577 | 613 |
578 |->vmeta_equal: 614 |->vmeta_equal:
579 | NYI 615 | // CARG2, CARG3, CARG4 are already set by BC_ISEQV/BC_ISNEV.
616 | sub PC, PC, #4
617 | str BASE, L->base
618 | mov CARG1, L
619 | str PC, SAVE_PC
620 | bl extern lj_meta_equal // (lua_State *L, GCobj *o1, *o2, int ne)
621 | // Returns 0/1 or TValue * (metamethod).
622 | b <3
580 | 623 |
581 |//-- Arithmetic metamethods --------------------------------------------- 624 |//-- Arithmetic metamethods ---------------------------------------------
582 | 625 |
@@ -619,18 +662,48 @@ static void build_subroutines(BuildCtx *ctx)
619 | // Call metamethod for binary op. 662 | // Call metamethod for binary op.
620 |->vmeta_binop: 663 |->vmeta_binop:
621 | // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2 664 | // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2
622 | NYI 665 | sub CARG2, CRET1, BASE
666 | str PC, [CRET1, #-12] // [cont|PC]
667 | add PC, CARG2, #FRAME_CONT
668 | mov BASE, CRET1
669 | mov NARGS8:RC, #16 // 2 args for func(o1, o2).
670 | b ->vm_call_dispatch
623 | 671 |
624 |->vmeta_len: 672 |->vmeta_len:
625 | NYI 673 | add CARG2, BASE, RC
674 | str BASE, L->base
675 | mov CARG1, L
676 | str PC, SAVE_PC
677 | bl extern lj_meta_len // (lua_State *L, TValue *o)
678 | // Returns TValue * (metamethod base).
679 | b ->vmeta_binop // Binop call for compatibility.
626 | 680 |
627 |//-- Call metamethod ---------------------------------------------------- 681 |//-- Call metamethod ----------------------------------------------------
628 | 682 |
629 |->vmeta_call: // Resolve and call __call metamethod. 683 |->vmeta_call: // Resolve and call __call metamethod.
630 | NYI 684 | // RB = old base, BASE = new base, RC = nargs*8
685 | mov CARG1, L
686 | str RB, L->base // This is the callers base!
687 | sub CARG2, BASE, #8
688 | str PC, SAVE_PC
689 | add CARG3, BASE, NARGS8:RC
690 | bl extern lj_meta_call // (lua_State *L, TValue *func, TValue *top)
691 | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] // Guaranteed to be a function here.
692 | add NARGS8:RC, NARGS8:RC, #8 // Got one more argument now.
693 | ins_call
631 | 694 |
632 |->vmeta_callt: // Resolve __call for BC_CALLT. 695 |->vmeta_callt: // Resolve __call for BC_CALLT.
633 | NYI 696 | // BASE = old base, RA = new base, RC = nargs*8
697 | mov CARG1, L
698 | str BASE, L->base
699 | sub CARG2, RA, #8
700 | str PC, SAVE_PC
701 | add CARG3, RA, NARGS8:RC
702 | bl extern lj_meta_call // (lua_State *L, TValue *func, TValue *top)
703 | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] // Guaranteed to be a function here.
704 | ldr PC, [BASE, FRAME_PC]
705 | add NARGS8:RC, NARGS8:RC, #8 // Got one more argument now.
706 | b ->BC_CALLT2_Z
634 | 707 |
635 |//-- Argument coercion for 'for' statement ------------------------------ 708 |//-- Argument coercion for 'for' statement ------------------------------
636 | 709 |