| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/graph-inl.h" | 5 #include "src/compiler/graph-inl.h" |
| 6 #include "src/compiler/js-operator.h" | 6 #include "src/compiler/js-operator.h" |
| 7 #include "src/compiler/node.h" | 7 #include "src/compiler/node.h" |
| 8 #include "src/compiler/node-properties-inl.h" | 8 #include "src/compiler/node-properties-inl.h" |
| 9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
| 10 #include "src/compiler/simplified-operator.h" | 10 #include "src/compiler/simplified-operator.h" |
| 11 #include "src/compiler/typer.h" | 11 #include "src/compiler/typer.h" |
| 12 | 12 |
| 13 namespace v8 { | 13 namespace v8 { |
| 14 namespace internal { | 14 namespace internal { |
| 15 namespace compiler { | 15 namespace compiler { |
| 16 | 16 |
| 17 Typer::Typer(Zone* zone) : zone_(zone) { | 17 Typer::Typer(Zone* zone) : zone_(zone) { |
| 18 Type* number = Type::Number(zone); | 18 Factory* f = zone->isolate()->factory(); |
| 19 Type* signed32 = Type::Signed32(zone); | 19 |
| 20 Type* unsigned32 = Type::Unsigned32(zone); | 20 Type* number = Type::Number(); |
| 21 Type* integral32 = Type::Integral32(zone); | 21 Type* signed32 = Type::Signed32(); |
| 22 Type* object = Type::Object(zone); | 22 Type* unsigned32 = Type::Unsigned32(); |
| 23 Type* undefined = Type::Undefined(zone); | 23 Type* integral32 = Type::Integral32(); |
| 24 Type* object = Type::Object(); |
| 25 Type* undefined = Type::Undefined(); |
| 26 Type* weakint = Type::Union( |
| 27 Type::Range(f->NewNumber(-V8_INFINITY), f->NewNumber(+V8_INFINITY), zone), |
| 28 Type::Union(Type::NaN(), Type::MinusZero(), zone), zone); |
| 29 |
| 24 number_fun0_ = Type::Function(number, zone); | 30 number_fun0_ = Type::Function(number, zone); |
| 25 number_fun1_ = Type::Function(number, number, zone); | 31 number_fun1_ = Type::Function(number, number, zone); |
| 26 number_fun2_ = Type::Function(number, number, number, zone); | 32 number_fun2_ = Type::Function(number, number, number, zone); |
| 33 weakint_fun1_ = Type::Function(weakint, number, zone); |
| 27 imul_fun_ = Type::Function(signed32, integral32, integral32, zone); | 34 imul_fun_ = Type::Function(signed32, integral32, integral32, zone); |
| 35 random_fun_ = Type::Function(Type::Union( |
| 36 Type::UnsignedSmall(), Type::OtherNumber(), zone), zone); |
| 37 |
| 28 | 38 |
| 29 #define NATIVE_TYPE(sem, rep) \ | 39 #define NATIVE_TYPE(sem, rep) \ |
| 30 Type::Intersect(Type::sem(zone), Type::rep(zone), zone) | 40 Type::Intersect(Type::sem(zone), Type::rep(zone), zone) |
| 31 // TODO(rossberg): Use range types for more precision, once we have them. | 41 // TODO(rossberg): Use range types for more precision, once we have them. |
| 32 Type* int8 = NATIVE_TYPE(SignedSmall, UntaggedInt8); | 42 Type* int8 = NATIVE_TYPE(SignedSmall, UntaggedInt8); |
| 33 Type* int16 = NATIVE_TYPE(SignedSmall, UntaggedInt16); | 43 Type* int16 = NATIVE_TYPE(SignedSmall, UntaggedInt16); |
| 34 Type* int32 = NATIVE_TYPE(Signed32, UntaggedInt32); | 44 Type* int32 = NATIVE_TYPE(Signed32, UntaggedInt32); |
| 35 Type* uint8 = NATIVE_TYPE(UnsignedSmall, UntaggedInt8); | 45 Type* uint8 = NATIVE_TYPE(UnsignedSmall, UntaggedInt8); |
| 36 Type* uint16 = NATIVE_TYPE(UnsignedSmall, UntaggedInt16); | 46 Type* uint16 = NATIVE_TYPE(UnsignedSmall, UntaggedInt16); |
| 37 Type* uint32 = NATIVE_TYPE(Unsigned32, UntaggedInt32); | 47 Type* uint32 = NATIVE_TYPE(Unsigned32, UntaggedInt32); |
| (...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 827 return typer_->number_fun1_; // TODO(rossberg): can't express overloading | 837 return typer_->number_fun1_; // TODO(rossberg): can't express overloading |
| 828 } else if (*value == native->math_acos_fun()) { | 838 } else if (*value == native->math_acos_fun()) { |
| 829 return typer_->number_fun1_; | 839 return typer_->number_fun1_; |
| 830 } else if (*value == native->math_asin_fun()) { | 840 } else if (*value == native->math_asin_fun()) { |
| 831 return typer_->number_fun1_; | 841 return typer_->number_fun1_; |
| 832 } else if (*value == native->math_atan_fun()) { | 842 } else if (*value == native->math_atan_fun()) { |
| 833 return typer_->number_fun1_; | 843 return typer_->number_fun1_; |
| 834 } else if (*value == native->math_atan2_fun()) { | 844 } else if (*value == native->math_atan2_fun()) { |
| 835 return typer_->number_fun2_; | 845 return typer_->number_fun2_; |
| 836 } else if (*value == native->math_ceil_fun()) { | 846 } else if (*value == native->math_ceil_fun()) { |
| 837 return typer_->number_fun1_; | 847 return typer_->weakint_fun1_; |
| 838 } else if (*value == native->math_cos_fun()) { | 848 } else if (*value == native->math_cos_fun()) { |
| 839 return typer_->number_fun1_; | 849 return typer_->number_fun1_; |
| 840 } else if (*value == native->math_exp_fun()) { | 850 } else if (*value == native->math_exp_fun()) { |
| 841 return typer_->number_fun1_; | 851 return typer_->number_fun1_; |
| 842 } else if (*value == native->math_floor_fun()) { | 852 } else if (*value == native->math_floor_fun()) { |
| 843 return typer_->number_fun1_; | 853 return typer_->weakint_fun1_; |
| 844 } else if (*value == native->math_imul_fun()) { | 854 } else if (*value == native->math_imul_fun()) { |
| 845 return typer_->imul_fun_; | 855 return typer_->imul_fun_; |
| 846 } else if (*value == native->math_log_fun()) { | 856 } else if (*value == native->math_log_fun()) { |
| 847 return typer_->number_fun1_; | 857 return typer_->number_fun1_; |
| 848 } else if (*value == native->math_pow_fun()) { | 858 } else if (*value == native->math_pow_fun()) { |
| 849 return typer_->number_fun2_; | 859 return typer_->number_fun2_; |
| 850 } else if (*value == native->math_random_fun()) { | 860 } else if (*value == native->math_random_fun()) { |
| 851 return typer_->number_fun0_; | 861 return typer_->random_fun_; |
| 852 } else if (*value == native->math_round_fun()) { | 862 } else if (*value == native->math_round_fun()) { |
| 853 return typer_->number_fun1_; | 863 return typer_->weakint_fun1_; |
| 854 } else if (*value == native->math_sin_fun()) { | 864 } else if (*value == native->math_sin_fun()) { |
| 855 return typer_->number_fun1_; | 865 return typer_->number_fun1_; |
| 856 } else if (*value == native->math_sqrt_fun()) { | 866 } else if (*value == native->math_sqrt_fun()) { |
| 857 return typer_->number_fun1_; | 867 return typer_->number_fun1_; |
| 858 } else if (*value == native->math_tan_fun()) { | 868 } else if (*value == native->math_tan_fun()) { |
| 859 return typer_->number_fun1_; | 869 return typer_->number_fun1_; |
| 860 } else if (*value == native->array_buffer_fun()) { | 870 } else if (*value == native->array_buffer_fun()) { |
| 861 return typer_->array_buffer_fun_; | 871 return typer_->array_buffer_fun_; |
| 862 } else if (*value == native->int8_array_fun()) { | 872 } else if (*value == native->int8_array_fun()) { |
| 863 return typer_->int8_array_fun_; | 873 return typer_->int8_array_fun_; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 895 } | 905 } |
| 896 | 906 |
| 897 | 907 |
| 898 void Typer::DecorateGraph(Graph* graph) { | 908 void Typer::DecorateGraph(Graph* graph) { |
| 899 graph->AddDecorator(new (zone()) TyperDecorator(this)); | 909 graph->AddDecorator(new (zone()) TyperDecorator(this)); |
| 900 } | 910 } |
| 901 | 911 |
| 902 } | 912 } |
| 903 } | 913 } |
| 904 } // namespace v8::internal::compiler | 914 } // namespace v8::internal::compiler |
| OLD | NEW |