mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-10 17:24:29 +00:00
Reordered GetProp/SetProp operands to base, name. Added NewArray, GetElement, SetElement instructions.
This commit is contained in:
parent
5834a20d81
commit
3a59608302
@ -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 :
|
||||
|
@ -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; }
|
||||
|
@ -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 :
|
||||
|
@ -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; }
|
||||
|
Loading…
x
Reference in New Issue
Block a user