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/crankshaft/hydrogen-instructions.h" | 5 #include "src/crankshaft/hydrogen-instructions.h" |
6 | 6 |
7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
8 #include "src/base/ieee754.h" | 8 #include "src/base/ieee754.h" |
9 #include "src/base/safe_math.h" | 9 #include "src/base/safe_math.h" |
10 #include "src/crankshaft/hydrogen-infer-representation.h" | 10 #include "src/crankshaft/hydrogen-infer-representation.h" |
(...skipping 2154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2165 object_map_(Handle<Map>::null()), | 2165 object_map_(Handle<Map>::null()), |
2166 bit_field_( | 2166 bit_field_( |
2167 HasStableMapValueField::encode(false) | | 2167 HasStableMapValueField::encode(false) | |
2168 HasSmiValueField::encode(false) | HasInt32ValueField::encode(false) | | 2168 HasSmiValueField::encode(false) | HasInt32ValueField::encode(false) | |
2169 HasDoubleValueField::encode(false) | | 2169 HasDoubleValueField::encode(false) | |
2170 HasExternalReferenceValueField::encode(false) | | 2170 HasExternalReferenceValueField::encode(false) | |
2171 IsNotInNewSpaceField::encode(true) | | 2171 IsNotInNewSpaceField::encode(true) | |
2172 BooleanValueField::encode(object->BooleanValue()) | | 2172 BooleanValueField::encode(object->BooleanValue()) | |
2173 IsUndetectableField::encode(false) | IsCallableField::encode(false) | | 2173 IsUndetectableField::encode(false) | IsCallableField::encode(false) | |
2174 InstanceTypeField::encode(kUnknownInstanceType)) { | 2174 InstanceTypeField::encode(kUnknownInstanceType)) { |
| 2175 if (object->IsNumber()) { |
| 2176 double n = object->Number(); |
| 2177 bool has_int32_value = IsInteger32(n); |
| 2178 bit_field_ = HasInt32ValueField::update(bit_field_, has_int32_value); |
| 2179 int32_value_ = DoubleToInt32(n); |
| 2180 bit_field_ = HasSmiValueField::update( |
| 2181 bit_field_, has_int32_value && Smi::IsValid(int32_value_)); |
| 2182 if (std::isnan(n)) { |
| 2183 double_value_ = std::numeric_limits<double>::quiet_NaN(); |
| 2184 // Canonicalize object with NaN value. |
| 2185 DCHECK(object->IsHeapObject()); // NaN can't be a Smi. |
| 2186 Isolate* isolate = HeapObject::cast(*object)->GetIsolate(); |
| 2187 object = isolate->factory()->nan_value(); |
| 2188 object_ = Unique<Object>::CreateUninitialized(object); |
| 2189 } else { |
| 2190 double_value_ = n; |
| 2191 // Canonicalize object with -0.0 value. |
| 2192 if (bit_cast<int64_t>(n) == bit_cast<int64_t>(-0.0)) { |
| 2193 DCHECK(object->IsHeapObject()); // -0.0 can't be a Smi. |
| 2194 Isolate* isolate = HeapObject::cast(*object)->GetIsolate(); |
| 2195 object = isolate->factory()->minus_zero_value(); |
| 2196 object_ = Unique<Object>::CreateUninitialized(object); |
| 2197 } |
| 2198 } |
| 2199 bit_field_ = HasDoubleValueField::update(bit_field_, true); |
| 2200 } |
2175 if (object->IsHeapObject()) { | 2201 if (object->IsHeapObject()) { |
2176 Handle<HeapObject> heap_object = Handle<HeapObject>::cast(object); | 2202 Handle<HeapObject> heap_object = Handle<HeapObject>::cast(object); |
2177 Isolate* isolate = heap_object->GetIsolate(); | 2203 Isolate* isolate = heap_object->GetIsolate(); |
2178 Handle<Map> map(heap_object->map(), isolate); | 2204 Handle<Map> map(heap_object->map(), isolate); |
2179 bit_field_ = IsNotInNewSpaceField::update( | 2205 bit_field_ = IsNotInNewSpaceField::update( |
2180 bit_field_, !isolate->heap()->InNewSpace(*object)); | 2206 bit_field_, !isolate->heap()->InNewSpace(*object)); |
2181 bit_field_ = InstanceTypeField::update(bit_field_, map->instance_type()); | 2207 bit_field_ = InstanceTypeField::update(bit_field_, map->instance_type()); |
2182 bit_field_ = | 2208 bit_field_ = |
2183 IsUndetectableField::update(bit_field_, map->is_undetectable()); | 2209 IsUndetectableField::update(bit_field_, map->is_undetectable()); |
2184 bit_field_ = IsCallableField::update(bit_field_, map->is_callable()); | 2210 bit_field_ = IsCallableField::update(bit_field_, map->is_callable()); |
2185 if (map->is_stable()) object_map_ = Unique<Map>::CreateImmovable(map); | 2211 if (map->is_stable()) object_map_ = Unique<Map>::CreateImmovable(map); |
2186 bit_field_ = HasStableMapValueField::update( | 2212 bit_field_ = HasStableMapValueField::update( |
2187 bit_field_, | 2213 bit_field_, |
2188 HasMapValue() && Handle<Map>::cast(heap_object)->is_stable()); | 2214 HasMapValue() && Handle<Map>::cast(heap_object)->is_stable()); |
2189 } | 2215 } |
2190 if (object->IsNumber()) { | |
2191 double n = object->Number(); | |
2192 bool has_int32_value = IsInteger32(n); | |
2193 bit_field_ = HasInt32ValueField::update(bit_field_, has_int32_value); | |
2194 int32_value_ = DoubleToInt32(n); | |
2195 bit_field_ = HasSmiValueField::update( | |
2196 bit_field_, has_int32_value && Smi::IsValid(int32_value_)); | |
2197 if (std::isnan(n)) { | |
2198 double_value_ = std::numeric_limits<double>::quiet_NaN(); | |
2199 } else { | |
2200 double_value_ = n; | |
2201 } | |
2202 bit_field_ = HasDoubleValueField::update(bit_field_, true); | |
2203 } | |
2204 | 2216 |
2205 Initialize(r); | 2217 Initialize(r); |
2206 } | 2218 } |
2207 | 2219 |
2208 | 2220 |
2209 HConstant::HConstant(Unique<Object> object, Unique<Map> object_map, | 2221 HConstant::HConstant(Unique<Object> object, Unique<Map> object_map, |
2210 bool has_stable_map_value, Representation r, HType type, | 2222 bool has_stable_map_value, Representation r, HType type, |
2211 bool is_not_in_new_space, bool boolean_value, | 2223 bool is_not_in_new_space, bool boolean_value, |
2212 bool is_undetectable, InstanceType instance_type) | 2224 bool is_undetectable, InstanceType instance_type) |
2213 : HTemplateInstruction<0>(type), | 2225 : HTemplateInstruction<0>(type), |
(...skipping 1831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4045 case HObjectAccess::kExternalMemory: | 4057 case HObjectAccess::kExternalMemory: |
4046 os << "[external-memory]"; | 4058 os << "[external-memory]"; |
4047 break; | 4059 break; |
4048 } | 4060 } |
4049 | 4061 |
4050 return os << "@" << access.offset(); | 4062 return os << "@" << access.offset(); |
4051 } | 4063 } |
4052 | 4064 |
4053 } // namespace internal | 4065 } // namespace internal |
4054 } // namespace v8 | 4066 } // namespace v8 |
OLD | NEW |