From 722bdbe17d0192baf72978f88069d12a921e9bfb Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 28 Sep 2017 13:53:29 -0300 Subject: no more 'getBMode'-'getCMode' (imprecise + we will need more space for op mode) + better control of op modes --- lcode.c | 18 +++++++--- lcode.h | 4 +-- lopcodes.c | 116 ++++++++++++++++++++++++++++++------------------------------- lopcodes.h | 57 ++++++++++++++---------------- lparser.c | 4 +-- lvm.c | 19 +++++----- 6 files changed, 109 insertions(+), 109 deletions(-) diff --git a/lcode.c b/lcode.c index 775a22c3..1f6e9c11 100644 --- a/lcode.c +++ b/lcode.c @@ -1,5 +1,5 @@ /* -** $Id: lcode.c,v 2.124 2017/09/26 17:10:49 roberto Exp roberto $ +** $Id: lcode.c,v 2.125 2017/09/26 18:14:45 roberto Exp roberto $ ** Code generator for Lua ** See Copyright Notice in lua.h */ @@ -367,8 +367,6 @@ static int luaK_code (FuncState *fs, Instruction i) { */ int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) { lua_assert(getOpMode(o) == iABC); - lua_assert(getBMode(o) != OpArgN || b == 0); - lua_assert(getCMode(o) != OpArgN || c == 0); lua_assert(a <= MAXARG_A && b <= MAXARG_B && c <= MAXARG_C); return luaK_code(fs, CREATE_ABC(o, a, b, c)); } @@ -378,13 +376,23 @@ int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) { ** Format and emit an 'iABx' instruction. */ int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { - lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx); - lua_assert(getCMode(o) == OpArgN); + lua_assert(getOpMode(o) == iABx); lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx); return luaK_code(fs, CREATE_ABx(o, a, bc)); } +/* +** Format and emit an 'iAsBx' instruction. +*/ +int luaK_codeAsBx (FuncState *fs, OpCode o, int a, int bc) { + unsigned int b = bc + MAXARG_sBx; + lua_assert(getOpMode(o) == iAsBx); + lua_assert(a <= MAXARG_A && b <= MAXARG_Bx); + return luaK_code(fs, CREATE_ABx(o, a, b)); +} + + /* ** Emit an "extra argument" instruction (format 'iAx') */ diff --git a/lcode.h b/lcode.h index 70953559..e7f048fd 100644 --- a/lcode.h +++ b/lcode.h @@ -1,5 +1,5 @@ /* -** $Id: lcode.h,v 1.65 2017/04/20 19:53:55 roberto Exp roberto $ +** $Id: lcode.h,v 1.66 2017/09/13 19:50:08 roberto Exp roberto $ ** Code generator for Lua ** See Copyright Notice in lua.h */ @@ -43,13 +43,13 @@ typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; /* get (pointer to) instruction of given 'expdesc' */ #define getinstruction(fs,e) ((fs)->f->code[(e)->u.info]) -#define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx) #define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET) #define luaK_jumpto(fs,t) luaK_patchlist(fs, luaK_jump(fs), t) LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx); +LUAI_FUNC int luaK_codeAsBx (FuncState *fs, OpCode o, int A, int Bx); LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C); LUAI_FUNC void luaK_fixline (FuncState *fs, int line); LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n); diff --git a/lopcodes.c b/lopcodes.c index 9617b720..5051f2a8 100644 --- a/lopcodes.c +++ b/lopcodes.c @@ -1,5 +1,5 @@ /* -** $Id: lopcodes.c,v 1.63 2017/09/19 18:38:14 roberto Exp roberto $ +** $Id: lopcodes.c,v 1.64 2017/09/26 18:14:45 roberto Exp roberto $ ** Opcodes for Lua virtual machine ** See Copyright Notice in lua.h */ @@ -77,64 +77,62 @@ LUAI_DDEF const char *const luaP_opnames[NUM_OPCODES+1] = { }; -#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m)) - LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = { -/* T A B C mode opcode */ - opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_MOVE */ - ,opmode(0, 1, OpArgU, OpArgN, iAsBx) /* OP_LOADI */ - ,opmode(0, 1, OpArgU, OpArgN, iAsBx) /* OP_LOADF */ - ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_LOADK */ - ,opmode(0, 1, OpArgN, OpArgN, iABx) /* OP_LOADKX */ - ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_LOADBOOL */ - ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_LOADNIL */ - ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_GETUPVAL */ - ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_SETUPVAL */ - ,opmode(0, 1, OpArgU, OpArgK, iABC) /* OP_GETTABUP */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_GETTABLE */ - ,opmode(0, 1, OpArgR, OpArgU, iABC) /* OP_GETI */ - ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_GETFIELD */ - ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETTABUP */ - ,opmode(0, 0, OpArgR, OpArgK, iABC) /* OP_SETTABLE */ - ,opmode(0, 0, OpArgU, OpArgK, iABC) /* OP_SETI */ - ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETFIELD */ - ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_NEWTABLE */ - ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_SELF */ - ,opmode(0, 1, OpArgR, OpArgU, iABC) /* OP_ADDI */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_ADD */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_SUB */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_MUL */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_MOD */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_POW */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_DIV */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_IDIV */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_BAND */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_BOR */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_BXOR */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_SHL */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_SHR */ - ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_UNM */ - ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_BNOT */ - ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_NOT */ - ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LEN */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_CONCAT */ - ,opmode(0, 0, OpArgN, OpArgN, iABC) /* OP_CLOSE */ - ,opmode(0, 0, OpArgU, OpArgN, iAsBx) /* OP_JMP */ - ,opmode(1, 0, OpArgR, OpArgR, iABC) /* OP_EQ */ - ,opmode(1, 0, OpArgR, OpArgR, iABC) /* OP_LT */ - ,opmode(1, 0, OpArgR, OpArgR, iABC) /* OP_LE */ - ,opmode(1, 0, OpArgN, OpArgU, iABC) /* OP_TEST */ - ,opmode(1, 1, OpArgR, OpArgU, iABC) /* OP_TESTSET */ - ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_CALL */ - ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_TAILCALL */ - ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_RETURN */ - ,opmode(0, 1, OpArgR, OpArgN, iABx) /* OP_FORLOOP */ - ,opmode(0, 1, OpArgR, OpArgN, iABx) /* OP_FORPREP */ - ,opmode(0, 0, OpArgN, OpArgU, iABC) /* OP_TFORCALL */ - ,opmode(0, 1, OpArgR, OpArgN, iABx) /* OP_TFORLOOP */ - ,opmode(0, 0, OpArgU, OpArgU, iABC) /* OP_SETLIST */ - ,opmode(0, 1, OpArgU, OpArgN, iABx) /* OP_CLOSURE */ - ,opmode(0, 1, OpArgU, OpArgR, iABC) /* OP_VARARG */ - ,opmode(0, 0, OpArgU, OpArgU, iAx) /* OP_EXTRAARG */ +/* T A mode opcode */ + opmode(0, 1, iABC) /* OP_MOVE */ + ,opmode(0, 1, iAsBx) /* OP_LOADI */ + ,opmode(0, 1, iAsBx) /* OP_LOADF */ + ,opmode(0, 1, iABx) /* OP_LOADK */ + ,opmode(0, 1, iABx) /* OP_LOADKX */ + ,opmode(0, 1, iABC) /* OP_LOADBOOL */ + ,opmode(0, 1, iABC) /* OP_LOADNIL */ + ,opmode(0, 1, iABC) /* OP_GETUPVAL */ + ,opmode(0, 0, iABC) /* OP_SETUPVAL */ + ,opmode(0, 1, iABC) /* OP_GETTABUP */ + ,opmode(0, 1, iABC) /* OP_GETTABLE */ + ,opmode(0, 1, iABC) /* OP_GETI */ + ,opmode(0, 1, iABC) /* OP_GETFIELD */ + ,opmode(0, 0, iABC) /* OP_SETTABUP */ + ,opmode(0, 0, iABC) /* OP_SETTABLE */ + ,opmode(0, 0, iABC) /* OP_SETI */ + ,opmode(0, 0, iABC) /* OP_SETFIELD */ + ,opmode(0, 1, iABC) /* OP_NEWTABLE */ + ,opmode(0, 1, iABC) /* OP_SELF */ + ,opmode(0, 1, iABC) /* OP_ADDI */ + ,opmode(0, 1, iABC) /* OP_ADD */ + ,opmode(0, 1, iABC) /* OP_SUB */ + ,opmode(0, 1, iABC) /* OP_MUL */ + ,opmode(0, 1, iABC) /* OP_MOD */ + ,opmode(0, 1, iABC) /* OP_POW */ + ,opmode(0, 1, iABC) /* OP_DIV */ + ,opmode(0, 1, iABC) /* OP_IDIV */ + ,opmode(0, 1, iABC) /* OP_BAND */ + ,opmode(0, 1, iABC) /* OP_BOR */ + ,opmode(0, 1, iABC) /* OP_BXOR */ + ,opmode(0, 1, iABC) /* OP_SHL */ + ,opmode(0, 1, iABC) /* OP_SHR */ + ,opmode(0, 1, iABC) /* OP_UNM */ + ,opmode(0, 1, iABC) /* OP_BNOT */ + ,opmode(0, 1, iABC) /* OP_NOT */ + ,opmode(0, 1, iABC) /* OP_LEN */ + ,opmode(0, 1, iABC) /* OP_CONCAT */ + ,opmode(0, 0, iABC) /* OP_CLOSE */ + ,opmode(0, 0, iAsBx) /* OP_JMP */ + ,opmode(1, 0, iABC) /* OP_EQ */ + ,opmode(1, 0, iABC) /* OP_LT */ + ,opmode(1, 0, iABC) /* OP_LE */ + ,opmode(1, 0, iABC) /* OP_TEST */ + ,opmode(1, 1, iABC) /* OP_TESTSET */ + ,opmode(0, 1, iABC) /* OP_CALL */ + ,opmode(0, 1, iABC) /* OP_TAILCALL */ + ,opmode(0, 0, iABC) /* OP_RETURN */ + ,opmode(0, 1, iABx) /* OP_FORLOOP */ + ,opmode(0, 1, iABx) /* OP_FORPREP */ + ,opmode(0, 0, iABC) /* OP_TFORCALL */ + ,opmode(0, 1, iABx) /* OP_TFORLOOP */ + ,opmode(0, 0, iABC) /* OP_SETLIST */ + ,opmode(0, 1, iABx) /* OP_CLOSURE */ + ,opmode(0, 1, iABC) /* OP_VARARG */ + ,opmode(0, 0, iAx) /* OP_EXTRAARG */ }; diff --git a/lopcodes.h b/lopcodes.h index d28948d8..6b9c3aeb 100644 --- a/lopcodes.h +++ b/lopcodes.h @@ -1,5 +1,5 @@ /* -** $Id: lopcodes.h,v 1.160 2017/09/19 18:38:14 roberto Exp roberto $ +** $Id: lopcodes.h,v 1.161 2017/09/26 18:14:45 roberto Exp roberto $ ** Opcodes for Lua virtual machine ** See Copyright Notice in lua.h */ @@ -89,6 +89,9 @@ enum OpMode {iABC, iABx, iAsBx, iAx}; /* basic instruction format */ #define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \ ((cast(Instruction, o)<>(pos)) & MASK1(size,0))) #define setarg(i,v,pos,size) ((i) = (((i)&MASK0(size,pos)) | \ ((cast(Instruction, v)<> 4) & 3)) -#define getCMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3)) -#define testAMode(m) (luaP_opmodes[m] & (1 << 6)) -#define testTMode(m) (luaP_opmodes[m] & (1 << 7)) +#define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 7)) +#define testAMode(m) (luaP_opmodes[m] & (1 << 3)) +#define testTMode(m) (luaP_opmodes[m] & (1 << 4)) + +#define opmode(t,a,m) (((t)<<4) | ((a)<<3) | (m)) LUAI_DDEC const char *const luaP_opnames[NUM_OPCODES+1]; /* opcode names */ diff --git a/lparser.c b/lparser.c index 7fd62f50..1831ea01 100644 --- a/lparser.c +++ b/lparser.c @@ -1,5 +1,5 @@ /* -** $Id: lparser.c,v 2.164 2017/08/14 18:33:14 roberto Exp roberto $ +** $Id: lparser.c,v 2.165 2017/09/13 19:50:08 roberto Exp roberto $ ** Lua Parser ** See Copyright Notice in lua.h */ @@ -1373,7 +1373,7 @@ static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { luaK_patchtohere(fs, prep); luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars); luaK_fixline(fs, line); - endfor = luaK_codeAsBx(fs, OP_TFORLOOP, base + 2, NO_JUMP); + endfor = luaK_codeABx(fs, OP_TFORLOOP, base + 2, 0); } fixforjump(fs, endfor, prep + 1, 1); luaK_fixline(fs, line); diff --git a/lvm.c b/lvm.c index f34f3dfe..fd02ad5b 100644 --- a/lvm.c +++ b/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 2.294 2017/09/26 18:14:45 roberto Exp roberto $ +** $Id: lvm.c,v 2.295 2017/09/27 18:59:08 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -733,14 +733,13 @@ void luaV_finishOp (lua_State *L) { #define RA(i) (base+GETARG_A(i)) -#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_Br(i)) +#define RB(i) (base+GETARG_Br(i)) #define vRB(i) s2v(RB(i)) -#define KB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_B(i)) -#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) +#define KB(i) (k+GETARG_B(i)) +#define RC(i) (base+GETARG_C(i)) #define vRC(i) s2v(RC(i)) -#define KC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, k+GETARG_C(i)) -#define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ - (GETARG_Ck(i)) ? k + GETARG_Cr(i) : s2v(base + GETARG_Cr(i))) +#define KC(i) (k+GETARG_C(i)) +#define RKC(i) ((GETARG_Ck(i)) ? k + GETARG_Cr(i) : s2v(base + GETARG_Cr(i))) @@ -834,8 +833,7 @@ void luaV_execute (lua_State *L) { } vmcase(OP_LOADKX) { TValue *rb; - lua_assert(GET_OPCODE(*pc) == OP_EXTRAARG); - rb = k + GETARG_Ax(*pc++); + rb = k + GETARG_Ax(*pc); pc++; setobj2s(L, ra, rb); vmbreak; } @@ -1409,8 +1407,7 @@ void luaV_execute (lua_State *L) { Table *h; if (n == 0) n = cast_int(L->top - ra) - 1; if (c == 0) { - lua_assert(GET_OPCODE(*pc) == OP_EXTRAARG); - c = GETARG_Ax(*pc++); + c = GETARG_Ax(*pc); pc++; } h = hvalue(s2v(ra)); last = ((c-1)*LFIELDS_PER_FLUSH) + n; -- cgit v1.2.3-55-g6feb