| 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/bootstrapper.h" | 5 #include "src/bootstrapper.h" |
| 6 #include "src/compiler/graph-inl.h" | 6 #include "src/compiler/graph-inl.h" |
| 7 #include "src/compiler/graph-reducer.h" | 7 #include "src/compiler/graph-reducer.h" |
| 8 #include "src/compiler/js-operator.h" | 8 #include "src/compiler/js-operator.h" |
| 9 #include "src/compiler/node.h" | 9 #include "src/compiler/node.h" |
| 10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 Type* unsigned32 = Type::Unsigned32(); | 158 Type* unsigned32 = Type::Unsigned32(); |
| 159 Type* nan_or_minuszero = Type::Union(Type::NaN(), Type::MinusZero(), zone); | 159 Type* nan_or_minuszero = Type::Union(Type::NaN(), Type::MinusZero(), zone); |
| 160 Type* truncating_to_zero = | 160 Type* truncating_to_zero = |
| 161 Type::Union(Type::Union(Type::Constant(infinity, zone), | 161 Type::Union(Type::Union(Type::Constant(infinity, zone), |
| 162 Type::Constant(minusinfinity, zone), zone), | 162 Type::Constant(minusinfinity, zone), zone), |
| 163 nan_or_minuszero, zone); | 163 nan_or_minuszero, zone); |
| 164 | 164 |
| 165 boolean_or_number = Type::Union(Type::Boolean(), Type::Number(), zone); | 165 boolean_or_number = Type::Union(Type::Boolean(), Type::Number(), zone); |
| 166 undefined_or_null = Type::Union(Type::Undefined(), Type::Null(), zone); | 166 undefined_or_null = Type::Union(Type::Undefined(), Type::Null(), zone); |
| 167 undefined_or_number = Type::Union(Type::Undefined(), Type::Number(), zone); | 167 undefined_or_number = Type::Union(Type::Undefined(), Type::Number(), zone); |
| 168 negative_signed32 = Type::Union( | |
| 169 Type::SignedSmall(), Type::OtherSigned32(), zone); | |
| 170 non_negative_signed32 = Type::Union( | |
| 171 Type::UnsignedSmall(), Type::OtherUnsigned31(), zone); | |
| 172 singleton_false = Type::Constant(f->false_value(), zone); | 168 singleton_false = Type::Constant(f->false_value(), zone); |
| 173 singleton_true = Type::Constant(f->true_value(), zone); | 169 singleton_true = Type::Constant(f->true_value(), zone); |
| 174 singleton_zero = Type::Range(zero, zero, zone); | 170 singleton_zero = Type::Range(zero, zero, zone); |
| 175 singleton_one = Type::Range(one, one, zone); | 171 singleton_one = Type::Range(one, one, zone); |
| 176 zero_or_one = Type::Union(singleton_zero, singleton_one, zone); | 172 zero_or_one = Type::Union(singleton_zero, singleton_one, zone); |
| 177 zeroish = Type::Union(singleton_zero, nan_or_minuszero, zone); | 173 zeroish = Type::Union(singleton_zero, nan_or_minuszero, zone); |
| 178 signed32ish = Type::Union(signed32, truncating_to_zero, zone); | 174 signed32ish = Type::Union(signed32, truncating_to_zero, zone); |
| 179 unsigned32ish = Type::Union(unsigned32, truncating_to_zero, zone); | 175 unsigned32ish = Type::Union(unsigned32, truncating_to_zero, zone); |
| 180 falsish = Type::Union(Type::Undetectable(), | 176 falsish = Type::Union(Type::Undetectable(), |
| 181 Type::Union(zeroish, undefined_or_null, zone), zone); | 177 Type::Union(zeroish, undefined_or_null, zone), zone); |
| 182 integer = Type::Range(minusinfinity, infinity, zone); | 178 integer = Type::Range(minusinfinity, infinity, zone); |
| 183 weakint = Type::Union(integer, nan_or_minuszero, zone); | 179 weakint = Type::Union(integer, nan_or_minuszero, zone); |
| 184 | 180 |
| 185 signed8_ = Type::Range(f->NewNumber(kMinInt8), f->NewNumber(kMaxInt8), zone); | 181 signed8_ = Type::Range(f->NewNumber(kMinInt8), f->NewNumber(kMaxInt8), zone); |
| 186 unsigned8_ = Type::Range(zero, f->NewNumber(kMaxUInt8), zone); | 182 unsigned8_ = Type::Range(zero, f->NewNumber(kMaxUInt8), zone); |
| 187 signed16_ = | 183 signed16_ = |
| 188 Type::Range(f->NewNumber(kMinInt16), f->NewNumber(kMaxInt16), zone); | 184 Type::Range(f->NewNumber(kMinInt16), f->NewNumber(kMaxInt16), zone); |
| 189 unsigned16_ = Type::Range(zero, f->NewNumber(kMaxUInt16), zone); | 185 unsigned16_ = Type::Range(zero, f->NewNumber(kMaxUInt16), zone); |
| 190 | 186 |
| 191 number_fun0_ = Type::Function(number, zone); | 187 number_fun0_ = Type::Function(number, zone); |
| 192 number_fun1_ = Type::Function(number, number, zone); | 188 number_fun1_ = Type::Function(number, number, zone); |
| 193 number_fun2_ = Type::Function(number, number, number, zone); | 189 number_fun2_ = Type::Function(number, number, number, zone); |
| 194 | 190 |
| 195 weakint_fun1_ = Type::Function(weakint, number, zone); | 191 weakint_fun1_ = Type::Function(weakint, number, zone); |
| 196 random_fun_ = Type::Function(Type::Union( | 192 random_fun_ = Type::Function(Type::OrderedNumber(), zone); |
| 197 Type::UnsignedSmall(), Type::OtherNumber(), zone), zone); | |
| 198 | 193 |
| 199 const int limits_count = 20; | 194 const int limits_count = 20; |
| 200 | 195 |
| 201 weaken_min_limits_.reserve(limits_count + 1); | 196 weaken_min_limits_.reserve(limits_count + 1); |
| 202 weaken_max_limits_.reserve(limits_count + 1); | 197 weaken_max_limits_.reserve(limits_count + 1); |
| 203 | 198 |
| 204 double limit = 1 << 30; | 199 double limit = 1 << 30; |
| 205 weaken_min_limits_.push_back(f->NewNumber(0)); | 200 weaken_min_limits_.push_back(f->NewNumber(0)); |
| 206 weaken_max_limits_.push_back(f->NewNumber(0)); | 201 weaken_max_limits_.push_back(f->NewNumber(0)); |
| 207 for (int i = 0; i < limits_count; i++) { | 202 for (int i = 0; i < limits_count; i++) { |
| (...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 863 | 858 |
| 864 Type* Typer::Visitor::JSBitwiseXorTyper(Type* lhs, Type* rhs, Typer* t) { | 859 Type* Typer::Visitor::JSBitwiseXorTyper(Type* lhs, Type* rhs, Typer* t) { |
| 865 lhs = NumberToInt32(ToNumber(lhs, t), t); | 860 lhs = NumberToInt32(ToNumber(lhs, t), t); |
| 866 rhs = NumberToInt32(ToNumber(rhs, t), t); | 861 rhs = NumberToInt32(ToNumber(rhs, t), t); |
| 867 double lmin = lhs->Min(); | 862 double lmin = lhs->Min(); |
| 868 double rmin = rhs->Min(); | 863 double rmin = rhs->Min(); |
| 869 double lmax = lhs->Max(); | 864 double lmax = lhs->Max(); |
| 870 double rmax = rhs->Max(); | 865 double rmax = rhs->Max(); |
| 871 if ((lmin >= 0 && rmin >= 0) || (lmax < 0 && rmax < 0)) { | 866 if ((lmin >= 0 && rmin >= 0) || (lmax < 0 && rmax < 0)) { |
| 872 // Xor-ing negative or non-negative values results in a non-negative value. | 867 // Xor-ing negative or non-negative values results in a non-negative value. |
| 873 return t->non_negative_signed32; | 868 return Type::NonNegativeSigned32(); |
| 874 } | 869 } |
| 875 if ((lmax < 0 && rmin >= 0) || (lmin >= 0 && rmax < 0)) { | 870 if ((lmax < 0 && rmin >= 0) || (lmin >= 0 && rmax < 0)) { |
| 876 // Xor-ing a negative and a non-negative value results in a negative value. | 871 // Xor-ing a negative and a non-negative value results in a negative value. |
| 877 return t->negative_signed32; | 872 // TODO(jarin) Use a range here. |
| 873 return Type::NegativeSigned32(); |
| 878 } | 874 } |
| 879 return Type::Signed32(); | 875 return Type::Signed32(); |
| 880 } | 876 } |
| 881 | 877 |
| 882 | 878 |
| 883 Type* Typer::Visitor::JSShiftLeftTyper(Type* lhs, Type* rhs, Typer* t) { | 879 Type* Typer::Visitor::JSShiftLeftTyper(Type* lhs, Type* rhs, Typer* t) { |
| 884 return Type::Signed32(); | 880 return Type::Signed32(); |
| 885 } | 881 } |
| 886 | 882 |
| 887 | 883 |
| (...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2088 return typer_->cache_->Get(kFloat64ArrayFunc); | 2084 return typer_->cache_->Get(kFloat64ArrayFunc); |
| 2089 } | 2085 } |
| 2090 } | 2086 } |
| 2091 } | 2087 } |
| 2092 return Type::Constant(value, zone()); | 2088 return Type::Constant(value, zone()); |
| 2093 } | 2089 } |
| 2094 | 2090 |
| 2095 } // namespace compiler | 2091 } // namespace compiler |
| 2096 } // namespace internal | 2092 } // namespace internal |
| 2097 } // namespace v8 | 2093 } // namespace v8 |
| OLD | NEW |