diff options
Diffstat (limited to 'src/vm_ppc.dasc')
-rw-r--r-- | src/vm_ppc.dasc | 144 |
1 files changed, 121 insertions, 23 deletions
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index 685ea518..514bd231 100644 --- a/src/vm_ppc.dasc +++ b/src/vm_ppc.dasc | |||
@@ -895,6 +895,17 @@ static void build_subroutines(BuildCtx *ctx) | |||
895 | | li NARGS8:RC, 16 // 2 args for func(t, k). | 895 | | li NARGS8:RC, 16 // 2 args for func(t, k). |
896 | | b ->vm_call_dispatch_f | 896 | | b ->vm_call_dispatch_f |
897 | | | 897 | | |
898 | |->vmeta_tgetr: | ||
899 | | bl extern lj_tab_getinth // (GCtab *t, int32_t key) | ||
900 | | // Returns cTValue * or NULL. | ||
901 | | cmplwi CRET1, 0 | ||
902 | | beq >1 | ||
903 | | lfd f14, 0(CRET1) | ||
904 | | b ->BC_TGETR_Z | ||
905 | |1: | ||
906 | | stwx TISNIL, BASE, RA | ||
907 | | b ->cont_nop | ||
908 | | | ||
898 | |//----------------------------------------------------------------------- | 909 | |//----------------------------------------------------------------------- |
899 | | | 910 | | |
900 | |->vmeta_tsets1: | 911 | |->vmeta_tsets1: |
@@ -962,6 +973,14 @@ static void build_subroutines(BuildCtx *ctx) | |||
962 | | stfd f0, 16(BASE) // Copy value to third argument. | 973 | | stfd f0, 16(BASE) // Copy value to third argument. |
963 | | b ->vm_call_dispatch_f | 974 | | b ->vm_call_dispatch_f |
964 | | | 975 | | |
976 | |->vmeta_tsetr: | ||
977 | | stp BASE, L->base | ||
978 | | stw PC, SAVE_PC | ||
979 | | bl extern lj_tab_setinth // (lua_State *L, GCtab *t, int32_t key) | ||
980 | | // Returns TValue *. | ||
981 | | stfd f14, 0(CRET1) | ||
982 | | b ->cont_nop | ||
983 | | | ||
965 | |//-- Comparison metamethods --------------------------------------------- | 984 | |//-- Comparison metamethods --------------------------------------------- |
966 | | | 985 | | |
967 | |->vmeta_comp: | 986 | |->vmeta_comp: |
@@ -1040,6 +1059,16 @@ static void build_subroutines(BuildCtx *ctx) | |||
1040 | | b <3 | 1059 | | b <3 |
1041 | |.endif | 1060 | |.endif |
1042 | | | 1061 | | |
1062 | |->vmeta_istype: | ||
1063 | | subi PC, PC, 4 | ||
1064 | | stp BASE, L->base | ||
1065 | | srwi CARG2, RA, 3 | ||
1066 | | mr CARG1, L | ||
1067 | | srwi CARG3, RD, 3 | ||
1068 | | stw PC, SAVE_PC | ||
1069 | | bl extern lj_meta_istype // (lua_State *L, BCReg ra, BCReg tp) | ||
1070 | | b ->cont_nop | ||
1071 | | | ||
1043 | |//-- Arithmetic metamethods --------------------------------------------- | 1072 | |//-- Arithmetic metamethods --------------------------------------------- |
1044 | | | 1073 | | |
1045 | |->vmeta_arith_nv: | 1074 | |->vmeta_arith_nv: |
@@ -1870,12 +1899,6 @@ static void build_subroutines(BuildCtx *ctx) | |||
1870 | | math_extern2 atan2 | 1899 | | math_extern2 atan2 |
1871 | | math_extern2 fmod | 1900 | | math_extern2 fmod |
1872 | | | 1901 | | |
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 | 1902 | |.if DUALNUM |
1880 | |.ffunc math_ldexp | 1903 | |.ffunc math_ldexp |
1881 | | cmplwi NARGS8:RC, 16 | 1904 | | cmplwi NARGS8:RC, 16 |
@@ -2178,15 +2201,16 @@ static void build_subroutines(BuildCtx *ctx) | |||
2178 | |.endif | 2201 | |.endif |
2179 | | lwz TMP0, STR:CARG1->len | 2202 | | lwz TMP0, STR:CARG1->len |
2180 | | cmpwi CARG3, 0 | 2203 | | cmpwi CARG3, 0 |
2181 | | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) | 2204 | | lwz TMP1, DISPATCH_GL(tmpbuf.e)(DISPATCH) |
2205 | | lwz CARG2, DISPATCH_GL(tmpbuf.b)(DISPATCH) | ||
2182 | | ble >2 // Count <= 0? (or non-int) | 2206 | | ble >2 // Count <= 0? (or non-int) |
2183 | | cmplwi TMP0, 1 | 2207 | | cmplwi TMP0, 1 |
2208 | | add TMP3, CARG2, CARG3 | ||
2184 | | subi TMP2, CARG3, 1 | 2209 | | subi TMP2, CARG3, 1 |
2185 | | blt >2 // Zero length string? | 2210 | | blt >2 // Zero length string? |
2186 | | cmplw cr1, TMP1, CARG3 | 2211 | | cmplw cr1, TMP1, TMP3 |
2187 | | bne ->fff_fallback // Fallback for > 1-char strings. | 2212 | | bne ->fff_fallback // Fallback for > 1-char strings. |
2188 | | lbz TMP0, STR:CARG1[1] | 2213 | | lbz TMP0, STR:CARG1[1] |
2189 | | lp CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) | ||
2190 | | blt cr1, ->fff_fallback | 2214 | | blt cr1, ->fff_fallback |
2191 | |1: // Fill buffer with char. Yes, this is suboptimal code (do you care?). | 2215 | |1: // Fill buffer with char. Yes, this is suboptimal code (do you care?). |
2192 | | cmplwi TMP2, 0 | 2216 | | cmplwi TMP2, 0 |
@@ -2206,13 +2230,14 @@ static void build_subroutines(BuildCtx *ctx) | |||
2206 | | lwz STR:CARG1, 4(BASE) | 2230 | | lwz STR:CARG1, 4(BASE) |
2207 | | blt ->fff_fallback | 2231 | | blt ->fff_fallback |
2208 | | checkstr CARG3 | 2232 | | checkstr CARG3 |
2209 | | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) | 2233 | | lwz CARG2, DISPATCH_GL(tmpbuf.b)(DISPATCH) |
2234 | | lwz TMP1, DISPATCH_GL(tmpbuf.e)(DISPATCH) | ||
2210 | | bne ->fff_fallback | 2235 | | bne ->fff_fallback |
2211 | | lwz CARG3, STR:CARG1->len | 2236 | | lwz CARG3, STR:CARG1->len |
2212 | | la CARG1, #STR(STR:CARG1) | 2237 | | la CARG1, #STR(STR:CARG1) |
2213 | | lp CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) | ||
2214 | | li TMP2, 0 | 2238 | | li TMP2, 0 |
2215 | | cmplw TMP1, CARG3 | 2239 | | add TMP3, CARG2, CARG3 |
2240 | | cmplw TMP1, TMP3 | ||
2216 | | subi TMP3, CARG3, 1 | 2241 | | subi TMP3, CARG3, 1 |
2217 | | blt ->fff_fallback | 2242 | | blt ->fff_fallback |
2218 | |1: // Reverse string copy. | 2243 | |1: // Reverse string copy. |
@@ -2232,13 +2257,14 @@ static void build_subroutines(BuildCtx *ctx) | |||
2232 | | lwz STR:CARG1, 4(BASE) | 2257 | | lwz STR:CARG1, 4(BASE) |
2233 | | blt ->fff_fallback | 2258 | | blt ->fff_fallback |
2234 | | checkstr CARG3 | 2259 | | checkstr CARG3 |
2235 | | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) | 2260 | | lwz CARG2, DISPATCH_GL(tmpbuf.b)(DISPATCH) |
2261 | | lwz TMP1, DISPATCH_GL(tmpbuf.e)(DISPATCH) | ||
2236 | | bne ->fff_fallback | 2262 | | bne ->fff_fallback |
2237 | | lwz CARG3, STR:CARG1->len | 2263 | | lwz CARG3, STR:CARG1->len |
2238 | | la CARG1, #STR(STR:CARG1) | 2264 | | la CARG1, #STR(STR:CARG1) |
2239 | | lp CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) | ||
2240 | | cmplw TMP1, CARG3 | ||
2241 | | li TMP2, 0 | 2265 | | li TMP2, 0 |
2266 | | add TMP3, CARG2, CARG3 | ||
2267 | | cmplw TMP1, TMP3 | ||
2242 | | blt ->fff_fallback | 2268 | | blt ->fff_fallback |
2243 | |1: // ASCII case conversion. | 2269 | |1: // ASCII case conversion. |
2244 | | cmplw TMP2, CARG3 | 2270 | | cmplw TMP2, CARG3 |
@@ -2258,14 +2284,6 @@ static void build_subroutines(BuildCtx *ctx) | |||
2258 | |ffstring_case string_lower, 65 | 2284 | |ffstring_case string_lower, 65 |
2259 | |ffstring_case string_upper, 97 | 2285 | |ffstring_case string_upper, 97 |
2260 | | | 2286 | | |
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 | | | ||
2269 | |//-- Bit library -------------------------------------------------------- | 2287 | |//-- Bit library -------------------------------------------------------- |
2270 | | | 2288 | | |
2271 | |.macro .ffunc_bit, name | 2289 | |.macro .ffunc_bit, name |
@@ -3265,6 +3283,29 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
3265 | | ins_next | 3283 | | ins_next |
3266 | break; | 3284 | break; |
3267 | 3285 | ||
3286 | case BC_ISTYPE: | ||
3287 | | // RA = src*8, RD = -type*8 | ||
3288 | | lwzx TMP0, BASE, RA | ||
3289 | | srwi TMP1, RD, 3 | ||
3290 | | ins_next1 | ||
3291 | |.if not PPE and not GPR64 | ||
3292 | | add. TMP0, TMP0, TMP1 | ||
3293 | |.else | ||
3294 | | neg TMP1 | ||
3295 | | cmpw TMP0, TMP1 | ||
3296 | |.endif | ||
3297 | | bne ->vmeta_istype | ||
3298 | | ins_next2 | ||
3299 | break; | ||
3300 | case BC_ISNUM: | ||
3301 | | // RA = src*8, RD = -(TISNUM-1)*8 | ||
3302 | | lwzx TMP0, BASE, RA | ||
3303 | | ins_next1 | ||
3304 | | checknum TMP0 | ||
3305 | | bge ->vmeta_istype | ||
3306 | | ins_next2 | ||
3307 | break; | ||
3308 | |||
3268 | /* -- Unary ops --------------------------------------------------------- */ | 3309 | /* -- Unary ops --------------------------------------------------------- */ |
3269 | 3310 | ||
3270 | case BC_MOV: | 3311 | case BC_MOV: |
@@ -4016,6 +4057,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4016 | | bne <1 // 'no __index' flag set: done. | 4057 | | bne <1 // 'no __index' flag set: done. |
4017 | | b ->vmeta_tgetb // Caveat: preserve TMP0! | 4058 | | b ->vmeta_tgetb // Caveat: preserve TMP0! |
4018 | break; | 4059 | break; |
4060 | case BC_TGETR: | ||
4061 | | // RA = dst*8, RB = table*8, RC = key*8 | ||
4062 | | add RB, BASE, RB | ||
4063 | | lwz TAB:CARG1, 4(RB) | ||
4064 | |.if DUALNUM | ||
4065 | | add RC, BASE, RC | ||
4066 | | lwz TMP0, TAB:CARG1->asize | ||
4067 | | lwz CARG2, 4(RC) | ||
4068 | | lwz TMP1, TAB:CARG1->array | ||
4069 | |.else | ||
4070 | | lfdx f0, BASE, RC | ||
4071 | | lwz TMP0, TAB:CARG1->asize | ||
4072 | | toint CARG2, f0 | ||
4073 | | lwz TMP1, TAB:CARG1->array | ||
4074 | |.endif | ||
4075 | | cmplw TMP0, CARG2 | ||
4076 | | slwi TMP2, CARG2, 3 | ||
4077 | | ble ->vmeta_tgetr // In array part? | ||
4078 | | lfdx f14, TMP1, TMP2 | ||
4079 | |->BC_TGETR_Z: | ||
4080 | | ins_next1 | ||
4081 | | stfdx f14, BASE, RA | ||
4082 | | ins_next2 | ||
4083 | break; | ||
4019 | 4084 | ||
4020 | case BC_TSETV: | 4085 | case BC_TSETV: |
4021 | | // RA = src*8, RB = table*8, RC = key*8 | 4086 | | // RA = src*8, RB = table*8, RC = key*8 |
@@ -4195,6 +4260,39 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4195 | | barrierback TAB:RB, TMP3, TMP0 | 4260 | | barrierback TAB:RB, TMP3, TMP0 |
4196 | | b <2 | 4261 | | b <2 |
4197 | break; | 4262 | break; |
4263 | case BC_TSETR: | ||
4264 | | // RA = dst*8, RB = table*8, RC = key*8 | ||
4265 | | add RB, BASE, RB | ||
4266 | | lwz TAB:CARG2, 4(RB) | ||
4267 | |.if DUALNUM | ||
4268 | | add RC, BASE, RC | ||
4269 | | lbz TMP3, TAB:RB->marked | ||
4270 | | lwz TMP0, TAB:CARG2->asize | ||
4271 | | lwz CARG3, 4(RC) | ||
4272 | | lwz TMP1, TAB:CARG2->array | ||
4273 | |.else | ||
4274 | | lfdx f0, BASE, RC | ||
4275 | | lbz TMP3, TAB:RB->marked | ||
4276 | | lwz TMP0, TAB:CARG2->asize | ||
4277 | | toint CARG3, f0 | ||
4278 | | lwz TMP1, TAB:CARG2->array | ||
4279 | |.endif | ||
4280 | | andix. TMP2, TMP3, LJ_GC_BLACK // isblack(table) | ||
4281 | | bne >7 | ||
4282 | |2: | ||
4283 | | cmplw TMP0, CARG3 | ||
4284 | | slwi TMP2, CARG3, 3 | ||
4285 | | lfdx f14, BASE, RA | ||
4286 | | ble ->vmeta_tsetr // In array part? | ||
4287 | | ins_next1 | ||
4288 | | stfdx f14, TMP1, TMP2 | ||
4289 | | ins_next2 | ||
4290 | | | ||
4291 | |7: // Possible table write barrier for the value. Skip valiswhite check. | ||
4292 | | barrierback TAB:CARG2, TMP3, TMP2 | ||
4293 | | b <2 | ||
4294 | break; | ||
4295 | |||
4198 | 4296 | ||
4199 | case BC_TSETM: | 4297 | case BC_TSETM: |
4200 | | // RA = base*8 (table at base-1), RD = num_const*8 (start index) | 4298 | | // RA = base*8 (table at base-1), RD = num_const*8 (start index) |