diff options
Diffstat (limited to '')
-rw-r--r-- | src/vm_ppc.dasc | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index e6fd977b..d76e3a7b 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: |
@@ -3259,6 +3288,29 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
3259 | | ins_next | 3288 | | ins_next |
3260 | break; | 3289 | break; |
3261 | 3290 | ||
3291 | case BC_ISTYPE: | ||
3292 | | // RA = src*8, RD = -type*8 | ||
3293 | | lwzx TMP0, BASE, RA | ||
3294 | | srwi TMP1, RD, 3 | ||
3295 | | ins_next1 | ||
3296 | |.if not PPE and not GPR64 | ||
3297 | | add. TMP0, TMP0, TMP1 | ||
3298 | |.else | ||
3299 | | neg TMP1 | ||
3300 | | cmpw TMP0, TMP1 | ||
3301 | |.endif | ||
3302 | | bne ->vmeta_istype | ||
3303 | | ins_next2 | ||
3304 | break; | ||
3305 | case BC_ISNUM: | ||
3306 | | // RA = src*8, RD = -(TISNUM-1)*8 | ||
3307 | | lwzx TMP0, BASE, RA | ||
3308 | | ins_next1 | ||
3309 | | checknum TMP0 | ||
3310 | | bge ->vmeta_istype | ||
3311 | | ins_next2 | ||
3312 | break; | ||
3313 | |||
3262 | /* -- Unary ops --------------------------------------------------------- */ | 3314 | /* -- Unary ops --------------------------------------------------------- */ |
3263 | 3315 | ||
3264 | case BC_MOV: | 3316 | case BC_MOV: |
@@ -4010,6 +4062,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4010 | | bne <1 // 'no __index' flag set: done. | 4062 | | bne <1 // 'no __index' flag set: done. |
4011 | | b ->vmeta_tgetb // Caveat: preserve TMP0! | 4063 | | b ->vmeta_tgetb // Caveat: preserve TMP0! |
4012 | break; | 4064 | break; |
4065 | case BC_TGETR: | ||
4066 | | // RA = dst*8, RB = table*8, RC = key*8 | ||
4067 | | add RB, BASE, RB | ||
4068 | | lwz TAB:CARG1, 4(RB) | ||
4069 | |.if DUALNUM | ||
4070 | | add RC, BASE, RC | ||
4071 | | lwz TMP0, TAB:CARG1->asize | ||
4072 | | lwz CARG2, 4(RC) | ||
4073 | | lwz TMP1, TAB:CARG1->array | ||
4074 | |.else | ||
4075 | | lfdx f0, BASE, RC | ||
4076 | | lwz TMP0, TAB:CARG1->asize | ||
4077 | | toint CARG2, f0 | ||
4078 | | lwz TMP1, TAB:CARG1->array | ||
4079 | |.endif | ||
4080 | | cmplw TMP0, CARG2 | ||
4081 | | slwi TMP2, CARG2, 3 | ||
4082 | | ble ->vmeta_tgetr // In array part? | ||
4083 | | lfdx f14, TMP1, TMP2 | ||
4084 | |->BC_TGETR_Z: | ||
4085 | | ins_next1 | ||
4086 | | stfdx f14, BASE, RA | ||
4087 | | ins_next2 | ||
4088 | break; | ||
4013 | 4089 | ||
4014 | case BC_TSETV: | 4090 | case BC_TSETV: |
4015 | | // RA = src*8, RB = table*8, RC = key*8 | 4091 | | // RA = src*8, RB = table*8, RC = key*8 |
@@ -4189,6 +4265,39 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4189 | | barrierback TAB:RB, TMP3, TMP0 | 4265 | | barrierback TAB:RB, TMP3, TMP0 |
4190 | | b <2 | 4266 | | b <2 |
4191 | break; | 4267 | break; |
4268 | case BC_TSETR: | ||
4269 | | // RA = dst*8, RB = table*8, RC = key*8 | ||
4270 | | add RB, BASE, RB | ||
4271 | | lwz TAB:CARG2, 4(RB) | ||
4272 | |.if DUALNUM | ||
4273 | | add RC, BASE, RC | ||
4274 | | lbz TMP3, TAB:RB->marked | ||
4275 | | lwz TMP0, TAB:CARG2->asize | ||
4276 | | lwz CARG3, 4(RC) | ||
4277 | | lwz TMP1, TAB:CARG2->array | ||
4278 | |.else | ||
4279 | | lfdx f0, BASE, RC | ||
4280 | | lbz TMP3, TAB:RB->marked | ||
4281 | | lwz TMP0, TAB:CARG2->asize | ||
4282 | | toint CARG3, f0 | ||
4283 | | lwz TMP1, TAB:CARG2->array | ||
4284 | |.endif | ||
4285 | | andix. TMP2, TMP3, LJ_GC_BLACK // isblack(table) | ||
4286 | | bne >7 | ||
4287 | |2: | ||
4288 | | cmplw TMP0, CARG3 | ||
4289 | | slwi TMP2, CARG3, 3 | ||
4290 | | lfdx f14, BASE, RA | ||
4291 | | ble ->vmeta_tsetr // In array part? | ||
4292 | | ins_next1 | ||
4293 | | stfdx f14, TMP1, TMP2 | ||
4294 | | ins_next2 | ||
4295 | | | ||
4296 | |7: // Possible table write barrier for the value. Skip valiswhite check. | ||
4297 | | barrierback TAB:CARG2, TMP3, TMP2 | ||
4298 | | b <2 | ||
4299 | break; | ||
4300 | |||
4192 | 4301 | ||
4193 | case BC_TSETM: | 4302 | case BC_TSETM: |
4194 | | // RA = base*8 (table at base-1), RD = num_const*8 (start index) | 4303 | | // RA = base*8 (table at base-1), RD = num_const*8 (start index) |