diff options
| author | Mike Pall <mike> | 2026-07-20 10:20:49 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2026-07-20 10:20:49 +0200 |
| commit | a2ce8114f107464473070427e69e84f4923bd08a (patch) | |
| tree | 41fb420f360bf1446ae253dda360af5300e401a6 /src/vm_ppc.dasc | |
| parent | 14d8a7a27dc8c626ab9e7c7e9e50b6df6def4f03 (diff) | |
| download | luajit-a2ce8114f107464473070427e69e84f4923bd08a.tar.gz luajit-a2ce8114f107464473070427e69e84f4923bd08a.tar.bz2 luajit-a2ce8114f107464473070427e69e84f4923bd08a.zip | |
Backport some v3.0 syntax extensions.
Documentation in #1475. Backport discussion in #1476.
Thanks to Appla, slashOwO, Sergey Kaplun, CppCXY.
Diffstat (limited to 'src/vm_ppc.dasc')
| -rw-r--r-- | src/vm_ppc.dasc | 100 |
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: |
