diff options
Diffstat (limited to 'src/vm_mips.dasc')
| -rw-r--r-- | src/vm_mips.dasc | 75 |
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: |
