diff options
Diffstat (limited to 'src/vm_mips.dasc')
-rw-r--r-- | src/vm_mips.dasc | 252 |
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 |