summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-09-10 13:20:03 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-09-10 13:20:03 -0300
commit91dad09f65984048ae43c8894d18acb785c7092b (patch)
treeea6c23c54d8659677da6259047ddd0c8e0b7e643
parent4518e5df24600cacdb3bab75d640348d28e8b769 (diff)
downloadlua-github-91dad09f65984048ae43c8894d18acb785c7092b.tar.gz
Removed arithmetic opcodes with immediate operand
The difference in performance between immediate operands and K operands does not seem to justify all those extra opcodes. We only keep OP_ADDI, due to its ubiquity and because the difference is a little more relevant. (Later, OP_SUBI will be implemented by OP_ADDI, negating the constant.)
-rw-r--r--lcode.c16
-rw-r--r--ljumptab.h6
-rw-r--r--lopcodes.c6
-rw-r--r--lopcodes.h6
-rw-r--r--lopnames.h6
-rw-r--r--lvm.c24
-rw-r--r--testes/code.lua18
7 files changed, 17 insertions, 65 deletions
diff --git a/lcode.c b/lcode.c
index 2c08409b..841806fd 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1342,7 +1342,7 @@ static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2,
OpCode op, int v2, int flip, int line,
OpCode mmop, TMS event) {
int v1 = luaK_exp2anyreg(fs, e1);
- int pc = luaK_codeABCk(fs, op, 0, v1, v2, flip);
+ int pc = luaK_codeABCk(fs, op, 0, v1, v2, 0);
freeexps(fs, e1, e2);
e1->u.info = pc;
e1->k = VRELOC; /* all those operations are relocatable */
@@ -1372,7 +1372,7 @@ 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,
expdesc *e1, expdesc *e2, int flip, int line,
@@ -1389,15 +1389,12 @@ static void swapexps (expdesc *e1, expdesc *e2) {
/*
** Code arithmetic operators ('+', '-', ...). If second operand is a
-** constant in the proper range, use variant opcodes with immediate
-** operands or K operands.
+** constant in the proper range, use variant opcodes with K operands.
*/
static void codearith (FuncState *fs, BinOpr opr,
expdesc *e1, expdesc *e2, int flip, int line) {
TMS event = cast(TMS, opr + TM_ADD);
- if (isSCint(e2)) /* immediate operand? */
- codebini(fs, cast(OpCode, opr + OP_ADDI), e1, e2, flip, line, event);
- else if (tonumeral(e2, NULL) && luaK_exp2K(fs, e2)) { /* K operand? */
+ if (tonumeral(e2, NULL) && luaK_exp2K(fs, e2)) { /* K operand? */
int v2 = e2->u.info; /* K index */
OpCode op = cast(OpCode, opr + OP_ADDK);
finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, event);
@@ -1423,7 +1420,10 @@ static void codecommutative (FuncState *fs, BinOpr op,
swapexps(e1, e2); /* change order */
flip = 1;
}
- codearith(fs, op, e1, e2, flip, line);
+ if (op == OPR_ADD && isSCint(e2)) /* immediate operand? */
+ codebini(fs, cast(OpCode, OP_ADDI), e1, e2, flip, line, TM_ADD);
+ else
+ codearith(fs, op, e1, e2, flip, line);
}
diff --git a/ljumptab.h b/ljumptab.h
index 1832c809..37fe1e25 100644
--- a/ljumptab.h
+++ b/ljumptab.h
@@ -45,12 +45,6 @@ static void *disptab[NUM_OPCODES] = {
&&L_OP_NEWTABLE,
&&L_OP_SELF,
&&L_OP_ADDI,
-&&L_OP_SUBI,
-&&L_OP_MULI,
-&&L_OP_MODI,
-&&L_OP_POWI,
-&&L_OP_DIVI,
-&&L_OP_IDIVI,
&&L_OP_ADDK,
&&L_OP_SUBK,
&&L_OP_MULK,
diff --git a/lopcodes.c b/lopcodes.c
index 619592ce..90d4cd1a 100644
--- a/lopcodes.c
+++ b/lopcodes.c
@@ -39,12 +39,6 @@ LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = {
,opmode(0, 0, 0, 0, 1, iABC) /* OP_NEWTABLE */
,opmode(0, 0, 0, 0, 1, iABC) /* OP_SELF */
,opmode(0, 0, 0, 0, 1, iABC) /* OP_ADDI */
- ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SUBI */
- ,opmode(0, 0, 0, 0, 1, iABC) /* OP_MULI */
- ,opmode(0, 0, 0, 0, 1, iABC) /* OP_MODI */
- ,opmode(0, 0, 0, 0, 1, iABC) /* OP_POWI */
- ,opmode(0, 0, 0, 0, 1, iABC) /* OP_DIVI */
- ,opmode(0, 0, 0, 0, 1, iABC) /* OP_IDIVI */
,opmode(0, 0, 0, 0, 1, iABC) /* OP_ADDK */
,opmode(0, 0, 0, 0, 1, iABC) /* OP_SUBK */
,opmode(0, 0, 0, 0, 1, iABC) /* OP_MULK */
diff --git a/lopcodes.h b/lopcodes.h
index c5e9cf81..d07a6e2d 100644
--- a/lopcodes.h
+++ b/lopcodes.h
@@ -219,12 +219,6 @@ OP_NEWTABLE,/* A B C R(A) := {} */
OP_SELF,/* A B C R(A+1) := R(B); R(A) := R(B)[RK(C):string] */
OP_ADDI,/* A B sC R(A) := R(B) + C */
-OP_SUBI,/* A B sC R(A) := R(B) - C */
-OP_MULI,/* A B sC R(A) := R(B) * C */
-OP_MODI,/* A B sC R(A) := R(B) % C */
-OP_POWI,/* A B sC R(A) := R(B) ^ C */
-OP_DIVI,/* A B sC R(A) := R(B) / C */
-OP_IDIVI,/* A B sC R(A) := R(B) // C */
OP_ADDK,/* A B C R(A) := R(B) + K(C) */
OP_SUBK,/* A B C R(A) := R(B) - K(C) */
diff --git a/lopnames.h b/lopnames.h
index 0fc1da1f..de347301 100644
--- a/lopnames.h
+++ b/lopnames.h
@@ -30,12 +30,6 @@ static const char *const opnames[] = {
"NEWTABLE",
"SELF",
"ADDI",
- "SUBI",
- "MULI",
- "MODI",
- "POWI",
- "DIVI",
- "IDIVI",
"ADDK",
"SUBK",
"MULK",
diff --git a/lvm.c b/lvm.c
index 46150ef0..e22a0da8 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1271,30 +1271,6 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
op_arithI(L, l_addi, luai_numadd, TM_ADD, GETARG_k(i));
vmbreak;
}
- vmcase(OP_SUBI) {
- op_arithI(L, l_subi, luai_numsub, TM_SUB, 0);
- vmbreak;
- }
- vmcase(OP_MULI) {
- op_arithI(L, l_muli, luai_nummul, TM_MUL, GETARG_k(i));
- vmbreak;
- }
- vmcase(OP_MODI) {
- op_arithI(L, luaV_mod, luaV_modf, TM_MOD, 0);
- vmbreak;
- }
- vmcase(OP_POWI) {
- op_arithfI(L, luai_numpow, TM_POW);
- vmbreak;
- }
- vmcase(OP_DIVI) {
- op_arithfI(L, luai_numdiv, TM_DIV);
- vmbreak;
- }
- vmcase(OP_IDIVI) {
- op_arithI(L, luaV_idiv, luai_numidiv, TM_IDIV, 0);
- vmbreak;
- }
vmcase(OP_ADDK) {
op_arithK(L, l_addi, luai_numadd, GETARG_k(i));
vmbreak;
diff --git a/testes/code.lua b/testes/code.lua
index 96560166..642dfa68 100644
--- a/testes/code.lua
+++ b/testes/code.lua
@@ -296,14 +296,14 @@ checkR(function (x) return x + k1 end, 10, 11, 'ADDI', 'MMBINI', 'RETURN1')
checkR(function (x) return 128 + x end, 0.0, 128.0,
'ADDI', 'MMBINI', 'RETURN1')
checkR(function (x) return x * -127 end, -1.0, 127.0,
- 'MULI', 'MMBINI', 'RETURN1')
-checkR(function (x) return 20 * x end, 2, 40, 'MULI', 'MMBINI', 'RETURN1')
-checkR(function (x) return x ^ -2 end, 2, 0.25, 'POWI', 'MMBINI', 'RETURN1')
-checkR(function (x) return x / 40 end, 40, 1.0, 'DIVI', 'MMBINI', 'RETURN1')
+ 'MULK', 'MMBINK', 'RETURN1')
+checkR(function (x) return 20 * x end, 2, 40, 'MULK', 'MMBINK', 'RETURN1')
+checkR(function (x) return x ^ -2 end, 2, 0.25, 'POWK', 'MMBINK', 'RETURN1')
+checkR(function (x) return x / 40 end, 40, 1.0, 'DIVK', 'MMBINK', 'RETURN1')
checkR(function (x) return x // 1 end, 10.0, 10.0,
- 'IDIVI', 'MMBINI', 'RETURN1')
+ 'IDIVK', 'MMBINK', 'RETURN1')
checkR(function (x) return x % (100 - 10) end, 91, 1,
- 'MODI', 'MMBINI', 'RETURN1')
+ 'MODK', 'MMBINK', 'RETURN1')
checkR(function (x) return k1 << x end, 3, 8, 'SHLI', 'MMBINI', 'RETURN1')
checkR(function (x) return x << 2 end, 10, 40, 'SHRI', 'MMBINI', 'RETURN1')
checkR(function (x) return x >> 2 end, 8, 2, 'SHRI', 'MMBINI', 'RETURN1')
@@ -326,9 +326,9 @@ checkR(function (x) return x % (100.0 - 10) end, 91, 1.0,
-- no foldings (and immediate operands)
check(function () return -0.0 end, 'LOADF', 'UNM', 'RETURN1')
-check(function () return k3/0 end, 'LOADI', 'DIVI', '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 k3/0 end, 'LOADI', 'DIVK', 'MMBINK', 'RETURN1')
+check(function () return 0%0 end, 'LOADI', 'MODK', 'MMBINK', 'RETURN1')
+check(function () return -4//0 end, 'LOADI', 'IDIVK', 'MMBINK', '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')