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 950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 return type; | 961 return type; |
962 } | 962 } |
963 | 963 |
964 Type* OperationTyper::NumberPow(Type* lhs, Type* rhs) { | 964 Type* OperationTyper::NumberPow(Type* lhs, Type* rhs) { |
965 DCHECK(lhs->Is(Type::Number())); | 965 DCHECK(lhs->Is(Type::Number())); |
966 DCHECK(rhs->Is(Type::Number())); | 966 DCHECK(rhs->Is(Type::Number())); |
967 // TODO(turbofan): We should be able to do better here. | 967 // TODO(turbofan): We should be able to do better here. |
968 return Type::Number(); | 968 return Type::Number(); |
969 } | 969 } |
970 | 970 |
971 #define SPECULATIVE_NUMBER_BINOP(Name) \ | 971 #define SPECULATIVE_NUMBER_BINOP(Name) \ |
972 Type* OperationTyper::Speculative##Name(Type* lhs, Type* rhs) { \ | 972 Type* OperationTyper::Speculative##Name(Type* lhs, Type* rhs) { \ |
973 lhs = ToNumber(Type::Intersect(lhs, Type::NumberOrOddball(), zone())); \ | 973 lhs = SpeculativeToNumber(lhs); \ |
974 rhs = ToNumber(Type::Intersect(rhs, Type::NumberOrOddball(), zone())); \ | 974 rhs = SpeculativeToNumber(rhs); \ |
975 return Name(lhs, rhs); \ | 975 return Name(lhs, rhs); \ |
976 } | 976 } |
977 SPECULATIVE_NUMBER_BINOP(NumberAdd) | 977 SPECULATIVE_NUMBER_BINOP(NumberAdd) |
978 SPECULATIVE_NUMBER_BINOP(NumberSubtract) | 978 SPECULATIVE_NUMBER_BINOP(NumberSubtract) |
979 SPECULATIVE_NUMBER_BINOP(NumberMultiply) | 979 SPECULATIVE_NUMBER_BINOP(NumberMultiply) |
980 SPECULATIVE_NUMBER_BINOP(NumberDivide) | 980 SPECULATIVE_NUMBER_BINOP(NumberDivide) |
981 SPECULATIVE_NUMBER_BINOP(NumberModulus) | 981 SPECULATIVE_NUMBER_BINOP(NumberModulus) |
982 SPECULATIVE_NUMBER_BINOP(NumberBitwiseOr) | 982 SPECULATIVE_NUMBER_BINOP(NumberBitwiseOr) |
983 SPECULATIVE_NUMBER_BINOP(NumberBitwiseAnd) | 983 SPECULATIVE_NUMBER_BINOP(NumberBitwiseAnd) |
984 SPECULATIVE_NUMBER_BINOP(NumberBitwiseXor) | 984 SPECULATIVE_NUMBER_BINOP(NumberBitwiseXor) |
985 SPECULATIVE_NUMBER_BINOP(NumberShiftLeft) | 985 SPECULATIVE_NUMBER_BINOP(NumberShiftLeft) |
986 SPECULATIVE_NUMBER_BINOP(NumberShiftRight) | 986 SPECULATIVE_NUMBER_BINOP(NumberShiftRight) |
987 SPECULATIVE_NUMBER_BINOP(NumberShiftRightLogical) | 987 SPECULATIVE_NUMBER_BINOP(NumberShiftRightLogical) |
988 #undef SPECULATIVE_NUMBER_BINOP | 988 #undef SPECULATIVE_NUMBER_BINOP |
989 | 989 |
| 990 Type* OperationTyper::SpeculativeToNumber(Type* type) { |
| 991 return ToNumber(Type::Intersect(type, Type::NumberOrOddball(), zone())); |
| 992 } |
| 993 |
990 Type* OperationTyper::ToPrimitive(Type* type) { | 994 Type* OperationTyper::ToPrimitive(Type* type) { |
991 if (type->Is(Type::Primitive()) && !type->Maybe(Type::Receiver())) { | 995 if (type->Is(Type::Primitive()) && !type->Maybe(Type::Receiver())) { |
992 return type; | 996 return type; |
993 } | 997 } |
994 return Type::Primitive(); | 998 return Type::Primitive(); |
995 } | 999 } |
996 | 1000 |
997 Type* OperationTyper::Invert(Type* type) { | 1001 Type* OperationTyper::Invert(Type* type) { |
998 DCHECK(type->Is(Type::Boolean())); | 1002 DCHECK(type->Is(Type::Boolean())); |
999 DCHECK(type->IsInhabited()); | 1003 DCHECK(type->IsInhabited()); |
(...skipping 22 matching lines...) Expand all Loading... |
1022 return singleton_true(); | 1026 return singleton_true(); |
1023 } | 1027 } |
1024 | 1028 |
1025 Type* OperationTyper::TypeTypeGuard(const Operator* sigma_op, Type* input) { | 1029 Type* OperationTyper::TypeTypeGuard(const Operator* sigma_op, Type* input) { |
1026 return Type::Intersect(input, TypeGuardTypeOf(sigma_op), zone()); | 1030 return Type::Intersect(input, TypeGuardTypeOf(sigma_op), zone()); |
1027 } | 1031 } |
1028 | 1032 |
1029 } // namespace compiler | 1033 } // namespace compiler |
1030 } // namespace internal | 1034 } // namespace internal |
1031 } // namespace v8 | 1035 } // namespace v8 |
OLD | NEW |