mirror of https://github.com/rusefi/lua.git
More regularity in uses of enums in 'lcode.c'
This commit is contained in:
parent
ab859fe59b
commit
94689ac3ad
36
lcode.c
36
lcode.c
|
@ -1389,15 +1389,16 @@ static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2,
|
||||||
** Emit code for binary expressions that "produce values" over
|
** Emit code for binary expressions that "produce values" over
|
||||||
** two registers.
|
** two registers.
|
||||||
*/
|
*/
|
||||||
static void codebinexpval (FuncState *fs, OpCode op,
|
static void codebinexpval (FuncState *fs, BinOpr opr,
|
||||||
expdesc *e1, expdesc *e2, int line) {
|
expdesc *e1, expdesc *e2, int line) {
|
||||||
|
OpCode op = cast(OpCode, opr + OP_ADD);
|
||||||
int v2 = luaK_exp2anyreg(fs, e2); /* make sure 'e2' is in a register */
|
int v2 = luaK_exp2anyreg(fs, e2); /* make sure 'e2' is in a register */
|
||||||
/* 'e1' must be already in a register or it is a constant */
|
/* 'e1' must be already in a register or it is a constant */
|
||||||
lua_assert((VNIL <= e1->k && e1->k <= VKSTR) ||
|
lua_assert((VNIL <= e1->k && e1->k <= VKSTR) ||
|
||||||
e1->k == VNONRELOC || e1->k == VRELOC);
|
e1->k == VNONRELOC || e1->k == VRELOC);
|
||||||
lua_assert(OP_ADD <= op && op <= OP_SHR);
|
lua_assert(OP_ADD <= op && op <= OP_SHR);
|
||||||
finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN,
|
finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN,
|
||||||
cast(TMS, (op - OP_ADD) + TM_ADD));
|
cast(TMS, opr + TM_ADD));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1457,10 +1458,9 @@ static void swapexps (expdesc *e1, expdesc *e2) {
|
||||||
*/
|
*/
|
||||||
static void codebinNoK (FuncState *fs, BinOpr opr,
|
static void codebinNoK (FuncState *fs, BinOpr opr,
|
||||||
expdesc *e1, expdesc *e2, int flip, int line) {
|
expdesc *e1, expdesc *e2, int flip, int line) {
|
||||||
OpCode op = cast(OpCode, opr + OP_ADD);
|
|
||||||
if (flip)
|
if (flip)
|
||||||
swapexps(e1, e2); /* back to original order */
|
swapexps(e1, e2); /* back to original order */
|
||||||
codebinexpval(fs, op, e1, e2, line); /* use standard operators */
|
codebinexpval(fs, opr, e1, e2, line); /* use standard operators */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1490,7 +1490,7 @@ static void codecommutative (FuncState *fs, BinOpr op,
|
||||||
flip = 1;
|
flip = 1;
|
||||||
}
|
}
|
||||||
if (op == OPR_ADD && isSCint(e2)) /* immediate operand? */
|
if (op == OPR_ADD && isSCint(e2)) /* immediate operand? */
|
||||||
codebini(fs, cast(OpCode, OP_ADDI), e1, e2, flip, line, TM_ADD);
|
codebini(fs, OP_ADDI, e1, e2, flip, line, TM_ADD);
|
||||||
else
|
else
|
||||||
codearith(fs, op, e1, e2, flip, line);
|
codearith(fs, op, e1, e2, flip, line);
|
||||||
}
|
}
|
||||||
|
@ -1518,25 +1518,27 @@ static void codebitwise (FuncState *fs, BinOpr opr,
|
||||||
** Emit code for order comparisons. When using an immediate operand,
|
** Emit code for order comparisons. When using an immediate operand,
|
||||||
** 'isfloat' tells whether the original value was a float.
|
** 'isfloat' tells whether the original value was a float.
|
||||||
*/
|
*/
|
||||||
static void codeorder (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) {
|
static void codeorder (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {
|
||||||
int r1, r2;
|
int r1, r2;
|
||||||
int im;
|
int im;
|
||||||
int isfloat = 0;
|
int isfloat = 0;
|
||||||
|
OpCode op;
|
||||||
if (isSCnumber(e2, &im, &isfloat)) {
|
if (isSCnumber(e2, &im, &isfloat)) {
|
||||||
/* use immediate operand */
|
/* use immediate operand */
|
||||||
r1 = luaK_exp2anyreg(fs, e1);
|
r1 = luaK_exp2anyreg(fs, e1);
|
||||||
r2 = im;
|
r2 = im;
|
||||||
op = cast(OpCode, (op - OP_LT) + OP_LTI);
|
op = cast(OpCode, (opr - OPR_LT) + OP_LTI);
|
||||||
}
|
}
|
||||||
else if (isSCnumber(e1, &im, &isfloat)) {
|
else if (isSCnumber(e1, &im, &isfloat)) {
|
||||||
/* transform (A < B) to (B > A) and (A <= B) to (B >= A) */
|
/* transform (A < B) to (B > A) and (A <= B) to (B >= A) */
|
||||||
r1 = luaK_exp2anyreg(fs, e2);
|
r1 = luaK_exp2anyreg(fs, e2);
|
||||||
r2 = im;
|
r2 = im;
|
||||||
op = (op == OP_LT) ? OP_GTI : OP_GEI;
|
op = cast(OpCode, (opr - OPR_LT) + OP_GTI);
|
||||||
}
|
}
|
||||||
else { /* regular case, compare two registers */
|
else { /* regular case, compare two registers */
|
||||||
r1 = luaK_exp2anyreg(fs, e1);
|
r1 = luaK_exp2anyreg(fs, e1);
|
||||||
r2 = luaK_exp2anyreg(fs, e2);
|
r2 = luaK_exp2anyreg(fs, e2);
|
||||||
|
op = cast(OpCode, (opr - OPR_EQ) + OP_EQ);
|
||||||
}
|
}
|
||||||
freeexps(fs, e1, e2);
|
freeexps(fs, e1, e2);
|
||||||
e1->u.info = condjump(fs, op, r1, r2, isfloat, 1);
|
e1->u.info = condjump(fs, op, r1, r2, isfloat, 1);
|
||||||
|
@ -1579,16 +1581,16 @@ static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {
|
||||||
/*
|
/*
|
||||||
** Apply prefix operation 'op' to expression 'e'.
|
** Apply prefix operation 'op' to expression 'e'.
|
||||||
*/
|
*/
|
||||||
void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) {
|
void luaK_prefix (FuncState *fs, UnOpr opr, expdesc *e, int line) {
|
||||||
static const expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP};
|
static const expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP};
|
||||||
luaK_dischargevars(fs, e);
|
luaK_dischargevars(fs, e);
|
||||||
switch (op) {
|
switch (opr) {
|
||||||
case OPR_MINUS: case OPR_BNOT: /* use 'ef' as fake 2nd operand */
|
case OPR_MINUS: case OPR_BNOT: /* use 'ef' as fake 2nd operand */
|
||||||
if (constfolding(fs, op + LUA_OPUNM, e, &ef))
|
if (constfolding(fs, opr + LUA_OPUNM, e, &ef))
|
||||||
break;
|
break;
|
||||||
/* else */ /* FALLTHROUGH */
|
/* else */ /* FALLTHROUGH */
|
||||||
case OPR_LEN:
|
case OPR_LEN:
|
||||||
codeunexpval(fs, cast(OpCode, op + OP_UNM), e, line);
|
codeunexpval(fs, cast(OpCode, opr + OP_UNM), e, line);
|
||||||
break;
|
break;
|
||||||
case OPR_NOT: codenot(fs, e); break;
|
case OPR_NOT: codenot(fs, e); break;
|
||||||
default: lua_assert(0);
|
default: lua_assert(0);
|
||||||
|
@ -1718,14 +1720,14 @@ void luaK_posfix (FuncState *fs, BinOpr opr,
|
||||||
/* coded as (r1 >> -I) */;
|
/* coded as (r1 >> -I) */;
|
||||||
}
|
}
|
||||||
else /* regular case (two registers) */
|
else /* regular case (two registers) */
|
||||||
codebinexpval(fs, OP_SHL, e1, e2, line);
|
codebinexpval(fs, opr, e1, e2, line);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OPR_SHR: {
|
case OPR_SHR: {
|
||||||
if (isSCint(e2))
|
if (isSCint(e2))
|
||||||
codebini(fs, OP_SHRI, e1, e2, 0, line, TM_SHR); /* r1 >> I */
|
codebini(fs, OP_SHRI, e1, e2, 0, line, TM_SHR); /* r1 >> I */
|
||||||
else /* regular case (two registers) */
|
else /* regular case (two registers) */
|
||||||
codebinexpval(fs, OP_SHR, e1, e2, line);
|
codebinexpval(fs, opr, e1, e2, line);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OPR_EQ: case OPR_NE: {
|
case OPR_EQ: case OPR_NE: {
|
||||||
|
@ -1733,15 +1735,13 @@ void luaK_posfix (FuncState *fs, BinOpr opr,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OPR_LT: case OPR_LE: {
|
case OPR_LT: case OPR_LE: {
|
||||||
OpCode op = cast(OpCode, (opr - OPR_EQ) + OP_EQ);
|
codeorder(fs, opr, e1, e2);
|
||||||
codeorder(fs, op, e1, e2);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OPR_GT: case OPR_GE: {
|
case OPR_GT: case OPR_GE: {
|
||||||
/* '(a > b)' <=> '(b < a)'; '(a >= b)' <=> '(b <= a)' */
|
/* '(a > b)' <=> '(b < a)'; '(a >= b)' <=> '(b <= a)' */
|
||||||
OpCode op = cast(OpCode, (opr - OPR_NE) + OP_EQ);
|
|
||||||
swapexps(e1, e2);
|
swapexps(e1, e2);
|
||||||
codeorder(fs, op, e1, e2);
|
codeorder(fs, (opr - OPR_NE) + OPR_EQ, e1, e2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: lua_assert(0);
|
default: lua_assert(0);
|
||||||
|
|
Loading…
Reference in New Issue