details about opcode parameters

This commit is contained in:
Roberto Ierusalimschy
2001-06-11 11:56:42 -03:00
parent 79acf5ea60
commit 0a1b1acdd3
6 changed files with 94 additions and 96 deletions

View File

@@ -1,5 +1,5 @@
/*
** $Id: ldebug.c,v 1.80 2001/06/08 12:29:27 roberto Exp roberto $
** $Id: ldebug.c,v 1.81 2001/06/08 19:00:57 roberto Exp roberto $
** Debug Interface
** See Copyright Notice in lua.h
*/
@@ -349,6 +349,7 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) {
int a = GETARG_A(i);
int b = 0;
int c = 0;
checkreg(pt, a);
switch (getOpMode(op)) {
case iABC: {
b = GETARG_B(i);
@@ -370,7 +371,6 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) {
break;
}
}
if (testOpMode(op, OpModeAreg)) checkreg(pt, a);
if (testOpMode(op, OpModesetA)) {
if (a == reg) last = pc; /* change register `a' */
}
@@ -414,20 +414,20 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) {
break;
}
case OP_CALL: {
if (b == NO_REG) b = pt->maxstacksize;
if (b != NO_REG) {
checkreg(pt, a+b);
}
if (c == NO_REG) {
check(checkopenop(pt->code[pc+1]));
c = 1;
}
check(b > a);
checkreg(pt, b-1);
checkreg(pt, c-1);
else if (c != 0)
checkreg(pt, a+c-1);
if (reg >= a) last = pc; /* affect all registers above base */
break;
}
case OP_RETURN: {
if (b == NO_REG) b = pt->maxstacksize;
checkreg(pt, b-1);
if (b != NO_REG && b != 0)
checkreg(pt, a+b-1);
break;
}
case OP_FORPREP:
@@ -566,49 +566,49 @@ void luaG_ordererror (lua_State *L, const TObject *p1, const TObject *p2) {
#define opmode(t,a,b,c,sa,k,m) (((t)<<OpModeT) | \
((a)<<OpModeAreg) | ((b)<<OpModeBreg) | ((c)<<OpModeCreg) | \
((b)<<OpModeBreg) | ((c)<<OpModeCreg) | \
((sa)<<OpModesetA) | ((k)<<OpModeK) | (m))
const lu_byte luaG_opmodes[] = {
/* T A B C sA K mode opcode */
opmode(0,1,1,0, 1,0,iABC), /* OP_MOVE */
opmode(0,1,0,0, 1,1,iABc), /* OP_LOADK */
opmode(0,1,0,0, 1,0,iAsBc), /* OP_LOADINT */
opmode(0,1,1,0, 1,0,iABC), /* OP_LOADNIL */
opmode(0,1,0,0, 1,0,iABc), /* OP_LOADUPVAL */
opmode(0,1,0,0, 1,1,iABc), /* OP_GETGLOBAL */
opmode(0,1,1,1, 1,0,iABC), /* OP_GETTABLE */
opmode(0,1,0,0, 0,1,iABc), /* OP_SETGLOBAL */
opmode(0,1,1,1, 0,0,iABC), /* OP_SETTABLE */
opmode(0,1,0,0, 1,0,iABc), /* OP_NEWTABLE */
opmode(0,1,1,1, 1,0,iABC), /* OP_SELF */
opmode(0,1,1,1, 1,0,iABC), /* OP_ADD */
opmode(0,1,1,1, 1,0,iABC), /* OP_SUB */
opmode(0,1,1,1, 1,0,iABC), /* OP_MUL */
opmode(0,1,1,1, 1,0,iABC), /* OP_DIV */
opmode(0,1,1,1, 1,0,iABC), /* OP_POW */
opmode(0,1,1,0, 1,0,iABC), /* OP_UNM */
opmode(0,1,1,0, 1,0,iABC), /* OP_NOT */
opmode(0,1,1,1, 1,0,iABC), /* OP_CONCAT */
opmode(0,0,0,0, 0,0,iAsBc), /* OP_JMP */
opmode(0,0,0,0, 0,0,iAsBc), /* OP_CJMP */
opmode(1,0,1,1, 0,0,iABC), /* OP_TESTEQ */
opmode(1,0,1,1, 0,0,iABC), /* OP_TESTNE */
opmode(1,0,1,1, 0,0,iABC), /* OP_TESTLT */
opmode(1,0,1,1, 0,0,iABC), /* OP_TESTLE */
opmode(1,0,1,1, 0,0,iABC), /* OP_TESTGT */
opmode(1,0,1,1, 0,0,iABC), /* OP_TESTGE */
opmode(1,1,1,0, 1,0,iABC), /* OP_TESTT */
opmode(1,1,1,0, 1,0,iABC), /* OP_TESTF */
opmode(0,1,0,0, 1,0,iAsBc), /* OP_NILJMP */
opmode(0,1,0,0, 0,0,iABC), /* OP_CALL */
opmode(0,1,0,0, 0,0,iABC), /* OP_RETURN */
opmode(0,1,0,0, 0,0,iAsBc), /* OP_FORPREP */
opmode(0,1,0,0, 0,0,iAsBc), /* OP_FORLOOP */
/* T J B C sA K mode opcode */
opmode(0,0,1,0, 1,0,iABC), /* OP_MOVE */
opmode(0,0,0,0, 1,1,iABc), /* OP_LOADK */
opmode(0,0,0,0, 1,0,iAsBc), /* OP_LOADINT */
opmode(0,0,1,0, 1,0,iABC), /* OP_LOADNIL */
opmode(0,0,0,0, 1,0,iABc), /* OP_LOADUPVAL */
opmode(0,0,0,0, 1,1,iABc), /* OP_GETGLOBAL */
opmode(0,0,1,1, 1,0,iABC), /* OP_GETTABLE */
opmode(0,0,0,0, 0,1,iABc), /* OP_SETGLOBAL */
opmode(0,0,1,1, 0,0,iABC), /* OP_SETTABLE */
opmode(0,0,0,0, 1,0,iABc), /* OP_NEWTABLE */
opmode(0,0,1,1, 1,0,iABC), /* OP_SELF */
opmode(0,0,1,1, 1,0,iABC), /* OP_ADD */
opmode(0,0,1,1, 1,0,iABC), /* OP_SUB */
opmode(0,0,1,1, 1,0,iABC), /* OP_MUL */
opmode(0,0,1,1, 1,0,iABC), /* OP_DIV */
opmode(0,0,1,1, 1,0,iABC), /* OP_POW */
opmode(0,0,1,0, 1,0,iABC), /* OP_UNM */
opmode(0,0,1,0, 1,0,iABC), /* OP_NOT */
opmode(0,0,1,1, 1,0,iABC), /* OP_CONCAT */
opmode(0,1,0,0, 0,0,iAsBc), /* OP_JMP */
opmode(0,1,0,0, 0,0,iAsBc), /* OP_CJMP */
opmode(1,0,0,1, 0,0,iABC), /* OP_TESTEQ */
opmode(1,0,0,1, 0,0,iABC), /* OP_TESTNE */
opmode(1,0,0,1, 0,0,iABC), /* OP_TESTLT */
opmode(1,0,0,1, 0,0,iABC), /* OP_TESTLE */
opmode(1,0,0,1, 0,0,iABC), /* OP_TESTGT */
opmode(1,0,0,1, 0,0,iABC), /* OP_TESTGE */
opmode(1,0,1,0, 1,0,iABC), /* OP_TESTT */
opmode(1,0,1,0, 1,0,iABC), /* OP_TESTF */
opmode(0,0,0,0, 1,0,iAsBc), /* OP_NILJMP */
opmode(0,0,0,0, 0,0,iABC), /* OP_CALL */
opmode(0,0,0,0, 0,0,iABC), /* OP_RETURN */
opmode(0,0,0,0, 0,0,iAsBc), /* OP_FORPREP */
opmode(0,0,0,0, 0,0,iAsBc), /* OP_FORLOOP */
opmode(0,1,0,0, 0,0,iAsBc), /* OP_TFORPREP */
opmode(0,1,0,0, 0,0,iAsBc), /* OP_TFORLOOP */
opmode(0,1,0,0, 0,0,iABc), /* OP_SETLIST */
opmode(0,1,0,0, 0,0,iABc), /* OP_SETLIST0 */
opmode(0,1,0,0, 0,0,iABc) /* OP_CLOSURE */
opmode(0,0,0,0, 0,0,iABc), /* OP_SETLIST */
opmode(0,0,0,0, 0,0,iABc), /* OP_SETLIST0 */
opmode(0,0,0,0, 0,0,iABc) /* OP_CLOSURE */
};