aboutsummaryrefslogtreecommitdiff
path: root/src/vm_arm.dasc
diff options
context:
space:
mode:
authorMike Pall <mike>2026-07-20 10:20:49 +0200
committerMike Pall <mike>2026-07-20 10:20:49 +0200
commita2ce8114f107464473070427e69e84f4923bd08a (patch)
tree41fb420f360bf1446ae253dda360af5300e401a6 /src/vm_arm.dasc
parent14d8a7a27dc8c626ab9e7c7e9e50b6df6def4f03 (diff)
downloadluajit-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_arm.dasc')
-rw-r--r--src/vm_arm.dasc75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc
index d67dbffcc..d9b2bf663 100644
--- a/src/vm_arm.dasc
+++ b/src/vm_arm.dasc
@@ -849,6 +849,26 @@ static void build_subroutines(BuildCtx *ctx)
849 | b ->vmeta_binop // Binop call for compatibility. 849 | b ->vmeta_binop // Binop call for compatibility.
850#endif 850#endif
851 | 851 |
852 |//-- Bit operator metamethods -------------------------------------------
853 |
854 |->vmeta_bnot:
855 | add CARG3, BASE, RC
856 | mov CARG4, CARG3
857 | b >1
858 |
859 |->vmeta_bitop:
860 | add CARG3, BASE, RB
861 | add CARG4, BASE, RC
862 |1:
863 | decode_OP OP, INS
864 | add CARG2, BASE, RA
865 | str BASE, L->base
866 | mov CARG1, L
867 | str PC, SAVE_PC
868 | str OP, ARG5
869 | bl extern lj_meta_bitop // (lua_State *L, TValue *ra,*rb,*rc, BCReg op)
870 | b ->cont_nop
871 |
852 |//-- Call metamethod ---------------------------------------------------- 872 |//-- Call metamethod ----------------------------------------------------
853 | 873 |
854 |->vmeta_call: // Resolve and call __call metamethod. 874 |->vmeta_call: // Resolve and call __call metamethod.
@@ -3376,6 +3396,61 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3376 | ins_next3 3396 | ins_next3
3377 break; 3397 break;
3378 3398
3399 /* -- Bit ops ----------------------------------------------------------- */
3400
3401 case BC_BNOT:
3402 | // RA = dst, RC = src
3403 | lsl RC, RC, #3
3404 | ldrd CARG12, [BASE, RC]
3405 | checktp CARG1, LJ_TISNUM
3406 | bne ->vmeta_bnot
3407 | mvn CARG1, CARG1
3408 | mvn CARG2, #~LJ_TISNUM
3409 | ins_next1
3410 | ins_next2
3411 | strd CARG12, [BASE, RA]
3412 | ins_next3
3413 break;
3414
3415 |.macro ins_bitop, ins, shop
3416 | decode_RB8 RB, INS
3417 | decode_RC8 RC, INS
3418 | // RA = dst*8, RB = src1*8, RC = src2*8
3419 | ldrd CARG12, [BASE, RB]
3420 | ldrd CARG34, [BASE, RC]
3421 | checktp CARG2, LJ_TISNUM
3422 | checktpeq CARG4, LJ_TISNUM
3423 | bne ->vmeta_bitop
3424 |.if shop == 1
3425 | and CARG3, CARG3, #31
3426 |.endif
3427 | ins CARG1, CARG1, CARG3
3428 | mvn CARG2, #~LJ_TISNUM
3429 | ins_next1
3430 | ins_next2
3431 | strd CARG12, [BASE, RA]
3432 | ins_next3
3433 |.endmacro
3434
3435 case BC_BAND:
3436 | ins_bitop and, 0
3437 break;
3438 case BC_BOR:
3439 | ins_bitop orr, 0
3440 break;
3441 case BC_BXOR:
3442 | ins_bitop eor, 0
3443 break;
3444 case BC_BSHL:
3445 | ins_bitop lsl, 1
3446 break;
3447 case BC_BSHR:
3448 | ins_bitop lsr, 1
3449 break;
3450 case BC_BSAR:
3451 | ins_bitop asr, 1
3452 break;
3453
3379 /* -- Constant ops ------------------------------------------------------ */ 3454 /* -- Constant ops ------------------------------------------------------ */
3380 3455
3381 case BC_KSTR: 3456 case BC_KSTR: