| 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 |