| Index: src/compiler/operation-typer.cc
|
| diff --git a/src/compiler/operation-typer.cc b/src/compiler/operation-typer.cc
|
| index 514ba085c31c4486bc9240836b00024666ed4017..e74e164bf9286669c662adb25bdc4c4b6c90aa1f 100644
|
| --- a/src/compiler/operation-typer.cc
|
| +++ b/src/compiler/operation-typer.cc
|
| @@ -285,7 +285,7 @@ Type* OperationTyper::ToNumber(Type* type) {
|
| return Type::Number();
|
| }
|
|
|
| -Type* OperationTyper::NumericAdd(Type* lhs, Type* rhs) {
|
| +Type* OperationTyper::NumberAdd(Type* lhs, Type* rhs) {
|
| DCHECK(lhs->Is(Type::Number()));
|
| DCHECK(rhs->Is(Type::Number()));
|
|
|
| @@ -311,7 +311,7 @@ Type* OperationTyper::NumericAdd(Type* lhs, Type* rhs) {
|
| return result;
|
| }
|
|
|
| -Type* OperationTyper::NumericSubtract(Type* lhs, Type* rhs) {
|
| +Type* OperationTyper::NumberSubtract(Type* lhs, Type* rhs) {
|
| DCHECK(lhs->Is(Type::Number()));
|
| DCHECK(rhs->Is(Type::Number()));
|
|
|
| @@ -329,7 +329,7 @@ Type* OperationTyper::NumericSubtract(Type* lhs, Type* rhs) {
|
| return Type::Number();
|
| }
|
|
|
| -Type* OperationTyper::NumericMultiply(Type* lhs, Type* rhs) {
|
| +Type* OperationTyper::NumberMultiply(Type* lhs, Type* rhs) {
|
| DCHECK(lhs->Is(Type::Number()));
|
| DCHECK(rhs->Is(Type::Number()));
|
|
|
| @@ -346,7 +346,7 @@ Type* OperationTyper::NumericMultiply(Type* lhs, Type* rhs) {
|
| return Type::Number();
|
| }
|
|
|
| -Type* OperationTyper::NumericDivide(Type* lhs, Type* rhs) {
|
| +Type* OperationTyper::NumberDivide(Type* lhs, Type* rhs) {
|
| DCHECK(lhs->Is(Type::Number()));
|
| DCHECK(rhs->Is(Type::Number()));
|
|
|
| @@ -363,7 +363,7 @@ Type* OperationTyper::NumericDivide(Type* lhs, Type* rhs) {
|
| return maybe_nan ? Type::Number() : Type::OrderedNumber();
|
| }
|
|
|
| -Type* OperationTyper::NumericModulus(Type* lhs, Type* rhs) {
|
| +Type* OperationTyper::NumberModulus(Type* lhs, Type* rhs) {
|
| DCHECK(lhs->Is(Type::Number()));
|
| DCHECK(rhs->Is(Type::Number()));
|
|
|
| @@ -387,6 +387,34 @@ Type* OperationTyper::NumericModulus(Type* lhs, Type* rhs) {
|
| return Type::OrderedNumber();
|
| }
|
|
|
| +Type* OperationTyper::NumberAbs(Type* type) {
|
| + DCHECK(type->Is(Type::Number()));
|
| +
|
| + if (!type->IsInhabited()) {
|
| + return Type::None();
|
| + }
|
| +
|
| + bool const maybe_nan = type->Maybe(Type::NaN());
|
| + bool const maybe_minuszero = type->Maybe(Type::MinusZero());
|
| + type = Type::Intersect(type, Type::PlainNumber(), zone());
|
| + double const max = type->Max();
|
| + double const min = type->Min();
|
| + if (min < 0) {
|
| + if (type->Is(cache_.kInteger)) {
|
| + type = Type::Range(0.0, std::max(std::fabs(min), std::fabs(max)), zone());
|
| + } else {
|
| + type = Type::PlainNumber();
|
| + }
|
| + }
|
| + if (maybe_minuszero) {
|
| + type = Type::Union(type, cache_.kSingletonZero, zone());
|
| + }
|
| + if (maybe_nan) {
|
| + type = Type::Union(type, Type::NaN(), zone());
|
| + }
|
| + return type;
|
| +}
|
| +
|
| Type* OperationTyper::ToPrimitive(Type* type) {
|
| if (type->Is(Type::Primitive()) && !type->Maybe(Type::Receiver())) {
|
| return type;
|
| @@ -439,11 +467,11 @@ Type* OperationTyper::TypeJSAdd(Type* lhs, Type* rhs) {
|
| }
|
| lhs = ToNumber(lhs);
|
| rhs = ToNumber(rhs);
|
| - return NumericAdd(lhs, rhs);
|
| + return NumberAdd(lhs, rhs);
|
| }
|
|
|
| Type* OperationTyper::TypeJSSubtract(Type* lhs, Type* rhs) {
|
| - return NumericSubtract(ToNumber(lhs), ToNumber(rhs));
|
| + return NumberSubtract(ToNumber(lhs), ToNumber(rhs));
|
| }
|
|
|
| } // namespace compiler
|
|
|