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

Reply via email to