diff options
Diffstat (limited to 'src/vm_mips.dasc')
-rw-r--r-- | src/vm_mips.dasc | 164 |
1 files changed, 128 insertions, 36 deletions
diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc index a81dbeeb..53000411 100644 --- a/src/vm_mips.dasc +++ b/src/vm_mips.dasc | |||
@@ -688,6 +688,16 @@ static void build_subroutines(BuildCtx *ctx) | |||
688 | | b ->vm_call_dispatch_f | 688 | | b ->vm_call_dispatch_f |
689 | |. li NARGS8:RC, 16 // 2 args for func(t, k). | 689 | |. li NARGS8:RC, 16 // 2 args for func(t, k). |
690 | | | 690 | | |
691 | |->vmeta_tgetr: | ||
692 | | load_got lj_tab_getinth | ||
693 | | call_intern lj_tab_getinth // (GCtab *t, int32_t key) | ||
694 | |. nop | ||
695 | | // Returns cTValue * or NULL. | ||
696 | | beqz CRET1, >1 | ||
697 | |. nop | ||
698 | | b ->BC_TGETR_Z | ||
699 | |. ldc1 f0, 0(CRET1) | ||
700 | | | ||
691 | |//----------------------------------------------------------------------- | 701 | |//----------------------------------------------------------------------- |
692 | | | 702 | | |
693 | |->vmeta_tsets1: | 703 | |->vmeta_tsets1: |
@@ -740,6 +750,16 @@ static void build_subroutines(BuildCtx *ctx) | |||
740 | | b ->vm_call_dispatch_f | 750 | | b ->vm_call_dispatch_f |
741 | |. li NARGS8:RC, 24 // 3 args for func(t, k, v) | 751 | |. li NARGS8:RC, 24 // 3 args for func(t, k, v) |
742 | | | 752 | | |
753 | |->vmeta_tsetr: | ||
754 | | load_got lj_tab_setinth | ||
755 | | sw BASE, L->base | ||
756 | | sw PC, SAVE_PC | ||
757 | | call_intern lj_tab_setinth // (lua_State *L, GCtab *t, int32_t key) | ||
758 | |. move CARG1, L | ||
759 | | // Returns TValue *. | ||
760 | | b ->BC_TSETR_Z | ||
761 | |. nop | ||
762 | | | ||
743 | |//-- Comparison metamethods --------------------------------------------- | 763 | |//-- Comparison metamethods --------------------------------------------- |
744 | | | 764 | | |
745 | |->vmeta_comp: | 765 | |->vmeta_comp: |
@@ -813,6 +833,18 @@ static void build_subroutines(BuildCtx *ctx) | |||
813 | |. nop | 833 | |. nop |
814 | |.endif | 834 | |.endif |
815 | | | 835 | | |
836 | |->vmeta_istype: | ||
837 | | load_got lj_meta_istype | ||
838 | | addiu PC, PC, -4 | ||
839 | | sw BASE, L->base | ||
840 | | srl CARG2, RA, 3 | ||
841 | | srl CARG3, RD, 3 | ||
842 | | sw PC, SAVE_PC | ||
843 | | call_intern lj_meta_istype // (lua_State *L, BCReg ra, BCReg tp) | ||
844 | |. move CARG1, L | ||
845 | | b ->cont_nop | ||
846 | |. nop | ||
847 | | | ||
816 | |//-- Arithmetic metamethods --------------------------------------------- | 848 | |//-- Arithmetic metamethods --------------------------------------------- |
817 | | | 849 | | |
818 | |->vmeta_unm: | 850 | |->vmeta_unm: |
@@ -1188,7 +1220,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
1188 | | mtc1 TMP0, FARG1 | 1220 | | mtc1 TMP0, FARG1 |
1189 | | beqz AT, ->fff_fallback | 1221 | | beqz AT, ->fff_fallback |
1190 | |. lw PC, FRAME_PC(BASE) | 1222 | |. lw PC, FRAME_PC(BASE) |
1191 | | cvt.w.d FRET1, FARG2 | 1223 | | trunc.w.d FRET1, FARG2 |
1192 | | cvt.d.w FARG1, FARG1 | 1224 | | cvt.d.w FARG1, FARG1 |
1193 | | lw TMP0, TAB:CARG1->asize | 1225 | | lw TMP0, TAB:CARG1->asize |
1194 | | lw TMP1, TAB:CARG1->array | 1226 | | lw TMP1, TAB:CARG1->array |
@@ -1521,14 +1553,8 @@ static void build_subroutines(BuildCtx *ctx) | |||
1521 | | b ->fff_resn | 1553 | | b ->fff_resn |
1522 | |. nop | 1554 | |. nop |
1523 | | | 1555 | | |
1524 | |->ff_math_deg: | ||
1525 | |.ffunc_n math_rad | ||
1526 | |. ldc1 FARG2, CFUNC:RB->upvalue[0] | ||
1527 | | b ->fff_resn | ||
1528 | |. mul.d FRET1, FARG1, FARG2 | ||
1529 | | | ||
1530 | |.ffunc_nn math_ldexp | 1556 | |.ffunc_nn math_ldexp |
1531 | | cvt.w.d FARG2, FARG2 | 1557 | | trunc.w.d FARG2, FARG2 |
1532 | | load_got ldexp | 1558 | | load_got ldexp |
1533 | | mfc1 CARG3, FARG2 | 1559 | | mfc1 CARG3, FARG2 |
1534 | | call_extern | 1560 | | call_extern |
@@ -1628,7 +1654,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
1628 | |. sltiu AT, CARG3, LJ_TISNUM | 1654 | |. sltiu AT, CARG3, LJ_TISNUM |
1629 | | beqz AT, ->fff_fallback | 1655 | | beqz AT, ->fff_fallback |
1630 | |. li CARG3, 1 | 1656 | |. li CARG3, 1 |
1631 | | cvt.w.d FARG1, FARG1 | 1657 | | trunc.w.d FARG1, FARG1 |
1632 | | addiu CARG2, sp, ARG5_OFS | 1658 | | addiu CARG2, sp, ARG5_OFS |
1633 | | sltiu AT, TMP0, 256 | 1659 | | sltiu AT, TMP0, 256 |
1634 | | mfc1 TMP0, FARG1 | 1660 | | mfc1 TMP0, FARG1 |
@@ -1658,7 +1684,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
1658 | | ldc1 f2, 8(BASE) | 1684 | | ldc1 f2, 8(BASE) |
1659 | | beqz AT, >1 | 1685 | | beqz AT, >1 |
1660 | |. li CARG4, -1 | 1686 | |. li CARG4, -1 |
1661 | | cvt.w.d f0, f0 | 1687 | | trunc.w.d f0, f0 |
1662 | | sltiu AT, CARG3, LJ_TISNUM | 1688 | | sltiu AT, CARG3, LJ_TISNUM |
1663 | | beqz AT, ->fff_fallback | 1689 | | beqz AT, ->fff_fallback |
1664 | |. mfc1 CARG4, f0 | 1690 | |. mfc1 CARG4, f0 |
@@ -1666,7 +1692,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
1666 | | sltiu AT, CARG2, LJ_TISNUM | 1692 | | sltiu AT, CARG2, LJ_TISNUM |
1667 | | beqz AT, ->fff_fallback | 1693 | | beqz AT, ->fff_fallback |
1668 | |. li AT, LJ_TSTR | 1694 | |. li AT, LJ_TSTR |
1669 | | cvt.w.d f2, f2 | 1695 | | trunc.w.d f2, f2 |
1670 | | bne TMP0, AT, ->fff_fallback | 1696 | | bne TMP0, AT, ->fff_fallback |
1671 | |. lw CARG2, STR:CARG1->len | 1697 | |. lw CARG2, STR:CARG1->len |
1672 | | mfc1 CARG3, f2 | 1698 | | mfc1 CARG3, f2 |
@@ -1706,18 +1732,19 @@ static void build_subroutines(BuildCtx *ctx) | |||
1706 | | or AT, AT, TMP0 | 1732 | | or AT, AT, TMP0 |
1707 | | bnez AT, ->fff_fallback | 1733 | | bnez AT, ->fff_fallback |
1708 | |. sltiu AT, CARG4, LJ_TISNUM | 1734 | |. sltiu AT, CARG4, LJ_TISNUM |
1709 | | cvt.w.d f0, f0 | 1735 | | trunc.w.d f0, f0 |
1710 | | beqz AT, ->fff_fallback | 1736 | | beqz AT, ->fff_fallback |
1711 | |. lw TMP0, STR:CARG1->len | 1737 | |. lw TMP0, STR:CARG1->len |
1712 | | mfc1 CARG3, f0 | 1738 | | mfc1 CARG3, f0 |
1713 | | lw TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) | 1739 | | lw CARG2, DISPATCH_GL(tmpbuf.b)(DISPATCH) |
1740 | | lw TMP1, DISPATCH_GL(tmpbuf.e)(DISPATCH) | ||
1714 | | li AT, 1 | 1741 | | li AT, 1 |
1715 | | blez CARG3, ->fff_emptystr // Count <= 0? | 1742 | | blez CARG3, ->fff_emptystr // Count <= 0? |
1716 | |. sltu AT, AT, TMP0 | 1743 | |. sltu AT, AT, TMP0 |
1717 | | beqz TMP0, ->fff_emptystr // Zero length string? | 1744 | | beqz TMP0, ->fff_emptystr // Zero length string? |
1718 | |. sltu TMP0, TMP1, CARG3 | 1745 | |. addu TMP3, CARG2, CARG3 |
1746 | | sltu TMP0, TMP1, TMP3 | ||
1719 | | or AT, AT, TMP0 | 1747 | | or AT, AT, TMP0 |
1720 | | lw CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) | ||
1721 | | bnez AT, ->fff_fallback // Fallback for > 1-char strings. | 1748 | | bnez AT, ->fff_fallback // Fallback for > 1-char strings. |
1722 | |. lbu TMP0, STR:CARG1[1] | 1749 | |. lbu TMP0, STR:CARG1[1] |
1723 | | addu TMP2, CARG2, CARG3 | 1750 | | addu TMP2, CARG2, CARG3 |
@@ -1736,14 +1763,14 @@ static void build_subroutines(BuildCtx *ctx) | |||
1736 | | beqz NARGS8:RC, ->fff_fallback | 1763 | | beqz NARGS8:RC, ->fff_fallback |
1737 | |. li AT, LJ_TSTR | 1764 | |. li AT, LJ_TSTR |
1738 | | bne CARG3, AT, ->fff_fallback | 1765 | | bne CARG3, AT, ->fff_fallback |
1739 | |. lw TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) | 1766 | |. lw CARG2, DISPATCH_GL(tmpbuf.b)(DISPATCH) |
1740 | | lw CARG3, STR:CARG1->len | 1767 | | lw CARG3, STR:CARG1->len |
1768 | | lw TMP1, DISPATCH_GL(tmpbuf.e)(DISPATCH) | ||
1741 | | addiu CARG1, STR:CARG1, #STR | 1769 | | addiu CARG1, STR:CARG1, #STR |
1742 | | lw CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) | 1770 | | addu CARG4, CARG2, CARG3 |
1743 | | sltu AT, TMP1, CARG3 | 1771 | | sltu AT, TMP1, CARG4 |
1744 | | bnez AT, ->fff_fallback | 1772 | | bnez AT, ->fff_fallback |
1745 | |. addu TMP3, CARG1, CARG3 | 1773 | |. addu TMP3, CARG1, CARG3 |
1746 | | addu CARG4, CARG2, CARG3 | ||
1747 | |1: // Reverse string copy. | 1774 | |1: // Reverse string copy. |
1748 | | lbu TMP1, 0(CARG1) | 1775 | | lbu TMP1, 0(CARG1) |
1749 | | sltu AT, CARG1, TMP3 | 1776 | | sltu AT, CARG1, TMP3 |
@@ -1761,11 +1788,12 @@ static void build_subroutines(BuildCtx *ctx) | |||
1761 | | beqz NARGS8:RC, ->fff_fallback | 1788 | | beqz NARGS8:RC, ->fff_fallback |
1762 | |. li AT, LJ_TSTR | 1789 | |. li AT, LJ_TSTR |
1763 | | bne CARG3, AT, ->fff_fallback | 1790 | | bne CARG3, AT, ->fff_fallback |
1764 | |. lw TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) | 1791 | |. lw CARG2, DISPATCH_GL(tmpbuf.b)(DISPATCH) |
1765 | | lw CARG3, STR:CARG1->len | 1792 | | lw CARG3, STR:CARG1->len |
1793 | | lw TMP1, DISPATCH_GL(tmpbuf.e)(DISPATCH) | ||
1766 | | addiu CARG1, STR:CARG1, #STR | 1794 | | addiu CARG1, STR:CARG1, #STR |
1767 | | lw CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) | 1795 | | addu TMP3, CARG2, CARG3 |
1768 | | sltu AT, TMP1, CARG3 | 1796 | | sltu AT, TMP1, TMP3 |
1769 | | bnez AT, ->fff_fallback | 1797 | | bnez AT, ->fff_fallback |
1770 | |. addu TMP3, CARG1, CARG3 | 1798 | |. addu TMP3, CARG1, CARG3 |
1771 | | move CARG4, CARG2 | 1799 | | move CARG4, CARG2 |
@@ -1786,18 +1814,6 @@ static void build_subroutines(BuildCtx *ctx) | |||
1786 | |ffstring_case string_lower, 65 | 1814 | |ffstring_case string_lower, 65 |
1787 | |ffstring_case string_upper, 97 | 1815 | |ffstring_case string_upper, 97 |
1788 | | | 1816 | | |
1789 | |//-- Table library ------------------------------------------------------ | ||
1790 | | | ||
1791 | |.ffunc_1 table_getn | ||
1792 | | li AT, LJ_TTAB | ||
1793 | | bne CARG3, AT, ->fff_fallback | ||
1794 | |. load_got lj_tab_len | ||
1795 | | call_intern lj_tab_len // (GCtab *t) | ||
1796 | |. nop | ||
1797 | | // Returns uint32_t (but less than 2^31). | ||
1798 | | b ->fff_resi | ||
1799 | |. nop | ||
1800 | | | ||
1801 | |//-- Bit library -------------------------------------------------------- | 1817 | |//-- Bit library -------------------------------------------------------- |
1802 | | | 1818 | | |
1803 | |.macro .ffunc_bit, name | 1819 | |.macro .ffunc_bit, name |
@@ -2572,6 +2588,26 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
2572 | | ins_next | 2588 | | ins_next |
2573 | break; | 2589 | break; |
2574 | 2590 | ||
2591 | case BC_ISTYPE: | ||
2592 | | // RA = src*8, RD = -type*8 | ||
2593 | | addu TMP2, BASE, RA | ||
2594 | | srl TMP1, RD, 3 | ||
2595 | | lw TMP0, HI(TMP2) | ||
2596 | | ins_next1 | ||
2597 | | addu AT, TMP0, TMP1 | ||
2598 | | bnez AT, ->vmeta_istype | ||
2599 | |. ins_next2 | ||
2600 | break; | ||
2601 | case BC_ISNUM: | ||
2602 | | // RA = src*8, RD = -(TISNUM-1)*8 | ||
2603 | | addu TMP2, BASE, RA | ||
2604 | | lw TMP0, HI(TMP2) | ||
2605 | | ins_next1 | ||
2606 | | sltiu AT, TMP0, LJ_TISNUM | ||
2607 | | beqz AT, ->vmeta_istype | ||
2608 | |. ins_next2 | ||
2609 | break; | ||
2610 | |||
2575 | /* -- Unary ops --------------------------------------------------------- */ | 2611 | /* -- Unary ops --------------------------------------------------------- */ |
2576 | 2612 | ||
2577 | case BC_MOV: | 2613 | case BC_MOV: |
@@ -3210,6 +3246,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
3210 | | b ->vmeta_tgetb // Caveat: preserve TMP0! | 3246 | | b ->vmeta_tgetb // Caveat: preserve TMP0! |
3211 | |. nop | 3247 | |. nop |
3212 | break; | 3248 | break; |
3249 | case BC_TGETR: | ||
3250 | | // RA = dst*8, RB = table*8, RC = key*8 | ||
3251 | | decode_RB8a RB, INS | ||
3252 | | decode_RB8b RB | ||
3253 | | decode_RDtoRC8 RC, RD | ||
3254 | | addu CARG2, BASE, RB | ||
3255 | | addu CARG3, BASE, RC | ||
3256 | | lw TAB:CARG1, LO(CARG2) | ||
3257 | | ldc1 f0, 0(CARG3) | ||
3258 | | trunc.w.d f2, f0 | ||
3259 | | lw TMP0, TAB:CARG1->asize | ||
3260 | | mfc1 CARG2, f2 | ||
3261 | | lw TMP1, TAB:CARG1->array | ||
3262 | | sltu AT, CARG2, TMP0 | ||
3263 | | sll TMP2, CARG2, 3 | ||
3264 | | beqz AT, ->vmeta_tgetr // In array part? | ||
3265 | |. addu TMP2, TMP1, TMP2 | ||
3266 | | ldc1 f0, 0(TMP2) | ||
3267 | |->BC_TGETR_Z: | ||
3268 | | addu RA, BASE, RA | ||
3269 | | ins_next1 | ||
3270 | | sdc1 f0, 0(RA) | ||
3271 | | ins_next2 | ||
3272 | break; | ||
3213 | 3273 | ||
3214 | case BC_TSETV: | 3274 | case BC_TSETV: |
3215 | | // RA = src*8, RB = table*8, RC = key*8 | 3275 | | // RA = src*8, RB = table*8, RC = key*8 |
@@ -3398,6 +3458,38 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
3398 | |7: // Possible table write barrier for the value. Skip valiswhite check. | 3458 | |7: // Possible table write barrier for the value. Skip valiswhite check. |
3399 | | barrierback TAB:RB, TMP3, TMP0, <2 | 3459 | | barrierback TAB:RB, TMP3, TMP0, <2 |
3400 | break; | 3460 | break; |
3461 | case BC_TSETR: | ||
3462 | | // RA = dst*8, RB = table*8, RC = key*8 | ||
3463 | | decode_RB8a RB, INS | ||
3464 | | decode_RB8b RB | ||
3465 | | decode_RDtoRC8 RC, RD | ||
3466 | | addu CARG1, BASE, RB | ||
3467 | | addu CARG3, BASE, RC | ||
3468 | | lw TAB:CARG2, LO(CARG1) | ||
3469 | | ldc1 f0, 0(CARG3) | ||
3470 | | trunc.w.d f2, f0 | ||
3471 | | lbu TMP3, TAB:CARG2->marked | ||
3472 | | lw TMP0, TAB:CARG2->asize | ||
3473 | | mfc1 CARG3, f2 | ||
3474 | | lw TMP1, TAB:CARG2->array | ||
3475 | | andi AT, TMP3, LJ_GC_BLACK // isblack(table) | ||
3476 | | bnez AT, >7 | ||
3477 | |. addu RA, BASE, RA | ||
3478 | |2: | ||
3479 | | sltu AT, CARG3, TMP0 | ||
3480 | | sll TMP2, CARG3, 3 | ||
3481 | | beqz AT, ->vmeta_tsetr // In array part? | ||
3482 | |. ldc1 f20, 0(RA) | ||
3483 | | addu CRET1, TMP1, TMP2 | ||
3484 | |->BC_TSETR_Z: | ||
3485 | | ins_next1 | ||
3486 | | sdc1 f20, 0(CRET1) | ||
3487 | | ins_next2 | ||
3488 | | | ||
3489 | |7: // Possible table write barrier for the value. Skip valiswhite check. | ||
3490 | | barrierback TAB:RB, TMP3, TMP0, <2 | ||
3491 | break; | ||
3492 | |||
3401 | 3493 | ||
3402 | case BC_TSETM: | 3494 | case BC_TSETM: |
3403 | | // RA = base*8 (table at base-1), RD = num_const*8 (start index) | 3495 | | // RA = base*8 (table at base-1), RD = num_const*8 (start index) |