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.dasc100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc
index 440bf1c4b..8d257fdf5 100644
--- a/src/vm_ppc.dasc
+++ b/src/vm_ppc.dasc
@@ -1269,6 +1269,25 @@ static void build_subroutines(BuildCtx *ctx)
1269 | b ->vmeta_binop // Binop call for compatibility. 1269 | b ->vmeta_binop // Binop call for compatibility.
1270#endif 1270#endif
1271 | 1271 |
1272 |//-- Bit operator metamethods -------------------------------------------
1273 |
1274 |->vmeta_bnot:
1275 | mr CARG3, RD
1276 | mr CARG4, RD
1277 | b >1
1278 |
1279 |->vmeta_bitop:
1280 | mr CARG3, RB
1281 | mr CARG4, RC
1282 |1:
1283 | add CARG2, BASE, RA
1284 | stp BASE, L->base
1285 | mr CARG1, L
1286 | stw PC, SAVE_PC
1287 | decode_OP1 CARG5, INS // Caveat: CARG5 overlaps INS.
1288 | bl extern lj_meta_bitop // (lua_State *L, TValue *ra,*rb,*rc, BCReg op)
1289 | b ->cont_nop
1290 |
1272 |//-- Call metamethod ---------------------------------------------------- 1291 |//-- Call metamethod ----------------------------------------------------
1273 | 1292 |
1274 |->vmeta_call: // Resolve and call __call metamethod. 1293 |->vmeta_call: // Resolve and call __call metamethod.
@@ -4357,6 +4376,87 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
4357 | ins_next2 4376 | ins_next2
4358 break; 4377 break;
4359 4378
4379 /* -- Bit ops ----------------------------------------------------------- */
4380
4381 case BC_BNOT:
4382 | lwzux CARG1, RD, BASE
4383 |.if DUALNUM
4384 | lwz CARG2, 4(RD)
4385 | checknum cr0, CARG1
4386 | bne ->vmeta_bnot
4387 |.else
4388 | lfd FARG1, 0(RD)
4389 | checknum cr0, CARG1
4390 | bge ->vmeta_bnot
4391 | fadd FARG1, FARG1, TOBIT
4392 | stfd FARG1, TMPD
4393 | lwz CARG2, TMPD_LO
4394 |.endif
4395 | not CARG2, CARG2
4396 |7:
4397 |.if DUALNUM
4398 | ins_next1
4399 | stwux TISNUM, RA, BASE
4400 | stw CARG2, 4(RA)
4401 |.else
4402 | tonum_u FARG1, CARG2
4403 | ins_next1
4404 | stfdx FARG1, BASE, RA
4405 |.endif
4406 | ins_next2
4407 break;
4408
4409 |.macro ins_bitop, ins, shmod
4410 | // RA = dst*8, RB = src1*8, RC = src2*8
4411 | lwzux CARG1, RB, BASE
4412 | lwzux CARG3, RC, BASE
4413 |.if DUALNUM
4414 | lwz CARG2, 4(RB)
4415 | lwz CARG4, 4(RC)
4416 | checknum cr0, CARG1
4417 | checknum cr1, CARG3
4418 | bne ->vmeta_bitop
4419 | bne cr1, ->vmeta_bitop
4420 |.else
4421 | lfd FARG1, 0(RB)
4422 | lfd FARG2, 0(RC)
4423 | checknum cr0, CARG1
4424 | checknum cr1, CARG3
4425 | bge ->vmeta_bitop
4426 | bge cr1, ->vmeta_bitop
4427 | fadd FARG1, FARG1, TOBIT
4428 | fadd FARG2, FARG2, TOBIT
4429 | stfd FARG1, TMPD
4430 | lwz CARG2, TMPD_LO
4431 | stfd FARG2, TMPD
4432 | lwz CARG4, TMPD_LO
4433 |.endif
4434 |.if shmod == 1
4435 | rlwinm CARG4, CARG4, 0, 27, 31
4436 |.endif
4437 | ins CARG2, CARG2, CARG4
4438 | b <7
4439 |.endmacro
4440
4441 case BC_BAND:
4442 | ins_bitop and, 0
4443 break;
4444 case BC_BOR:
4445 | ins_bitop or, 0
4446 break;
4447 case BC_BXOR:
4448 | ins_bitop xor, 0
4449 break;
4450 case BC_BSHL:
4451 | ins_bitop slw, 1
4452 break;
4453 case BC_BSHR:
4454 | ins_bitop srw, 1
4455 break;
4456 case BC_BSAR:
4457 | ins_bitop sraw, 1
4458 break;
4459
4360 /* -- Constant ops ------------------------------------------------------ */ 4460 /* -- Constant ops ------------------------------------------------------ */
4361 4461
4362 case BC_KSTR: 4462 case BC_KSTR: