diff options
| author | Mike Pall <mike> | 2011-04-08 02:42:04 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-04-08 02:42:04 +0200 |
| commit | 1f4f805c9692a13d259d30d728e6748526f543d3 (patch) | |
| tree | ec12a038782c982e5e3c65ca87131bafabd90399 /src | |
| parent | 0046f955eb42125e5c1ddd485d1ee86f1e6a2208 (diff) | |
| download | luajit-1f4f805c9692a13d259d30d728e6748526f543d3.tar.gz luajit-1f4f805c9692a13d259d30d728e6748526f543d3.tar.bz2 luajit-1f4f805c9692a13d259d30d728e6748526f543d3.zip | |
ARM: Add getmetatable(), setmetatable() and tonumber() fast functions.
Diffstat (limited to 'src')
| -rw-r--r-- | src/buildvm_arm.dasc | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc index 81b03fea..bd121561 100644 --- a/src/buildvm_arm.dasc +++ b/src/buildvm_arm.dasc | |||
| @@ -723,18 +723,72 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 723 | |//-- Base library: getters and setters --------------------------------- | 723 | |//-- Base library: getters and setters --------------------------------- |
| 724 | | | 724 | | |
| 725 | |.ffunc_1 getmetatable | 725 | |.ffunc_1 getmetatable |
| 726 | | NYI | 726 | | checktp CARG2, LJ_TTAB |
| 727 | | cmnne CARG2, #-LJ_TUDATA | ||
| 728 | | bne >6 | ||
| 729 | |1: // Field metatable must be at same offset for GCtab and GCudata! | ||
| 730 | | ldr TAB:RB, TAB:CARG1->metatable | ||
| 731 | |2: | ||
| 732 | | mvn CARG2, #~LJ_TNIL | ||
| 733 | | ldr STR:RC, [DISPATCH, #DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])] | ||
| 734 | | cmp TAB:RB, #0 | ||
| 735 | | beq ->fff_restv | ||
| 736 | | ldr CARG3, TAB:RB->hmask | ||
| 737 | | ldr CARG4, STR:RC->hash | ||
| 738 | | ldr NODE:INS, TAB:RB->node | ||
| 739 | | and CARG3, CARG3, CARG4 // idx = str->hash & tab->hmask | ||
| 740 | | add CARG3, CARG3, CARG3, lsl #1 | ||
| 741 | | add NODE:INS, NODE:INS, CARG3, lsl #3 // node = tab->node + idx*3*8 | ||
| 742 | |3: // Rearranged logic, because we expect _not_ to find the key. | ||
| 743 | | ldrd CARG34, NODE:INS->key // STALL: early NODE:INS. | ||
| 744 | | ldrd CARG12, NODE:INS->val | ||
| 745 | | ldr NODE:INS, NODE:INS->next | ||
| 746 | | cmp CARG3, STR:RC | ||
| 747 | | checktpeq CARG4, LJ_TSTR | ||
| 748 | | beq >5 | ||
| 749 | | cmp NODE:INS, #0 | ||
| 750 | | bne <3 | ||
| 751 | |4: | ||
| 752 | | mov CARG1, RB // Use metatable as default result. | ||
| 753 | | mvn CARG2, #~LJ_TTAB | ||
| 754 | | b ->fff_restv | ||
| 755 | |5: | ||
| 756 | | checktp CARG2, LJ_TNIL | ||
| 757 | | bne ->fff_restv | ||
| 758 | | b <4 | ||
| 759 | | | ||
| 760 | |6: | ||
| 761 | | checktp CARG2, LJ_TISNUM | ||
| 762 | | mvnhs CARG2, CARG2 | ||
| 763 | | movlo CARG2, #~LJ_TISNUM | ||
| 764 | | add CARG4, DISPATCH, CARG2, lsl #2 | ||
| 765 | | ldr TAB:RB, [CARG4, #DISPATCH_GL(gcroot[GCROOT_BASEMT])] | ||
| 766 | | b <2 | ||
| 727 | | | 767 | | |
| 728 | |.ffunc_2 setmetatable | 768 | |.ffunc_2 setmetatable |
| 729 | | NYI | 769 | | // Fast path: no mt for table yet and not clearing the mt. |
| 770 | | checktp CARG2, LJ_TTAB | ||
| 771 | | ldreq TAB:RB, TAB:CARG1->metatable | ||
| 772 | | checktpeq CARG4, LJ_TTAB | ||
| 773 | | ldrbeq CARG4, TAB:CARG1->marked | ||
| 774 | | cmpeq TAB:RB, #0 | ||
| 775 | | bne ->fff_fallback | ||
| 776 | | tst CARG4, #LJ_GC_BLACK // isblack(table) | ||
| 777 | | str TAB:CARG3, TAB:CARG1->metatable | ||
| 778 | | beq ->fff_restv | ||
| 779 | | barrierback TAB:CARG1, CARG4, CARG3 | ||
| 780 | | b ->fff_restv | ||
| 730 | | | 781 | | |
| 731 | |.ffunc rawget | 782 | |.ffunc rawget |
| 732 | | NYI | 783 | | NYI |
| 733 | | | 784 | | |
| 734 | |//-- Base library: conversions ------------------------------------------ | 785 | |//-- Base library: conversions ------------------------------------------ |
| 735 | | | 786 | | |
| 736 | |.ffunc tonumber | 787 | |.ffunc_1 tonumber |
| 737 | | NYI | 788 | | // Only handles the number case inline (without a base argument). |
| 789 | | checktp CARG2, LJ_TISNUM | ||
| 790 | | bls ->fff_restv | ||
| 791 | | b ->fff_fallback | ||
| 738 | | | 792 | | |
| 739 | |.ffunc_1 tostring | 793 | |.ffunc_1 tostring |
| 740 | | // Only handles the string or number case inline. | 794 | | // Only handles the string or number case inline. |
