Index: src/compiler/typer.cc |
diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc |
index cf1ca6d2420a51e509911fb99dece87ca9651fd5..a4e3c64911f08fd4b58c73b3dcd7f31cb9964feb 100644 |
--- a/src/compiler/typer.cc |
+++ b/src/compiler/typer.cc |
@@ -39,20 +39,9 @@ Typer::Typer(Isolate* isolate, Graph* graph) |
Zone* zone = this->zone(); |
Factory* const factory = isolate->factory(); |
- Type* infinity = Type::Constant(factory->infinity_value(), zone); |
- Type* minus_infinity = Type::Constant(factory->minus_infinity_value(), zone); |
- // Unfortunately, the infinities created in other places might be different |
- // ones (eg the result of NewNumber in TypeNumberConstant). |
- Type* truncating_to_zero = |
- Type::Union(Type::Union(infinity, minus_infinity, zone), |
- Type::MinusZeroOrNaN(), zone); |
- DCHECK(!truncating_to_zero->Maybe(Type::Integral32())); |
- |
singleton_false_ = Type::Constant(factory->false_value(), zone); |
singleton_true_ = Type::Constant(factory->true_value(), zone); |
singleton_the_hole_ = Type::Constant(factory->the_hole_value(), zone); |
- signed32ish_ = Type::Union(Type::Signed32(), truncating_to_zero, zone); |
- unsigned32ish_ = Type::Union(Type::Unsigned32(), truncating_to_zero, zone); |
falsish_ = Type::Union( |
Type::Undetectable(), |
Type::Union(Type::Union(singleton_false_, cache_.kZeroish, zone), |
@@ -105,6 +94,19 @@ class Typer::Visitor : public Reducer { |
JS_OTHER_OP_LIST(DECLARE_CASE) |
#undef DECLARE_CASE |
+#define DECLARE_CASE(x) \ |
+ case IrOpcode::k##x: \ |
+ return UpdateType(node, TypeBinaryOp(node, x)); |
+ SIMPLIFIED_NUMBER_BINOP_LIST(DECLARE_CASE) |
+ SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(DECLARE_CASE) |
+#undef DECLARE_CASE |
+ |
+#define DECLARE_CASE(x) \ |
+ case IrOpcode::k##x: \ |
+ return UpdateType(node, TypeUnaryOp(node, x)); |
+ SIMPLIFIED_NUMBER_UNOP_LIST(DECLARE_CASE) |
+#undef DECLARE_CASE |
+ |
#define DECLARE_CASE(x) case IrOpcode::k##x: |
DECLARE_CASE(Loop) |
DECLARE_CASE(Branch) |
@@ -155,6 +157,19 @@ class Typer::Visitor : public Reducer { |
JS_OTHER_OP_LIST(DECLARE_CASE) |
#undef DECLARE_CASE |
+#define DECLARE_CASE(x) \ |
+ case IrOpcode::k##x: \ |
+ return TypeBinaryOp(node, x); |
+ SIMPLIFIED_NUMBER_BINOP_LIST(DECLARE_CASE) |
+ SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(DECLARE_CASE) |
+#undef DECLARE_CASE |
+ |
+#define DECLARE_CASE(x) \ |
+ case IrOpcode::k##x: \ |
+ return TypeUnaryOp(node, x); |
+ SIMPLIFIED_NUMBER_UNOP_LIST(DECLARE_CASE) |
+#undef DECLARE_CASE |
+ |
#define DECLARE_CASE(x) case IrOpcode::k##x: |
DECLARE_CASE(Loop) |
DECLARE_CASE(Branch) |
@@ -249,15 +264,19 @@ class Typer::Visitor : public Reducer { |
static Type* ToNumber(Type*, Typer*); |
static Type* ToObject(Type*, Typer*); |
static Type* ToString(Type*, Typer*); |
- static Type* NumberCeil(Type*, Typer*); |
- static Type* NumberFloor(Type*, Typer*); |
- static Type* NumberMax(Type*, Type*, Typer*); |
- static Type* NumberMin(Type*, Type*, Typer*); |
- static Type* NumberRound(Type*, Typer*); |
- static Type* NumberSign(Type*, Typer*); |
- static Type* NumberTrunc(Type*, Typer*); |
- static Type* NumberToInt32(Type*, Typer*); |
- static Type* NumberToUint32(Type*, Typer*); |
+#define DECLARE_METHOD(Name) \ |
+ static Type* Name(Type* type, Typer* t) { \ |
+ return t->operation_typer_.Name(type); \ |
+ } |
+ SIMPLIFIED_NUMBER_UNOP_LIST(DECLARE_METHOD) |
+#undef DECLARE_METHOD |
+#define DECLARE_METHOD(Name) \ |
+ static Type* Name(Type* lhs, Type* rhs, Typer* t) { \ |
+ return t->operation_typer_.Name(lhs, rhs); \ |
+ } |
+ SIMPLIFIED_NUMBER_BINOP_LIST(DECLARE_METHOD) |
+ SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(DECLARE_METHOD) |
+#undef DECLARE_METHOD |
static Type* ObjectIsCallable(Type*, Typer*); |
static Type* ObjectIsNumber(Type*, Typer*); |
@@ -451,24 +470,7 @@ Type* Typer::Visitor::ToName(Type* type, Typer* t) { |
// static |
Type* Typer::Visitor::ToNumber(Type* type, Typer* t) { |
- if (type->Is(Type::Number())) return type; |
- if (type->Is(Type::NullOrUndefined())) { |
- if (type->Is(Type::Null())) return t->cache_.kSingletonZero; |
- if (type->Is(Type::Undefined())) return Type::NaN(); |
- return Type::Union(Type::NaN(), t->cache_.kSingletonZero, t->zone()); |
- } |
- if (type->Is(Type::NumberOrUndefined())) { |
- return Type::Union(Type::Intersect(type, Type::Number(), t->zone()), |
- Type::NaN(), t->zone()); |
- } |
- if (type->Is(t->singleton_false_)) return t->cache_.kSingletonZero; |
- if (type->Is(t->singleton_true_)) return t->cache_.kSingletonOne; |
- if (type->Is(Type::Boolean())) return t->cache_.kZeroOrOne; |
- if (type->Is(Type::BooleanOrNumber())) { |
- return Type::Union(Type::Intersect(type, Type::Number(), t->zone()), |
- t->cache_.kZeroOrOne, t->zone()); |
- } |
- return Type::Number(); |
+ return t->operation_typer_.ToNumber(type); |
} |
@@ -492,136 +494,6 @@ Type* Typer::Visitor::ToString(Type* type, Typer* t) { |
return Type::String(); |
} |
-// static |
-Type* Typer::Visitor::NumberCeil(Type* type, Typer* t) { |
- DCHECK(type->Is(Type::Number())); |
- if (type->Is(t->cache_.kIntegerOrMinusZeroOrNaN)) return type; |
- // TODO(bmeurer): We could infer a more precise type here. |
- return t->cache_.kIntegerOrMinusZeroOrNaN; |
-} |
- |
-// static |
-Type* Typer::Visitor::NumberFloor(Type* type, Typer* t) { |
- DCHECK(type->Is(Type::Number())); |
- if (type->Is(t->cache_.kIntegerOrMinusZeroOrNaN)) return type; |
- // TODO(bmeurer): We could infer a more precise type here. |
- return t->cache_.kIntegerOrMinusZeroOrNaN; |
-} |
- |
-// static |
-Type* Typer::Visitor::NumberMax(Type* lhs, Type* rhs, Typer* t) { |
- DCHECK(lhs->Is(Type::Number())); |
- DCHECK(rhs->Is(Type::Number())); |
- if (lhs->Is(Type::NaN()) || rhs->Is(Type::NaN())) { |
- return Type::NaN(); |
- } |
- Type* type = Type::None(); |
- // TODO(turbofan): Improve minus zero handling here. |
- if (lhs->Maybe(Type::NaN()) || rhs->Maybe(Type::NaN())) { |
- type = Type::Union(type, Type::NaN(), t->zone()); |
- } |
- lhs = Type::Intersect(lhs, Type::OrderedNumber(), t->zone()); |
- rhs = Type::Intersect(rhs, Type::OrderedNumber(), t->zone()); |
- if (lhs->Is(t->cache_.kInteger) && rhs->Is(t->cache_.kInteger)) { |
- double max = std::max(lhs->Max(), rhs->Max()); |
- double min = std::max(lhs->Min(), rhs->Min()); |
- type = Type::Union(type, Type::Range(min, max, t->zone()), t->zone()); |
- } else { |
- type = Type::Union(type, Type::Union(lhs, rhs, t->zone()), t->zone()); |
- } |
- return type; |
-} |
- |
-// static |
-Type* Typer::Visitor::NumberMin(Type* lhs, Type* rhs, Typer* t) { |
- DCHECK(lhs->Is(Type::Number())); |
- DCHECK(rhs->Is(Type::Number())); |
- if (lhs->Is(Type::NaN()) || rhs->Is(Type::NaN())) { |
- return Type::NaN(); |
- } |
- Type* type = Type::None(); |
- // TODO(turbofan): Improve minus zero handling here. |
- if (lhs->Maybe(Type::NaN()) || rhs->Maybe(Type::NaN())) { |
- type = Type::Union(type, Type::NaN(), t->zone()); |
- } |
- lhs = Type::Intersect(lhs, Type::OrderedNumber(), t->zone()); |
- rhs = Type::Intersect(rhs, Type::OrderedNumber(), t->zone()); |
- if (lhs->Is(t->cache_.kInteger) && rhs->Is(t->cache_.kInteger)) { |
- double max = std::min(lhs->Max(), rhs->Max()); |
- double min = std::min(lhs->Min(), rhs->Min()); |
- type = Type::Union(type, Type::Range(min, max, t->zone()), t->zone()); |
- } else { |
- type = Type::Union(type, Type::Union(lhs, rhs, t->zone()), t->zone()); |
- } |
- return type; |
-} |
- |
-// static |
-Type* Typer::Visitor::NumberRound(Type* type, Typer* t) { |
- DCHECK(type->Is(Type::Number())); |
- if (type->Is(t->cache_.kIntegerOrMinusZeroOrNaN)) return type; |
- // TODO(bmeurer): We could infer a more precise type here. |
- return t->cache_.kIntegerOrMinusZeroOrNaN; |
-} |
- |
-// static |
-Type* Typer::Visitor::NumberSign(Type* type, Typer* t) { |
- DCHECK(type->Is(Type::Number())); |
- if (type->Is(t->cache_.kZeroish)) return type; |
- bool maybe_minuszero = type->Maybe(Type::MinusZero()); |
- bool maybe_nan = type->Maybe(Type::NaN()); |
- type = Type::Intersect(type, Type::PlainNumber(), t->zone()); |
- if (type->Max() < 0.0) { |
- type = t->cache_.kSingletonMinusOne; |
- } else if (type->Max() <= 0.0) { |
- type = t->cache_.kMinusOneOrZero; |
- } else if (type->Min() > 0.0) { |
- type = t->cache_.kSingletonOne; |
- } else if (type->Min() >= 0.0) { |
- type = t->cache_.kZeroOrOne; |
- } else { |
- type = Type::Range(-1.0, 1.0, t->zone()); |
- } |
- if (maybe_minuszero) { |
- type = Type::Union(type, Type::MinusZero(), t->zone()); |
- } |
- if (maybe_nan) { |
- type = Type::Union(type, Type::NaN(), t->zone()); |
- } |
- return type; |
-} |
- |
-// static |
-Type* Typer::Visitor::NumberTrunc(Type* type, Typer* t) { |
- DCHECK(type->Is(Type::Number())); |
- if (type->Is(t->cache_.kIntegerOrMinusZeroOrNaN)) return type; |
- // TODO(bmeurer): We could infer a more precise type here. |
- return t->cache_.kIntegerOrMinusZeroOrNaN; |
-} |
- |
-Type* Typer::Visitor::NumberToInt32(Type* type, Typer* t) { |
- if (type->Is(Type::Signed32())) return type; |
- if (type->Is(t->cache_.kZeroish)) return t->cache_.kSingletonZero; |
- if (type->Is(t->signed32ish_)) { |
- return Type::Intersect( |
- Type::Union(type, t->cache_.kSingletonZero, t->zone()), |
- Type::Signed32(), t->zone()); |
- } |
- return Type::Signed32(); |
-} |
- |
- |
-Type* Typer::Visitor::NumberToUint32(Type* type, Typer* t) { |
- if (type->Is(Type::Unsigned32())) return type; |
- if (type->Is(t->cache_.kZeroish)) return t->cache_.kSingletonZero; |
- if (type->Is(t->unsigned32ish_)) { |
- return Type::Intersect( |
- Type::Union(type, t->cache_.kSingletonZero, t->zone()), |
- Type::Unsigned32(), t->zone()); |
- } |
- return Type::Unsigned32(); |
-} |
- |
// Type checks. |
Type* Typer::Visitor::ObjectIsCallable(Type* type, Typer* t) { |
@@ -1024,129 +896,32 @@ Type* Typer::Visitor::JSGreaterThanOrEqualTyper( |
Type* Typer::Visitor::JSBitwiseOrTyper(Type* lhs, Type* rhs, Typer* t) { |
- lhs = NumberToInt32(ToNumber(lhs, t), t); |
- rhs = NumberToInt32(ToNumber(rhs, t), t); |
- double lmin = lhs->Min(); |
- double rmin = rhs->Min(); |
- double lmax = lhs->Max(); |
- double rmax = rhs->Max(); |
- // Or-ing any two values results in a value no smaller than their minimum. |
- // Even no smaller than their maximum if both values are non-negative. |
- double min = |
- lmin >= 0 && rmin >= 0 ? std::max(lmin, rmin) : std::min(lmin, rmin); |
- double max = Type::Signed32()->Max(); |
- |
- // Or-ing with 0 is essentially a conversion to int32. |
- if (rmin == 0 && rmax == 0) { |
- min = lmin; |
- max = lmax; |
- } |
- if (lmin == 0 && lmax == 0) { |
- min = rmin; |
- max = rmax; |
- } |
- |
- if (lmax < 0 || rmax < 0) { |
- // Or-ing two values of which at least one is negative results in a negative |
- // value. |
- max = std::min(max, -1.0); |
- } |
- return Type::Range(min, max, t->zone()); |
+ return NumberBitwiseOr(ToNumber(lhs, t), ToNumber(rhs, t), t); |
} |
Type* Typer::Visitor::JSBitwiseAndTyper(Type* lhs, Type* rhs, Typer* t) { |
- lhs = NumberToInt32(ToNumber(lhs, t), t); |
- rhs = NumberToInt32(ToNumber(rhs, t), t); |
- double lmin = lhs->Min(); |
- double rmin = rhs->Min(); |
- double lmax = lhs->Max(); |
- double rmax = rhs->Max(); |
- double min = Type::Signed32()->Min(); |
- // And-ing any two values results in a value no larger than their maximum. |
- // Even no larger than their minimum if both values are non-negative. |
- double max = |
- lmin >= 0 && rmin >= 0 ? std::min(lmax, rmax) : std::max(lmax, rmax); |
- // And-ing with a non-negative value x causes the result to be between |
- // zero and x. |
- if (lmin >= 0) { |
- min = 0; |
- max = std::min(max, lmax); |
- } |
- if (rmin >= 0) { |
- min = 0; |
- max = std::min(max, rmax); |
- } |
- return Type::Range(min, max, t->zone()); |
+ return NumberBitwiseAnd(ToNumber(lhs, t), ToNumber(rhs, t), t); |
} |
Type* Typer::Visitor::JSBitwiseXorTyper(Type* lhs, Type* rhs, Typer* t) { |
- lhs = NumberToInt32(ToNumber(lhs, t), t); |
- rhs = NumberToInt32(ToNumber(rhs, t), t); |
- double lmin = lhs->Min(); |
- double rmin = rhs->Min(); |
- double lmax = lhs->Max(); |
- double rmax = rhs->Max(); |
- if ((lmin >= 0 && rmin >= 0) || (lmax < 0 && rmax < 0)) { |
- // Xor-ing negative or non-negative values results in a non-negative value. |
- return Type::Unsigned31(); |
- } |
- if ((lmax < 0 && rmin >= 0) || (lmin >= 0 && rmax < 0)) { |
- // Xor-ing a negative and a non-negative value results in a negative value. |
- // TODO(jarin) Use a range here. |
- return Type::Negative32(); |
- } |
- return Type::Signed32(); |
+ return NumberBitwiseXor(ToNumber(lhs, t), ToNumber(rhs, t), t); |
} |
Type* Typer::Visitor::JSShiftLeftTyper(Type* lhs, Type* rhs, Typer* t) { |
- return Type::Signed32(); |
+ return NumberShiftLeft(ToNumber(lhs, t), ToNumber(rhs, t), t); |
} |
Type* Typer::Visitor::JSShiftRightTyper(Type* lhs, Type* rhs, Typer* t) { |
- lhs = NumberToInt32(ToNumber(lhs, t), t); |
- rhs = NumberToUint32(ToNumber(rhs, t), t); |
- double min = kMinInt; |
- double max = kMaxInt; |
- if (lhs->Min() >= 0) { |
- // Right-shifting a non-negative value cannot make it negative, nor larger. |
- min = std::max(min, 0.0); |
- max = std::min(max, lhs->Max()); |
- if (rhs->Min() > 0 && rhs->Max() <= 31) { |
- max = static_cast<int>(max) >> static_cast<int>(rhs->Min()); |
- } |
- } |
- if (lhs->Max() < 0) { |
- // Right-shifting a negative value cannot make it non-negative, nor smaller. |
- min = std::max(min, lhs->Min()); |
- max = std::min(max, -1.0); |
- if (rhs->Min() > 0 && rhs->Max() <= 31) { |
- min = static_cast<int>(min) >> static_cast<int>(rhs->Min()); |
- } |
- } |
- if (rhs->Min() > 0 && rhs->Max() <= 31) { |
- // Right-shifting by a positive value yields a small integer value. |
- double shift_min = kMinInt >> static_cast<int>(rhs->Min()); |
- double shift_max = kMaxInt >> static_cast<int>(rhs->Min()); |
- min = std::max(min, shift_min); |
- max = std::min(max, shift_max); |
- } |
- // TODO(jarin) Ideally, the following micro-optimization should be performed |
- // by the type constructor. |
- if (max != Type::Signed32()->Max() || min != Type::Signed32()->Min()) { |
- return Type::Range(min, max, t->zone()); |
- } |
- return Type::Signed32(); |
+ return NumberShiftRight(ToNumber(lhs, t), ToNumber(rhs, t), t); |
} |
Type* Typer::Visitor::JSShiftRightLogicalTyper(Type* lhs, Type* rhs, Typer* t) { |
- lhs = NumberToUint32(ToNumber(lhs, t), t); |
- // Logical right-shifting any value cannot make it larger. |
- return Type::Range(0.0, lhs->Max(), t->zone()); |
+ return NumberShiftRightLogical(ToNumber(lhs, t), ToNumber(rhs, t), t); |
} |
@@ -1163,26 +938,23 @@ Type* Typer::Visitor::JSAddTyper(Type* lhs, Type* rhs, Typer* t) { |
} |
} |
// The addition must be numeric. |
- return t->operation_typer()->NumberAdd(ToNumber(lhs, t), ToNumber(rhs, t)); |
+ return NumberAdd(ToNumber(lhs, t), ToNumber(rhs, t), t); |
} |
Type* Typer::Visitor::JSSubtractTyper(Type* lhs, Type* rhs, Typer* t) { |
- return t->operation_typer()->NumberSubtract(ToNumber(lhs, t), |
- ToNumber(rhs, t)); |
+ return NumberSubtract(ToNumber(lhs, t), ToNumber(rhs, t), t); |
} |
Type* Typer::Visitor::JSMultiplyTyper(Type* lhs, Type* rhs, Typer* t) { |
- return t->operation_typer()->NumberMultiply(ToNumber(lhs, t), |
- ToNumber(rhs, t)); |
+ return NumberMultiply(ToNumber(lhs, t), ToNumber(rhs, t), t); |
} |
Type* Typer::Visitor::JSDivideTyper(Type* lhs, Type* rhs, Typer* t) { |
- return t->operation_typer()->NumberDivide(ToNumber(lhs, t), ToNumber(rhs, t)); |
+ return NumberDivide(ToNumber(lhs, t), ToNumber(rhs, t), t); |
} |
Type* Typer::Visitor::JSModulusTyper(Type* lhs, Type* rhs, Typer* t) { |
- return t->operation_typer()->NumberModulus(ToNumber(lhs, t), |
- ToNumber(rhs, t)); |
+ return NumberModulus(ToNumber(lhs, t), ToNumber(rhs, t), t); |
} |
@@ -1669,89 +1441,6 @@ Type* Typer::Visitor::TypeSpeculativeNumberLessThanOrEqual(Node* node) { |
return Type::Boolean(); |
} |
-Type* Typer::Visitor::TypeNumberAdd(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberSubtract(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeSpeculativeNumberAdd(Node* node) { |
- return Type::Number(); |
-} |
- |
-Type* Typer::Visitor::TypeSpeculativeNumberSubtract(Node* node) { |
- return Type::Number(); |
-} |
- |
-Type* Typer::Visitor::TypeSpeculativeNumberMultiply(Node* node) { |
- return Type::Number(); |
-} |
- |
-Type* Typer::Visitor::TypeSpeculativeNumberDivide(Node* node) { |
- return Type::Number(); |
-} |
- |
-Type* Typer::Visitor::TypeSpeculativeNumberModulus(Node* node) { |
- return Type::Number(); |
-} |
- |
-Type* Typer::Visitor::TypeSpeculativeNumberShiftLeft(Node* node) { |
- return Type::Signed32(); |
-} |
- |
-Type* Typer::Visitor::TypeSpeculativeNumberShiftRight(Node* node) { |
- return Type::Signed32(); |
-} |
- |
-Type* Typer::Visitor::TypeSpeculativeNumberShiftRightLogical(Node* node) { |
- return Type::Unsigned32(); |
-} |
- |
-Type* Typer::Visitor::TypeSpeculativeNumberBitwiseOr(Node* node) { |
- return Type::Signed32(); |
-} |
- |
-Type* Typer::Visitor::TypeSpeculativeNumberBitwiseXor(Node* node) { |
- return Type::Signed32(); |
-} |
- |
-Type* Typer::Visitor::TypeSpeculativeNumberBitwiseAnd(Node* node) { |
- return Type::Signed32(); |
-} |
- |
-Type* Typer::Visitor::TypeNumberMultiply(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberDivide(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberModulus(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberBitwiseOr(Node* node) { |
- return Type::Signed32(); |
-} |
- |
- |
-Type* Typer::Visitor::TypeNumberBitwiseXor(Node* node) { |
- return Type::Signed32(); |
-} |
- |
- |
-Type* Typer::Visitor::TypeNumberBitwiseAnd(Node* node) { |
- return Type::Signed32(); |
-} |
- |
- |
-Type* Typer::Visitor::TypeNumberShiftLeft(Node* node) { |
- return Type::Signed32(); |
-} |
- |
- |
-Type* Typer::Visitor::TypeNumberShiftRight(Node* node) { |
- return Type::Signed32(); |
-} |
- |
- |
-Type* Typer::Visitor::TypeNumberShiftRightLogical(Node* node) { |
- return Type::Unsigned32(); |
-} |
- |
Type* Typer::Visitor::TypePlainPrimitiveToNumber(Node* node) { |
return TypeUnaryOp(node, ToNumber); |
} |
@@ -1764,103 +1453,6 @@ Type* Typer::Visitor::TypePlainPrimitiveToFloat64(Node* node) { |
return Type::Number(); |
} |
-Type* Typer::Visitor::TypeNumberImul(Node* node) { return Type::Signed32(); } |
- |
-Type* Typer::Visitor::TypeNumberAbs(Node* node) { |
- return typer_->operation_typer()->NumberAbs(Operand(node, 0)); |
-} |
- |
-Type* Typer::Visitor::TypeNumberClz32(Node* node) { |
- return typer_->cache_.kZeroToThirtyTwo; |
-} |
- |
-Type* Typer::Visitor::TypeNumberCeil(Node* node) { |
- return TypeUnaryOp(node, NumberCeil); |
-} |
- |
-Type* Typer::Visitor::TypeNumberFloor(Node* node) { |
- return TypeUnaryOp(node, NumberFloor); |
-} |
- |
-Type* Typer::Visitor::TypeNumberFround(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberSign(Node* node) { |
- return TypeUnaryOp(node, NumberSign); |
-} |
- |
-Type* Typer::Visitor::TypeNumberAcos(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberAcosh(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberAsin(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberAsinh(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberAtan(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberAtanh(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberAtan2(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberCos(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberCosh(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberExp(Node* node) { |
- return Type::Union(Type::PlainNumber(), Type::NaN(), zone()); |
-} |
- |
-// TODO(mvstanton): Is this type sufficient, or should it look like Exp()? |
-Type* Typer::Visitor::TypeNumberExpm1(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberLog(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberLog1p(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberLog2(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberLog10(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberCbrt(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberMax(Node* node) { |
- return TypeBinaryOp(node, NumberMax); |
-} |
- |
-Type* Typer::Visitor::TypeNumberMin(Node* node) { |
- return TypeBinaryOp(node, NumberMin); |
-} |
- |
-Type* Typer::Visitor::TypeNumberPow(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberRound(Node* node) { |
- return TypeUnaryOp(node, NumberRound); |
-} |
- |
-Type* Typer::Visitor::TypeNumberSin(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberSinh(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberSqrt(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberTan(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberTanh(Node* node) { return Type::Number(); } |
- |
-Type* Typer::Visitor::TypeNumberTrunc(Node* node) { |
- return TypeUnaryOp(node, NumberTrunc); |
-} |
- |
-Type* Typer::Visitor::TypeNumberToInt32(Node* node) { |
- return TypeUnaryOp(node, NumberToInt32); |
-} |
- |
- |
-Type* Typer::Visitor::TypeNumberToUint32(Node* node) { |
- return TypeUnaryOp(node, NumberToUint32); |
-} |
- |
- |
// static |
Type* Typer::Visitor::ReferenceEqualTyper(Type* lhs, Type* rhs, Typer* t) { |
if (lhs->IsConstant() && rhs->Is(lhs)) { |
@@ -2271,10 +1863,6 @@ Type* Typer::Visitor::TypeChangeFloat64ToInt32(Node* node) { |
return Type::Intersect(Type::Signed32(), Type::UntaggedIntegral32(), zone()); |
} |
-Type* Typer::Visitor::TypeNumberSilenceNaN(Node* node) { |
- return Type::Number(); |
-} |
- |
Type* Typer::Visitor::TypeChangeFloat64ToUint32(Node* node) { |
return Type::Intersect(Type::Unsigned32(), Type::UntaggedIntegral32(), |
zone()); |