To make variable access faster the form of getvar/setvar with var index

encoded in bytecode is reintroduced.
This commit is contained in:
igor%mir2.org 2004-05-18 22:33:41 +00:00
Родитель 59694687e9
Коммит 013271de02
1 изменённых файлов: 50 добавлений и 46 удалений

Просмотреть файл

@ -135,14 +135,18 @@ public class Interpreter
Icode_REG_STR2 = BASE_ICODE + 48, Icode_REG_STR2 = BASE_ICODE + 48,
Icode_REG_STR4 = BASE_ICODE + 49, Icode_REG_STR4 = BASE_ICODE + 49,
// Version of getvar/setvar that read var index directly from bytecode
Icode_GETVAR1 = BASE_ICODE + 50,
Icode_SETVAR1 = BASE_ICODE + 51,
// Last icode // Last icode
MAX_ICODE = BASE_ICODE + 49; MAX_ICODE = BASE_ICODE + 51;
static { static {
if (MAX_ICODE > 127) { if (MAX_ICODE > 127) {
// This allows to drop (0xFF & ...) in the interpreter loop // This allows to drop (0xFF & ...) in the interpreter loop
System.err.println("MAX_ICODE should be <= 128"); System.err.println("MAX_ICODE should be <= 127");
throw new IllegalStateException("MAX_ICODE should be <= 128"); throw new IllegalStateException("MAX_ICODE should be <= 127");
} }
} }
@ -1394,6 +1398,12 @@ public class Interpreter
switch (op) { switch (op) {
case Token.GETVAR: case Token.GETVAR:
case Token.SETVAR: case Token.SETVAR:
if (varIndex < 128) {
iCodeTop = addIcode(op == Token.GETVAR
? Icode_GETVAR1 : Icode_SETVAR1, iCodeTop);
return addByte(varIndex, iCodeTop);
}
// fallthrough
case Icode_VARINC: case Icode_VARINC:
case Icode_VARDEC: case Icode_VARDEC:
return addIndexOp(op, varIndex, iCodeTop); return addIndexOp(op, varIndex, iCodeTop);
@ -1408,32 +1418,17 @@ public class Interpreter
index = itsStrings.size(); index = itsStrings.size();
itsStrings.put(str, index); itsStrings.put(str, index);
} }
int indexSize;
int indexOp;
if (index < 4) { if (index < 4) {
indexOp = Icode_REG_STR_C0 + index; iCodeTop = addIcode(Icode_REG_STR_C0 + index, iCodeTop);
indexSize = 0;
} else if (index <= 0xFF) { } else if (index <= 0xFF) {
indexOp = Icode_REG_STR1; iCodeTop = addIcode(Icode_REG_STR1, iCodeTop);
indexSize = 1;
} else if (index <= 0xFFFF) {
indexOp = Icode_REG_STR2;
indexSize = 2;
} else {
indexOp = Icode_REG_STR4;
indexSize = 4;
}
iCodeTop = addIcode(indexOp, iCodeTop);
switch (indexSize) {
case 1:
iCodeTop = addByte(index, iCodeTop); iCodeTop = addByte(index, iCodeTop);
break; } else if (index <= 0xFFFF) {
case 2: iCodeTop = addIcode(Icode_REG_STR2, iCodeTop);
iCodeTop = addShort(index, iCodeTop); iCodeTop = addShort(index, iCodeTop);
break; } else {
case 4: iCodeTop = addIcode(Icode_REG_STR4, iCodeTop);
iCodeTop = addInt(index, iCodeTop); iCodeTop = addInt(index, iCodeTop);
break;
} }
if (op > BASE_ICODE) { if (op > BASE_ICODE) {
iCodeTop = addIcode(op, iCodeTop); iCodeTop = addIcode(op, iCodeTop);
@ -1446,34 +1441,18 @@ public class Interpreter
private int addIndexOp(int op, int index, int iCodeTop) private int addIndexOp(int op, int index, int iCodeTop)
{ {
if (index < 0) Kit.codeBug(); if (index < 0) Kit.codeBug();
int indexSize;
int indexOp;
if (index < 6) { if (index < 6) {
indexOp = Icode_REG_IND_C0 + index; iCodeTop = addIcode(Icode_REG_IND_C0 + index, iCodeTop);
indexSize = 0;
} else if (index <= 0xFF) { } else if (index <= 0xFF) {
indexOp = Icode_REG_IND1; iCodeTop = addIcode(Icode_REG_IND1, iCodeTop);
indexSize = 1;
} else if (index <= 0xFFFF) {
indexOp = Icode_REG_IND2;
indexSize = 2;
} else {
indexOp = Icode_REG_IND4;
indexSize = 4;
}
iCodeTop = addIcode(indexOp, iCodeTop);
switch (indexSize) {
case 1:
iCodeTop = addByte(index, iCodeTop); iCodeTop = addByte(index, iCodeTop);
break; } else if (index <= 0xFFFF) {
case 2: iCodeTop = addIcode(Icode_REG_IND2, iCodeTop);
iCodeTop = addShort(index, iCodeTop); iCodeTop = addShort(index, iCodeTop);
break; } else {
case 4: iCodeTop = addIcode(Icode_REG_IND4, iCodeTop);
iCodeTop = addInt(index, iCodeTop); iCodeTop = addInt(index, iCodeTop);
break;
} }
if (op > BASE_ICODE) { if (op > BASE_ICODE) {
iCodeTop = addIcode(op, iCodeTop); iCodeTop = addIcode(op, iCodeTop);
} else { } else {
@ -1620,6 +1599,8 @@ public class Interpreter
case Icode_REG_STR1: return "LOAD_STR1"; case Icode_REG_STR1: return "LOAD_STR1";
case Icode_REG_STR2: return "LOAD_STR2"; case Icode_REG_STR2: return "LOAD_STR2";
case Icode_REG_STR4: return "LOAD_STR4"; case Icode_REG_STR4: return "LOAD_STR4";
case Icode_GETVAR1: return "GETVAR1";
case Icode_SETVAR1: return "SETVAR1";
} }
} }
return "<UNKNOWN ICODE: "+icode+">"; return "<UNKNOWN ICODE: "+icode+">";
@ -1723,32 +1704,44 @@ public class Interpreter
String str = strings[0xFF & iCode[pc]]; String str = strings[0xFF & iCode[pc]];
out.println(tname + " \"" + str + '"'); out.println(tname + " \"" + str + '"');
++pc; ++pc;
break;
} }
case Icode_REG_STR2: { case Icode_REG_STR2: {
String str = strings[getIndex(iCode, pc)]; String str = strings[getIndex(iCode, pc)];
out.println(tname + " \"" + str + '"'); out.println(tname + " \"" + str + '"');
pc += 2; pc += 2;
break;
} }
case Icode_REG_STR4: { case Icode_REG_STR4: {
String str = strings[getInt(iCode, pc)]; String str = strings[getInt(iCode, pc)];
out.println(tname + " \"" + str + '"'); out.println(tname + " \"" + str + '"');
pc += 4; pc += 4;
break;
} }
case Icode_REG_IND1: { case Icode_REG_IND1: {
indexReg = 0xFF & iCode[pc]; indexReg = 0xFF & iCode[pc];
out.println(tname+" "+indexReg); out.println(tname+" "+indexReg);
++pc; ++pc;
break;
} }
case Icode_REG_IND2: { case Icode_REG_IND2: {
indexReg = getIndex(iCode, pc); indexReg = getIndex(iCode, pc);
out.println(tname+" "+indexReg); out.println(tname+" "+indexReg);
pc += 2; pc += 2;
break;
} }
case Icode_REG_IND4: { case Icode_REG_IND4: {
indexReg = getInt(iCode, pc); indexReg = getInt(iCode, pc);
out.println(tname+" "+indexReg); out.println(tname+" "+indexReg);
pc += 4; pc += 4;
break;
} }
case Icode_GETVAR1:
case Icode_SETVAR1:
indexReg = iCode[pc];
++pc;
out.println(tname+" "+indexReg);
break;
} }
if (old_pc + icodeLength != pc) Kit.codeBug(); if (old_pc + icodeLength != pc) Kit.codeBug();
} }
@ -1831,6 +1824,11 @@ public class Interpreter
// int string index // int string index
return 1 + 4; return 1 + 4;
case Icode_GETVAR1:
case Icode_SETVAR1:
// byte var index
return 1 + 1;
case Icode_LINE : case Icode_LINE :
// line number // line number
return 1 + 2; return 1 + 2;
@ -2600,6 +2598,9 @@ switch (op) {
case Icode_NAMEDEC : case Icode_NAMEDEC :
stack[++stackTop] = ScriptRuntime.postIncrDecr(scope, stringReg, op == Icode_NAMEINC); stack[++stackTop] = ScriptRuntime.postIncrDecr(scope, stringReg, op == Icode_NAMEINC);
continue Loop; continue Loop;
case Icode_SETVAR1:
indexReg = iCode[pc++];
// fallthrough
case Token.SETVAR : case Token.SETVAR :
if (!useActivationVars) { if (!useActivationVars) {
stack[indexReg] = stack[stackTop]; stack[indexReg] = stack[stackTop];
@ -2610,6 +2611,9 @@ switch (op) {
activationPut(fnOrScript, scope, indexReg, val); activationPut(fnOrScript, scope, indexReg, val);
} }
continue Loop; continue Loop;
case Icode_GETVAR1:
indexReg = iCode[pc++];
// fallthrough
case Token.GETVAR : case Token.GETVAR :
++stackTop; ++stackTop;
if (!useActivationVars) { if (!useActivationVars) {