Use of 'MMBIN' opcodes extended to shift operators
Plus, this commit removes useless 'tm' parameters in 'op_*' macros.
This commit is contained in:
26
lcode.c
26
lcode.c
@@ -1339,18 +1339,22 @@ static void codeunexpval (FuncState *fs, OpCode op, expdesc *e, int line) {
|
|||||||
** Expression to produce final result will be encoded in 'e1'.
|
** Expression to produce final result will be encoded in 'e1'.
|
||||||
*/
|
*/
|
||||||
static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2,
|
static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2,
|
||||||
OpCode op, int v2, int k, int line,
|
OpCode op, int v2, int flip, int line,
|
||||||
OpCode mmop, TMS event) {
|
OpCode mmop, TMS event) {
|
||||||
int v1 = luaK_exp2anyreg(fs, e1);
|
int v1 = luaK_exp2anyreg(fs, e1);
|
||||||
int pc = luaK_codeABCk(fs, op, 0, v1, v2, k);
|
int pc = luaK_codeABCk(fs, op, 0, v1, v2, flip);
|
||||||
freeexps(fs, e1, e2);
|
freeexps(fs, e1, e2);
|
||||||
e1->u.info = pc;
|
e1->u.info = pc;
|
||||||
e1->k = VRELOC; /* all those operations are relocatable */
|
e1->k = VRELOC; /* all those operations are relocatable */
|
||||||
luaK_fixline(fs, line);
|
luaK_fixline(fs, line);
|
||||||
if (event != TM_SHL && event != TM_SHR) {
|
if (op == OP_SHRI && flip) {
|
||||||
luaK_codeABCk(fs, mmop, v1, v2, event, k); /* to call metamethod */
|
/* For the metamethod, undo the "changedir" did by 'codeshift' */
|
||||||
luaK_fixline(fs, line);
|
event = TM_SHL;
|
||||||
|
v2 = -(v2 - OFFSET_sC) + OFFSET_sC;
|
||||||
|
flip = 0;
|
||||||
}
|
}
|
||||||
|
luaK_codeABCk(fs, mmop, v1, v2, event, flip); /* to call metamethod */
|
||||||
|
luaK_fixline(fs, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1371,10 +1375,10 @@ static void codebinexpval (FuncState *fs, OpCode op,
|
|||||||
** Code binary operators ('+', '-', ...) with immediate operands.
|
** Code binary operators ('+', '-', ...) with immediate operands.
|
||||||
*/
|
*/
|
||||||
static void codebini (FuncState *fs, OpCode op,
|
static void codebini (FuncState *fs, OpCode op,
|
||||||
expdesc *e1, expdesc *e2, int k, int line,
|
expdesc *e1, expdesc *e2, int flip, int line,
|
||||||
TMS event) {
|
TMS event) {
|
||||||
int v2 = cast_int(e2->u.ival) + OFFSET_sC; /* immediate operand */
|
int v2 = cast_int(e2->u.ival) + OFFSET_sC; /* immediate operand */
|
||||||
finishbinexpval(fs, e1, e2, op, v2, k, line, OP_MMBINI, event);
|
finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINI, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1429,12 +1433,12 @@ static void codecommutative (FuncState *fs, BinOpr op,
|
|||||||
*/
|
*/
|
||||||
static void codebitwise (FuncState *fs, BinOpr opr,
|
static void codebitwise (FuncState *fs, BinOpr opr,
|
||||||
expdesc *e1, expdesc *e2, int line) {
|
expdesc *e1, expdesc *e2, int line) {
|
||||||
int inv = 0;
|
int flip = 0;
|
||||||
int v2;
|
int v2;
|
||||||
OpCode op;
|
OpCode op;
|
||||||
if (e1->k == VKINT && luaK_exp2RK(fs, e1)) {
|
if (e1->k == VKINT && luaK_exp2RK(fs, e1)) {
|
||||||
swapexps(e1, e2); /* 'e2' will be the constant operand */
|
swapexps(e1, e2); /* 'e2' will be the constant operand */
|
||||||
inv = 1;
|
flip = 1;
|
||||||
}
|
}
|
||||||
else if (!(e2->k == VKINT && luaK_exp2RK(fs, e2))) { /* no constants? */
|
else if (!(e2->k == VKINT && luaK_exp2RK(fs, e2))) { /* no constants? */
|
||||||
op = cast(OpCode, opr + OP_ADD);
|
op = cast(OpCode, opr + OP_ADD);
|
||||||
@@ -1444,7 +1448,7 @@ static void codebitwise (FuncState *fs, BinOpr opr,
|
|||||||
v2 = e2->u.info; /* index in K array */
|
v2 = e2->u.info; /* index in K array */
|
||||||
op = cast(OpCode, opr + OP_ADDK);
|
op = cast(OpCode, opr + OP_ADDK);
|
||||||
lua_assert(ttisinteger(&fs->f->k[v2]));
|
lua_assert(ttisinteger(&fs->f->k[v2]));
|
||||||
finishbinexpval(fs, e1, e2, op, v2, inv, line, OP_MMBINK,
|
finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK,
|
||||||
cast(TMS, opr + TM_ADD));
|
cast(TMS, opr + TM_ADD));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1461,7 +1465,7 @@ static void codeshift (FuncState *fs, OpCode op,
|
|||||||
changedir = 1;
|
changedir = 1;
|
||||||
e2->u.ival = -(e2->u.ival);
|
e2->u.ival = -(e2->u.ival);
|
||||||
}
|
}
|
||||||
codebini(fs, OP_SHRI, e1, e2, changedir, line, TM_SHL);
|
codebini(fs, OP_SHRI, e1, e2, changedir, line, TM_SHR);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
codebinexpval(fs, op, e1, e2, line);
|
codebinexpval(fs, op, e1, e2, line);
|
||||||
|
|||||||
8
ldebug.c
8
ldebug.c
@@ -628,11 +628,6 @@ static const char *funcnamefromcode (lua_State *L, CallInfo *ci,
|
|||||||
tm = cast(TMS, GETARG_C(i));
|
tm = cast(TMS, GETARG_C(i));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_SHL: case OP_SHR: {
|
|
||||||
int offset = GET_OPCODE(i) - OP_ADD; /* ORDER OP */
|
|
||||||
tm = cast(TMS, offset + TM_ADD); /* ORDER TM */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case OP_UNM: tm = TM_UNM; break;
|
case OP_UNM: tm = TM_UNM; break;
|
||||||
case OP_BNOT: tm = TM_BNOT; break;
|
case OP_BNOT: tm = TM_BNOT; break;
|
||||||
case OP_LEN: tm = TM_LEN; break;
|
case OP_LEN: tm = TM_LEN; break;
|
||||||
@@ -641,9 +636,6 @@ static const char *funcnamefromcode (lua_State *L, CallInfo *ci,
|
|||||||
case OP_LT: case OP_LE: case OP_LTI: case OP_LEI:
|
case OP_LT: case OP_LE: case OP_LTI: case OP_LEI:
|
||||||
*name = "order"; /* '<=' can call '__lt', etc. */
|
*name = "order"; /* '<=' can call '__lt', etc. */
|
||||||
return "metamethod";
|
return "metamethod";
|
||||||
case OP_SHRI: case OP_SHLI:
|
|
||||||
*name = "shift";
|
|
||||||
return "metamethod";
|
|
||||||
case OP_CLOSE: case OP_RETURN:
|
case OP_CLOSE: case OP_RETURN:
|
||||||
*name = "close";
|
*name = "close";
|
||||||
return "metamethod";
|
return "metamethod";
|
||||||
|
|||||||
102
lvm.c
102
lvm.c
@@ -674,6 +674,8 @@ lua_Number luaV_modf (lua_State *L, lua_Number m, lua_Number n) {
|
|||||||
/*
|
/*
|
||||||
** Shift left operation. (Shift right just negates 'y'.)
|
** Shift left operation. (Shift right just negates 'y'.)
|
||||||
*/
|
*/
|
||||||
|
#define luaV_shiftr(x,y) luaV_shiftl(x,-(y))
|
||||||
|
|
||||||
lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) {
|
lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) {
|
||||||
if (y < 0) { /* shift right? */
|
if (y < 0) { /* shift right? */
|
||||||
if (y <= -NBITS) return 0;
|
if (y <= -NBITS) return 0;
|
||||||
@@ -721,7 +723,6 @@ void luaV_finishOp (lua_State *L) {
|
|||||||
setobjs2s(L, base + GETARG_A(*(ci->u.l.savedpc - 2)), --L->top);
|
setobjs2s(L, base + GETARG_A(*(ci->u.l.savedpc - 2)), --L->top);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_SHLI: case OP_SHRI: case OP_SHL: case OP_SHR:
|
|
||||||
case OP_UNM: case OP_BNOT: case OP_LEN:
|
case OP_UNM: case OP_BNOT: case OP_LEN:
|
||||||
case OP_GETTABUP: case OP_GETTABLE: case OP_GETI:
|
case OP_GETTABUP: case OP_GETTABLE: case OP_GETI:
|
||||||
case OP_GETFIELD: case OP_SELF: {
|
case OP_GETFIELD: case OP_SELF: {
|
||||||
@@ -778,9 +779,9 @@ void luaV_finishOp (lua_State *L) {
|
|||||||
#define l_addi(L,a,b) intop(+, a, b)
|
#define l_addi(L,a,b) intop(+, a, b)
|
||||||
#define l_subi(L,a,b) intop(-, a, b)
|
#define l_subi(L,a,b) intop(-, a, b)
|
||||||
#define l_muli(L,a,b) intop(*, a, b)
|
#define l_muli(L,a,b) intop(*, a, b)
|
||||||
#define l_band(L,a,b) intop(&, a, b)
|
#define l_band(a,b) intop(&, a, b)
|
||||||
#define l_bor(L,a,b) intop(|, a, b)
|
#define l_bor(a,b) intop(|, a, b)
|
||||||
#define l_bxor(L,a,b) intop(^, a, b)
|
#define l_bxor(a,b) intop(^, a, b)
|
||||||
|
|
||||||
#define l_lti(a,b) (a < b)
|
#define l_lti(a,b) (a < b)
|
||||||
#define l_lei(a,b) (a <= b)
|
#define l_lei(a,b) (a <= b)
|
||||||
@@ -827,7 +828,7 @@ void luaV_finishOp (lua_State *L) {
|
|||||||
** Auxiliary function for arithmetic operations over floats and others
|
** Auxiliary function for arithmetic operations over floats and others
|
||||||
** with two register operands.
|
** with two register operands.
|
||||||
*/
|
*/
|
||||||
#define op_arithf_aux(L,v1,v2,fop,tm) { \
|
#define op_arithf_aux(L,v1,v2,fop) { \
|
||||||
lua_Number n1; lua_Number n2; \
|
lua_Number n1; lua_Number n2; \
|
||||||
if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \
|
if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \
|
||||||
pc++; setfltvalue(s2v(ra), fop(L, n1, n2)); \
|
pc++; setfltvalue(s2v(ra), fop(L, n1, n2)); \
|
||||||
@@ -837,29 +838,29 @@ void luaV_finishOp (lua_State *L) {
|
|||||||
/*
|
/*
|
||||||
** Arithmetic operations over floats and others with register operands.
|
** Arithmetic operations over floats and others with register operands.
|
||||||
*/
|
*/
|
||||||
#define op_arithf(L,fop,tm) { \
|
#define op_arithf(L,fop) { \
|
||||||
TValue *v1 = vRB(i); \
|
TValue *v1 = vRB(i); \
|
||||||
TValue *v2 = vRC(i); \
|
TValue *v2 = vRC(i); \
|
||||||
op_arithf_aux(L, v1, v2, fop, tm); }
|
op_arithf_aux(L, v1, v2, fop); }
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Arithmetic operations with register operands.
|
** Arithmetic operations with register operands.
|
||||||
*/
|
*/
|
||||||
#define op_arith(L,iop,fop,tm) { \
|
#define op_arith(L,iop,fop) { \
|
||||||
TValue *v1 = vRB(i); \
|
TValue *v1 = vRB(i); \
|
||||||
TValue *v2 = vRC(i); \
|
TValue *v2 = vRC(i); \
|
||||||
if (ttisinteger(v1) && ttisinteger(v2)) { \
|
if (ttisinteger(v1) && ttisinteger(v2)) { \
|
||||||
lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \
|
lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \
|
||||||
pc++; setivalue(s2v(ra), iop(L, i1, i2)); \
|
pc++; setivalue(s2v(ra), iop(L, i1, i2)); \
|
||||||
} \
|
} \
|
||||||
else op_arithf_aux(L, v1, v2, fop, tm); }
|
else op_arithf_aux(L, v1, v2, fop); }
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Arithmetic operations with K operands.
|
** Arithmetic operations with K operands.
|
||||||
*/
|
*/
|
||||||
#define op_arithK(L,iop,fop,tm,flip) { \
|
#define op_arithK(L,iop,fop,flip) { \
|
||||||
TValue *v1 = vRB(i); \
|
TValue *v1 = vRB(i); \
|
||||||
TValue *v2 = KC(i); \
|
TValue *v2 = KC(i); \
|
||||||
if (ttisinteger(v1) && ttisinteger(v2)) { \
|
if (ttisinteger(v1) && ttisinteger(v2)) { \
|
||||||
@@ -876,7 +877,7 @@ void luaV_finishOp (lua_State *L) {
|
|||||||
/*
|
/*
|
||||||
** Arithmetic operations with K operands for floats.
|
** Arithmetic operations with K operands for floats.
|
||||||
*/
|
*/
|
||||||
#define op_arithfK(L,fop,tm) { \
|
#define op_arithfK(L,fop) { \
|
||||||
TValue *v1 = vRB(i); \
|
TValue *v1 = vRB(i); \
|
||||||
TValue *v2 = KC(i); \
|
TValue *v2 = KC(i); \
|
||||||
lua_Number n1; lua_Number n2; \
|
lua_Number n1; lua_Number n2; \
|
||||||
@@ -888,25 +889,25 @@ void luaV_finishOp (lua_State *L) {
|
|||||||
/*
|
/*
|
||||||
** Bitwise operations with constant operand.
|
** Bitwise operations with constant operand.
|
||||||
*/
|
*/
|
||||||
#define op_bitwiseK(L,op,tm) { \
|
#define op_bitwiseK(L,op) { \
|
||||||
TValue *v1 = vRB(i); \
|
TValue *v1 = vRB(i); \
|
||||||
TValue *v2 = KC(i); \
|
TValue *v2 = KC(i); \
|
||||||
lua_Integer i1; \
|
lua_Integer i1; \
|
||||||
lua_Integer i2 = ivalue(v2); \
|
lua_Integer i2 = ivalue(v2); \
|
||||||
if (tointegerns(v1, &i1)) { \
|
if (tointegerns(v1, &i1)) { \
|
||||||
pc++; setivalue(s2v(ra), op(L, i1, i2)); \
|
pc++; setivalue(s2v(ra), op(i1, i2)); \
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Bitwise operations with register operands.
|
** Bitwise operations with register operands.
|
||||||
*/
|
*/
|
||||||
#define op_bitwise(L,op,tm) { \
|
#define op_bitwise(L,op) { \
|
||||||
TValue *v1 = vRB(i); \
|
TValue *v1 = vRB(i); \
|
||||||
TValue *v2 = vRC(i); \
|
TValue *v2 = vRC(i); \
|
||||||
lua_Integer i1; lua_Integer i2; \
|
lua_Integer i1; lua_Integer i2; \
|
||||||
if (tointegerns(v1, &i1) && tointegerns(v2, &i2)) { \
|
if (tointegerns(v1, &i1) && tointegerns(v2, &i2)) { \
|
||||||
pc++; setivalue(s2v(ra), op(L, i1, i2)); \
|
pc++; setivalue(s2v(ra), op(i1, i2)); \
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
||||||
@@ -1296,43 +1297,43 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
|
|||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_ADDK) {
|
vmcase(OP_ADDK) {
|
||||||
op_arithK(L, l_addi, luai_numadd, TM_ADD, GETARG_k(i));
|
op_arithK(L, l_addi, luai_numadd, GETARG_k(i));
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_SUBK) {
|
vmcase(OP_SUBK) {
|
||||||
op_arithK(L, l_subi, luai_numsub, TM_SUB, 0);
|
op_arithK(L, l_subi, luai_numsub, 0);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_MULK) {
|
vmcase(OP_MULK) {
|
||||||
op_arithK(L, l_muli, luai_nummul, TM_MUL, GETARG_k(i));
|
op_arithK(L, l_muli, luai_nummul, GETARG_k(i));
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_MODK) {
|
vmcase(OP_MODK) {
|
||||||
op_arithK(L, luaV_mod, luaV_modf, TM_MOD, 0);
|
op_arithK(L, luaV_mod, luaV_modf, 0);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_POWK) {
|
vmcase(OP_POWK) {
|
||||||
op_arithfK(L, luai_numpow, TM_POW);
|
op_arithfK(L, luai_numpow);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_DIVK) {
|
vmcase(OP_DIVK) {
|
||||||
op_arithfK(L, luai_numdiv, TM_DIV);
|
op_arithfK(L, luai_numdiv);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_IDIVK) {
|
vmcase(OP_IDIVK) {
|
||||||
op_arithK(L, luaV_idiv, luai_numidiv, TM_IDIV, 0);
|
op_arithK(L, luaV_idiv, luai_numidiv, 0);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_BANDK) {
|
vmcase(OP_BANDK) {
|
||||||
op_bitwiseK(L, l_band, TM_BAND);
|
op_bitwiseK(L, l_band);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_BORK) {
|
vmcase(OP_BORK) {
|
||||||
op_bitwiseK(L, l_bor, TM_BOR);
|
op_bitwiseK(L, l_bor);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_BXORK) {
|
vmcase(OP_BXORK) {
|
||||||
op_bitwiseK(L, l_bxor, TM_BXOR);
|
op_bitwiseK(L, l_bxor);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_SHRI) {
|
vmcase(OP_SHRI) {
|
||||||
@@ -1340,14 +1341,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
|
|||||||
int ic = GETARG_sC(i);
|
int ic = GETARG_sC(i);
|
||||||
lua_Integer ib;
|
lua_Integer ib;
|
||||||
if (tointegerns(rb, &ib)) {
|
if (tointegerns(rb, &ib)) {
|
||||||
setivalue(s2v(ra), luaV_shiftl(ib, -ic));
|
pc++; setivalue(s2v(ra), luaV_shiftl(ib, -ic));
|
||||||
}
|
|
||||||
else {
|
|
||||||
TMS ev = TM_SHR;
|
|
||||||
if (TESTARG_k(i)) {
|
|
||||||
ic = -ic; ev = TM_SHL;
|
|
||||||
}
|
|
||||||
ProtectNT(luaT_trybiniTM(L, rb, ic, 0, ra, ev));
|
|
||||||
}
|
}
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
@@ -1356,72 +1350,56 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
|
|||||||
int ic = GETARG_sC(i);
|
int ic = GETARG_sC(i);
|
||||||
lua_Integer ib;
|
lua_Integer ib;
|
||||||
if (tointegerns(rb, &ib)) {
|
if (tointegerns(rb, &ib)) {
|
||||||
setivalue(s2v(ra), luaV_shiftl(ic, ib));
|
pc++; setivalue(s2v(ra), luaV_shiftl(ic, ib));
|
||||||
}
|
}
|
||||||
else
|
|
||||||
ProtectNT(luaT_trybiniTM(L, rb, ic, 1, ra, TM_SHL));
|
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_ADD) {
|
vmcase(OP_ADD) {
|
||||||
op_arith(L, l_addi, luai_numadd, TM_ADD);
|
op_arith(L, l_addi, luai_numadd);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_SUB) {
|
vmcase(OP_SUB) {
|
||||||
op_arith(L, l_subi, luai_numsub, TM_SUB);
|
op_arith(L, l_subi, luai_numsub);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_MUL) {
|
vmcase(OP_MUL) {
|
||||||
op_arith(L, l_muli, luai_nummul, TM_MUL);
|
op_arith(L, l_muli, luai_nummul);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_MOD) {
|
vmcase(OP_MOD) {
|
||||||
op_arith(L, luaV_mod, luaV_modf, TM_MOD);
|
op_arith(L, luaV_mod, luaV_modf);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_POW) {
|
vmcase(OP_POW) {
|
||||||
op_arithf(L, luai_numpow, TM_POW);
|
op_arithf(L, luai_numpow);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_DIV) { /* float division (always with floats) */
|
vmcase(OP_DIV) { /* float division (always with floats) */
|
||||||
op_arithf(L, luai_numdiv, TM_DIV);
|
op_arithf(L, luai_numdiv);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_IDIV) { /* floor division */
|
vmcase(OP_IDIV) { /* floor division */
|
||||||
op_arith(L, luaV_idiv, luai_numidiv, TM_IDIV);
|
op_arith(L, luaV_idiv, luai_numidiv);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_BAND) {
|
vmcase(OP_BAND) {
|
||||||
op_bitwise(L, l_band, TM_BAND);
|
op_bitwise(L, l_band);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_BOR) {
|
vmcase(OP_BOR) {
|
||||||
op_bitwise(L, l_bor, TM_BOR);
|
op_bitwise(L, l_bor);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_BXOR) {
|
vmcase(OP_BXOR) {
|
||||||
op_bitwise(L, l_bxor, TM_BXOR);
|
op_bitwise(L, l_bxor);
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_SHR) {
|
vmcase(OP_SHR) {
|
||||||
TValue *rb = vRB(i);
|
op_bitwise(L, luaV_shiftr);
|
||||||
TValue *rc = vRC(i);
|
|
||||||
lua_Integer ib; lua_Integer ic;
|
|
||||||
if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) {
|
|
||||||
setivalue(s2v(ra), luaV_shiftl(ib, -ic));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ProtectNT(luaT_trybinTM(L, rb, rc, ra, TM_SHR));
|
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_SHL) {
|
vmcase(OP_SHL) {
|
||||||
TValue *rb = vRB(i);
|
op_bitwise(L, luaV_shiftl);
|
||||||
TValue *rc = vRC(i);
|
|
||||||
lua_Integer ib; lua_Integer ic;
|
|
||||||
if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) {
|
|
||||||
setivalue(s2v(ra), luaV_shiftl(ib, ic));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ProtectNT(luaT_trybinTM(L, rb, rc, ra, TM_SHL));
|
|
||||||
vmbreak;
|
vmbreak;
|
||||||
}
|
}
|
||||||
vmcase(OP_MMBIN) {
|
vmcase(OP_MMBIN) {
|
||||||
|
|||||||
@@ -304,9 +304,9 @@ checkR(function (x) return x // 1 end, 10.0, 10.0,
|
|||||||
'IDIVI', 'MMBINI', 'RETURN1')
|
'IDIVI', 'MMBINI', 'RETURN1')
|
||||||
checkR(function (x) return x % (100 - 10) end, 91, 1,
|
checkR(function (x) return x % (100 - 10) end, 91, 1,
|
||||||
'MODI', 'MMBINI', 'RETURN1')
|
'MODI', 'MMBINI', 'RETURN1')
|
||||||
checkR(function (x) return k1 << x end, 3, 8, 'SHLI', 'RETURN1')
|
checkR(function (x) return k1 << x end, 3, 8, 'SHLI', 'MMBINI', 'RETURN1')
|
||||||
checkR(function (x) return x << 2 end, 10, 40, 'SHRI', 'RETURN1')
|
checkR(function (x) return x << 2 end, 10, 40, 'SHRI', 'MMBINI', 'RETURN1')
|
||||||
checkR(function (x) return x >> 2 end, 8, 2, 'SHRI', 'RETURN1')
|
checkR(function (x) return x >> 2 end, 8, 2, 'SHRI', 'MMBINI', 'RETURN1')
|
||||||
checkR(function (x) return x & 1 end, 9, 1, 'BANDK', 'MMBINK', 'RETURN1')
|
checkR(function (x) return x & 1 end, 9, 1, 'BANDK', 'MMBINK', 'RETURN1')
|
||||||
checkR(function (x) return 10 | x end, 1, 11, 'BORK', 'MMBINK', 'RETURN1')
|
checkR(function (x) return 10 | x end, 1, 11, 'BORK', 'MMBINK', 'RETURN1')
|
||||||
checkR(function (x) return -10 ~ x end, -1, 9, 'BXORK', 'MMBINK', 'RETURN1')
|
checkR(function (x) return -10 ~ x end, -1, 9, 'BXORK', 'MMBINK', 'RETURN1')
|
||||||
@@ -329,7 +329,7 @@ check(function () return -0.0 end, 'LOADF', 'UNM', 'RETURN1')
|
|||||||
check(function () return k3/0 end, 'LOADI', 'DIVI', 'MMBINI', 'RETURN1')
|
check(function () return k3/0 end, 'LOADI', 'DIVI', 'MMBINI', 'RETURN1')
|
||||||
check(function () return 0%0 end, 'LOADI', 'MODI', 'MMBINI', 'RETURN1')
|
check(function () return 0%0 end, 'LOADI', 'MODI', 'MMBINI', 'RETURN1')
|
||||||
check(function () return -4//0 end, 'LOADI', 'IDIVI', 'MMBINI', 'RETURN1')
|
check(function () return -4//0 end, 'LOADI', 'IDIVI', 'MMBINI', 'RETURN1')
|
||||||
check(function (x) return x >> 2.0 end, 'LOADF', 'SHR', 'RETURN1')
|
check(function (x) return x >> 2.0 end, 'LOADF', 'SHR', 'MMBIN', 'RETURN1')
|
||||||
check(function (x) return x & 2.0 end, 'LOADF', 'BAND', 'MMBIN', 'RETURN1')
|
check(function (x) return x & 2.0 end, 'LOADF', 'BAND', 'MMBIN', 'RETURN1')
|
||||||
|
|
||||||
-- basic 'for' loops
|
-- basic 'for' loops
|
||||||
|
|||||||
@@ -806,8 +806,7 @@ assert(a+3 == "add" and 3-a == "sub" and a*3 == "mul" and
|
|||||||
-a == "unm" and #a == "len" and a&3 == "band")
|
-a == "unm" and #a == "len" and a&3 == "band")
|
||||||
assert(a + 30000 == "add" and a - 3.0 == "sub" and a * 3.0 == "mul" and
|
assert(a + 30000 == "add" and a - 3.0 == "sub" and a * 3.0 == "mul" and
|
||||||
-a == "unm" and #a == "len" and a & 3 == "band")
|
-a == "unm" and #a == "len" and a & 3 == "band")
|
||||||
assert(a|3 == "bor" and 3~a == "bxor" and a<<3 == "shift" and
|
assert(a|3 == "bor" and 3~a == "bxor" and a<<3 == "shl" and a>>1 == "shr")
|
||||||
a>>1 == "shift")
|
|
||||||
assert (a==b and a.op == "eq")
|
assert (a==b and a.op == "eq")
|
||||||
assert (a>=b and a.op == "order")
|
assert (a>=b and a.op == "order")
|
||||||
assert (a>b and a.op == "order")
|
assert (a>b and a.op == "order")
|
||||||
|
|||||||
Reference in New Issue
Block a user