diff options
Diffstat (limited to '')
-rw-r--r-- | src/vm_ppc.dasc | 290 |
1 files changed, 162 insertions, 128 deletions
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index f2530811..293c5c6f 100644 --- a/src/vm_ppc.dasc +++ b/src/vm_ppc.dasc | |||
@@ -293,6 +293,7 @@ | |||
293 | |.type NODE, Node | 293 | |.type NODE, Node |
294 | |.type NARGS8, int | 294 | |.type NARGS8, int |
295 | |.type TRACE, GCtrace | 295 | |.type TRACE, GCtrace |
296 | |.type SBUF, SBuf | ||
296 | | | 297 | | |
297 | |//----------------------------------------------------------------------- | 298 | |//----------------------------------------------------------------------- |
298 | | | 299 | | |
@@ -661,12 +662,13 @@ static void build_subroutines(BuildCtx *ctx) | |||
661 | | stw CARG3, SAVE_NRES | 662 | | stw CARG3, SAVE_NRES |
662 | | cmplwi TMP1, 0 | 663 | | cmplwi TMP1, 0 |
663 | | stw CARG3, SAVE_ERRF | 664 | | stw CARG3, SAVE_ERRF |
664 | | stp TMP0, L->cframe | ||
665 | | stp CARG3, SAVE_CFRAME | 665 | | stp CARG3, SAVE_CFRAME |
666 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. | 666 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. |
667 | | stp TMP0, L->cframe | ||
667 | | beq >3 | 668 | | beq >3 |
668 | | | 669 | | |
669 | | // Resume after yield (like a return). | 670 | | // Resume after yield (like a return). |
671 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
670 | | mr RA, BASE | 672 | | mr RA, BASE |
671 | | lp BASE, L->base | 673 | | lp BASE, L->base |
672 | | li TISNUM, LJ_TISNUM // Setup type comparison constants. | 674 | | li TISNUM, LJ_TISNUM // Setup type comparison constants. |
@@ -706,17 +708,18 @@ static void build_subroutines(BuildCtx *ctx) | |||
706 | | | 708 | | |
707 | |1: // Entry point for vm_pcall above (PC = ftype). | 709 | |1: // Entry point for vm_pcall above (PC = ftype). |
708 | | lp TMP1, L:CARG1->cframe | 710 | | lp TMP1, L:CARG1->cframe |
709 | | stw CARG3, SAVE_NRES | ||
710 | | mr L, CARG1 | 711 | | mr L, CARG1 |
711 | | stw CARG1, SAVE_L | 712 | | stw CARG3, SAVE_NRES |
712 | | mr BASE, CARG2 | ||
713 | | stp sp, L->cframe // Add our C frame to cframe chain. | ||
714 | | lwz DISPATCH, L->glref // Setup pointer to dispatch table. | 713 | | lwz DISPATCH, L->glref // Setup pointer to dispatch table. |
714 | | stw CARG1, SAVE_L | ||
715 | | mr BASE, CARG2 | ||
716 | | addi DISPATCH, DISPATCH, GG_G2DISP | ||
715 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. | 717 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. |
716 | | stp TMP1, SAVE_CFRAME | 718 | | stp TMP1, SAVE_CFRAME |
717 | | addi DISPATCH, DISPATCH, GG_G2DISP | 719 | | stp sp, L->cframe // Add our C frame to cframe chain. |
718 | | | 720 | | |
719 | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). | 721 | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). |
722 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
720 | | lp TMP2, L->base // TMP2 = old base (used in vmeta_call). | 723 | | lp TMP2, L->base // TMP2 = old base (used in vmeta_call). |
721 | | li TISNUM, LJ_TISNUM // Setup type comparison constants. | 724 | | li TISNUM, LJ_TISNUM // Setup type comparison constants. |
722 | | lp TMP1, L->top | 725 | | lp TMP1, L->top |
@@ -753,15 +756,18 @@ static void build_subroutines(BuildCtx *ctx) | |||
753 | | lwz TMP0, L:CARG1->stack | 756 | | lwz TMP0, L:CARG1->stack |
754 | | stw CARG1, SAVE_L | 757 | | stw CARG1, SAVE_L |
755 | | lp TMP1, L->top | 758 | | lp TMP1, L->top |
759 | | lwz DISPATCH, L->glref // Setup pointer to dispatch table. | ||
756 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. | 760 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. |
757 | | sub TMP0, TMP0, TMP1 // Compute -savestack(L, L->top). | 761 | | sub TMP0, TMP0, TMP1 // Compute -savestack(L, L->top). |
758 | | lp TMP1, L->cframe | 762 | | lp TMP1, L->cframe |
759 | | stp sp, L->cframe // Add our C frame to cframe chain. | 763 | | addi DISPATCH, DISPATCH, GG_G2DISP |
760 | | .toc lp CARG4, 0(CARG4) | 764 | | .toc lp CARG4, 0(CARG4) |
761 | | li TMP2, 0 | 765 | | li TMP2, 0 |
762 | | stw TMP0, SAVE_NRES // Neg. delta means cframe w/o frame. | 766 | | stw TMP0, SAVE_NRES // Neg. delta means cframe w/o frame. |
763 | | stw TMP2, SAVE_ERRF // No error function. | 767 | | stw TMP2, SAVE_ERRF // No error function. |
764 | | stp TMP1, SAVE_CFRAME | 768 | | stp TMP1, SAVE_CFRAME |
769 | | stp sp, L->cframe // Add our C frame to cframe chain. | ||
770 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
765 | | mtctr CARG4 | 771 | | mtctr CARG4 |
766 | | bctrl // (lua_State *L, lua_CFunction func, void *ud) | 772 | | bctrl // (lua_State *L, lua_CFunction func, void *ud) |
767 | |.if PPE | 773 | |.if PPE |
@@ -770,9 +776,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
770 | |.else | 776 | |.else |
771 | | mr. BASE, CRET1 | 777 | | mr. BASE, CRET1 |
772 | |.endif | 778 | |.endif |
773 | | lwz DISPATCH, L->glref // Setup pointer to dispatch table. | 779 | | li PC, FRAME_CP |
774 | | li PC, FRAME_CP | ||
775 | | addi DISPATCH, DISPATCH, GG_G2DISP | ||
776 | | bne <3 // Else continue with the call. | 780 | | bne <3 // Else continue with the call. |
777 | | b ->vm_leave_cp // No base? Just remove C frame. | 781 | | b ->vm_leave_cp // No base? Just remove C frame. |
778 | | | 782 | | |
@@ -895,6 +899,17 @@ static void build_subroutines(BuildCtx *ctx) | |||
895 | | li NARGS8:RC, 16 // 2 args for func(t, k). | 899 | | li NARGS8:RC, 16 // 2 args for func(t, k). |
896 | | b ->vm_call_dispatch_f | 900 | | b ->vm_call_dispatch_f |
897 | | | 901 | | |
902 | |->vmeta_tgetr: | ||
903 | | bl extern lj_tab_getinth // (GCtab *t, int32_t key) | ||
904 | | // Returns cTValue * or NULL. | ||
905 | | cmplwi CRET1, 0 | ||
906 | | beq >1 | ||
907 | | lfd f14, 0(CRET1) | ||
908 | | b ->BC_TGETR_Z | ||
909 | |1: | ||
910 | | stwx TISNIL, BASE, RA | ||
911 | | b ->cont_nop | ||
912 | | | ||
898 | |//----------------------------------------------------------------------- | 913 | |//----------------------------------------------------------------------- |
899 | | | 914 | | |
900 | |->vmeta_tsets1: | 915 | |->vmeta_tsets1: |
@@ -962,6 +977,14 @@ static void build_subroutines(BuildCtx *ctx) | |||
962 | | stfd f0, 16(BASE) // Copy value to third argument. | 977 | | stfd f0, 16(BASE) // Copy value to third argument. |
963 | | b ->vm_call_dispatch_f | 978 | | b ->vm_call_dispatch_f |
964 | | | 979 | | |
980 | |->vmeta_tsetr: | ||
981 | | stp BASE, L->base | ||
982 | | stw PC, SAVE_PC | ||
983 | | bl extern lj_tab_setinth // (lua_State *L, GCtab *t, int32_t key) | ||
984 | | // Returns TValue *. | ||
985 | | stfd f14, 0(CRET1) | ||
986 | | b ->cont_nop | ||
987 | | | ||
965 | |//-- Comparison metamethods --------------------------------------------- | 988 | |//-- Comparison metamethods --------------------------------------------- |
966 | | | 989 | | |
967 | |->vmeta_comp: | 990 | |->vmeta_comp: |
@@ -1040,6 +1063,16 @@ static void build_subroutines(BuildCtx *ctx) | |||
1040 | | b <3 | 1063 | | b <3 |
1041 | |.endif | 1064 | |.endif |
1042 | | | 1065 | | |
1066 | |->vmeta_istype: | ||
1067 | | subi PC, PC, 4 | ||
1068 | | stp BASE, L->base | ||
1069 | | srwi CARG2, RA, 3 | ||
1070 | | mr CARG1, L | ||
1071 | | srwi CARG3, RD, 3 | ||
1072 | | stw PC, SAVE_PC | ||
1073 | | bl extern lj_meta_istype // (lua_State *L, BCReg ra, BCReg tp) | ||
1074 | | b ->cont_nop | ||
1075 | | | ||
1043 | |//-- Arithmetic metamethods --------------------------------------------- | 1076 | |//-- Arithmetic metamethods --------------------------------------------- |
1044 | | | 1077 | | |
1045 | |->vmeta_arith_nv: | 1078 | |->vmeta_arith_nv: |
@@ -1364,9 +1397,9 @@ static void build_subroutines(BuildCtx *ctx) | |||
1364 | | mr CARG1, L | 1397 | | mr CARG1, L |
1365 | | mr CARG2, BASE | 1398 | | mr CARG2, BASE |
1366 | |.if DUALNUM | 1399 | |.if DUALNUM |
1367 | | bl extern lj_str_fromnumber // (lua_State *L, cTValue *o) | 1400 | | bl extern lj_strfmt_number // (lua_State *L, cTValue *o) |
1368 | |.else | 1401 | |.else |
1369 | | bl extern lj_str_fromnum // (lua_State *L, lua_Number *np) | 1402 | | bl extern lj_strfmt_num // (lua_State *L, lua_Number *np) |
1370 | |.endif | 1403 | |.endif |
1371 | | // Returns GCstr *. | 1404 | | // Returns GCstr *. |
1372 | | li CARG3, LJ_TSTR | 1405 | | li CARG3, LJ_TSTR |
@@ -1599,6 +1632,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
1599 | | lp TMP3, L:SAVE0->top | 1632 | | lp TMP3, L:SAVE0->top |
1600 | | li_vmstate INTERP | 1633 | | li_vmstate INTERP |
1601 | | lp BASE, L->base | 1634 | | lp BASE, L->base |
1635 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
1602 | | st_vmstate | 1636 | | st_vmstate |
1603 | | bgt >8 | 1637 | | bgt >8 |
1604 | | sub RD, TMP3, TMP2 | 1638 | | sub RD, TMP3, TMP2 |
@@ -1870,12 +1904,6 @@ static void build_subroutines(BuildCtx *ctx) | |||
1870 | | math_extern2 atan2 | 1904 | | math_extern2 atan2 |
1871 | | math_extern2 fmod | 1905 | | math_extern2 fmod |
1872 | | | 1906 | | |
1873 | |->ff_math_deg: | ||
1874 | |.ffunc_n math_rad | ||
1875 | | lfd FARG2, CFUNC:RB->upvalue[0] | ||
1876 | | fmul FARG1, FARG1, FARG2 | ||
1877 | | b ->fff_resn | ||
1878 | | | ||
1879 | |.if DUALNUM | 1907 | |.if DUALNUM |
1880 | |.ffunc math_ldexp | 1908 | |.ffunc math_ldexp |
1881 | | cmplwi NARGS8:RC, 16 | 1909 | | cmplwi NARGS8:RC, 16 |
@@ -2021,11 +2049,6 @@ static void build_subroutines(BuildCtx *ctx) | |||
2021 | | | 2049 | | |
2022 | |//-- String library ----------------------------------------------------- | 2050 | |//-- String library ----------------------------------------------------- |
2023 | | | 2051 | | |
2024 | |.ffunc_1 string_len | ||
2025 | | checkstr CARG3; bne ->fff_fallback | ||
2026 | | lwz CRET1, STR:CARG1->len | ||
2027 | | b ->fff_resi | ||
2028 | | | ||
2029 | |.ffunc string_byte // Only handle the 1-arg case here. | 2052 | |.ffunc string_byte // Only handle the 1-arg case here. |
2030 | | cmplwi NARGS8:RC, 8 | 2053 | | cmplwi NARGS8:RC, 8 |
2031 | | lwz CARG3, 0(BASE) | 2054 | | lwz CARG3, 0(BASE) |
@@ -2080,6 +2103,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
2080 | | stp BASE, L->base | 2103 | | stp BASE, L->base |
2081 | | stw PC, SAVE_PC | 2104 | | stw PC, SAVE_PC |
2082 | | bl extern lj_str_new // (lua_State *L, char *str, size_t l) | 2105 | | bl extern lj_str_new // (lua_State *L, char *str, size_t l) |
2106 | |->fff_resstr: | ||
2083 | | // Returns GCstr *. | 2107 | | // Returns GCstr *. |
2084 | | lp BASE, L->base | 2108 | | lp BASE, L->base |
2085 | | li CARG3, LJ_TSTR | 2109 | | li CARG3, LJ_TSTR |
@@ -2157,114 +2181,29 @@ static void build_subroutines(BuildCtx *ctx) | |||
2157 | | addi TMP1, TMP1, 1 // start = 1 + (start ? start+len : 0) | 2181 | | addi TMP1, TMP1, 1 // start = 1 + (start ? start+len : 0) |
2158 | | b <3 | 2182 | | b <3 |
2159 | | | 2183 | | |
2160 | |.ffunc string_rep // Only handle the 1-char case inline. | 2184 | |.macro ffstring_op, name |
2161 | | ffgccheck | 2185 | | .ffunc string_ .. name |
2162 | | cmplwi NARGS8:RC, 16 | ||
2163 | | lwz TMP0, 0(BASE) | ||
2164 | | lwz STR:CARG1, 4(BASE) | ||
2165 | | lwz CARG4, 8(BASE) | ||
2166 | |.if DUALNUM | ||
2167 | | lwz CARG3, 12(BASE) | ||
2168 | |.else | ||
2169 | | lfd FARG2, 8(BASE) | ||
2170 | |.endif | ||
2171 | | bne ->fff_fallback // Exactly 2 arguments. | ||
2172 | | checkstr TMP0; bne ->fff_fallback | ||
2173 | |.if DUALNUM | ||
2174 | | checknum CARG4; bne ->fff_fallback | ||
2175 | |.else | ||
2176 | | checknum CARG4; bge ->fff_fallback | ||
2177 | | toint CARG3, FARG2 | ||
2178 | |.endif | ||
2179 | | lwz TMP0, STR:CARG1->len | ||
2180 | | cmpwi CARG3, 0 | ||
2181 | | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) | ||
2182 | | ble >2 // Count <= 0? (or non-int) | ||
2183 | | cmplwi TMP0, 1 | ||
2184 | | subi TMP2, CARG3, 1 | ||
2185 | | blt >2 // Zero length string? | ||
2186 | | cmplw cr1, TMP1, CARG3 | ||
2187 | | bne ->fff_fallback // Fallback for > 1-char strings. | ||
2188 | | lbz TMP0, STR:CARG1[1] | ||
2189 | | lp CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) | ||
2190 | | blt cr1, ->fff_fallback | ||
2191 | |1: // Fill buffer with char. Yes, this is suboptimal code (do you care?). | ||
2192 | | cmplwi TMP2, 0 | ||
2193 | | stbx TMP0, CARG2, TMP2 | ||
2194 | | subi TMP2, TMP2, 1 | ||
2195 | | bne <1 | ||
2196 | | b ->fff_newstr | ||
2197 | |2: // Return empty string. | ||
2198 | | la STR:CARG1, DISPATCH_GL(strempty)(DISPATCH) | ||
2199 | | li CARG3, LJ_TSTR | ||
2200 | | b ->fff_restv | ||
2201 | | | ||
2202 | |.ffunc string_reverse | ||
2203 | | ffgccheck | ||
2204 | | cmplwi NARGS8:RC, 8 | ||
2205 | | lwz CARG3, 0(BASE) | ||
2206 | | lwz STR:CARG1, 4(BASE) | ||
2207 | | blt ->fff_fallback | ||
2208 | | checkstr CARG3 | ||
2209 | | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) | ||
2210 | | bne ->fff_fallback | ||
2211 | | lwz CARG3, STR:CARG1->len | ||
2212 | | la CARG1, #STR(STR:CARG1) | ||
2213 | | lp CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) | ||
2214 | | li TMP2, 0 | ||
2215 | | cmplw TMP1, CARG3 | ||
2216 | | subi TMP3, CARG3, 1 | ||
2217 | | blt ->fff_fallback | ||
2218 | |1: // Reverse string copy. | ||
2219 | | cmpwi TMP3, 0 | ||
2220 | | lbzx TMP1, CARG1, TMP2 | ||
2221 | | blty ->fff_newstr | ||
2222 | | stbx TMP1, CARG2, TMP3 | ||
2223 | | subi TMP3, TMP3, 1 | ||
2224 | | addi TMP2, TMP2, 1 | ||
2225 | | b <1 | ||
2226 | | | ||
2227 | |.macro ffstring_case, name, lo | ||
2228 | | .ffunc name | ||
2229 | | ffgccheck | 2186 | | ffgccheck |
2230 | | cmplwi NARGS8:RC, 8 | 2187 | | cmplwi NARGS8:RC, 8 |
2231 | | lwz CARG3, 0(BASE) | 2188 | | lwz CARG3, 0(BASE) |
2232 | | lwz STR:CARG1, 4(BASE) | 2189 | | lwz STR:CARG2, 4(BASE) |
2233 | | blt ->fff_fallback | 2190 | | blt ->fff_fallback |
2234 | | checkstr CARG3 | 2191 | | checkstr CARG3 |
2235 | | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) | 2192 | | la SBUF:CARG1, DISPATCH_GL(tmpbuf)(DISPATCH) |
2236 | | bne ->fff_fallback | 2193 | | bne ->fff_fallback |
2237 | | lwz CARG3, STR:CARG1->len | 2194 | | lwz TMP0, SBUF:CARG1->b |
2238 | | la CARG1, #STR(STR:CARG1) | 2195 | | stw L, SBUF:CARG1->L |
2239 | | lp CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) | 2196 | | stp BASE, L->base |
2240 | | cmplw TMP1, CARG3 | 2197 | | stw PC, SAVE_PC |
2241 | | li TMP2, 0 | 2198 | | stw TMP0, SBUF:CARG1->p |
2242 | | blt ->fff_fallback | 2199 | | bl extern lj_buf_putstr_ .. name |
2243 | |1: // ASCII case conversion. | 2200 | | bl extern lj_buf_tostr |
2244 | | cmplw TMP2, CARG3 | 2201 | | b ->fff_resstr |
2245 | | lbzx TMP1, CARG1, TMP2 | ||
2246 | | bgey ->fff_newstr | ||
2247 | | subi TMP0, TMP1, lo | ||
2248 | | xori TMP3, TMP1, 0x20 | ||
2249 | | addic TMP0, TMP0, -26 | ||
2250 | | subfe TMP3, TMP3, TMP3 | ||
2251 | | rlwinm TMP3, TMP3, 0, 26, 26 // x &= 0x20. | ||
2252 | | xor TMP1, TMP1, TMP3 | ||
2253 | | stbx TMP1, CARG2, TMP2 | ||
2254 | | addi TMP2, TMP2, 1 | ||
2255 | | b <1 | ||
2256 | |.endmacro | 2202 | |.endmacro |
2257 | | | 2203 | | |
2258 | |ffstring_case string_lower, 65 | 2204 | |ffstring_op reverse |
2259 | |ffstring_case string_upper, 97 | 2205 | |ffstring_op lower |
2260 | | | 2206 | |ffstring_op upper |
2261 | |//-- Table library ------------------------------------------------------ | ||
2262 | | | ||
2263 | |.ffunc_1 table_getn | ||
2264 | | checktab CARG3; bne ->fff_fallback | ||
2265 | | bl extern lj_tab_len // (GCtab *t) | ||
2266 | | // Returns uint32_t (but less than 2^31). | ||
2267 | | b ->fff_resi | ||
2268 | | | 2207 | | |
2269 | |//-- Bit library -------------------------------------------------------- | 2208 | |//-- Bit library -------------------------------------------------------- |
2270 | | | 2209 | | |
@@ -2566,6 +2505,19 @@ static void build_subroutines(BuildCtx *ctx) | |||
2566 | | mtctr CRET1 | 2505 | | mtctr CRET1 |
2567 | | bctr | 2506 | | bctr |
2568 | | | 2507 | | |
2508 | |->vm_profhook: // Dispatch target for profiler hook. | ||
2509 | #if LJ_HASPROFILE | ||
2510 | | mr CARG1, L | ||
2511 | | stw MULTRES, SAVE_MULTRES | ||
2512 | | mr CARG2, PC | ||
2513 | | stp BASE, L->base | ||
2514 | | bl extern lj_dispatch_profile // (lua_State *L, const BCIns *pc) | ||
2515 | | // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction. | ||
2516 | | lp BASE, L->base | ||
2517 | | subi PC, PC, 4 | ||
2518 | | b ->cont_nop | ||
2519 | #endif | ||
2520 | | | ||
2569 | |//----------------------------------------------------------------------- | 2521 | |//----------------------------------------------------------------------- |
2570 | |//-- Trace exit handler ------------------------------------------------- | 2522 | |//-- Trace exit handler ------------------------------------------------- |
2571 | |//----------------------------------------------------------------------- | 2523 | |//----------------------------------------------------------------------- |
@@ -2600,16 +2552,16 @@ static void build_subroutines(BuildCtx *ctx) | |||
2600 | | savex_ 20,21,22,23 | 2552 | | savex_ 20,21,22,23 |
2601 | | lhz CARG4, 2(CARG3) // Load trace number. | 2553 | | lhz CARG4, 2(CARG3) // Load trace number. |
2602 | | savex_ 24,25,26,27 | 2554 | | savex_ 24,25,26,27 |
2603 | | lwz L, DISPATCH_GL(jit_L)(DISPATCH) | 2555 | | lwz L, DISPATCH_GL(cur_L)(DISPATCH) |
2604 | | savex_ 28,29,30,31 | 2556 | | savex_ 28,29,30,31 |
2605 | | sub CARG3, TMP0, CARG3 // Compute exit number. | 2557 | | sub CARG3, TMP0, CARG3 // Compute exit number. |
2606 | | lp BASE, DISPATCH_GL(jit_base)(DISPATCH) | 2558 | | lp BASE, DISPATCH_GL(jit_base)(DISPATCH) |
2607 | | srwi CARG3, CARG3, 2 | 2559 | | srwi CARG3, CARG3, 2 |
2608 | | stw L, DISPATCH_J(L)(DISPATCH) | 2560 | | stw L, DISPATCH_J(L)(DISPATCH) |
2609 | | subi CARG3, CARG3, 2 | 2561 | | subi CARG3, CARG3, 2 |
2610 | | stw TMP1, DISPATCH_GL(jit_L)(DISPATCH) | ||
2611 | | stw CARG4, DISPATCH_J(parent)(DISPATCH) | ||
2612 | | stp BASE, L->base | 2562 | | stp BASE, L->base |
2563 | | stw CARG4, DISPATCH_J(parent)(DISPATCH) | ||
2564 | | stw TMP1, DISPATCH_GL(jit_base)(DISPATCH) | ||
2613 | | addi CARG1, DISPATCH, GG_DISP2J | 2565 | | addi CARG1, DISPATCH, GG_DISP2J |
2614 | | stw CARG3, DISPATCH_J(exitno)(DISPATCH) | 2566 | | stw CARG3, DISPATCH_J(exitno)(DISPATCH) |
2615 | | addi CARG2, sp, 16 | 2567 | | addi CARG2, sp, 16 |
@@ -2633,6 +2585,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
2633 | | // CARG1 = MULTRES or negated error code, BASE, PC and JGL set. | 2585 | | // CARG1 = MULTRES or negated error code, BASE, PC and JGL set. |
2634 | | lwz L, SAVE_L | 2586 | | lwz L, SAVE_L |
2635 | | addi DISPATCH, JGL, -GG_DISP2G-32768 | 2587 | | addi DISPATCH, JGL, -GG_DISP2G-32768 |
2588 | | stp BASE, L->base | ||
2636 | |1: | 2589 | |1: |
2637 | | cmpwi CARG1, 0 | 2590 | | cmpwi CARG1, 0 |
2638 | | blt >3 // Check for error from exit. | 2591 | | blt >3 // Check for error from exit. |
@@ -2641,7 +2594,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
2641 | | li TMP2, 0 | 2594 | | li TMP2, 0 |
2642 | | stw MULTRES, SAVE_MULTRES | 2595 | | stw MULTRES, SAVE_MULTRES |
2643 | | lwz TMP1, LFUNC:TMP1->pc | 2596 | | lwz TMP1, LFUNC:TMP1->pc |
2644 | | stw TMP2, DISPATCH_GL(jit_L)(DISPATCH) | 2597 | | stw TMP2, DISPATCH_GL(jit_base)(DISPATCH) |
2645 | | lwz KBASE, PC2PROTO(k)(TMP1) | 2598 | | lwz KBASE, PC2PROTO(k)(TMP1) |
2646 | | // Setup type comparison constants. | 2599 | | // Setup type comparison constants. |
2647 | | li TISNUM, LJ_TISNUM | 2600 | | li TISNUM, LJ_TISNUM |
@@ -3265,6 +3218,29 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
3265 | | ins_next | 3218 | | ins_next |
3266 | break; | 3219 | break; |
3267 | 3220 | ||
3221 | case BC_ISTYPE: | ||
3222 | | // RA = src*8, RD = -type*8 | ||
3223 | | lwzx TMP0, BASE, RA | ||
3224 | | srwi TMP1, RD, 3 | ||
3225 | | ins_next1 | ||
3226 | |.if not PPE and not GPR64 | ||
3227 | | add. TMP0, TMP0, TMP1 | ||
3228 | |.else | ||
3229 | | neg TMP1 | ||
3230 | | cmpw TMP0, TMP1 | ||
3231 | |.endif | ||
3232 | | bne ->vmeta_istype | ||
3233 | | ins_next2 | ||
3234 | break; | ||
3235 | case BC_ISNUM: | ||
3236 | | // RA = src*8, RD = -(TISNUM-1)*8 | ||
3237 | | lwzx TMP0, BASE, RA | ||
3238 | | ins_next1 | ||
3239 | | checknum TMP0 | ||
3240 | | bge ->vmeta_istype | ||
3241 | | ins_next2 | ||
3242 | break; | ||
3243 | |||
3268 | /* -- Unary ops --------------------------------------------------------- */ | 3244 | /* -- Unary ops --------------------------------------------------------- */ |
3269 | 3245 | ||
3270 | case BC_MOV: | 3246 | case BC_MOV: |
@@ -4016,6 +3992,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4016 | | bne <1 // 'no __index' flag set: done. | 3992 | | bne <1 // 'no __index' flag set: done. |
4017 | | b ->vmeta_tgetb // Caveat: preserve TMP0! | 3993 | | b ->vmeta_tgetb // Caveat: preserve TMP0! |
4018 | break; | 3994 | break; |
3995 | case BC_TGETR: | ||
3996 | | // RA = dst*8, RB = table*8, RC = key*8 | ||
3997 | | add RB, BASE, RB | ||
3998 | | lwz TAB:CARG1, 4(RB) | ||
3999 | |.if DUALNUM | ||
4000 | | add RC, BASE, RC | ||
4001 | | lwz TMP0, TAB:CARG1->asize | ||
4002 | | lwz CARG2, 4(RC) | ||
4003 | | lwz TMP1, TAB:CARG1->array | ||
4004 | |.else | ||
4005 | | lfdx f0, BASE, RC | ||
4006 | | lwz TMP0, TAB:CARG1->asize | ||
4007 | | toint CARG2, f0 | ||
4008 | | lwz TMP1, TAB:CARG1->array | ||
4009 | |.endif | ||
4010 | | cmplw TMP0, CARG2 | ||
4011 | | slwi TMP2, CARG2, 3 | ||
4012 | | ble ->vmeta_tgetr // In array part? | ||
4013 | | lfdx f14, TMP1, TMP2 | ||
4014 | |->BC_TGETR_Z: | ||
4015 | | ins_next1 | ||
4016 | | stfdx f14, BASE, RA | ||
4017 | | ins_next2 | ||
4018 | break; | ||
4019 | 4019 | ||
4020 | case BC_TSETV: | 4020 | case BC_TSETV: |
4021 | | // RA = src*8, RB = table*8, RC = key*8 | 4021 | | // RA = src*8, RB = table*8, RC = key*8 |
@@ -4195,6 +4195,39 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4195 | | barrierback TAB:RB, TMP3, TMP0 | 4195 | | barrierback TAB:RB, TMP3, TMP0 |
4196 | | b <2 | 4196 | | b <2 |
4197 | break; | 4197 | break; |
4198 | case BC_TSETR: | ||
4199 | | // RA = dst*8, RB = table*8, RC = key*8 | ||
4200 | | add RB, BASE, RB | ||
4201 | | lwz TAB:CARG2, 4(RB) | ||
4202 | |.if DUALNUM | ||
4203 | | add RC, BASE, RC | ||
4204 | | lbz TMP3, TAB:RB->marked | ||
4205 | | lwz TMP0, TAB:CARG2->asize | ||
4206 | | lwz CARG3, 4(RC) | ||
4207 | | lwz TMP1, TAB:CARG2->array | ||
4208 | |.else | ||
4209 | | lfdx f0, BASE, RC | ||
4210 | | lbz TMP3, TAB:RB->marked | ||
4211 | | lwz TMP0, TAB:CARG2->asize | ||
4212 | | toint CARG3, f0 | ||
4213 | | lwz TMP1, TAB:CARG2->array | ||
4214 | |.endif | ||
4215 | | andix. TMP2, TMP3, LJ_GC_BLACK // isblack(table) | ||
4216 | | bne >7 | ||
4217 | |2: | ||
4218 | | cmplw TMP0, CARG3 | ||
4219 | | slwi TMP2, CARG3, 3 | ||
4220 | | lfdx f14, BASE, RA | ||
4221 | | ble ->vmeta_tsetr // In array part? | ||
4222 | | ins_next1 | ||
4223 | | stfdx f14, TMP1, TMP2 | ||
4224 | | ins_next2 | ||
4225 | | | ||
4226 | |7: // Possible table write barrier for the value. Skip valiswhite check. | ||
4227 | | barrierback TAB:CARG2, TMP3, TMP2 | ||
4228 | | b <2 | ||
4229 | break; | ||
4230 | |||
4198 | 4231 | ||
4199 | case BC_TSETM: | 4232 | case BC_TSETM: |
4200 | | // RA = base*8 (table at base-1), RD = num_const*8 (start index) | 4233 | | // RA = base*8 (table at base-1), RD = num_const*8 (start index) |
@@ -4836,8 +4869,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4836 | | lp TMP2, TRACE:TMP2->mcode | 4869 | | lp TMP2, TRACE:TMP2->mcode |
4837 | | stw BASE, DISPATCH_GL(jit_base)(DISPATCH) | 4870 | | stw BASE, DISPATCH_GL(jit_base)(DISPATCH) |
4838 | | mtctr TMP2 | 4871 | | mtctr TMP2 |
4839 | | stw L, DISPATCH_GL(jit_L)(DISPATCH) | ||
4840 | | addi JGL, DISPATCH, GG_DISP2G+32768 | 4872 | | addi JGL, DISPATCH, GG_DISP2G+32768 |
4873 | | stw L, DISPATCH_GL(tmpbuf.L)(DISPATCH) | ||
4841 | | bctr | 4874 | | bctr |
4842 | |.endif | 4875 | |.endif |
4843 | break; | 4876 | break; |
@@ -4972,6 +5005,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4972 | | lp TMP1, L->top | 5005 | | lp TMP1, L->top |
4973 | | li_vmstate INTERP | 5006 | | li_vmstate INTERP |
4974 | | lwz PC, FRAME_PC(BASE) // Fetch PC of caller. | 5007 | | lwz PC, FRAME_PC(BASE) // Fetch PC of caller. |
5008 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
4975 | | sub RA, TMP1, RD // RA = L->top - nresults*8 | 5009 | | sub RA, TMP1, RD // RA = L->top - nresults*8 |
4976 | | st_vmstate | 5010 | | st_vmstate |
4977 | | b ->vm_returnc | 5011 | | b ->vm_returnc |