Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index eaedb2cd070c487fb9f2bc2c9220d4f16a5f814a..1f32f1c2bf37581a76609c0b0ddf90bdacb9a9e6 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -829,14 +829,17 @@ void Deoptimizer::DoComputeOutputFrames() { |
case Translation::REGISTER: |
case Translation::INT32_REGISTER: |
case Translation::UINT32_REGISTER: |
+ case Translation::BOOL_REGISTER: |
case Translation::DOUBLE_REGISTER: |
case Translation::STACK_SLOT: |
case Translation::INT32_STACK_SLOT: |
case Translation::UINT32_STACK_SLOT: |
+ case Translation::BOOL_STACK_SLOT: |
case Translation::DOUBLE_STACK_SLOT: |
case Translation::LITERAL: |
case Translation::ARGUMENTS_OBJECT: |
- default: |
+ case Translation::DUPLICATED_OBJECT: |
+ case Translation::CAPTURED_OBJECT: |
FATAL("Unsupported translation"); |
break; |
} |
@@ -2101,10 +2104,12 @@ void Deoptimizer::DoTranslateObjectAndSkip(TranslationIterator* iterator) { |
case Translation::REGISTER: |
case Translation::INT32_REGISTER: |
case Translation::UINT32_REGISTER: |
+ case Translation::BOOL_REGISTER: |
case Translation::DOUBLE_REGISTER: |
case Translation::STACK_SLOT: |
case Translation::INT32_STACK_SLOT: |
case Translation::UINT32_STACK_SLOT: |
+ case Translation::BOOL_STACK_SLOT: |
case Translation::DOUBLE_STACK_SLOT: |
case Translation::LITERAL: { |
// The value is not part of any materialized object, so we can ignore it. |
@@ -2237,6 +2242,28 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator, |
return; |
} |
+ case Translation::BOOL_REGISTER: { |
+ int input_reg = iterator->Next(); |
+ uintptr_t value = static_cast<uintptr_t>(input_->GetRegister(input_reg)); |
+ bool is_smi = (value <= static_cast<uintptr_t>(Smi::kMaxValue)); |
+ if (trace_scope_ != NULL) { |
+ PrintF(trace_scope_->file(), |
+ " object @0x%08" V8PRIxPTR ": [field #%d] <- ", |
+ reinterpret_cast<intptr_t>(object_slot), field_index); |
+ PrintF(trace_scope_->file(), "%" V8PRIuPTR " ; bool %s (%s)\n", value, |
+ converter.NameOfCPURegister(input_reg), TraceValueType(is_smi)); |
+ } |
+ if (value == 0) { |
+ AddObjectTaggedValue( |
+ reinterpret_cast<intptr_t>(isolate_->heap()->false_value())); |
+ } else { |
+ DCHECK_EQ(1, value); |
+ AddObjectTaggedValue( |
+ reinterpret_cast<intptr_t>(isolate_->heap()->true_value())); |
+ } |
+ return; |
+ } |
+ |
case Translation::DOUBLE_REGISTER: { |
int input_reg = iterator->Next(); |
double value = input_->GetDoubleRegister(input_reg); |
@@ -2323,6 +2350,30 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator, |
return; |
} |
+ case Translation::BOOL_STACK_SLOT: { |
+ int input_slot_index = iterator->Next(); |
+ unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index); |
+ uintptr_t value = |
+ static_cast<uintptr_t>(input_->GetFrameSlot(input_offset)); |
+ bool is_smi = (value <= static_cast<uintptr_t>(Smi::kMaxValue)); |
+ if (trace_scope_ != NULL) { |
+ PrintF(trace_scope_->file(), |
+ " object @0x%08" V8PRIxPTR ": [field #%d] <- ", |
+ reinterpret_cast<intptr_t>(object_slot), field_index); |
+ PrintF(trace_scope_->file(), "%" V8PRIuPTR " ; [sp + %d] (bool %s)\n", |
+ value, input_offset, TraceValueType(is_smi)); |
+ } |
+ if (value == 0) { |
+ AddObjectTaggedValue( |
+ reinterpret_cast<intptr_t>(isolate_->heap()->false_value())); |
+ } else { |
+ DCHECK_EQ(1, value); |
+ AddObjectTaggedValue( |
+ reinterpret_cast<intptr_t>(isolate_->heap()->true_value())); |
+ } |
+ return; |
+ } |
+ |
case Translation::DOUBLE_STACK_SLOT: { |
int input_slot_index = iterator->Next(); |
unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index); |
@@ -2505,6 +2556,31 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
return; |
} |
+ case Translation::BOOL_REGISTER: { |
+ int input_reg = iterator->Next(); |
+ uintptr_t value = static_cast<uintptr_t>(input_->GetRegister(input_reg)); |
+ bool is_smi = value <= static_cast<uintptr_t>(Smi::kMaxValue); |
+ if (trace_scope_ != NULL) { |
+ PrintF(trace_scope_->file(), |
+ " 0x%08" V8PRIxPTR ": [top + %d] <- %" V8PRIuPTR |
+ " ; bool %s (%s)\n", |
+ output_[frame_index]->GetTop() + output_offset, output_offset, |
+ value, converter.NameOfCPURegister(input_reg), |
+ TraceValueType(is_smi)); |
+ } |
+ if (value == 0) { |
+ output_[frame_index]->SetFrameSlot( |
+ output_offset, |
+ reinterpret_cast<intptr_t>(isolate_->heap()->false_value())); |
+ } else { |
+ DCHECK_EQ(1, value); |
+ output_[frame_index]->SetFrameSlot( |
+ output_offset, |
+ reinterpret_cast<intptr_t>(isolate_->heap()->true_value())); |
+ } |
+ return; |
+ } |
+ |
case Translation::DOUBLE_REGISTER: { |
int input_reg = iterator->Next(); |
double value = input_->GetDoubleRegister(input_reg); |
@@ -2605,6 +2681,32 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, |
return; |
} |
+ case Translation::BOOL_STACK_SLOT: { |
+ int input_slot_index = iterator->Next(); |
+ unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index); |
+ uintptr_t value = |
+ static_cast<uintptr_t>(input_->GetFrameSlot(input_offset)); |
+ bool is_smi = value <= static_cast<uintptr_t>(Smi::kMaxValue); |
+ if (trace_scope_ != NULL) { |
+ PrintF(trace_scope_->file(), " 0x%08" V8PRIxPTR ": ", |
+ output_[frame_index]->GetTop() + output_offset); |
+ PrintF(trace_scope_->file(), |
+ "[top + %d] <- %" V8PRIuPTR " ; [sp + %d] (uint32 %s)\n", |
+ output_offset, value, input_offset, TraceValueType(is_smi)); |
+ } |
+ if (value == 0) { |
+ output_[frame_index]->SetFrameSlot( |
+ output_offset, |
+ reinterpret_cast<intptr_t>(isolate_->heap()->false_value())); |
+ } else { |
+ DCHECK_EQ(1, value); |
+ output_[frame_index]->SetFrameSlot( |
+ output_offset, |
+ reinterpret_cast<intptr_t>(isolate_->heap()->true_value())); |
+ } |
+ return; |
+ } |
+ |
case Translation::DOUBLE_STACK_SLOT: { |
int input_slot_index = iterator->Next(); |
unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index); |
@@ -3020,6 +3122,12 @@ void Translation::StoreUint32Register(Register reg) { |
} |
+void Translation::StoreBoolRegister(Register reg) { |
+ buffer_->Add(BOOL_REGISTER, zone()); |
+ buffer_->Add(reg.code(), zone()); |
+} |
+ |
+ |
void Translation::StoreDoubleRegister(DoubleRegister reg) { |
buffer_->Add(DOUBLE_REGISTER, zone()); |
buffer_->Add(DoubleRegister::ToAllocationIndex(reg), zone()); |
@@ -3044,6 +3152,12 @@ void Translation::StoreUint32StackSlot(int index) { |
} |
+void Translation::StoreBoolStackSlot(int index) { |
+ buffer_->Add(BOOL_STACK_SLOT, zone()); |
+ buffer_->Add(index, zone()); |
+} |
+ |
+ |
void Translation::StoreDoubleStackSlot(int index) { |
buffer_->Add(DOUBLE_STACK_SLOT, zone()); |
buffer_->Add(index, zone()); |
@@ -3076,10 +3190,12 @@ int Translation::NumberOfOperandsFor(Opcode opcode) { |
case REGISTER: |
case INT32_REGISTER: |
case UINT32_REGISTER: |
+ case BOOL_REGISTER: |
case DOUBLE_REGISTER: |
case STACK_SLOT: |
case INT32_STACK_SLOT: |
case UINT32_STACK_SLOT: |
+ case BOOL_STACK_SLOT: |
case DOUBLE_STACK_SLOT: |
case LITERAL: |
case COMPILED_STUB_FRAME: |
@@ -3143,6 +3259,7 @@ SlotRef SlotRefValueBuilder::ComputeSlotForNextArgument( |
case Translation::REGISTER: |
case Translation::INT32_REGISTER: |
case Translation::UINT32_REGISTER: |
+ case Translation::BOOL_REGISTER: |
case Translation::DOUBLE_REGISTER: |
// We are at safepoint which corresponds to call. All registers are |
// saved by caller so there would be no live registers at this |
@@ -3167,6 +3284,12 @@ SlotRef SlotRefValueBuilder::ComputeSlotForNextArgument( |
return SlotRef(slot_addr, SlotRef::UINT32); |
} |
+ case Translation::BOOL_STACK_SLOT: { |
+ int slot_index = iterator->Next(); |
+ Address slot_addr = SlotAddress(frame, slot_index); |
+ return SlotRef(slot_addr, SlotRef::BOOLBIT); |
+ } |
+ |
case Translation::DOUBLE_STACK_SLOT: { |
int slot_index = iterator->Next(); |
Address slot_addr = SlotAddress(frame, slot_index); |
@@ -3324,6 +3447,20 @@ Handle<Object> SlotRef::GetValue(Isolate* isolate) { |
} |
} |
+ case BOOLBIT: { |
+#if V8_TARGET_BIG_ENDIAN && V8_HOST_ARCH_64_BIT |
+ uint32_t value = Memory::uint32_at(addr_ + kIntSize); |
+#else |
+ uint32_t value = Memory::uint32_at(addr_); |
+#endif |
+ if (value == 0) { |
+ return isolate->factory()->false_value(); |
+ } else { |
+ DCHECK_EQ(1, value); |
+ return isolate->factory()->true_value(); |
+ } |
+ } |
+ |
case DOUBLE: { |
double value = read_double_value(addr_); |
return isolate->factory()->NewNumber(value); |
@@ -3396,6 +3533,7 @@ Handle<Object> SlotRefValueBuilder::GetNext(Isolate* isolate, int lvl) { |
case SlotRef::TAGGED: |
case SlotRef::INT32: |
case SlotRef::UINT32: |
+ case SlotRef::BOOLBIT: |
case SlotRef::DOUBLE: |
case SlotRef::LITERAL: |
return slot.GetValue(isolate); |