Reordered GetProp/SetProp operands to base, name. Added NewArray, GetElement, SetElement instructions.

This commit is contained in:
beard%netscape.com 2000-04-08 03:37:18 +00:00
parent 5834a20d81
commit 3a59608302
4 changed files with 134 additions and 24 deletions

View File

@ -101,6 +101,14 @@ namespace JavaScript {
return dest;
}
Register ICodeGenerator::newArray()
{
Register dest = getRegister();
NewArray *instr = new NewArray(dest);
iCode->push_back(instr);
return dest;
}
Register ICodeGenerator::loadName(StringAtom &name)
{
Register dest = getRegister();
@ -115,7 +123,7 @@ namespace JavaScript {
iCode->push_back(instr);
}
Register ICodeGenerator::getProperty(StringAtom &name, Register base)
Register ICodeGenerator::getProperty(Register base, StringAtom &name)
{
Register dest = getRegister();
GetProp *instr = new GetProp(GET_PROP, dest, base, &name);
@ -123,9 +131,23 @@ namespace JavaScript {
return dest;
}
void ICodeGenerator::setProperty(StringAtom &name, Register base, Register value)
void ICodeGenerator::setProperty(Register base, StringAtom &name, Register value)
{
SetProp *instr = new SetProp(SET_PROP, &name, base, value);
SetProp *instr = new SetProp(SET_PROP, base, &name, value);
iCode->push_back(instr);
}
Register ICodeGenerator::getElement(Register base, Register index)
{
Register dest = getRegister();
GetElement *instr = new GetElement(GET_ELEMENT, dest, base, index);
iCode->push_back(instr);
return dest;
}
void ICodeGenerator::setElement(Register base, Register index, Register value)
{
SetElement *instr = new SetElement(SET_ELEMENT, base, index, value);
iCode->push_back(instr);
}
@ -552,8 +574,11 @@ namespace JavaScript {
"load_name",
"save_name",
"new_object",
"new_array",
"get_prop",
"set_prop",
"set_prop",
"get_element",
"set_element",
"add",
"subtract",
"multiply",
@ -618,13 +643,25 @@ namespace JavaScript {
case GET_PROP :
{
GetProp *t = static_cast<GetProp * >(instr);
s << "R" << t->itsOperand1 << ", R" << t->itsOperand2 << ", \"" << *t->itsOperand3;
s << "R" << t->itsOperand1 << ", R" << t->itsOperand2 << "[\"" << *t->itsOperand3 << "\"]";
}
break;
case SET_PROP :
{
SetProp *t = static_cast<SetProp * >(instr);
s << "\"" << *t->itsOperand1 << "\", R" << t->itsOperand2 << ", R" << t->itsOperand3;
s << "R" << t->itsOperand1 << "[\"" << *t->itsOperand2 << "\"], R" << t->itsOperand3;
}
break;
case GET_ELEMENT :
{
GetElement *t = static_cast<GetElement * >(instr);
s << "R" << t->itsOperand1 << ", R" << t->itsOperand2 << "[" << t->itsOperand3 << "]";
}
break;
case SET_ELEMENT :
{
SetElement *t = static_cast<SetElement * >(instr);
s << "R" << t->itsOperand1 << "[" << t->itsOperand2 << "], R" << t->itsOperand3;
}
break;
case LOAD_IMMEDIATE :

View File

@ -48,9 +48,16 @@ namespace JavaScript {
SAVE_NAME, // StringAtom & Source Register
NEW_OBJECT, // Destination Register
NEW_ARRAY, // Destination Array
GET_PROP, // Destination Register StringAtom & Base Register
SET_PROP, // StringAtom & Base Register Source Register
// GET_PROP, // Destination Register StringAtom & Base Register
// SET_PROP, // StringAtom & Base Register Source Register
GET_PROP, // Destination Register Object Register StringAtom* (name)
SET_PROP, // Object Register StringAtom* (name) Source Register
GET_ELEMENT, // Destination Register Array Register Index Register
SET_ELEMENT, // Base Register Index Register Source Register
ADD, // Destination Register Source Register 1 Source Register 2
SUBTRACT,
@ -78,7 +85,7 @@ namespace JavaScript {
RETURN, // Source Register
CALL, // Destination Register Target Register Arguments
CALL // Destination Register Target Register Arguments
};
class Instruction {
@ -153,8 +160,10 @@ namespace JavaScript {
Operand3& o3() { return itsOperand3; }
};
typedef Instruction_3<StringAtom*, Register, Register> SetProp;
typedef Instruction_3<Register, StringAtom*, Register> SetProp;
typedef Instruction_3<Register, Register, StringAtom*> GetProp;
typedef Instruction_3<Register, Register, Register> SetElement;
typedef Instruction_3<Register, Register, Register> GetElement;
typedef Instruction_3<Register, Register, Register> Arithmetic;
typedef Instruction_3<Register, Register, Register> Compare;
@ -177,6 +186,11 @@ namespace JavaScript {
public:
NewObject(Register result) : Instruction_1<Register>(NEW_OBJECT, result) { }
};
class NewArray : public Instruction_1<Register> {
public:
NewArray(Register result) : Instruction_1<Register>(NEW_ARRAY, result) { }
};
class ResolvedBranch : public Instruction_1<uint32> {
public:
@ -282,12 +296,16 @@ namespace JavaScript {
void saveVariable(uint32 frameIndex, Register value);
Register newObject();
Register newArray();
Register loadName(StringAtom &name);
void saveName(StringAtom &name, Register value);
Register getProperty(StringAtom &name, Register base);
void setProperty(StringAtom &name, Register base, Register value);
Register getProperty(Register base, StringAtom &name);
void setProperty(Register base, StringAtom &name, Register value);
Register getElement(Register base, Register index);
void setElement(Register base, Register index, Register value);
Register getRegisterBase() { return topRegister; }
InstructionStream *get_iCode() { return iCode; }

View File

@ -101,6 +101,14 @@ namespace JavaScript {
return dest;
}
Register ICodeGenerator::newArray()
{
Register dest = getRegister();
NewArray *instr = new NewArray(dest);
iCode->push_back(instr);
return dest;
}
Register ICodeGenerator::loadName(StringAtom &name)
{
Register dest = getRegister();
@ -115,7 +123,7 @@ namespace JavaScript {
iCode->push_back(instr);
}
Register ICodeGenerator::getProperty(StringAtom &name, Register base)
Register ICodeGenerator::getProperty(Register base, StringAtom &name)
{
Register dest = getRegister();
GetProp *instr = new GetProp(GET_PROP, dest, base, &name);
@ -123,9 +131,23 @@ namespace JavaScript {
return dest;
}
void ICodeGenerator::setProperty(StringAtom &name, Register base, Register value)
void ICodeGenerator::setProperty(Register base, StringAtom &name, Register value)
{
SetProp *instr = new SetProp(SET_PROP, &name, base, value);
SetProp *instr = new SetProp(SET_PROP, base, &name, value);
iCode->push_back(instr);
}
Register ICodeGenerator::getElement(Register base, Register index)
{
Register dest = getRegister();
GetElement *instr = new GetElement(GET_ELEMENT, dest, base, index);
iCode->push_back(instr);
return dest;
}
void ICodeGenerator::setElement(Register base, Register index, Register value)
{
SetElement *instr = new SetElement(SET_ELEMENT, base, index, value);
iCode->push_back(instr);
}
@ -552,8 +574,11 @@ namespace JavaScript {
"load_name",
"save_name",
"new_object",
"new_array",
"get_prop",
"set_prop",
"set_prop",
"get_element",
"set_element",
"add",
"subtract",
"multiply",
@ -618,13 +643,25 @@ namespace JavaScript {
case GET_PROP :
{
GetProp *t = static_cast<GetProp * >(instr);
s << "R" << t->itsOperand1 << ", R" << t->itsOperand2 << ", \"" << *t->itsOperand3;
s << "R" << t->itsOperand1 << ", R" << t->itsOperand2 << "[\"" << *t->itsOperand3 << "\"]";
}
break;
case SET_PROP :
{
SetProp *t = static_cast<SetProp * >(instr);
s << "\"" << *t->itsOperand1 << "\", R" << t->itsOperand2 << ", R" << t->itsOperand3;
s << "R" << t->itsOperand1 << "[\"" << *t->itsOperand2 << "\"], R" << t->itsOperand3;
}
break;
case GET_ELEMENT :
{
GetElement *t = static_cast<GetElement * >(instr);
s << "R" << t->itsOperand1 << ", R" << t->itsOperand2 << "[" << t->itsOperand3 << "]";
}
break;
case SET_ELEMENT :
{
SetElement *t = static_cast<SetElement * >(instr);
s << "R" << t->itsOperand1 << "[" << t->itsOperand2 << "], R" << t->itsOperand3;
}
break;
case LOAD_IMMEDIATE :

View File

@ -48,9 +48,16 @@ namespace JavaScript {
SAVE_NAME, // StringAtom & Source Register
NEW_OBJECT, // Destination Register
NEW_ARRAY, // Destination Array
GET_PROP, // Destination Register StringAtom & Base Register
SET_PROP, // StringAtom & Base Register Source Register
// GET_PROP, // Destination Register StringAtom & Base Register
// SET_PROP, // StringAtom & Base Register Source Register
GET_PROP, // Destination Register Object Register StringAtom* (name)
SET_PROP, // Object Register StringAtom* (name) Source Register
GET_ELEMENT, // Destination Register Array Register Index Register
SET_ELEMENT, // Base Register Index Register Source Register
ADD, // Destination Register Source Register 1 Source Register 2
SUBTRACT,
@ -78,7 +85,7 @@ namespace JavaScript {
RETURN, // Source Register
CALL, // Destination Register Target Register Arguments
CALL // Destination Register Target Register Arguments
};
class Instruction {
@ -153,8 +160,10 @@ namespace JavaScript {
Operand3& o3() { return itsOperand3; }
};
typedef Instruction_3<StringAtom*, Register, Register> SetProp;
typedef Instruction_3<Register, StringAtom*, Register> SetProp;
typedef Instruction_3<Register, Register, StringAtom*> GetProp;
typedef Instruction_3<Register, Register, Register> SetElement;
typedef Instruction_3<Register, Register, Register> GetElement;
typedef Instruction_3<Register, Register, Register> Arithmetic;
typedef Instruction_3<Register, Register, Register> Compare;
@ -177,6 +186,11 @@ namespace JavaScript {
public:
NewObject(Register result) : Instruction_1<Register>(NEW_OBJECT, result) { }
};
class NewArray : public Instruction_1<Register> {
public:
NewArray(Register result) : Instruction_1<Register>(NEW_ARRAY, result) { }
};
class ResolvedBranch : public Instruction_1<uint32> {
public:
@ -282,12 +296,16 @@ namespace JavaScript {
void saveVariable(uint32 frameIndex, Register value);
Register newObject();
Register newArray();
Register loadName(StringAtom &name);
void saveName(StringAtom &name, Register value);
Register getProperty(StringAtom &name, Register base);
void setProperty(StringAtom &name, Register base, Register value);
Register getProperty(Register base, StringAtom &name);
void setProperty(Register base, StringAtom &name, Register value);
Register getElement(Register base, Register index);
void setElement(Register base, Register index, Register value);
Register getRegisterBase() { return topRegister; }
InstructionStream *get_iCode() { return iCode; }