Reviewers: Kevin Millikin,
Description:
Add support for unary plus in hydrogen compiler.
Also strength-reduction of unary minus.
Fixes issue 1248.
BUG=1248
Please review this at http://codereview.chromium.org/6685045/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/hydrogen.h
M src/hydrogen.cc
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index
6cb2b240a95b61103609b49d4f2532282985591d..4a99aa90b76e98d13daada80238b42f68d001bff
100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -485,6 +485,11 @@ HConstant*
HGraph::GetConstant(SetOncePointer<HConstant>* pointer,
}
+HConstant* HGraph::GetConstant0() {
+ return GetConstant(&constant_0_, Smi::FromInt(0));
+}
+
+
HConstant* HGraph::GetConstant1() {
return GetConstant(&constant_1_, Smi::FromInt(1));
}
@@ -4519,7 +4524,7 @@ void
HGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) {
VisitForEffect(expr->expression());
}
- } else if (op == Token::BIT_NOT || op == Token::SUB) {
+ } else if (op == Token::BIT_NOT || op == Token::SUB || op == Token::ADD)
{
VISIT_FOR_VALUE(expr->expression());
HValue* value = Pop();
HInstruction* instr = NULL;
@@ -4528,8 +4533,10 @@ void
HGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) {
instr = new HBitNot(value);
break;
case Token::SUB:
- instr = new HMul(graph_->GetConstantMinus1(), value);
+ instr = new HSub(graph_->GetConstant0(), value);
break;
+ case Token::ADD:
+ instr = new HSub(value, graph_->GetConstant0());
default:
UNREACHABLE();
break;
Index: src/hydrogen.h
diff --git a/src/hydrogen.h b/src/hydrogen.h
index
235b669933294a6d890ba0d099d2f77d41d11e2f..2c79dc29fff0bbd9e1c508b9778fdca6a231d6f1
100644
--- a/src/hydrogen.h
+++ b/src/hydrogen.h
@@ -222,6 +222,7 @@ class HGraph: public ZoneObject {
undefined_constant_.set(constant);
}
HConstant* GetConstantUndefined() const { return
undefined_constant_.get(); }
+ HConstant* GetConstant0();
HConstant* GetConstant1();
HConstant* GetConstantMinus1();
HConstant* GetConstantTrue();
@@ -283,6 +284,7 @@ class HGraph: public ZoneObject {
ZoneList<HValue*> values_;
ZoneList<HPhi*>* phi_list_;
SetOncePointer<HConstant> undefined_constant_;
+ SetOncePointer<HConstant> constant_0_;
SetOncePointer<HConstant> constant_1_;
SetOncePointer<HConstant> constant_minus1_;
SetOncePointer<HConstant> constant_true_;
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev