Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Side by Side Diff: src/crankshaft/hydrogen-instructions.cc

Issue 2115413002: [crankshaft] Use canonical nan_value or minus_zero_value objects instead of constant heap numbers w… (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-crbug-625547.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-crbug-625547.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698