OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/operation-typer.h" | 5 #include "src/compiler/operation-typer.h" |
6 | 6 |
7 #include "src/factory.h" | 7 #include "src/factory.h" |
8 #include "src/isolate.h" | 8 #include "src/isolate.h" |
9 #include "src/type-cache.h" | 9 #include "src/type-cache.h" |
10 #include "src/types.h" | 10 #include "src/types.h" |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 if (!lhs->IsInhabited() || !rhs->IsInhabited()) { | 292 if (!lhs->IsInhabited() || !rhs->IsInhabited()) { |
293 return Type::None(); | 293 return Type::None(); |
294 } | 294 } |
295 | 295 |
296 // We can give more precise types for integers. | 296 // We can give more precise types for integers. |
297 if (!lhs->Is(cache_.kIntegerOrMinusZeroOrNaN) || | 297 if (!lhs->Is(cache_.kIntegerOrMinusZeroOrNaN) || |
298 !rhs->Is(cache_.kIntegerOrMinusZeroOrNaN)) { | 298 !rhs->Is(cache_.kIntegerOrMinusZeroOrNaN)) { |
299 return Type::Number(); | 299 return Type::Number(); |
300 } | 300 } |
301 Type* int_lhs = Type::Intersect(lhs, cache_.kInteger, zone()); | 301 Type* int_lhs = Type::Intersect(lhs, cache_.kInteger, zone()); |
| 302 if (lhs->Maybe(Type::MinusZero())) { |
| 303 int_lhs = Type::Union(int_lhs, cache_.kSingletonZero, zone()); |
| 304 } |
302 Type* int_rhs = Type::Intersect(rhs, cache_.kInteger, zone()); | 305 Type* int_rhs = Type::Intersect(rhs, cache_.kInteger, zone()); |
| 306 if (rhs->Maybe(Type::MinusZero())) { |
| 307 int_rhs = Type::Union(int_rhs, cache_.kSingletonZero, zone()); |
| 308 } |
303 Type* result = | 309 Type* result = |
304 AddRanger(int_lhs->Min(), int_lhs->Max(), int_rhs->Min(), int_rhs->Max()); | 310 AddRanger(int_lhs->Min(), int_lhs->Max(), int_rhs->Min(), int_rhs->Max()); |
305 if (lhs->Maybe(Type::NaN()) || rhs->Maybe(Type::NaN())) { | 311 if (lhs->Maybe(Type::NaN()) || rhs->Maybe(Type::NaN())) { |
306 result = Type::Union(result, Type::NaN(), zone()); | 312 result = Type::Union(result, Type::NaN(), zone()); |
307 } | 313 } |
308 if (lhs->Maybe(Type::MinusZero()) && rhs->Maybe(Type::MinusZero())) { | 314 if (lhs->Maybe(Type::MinusZero()) && rhs->Maybe(Type::MinusZero())) { |
309 result = Type::Union(result, Type::MinusZero(), zone()); | 315 result = Type::Union(result, Type::MinusZero(), zone()); |
310 } | 316 } |
311 return result; | 317 return result; |
312 } | 318 } |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 return NumberAdd(lhs, rhs); | 476 return NumberAdd(lhs, rhs); |
471 } | 477 } |
472 | 478 |
473 Type* OperationTyper::TypeJSSubtract(Type* lhs, Type* rhs) { | 479 Type* OperationTyper::TypeJSSubtract(Type* lhs, Type* rhs) { |
474 return NumberSubtract(ToNumber(lhs), ToNumber(rhs)); | 480 return NumberSubtract(ToNumber(lhs), ToNumber(rhs)); |
475 } | 481 } |
476 | 482 |
477 } // namespace compiler | 483 } // namespace compiler |
478 } // namespace internal | 484 } // namespace internal |
479 } // namespace v8 | 485 } // namespace v8 |
OLD | NEW |