Use hydrogen accessor in a few more places to save space in the lithium IR.

Review URL: http://codereview.chromium.org/6207007

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6288 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 3a7c6964
......@@ -945,22 +945,21 @@ LInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
Token::Value op = compare->token();
HValue* left = compare->left();
HValue* right = compare->right();
if (left->representation().IsInteger32()) {
Representation r = compare->GetInputRepresentation();
if (r.IsInteger32()) {
ASSERT(left->representation().IsInteger32());
ASSERT(right->representation().IsInteger32());
return new LCmpIDAndBranch(op,
UseRegisterAtStart(left),
return new LCmpIDAndBranch(UseRegisterAtStart(left),
UseOrConstantAtStart(right),
first_id,
second_id,
false);
} else if (left->representation().IsDouble()) {
second_id);
} else if (r.IsDouble()) {
ASSERT(left->representation().IsDouble());
ASSERT(right->representation().IsDouble());
return new LCmpIDAndBranch(op,
UseRegisterAtStart(left),
return new LCmpIDAndBranch(UseRegisterAtStart(left),
UseRegisterAtStart(right),
first_id,
second_id,
true);
second_id);
} else {
ASSERT(left->representation().IsTagged());
ASSERT(right->representation().IsTagged());
......@@ -998,7 +997,6 @@ LInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
ASSERT(compare->value()->representation().IsTagged());
return new LIsNullAndBranch(UseRegisterAtStart(compare->value()),
compare->is_strict(),
first_id,
second_id);
} else if (v->IsIsObject()) {
......@@ -1350,17 +1348,22 @@ LInstruction* LChunkBuilder::DoPower(HPower* instr) {
LInstruction* LChunkBuilder::DoCompare(HCompare* instr) {
Token::Value op = instr->token();
if (instr->left()->representation().IsInteger32()) {
Representation r = instr->GetInputRepresentation();
if (r.IsInteger32()) {
ASSERT(instr->left()->representation().IsInteger32());
ASSERT(instr->right()->representation().IsInteger32());
LOperand* left = UseRegisterAtStart(instr->left());
LOperand* right = UseOrConstantAtStart(instr->right());
return DefineAsRegister(new LCmpID(op, left, right, false));
} else if (instr->left()->representation().IsDouble()) {
return DefineAsRegister(new LCmpID(left, right));
} else if (r.IsDouble()) {
ASSERT(instr->left()->representation().IsDouble());
ASSERT(instr->right()->representation().IsDouble());
LOperand* left = UseRegisterAtStart(instr->left());
LOperand* right = UseRegisterAtStart(instr->right());
return DefineAsRegister(new LCmpID(op, left, right, true));
return DefineAsRegister(new LCmpID(left, right));
} else {
ASSERT(instr->left()->representation().IsTagged());
ASSERT(instr->right()->representation().IsTagged());
bool reversed = (op == Token::GT || op == Token::LTE);
LOperand* left = UseFixed(instr->left(), reversed ? r0 : r1);
LOperand* right = UseFixed(instr->right(), reversed ? r1 : r0);
......@@ -1383,8 +1386,7 @@ LInstruction* LChunkBuilder::DoIsNull(HIsNull* instr) {
ASSERT(instr->value()->representation().IsTagged());
LOperand* value = UseRegisterAtStart(instr->value());
return DefineAsRegister(new LIsNull(value,
instr->is_strict()));
return DefineAsRegister(new LIsNull(value));
}
......
......@@ -583,29 +583,26 @@ class LMulI: public LBinaryOperation {
class LCmpID: public LBinaryOperation {
public:
LCmpID(Token::Value op, LOperand* left, LOperand* right, bool is_double)
: LBinaryOperation(left, right), op_(op), is_double_(is_double) { }
LCmpID(LOperand* left, LOperand* right)
: LBinaryOperation(left, right) { }
Token::Value op() const { return op_; }
bool is_double() const { return is_double_; }
Token::Value op() const { return hydrogen()->token(); }
bool is_double() const {
return hydrogen()->GetInputRepresentation().IsDouble();
}
DECLARE_CONCRETE_INSTRUCTION(CmpID, "cmp-id")
private:
Token::Value op_;
bool is_double_;
DECLARE_HYDROGEN_ACCESSOR(Compare)
};
class LCmpIDAndBranch: public LCmpID {
public:
LCmpIDAndBranch(Token::Value op,
LOperand* left,
LCmpIDAndBranch(LOperand* left,
LOperand* right,
int true_block_id,
int false_block_id,
bool is_double)
: LCmpID(op, left, right, is_double),
int false_block_id)
: LCmpID(left, right),
true_block_id_(true_block_id),
false_block_id_(false_block_id) { }
......@@ -668,25 +665,21 @@ class LCmpJSObjectEqAndBranch: public LCmpJSObjectEq {
class LIsNull: public LUnaryOperation {
public:
LIsNull(LOperand* value, bool is_strict)
: LUnaryOperation(value), is_strict_(is_strict) {}
explicit LIsNull(LOperand* value) : LUnaryOperation(value) {}
DECLARE_CONCRETE_INSTRUCTION(IsNull, "is-null")
DECLARE_HYDROGEN_ACCESSOR(IsNull);
bool is_strict() const { return is_strict_; }
private:
bool is_strict_;
bool is_strict() const { return hydrogen()->is_strict(); }
};
class LIsNullAndBranch: public LIsNull {
public:
LIsNullAndBranch(LOperand* value,
bool is_strict,
int true_block_id,
int false_block_id)
: LIsNull(value, is_strict),
: LIsNull(value),
true_block_id_(true_block_id),
false_block_id_(false_block_id) { }
......
......@@ -957,22 +957,23 @@ LInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
Token::Value op = compare->token();
HValue* left = compare->left();
HValue* right = compare->right();
if (left->representation().IsInteger32()) {
Representation r = compare->GetInputRepresentation();
if (r.IsInteger32()) {
ASSERT(left->representation().IsInteger32());
ASSERT(right->representation().IsInteger32());
return new LCmpIDAndBranch(op,
UseRegisterAtStart(left),
return new LCmpIDAndBranch(UseRegisterAtStart(left),
UseOrConstantAtStart(right),
first_id,
second_id,
false);
} else if (left->representation().IsDouble()) {
second_id);
} else if (r.IsDouble()) {
ASSERT(left->representation().IsDouble());
ASSERT(right->representation().IsDouble());
return new LCmpIDAndBranch(op,
UseRegisterAtStart(left),
return new LCmpIDAndBranch(UseRegisterAtStart(left),
UseRegisterAtStart(right),
first_id,
second_id,
true);
second_id);
} else {
ASSERT(left->representation().IsTagged());
ASSERT(right->representation().IsTagged());
......@@ -1013,7 +1014,6 @@ LInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
// We only need a temp register for non-strict compare.
LOperand* temp = compare->is_strict() ? NULL : TempRegister();
return new LIsNullAndBranch(UseRegisterAtStart(compare->value()),
compare->is_strict(),
temp,
first_id,
second_id);
......@@ -1379,17 +1379,22 @@ LInstruction* LChunkBuilder::DoPower(HPower* instr) {
LInstruction* LChunkBuilder::DoCompare(HCompare* instr) {
Token::Value op = instr->token();
if (instr->left()->representation().IsInteger32()) {
Representation r = instr->GetInputRepresentation();
if (r.IsInteger32()) {
ASSERT(instr->left()->representation().IsInteger32());
ASSERT(instr->right()->representation().IsInteger32());
LOperand* left = UseRegisterAtStart(instr->left());
LOperand* right = UseOrConstantAtStart(instr->right());
return DefineAsRegister(new LCmpID(op, left, right, false));
} else if (instr->left()->representation().IsDouble()) {
return DefineAsRegister(new LCmpID(left, right));
} else if (r.IsDouble()) {
ASSERT(instr->left()->representation().IsDouble());
ASSERT(instr->right()->representation().IsDouble());
LOperand* left = UseRegisterAtStart(instr->left());
LOperand* right = UseRegisterAtStart(instr->right());
return DefineAsRegister(new LCmpID(op, left, right, true));
return DefineAsRegister(new LCmpID(left, right));
} else {
ASSERT(instr->left()->representation().IsTagged());
ASSERT(instr->right()->representation().IsTagged());
bool reversed = (op == Token::GT || op == Token::LTE);
LOperand* left = UseFixed(instr->left(), reversed ? eax : edx);
LOperand* right = UseFixed(instr->right(), reversed ? edx : eax);
......@@ -1412,8 +1417,7 @@ LInstruction* LChunkBuilder::DoIsNull(HIsNull* instr) {
ASSERT(instr->value()->representation().IsTagged());
LOperand* value = UseRegisterAtStart(instr->value());
return DefineAsRegister(new LIsNull(value,
instr->is_strict()));
return DefineAsRegister(new LIsNull(value));
}
......
......@@ -633,29 +633,26 @@ class LMulI: public LBinaryOperation<1> {
class LCmpID: public LBinaryOperation<1> {
public:
LCmpID(Token::Value op, LOperand* left, LOperand* right, bool is_double)
: LBinaryOperation<1>(left, right), op_(op), is_double_(is_double) { }
LCmpID(LOperand* left, LOperand* right)
: LBinaryOperation<1>(left, right) { }
Token::Value op() const { return op_; }
bool is_double() const { return is_double_; }
Token::Value op() const { return hydrogen()->token(); }
bool is_double() const {
return hydrogen()->GetInputRepresentation().IsDouble();
}
DECLARE_CONCRETE_INSTRUCTION(CmpID, "cmp-id")
private:
Token::Value op_;
bool is_double_;
DECLARE_HYDROGEN_ACCESSOR(Compare)
};
class LCmpIDAndBranch: public LCmpID {
public:
LCmpIDAndBranch(Token::Value op,
LOperand* left,
LCmpIDAndBranch(LOperand* left,
LOperand* right,
int true_block_id,
int false_block_id,
bool is_double)
: LCmpID(op, left, right, is_double),
int false_block_id)
: LCmpID(left, right),
true_block_id_(true_block_id),
false_block_id_(false_block_id) { }
......@@ -718,26 +715,22 @@ class LCmpJSObjectEqAndBranch: public LCmpJSObjectEq {
class LIsNull: public LUnaryOperation<1> {
public:
LIsNull(LOperand* value, bool is_strict)
: LUnaryOperation<1>(value), is_strict_(is_strict) {}
explicit LIsNull(LOperand* value) : LUnaryOperation<1>(value) { }
DECLARE_CONCRETE_INSTRUCTION(IsNull, "is-null")
DECLARE_HYDROGEN_ACCESSOR(IsNull)
bool is_strict() const { return is_strict_; }
private:
bool is_strict_;
bool is_strict() const { return hydrogen()->is_strict(); }
};
class LIsNullAndBranch: public LIsNull {
public:
LIsNullAndBranch(LOperand* value,
bool is_strict,
LOperand* temp,
int true_block_id,
int false_block_id)
: LIsNull(value, is_strict),
: LIsNull(value),
temp_(temp),
true_block_id_(true_block_id),
false_block_id_(false_block_id) { }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment