From e7c8393682f2977742cdac359cce9e558318aeac Mon Sep 17 00:00:00 2001
From: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Thu, 13 Apr 2000 13:51:01 -0300
Subject: optimization INCLOCAL is not necessary, with `for'

---
 lcode.c    | 28 +++++-----------------------
 lopcodes.h | 10 +---------
 ltests.c   |  5 +----
 lvm.c      | 18 +++---------------
 4 files changed, 10 insertions(+), 51 deletions(-)

diff --git a/lcode.c b/lcode.c
index f75ac359..abf4f537 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
 /*
-** $Id: lcode.c,v 1.23 2000/04/07 19:35:20 roberto Exp roberto $
+** $Id: lcode.c,v 1.24 2000/04/12 18:57:19 roberto Exp roberto $
 ** Code generator for Lua
 ** See Copyright Notice in lua.h
 */
@@ -460,6 +460,9 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) {
     case OP_MULT: case OP_DIV: case OP_POW:
       delta = -1; mode = iO; break;
 
+    case OP_SETLOCAL:  /* `setlocal' default pops one value */
+        delta = -1; arg2 = 1; mode = iAB; break;
+
     case OP_RETURN:
       if (GET_OPCODE(i) == OP_CALL && GETARG_B(i) == MULT_RET) {
         SET_OPCODE(i, OP_TAILCALL);
@@ -501,26 +504,6 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) {
       }
       break;
 
-    case OP_SETLOCAL: {
-      int pc = fs->pc;
-      Instruction *code = fs->f->code;
-      delta = -1;
-      if (pc-1 > fs->lasttarget &&  /* no jumps in-between instructions? */
-          code[pc-2] == CREATE_U(OP_GETLOCAL, arg1) &&
-          GET_OPCODE(i) == OP_ADDI && abs(GETARG_S(i)) <= MAXARG_sA) {
-        /* `local=local+k' */
-        fs->pc = pc-1;
-        code[pc-2] = CREATE_sAB(OP_INCLOCAL, GETARG_S(i), arg1);
-        luaK_deltastack(fs, delta);
-        return pc-1;
-      }
-      else {
-        arg2 = 1;  /* `setlocal' default pops one value */
-        mode = iAB;
-      }
-      break;
-    }
-
     case OP_ADD:
       delta = -1;
       switch(GET_OPCODE(i)) {
@@ -585,8 +568,7 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) {
       break;
 
     case OP_GETDOTTED: case OP_GETINDEXED:
-    case OP_TAILCALL: case OP_INCLOCAL:
-    case OP_ADDI:
+    case OP_TAILCALL: case OP_ADDI:
       LUA_INTERNALERROR(L, "instruction used only for optimizations");
       return 0;  /* to avoid warnings */
 
diff --git a/lopcodes.h b/lopcodes.h
index 91c74759..d7548d9b 100644
--- a/lopcodes.h
+++ b/lopcodes.h
@@ -1,5 +1,5 @@
 /*
-** $Id: lopcodes.h,v 1.56 2000/04/07 19:35:31 roberto Exp roberto $
+** $Id: lopcodes.h,v 1.57 2000/04/12 18:57:19 roberto Exp roberto $
 ** Opcodes for Lua virtual machine
 ** See Copyright Notice in lua.h
 */
@@ -36,8 +36,6 @@
 
 
 
-#define MAXARG_sA	(MAXARG_A>>1)	/* max value for a signed A */
-
 
 /* creates a mask with `n' 1 bits at position `p' */
 #define MASK1(n,p)	((~((~(Instruction)0)<<n))<<p)
@@ -73,11 +71,6 @@
                                ((Instruction)(b)<<POS_B)))
 
 
-#define CREATE_sAB(o,a,b)	(CREATE_AB((o),(a)+MAXARG_sA,(b)))
-#define GETARG_sA(i)		(GETARG_A(i)-MAXARG_sA)
-
-
-
 /*
 ** K = U argument used as index to `kstr'
 ** J = S argument used as jump offset (relative to pc of next instruction)
@@ -122,7 +115,6 @@ OP_SETTABLE,/*	A B	v a_a-a_1 i t	(pops b values)	t[i]=v		*/
 OP_SETLIST,/*	A B	v_b-v_0 t	t		t[i+a*FPF]=v_i	*/
 OP_SETMAP,/*	U	v_u k_u - v_0 k_0 t	t	t[k_i]=v_i	*/
 
-OP_INCLOCAL,/*	sA L	-		-		LOC[l]+=sA	*/
 OP_ADD,/*	-	y x		x+y				*/
 OP_ADDI,/*	S	x		x+s				*/
 OP_SUB,/*	-	y x		x-y				*/
diff --git a/ltests.c b/ltests.c
index 1951b446..7762abb3 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1,5 +1,5 @@
 /*
-** $Id: ltests.c,v 1.13 2000/04/12 18:57:19 roberto Exp roberto $
+** $Id: ltests.c,v 1.14 2000/04/12 19:56:50 roberto Exp roberto $
 ** Internal Module for Debugging of the Lua Implementation
 ** See Copyright Notice in lua.h
 */
@@ -52,7 +52,6 @@ static void setnameval (lua_State *L, lua_Object t, const char *name, int val) {
 #define U(o)	sprintf(buff, "%-12s%4u", o, GETARG_U(i))
 #define S(o)	sprintf(buff, "%-12s%4d", o, GETARG_S(i))
 #define AB(o)	sprintf(buff, "%-12s%4d %4d", o, GETARG_A(i), GETARG_B(i))
-#define sAB(o)	sprintf(buff, "%-12s%4d %4d", o, GETARG_sA(i), GETARG_B(i))
 
 
 
@@ -83,7 +82,6 @@ static int printop (lua_State *L, Instruction i) {
     case OP_SETLIST: AB("SETLIST"); break;
     case OP_SETMAP: U("SETMAP"); break;
     case OP_ADD: O("ADD"); break;
-    case OP_INCLOCAL: sAB("INCLOCAL"); break;
     case OP_ADDI: S("ADDI"); break;
     case OP_SUB: O("SUB"); break;
     case OP_MULT: O("MULT"); break;
@@ -147,7 +145,6 @@ static void get_limits (lua_State *L) {
   setnameval(L, t, "MAXARG_S", MAXARG_S);
   setnameval(L, t, "MAXARG_A", MAXARG_A);
   setnameval(L, t, "MAXARG_B", MAXARG_B);
-  setnameval(L, t, "MAXARG_sA", MAXARG_sA);
   setnameval(L, t, "MAXSTACK", MAXSTACK);
   setnameval(L, t, "MAXLOCALS", MAXLOCALS);
   setnameval(L, t, "MAXUPVALUES", MAXUPVALUES);
diff --git a/lvm.c b/lvm.c
index 29819b1e..ceb9b011 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
 /*
-** $Id: lvm.c,v 1.100 2000/04/07 13:13:11 roberto Exp roberto $
+** $Id: lvm.c,v 1.101 2000/04/12 18:57:19 roberto Exp roberto $
 ** Lua virtual machine
 ** See Copyright Notice in lua.h
 */
@@ -500,19 +500,6 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) {
         top--;
         break;
 
-      case OP_INCLOCAL: {
-        TObject *var = base+GETARG_B(i);
-        int n = GETARG_sA(i);
-        if (tonumber(var)) {
-          *top = *var;  /* PUSHLOCAL */
-          addK(L, top+1, n);
-          *var = *top;  /* SETLOCAL */
-        }
-        else
-          nvalue(var) += (Number)n;
-        break;
-      }
-
       case OP_ADDI:
         if (tonumber(top-1))
           addK(L, top, GETARG_S(i));
@@ -647,7 +634,8 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) {
         Number index;
         LUA_ASSERT(L, ttype(top-1) == TAG_NUMBER, "invalid step");
         LUA_ASSERT(L, ttype(top-2) == TAG_NUMBER, "invalid limit");
-        if (tonumber(top-3)) lua_error(L, "`for' index must be a number");
+        if (ttype(top-3) != TAG_NUMBER)
+          lua_error(L, "`for' index must be a number");
         index = nvalue(top-3)+step;
         if ((step>0) ? index<=limit : index>=limit) {
           nvalue(top-3) = index;
-- 
cgit v1.2.3-55-g6feb