diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-04-13 13:51:01 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-04-13 13:51:01 -0300 |
| commit | e7c8393682f2977742cdac359cce9e558318aeac (patch) | |
| tree | 4e3213fdea8c30dcf6f1d2b633eb1a54c755814e | |
| parent | ceaa97ff5b78db364b1608ede26e3dba9050be0e (diff) | |
| download | lua-e7c8393682f2977742cdac359cce9e558318aeac.tar.gz lua-e7c8393682f2977742cdac359cce9e558318aeac.tar.bz2 lua-e7c8393682f2977742cdac359cce9e558318aeac.zip | |
optimization INCLOCAL is not necessary, with `for'
| -rw-r--r-- | lcode.c | 28 | ||||
| -rw-r--r-- | lopcodes.h | 10 | ||||
| -rw-r--r-- | ltests.c | 5 | ||||
| -rw-r--r-- | lvm.c | 18 |
4 files changed, 10 insertions, 51 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lcode.c,v 1.23 2000/04/07 19:35:20 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 1.24 2000/04/12 18:57:19 roberto Exp roberto $ |
| 3 | ** Code generator for Lua | 3 | ** Code generator for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -460,6 +460,9 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) { | |||
| 460 | case OP_MULT: case OP_DIV: case OP_POW: | 460 | case OP_MULT: case OP_DIV: case OP_POW: |
| 461 | delta = -1; mode = iO; break; | 461 | delta = -1; mode = iO; break; |
| 462 | 462 | ||
| 463 | case OP_SETLOCAL: /* `setlocal' default pops one value */ | ||
| 464 | delta = -1; arg2 = 1; mode = iAB; break; | ||
| 465 | |||
| 463 | case OP_RETURN: | 466 | case OP_RETURN: |
| 464 | if (GET_OPCODE(i) == OP_CALL && GETARG_B(i) == MULT_RET) { | 467 | if (GET_OPCODE(i) == OP_CALL && GETARG_B(i) == MULT_RET) { |
| 465 | SET_OPCODE(i, OP_TAILCALL); | 468 | SET_OPCODE(i, OP_TAILCALL); |
| @@ -501,26 +504,6 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) { | |||
| 501 | } | 504 | } |
| 502 | break; | 505 | break; |
| 503 | 506 | ||
| 504 | case OP_SETLOCAL: { | ||
| 505 | int pc = fs->pc; | ||
| 506 | Instruction *code = fs->f->code; | ||
| 507 | delta = -1; | ||
| 508 | if (pc-1 > fs->lasttarget && /* no jumps in-between instructions? */ | ||
| 509 | code[pc-2] == CREATE_U(OP_GETLOCAL, arg1) && | ||
| 510 | GET_OPCODE(i) == OP_ADDI && abs(GETARG_S(i)) <= MAXARG_sA) { | ||
| 511 | /* `local=local+k' */ | ||
| 512 | fs->pc = pc-1; | ||
| 513 | code[pc-2] = CREATE_sAB(OP_INCLOCAL, GETARG_S(i), arg1); | ||
| 514 | luaK_deltastack(fs, delta); | ||
| 515 | return pc-1; | ||
| 516 | } | ||
| 517 | else { | ||
| 518 | arg2 = 1; /* `setlocal' default pops one value */ | ||
| 519 | mode = iAB; | ||
| 520 | } | ||
| 521 | break; | ||
| 522 | } | ||
| 523 | |||
| 524 | case OP_ADD: | 507 | case OP_ADD: |
| 525 | delta = -1; | 508 | delta = -1; |
| 526 | switch(GET_OPCODE(i)) { | 509 | switch(GET_OPCODE(i)) { |
| @@ -585,8 +568,7 @@ int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) { | |||
| 585 | break; | 568 | break; |
| 586 | 569 | ||
| 587 | case OP_GETDOTTED: case OP_GETINDEXED: | 570 | case OP_GETDOTTED: case OP_GETINDEXED: |
| 588 | case OP_TAILCALL: case OP_INCLOCAL: | 571 | case OP_TAILCALL: case OP_ADDI: |
| 589 | case OP_ADDI: | ||
| 590 | LUA_INTERNALERROR(L, "instruction used only for optimizations"); | 572 | LUA_INTERNALERROR(L, "instruction used only for optimizations"); |
| 591 | return 0; /* to avoid warnings */ | 573 | return 0; /* to avoid warnings */ |
| 592 | 574 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lopcodes.h,v 1.56 2000/04/07 19:35:31 roberto Exp roberto $ | 2 | ** $Id: lopcodes.h,v 1.57 2000/04/12 18:57:19 roberto Exp roberto $ |
| 3 | ** Opcodes for Lua virtual machine | 3 | ** Opcodes for Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -36,8 +36,6 @@ | |||
| 36 | 36 | ||
| 37 | 37 | ||
| 38 | 38 | ||
| 39 | #define MAXARG_sA (MAXARG_A>>1) /* max value for a signed A */ | ||
| 40 | |||
| 41 | 39 | ||
| 42 | /* creates a mask with `n' 1 bits at position `p' */ | 40 | /* creates a mask with `n' 1 bits at position `p' */ |
| 43 | #define MASK1(n,p) ((~((~(Instruction)0)<<n))<<p) | 41 | #define MASK1(n,p) ((~((~(Instruction)0)<<n))<<p) |
| @@ -73,11 +71,6 @@ | |||
| 73 | ((Instruction)(b)<<POS_B))) | 71 | ((Instruction)(b)<<POS_B))) |
| 74 | 72 | ||
| 75 | 73 | ||
| 76 | #define CREATE_sAB(o,a,b) (CREATE_AB((o),(a)+MAXARG_sA,(b))) | ||
| 77 | #define GETARG_sA(i) (GETARG_A(i)-MAXARG_sA) | ||
| 78 | |||
| 79 | |||
| 80 | |||
| 81 | /* | 74 | /* |
| 82 | ** K = U argument used as index to `kstr' | 75 | ** K = U argument used as index to `kstr' |
| 83 | ** J = S argument used as jump offset (relative to pc of next instruction) | 76 | ** 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 */ | |||
| 122 | OP_SETLIST,/* A B v_b-v_0 t t t[i+a*FPF]=v_i */ | 115 | OP_SETLIST,/* A B v_b-v_0 t t t[i+a*FPF]=v_i */ |
| 123 | OP_SETMAP,/* U v_u k_u - v_0 k_0 t t t[k_i]=v_i */ | 116 | OP_SETMAP,/* U v_u k_u - v_0 k_0 t t t[k_i]=v_i */ |
| 124 | 117 | ||
| 125 | OP_INCLOCAL,/* sA L - - LOC[l]+=sA */ | ||
| 126 | OP_ADD,/* - y x x+y */ | 118 | OP_ADD,/* - y x x+y */ |
| 127 | OP_ADDI,/* S x x+s */ | 119 | OP_ADDI,/* S x x+s */ |
| 128 | OP_SUB,/* - y x x-y */ | 120 | OP_SUB,/* - y x x-y */ |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltests.c,v 1.13 2000/04/12 18:57:19 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 1.14 2000/04/12 19:56:50 roberto Exp roberto $ |
| 3 | ** Internal Module for Debugging of the Lua Implementation | 3 | ** Internal Module for Debugging of the Lua Implementation |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -52,7 +52,6 @@ static void setnameval (lua_State *L, lua_Object t, const char *name, int val) { | |||
| 52 | #define U(o) sprintf(buff, "%-12s%4u", o, GETARG_U(i)) | 52 | #define U(o) sprintf(buff, "%-12s%4u", o, GETARG_U(i)) |
| 53 | #define S(o) sprintf(buff, "%-12s%4d", o, GETARG_S(i)) | 53 | #define S(o) sprintf(buff, "%-12s%4d", o, GETARG_S(i)) |
| 54 | #define AB(o) sprintf(buff, "%-12s%4d %4d", o, GETARG_A(i), GETARG_B(i)) | 54 | #define AB(o) sprintf(buff, "%-12s%4d %4d", o, GETARG_A(i), GETARG_B(i)) |
| 55 | #define sAB(o) sprintf(buff, "%-12s%4d %4d", o, GETARG_sA(i), GETARG_B(i)) | ||
| 56 | 55 | ||
| 57 | 56 | ||
| 58 | 57 | ||
| @@ -83,7 +82,6 @@ static int printop (lua_State *L, Instruction i) { | |||
| 83 | case OP_SETLIST: AB("SETLIST"); break; | 82 | case OP_SETLIST: AB("SETLIST"); break; |
| 84 | case OP_SETMAP: U("SETMAP"); break; | 83 | case OP_SETMAP: U("SETMAP"); break; |
| 85 | case OP_ADD: O("ADD"); break; | 84 | case OP_ADD: O("ADD"); break; |
| 86 | case OP_INCLOCAL: sAB("INCLOCAL"); break; | ||
| 87 | case OP_ADDI: S("ADDI"); break; | 85 | case OP_ADDI: S("ADDI"); break; |
| 88 | case OP_SUB: O("SUB"); break; | 86 | case OP_SUB: O("SUB"); break; |
| 89 | case OP_MULT: O("MULT"); break; | 87 | case OP_MULT: O("MULT"); break; |
| @@ -147,7 +145,6 @@ static void get_limits (lua_State *L) { | |||
| 147 | setnameval(L, t, "MAXARG_S", MAXARG_S); | 145 | setnameval(L, t, "MAXARG_S", MAXARG_S); |
| 148 | setnameval(L, t, "MAXARG_A", MAXARG_A); | 146 | setnameval(L, t, "MAXARG_A", MAXARG_A); |
| 149 | setnameval(L, t, "MAXARG_B", MAXARG_B); | 147 | setnameval(L, t, "MAXARG_B", MAXARG_B); |
| 150 | setnameval(L, t, "MAXARG_sA", MAXARG_sA); | ||
| 151 | setnameval(L, t, "MAXSTACK", MAXSTACK); | 148 | setnameval(L, t, "MAXSTACK", MAXSTACK); |
| 152 | setnameval(L, t, "MAXLOCALS", MAXLOCALS); | 149 | setnameval(L, t, "MAXLOCALS", MAXLOCALS); |
| 153 | setnameval(L, t, "MAXUPVALUES", MAXUPVALUES); | 150 | setnameval(L, t, "MAXUPVALUES", MAXUPVALUES); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.100 2000/04/07 13:13:11 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.101 2000/04/12 18:57:19 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -500,19 +500,6 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { | |||
| 500 | top--; | 500 | top--; |
| 501 | break; | 501 | break; |
| 502 | 502 | ||
| 503 | case OP_INCLOCAL: { | ||
| 504 | TObject *var = base+GETARG_B(i); | ||
| 505 | int n = GETARG_sA(i); | ||
| 506 | if (tonumber(var)) { | ||
| 507 | *top = *var; /* PUSHLOCAL */ | ||
| 508 | addK(L, top+1, n); | ||
| 509 | *var = *top; /* SETLOCAL */ | ||
| 510 | } | ||
| 511 | else | ||
| 512 | nvalue(var) += (Number)n; | ||
| 513 | break; | ||
| 514 | } | ||
| 515 | |||
| 516 | case OP_ADDI: | 503 | case OP_ADDI: |
| 517 | if (tonumber(top-1)) | 504 | if (tonumber(top-1)) |
| 518 | addK(L, top, GETARG_S(i)); | 505 | addK(L, top, GETARG_S(i)); |
| @@ -647,7 +634,8 @@ StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { | |||
| 647 | Number index; | 634 | Number index; |
| 648 | LUA_ASSERT(L, ttype(top-1) == TAG_NUMBER, "invalid step"); | 635 | LUA_ASSERT(L, ttype(top-1) == TAG_NUMBER, "invalid step"); |
| 649 | LUA_ASSERT(L, ttype(top-2) == TAG_NUMBER, "invalid limit"); | 636 | LUA_ASSERT(L, ttype(top-2) == TAG_NUMBER, "invalid limit"); |
| 650 | if (tonumber(top-3)) lua_error(L, "`for' index must be a number"); | 637 | if (ttype(top-3) != TAG_NUMBER) |
| 638 | lua_error(L, "`for' index must be a number"); | ||
| 651 | index = nvalue(top-3)+step; | 639 | index = nvalue(top-3)+step; |
| 652 | if ((step>0) ? index<=limit : index>=limit) { | 640 | if ((step>0) ? index<=limit : index>=limit) { |
| 653 | nvalue(top-3) = index; | 641 | nvalue(top-3) = index; |
