| 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 894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 905 Type* OperationTyper::NumberImul(Type* lhs, Type* rhs) { | 905 Type* OperationTyper::NumberImul(Type* lhs, Type* rhs) { |
| 906 DCHECK(lhs->Is(Type::Number())); | 906 DCHECK(lhs->Is(Type::Number())); |
| 907 DCHECK(rhs->Is(Type::Number())); | 907 DCHECK(rhs->Is(Type::Number())); |
| 908 // TODO(turbofan): We should be able to do better here. | 908 // TODO(turbofan): We should be able to do better here. |
| 909 return Type::Signed32(); | 909 return Type::Signed32(); |
| 910 } | 910 } |
| 911 | 911 |
| 912 Type* OperationTyper::NumberMax(Type* lhs, Type* rhs) { | 912 Type* OperationTyper::NumberMax(Type* lhs, Type* rhs) { |
| 913 DCHECK(lhs->Is(Type::Number())); | 913 DCHECK(lhs->Is(Type::Number())); |
| 914 DCHECK(rhs->Is(Type::Number())); | 914 DCHECK(rhs->Is(Type::Number())); |
| 915 if (!lhs->IsInhabited() || !rhs->IsInhabited()) { |
| 916 return Type::None(); |
| 917 } |
| 915 if (lhs->Is(Type::NaN()) || rhs->Is(Type::NaN())) { | 918 if (lhs->Is(Type::NaN()) || rhs->Is(Type::NaN())) { |
| 916 return Type::NaN(); | 919 return Type::NaN(); |
| 917 } | 920 } |
| 918 Type* type = Type::None(); | 921 Type* type = Type::None(); |
| 919 // TODO(turbofan): Improve minus zero handling here. | 922 // TODO(turbofan): Improve minus zero handling here. |
| 920 if (lhs->Maybe(Type::NaN()) || rhs->Maybe(Type::NaN())) { | 923 if (lhs->Maybe(Type::NaN()) || rhs->Maybe(Type::NaN())) { |
| 921 type = Type::Union(type, Type::NaN(), zone()); | 924 type = Type::Union(type, Type::NaN(), zone()); |
| 922 } | 925 } |
| 923 lhs = Type::Intersect(lhs, Type::OrderedNumber(), zone()); | 926 lhs = Type::Intersect(lhs, Type::OrderedNumber(), zone()); |
| 924 rhs = Type::Intersect(rhs, Type::OrderedNumber(), zone()); | 927 rhs = Type::Intersect(rhs, Type::OrderedNumber(), zone()); |
| 925 if (lhs->Is(cache_.kInteger) && rhs->Is(cache_.kInteger)) { | 928 if (lhs->Is(cache_.kInteger) && rhs->Is(cache_.kInteger)) { |
| 926 double max = std::max(lhs->Max(), rhs->Max()); | 929 double max = std::max(lhs->Max(), rhs->Max()); |
| 927 double min = std::max(lhs->Min(), rhs->Min()); | 930 double min = std::max(lhs->Min(), rhs->Min()); |
| 928 type = Type::Union(type, Type::Range(min, max, zone()), zone()); | 931 type = Type::Union(type, Type::Range(min, max, zone()), zone()); |
| 929 } else { | 932 } else { |
| 930 type = Type::Union(type, Type::Union(lhs, rhs, zone()), zone()); | 933 type = Type::Union(type, Type::Union(lhs, rhs, zone()), zone()); |
| 931 } | 934 } |
| 932 return type; | 935 return type; |
| 933 } | 936 } |
| 934 | 937 |
| 935 Type* OperationTyper::NumberMin(Type* lhs, Type* rhs) { | 938 Type* OperationTyper::NumberMin(Type* lhs, Type* rhs) { |
| 936 DCHECK(lhs->Is(Type::Number())); | 939 DCHECK(lhs->Is(Type::Number())); |
| 937 DCHECK(rhs->Is(Type::Number())); | 940 DCHECK(rhs->Is(Type::Number())); |
| 941 if (!lhs->IsInhabited() || !rhs->IsInhabited()) { |
| 942 return Type::None(); |
| 943 } |
| 938 if (lhs->Is(Type::NaN()) || rhs->Is(Type::NaN())) { | 944 if (lhs->Is(Type::NaN()) || rhs->Is(Type::NaN())) { |
| 939 return Type::NaN(); | 945 return Type::NaN(); |
| 940 } | 946 } |
| 941 Type* type = Type::None(); | 947 Type* type = Type::None(); |
| 942 // TODO(turbofan): Improve minus zero handling here. | 948 // TODO(turbofan): Improve minus zero handling here. |
| 943 if (lhs->Maybe(Type::NaN()) || rhs->Maybe(Type::NaN())) { | 949 if (lhs->Maybe(Type::NaN()) || rhs->Maybe(Type::NaN())) { |
| 944 type = Type::Union(type, Type::NaN(), zone()); | 950 type = Type::Union(type, Type::NaN(), zone()); |
| 945 } | 951 } |
| 946 lhs = Type::Intersect(lhs, Type::OrderedNumber(), zone()); | 952 lhs = Type::Intersect(lhs, Type::OrderedNumber(), zone()); |
| 947 rhs = Type::Intersect(rhs, Type::OrderedNumber(), zone()); | 953 rhs = Type::Intersect(rhs, Type::OrderedNumber(), zone()); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1016 return singleton_true(); | 1022 return singleton_true(); |
| 1017 } | 1023 } |
| 1018 | 1024 |
| 1019 Type* OperationTyper::TypeTypeGuard(const Operator* sigma_op, Type* input) { | 1025 Type* OperationTyper::TypeTypeGuard(const Operator* sigma_op, Type* input) { |
| 1020 return Type::Intersect(input, TypeGuardTypeOf(sigma_op), zone()); | 1026 return Type::Intersect(input, TypeGuardTypeOf(sigma_op), zone()); |
| 1021 } | 1027 } |
| 1022 | 1028 |
| 1023 } // namespace compiler | 1029 } // namespace compiler |
| 1024 } // namespace internal | 1030 } // namespace internal |
| 1025 } // namespace v8 | 1031 } // namespace v8 |
| OLD | NEW |