From: bmeurer Date: Tue, 13 Jan 2015 11:02:40 +0000 (-0800) Subject: [turbofan] Add PlainPrimitiveToNumber simplified operator. X-Git-Tag: upstream/4.7.83~5002 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9f292086f9ba3ad4b67a8fe143b297897eb774d6;p=platform%2Fupstream%2Fv8.git [turbofan] Add PlainPrimitiveToNumber simplified operator. TEST=unittests Review URL: https://codereview.chromium.org/845333002 Cr-Commit-Position: refs/heads/master@{#26038} --- diff --git a/src/compiler/opcodes.h b/src/compiler/opcodes.h index bda44d3..a4c42cb 100644 --- a/src/compiler/opcodes.h +++ b/src/compiler/opcodes.h @@ -148,6 +148,7 @@ V(NumberModulus) \ V(NumberToInt32) \ V(NumberToUint32) \ + V(PlainPrimitiveToNumber) \ V(ReferenceEqual) \ V(StringEqual) \ V(StringLessThan) \ diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc index 1461709..16a1278 100644 --- a/src/compiler/simplified-lowering.cc +++ b/src/compiler/simplified-lowering.cc @@ -745,6 +745,22 @@ class RepresentationSelector { } break; } + case IrOpcode::kPlainPrimitiveToNumber: { + VisitUnop(node, kMachAnyTagged, kTypeNumber | kRepTagged); + if (lower()) { + // PlainPrimitiveToNumber(x) => Call(ToNumberStub, x, no-context) + Operator::Properties properties = node->op()->properties(); + Callable callable = CodeFactory::ToNumber(jsgraph_->isolate()); + CallDescriptor::Flags flags = CallDescriptor::kNoFlags; + CallDescriptor* desc = Linkage::GetStubCallDescriptor( + callable.descriptor(), 0, flags, properties, jsgraph_->zone()); + node->set_op(jsgraph_->common()->Call(desc)); + node->InsertInput(jsgraph_->zone(), 0, + +jsgraph_->HeapConstant(callable.code())); + node->AppendInput(jsgraph_->zone(), jsgraph_->NoContextConstant()); + } + break; + } case IrOpcode::kReferenceEqual: { VisitBinop(node, kMachAnyTagged, kRepBit); if (lower()) node->set_op(lowering->machine()->WordEqual()); diff --git a/src/compiler/simplified-operator.cc b/src/compiler/simplified-operator.cc index 0018d7c..5aea64b 100644 --- a/src/compiler/simplified-operator.cc +++ b/src/compiler/simplified-operator.cc @@ -157,35 +157,36 @@ const ElementAccess& ElementAccessOf(const Operator* op) { } -#define PURE_OP_LIST(V) \ - V(AnyToBoolean, Operator::kNoProperties, 1) \ - V(BooleanNot, Operator::kNoProperties, 1) \ - V(BooleanToNumber, Operator::kNoProperties, 1) \ - V(NumberEqual, Operator::kCommutative, 2) \ - V(NumberLessThan, Operator::kNoProperties, 2) \ - V(NumberLessThanOrEqual, Operator::kNoProperties, 2) \ - V(NumberAdd, Operator::kCommutative, 2) \ - V(NumberSubtract, Operator::kNoProperties, 2) \ - V(NumberMultiply, Operator::kCommutative, 2) \ - V(NumberDivide, Operator::kNoProperties, 2) \ - V(NumberModulus, Operator::kNoProperties, 2) \ - V(NumberToInt32, Operator::kNoProperties, 1) \ - V(NumberToUint32, Operator::kNoProperties, 1) \ - V(StringEqual, Operator::kCommutative, 2) \ - V(StringLessThan, Operator::kNoProperties, 2) \ - V(StringLessThanOrEqual, Operator::kNoProperties, 2) \ - V(StringAdd, Operator::kNoProperties, 2) \ - V(ChangeTaggedToInt32, Operator::kNoProperties, 1) \ - V(ChangeTaggedToUint32, Operator::kNoProperties, 1) \ - V(ChangeTaggedToFloat64, Operator::kNoProperties, 1) \ - V(ChangeInt32ToTagged, Operator::kNoProperties, 1) \ - V(ChangeUint32ToTagged, Operator::kNoProperties, 1) \ - V(ChangeFloat64ToTagged, Operator::kNoProperties, 1) \ - V(ChangeBitToBool, Operator::kNoProperties, 1) \ - V(ChangeBoolToBit, Operator::kNoProperties, 1) \ - V(ChangeWord32ToBit, Operator::kNoProperties, 1) \ - V(ChangeWord64ToBit, Operator::kNoProperties, 1) \ - V(ObjectIsSmi, Operator::kNoProperties, 1) \ +#define PURE_OP_LIST(V) \ + V(AnyToBoolean, Operator::kNoProperties, 1) \ + V(BooleanNot, Operator::kNoProperties, 1) \ + V(BooleanToNumber, Operator::kNoProperties, 1) \ + V(NumberEqual, Operator::kCommutative, 2) \ + V(NumberLessThan, Operator::kNoProperties, 2) \ + V(NumberLessThanOrEqual, Operator::kNoProperties, 2) \ + V(NumberAdd, Operator::kCommutative, 2) \ + V(NumberSubtract, Operator::kNoProperties, 2) \ + V(NumberMultiply, Operator::kCommutative, 2) \ + V(NumberDivide, Operator::kNoProperties, 2) \ + V(NumberModulus, Operator::kNoProperties, 2) \ + V(NumberToInt32, Operator::kNoProperties, 1) \ + V(NumberToUint32, Operator::kNoProperties, 1) \ + V(PlainPrimitiveToNumber, Operator::kNoProperties, 1) \ + V(StringEqual, Operator::kCommutative, 2) \ + V(StringLessThan, Operator::kNoProperties, 2) \ + V(StringLessThanOrEqual, Operator::kNoProperties, 2) \ + V(StringAdd, Operator::kNoProperties, 2) \ + V(ChangeTaggedToInt32, Operator::kNoProperties, 1) \ + V(ChangeTaggedToUint32, Operator::kNoProperties, 1) \ + V(ChangeTaggedToFloat64, Operator::kNoProperties, 1) \ + V(ChangeInt32ToTagged, Operator::kNoProperties, 1) \ + V(ChangeUint32ToTagged, Operator::kNoProperties, 1) \ + V(ChangeFloat64ToTagged, Operator::kNoProperties, 1) \ + V(ChangeBitToBool, Operator::kNoProperties, 1) \ + V(ChangeBoolToBit, Operator::kNoProperties, 1) \ + V(ChangeWord32ToBit, Operator::kNoProperties, 1) \ + V(ChangeWord64ToBit, Operator::kNoProperties, 1) \ + V(ObjectIsSmi, Operator::kNoProperties, 1) \ V(ObjectIsNonNegativeSmi, Operator::kNoProperties, 1) diff --git a/src/compiler/simplified-operator.h b/src/compiler/simplified-operator.h index cdaa064..5b57cdd 100644 --- a/src/compiler/simplified-operator.h +++ b/src/compiler/simplified-operator.h @@ -144,6 +144,8 @@ class SimplifiedOperatorBuilder FINAL { const Operator* NumberToInt32(); const Operator* NumberToUint32(); + const Operator* PlainPrimitiveToNumber(); + const Operator* ReferenceEqual(Type* type); const Operator* StringEqual(); diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc index 88a3666..24e93e1 100644 --- a/src/compiler/typer.cc +++ b/src/compiler/typer.cc @@ -1462,7 +1462,7 @@ Bounds Typer::Visitor::TypeBooleanNot(Node* node) { Bounds Typer::Visitor::TypeBooleanToNumber(Node* node) { - return Bounds(Type::None(zone()), typer_->zero_or_one); + return TypeUnaryOp(node, ToNumber); } @@ -1516,6 +1516,11 @@ Bounds Typer::Visitor::TypeNumberToUint32(Node* node) { } +Bounds Typer::Visitor::TypePlainPrimitiveToNumber(Node* node) { + return TypeUnaryOp(node, ToNumber); +} + + Bounds Typer::Visitor::TypeReferenceEqual(Node* node) { return Bounds(Type::None(zone()), Type::Boolean(zone())); } diff --git a/src/compiler/verifier.cc b/src/compiler/verifier.cc index 1916b99..188ee3e 100644 --- a/src/compiler/verifier.cc +++ b/src/compiler/verifier.cc @@ -540,6 +540,11 @@ void Verifier::Visitor::Pre(Node* node) { CheckValueInputIs(node, 0, Type::Number()); CheckUpperIs(node, Type::Unsigned32()); break; + case IrOpcode::kPlainPrimitiveToNumber: + // PlainPrimitive -> Number + CheckValueInputIs(node, 0, Type::PlainPrimitive()); + CheckUpperIs(node, Type::Number()); + break; case IrOpcode::kStringEqual: case IrOpcode::kStringLessThan: case IrOpcode::kStringLessThanOrEqual: diff --git a/test/unittests/compiler/simplified-operator-unittest.cc b/test/unittests/compiler/simplified-operator-unittest.cc index f02d3df..11858b4 100644 --- a/test/unittests/compiler/simplified-operator-unittest.cc +++ b/test/unittests/compiler/simplified-operator-unittest.cc @@ -51,6 +51,7 @@ const PureOperator kPureOperators[] = { PURE(NumberModulus, Operator::kNoProperties, 2), PURE(NumberToInt32, Operator::kNoProperties, 1), PURE(NumberToUint32, Operator::kNoProperties, 1), + PURE(PlainPrimitiveToNumber, Operator::kNoProperties, 1), PURE(StringEqual, Operator::kCommutative, 2), PURE(StringLessThan, Operator::kNoProperties, 2), PURE(StringLessThanOrEqual, Operator::kNoProperties, 2),