Index: src/compiler/typer.cc |
diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc |
index ce8a5636233c1476de497b1db9e3c2615ce48337..0e765adb0fff61b3ceda0849b273fc79a48e3ba4 100644 |
--- a/src/compiler/typer.cc |
+++ b/src/compiler/typer.cc |
@@ -254,7 +254,6 @@ class Typer::Visitor : public Reducer { |
static Type* ToNumber(Type*, Typer*); |
static Type* ToObject(Type*, Typer*); |
static Type* ToString(Type*, Typer*); |
- static Type* NumberAbs(Type*, Typer*); |
static Type* NumberCeil(Type*, Typer*); |
static Type* NumberFloor(Type*, Typer*); |
static Type* NumberRound(Type*, Typer*); |
@@ -492,34 +491,6 @@ Type* Typer::Visitor::ToString(Type* type, Typer* t) { |
} |
// static |
-Type* Typer::Visitor::NumberAbs(Type* type, Typer* t) { |
- DCHECK(type->Is(Type::Number())); |
- Factory* const f = t->isolate()->factory(); |
- bool const maybe_nan = type->Maybe(Type::NaN()); |
- bool const maybe_minuszero = type->Maybe(Type::MinusZero()); |
- type = Type::Intersect(type, Type::PlainNumber(), t->zone()); |
- double const max = type->Max(); |
- double const min = type->Min(); |
- if (min < 0) { |
- if (type->Is(t->cache_.kInteger)) { |
- type = |
- Type::Range(0.0, std::max(std::fabs(min), std::fabs(max)), t->zone()); |
- } else if (min == max) { |
- type = Type::Constant(f->NewNumber(std::fabs(min)), t->zone()); |
- } else { |
- type = Type::PlainNumber(); |
- } |
- } |
- if (maybe_minuszero) { |
- type = Type::Union(type, t->cache_.kSingletonZero, t->zone()); |
- } |
- if (maybe_nan) { |
- type = Type::Union(type, Type::NaN(), t->zone()); |
- } |
- return type; |
-} |
- |
-// static |
Type* Typer::Visitor::NumberCeil(Type* type, Typer* t) { |
DCHECK(type->Is(Type::Number())); |
if (type->Is(t->cache_.kIntegerOrMinusZeroOrNaN)) return type; |
@@ -1055,36 +1026,26 @@ Type* Typer::Visitor::JSAddTyper(Type* lhs, Type* rhs, Typer* t) { |
} |
} |
// The addition must be numeric. |
- return t->operation_typer()->NumericAdd(ToNumber(lhs, t), ToNumber(rhs, t)); |
+ return t->operation_typer()->NumberAdd(ToNumber(lhs, t), ToNumber(rhs, t)); |
} |
Type* Typer::Visitor::JSSubtractTyper(Type* lhs, Type* rhs, Typer* t) { |
- return t->operation_typer()->NumericSubtract(ToNumber(lhs, t), |
- ToNumber(rhs, t)); |
+ return t->operation_typer()->NumberSubtract(ToNumber(lhs, t), |
+ ToNumber(rhs, t)); |
} |
Type* Typer::Visitor::JSMultiplyTyper(Type* lhs, Type* rhs, Typer* t) { |
- return t->operation_typer()->NumericMultiply(ToNumber(lhs, t), |
- ToNumber(rhs, t)); |
+ return t->operation_typer()->NumberMultiply(ToNumber(lhs, t), |
+ ToNumber(rhs, t)); |
} |
Type* Typer::Visitor::JSDivideTyper(Type* lhs, Type* rhs, Typer* t) { |
- return t->operation_typer()->NumericDivide(ToNumber(lhs, t), |
- ToNumber(rhs, t)); |
- lhs = ToNumber(lhs, t); |
- rhs = ToNumber(rhs, t); |
- if (lhs->Is(Type::NaN()) || rhs->Is(Type::NaN())) return Type::NaN(); |
- // Division is tricky, so all we do is try ruling out nan. |
- bool maybe_nan = |
- lhs->Maybe(Type::NaN()) || rhs->Maybe(t->cache_.kZeroish) || |
- ((lhs->Min() == -V8_INFINITY || lhs->Max() == +V8_INFINITY) && |
- (rhs->Min() == -V8_INFINITY || rhs->Max() == +V8_INFINITY)); |
- return maybe_nan ? Type::Number() : Type::OrderedNumber(); |
+ return t->operation_typer()->NumberDivide(ToNumber(lhs, t), ToNumber(rhs, t)); |
} |
Type* Typer::Visitor::JSModulusTyper(Type* lhs, Type* rhs, Typer* t) { |
- return t->operation_typer()->NumericModulus(ToNumber(lhs, t), |
- ToNumber(rhs, t)); |
+ return t->operation_typer()->NumberModulus(ToNumber(lhs, t), |
+ ToNumber(rhs, t)); |
} |
@@ -1655,7 +1616,7 @@ Type* Typer::Visitor::TypePlainPrimitiveToFloat64(Node* node) { |
Type* Typer::Visitor::TypeNumberImul(Node* node) { return Type::Signed32(); } |
Type* Typer::Visitor::TypeNumberAbs(Node* node) { |
- return TypeUnaryOp(node, NumberAbs); |
+ return typer_->operation_typer()->NumberAbs(Operand(node, 0)); |
} |
Type* Typer::Visitor::TypeNumberClz32(Node* node) { |