Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index c698459fd0396c4f4a50ec008f0430b053bb7fd5..b23665d9a229fbcf185b2935d4c1b47a89e56d36 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -2451,6 +2451,10 @@ void Translation::StoreBoolRegister(Register reg) { |
buffer_->Add(reg.code(), zone()); |
} |
+void Translation::StoreFloatRegister(FloatRegister reg) { |
+ buffer_->Add(FLOAT_REGISTER, zone()); |
+ buffer_->Add(reg.code(), zone()); |
+} |
void Translation::StoreDoubleRegister(DoubleRegister reg) { |
buffer_->Add(DOUBLE_REGISTER, zone()); |
@@ -2481,6 +2485,10 @@ void Translation::StoreBoolStackSlot(int index) { |
buffer_->Add(index, zone()); |
} |
+void Translation::StoreFloatStackSlot(int index) { |
+ buffer_->Add(FLOAT_STACK_SLOT, zone()); |
+ buffer_->Add(index, zone()); |
+} |
void Translation::StoreDoubleStackSlot(int index) { |
buffer_->Add(DOUBLE_STACK_SLOT, zone()); |
@@ -2521,11 +2529,13 @@ int Translation::NumberOfOperandsFor(Opcode opcode) { |
case INT32_REGISTER: |
case UINT32_REGISTER: |
case BOOL_REGISTER: |
+ case FLOAT_REGISTER: |
case DOUBLE_REGISTER: |
case STACK_SLOT: |
case INT32_STACK_SLOT: |
case UINT32_STACK_SLOT: |
case BOOL_STACK_SLOT: |
+ case FLOAT_STACK_SLOT: |
case DOUBLE_STACK_SLOT: |
case LITERAL: |
case COMPILED_STUB_FRAME: |
@@ -2816,6 +2826,14 @@ TranslatedValue TranslatedValue::NewDuplicateObject(TranslatedState* container, |
// static |
+TranslatedValue TranslatedValue::NewFloat(TranslatedState* container, |
+ float value) { |
+ TranslatedValue slot(container, kFloat); |
+ slot.float_value_ = value; |
+ return slot; |
+} |
+ |
+// static |
TranslatedValue TranslatedValue::NewDouble(TranslatedState* container, |
double value) { |
TranslatedValue slot(container, kDouble); |
@@ -2886,6 +2904,10 @@ uint32_t TranslatedValue::uint32_value() const { |
return uint32_value_; |
} |
+float TranslatedValue::float_value() const { |
+ DCHECK_EQ(kFloat, kind()); |
+ return float_value_; |
+} |
double TranslatedValue::double_value() const { |
DCHECK_EQ(kDouble, kind()); |
@@ -2964,6 +2986,7 @@ Handle<Object> TranslatedValue::GetValue() { |
case TranslatedValue::kInt32: |
case TranslatedValue::kUInt32: |
case TranslatedValue::kBoolBit: |
+ case TranslatedValue::kFloat: |
case TranslatedValue::kDouble: { |
MaterializeSimple(); |
return value_.ToHandleChecked(); |
@@ -3005,6 +3028,10 @@ void TranslatedValue::MaterializeSimple() { |
value_ = Handle<Object>(isolate()->factory()->NewNumber(uint32_value())); |
return; |
+ case kFloat: |
+ value_ = Handle<Object>(isolate()->factory()->NewNumber(float_value())); |
+ return; |
+ |
case kDouble: |
value_ = Handle<Object>(isolate()->factory()->NewNumber(double_value())); |
return; |
@@ -3281,11 +3308,13 @@ TranslatedFrame TranslatedState::CreateNextTranslatedFrame( |
case Translation::INT32_REGISTER: |
case Translation::UINT32_REGISTER: |
case Translation::BOOL_REGISTER: |
+ case Translation::FLOAT_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::FLOAT_STACK_SLOT: |
case Translation::DOUBLE_STACK_SLOT: |
case Translation::LITERAL: |
break; |
@@ -3412,12 +3441,23 @@ TranslatedValue TranslatedState::CreateNextTranslatedValue( |
return TranslatedValue::NewBool(this, static_cast<uint32_t>(value)); |
} |
+ case Translation::FLOAT_REGISTER: { |
+ int input_reg = iterator->Next(); |
+ if (registers == nullptr) return TranslatedValue::NewInvalid(this); |
+ float value = registers->GetFloatRegister(input_reg); |
+ if (trace_file != nullptr) { |
+ PrintF(trace_file, "%e ; %s (float)", value, |
+ FloatRegister::from_code(input_reg).ToString()); |
+ } |
+ return TranslatedValue::NewFloat(this, value); |
+ } |
+ |
case Translation::DOUBLE_REGISTER: { |
int input_reg = iterator->Next(); |
if (registers == nullptr) return TranslatedValue::NewInvalid(this); |
double value = registers->GetDoubleRegister(input_reg); |
if (trace_file != nullptr) { |
- PrintF(trace_file, "%e ; %s (bool)", value, |
+ PrintF(trace_file, "%e ; %s (double)", value, |
DoubleRegister::from_code(input_reg).ToString()); |
} |
return TranslatedValue::NewDouble(this, value); |
@@ -3469,6 +3509,17 @@ TranslatedValue TranslatedState::CreateNextTranslatedValue( |
return TranslatedValue::NewBool(this, value); |
} |
+ case Translation::FLOAT_STACK_SLOT: { |
+ int slot_offset = |
+ OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next()); |
+ float value = ReadFloatValue(fp + slot_offset); |
+ if (trace_file != nullptr) { |
+ PrintF(trace_file, "%e ; (float) [fp %c %d] ", value, |
+ slot_offset < 0 ? '-' : '+', std::abs(slot_offset)); |
+ } |
+ return TranslatedValue::NewFloat(this, value); |
+ } |
+ |
case Translation::DOUBLE_STACK_SLOT: { |
int slot_offset = |
OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next()); |
@@ -3616,6 +3667,7 @@ Handle<Object> TranslatedState::MaterializeAt(int frame_index, |
case TranslatedValue::kInt32: |
case TranslatedValue::kUInt32: |
case TranslatedValue::kBoolBit: |
+ case TranslatedValue::kFloat: |
case TranslatedValue::kDouble: { |
slot->MaterializeSimple(); |
Handle<Object> value = slot->GetValue(); |