diff --git a/src/full-codegen/ppc/full-codegen-ppc.cc b/src/full-codegen/ppc/full-codegen-ppc.cc index f19c89a3a6..1b3852a240 100644 --- a/src/full-codegen/ppc/full-codegen-ppc.cc +++ b/src/full-codegen/ppc/full-codegen-ppc.cc @@ -1185,7 +1185,7 @@ void FullCodeGenerator::EmitNewClosure(Handle info, // we are creating here gets a chance to have its code optimized and // doesn't just get a copy of the existing unoptimized code. if (!FLAG_always_opt && !FLAG_prepare_always_opt && !pretenure && - scope()->is_function_scope()) { + scope()->is_function_scope() && info->num_literals() == 0) { FastNewClosureStub stub(isolate(), info->language_mode(), info->kind()); __ mov(r5, Operand(info)); __ CallStub(&stub); diff --git a/src/ppc/builtins-ppc.cc b/src/ppc/builtins-ppc.cc index 0e9199f655..912971c5d0 100644 --- a/src/ppc/builtins-ppc.cc +++ b/src/ppc/builtins-ppc.cc @@ -1235,145 +1235,6 @@ void Builtins::Generate_InterpreterEnterBytecodeDispatch(MacroAssembler* masm) { void Builtins::Generate_CompileLazy(MacroAssembler* masm) { - // ----------- S t a t e ------------- - // -- r6 : new target (preserved for callee) - // -- r4 : target function (preserved for callee) - // ----------------------------------- - // First lookup code, maybe we don't need to compile! - Label gotta_call_runtime; - Label maybe_call_runtime; - Label try_shared; - Label loop_top, loop_bottom; - - Register closure = r4; - Register map = r3; - Register index = r5; - __ LoadP(map, - FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); - __ LoadP(map, - FieldMemOperand(map, SharedFunctionInfo::kOptimizedCodeMapOffset)); - __ LoadP(index, FieldMemOperand(map, FixedArray::kLengthOffset)); - __ CmpSmiLiteral(index, Smi::FromInt(2), r0); - __ blt(&gotta_call_runtime); - - // Find literals. - // r4 : closure - // r6 : new target - // r3 : optimized code map - // r5 : length / index - // r10 : native context - Register native_context = r10; - __ LoadP(native_context, NativeContextMemOperand()); - - __ bind(&loop_top); - Register array_pointer = r8; - Register temp = r9; - - // Does the native context match? - __ SmiToPtrArrayOffset(array_pointer, index); - __ add(array_pointer, map, array_pointer); - __ LoadP(temp, - FieldMemOperand(array_pointer, - SharedFunctionInfo::OffsetToPreviousContext())); - __ LoadP(temp, FieldMemOperand(temp, WeakCell::kValueOffset)); - __ cmp(temp, native_context); - __ bne(&loop_bottom); - // OSR id set to none? - __ LoadP(temp, - FieldMemOperand(array_pointer, - SharedFunctionInfo::OffsetToPreviousOsrAstId())); - const int bailout_id = BailoutId::None().ToInt(); - __ CmpSmiLiteral(temp, Smi::FromInt(bailout_id), r0); - __ bne(&loop_bottom); - // Literals available? - __ LoadP(temp, - FieldMemOperand(array_pointer, - SharedFunctionInfo::OffsetToPreviousLiterals())); - __ LoadP(temp, FieldMemOperand(temp, WeakCell::kValueOffset)); - __ JumpIfSmi(temp, &gotta_call_runtime); - - // Save the literals in the closure. - __ StoreP(temp, FieldMemOperand(closure, JSFunction::kLiteralsOffset), r0); - __ RecordWriteField(closure, JSFunction::kLiteralsOffset, temp, r11, - kLRHasNotBeenSaved, kDontSaveFPRegs, EMIT_REMEMBERED_SET, - OMIT_SMI_CHECK); - - // Code available? - Register entry = r7; - __ LoadP(entry, - FieldMemOperand(array_pointer, - SharedFunctionInfo::OffsetToPreviousCachedCode())); - __ LoadP(entry, FieldMemOperand(entry, WeakCell::kValueOffset)); - __ JumpIfSmi(entry, &maybe_call_runtime); - - // Found literals and code. Get them into the closure and return. - // Store code entry in the closure. - __ addi(entry, entry, Operand(Code::kHeaderSize - kHeapObjectTag)); - - Label install_optimized_code_and_tailcall; - __ bind(&install_optimized_code_and_tailcall); - __ StoreP(entry, FieldMemOperand(closure, JSFunction::kCodeEntryOffset), r0); - __ RecordWriteCodeEntryField(closure, entry, r8); - - // Link the closure into the optimized function list. - // r7 : code entry - // r10: native context - // r4 : closure - __ LoadP( - r8, ContextMemOperand(native_context, Context::OPTIMIZED_FUNCTIONS_LIST)); - __ StoreP(r8, FieldMemOperand(closure, JSFunction::kNextFunctionLinkOffset), - r0); - __ RecordWriteField(closure, JSFunction::kNextFunctionLinkOffset, r8, r3, - kLRHasNotBeenSaved, kDontSaveFPRegs, EMIT_REMEMBERED_SET, - OMIT_SMI_CHECK); - const int function_list_offset = - Context::SlotOffset(Context::OPTIMIZED_FUNCTIONS_LIST); - __ StoreP(closure, ContextMemOperand(native_context, - Context::OPTIMIZED_FUNCTIONS_LIST)); - // Save closure before the write barrier. - __ mr(r8, closure); - __ RecordWriteContextSlot(native_context, function_list_offset, r8, r3, - kLRHasNotBeenSaved, kDontSaveFPRegs); - __ JumpToJSEntry(entry); - - __ bind(&loop_bottom); - __ SubSmiLiteral(index, index, Smi::FromInt(SharedFunctionInfo::kEntryLength), - r0); - __ CmpSmiLiteral(index, Smi::FromInt(1), r0); - __ bgt(&loop_top); - - // We found neither literals nor code. - __ b(&gotta_call_runtime); - - __ bind(&maybe_call_runtime); - - // Last possibility. Check the context free optimized code map entry. - __ LoadP(entry, - FieldMemOperand(map, FixedArray::kHeaderSize + - SharedFunctionInfo::kSharedCodeIndex)); - __ LoadP(entry, FieldMemOperand(entry, WeakCell::kValueOffset)); - __ JumpIfSmi(entry, &try_shared); - - // Store code entry in the closure. - __ addi(entry, entry, Operand(Code::kHeaderSize - kHeapObjectTag)); - __ b(&install_optimized_code_and_tailcall); - - __ bind(&try_shared); - // Is the full code valid? - __ LoadP(entry, - FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); - __ LoadP(entry, FieldMemOperand(entry, SharedFunctionInfo::kCodeOffset)); - __ LoadP(r8, FieldMemOperand(entry, Code::kFlagsOffset)); - __ DecodeField(r8); - __ cmpi(r8, Operand(Code::BUILTIN)); - __ beq(&gotta_call_runtime); - // Yes, install the full code. - __ addi(entry, entry, Operand(Code::kHeaderSize - kHeapObjectTag)); - __ StoreP(entry, FieldMemOperand(closure, JSFunction::kCodeEntryOffset), r0); - __ RecordWriteCodeEntryField(closure, entry, r8); - __ JumpToJSEntry(entry); - - __ bind(&gotta_call_runtime); CallRuntimePassFunction(masm, Runtime::kCompileLazy); GenerateTailCallToReturnedCode(masm); } diff --git a/src/ppc/macro-assembler-ppc.cc b/src/ppc/macro-assembler-ppc.cc index e562911ec5..3424e9181f 100644 --- a/src/ppc/macro-assembler-ppc.cc +++ b/src/ppc/macro-assembler-ppc.cc @@ -887,8 +887,9 @@ void MacroAssembler::Prologue(bool code_pre_aging, Register base, void MacroAssembler::EmitLoadTypeFeedbackVector(Register vector) { LoadP(vector, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); - LoadP(vector, FieldMemOperand(vector, JSFunction::kLiteralsOffset)); - LoadP(vector, FieldMemOperand(vector, LiteralsArray::kFeedbackVectorOffset)); + LoadP(vector, FieldMemOperand(vector, JSFunction::kSharedFunctionInfoOffset)); + LoadP(vector, + FieldMemOperand(vector, SharedFunctionInfo::kFeedbackVectorOffset)); }