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