Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index 04d7cb03180a088375f89b01e159f18ef8712cdc..26c2d056b455961fd5e71af71184667638753ad8 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -2793,7 +2793,7 @@ TranslatedValue TranslatedValue::NewDuplicateObject(TranslatedState* container, |
// static |
TranslatedValue TranslatedValue::NewFloat(TranslatedState* container, |
- float value) { |
+ Float32 value) { |
TranslatedValue slot(container, kFloat); |
slot.float_value_ = value; |
return slot; |
@@ -2801,7 +2801,7 @@ TranslatedValue TranslatedValue::NewFloat(TranslatedState* container, |
// static |
TranslatedValue TranslatedValue::NewDouble(TranslatedState* container, |
- double value) { |
+ Float64 value) { |
TranslatedValue slot(container, kDouble); |
slot.double_value_ = value; |
return slot; |
@@ -2870,12 +2870,12 @@ uint32_t TranslatedValue::uint32_value() const { |
return uint32_value_; |
} |
-float TranslatedValue::float_value() const { |
+Float32 TranslatedValue::float_value() const { |
DCHECK_EQ(kFloat, kind()); |
return float_value_; |
} |
-double TranslatedValue::double_value() const { |
+Float64 TranslatedValue::double_value() const { |
DCHECK_EQ(kDouble, kind()); |
return double_value_; |
} |
@@ -2985,22 +2985,29 @@ void TranslatedValue::MaterializeSimple() { |
} |
switch (kind()) { |
- case kInt32: { |
+ case kInt32: |
value_ = Handle<Object>(isolate()->factory()->NewNumber(int32_value())); |
return; |
- } |
case kUInt32: |
value_ = Handle<Object>(isolate()->factory()->NewNumber(uint32_value())); |
return; |
- case kFloat: |
- value_ = Handle<Object>(isolate()->factory()->NewNumber(float_value())); |
+ case kFloat: { |
+ double scalar_value = float_value().get_scalar(); |
+ value_ = Handle<Object>(isolate()->factory()->NewNumber(scalar_value)); |
return; |
+ } |
- case kDouble: |
- value_ = Handle<Object>(isolate()->factory()->NewNumber(double_value())); |
+ case kDouble: { |
+ if (double_value().is_hole_nan()) { |
+ value_ = isolate()->factory()->hole_nan_value(); |
+ return; |
+ } |
+ double scalar_value = double_value().get_scalar(); |
+ value_ = Handle<Object>(isolate()->factory()->NewNumber(scalar_value)); |
return; |
+ } |
case kCapturedObject: |
case kDuplicatedObject: |
@@ -3048,6 +3055,13 @@ uint32_t TranslatedState::GetUInt32Slot(Address fp, int slot_offset) { |
#endif |
} |
+Float32 TranslatedState::GetFloatSlot(Address fp, int slot_offset) { |
+ return Float32::FromBits(GetUInt32Slot(fp, slot_offset)); |
+} |
+ |
+Float64 TranslatedState::GetDoubleSlot(Address fp, int slot_offset) { |
+ return Float64::FromBits(Memory::uint64_at(fp + slot_offset)); |
+} |
void TranslatedValue::Handlify() { |
if (kind() == kTagged) { |
@@ -3403,9 +3417,9 @@ TranslatedValue TranslatedState::CreateNextTranslatedValue( |
case Translation::FLOAT_REGISTER: { |
int input_reg = iterator->Next(); |
if (registers == nullptr) return TranslatedValue::NewInvalid(this); |
- float value = registers->GetFloatRegister(input_reg); |
+ Float32 value = registers->GetFloatRegister(input_reg); |
if (trace_file != nullptr) { |
- PrintF(trace_file, "%e ; %s (float)", value, |
+ PrintF(trace_file, "%e ; %s (float)", value.get_scalar(), |
RegisterConfiguration::Crankshaft()->GetFloatRegisterName( |
input_reg)); |
} |
@@ -3415,9 +3429,9 @@ TranslatedValue TranslatedState::CreateNextTranslatedValue( |
case Translation::DOUBLE_REGISTER: { |
int input_reg = iterator->Next(); |
if (registers == nullptr) return TranslatedValue::NewInvalid(this); |
- double value = registers->GetDoubleRegister(input_reg); |
+ Float64 value = registers->GetDoubleRegister(input_reg); |
if (trace_file != nullptr) { |
- PrintF(trace_file, "%e ; %s (double)", value, |
+ PrintF(trace_file, "%e ; %s (double)", value.get_scalar(), |
RegisterConfiguration::Crankshaft()->GetDoubleRegisterName( |
input_reg)); |
} |
@@ -3473,9 +3487,9 @@ TranslatedValue TranslatedState::CreateNextTranslatedValue( |
case Translation::FLOAT_STACK_SLOT: { |
int slot_offset = |
OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next()); |
- float value = ReadFloatValue(fp + slot_offset); |
+ Float32 value = GetFloatSlot(fp, slot_offset); |
if (trace_file != nullptr) { |
- PrintF(trace_file, "%e ; (float) [fp %c %d] ", value, |
+ PrintF(trace_file, "%e ; (float) [fp %c %d] ", value.get_scalar(), |
slot_offset < 0 ? '-' : '+', std::abs(slot_offset)); |
} |
return TranslatedValue::NewFloat(this, value); |
@@ -3484,9 +3498,9 @@ TranslatedValue TranslatedState::CreateNextTranslatedValue( |
case Translation::DOUBLE_STACK_SLOT: { |
int slot_offset = |
OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next()); |
- double value = ReadDoubleValue(fp + slot_offset); |
+ Float64 value = GetDoubleSlot(fp, slot_offset); |
if (trace_file != nullptr) { |
- PrintF(trace_file, "%e ; (double) [fp %c %d] ", value, |
+ PrintF(trace_file, "%e ; (double) [fp %c %d] ", value.get_scalar(), |
slot_offset < 0 ? '-' : '+', std::abs(slot_offset)); |
} |
return TranslatedValue::NewDouble(this, value); |
@@ -3857,7 +3871,11 @@ Handle<Object> TranslatedState::MaterializeCapturedObjectAt( |
for (int i = 0; i < length; ++i) { |
Handle<Object> value = materializer.FieldAt(value_index); |
CHECK(value->IsNumber()); |
- double_array->set(i, value->Number()); |
+ if (value.is_identical_to(isolate_->factory()->hole_nan_value())) { |
+ double_array->set_the_hole(isolate_, i); |
+ } else { |
+ double_array->set(i, value->Number()); |
+ } |
} |
} |
return object; |