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