X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fv8%2Fsrc%2Fdeoptimizer.cc;h=dd274ede99454529b6d7ab89bdb5891fdee44995;hb=3545e9f2671f595d2a2f3ee75ca0393b01e35ef6;hp=b3ae6b176a14adfe3400f56ddfc0349968926624;hpb=7d210d4c7e9ba36e635eabc5b5780495f8a63292;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/v8/src/deoptimizer.cc b/src/v8/src/deoptimizer.cc index b3ae6b1..dd274ed 100644 --- a/src/v8/src/deoptimizer.cc +++ b/src/v8/src/deoptimizer.cc @@ -353,7 +353,7 @@ void Deoptimizer::DeoptimizeMarkedCodeForContext(Context* context) { SafepointEntry safepoint = code->GetSafepointEntry(it.frame()->pc()); int deopt_index = safepoint.deoptimization_index(); // Turbofan deopt is checked when we are patching addresses on stack. - bool turbofanned = code->is_turbofanned(); + bool turbofanned = code->is_turbofanned() && !FLAG_turbo_deoptimization; bool safe_to_deopt = deopt_index != Safepoint::kNoDeoptimizationIndex || turbofanned; CHECK(topmost_optimized_code == NULL || safe_to_deopt || turbofanned); @@ -378,7 +378,8 @@ void Deoptimizer::DeoptimizeMarkedCodeForContext(Context* context) { CHECK_EQ(code->kind(), Code::OPTIMIZED_FUNCTION); Object* next = code->next_code_link(); - if (code->marked_for_deoptimization()) { + if (code->marked_for_deoptimization() && + (!code->is_turbofanned() || FLAG_turbo_deoptimization)) { // Put the code into the list for later patching. codes.Add(code, &zone); @@ -400,10 +401,6 @@ void Deoptimizer::DeoptimizeMarkedCodeForContext(Context* context) { element = next; } - if (FLAG_turbo_deoptimization) { - PatchStackForMarkedCode(isolate); - } - // TODO(titzer): we need a handle scope only because of the macro assembler, // which is only used in EnsureCodeForDeoptimizationEntry. HandleScope scope(isolate); @@ -425,11 +422,7 @@ void Deoptimizer::DeoptimizeMarkedCodeForContext(Context* context) { shared->EvictFromOptimizedCodeMap(codes[i], "deoptimized code"); // Do platform-specific patching to force any activations to lazy deopt. - // - // We skip patching Turbofan code - we patch return addresses on stack. - // TODO(jarin) We should still zap the code object (but we have to - // be careful not to zap the deoptimization block). - if (!codes[i]->is_turbofanned()) { + if (!codes[i]->is_turbofanned() || FLAG_turbo_deoptimization) { PatchCodeForDeoptimization(isolate, codes[i]); // We might be in the middle of incremental marking with compaction. @@ -441,56 +434,6 @@ void Deoptimizer::DeoptimizeMarkedCodeForContext(Context* context) { } -static int FindPatchAddressForReturnAddress(Code* code, int pc) { - DeoptimizationInputData* input_data = - DeoptimizationInputData::cast(code->deoptimization_data()); - int patch_count = input_data->ReturnAddressPatchCount(); - for (int i = 0; i < patch_count; i++) { - int return_pc = input_data->ReturnAddressPc(i)->value(); - int patch_pc = input_data->PatchedAddressPc(i)->value(); - // If the supplied pc matches the return pc or if the address - // has been already patched, return the patch pc. - if (pc == return_pc || pc == patch_pc) { - return patch_pc; - } - } - return -1; -} - - -// For all marked Turbofanned code on stack, change the return address to go -// to the deoptimization block. -void Deoptimizer::PatchStackForMarkedCode(Isolate* isolate) { - // TODO(jarin) We should tolerate missing patch entry for the topmost frame. - for (StackFrameIterator it(isolate, isolate->thread_local_top()); !it.done(); - it.Advance()) { - StackFrame::Type type = it.frame()->type(); - if (type == StackFrame::OPTIMIZED) { - Code* code = it.frame()->LookupCode(); - if (code->is_turbofanned() && code->marked_for_deoptimization()) { - JSFunction* function = - static_cast(it.frame())->function(); - Address* pc_address = it.frame()->pc_address(); - int pc_offset = - static_cast(*pc_address - code->instruction_start()); - int new_pc_offset = FindPatchAddressForReturnAddress(code, pc_offset); - - if (FLAG_trace_deopt) { - CodeTracer::Scope scope(isolate->GetCodeTracer()); - PrintF(scope.file(), "[patching stack address for function: "); - function->PrintName(scope.file()); - PrintF(scope.file(), " (Pc offset %i -> %i)]\n", pc_offset, - new_pc_offset); - } - - CHECK_LE(0, new_pc_offset); - *pc_address += new_pc_offset - pc_offset; - } - } - } -} - - void Deoptimizer::DeoptimizeAll(Isolate* isolate) { if (FLAG_trace_deopt) { CodeTracer::Scope scope(isolate->GetCodeTracer()); @@ -941,7 +884,7 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator, CHECK_EQ(Translation::kSelfLiteralId, closure_id); function = function_; } - unsigned height = iterator->Next(); + unsigned height = iterator->Next() - 1; // Do not count the context. unsigned height_in_bytes = height * kPointerSize; if (trace_scope_ != NULL) { PrintF(trace_scope_->file(), " translating "); @@ -1076,12 +1019,24 @@ void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator, Register context_reg = JavaScriptFrame::context_register(); output_offset -= kPointerSize; input_offset -= kPointerSize; - if (is_bottommost) { - value = input_->GetFrameSlot(input_offset); - } else { - value = reinterpret_cast(function->context()); + // Read the context from the translations. + DoTranslateCommand(iterator, frame_index, output_offset); + value = output_frame->GetFrameSlot(output_offset); + // The context should not be a placeholder for a materialized object. + CHECK(value != + reinterpret_cast(isolate_->heap()->arguments_marker())); + if (value == + reinterpret_cast(isolate_->heap()->undefined_value())) { + // If the context was optimized away, just use the context from + // the activation. This should only apply to Crankshaft code. + CHECK(!compiled_code_->is_turbofanned()); + if (is_bottommost) { + value = input_->GetFrameSlot(input_offset); + } else { + value = reinterpret_cast(function->context()); + } + output_frame->SetFrameSlot(output_offset, value); } - output_frame->SetFrameSlot(output_offset, value); output_frame->SetContext(value); if (is_topmost) output_frame->SetRegister(context_reg.code(), value); if (trace_scope_ != NULL) { @@ -1625,17 +1580,13 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator, CHECK(compiled_code_->is_hydrogen_stub()); int major_key = CodeStub::GetMajorKey(compiled_code_); - CodeStubInterfaceDescriptor* descriptor = - isolate_->code_stub_interface_descriptor(major_key); - // Check that there is a matching descriptor to the major key. - // This will fail if there has not been one installed to the isolate. - DCHECK_EQ(descriptor->MajorKey(), major_key); + CodeStubDescriptor descriptor(isolate_, compiled_code_->stub_key()); // The output frame must have room for all pushed register parameters // and the standard stack frame slots. Include space for an argument // object to the callee and optionally the space to pass the argument // object to the stub failure handler. - int param_count = descriptor->GetEnvironmentParameterCount(); + int param_count = descriptor.GetEnvironmentParameterCount(); CHECK_GE(param_count, 0); int height_in_bytes = kPointerSize * param_count + sizeof(Arguments) + @@ -1733,7 +1684,7 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator, } intptr_t caller_arg_count = 0; - bool arg_count_known = !descriptor->stack_parameter_count().is_valid(); + bool arg_count_known = !descriptor.stack_parameter_count().is_valid(); // Build the Arguments object for the caller's parameters and a pointer to it. output_frame_offset -= kPointerSize; @@ -1785,8 +1736,7 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator, output_frame_offset -= kPointerSize; DoTranslateCommand(iterator, 0, output_frame_offset); - if (!arg_count_known && - descriptor->IsEnvironmentParameterCountRegister(i)) { + if (!arg_count_known && descriptor.IsEnvironmentParameterCountRegister(i)) { arguments_length_offset = output_frame_offset; } } @@ -1822,14 +1772,14 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator, } // Copy the double registers from the input into the output frame. - CopySIMD128Registers(output_frame); + CopyDoubleRegisters(output_frame); // Fill registers containing handler and number of parameters. - SetPlatformCompiledStubRegisters(output_frame, descriptor); + SetPlatformCompiledStubRegisters(output_frame, &descriptor); // Compute this frame's PC, state, and continuation. Code* trampoline = NULL; - StubFunctionMode function_mode = descriptor->function_mode(); + StubFunctionMode function_mode = descriptor.function_mode(); StubFailureTrampolineStub(isolate_, function_mode).FindCodeInCache(&trampoline); DCHECK(trampoline != NULL); @@ -2011,61 +1961,6 @@ void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) { Memory::Object_at(d.destination()) = *num; } - // Materialize all float32x4 before looking at arguments because when the - // output frames are used to materialize arguments objects later on they need - // to already contain valid float32x4 values. - for (int i = 0; i < deferred_float32x4s_.length(); i++) { - SIMD128MaterializationDescriptor
d = deferred_float32x4s_[i]; - float32x4_value_t x4 = d.value().f4; - Handle float32x4 = isolate_->factory()->NewFloat32x4(x4); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - "Materialized a new float32x4 %p " - "[float32x4(%e, %e, %e, %e)] in slot %p\n", - reinterpret_cast(*float32x4), - x4.storage[0], x4.storage[1], x4.storage[2], x4.storage[3], - d.destination()); - } - Memory::Object_at(d.destination()) = *float32x4; - } - - // Materialize all float64x2 before looking at arguments because when the - // output frames are used to materialize arguments objects later on they need - // to already contain valid float64x2 values. - for (int i = 0; i < deferred_float64x2s_.length(); i++) { - SIMD128MaterializationDescriptor
d = deferred_float64x2s_[i]; - float64x2_value_t x2 = d.value().d2; - Handle float64x2 = isolate_->factory()->NewFloat64x2(x2); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - "Materialized a new float64x2 %p " - "[float64x2(%e, %e)] in slot %p\n", - reinterpret_cast(*float64x2), - x2.storage[0], x2.storage[1], - d.destination()); - } - Memory::Object_at(d.destination()) = *float64x2; - } - - // Materialize all int32x4 before looking at arguments because when the - // output frames are used to materialize arguments objects later on they need - // to already contain valid int32x4 values. - for (int i = 0; i < deferred_int32x4s_.length(); i++) { - SIMD128MaterializationDescriptor
d = deferred_int32x4s_[i]; - int32x4_value_t x4 = d.value().i4; - Handle int32x4 = isolate_->factory()->NewInt32x4(x4); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - "Materialized a new int32x4 %p " - "[int32x4(%u, %u, %u, %u)] in slot %p\n", - reinterpret_cast(*int32x4), - x4.storage[0], x4.storage[1], x4.storage[2], x4.storage[3], - d.destination()); - } - Memory::Object_at(d.destination()) = *int32x4; - } - - // Materialize all heap numbers required for arguments/captured objects. for (int i = 0; i < deferred_objects_double_values_.length(); i++) { HeapNumberMaterializationDescriptor d = @@ -2085,69 +1980,6 @@ void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) { // Play it safe and clear all object double values before we continue. deferred_objects_double_values_.Clear(); - // Materialize all float32x4 values required for arguments/captured objects. - for (int i = 0; i < deferred_objects_float32x4_values_.length(); i++) { - SIMD128MaterializationDescriptor d = - deferred_objects_float32x4_values_[i]; - float32x4_value_t x4 = d.value().f4; - Handle float32x4 = isolate_->factory()->NewFloat32x4(x4); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - "Materialized a new float32x4 %p " - "[float32x4(%e, %e, %e, %e)] for object at %d\n", - reinterpret_cast(*float32x4), - x4.storage[0], x4.storage[1], x4.storage[2], x4.storage[3], - d.destination()); - } - DCHECK(values.at(d.destination())->IsTheHole()); - values.Set(d.destination(), float32x4); - } - - // Play it safe and clear all object float32x4 values before we continue. - deferred_objects_float32x4_values_.Clear(); - - // Materialize all float64x2 values required for arguments/captured objects. - for (int i = 0; i < deferred_objects_float64x2_values_.length(); i++) { - SIMD128MaterializationDescriptor d = - deferred_objects_float64x2_values_[i]; - float64x2_value_t x2 = d.value().d2; - Handle float64x2 = isolate_->factory()->NewFloat64x2(x2); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - "Materialized a new float64x2 %p " - "[float64x2(%e, %e)] for object at %d\n", - reinterpret_cast(*float64x2), - x2.storage[0], x2.storage[1], - d.destination()); - } - DCHECK(values.at(d.destination())->IsTheHole()); - values.Set(d.destination(), float64x2); - } - - // Play it safe and clear all object float64x2 values before we continue. - deferred_objects_float64x2_values_.Clear(); - - // Materialize all int32x4 values required for arguments/captured objects. - for (int i = 0; i < deferred_objects_int32x4_values_.length(); i++) { - SIMD128MaterializationDescriptor d = - deferred_objects_int32x4_values_[i]; - int32x4_value_t x4 = d.value().i4; - Handle int32x4 = isolate_->factory()->NewInt32x4(x4); - if (trace_scope_ != NULL) { - PrintF(trace_scope_->file(), - "Materialized a new int32x4 %p " - "[int32x4(%u, %u, %u, %u)] for object at %d\n", - reinterpret_cast(*int32x4), - x4.storage[0], x4.storage[1], x4.storage[2], x4.storage[3], - d.destination()); - } - DCHECK(values.at(d.destination())->IsTheHole()); - values.Set(d.destination(), int32x4); - } - - // Play it safe and clear all object int32x4 values before we continue. - deferred_objects_int32x4_values_.Clear(); - // Materialize arguments/captured objects. if (!deferred_objects_.is_empty()) { List > materialized_objects(deferred_objects_.length()); @@ -2277,16 +2109,10 @@ void Deoptimizer::DoTranslateObjectAndSkip(TranslationIterator* iterator) { case Translation::INT32_REGISTER: case Translation::UINT32_REGISTER: case Translation::DOUBLE_REGISTER: - case Translation::FLOAT32x4_REGISTER: - case Translation::FLOAT64x2_REGISTER: - case Translation::INT32x4_REGISTER: case Translation::STACK_SLOT: case Translation::INT32_STACK_SLOT: case Translation::UINT32_STACK_SLOT: case Translation::DOUBLE_STACK_SLOT: - case Translation::FLOAT32x4_STACK_SLOT: - case Translation::FLOAT64x2_STACK_SLOT: - case Translation::INT32x4_STACK_SLOT: case Translation::LITERAL: { // The value is not part of any materialized object, so we can ignore it. iterator->Skip(Translation::NumberOfOperandsFor(opcode)); @@ -2436,49 +2262,6 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator, return; } - case Translation::FLOAT32x4_REGISTER: - case Translation::FLOAT64x2_REGISTER: - case Translation::INT32x4_REGISTER: { - int input_reg = iterator->Next(); - simd128_value_t value = input_->GetSIMD128Register(input_reg); - if (trace_scope_ != NULL) { - if (opcode == Translation::FLOAT32x4_REGISTER) { - float32x4_value_t x4 = value.f4; - PrintF(trace_scope_->file(), - " object @0x%08" V8PRIxPTR ": [field #%d] <- ", - reinterpret_cast(object_slot), - field_index); - PrintF(trace_scope_->file(), - "float32x4(%e, %e, %e, %e) ; %s\n", - x4.storage[0], x4.storage[1], x4.storage[2], x4.storage[3], - SIMD128Register::AllocationIndexToString(input_reg)); - } else if (opcode == Translation::FLOAT64x2_REGISTER) { - float64x2_value_t x2 = value.d2; - PrintF(trace_scope_->file(), - " object @0x%08" V8PRIxPTR ": [field #%d] <- ", - reinterpret_cast(object_slot), - field_index); - PrintF(trace_scope_->file(), - "float64x2(%e, %e) ; %s\n", - x2.storage[0], x2.storage[1], - SIMD128Register::AllocationIndexToString(input_reg)); - } else { - DCHECK(opcode == Translation::INT32x4_REGISTER); - int32x4_value_t x4 = value.i4; - PrintF(trace_scope_->file(), - " object @0x%08" V8PRIxPTR ": [field #%d] <- ", - reinterpret_cast(object_slot), - field_index); - PrintF(trace_scope_->file(), - "int32x4(%u, %u, %u, %u) ; %s\n", - x4.storage[0], x4.storage[1], x4.storage[2], x4.storage[3], - SIMD128Register::AllocationIndexToString(input_reg)); - } - } - AddObjectSIMD128Value(value, opcode); - return; - } - case Translation::STACK_SLOT: { int input_slot_index = iterator->Next(); unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index); @@ -2566,50 +2349,6 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator, return; } - case Translation::FLOAT32x4_STACK_SLOT: - case Translation::FLOAT64x2_STACK_SLOT: - case Translation::INT32x4_STACK_SLOT: { - int input_slot_index = iterator->Next(); - unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index); - simd128_value_t value = input_->GetSIMD128FrameSlot(input_offset); - if (trace_scope_ != NULL) { - if (opcode == Translation::FLOAT32x4_STACK_SLOT) { - float32x4_value_t x4 = value.f4; - PrintF(trace_scope_->file(), - " object @0x%08" V8PRIxPTR ": [field #%d] <- ", - reinterpret_cast(object_slot), - field_index); - PrintF(trace_scope_->file(), - "float32x4(%e, %e, %e, %e) ; [sp + %d]\n", - x4.storage[0], x4.storage[1], x4.storage[2], x4.storage[3], - input_offset); - } else if (opcode == Translation::FLOAT64x2_STACK_SLOT) { - float64x2_value_t x2 = value.d2; - PrintF(trace_scope_->file(), - " object @0x%08" V8PRIxPTR ": [field #%d] <- ", - reinterpret_cast(object_slot), - field_index); - PrintF(trace_scope_->file(), - "float64x2(%e, %e) ; [sp + %d]\n", - x2.storage[0], x2.storage[1], - input_offset); - } else { - DCHECK(opcode == Translation::INT32x4_STACK_SLOT); - int32x4_value_t x4 = value.i4; - PrintF(trace_scope_->file(), - " object @0x%08" V8PRIxPTR ": [field #%d] <- ", - reinterpret_cast(object_slot), - field_index); - PrintF(trace_scope_->file(), - "int32x4(%u, %u, %u, %u) ; [sp + %d]\n", - x4.storage[0], x4.storage[1], x4.storage[2], x4.storage[3], - input_offset); - } - } - AddObjectSIMD128Value(value, opcode); - return; - } - case Translation::LITERAL: { Object* literal = ComputeLiteral(iterator->Next()); if (trace_scope_ != NULL) { @@ -2794,50 +2533,6 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, return; } - case Translation::FLOAT32x4_REGISTER: - case Translation::FLOAT64x2_REGISTER: - case Translation::INT32x4_REGISTER: { - int input_reg = iterator->Next(); - simd128_value_t value = input_->GetSIMD128Register(input_reg); - if (trace_scope_ != NULL) { - if (opcode == Translation::FLOAT32x4_REGISTER) { - float32x4_value_t x4 = value.f4; - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ":" - " [top + %d] <- float32x4(%e, %e, %e, %e) ; %s\n", - output_[frame_index]->GetTop() + output_offset, - output_offset, - x4.storage[0], x4.storage[1], x4.storage[2], x4.storage[3], - SIMD128Register::AllocationIndexToString(input_reg)); - } else if (opcode == Translation::FLOAT64x2_REGISTER) { - float64x2_value_t x2 = value.d2; - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ":" - " [top + %d] <- float64x2(%e, %e) ; %s\n", - output_[frame_index]->GetTop() + output_offset, - output_offset, - x2.storage[0], x2.storage[1], - SIMD128Register::AllocationIndexToString(input_reg)); - } else { - DCHECK(opcode == Translation::INT32x4_REGISTER); - int32x4_value_t x4 = value.i4; - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ":" - " [top + %d] <- int32x4(%u, %u, %u, %u) ; %s\n", - output_[frame_index]->GetTop() + output_offset, - output_offset, - x4.storage[0], x4.storage[1], x4.storage[2], x4.storage[3], - SIMD128Register::AllocationIndexToString(input_reg)); - } - } - // We save the untagged value on the side and store a GC-safe - // temporary placeholder in the frame. - AddSIMD128Value(output_[frame_index]->GetTop() + output_offset, value, - opcode); - output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); - return; - } - case Translation::STACK_SLOT: { int input_slot_index = iterator->Next(); unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index); @@ -2939,51 +2634,6 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, return; } - case Translation::FLOAT32x4_STACK_SLOT: - case Translation::FLOAT64x2_STACK_SLOT: - case Translation::INT32x4_STACK_SLOT: { - int input_slot_index = iterator->Next(); - unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index); - simd128_value_t value = input_->GetSIMD128FrameSlot(input_offset); - if (trace_scope_ != NULL) { - if (opcode == Translation::FLOAT32x4_STACK_SLOT) { - float32x4_value_t x4 = value.f4; - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": " - "[top + %d] <- float32x4(%e, %e, %e, %e) ; [sp + %d]\n", - output_[frame_index]->GetTop() + output_offset, - output_offset, - x4.storage[0], x4.storage[1], x4.storage[2], x4.storage[3], - input_offset); - } else if (opcode == Translation::FLOAT64x2_STACK_SLOT) { - float64x2_value_t x2 = value.d2; - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": " - "[top + %d] <- float64x2(%e, %e) ; [sp + %d]\n", - output_[frame_index]->GetTop() + output_offset, - output_offset, - x2.storage[0], x2.storage[1], - input_offset); - } else { - DCHECK(opcode == Translation::INT32x4_STACK_SLOT); - int32x4_value_t x4 = value.i4; - PrintF(trace_scope_->file(), - " 0x%08" V8PRIxPTR ": " - "[top + %d] <- int32x4(%u, %u, %u, %u) ; [sp + %d]\n", - output_[frame_index]->GetTop() + output_offset, - output_offset, - x4.storage[0], x4.storage[1], x4.storage[2], x4.storage[3], - input_offset); - } - } - // We save the untagged value on the side and store a GC-safe - // temporary placeholder in the frame. - AddSIMD128Value(output_[frame_index]->GetTop() + output_offset, value, - opcode); - output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder); - return; - } - case Translation::LITERAL: { Object* literal = ComputeLiteral(iterator->Next()); if (trace_scope_ != NULL) { @@ -3130,27 +2780,6 @@ void Deoptimizer::AddObjectDoubleValue(double value) { } -void Deoptimizer::AddObjectSIMD128Value(simd128_value_t value, - int translation_opcode) { - deferred_objects_tagged_values_.Add(isolate()->heap()->the_hole_value()); - SIMD128MaterializationDescriptor value_desc( - deferred_objects_tagged_values_.length() - 1, value); - Translation::Opcode opcode = - static_cast(translation_opcode); - if (opcode == Translation::FLOAT32x4_REGISTER || - opcode == Translation::FLOAT32x4_STACK_SLOT) { - deferred_objects_float32x4_values_.Add(value_desc); - } else if (opcode == Translation::FLOAT64x2_REGISTER || - opcode == Translation::FLOAT64x2_STACK_SLOT) { - deferred_objects_float64x2_values_.Add(value_desc); - } else { - DCHECK(opcode == Translation::INT32x4_REGISTER || - opcode == Translation::INT32x4_STACK_SLOT); - deferred_objects_int32x4_values_.Add(value_desc); - } -} - - void Deoptimizer::AddDoubleValue(intptr_t slot_address, double value) { HeapNumberMaterializationDescriptor
value_desc( reinterpret_cast
(slot_address), value); @@ -3158,27 +2787,6 @@ void Deoptimizer::AddDoubleValue(intptr_t slot_address, double value) { } -void Deoptimizer::AddSIMD128Value(intptr_t slot_address, - simd128_value_t value, - int translation_opcode) { - SIMD128MaterializationDescriptor
value_desc( - reinterpret_cast
(slot_address), value); - Translation::Opcode opcode = - static_cast(translation_opcode); - if (opcode == Translation::FLOAT32x4_REGISTER || - opcode == Translation::FLOAT32x4_STACK_SLOT) { - deferred_float32x4s_.Add(value_desc); - } else if (opcode == Translation::FLOAT64x2_REGISTER || - opcode == Translation::FLOAT64x2_STACK_SLOT) { - deferred_float64x2s_.Add(value_desc); - } else { - DCHECK(opcode == Translation::INT32x4_REGISTER || - opcode == Translation::INT32x4_STACK_SLOT); - deferred_int32x4s_.Add(value_desc); - } -} - - void Deoptimizer::EnsureCodeForDeoptimizationEntry(Isolate* isolate, BailoutType type, int max_entry_id) { @@ -3422,12 +3030,6 @@ void Translation::StoreDoubleRegister(DoubleRegister reg) { } -void Translation::StoreSIMD128Register(SIMD128Register reg, Opcode opcode) { - buffer_->Add(opcode, zone()); - buffer_->Add(SIMD128Register::ToAllocationIndex(reg), zone()); -} - - void Translation::StoreStackSlot(int index) { buffer_->Add(STACK_SLOT, zone()); buffer_->Add(index, zone()); @@ -3452,12 +3054,6 @@ void Translation::StoreDoubleStackSlot(int index) { } -void Translation::StoreSIMD128StackSlot(int index, Opcode opcode) { - buffer_->Add(opcode, zone()); - buffer_->Add(index, zone()); -} - - void Translation::StoreLiteral(int literal_id) { buffer_->Add(LITERAL, zone()); buffer_->Add(literal_id, zone()); @@ -3485,16 +3081,10 @@ int Translation::NumberOfOperandsFor(Opcode opcode) { case INT32_REGISTER: case UINT32_REGISTER: case DOUBLE_REGISTER: - case FLOAT32x4_REGISTER: - case FLOAT64x2_REGISTER: - case INT32x4_REGISTER: case STACK_SLOT: case INT32_STACK_SLOT: case UINT32_STACK_SLOT: case DOUBLE_STACK_SLOT: - case FLOAT32x4_STACK_SLOT: - case FLOAT64x2_STACK_SLOT: - case INT32x4_STACK_SLOT: case LITERAL: case COMPILED_STUB_FRAME: return 1; @@ -3558,9 +3148,6 @@ SlotRef SlotRefValueBuilder::ComputeSlotForNextArgument( case Translation::INT32_REGISTER: case Translation::UINT32_REGISTER: case Translation::DOUBLE_REGISTER: - case Translation::FLOAT32x4_REGISTER: - case Translation::FLOAT64x2_REGISTER: - case Translation::INT32x4_REGISTER: // We are at safepoint which corresponds to call. All registers are // saved by caller so there would be no live registers at this // point. Thus these translation commands should not be used. @@ -3590,24 +3177,6 @@ SlotRef SlotRefValueBuilder::ComputeSlotForNextArgument( return SlotRef(slot_addr, SlotRef::DOUBLE); } - case Translation::FLOAT32x4_STACK_SLOT: { - int slot_index = iterator->Next(); - Address slot_addr = SlotAddress(frame, slot_index); - return SlotRef(slot_addr, SlotRef::FLOAT32x4); - } - - case Translation::FLOAT64x2_STACK_SLOT: { - int slot_index = iterator->Next(); - Address slot_addr = SlotAddress(frame, slot_index); - return SlotRef(slot_addr, SlotRef::FLOAT64x2); - } - - case Translation::INT32x4_STACK_SLOT: { - int slot_index = iterator->Next(); - Address slot_addr = SlotAddress(frame, slot_index); - return SlotRef(slot_addr, SlotRef::INT32x4); - } - case Translation::LITERAL: { int literal_index = iterator->Next(); return SlotRef(data->GetIsolate(), @@ -3757,15 +3326,6 @@ Handle SlotRef::GetValue(Isolate* isolate) { return isolate->factory()->NewNumber(value); } - case FLOAT32x4: - return isolate->factory()->NewFloat32x4(read_simd128_value(addr_).f4); - - case FLOAT64x2: - return isolate->factory()->NewFloat64x2(read_simd128_value(addr_).d2); - - case INT32x4: - return isolate->factory()->NewInt32x4(read_simd128_value(addr_).i4); - case LITERAL: return literal_; @@ -4035,6 +3595,7 @@ DeoptimizedFrameInfo::DeoptimizedFrameInfo(Deoptimizer* deoptimizer, bool has_construct_stub) { FrameDescription* output_frame = deoptimizer->output_[frame_index]; function_ = output_frame->GetFunction(); + context_ = reinterpret_cast(output_frame->GetContext()); has_construct_stub_ = has_construct_stub; expression_count_ = output_frame->GetExpressionCount(); expression_stack_ = new Object*[expression_count_]; @@ -4067,7 +3628,8 @@ DeoptimizedFrameInfo::~DeoptimizedFrameInfo() { void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) { - v->VisitPointer(BitCast(&function_)); + v->VisitPointer(bit_cast(&function_)); + v->VisitPointer(&context_); v->VisitPointers(parameters_, parameters_ + parameters_count_); v->VisitPointers(expression_stack_, expression_stack_ + expression_count_); }