aboutsummaryrefslogtreecommitdiff
path: root/src/vm_mips.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_mips.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_mips.dasc')
-rw-r--r--src/vm_mips.dasc75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc
index 9a39edd69..40e15e888 100644
--- a/src/vm_mips.dasc
+++ b/src/vm_mips.dasc
@@ -982,6 +982,25 @@ static void build_subroutines(BuildCtx *ctx)
982 |. nop 982 |. nop
983#endif 983#endif
984 | 984 |
985 |//-- Bit operator metamethods -------------------------------------------
986 |
987 |->vmeta_bnot:
988 | move RC, RB
989 |
990 |->vmeta_bitop:
991 | load_got lj_meta_bitop
992 | decode_OP1 TMP0, INS
993 | sw BASE, L->base
994 | move CARG2, RA
995 | sw PC, SAVE_PC
996 | move CARG3, RB
997 | move CARG4, RC
998 | sw TMP0, ARG5
999 | call_intern lj_meta_bitop // (lua_State *L, TValue *ra,*rb,*rc, BCReg op)
1000 |. move CARG1, L
1001 | b ->cont_nop
1002 |. nop
1003 |
985 |//-- Call metamethod ---------------------------------------------------- 1004 |//-- Call metamethod ----------------------------------------------------
986 | 1005 |
987 |->vmeta_call: // Resolve and call __call metamethod. 1006 |->vmeta_call: // Resolve and call __call metamethod.
@@ -3886,6 +3905,62 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3886 | ins_next2 3905 | ins_next2
3887 break; 3906 break;
3888 3907
3908 /* -- Bit ops ----------------------------------------------------------- */
3909
3910 case BC_BNOT:
3911 | // RA = dst*8, RD = src*8
3912 | addu RB, BASE, RD
3913 | lw TMP0, HI(RB)
3914 | lw CRET1, LO(RB)
3915 | bne TMP0, TISNUM, ->vmeta_bnot
3916 |. addu RA, BASE, RA
3917 | not CRET1, CRET1
3918 | ins_next1
3919 | sw TISNUM, HI(RA)
3920 | sw CRET1, LO(RA)
3921 | ins_next2
3922 break;
3923
3924 |.macro ins_bitop, ins
3925 | // RA = dst*8, RB = src1*8, RC = src2*8
3926 | decode_RB8a RB, INS
3927 | decode_RB8b RB
3928 | decode_RDtoRC8 RC, RD
3929 | addu RB, BASE, RB
3930 | addu RC, BASE, RC
3931 | lw TMP0, HI(RB)
3932 | lw TMP1, HI(RC)
3933 | lw CRET1, LO(RB)
3934 | bne TMP0, TISNUM, ->vmeta_bitop
3935 |. addu RA, BASE, RA
3936 | lw CRET2, LO(RC)
3937 | bne TMP1, TISNUM, ->vmeta_bitop
3938 |. ins CRET1, CRET1, CRET2
3939 | ins_next1
3940 | sw TISNUM, HI(RA)
3941 | sw CRET1, LO(RA)
3942 | ins_next2
3943 |.endmacro
3944
3945 case BC_BAND:
3946 | ins_bitop and
3947 break;
3948 case BC_BOR:
3949 | ins_bitop or
3950 break;
3951 case BC_BXOR:
3952 | ins_bitop xor
3953 break;
3954 case BC_BSHL:
3955 | ins_bitop sllv
3956 break;
3957 case BC_BSHR:
3958 | ins_bitop srlv
3959 break;
3960 case BC_BSAR:
3961 | ins_bitop srav
3962 break;
3963
3889 /* -- Constant ops ------------------------------------------------------ */ 3964 /* -- Constant ops ------------------------------------------------------ */
3890 3965
3891 case BC_KSTR: 3966 case BC_KSTR: