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