| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/double.h" | 8 #include "src/double.h" |
| 9 #include "src/factory.h" | 9 #include "src/factory.h" |
| 10 #include "src/hydrogen-infer-representation.h" | 10 #include "src/hydrogen-infer-representation.h" |
| (...skipping 2940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2951 } | 2951 } |
| 2952 | 2952 |
| 2953 | 2953 |
| 2954 Maybe<HConstant*> HConstant::CopyToTruncatedNumber(Zone* zone) { | 2954 Maybe<HConstant*> HConstant::CopyToTruncatedNumber(Zone* zone) { |
| 2955 HConstant* res = NULL; | 2955 HConstant* res = NULL; |
| 2956 Handle<Object> handle = this->handle(zone->isolate()); | 2956 Handle<Object> handle = this->handle(zone->isolate()); |
| 2957 if (handle->IsBoolean()) { | 2957 if (handle->IsBoolean()) { |
| 2958 res = handle->BooleanValue() ? | 2958 res = handle->BooleanValue() ? |
| 2959 new(zone) HConstant(1) : new(zone) HConstant(0); | 2959 new(zone) HConstant(1) : new(zone) HConstant(0); |
| 2960 } else if (handle->IsUndefined()) { | 2960 } else if (handle->IsUndefined()) { |
| 2961 res = new(zone) HConstant(base::OS::nan_value()); | 2961 res = new (zone) HConstant(std::numeric_limits<double>::quiet_NaN()); |
| 2962 } else if (handle->IsNull()) { | 2962 } else if (handle->IsNull()) { |
| 2963 res = new(zone) HConstant(0); | 2963 res = new(zone) HConstant(0); |
| 2964 } | 2964 } |
| 2965 return Maybe<HConstant*>(res != NULL, res); | 2965 return Maybe<HConstant*>(res != NULL, res); |
| 2966 } | 2966 } |
| 2967 | 2967 |
| 2968 | 2968 |
| 2969 std::ostream& HConstant::PrintDataTo(std::ostream& os) const { // NOLINT | 2969 std::ostream& HConstant::PrintDataTo(std::ostream& os) const { // NOLINT |
| 2970 if (HasInteger32Value()) { | 2970 if (HasInteger32Value()) { |
| 2971 os << int32_value_ << " "; | 2971 os << int32_value_ << " "; |
| (...skipping 1194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4166 | 4166 |
| 4167 HInstruction* HUnaryMathOperation::New( | 4167 HInstruction* HUnaryMathOperation::New( |
| 4168 Zone* zone, HValue* context, HValue* value, BuiltinFunctionId op) { | 4168 Zone* zone, HValue* context, HValue* value, BuiltinFunctionId op) { |
| 4169 do { | 4169 do { |
| 4170 if (!FLAG_fold_constants) break; | 4170 if (!FLAG_fold_constants) break; |
| 4171 if (!value->IsConstant()) break; | 4171 if (!value->IsConstant()) break; |
| 4172 HConstant* constant = HConstant::cast(value); | 4172 HConstant* constant = HConstant::cast(value); |
| 4173 if (!constant->HasNumberValue()) break; | 4173 if (!constant->HasNumberValue()) break; |
| 4174 double d = constant->DoubleValue(); | 4174 double d = constant->DoubleValue(); |
| 4175 if (std::isnan(d)) { // NaN poisons everything. | 4175 if (std::isnan(d)) { // NaN poisons everything. |
| 4176 return H_CONSTANT_DOUBLE(base::OS::nan_value()); | 4176 return H_CONSTANT_DOUBLE(std::numeric_limits<double>::quiet_NaN()); |
| 4177 } | 4177 } |
| 4178 if (std::isinf(d)) { // +Infinity and -Infinity. | 4178 if (std::isinf(d)) { // +Infinity and -Infinity. |
| 4179 switch (op) { | 4179 switch (op) { |
| 4180 case kMathExp: | 4180 case kMathExp: |
| 4181 return H_CONSTANT_DOUBLE((d > 0.0) ? d : 0.0); | 4181 return H_CONSTANT_DOUBLE((d > 0.0) ? d : 0.0); |
| 4182 case kMathLog: | 4182 case kMathLog: |
| 4183 case kMathSqrt: | 4183 case kMathSqrt: |
| 4184 return H_CONSTANT_DOUBLE((d > 0.0) ? d : base::OS::nan_value()); | 4184 return H_CONSTANT_DOUBLE( |
| 4185 (d > 0.0) ? d : std::numeric_limits<double>::quiet_NaN()); |
| 4185 case kMathPowHalf: | 4186 case kMathPowHalf: |
| 4186 case kMathAbs: | 4187 case kMathAbs: |
| 4187 return H_CONSTANT_DOUBLE((d > 0.0) ? d : -d); | 4188 return H_CONSTANT_DOUBLE((d > 0.0) ? d : -d); |
| 4188 case kMathRound: | 4189 case kMathRound: |
| 4189 case kMathFround: | 4190 case kMathFround: |
| 4190 case kMathFloor: | 4191 case kMathFloor: |
| 4191 return H_CONSTANT_DOUBLE(d); | 4192 return H_CONSTANT_DOUBLE(d); |
| 4192 case kMathClz32: | 4193 case kMathClz32: |
| 4193 return H_CONSTANT_INT(32); | 4194 return H_CONSTANT_INT(32); |
| 4194 default: | 4195 default: |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4271 HInstruction* HPower::New(Zone* zone, | 4272 HInstruction* HPower::New(Zone* zone, |
| 4272 HValue* context, | 4273 HValue* context, |
| 4273 HValue* left, | 4274 HValue* left, |
| 4274 HValue* right) { | 4275 HValue* right) { |
| 4275 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { | 4276 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { |
| 4276 HConstant* c_left = HConstant::cast(left); | 4277 HConstant* c_left = HConstant::cast(left); |
| 4277 HConstant* c_right = HConstant::cast(right); | 4278 HConstant* c_right = HConstant::cast(right); |
| 4278 if (c_left->HasNumberValue() && c_right->HasNumberValue()) { | 4279 if (c_left->HasNumberValue() && c_right->HasNumberValue()) { |
| 4279 double result = power_helper(c_left->DoubleValue(), | 4280 double result = power_helper(c_left->DoubleValue(), |
| 4280 c_right->DoubleValue()); | 4281 c_right->DoubleValue()); |
| 4281 return H_CONSTANT_DOUBLE(std::isnan(result) ? base::OS::nan_value() | 4282 return H_CONSTANT_DOUBLE(std::isnan(result) |
| 4282 : result); | 4283 ? std::numeric_limits<double>::quiet_NaN() |
| 4284 : result); |
| 4283 } | 4285 } |
| 4284 } | 4286 } |
| 4285 return new(zone) HPower(left, right); | 4287 return new(zone) HPower(left, right); |
| 4286 } | 4288 } |
| 4287 | 4289 |
| 4288 | 4290 |
| 4289 HInstruction* HMathMinMax::New( | 4291 HInstruction* HMathMinMax::New( |
| 4290 Zone* zone, HValue* context, HValue* left, HValue* right, Operation op) { | 4292 Zone* zone, HValue* context, HValue* left, HValue* right, Operation op) { |
| 4291 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { | 4293 if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) { |
| 4292 HConstant* c_left = HConstant::cast(left); | 4294 HConstant* c_left = HConstant::cast(left); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 4305 } else { | 4307 } else { |
| 4306 if (d_left < d_right) return H_CONSTANT_DOUBLE(d_right); | 4308 if (d_left < d_right) return H_CONSTANT_DOUBLE(d_right); |
| 4307 if (d_left > d_right) return H_CONSTANT_DOUBLE(d_left); | 4309 if (d_left > d_right) return H_CONSTANT_DOUBLE(d_left); |
| 4308 if (d_left == d_right) { | 4310 if (d_left == d_right) { |
| 4309 // Handle +0 and -0. | 4311 // Handle +0 and -0. |
| 4310 return H_CONSTANT_DOUBLE((Double(d_left).Sign() == -1) ? d_right | 4312 return H_CONSTANT_DOUBLE((Double(d_left).Sign() == -1) ? d_right |
| 4311 : d_left); | 4313 : d_left); |
| 4312 } | 4314 } |
| 4313 } | 4315 } |
| 4314 // All comparisons failed, must be NaN. | 4316 // All comparisons failed, must be NaN. |
| 4315 return H_CONSTANT_DOUBLE(base::OS::nan_value()); | 4317 return H_CONSTANT_DOUBLE(std::numeric_limits<double>::quiet_NaN()); |
| 4316 } | 4318 } |
| 4317 } | 4319 } |
| 4318 return new(zone) HMathMinMax(context, left, right, op); | 4320 return new(zone) HMathMinMax(context, left, right, op); |
| 4319 } | 4321 } |
| 4320 | 4322 |
| 4321 | 4323 |
| 4322 HInstruction* HMod::New(Zone* zone, | 4324 HInstruction* HMod::New(Zone* zone, |
| 4323 HValue* context, | 4325 HValue* context, |
| 4324 HValue* left, | 4326 HValue* left, |
| 4325 HValue* right) { | 4327 HValue* right) { |
| (...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4821 break; | 4823 break; |
| 4822 case HObjectAccess::kExternalMemory: | 4824 case HObjectAccess::kExternalMemory: |
| 4823 os << "[external-memory]"; | 4825 os << "[external-memory]"; |
| 4824 break; | 4826 break; |
| 4825 } | 4827 } |
| 4826 | 4828 |
| 4827 return os << "@" << access.offset(); | 4829 return os << "@" << access.offset(); |
| 4828 } | 4830 } |
| 4829 | 4831 |
| 4830 } } // namespace v8::internal | 4832 } } // namespace v8::internal |
| OLD | NEW |