prepare for bitwise ops

pull/81/head
Dibyendu Majumdar 9 years ago
parent 2d42bfe6e3
commit e1835ddd6a

@ -291,10 +291,18 @@ OP_RAVI_SETUPVALAF, /* A B UpValue[B] := toarrayflt(R(A)) */
OP_RAVI_SETTABLE_AII,/* A B C R(A)[RK(B)] := RK(C) where RK(B) is an int, R(A) is array of ints, and RK(C) is an int */
OP_RAVI_SETTABLE_AFF,/* A B C R(A)[RK(B)] := RK(C) where RK(B) is an int, R(A) is array of floats, and RK(C) is an float */
OP_RAVI_BAND_II,/* A B C R(A) := RK(B) & RK(C) */
OP_RAVI_BOR_II, /* A B C R(A) := RK(B) | RK(C) */
OP_RAVI_BXOR_II,/* A B C R(A) := RK(B) ~ RK(C) */
OP_RAVI_SHL_II, /* A B C R(A) := RK(B) << RK(C) */
OP_RAVI_SHR_II, /* A B C R(A) := RK(B) >> RK(C) */
OP_RAVI_BNOT_I, /* A B R(A) := ~R(B) */
} OpCode;
#define NUM_OPCODES (cast(int, OP_RAVI_SETTABLE_AFF) + 1)
#define NUM_OPCODES (cast(int, OP_RAVI_BNOT_I) + 1)
/*===========================================================================
Notes:

@ -1091,6 +1091,25 @@ static void codeexpval (FuncState *fs, OpCode op,
e1->u.info = luaK_codeABC(fs, OP_RAVI_DIVII, 0, o1, o2);
}
else if (op == OP_BAND && e1->ravi_type == RAVI_TNUMINT && e2->ravi_type == RAVI_TNUMINT) {
e1->u.info = luaK_codeABC(fs, OP_RAVI_BAND_II, 0, o1, o2);
}
else if (op == OP_BOR && e1->ravi_type == RAVI_TNUMINT && e2->ravi_type == RAVI_TNUMINT) {
e1->u.info = luaK_codeABC(fs, OP_RAVI_BOR_II, 0, o1, o2);
}
else if (op == OP_BXOR && e1->ravi_type == RAVI_TNUMINT && e2->ravi_type == RAVI_TNUMINT) {
e1->u.info = luaK_codeABC(fs, OP_RAVI_BXOR_II, 0, o1, o2);
}
else if (op == OP_SHL && e1->ravi_type == RAVI_TNUMINT && e2->ravi_type == RAVI_TNUMINT) {
e1->u.info = luaK_codeABC(fs, OP_RAVI_SHL_II, 0, o1, o2);
}
else if (op == OP_SHR && e1->ravi_type == RAVI_TNUMINT && e2->ravi_type == RAVI_TNUMINT) {
e1->u.info = luaK_codeABC(fs, OP_RAVI_SHR_II, 0, o1, o2);
}
else if (op == OP_BNOT && e1->ravi_type == RAVI_TNUMINT) {
e1->u.info = luaK_codeABC(fs, OP_RAVI_BNOT_I, 0, o1, o2);
}
else {
#endif
e1->u.info = luaK_codeABC(fs, op, 0, o1, o2); /* generate opcode */
@ -1114,11 +1133,14 @@ static void codeexpval (FuncState *fs, OpCode op,
else if ((op == OP_DIV)
&& e1->ravi_type == RAVI_TNUMINT && e2->ravi_type == RAVI_TNUMINT)
e1->ravi_type = RAVI_TNUMFLT;
else if ((op == OP_BAND || op == OP_BOR || op == OP_BXOR || op == OP_SHL || op == OP_SHR)
&& e1->ravi_type == RAVI_TNUMINT && e2->ravi_type == RAVI_TNUMINT)
e1->ravi_type = RAVI_TNUMINT;
else
e1->ravi_type = RAVI_TANY;
}
else {
if (op == OP_LEN)
if (op == OP_LEN || op == OP_BNOT)
e1->ravi_type = RAVI_TNUMINT;
}
luaK_fixline(fs, line);

@ -134,6 +134,13 @@ LUAI_DDEF const char *const luaP_opnames[NUM_OPCODES+1] = {
"SETTABLE_AII",/* A B C R(A)[RK(B)] := RK(C) where RK(B) is an int, R(A) is array of ints, and RK(C) is an int */
"SETTABLE_AFF",/* A B C R(A)[RK(B)] := RK(C) where RK(B) is an int, R(A) is array of floats, and RK(C) is an float */
"BAND_II",/* A B C R(A) := RK(B) & RK(C) */
"BOR_II", /* A B C R(A) := RK(B) | RK(C) */
"BXOR_II",/* A B C R(A) := RK(B) ~ RK(C) */
"SHL_II", /* A B C R(A) := RK(B) << RK(C) */
"SHR_II", /* A B C R(A) := RK(B) >> RK(C) */
"BNOT_I", /* A B R(A) := ~R(B) */
NULL
};
@ -252,6 +259,13 @@ LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = {
, opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_RAVI_SETTABLE_AII A B C R(A)[RK(B)] := RK(C) where RK(B) is an int, R(A) is array of ints, and RK(C) is an int */
, opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_RAVI_SETTABLE_AFF A B C R(A)[RK(B)] := RK(C) where RK(B) is an int, R(A) is array of floats, and RK(C) is an float */
, opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_RAVI_BAND_II */
, opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_RAVI_BOR_II */
, opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_RAVI_BXOR_II */
, opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_RAVI_SHL_II */
, opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_RAVI_SHR_II */
, opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_RAVI_BNOT_I */
};

@ -843,6 +843,7 @@ newframe: /* reentry point when frame changes (call/return) */
}
else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV)); }
} break;
case OP_RAVI_BAND_II:
case OP_BAND: {
TValue *rb = RKB(i);
TValue *rc = RKC(i);
@ -852,6 +853,7 @@ newframe: /* reentry point when frame changes (call/return) */
}
else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BAND)); }
} break;
case OP_RAVI_BOR_II:
case OP_BOR: {
TValue *rb = RKB(i);
TValue *rc = RKC(i);
@ -861,6 +863,7 @@ newframe: /* reentry point when frame changes (call/return) */
}
else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BOR)); }
} break;
case OP_RAVI_BXOR_II:
case OP_BXOR: {
TValue *rb = RKB(i);
TValue *rc = RKC(i);
@ -870,6 +873,7 @@ newframe: /* reentry point when frame changes (call/return) */
}
else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BXOR)); }
} break;
case OP_RAVI_SHL_II:
case OP_SHL: {
TValue *rb = RKB(i);
TValue *rc = RKC(i);
@ -879,6 +883,7 @@ newframe: /* reentry point when frame changes (call/return) */
}
else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHL)); }
} break;
case OP_RAVI_SHR_II:
case OP_SHR: {
TValue *rb = RKB(i);
TValue *rc = RKC(i);
@ -939,6 +944,7 @@ newframe: /* reentry point when frame changes (call/return) */
Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM));
}
} break;
case OP_RAVI_BNOT_I:
case OP_BNOT: {
TValue *rb = RB(i);
lua_Integer ib;

Loading…
Cancel
Save