| Index: src/deoptimizer.cc
|
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
|
| index 76922085f0668d2c4fe1e06b89d875c4b99cc5ea..2a03c74c416e6aaedfdfee5bce9ff92d21d892b5 100644
|
| --- a/src/deoptimizer.cc
|
| +++ b/src/deoptimizer.cc
|
| @@ -2269,6 +2269,9 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| case Translation::DOUBLE_REGISTER: {
|
| int input_reg = iterator->Next();
|
| double value = input_->GetDoubleRegister(input_reg);
|
| + int int_value = FastD2IChecked(value);
|
| + bool is_smi =
|
| + !IsMinusZero(value) && value == int_value && Smi::IsValid(int_value);
|
| if (trace_scope_ != NULL) {
|
| PrintF(trace_scope_->file(),
|
| " object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| @@ -2278,7 +2281,13 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| "%e ; %s\n", value,
|
| DoubleRegister::AllocationIndexToString(input_reg));
|
| }
|
| - AddObjectDoubleValue(value);
|
| + if (is_smi) {
|
| + intptr_t tagged_value =
|
| + reinterpret_cast<intptr_t>(Smi::FromInt(int_value));
|
| + AddObjectTaggedValue(tagged_value);
|
| + } else {
|
| + AddObjectDoubleValue(value);
|
| + }
|
| return;
|
| }
|
|
|
| @@ -2380,6 +2389,9 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| int input_slot_index = iterator->Next();
|
| unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index);
|
| double value = input_->GetDoubleFrameSlot(input_offset);
|
| + int int_value = FastD2IChecked(value);
|
| + bool is_smi =
|
| + !IsMinusZero(value) && value == int_value && Smi::IsValid(int_value);
|
| if (trace_scope_ != NULL) {
|
| PrintF(trace_scope_->file(),
|
| " object @0x%08" V8PRIxPTR ": [field #%d] <- ",
|
| @@ -2388,7 +2400,13 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
| PrintF(trace_scope_->file(),
|
| "%e ; [sp + %d]\n", value, input_offset);
|
| }
|
| - AddObjectDoubleValue(value);
|
| + if (is_smi) {
|
| + intptr_t tagged_value =
|
| + reinterpret_cast<intptr_t>(Smi::FromInt(int_value));
|
| + AddObjectTaggedValue(tagged_value);
|
| + } else {
|
| + AddObjectDoubleValue(value);
|
| + }
|
| return;
|
| }
|
|
|
| @@ -2586,18 +2604,25 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| case Translation::DOUBLE_REGISTER: {
|
| int input_reg = iterator->Next();
|
| double value = input_->GetDoubleRegister(input_reg);
|
| + int int_value = FastD2IChecked(value);
|
| + bool is_smi =
|
| + !IsMinusZero(value) && value == int_value && Smi::IsValid(int_value);
|
| if (trace_scope_ != NULL) {
|
| PrintF(trace_scope_->file(),
|
| " 0x%08" V8PRIxPTR ": [top + %d] <- %e ; %s\n",
|
| - output_[frame_index]->GetTop() + output_offset,
|
| - output_offset,
|
| - value,
|
| - DoubleRegister::AllocationIndexToString(input_reg));
|
| + output_[frame_index]->GetTop() + output_offset, output_offset,
|
| + value, DoubleRegister::AllocationIndexToString(input_reg));
|
| + }
|
| + if (is_smi) {
|
| + intptr_t tagged_value =
|
| + reinterpret_cast<intptr_t>(Smi::FromInt(int_value));
|
| + output_[frame_index]->SetFrameSlot(output_offset, tagged_value);
|
| + } else {
|
| + // We save the untagged value on the side and store a GC-safe
|
| + // temporary placeholder in the frame.
|
| + AddDoubleValue(output_[frame_index]->GetTop() + output_offset, value);
|
| + output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| }
|
| - // We save the untagged value on the side and store a GC-safe
|
| - // temporary placeholder in the frame.
|
| - AddDoubleValue(output_[frame_index]->GetTop() + output_offset, value);
|
| - output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| return;
|
| }
|
|
|
| @@ -2713,6 +2738,9 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| int input_slot_index = iterator->Next();
|
| unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index);
|
| double value = input_->GetDoubleFrameSlot(input_offset);
|
| + int int_value = FastD2IChecked(value);
|
| + bool is_smi =
|
| + !IsMinusZero(value) && value == int_value && Smi::IsValid(int_value);
|
| if (trace_scope_ != NULL) {
|
| PrintF(trace_scope_->file(),
|
| " 0x%08" V8PRIxPTR ": [top + %d] <- %e ; [sp + %d]\n",
|
| @@ -2721,10 +2749,16 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| value,
|
| input_offset);
|
| }
|
| - // We save the untagged value on the side and store a GC-safe
|
| - // temporary placeholder in the frame.
|
| - AddDoubleValue(output_[frame_index]->GetTop() + output_offset, value);
|
| - output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| + if (is_smi) {
|
| + intptr_t tagged_value =
|
| + reinterpret_cast<intptr_t>(Smi::FromInt(int_value));
|
| + output_[frame_index]->SetFrameSlot(output_offset, tagged_value);
|
| + } else {
|
| + // We save the untagged value on the side and store a GC-safe
|
| + // temporary placeholder in the frame.
|
| + AddDoubleValue(output_[frame_index]->GetTop() + output_offset, value);
|
| + output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| + }
|
| return;
|
| }
|
|
|
|
|