aboutsummaryrefslogtreecommitdiff
path: root/src/vm_mips.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm_mips.dasc')
-rw-r--r--src/vm_mips.dasc164
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)