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.dasc252
1 files changed, 137 insertions, 115 deletions
diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc
index a81dbeeb..41ed303d 100644
--- a/src/vm_mips.dasc
+++ b/src/vm_mips.dasc
@@ -138,6 +138,7 @@
138|.type NODE, Node 138|.type NODE, Node
139|.type NARGS8, int 139|.type NARGS8, int
140|.type TRACE, GCtrace 140|.type TRACE, GCtrace
141|.type SBUF, SBuf
141| 142|
142|//----------------------------------------------------------------------- 143|//-----------------------------------------------------------------------
143| 144|
@@ -688,6 +689,16 @@ static void build_subroutines(BuildCtx *ctx)
688 | b ->vm_call_dispatch_f 689 | b ->vm_call_dispatch_f
689 |. li NARGS8:RC, 16 // 2 args for func(t, k). 690 |. li NARGS8:RC, 16 // 2 args for func(t, k).
690 | 691 |
692 |->vmeta_tgetr:
693 | load_got lj_tab_getinth
694 | call_intern lj_tab_getinth // (GCtab *t, int32_t key)
695 |. nop
696 | // Returns cTValue * or NULL.
697 | beqz CRET1, >1
698 |. nop
699 | b ->BC_TGETR_Z
700 |. ldc1 f0, 0(CRET1)
701 |
691 |//----------------------------------------------------------------------- 702 |//-----------------------------------------------------------------------
692 | 703 |
693 |->vmeta_tsets1: 704 |->vmeta_tsets1:
@@ -740,6 +751,16 @@ static void build_subroutines(BuildCtx *ctx)
740 | b ->vm_call_dispatch_f 751 | b ->vm_call_dispatch_f
741 |. li NARGS8:RC, 24 // 3 args for func(t, k, v) 752 |. li NARGS8:RC, 24 // 3 args for func(t, k, v)
742 | 753 |
754 |->vmeta_tsetr:
755 | load_got lj_tab_setinth
756 | sw BASE, L->base
757 | sw PC, SAVE_PC
758 | call_intern lj_tab_setinth // (lua_State *L, GCtab *t, int32_t key)
759 |. move CARG1, L
760 | // Returns TValue *.
761 | b ->BC_TSETR_Z
762 |. nop
763 |
743 |//-- Comparison metamethods --------------------------------------------- 764 |//-- Comparison metamethods ---------------------------------------------
744 | 765 |
745 |->vmeta_comp: 766 |->vmeta_comp:
@@ -813,6 +834,18 @@ static void build_subroutines(BuildCtx *ctx)
813 |. nop 834 |. nop
814 |.endif 835 |.endif
815 | 836 |
837 |->vmeta_istype:
838 | load_got lj_meta_istype
839 | addiu PC, PC, -4
840 | sw BASE, L->base
841 | srl CARG2, RA, 3
842 | srl CARG3, RD, 3
843 | sw PC, SAVE_PC
844 | call_intern lj_meta_istype // (lua_State *L, BCReg ra, BCReg tp)
845 |. move CARG1, L
846 | b ->cont_nop
847 |. nop
848 |
816 |//-- Arithmetic metamethods --------------------------------------------- 849 |//-- Arithmetic metamethods ---------------------------------------------
817 | 850 |
818 |->vmeta_unm: 851 |->vmeta_unm:
@@ -1119,9 +1152,9 @@ static void build_subroutines(BuildCtx *ctx)
1119 |. sw BASE, L->base // Add frame since C call can throw. 1152 |. sw BASE, L->base // Add frame since C call can throw.
1120 | ffgccheck 1153 | ffgccheck
1121 |. sw PC, SAVE_PC // Redundant (but a defined value). 1154 |. sw PC, SAVE_PC // Redundant (but a defined value).
1122 | load_got lj_str_fromnum 1155 | load_got lj_strfmt_num
1123 | move CARG1, L 1156 | move CARG1, L
1124 | call_intern lj_str_fromnum // (lua_State *L, lua_Number *np) 1157 | call_intern lj_strfmt_num // (lua_State *L, lua_Number *np)
1125 |. move CARG2, BASE 1158 |. move CARG2, BASE
1126 | // Returns GCstr *. 1159 | // Returns GCstr *.
1127 | li CARG3, LJ_TSTR 1160 | li CARG3, LJ_TSTR
@@ -1188,7 +1221,7 @@ static void build_subroutines(BuildCtx *ctx)
1188 | mtc1 TMP0, FARG1 1221 | mtc1 TMP0, FARG1
1189 | beqz AT, ->fff_fallback 1222 | beqz AT, ->fff_fallback
1190 |. lw PC, FRAME_PC(BASE) 1223 |. lw PC, FRAME_PC(BASE)
1191 | cvt.w.d FRET1, FARG2 1224 | trunc.w.d FRET1, FARG2
1192 | cvt.d.w FARG1, FARG1 1225 | cvt.d.w FARG1, FARG1
1193 | lw TMP0, TAB:CARG1->asize 1226 | lw TMP0, TAB:CARG1->asize
1194 | lw TMP1, TAB:CARG1->array 1227 | lw TMP1, TAB:CARG1->array
@@ -1521,14 +1554,8 @@ static void build_subroutines(BuildCtx *ctx)
1521 | b ->fff_resn 1554 | b ->fff_resn
1522 |. nop 1555 |. nop
1523 | 1556 |
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 1557 |.ffunc_nn math_ldexp
1531 | cvt.w.d FARG2, FARG2 1558 | trunc.w.d FARG2, FARG2
1532 | load_got ldexp 1559 | load_got ldexp
1533 | mfc1 CARG3, FARG2 1560 | mfc1 CARG3, FARG2
1534 | call_extern 1561 | call_extern
@@ -1592,13 +1619,6 @@ static void build_subroutines(BuildCtx *ctx)
1592 | 1619 |
1593 |//-- String library ----------------------------------------------------- 1620 |//-- String library -----------------------------------------------------
1594 | 1621 |
1595 |.ffunc_1 string_len
1596 | li AT, LJ_TSTR
1597 | bne CARG3, AT, ->fff_fallback
1598 |. nop
1599 | b ->fff_resi
1600 |. lw CRET1, STR:CARG1->len
1601 |
1602 |.ffunc string_byte // Only handle the 1-arg case here. 1622 |.ffunc string_byte // Only handle the 1-arg case here.
1603 | lw CARG3, HI(BASE) 1623 | lw CARG3, HI(BASE)
1604 | lw STR:CARG1, LO(BASE) 1624 | lw STR:CARG1, LO(BASE)
@@ -1628,7 +1648,7 @@ static void build_subroutines(BuildCtx *ctx)
1628 |. sltiu AT, CARG3, LJ_TISNUM 1648 |. sltiu AT, CARG3, LJ_TISNUM
1629 | beqz AT, ->fff_fallback 1649 | beqz AT, ->fff_fallback
1630 |. li CARG3, 1 1650 |. li CARG3, 1
1631 | cvt.w.d FARG1, FARG1 1651 | trunc.w.d FARG1, FARG1
1632 | addiu CARG2, sp, ARG5_OFS 1652 | addiu CARG2, sp, ARG5_OFS
1633 | sltiu AT, TMP0, 256 1653 | sltiu AT, TMP0, 256
1634 | mfc1 TMP0, FARG1 1654 | mfc1 TMP0, FARG1
@@ -1642,6 +1662,7 @@ static void build_subroutines(BuildCtx *ctx)
1642 |. move CARG1, L 1662 |. move CARG1, L
1643 | // Returns GCstr *. 1663 | // Returns GCstr *.
1644 | lw BASE, L->base 1664 | lw BASE, L->base
1665 |->fff_resstr:
1645 | move CARG1, CRET1 1666 | move CARG1, CRET1
1646 | b ->fff_restv 1667 | b ->fff_restv
1647 |. li CARG3, LJ_TSTR 1668 |. li CARG3, LJ_TSTR
@@ -1658,7 +1679,7 @@ static void build_subroutines(BuildCtx *ctx)
1658 | ldc1 f2, 8(BASE) 1679 | ldc1 f2, 8(BASE)
1659 | beqz AT, >1 1680 | beqz AT, >1
1660 |. li CARG4, -1 1681 |. li CARG4, -1
1661 | cvt.w.d f0, f0 1682 | trunc.w.d f0, f0
1662 | sltiu AT, CARG3, LJ_TISNUM 1683 | sltiu AT, CARG3, LJ_TISNUM
1663 | beqz AT, ->fff_fallback 1684 | beqz AT, ->fff_fallback
1664 |. mfc1 CARG4, f0 1685 |. mfc1 CARG4, f0
@@ -1666,7 +1687,7 @@ static void build_subroutines(BuildCtx *ctx)
1666 | sltiu AT, CARG2, LJ_TISNUM 1687 | sltiu AT, CARG2, LJ_TISNUM
1667 | beqz AT, ->fff_fallback 1688 | beqz AT, ->fff_fallback
1668 |. li AT, LJ_TSTR 1689 |. li AT, LJ_TSTR
1669 | cvt.w.d f2, f2 1690 | trunc.w.d f2, f2
1670 | bne TMP0, AT, ->fff_fallback 1691 | bne TMP0, AT, ->fff_fallback
1671 |. lw CARG2, STR:CARG1->len 1692 |. lw CARG2, STR:CARG1->len
1672 | mfc1 CARG3, f2 1693 | mfc1 CARG3, f2
@@ -1695,108 +1716,32 @@ static void build_subroutines(BuildCtx *ctx)
1695 | b ->fff_restv 1716 | b ->fff_restv
1696 |. li CARG3, LJ_TSTR 1717 |. li CARG3, LJ_TSTR
1697 | 1718 |
1698 |.ffunc string_rep // Only handle the 1-char case inline. 1719 |.macro ffstring_op, name
1699 | ffgccheck 1720 | .ffunc string_ .. name
1700 | lw TMP0, HI(BASE)
1701 | addiu AT, NARGS8:RC, -16 // Exactly 2 arguments.
1702 | lw CARG4, 8+HI(BASE)
1703 | lw STR:CARG1, LO(BASE)
1704 | addiu TMP0, TMP0, -LJ_TSTR
1705 | ldc1 f0, 8(BASE)
1706 | or AT, AT, TMP0
1707 | bnez AT, ->fff_fallback
1708 |. sltiu AT, CARG4, LJ_TISNUM
1709 | cvt.w.d f0, f0
1710 | beqz AT, ->fff_fallback
1711 |. lw TMP0, STR:CARG1->len
1712 | mfc1 CARG3, f0
1713 | lw TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH)
1714 | li AT, 1
1715 | blez CARG3, ->fff_emptystr // Count <= 0?
1716 |. sltu AT, AT, TMP0
1717 | beqz TMP0, ->fff_emptystr // Zero length string?
1718 |. sltu TMP0, TMP1, CARG3
1719 | or AT, AT, TMP0
1720 | lw CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH)
1721 | bnez AT, ->fff_fallback // Fallback for > 1-char strings.
1722 |. lbu TMP0, STR:CARG1[1]
1723 | addu TMP2, CARG2, CARG3
1724 |1: // Fill buffer with char. Yes, this is suboptimal code (do you care?).
1725 | addiu TMP2, TMP2, -1
1726 | sltu AT, CARG2, TMP2
1727 | bnez AT, <1
1728 |. sb TMP0, 0(TMP2)
1729 | b ->fff_newstr
1730 |. nop
1731 |
1732 |.ffunc string_reverse
1733 | ffgccheck
1734 | lw CARG3, HI(BASE)
1735 | lw STR:CARG1, LO(BASE)
1736 | beqz NARGS8:RC, ->fff_fallback
1737 |. li AT, LJ_TSTR
1738 | bne CARG3, AT, ->fff_fallback
1739 |. lw TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH)
1740 | lw CARG3, STR:CARG1->len
1741 | addiu CARG1, STR:CARG1, #STR
1742 | lw CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH)
1743 | sltu AT, TMP1, CARG3
1744 | bnez AT, ->fff_fallback
1745 |. addu TMP3, CARG1, CARG3
1746 | addu CARG4, CARG2, CARG3
1747 |1: // Reverse string copy.
1748 | lbu TMP1, 0(CARG1)
1749 | sltu AT, CARG1, TMP3
1750 | beqz AT, ->fff_newstr
1751 |. addiu CARG1, CARG1, 1
1752 | addiu CARG4, CARG4, -1
1753 | b <1
1754 | sb TMP1, 0(CARG4)
1755 |
1756 |.macro ffstring_case, name, lo
1757 | .ffunc name
1758 | ffgccheck 1721 | ffgccheck
1759 | lw CARG3, HI(BASE) 1722 | lw CARG3, HI(BASE)
1760 | lw STR:CARG1, LO(BASE) 1723 | lw STR:CARG2, LO(BASE)
1761 | beqz NARGS8:RC, ->fff_fallback 1724 | beqz NARGS8:RC, ->fff_fallback
1762 |. li AT, LJ_TSTR 1725 |. li AT, LJ_TSTR
1763 | bne CARG3, AT, ->fff_fallback 1726 | bne CARG3, AT, ->fff_fallback
1764 |. lw TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) 1727 |. addiu SBUF:CARG1, DISPATCH, DISPATCH_GL(tmpbuf)
1765 | lw CARG3, STR:CARG1->len 1728 | load_got lj_buf_putstr_ .. name
1766 | addiu CARG1, STR:CARG1, #STR 1729 | lw TMP0, SBUF:CARG1->b
1767 | lw CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) 1730 | sw L, SBUF:CARG1->L
1768 | sltu AT, TMP1, CARG3 1731 | sw BASE, L->base
1769 | bnez AT, ->fff_fallback 1732 | sw TMP0, SBUF:CARG1->p
1770 |. addu TMP3, CARG1, CARG3 1733 | call_intern extern lj_buf_putstr_ .. name
1771 | move CARG4, CARG2 1734 |. sw PC, SAVE_PC
1772 |1: // ASCII case conversion. 1735 | load_got lj_buf_tostr
1773 | lbu TMP1, 0(CARG1) 1736 | call_intern lj_buf_tostr
1774 | sltu AT, CARG1, TMP3 1737 |. move SBUF:CARG1, SBUF:CRET1
1775 | beqz AT, ->fff_newstr 1738 | b ->fff_resstr
1776 |. addiu TMP0, TMP1, -lo 1739 |. lw BASE, L->base
1777 | xori TMP2, TMP1, 0x20
1778 | sltiu AT, TMP0, 26
1779 | movn TMP1, TMP2, AT
1780 | addiu CARG1, CARG1, 1
1781 | sb TMP1, 0(CARG4)
1782 | b <1
1783 |. addiu CARG4, CARG4, 1
1784 |.endmacro 1740 |.endmacro
1785 | 1741 |
1786 |ffstring_case string_lower, 65 1742 |ffstring_op reverse
1787 |ffstring_case string_upper, 97 1743 |ffstring_op lower
1788 | 1744 |ffstring_op upper
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 | 1745 |
1801 |//-- Bit library -------------------------------------------------------- 1746 |//-- Bit library --------------------------------------------------------
1802 | 1747 |
@@ -2572,6 +2517,26 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2572 | ins_next 2517 | ins_next
2573 break; 2518 break;
2574 2519
2520 case BC_ISTYPE:
2521 | // RA = src*8, RD = -type*8
2522 | addu TMP2, BASE, RA
2523 | srl TMP1, RD, 3
2524 | lw TMP0, HI(TMP2)
2525 | ins_next1
2526 | addu AT, TMP0, TMP1
2527 | bnez AT, ->vmeta_istype
2528 |. ins_next2
2529 break;
2530 case BC_ISNUM:
2531 | // RA = src*8, RD = -(TISNUM-1)*8
2532 | addu TMP2, BASE, RA
2533 | lw TMP0, HI(TMP2)
2534 | ins_next1
2535 | sltiu AT, TMP0, LJ_TISNUM
2536 | beqz AT, ->vmeta_istype
2537 |. ins_next2
2538 break;
2539
2575 /* -- Unary ops --------------------------------------------------------- */ 2540 /* -- Unary ops --------------------------------------------------------- */
2576 2541
2577 case BC_MOV: 2542 case BC_MOV:
@@ -3210,6 +3175,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3210 | b ->vmeta_tgetb // Caveat: preserve TMP0! 3175 | b ->vmeta_tgetb // Caveat: preserve TMP0!
3211 |. nop 3176 |. nop
3212 break; 3177 break;
3178 case BC_TGETR:
3179 | // RA = dst*8, RB = table*8, RC = key*8
3180 | decode_RB8a RB, INS
3181 | decode_RB8b RB
3182 | decode_RDtoRC8 RC, RD
3183 | addu CARG2, BASE, RB
3184 | addu CARG3, BASE, RC
3185 | lw TAB:CARG1, LO(CARG2)
3186 | ldc1 f0, 0(CARG3)
3187 | trunc.w.d f2, f0
3188 | lw TMP0, TAB:CARG1->asize
3189 | mfc1 CARG2, f2
3190 | lw TMP1, TAB:CARG1->array
3191 | sltu AT, CARG2, TMP0
3192 | sll TMP2, CARG2, 3
3193 | beqz AT, ->vmeta_tgetr // In array part?
3194 |. addu TMP2, TMP1, TMP2
3195 | ldc1 f0, 0(TMP2)
3196 |->BC_TGETR_Z:
3197 | addu RA, BASE, RA
3198 | ins_next1
3199 | sdc1 f0, 0(RA)
3200 | ins_next2
3201 break;
3213 3202
3214 case BC_TSETV: 3203 case BC_TSETV:
3215 | // RA = src*8, RB = table*8, RC = key*8 3204 | // RA = src*8, RB = table*8, RC = key*8
@@ -3398,6 +3387,38 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3398 |7: // Possible table write barrier for the value. Skip valiswhite check. 3387 |7: // Possible table write barrier for the value. Skip valiswhite check.
3399 | barrierback TAB:RB, TMP3, TMP0, <2 3388 | barrierback TAB:RB, TMP3, TMP0, <2
3400 break; 3389 break;
3390 case BC_TSETR:
3391 | // RA = dst*8, RB = table*8, RC = key*8
3392 | decode_RB8a RB, INS
3393 | decode_RB8b RB
3394 | decode_RDtoRC8 RC, RD
3395 | addu CARG1, BASE, RB
3396 | addu CARG3, BASE, RC
3397 | lw TAB:CARG2, LO(CARG1)
3398 | ldc1 f0, 0(CARG3)
3399 | trunc.w.d f2, f0
3400 | lbu TMP3, TAB:CARG2->marked
3401 | lw TMP0, TAB:CARG2->asize
3402 | mfc1 CARG3, f2
3403 | lw TMP1, TAB:CARG2->array
3404 | andi AT, TMP3, LJ_GC_BLACK // isblack(table)
3405 | bnez AT, >7
3406 |. addu RA, BASE, RA
3407 |2:
3408 | sltu AT, CARG3, TMP0
3409 | sll TMP2, CARG3, 3
3410 | beqz AT, ->vmeta_tsetr // In array part?
3411 |. ldc1 f20, 0(RA)
3412 | addu CRET1, TMP1, TMP2
3413 |->BC_TSETR_Z:
3414 | ins_next1
3415 | sdc1 f20, 0(CRET1)
3416 | ins_next2
3417 |
3418 |7: // Possible table write barrier for the value. Skip valiswhite check.
3419 | barrierback TAB:RB, TMP3, TMP0, <2
3420 break;
3421
3401 3422
3402 case BC_TSETM: 3423 case BC_TSETM:
3403 | // RA = base*8 (table at base-1), RD = num_const*8 (start index) 3424 | // RA = base*8 (table at base-1), RD = num_const*8 (start index)
@@ -3959,6 +3980,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3959 | sw BASE, DISPATCH_GL(jit_base)(DISPATCH) 3980 | sw BASE, DISPATCH_GL(jit_base)(DISPATCH)
3960 | sw L, DISPATCH_GL(jit_L)(DISPATCH) 3981 | sw L, DISPATCH_GL(jit_L)(DISPATCH)
3961 | lw TMP2, TRACE:TMP2->mcode 3982 | lw TMP2, TRACE:TMP2->mcode
3983 | sw L, DISPATCH_GL(tmpbuf.L)(DISPATCH)
3962 | jr TMP2 3984 | jr TMP2
3963 |. addiu JGL, DISPATCH, GG_DISP2G+32768 3985 |. addiu JGL, DISPATCH, GG_DISP2G+32768
3964 |.endif 3986 |.endif