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 | | |
