diff options
author | Mike Pall <mike> | 2011-04-08 02:57:22 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-04-08 02:57:22 +0200 |
commit | b1912f33258dca7476d8c608204b24cbb46b6cb5 (patch) | |
tree | 28ac1b6d1508d99f86e42880b982b07867410630 /src | |
parent | aee129a7898a422ebed288b4110657908de8fb23 (diff) | |
download | luajit-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.dasc | 95 |
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 | | |