| 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/compiler/common-operator.h" |     7 #include "src/compiler/common-operator.h" | 
|     8 #include "src/compiler/type-cache.h" |     8 #include "src/compiler/type-cache.h" | 
|     9 #include "src/compiler/types.h" |     9 #include "src/compiler/types.h" | 
|    10 #include "src/factory.h" |    10 #include "src/factory.h" | 
| (...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   857   double max = std::max(max_lhs >> min_rhs, max_lhs >> max_rhs); |   857   double max = std::max(max_lhs >> min_rhs, max_lhs >> max_rhs); | 
|   858  |   858  | 
|   859   if (max == kMaxInt && min == kMinInt) return Type::Signed32(); |   859   if (max == kMaxInt && min == kMinInt) return Type::Signed32(); | 
|   860   return Type::Range(min, max, zone()); |   860   return Type::Range(min, max, zone()); | 
|   861 } |   861 } | 
|   862  |   862  | 
|   863 Type* OperationTyper::NumberShiftRightLogical(Type* lhs, Type* rhs) { |   863 Type* OperationTyper::NumberShiftRightLogical(Type* lhs, Type* rhs) { | 
|   864   DCHECK(lhs->Is(Type::Number())); |   864   DCHECK(lhs->Is(Type::Number())); | 
|   865   DCHECK(rhs->Is(Type::Number())); |   865   DCHECK(rhs->Is(Type::Number())); | 
|   866  |   866  | 
|   867   if (!lhs->IsInhabited()) return Type::None(); |   867   if (!lhs->IsInhabited() || !rhs->IsInhabited()) return Type::None(); | 
|   868  |   868  | 
|   869   lhs = NumberToUint32(lhs); |   869   lhs = NumberToUint32(lhs); | 
 |   870   rhs = NumberToUint32(rhs); | 
|   870  |   871  | 
|   871   // Logical right-shifting any value cannot make it larger. |   872   uint32_t min_lhs = lhs->Min(); | 
|   872   return Type::Range(0.0, lhs->Max(), zone()); |   873   uint32_t max_lhs = lhs->Max(); | 
 |   874   uint32_t min_rhs = rhs->Min(); | 
 |   875   uint32_t max_rhs = rhs->Max(); | 
 |   876   if (max_rhs > 31) { | 
 |   877     // rhs can be larger than the bitmask | 
 |   878     max_rhs = 31; | 
 |   879     min_rhs = 0; | 
 |   880   } | 
 |   881  | 
 |   882   double min = min_lhs >> max_rhs; | 
 |   883   double max = max_lhs >> min_rhs; | 
 |   884   DCHECK_LE(0, min); | 
 |   885   DCHECK_LE(max, kMaxUInt32); | 
 |   886  | 
 |   887   if (min == 0 && max == kMaxInt) return Type::Unsigned31(); | 
 |   888   if (min == 0 && max == kMaxUInt32) return Type::Unsigned32(); | 
 |   889   return Type::Range(min, max, zone()); | 
|   873 } |   890 } | 
|   874  |   891  | 
|   875 Type* OperationTyper::NumberAtan2(Type* lhs, Type* rhs) { |   892 Type* OperationTyper::NumberAtan2(Type* lhs, Type* rhs) { | 
|   876   DCHECK(lhs->Is(Type::Number())); |   893   DCHECK(lhs->Is(Type::Number())); | 
|   877   DCHECK(rhs->Is(Type::Number())); |   894   DCHECK(rhs->Is(Type::Number())); | 
|   878   return Type::Number(); |   895   return Type::Number(); | 
|   879 } |   896 } | 
|   880  |   897  | 
|   881 Type* OperationTyper::NumberImul(Type* lhs, Type* rhs) { |   898 Type* OperationTyper::NumberImul(Type* lhs, Type* rhs) { | 
|   882   DCHECK(lhs->Is(Type::Number())); |   899   DCHECK(lhs->Is(Type::Number())); | 
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   992   return singleton_true(); |  1009   return singleton_true(); | 
|   993 } |  1010 } | 
|   994  |  1011  | 
|   995 Type* OperationTyper::TypeTypeGuard(const Operator* sigma_op, Type* input) { |  1012 Type* OperationTyper::TypeTypeGuard(const Operator* sigma_op, Type* input) { | 
|   996   return Type::Intersect(input, TypeGuardTypeOf(sigma_op), zone()); |  1013   return Type::Intersect(input, TypeGuardTypeOf(sigma_op), zone()); | 
|   997 } |  1014 } | 
|   998  |  1015  | 
|   999 }  // namespace compiler |  1016 }  // namespace compiler | 
|  1000 }  // namespace internal |  1017 }  // namespace internal | 
|  1001 }  // namespace v8 |  1018 }  // namespace v8 | 
| OLD | NEW |