From 2786e990fbf7f58b74b0855c30e1a819703c1007 Mon Sep 17 00:00:00 2001 From: "plind44@gmail.com" Date: Thu, 23 Jan 2014 15:42:02 +0000 Subject: [PATCH] MIPS: Turn FastNewContextStub into a HydrogenCodeStub. Port r18764 (c40563f) BUG= R=plind44@gmail.com Review URL: https://codereview.chromium.org/145013010 Patch from Balazs Kilvady . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18784 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/code-stubs-mips.cc | 51 ++++++++-------------------------------- src/mips/full-codegen-mips.cc | 10 ++++---- src/mips/lithium-codegen-mips.cc | 9 +++---- 3 files changed, 21 insertions(+), 49 deletions(-) diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc index 3bd381a..2fe6d69 100644 --- a/src/mips/code-stubs-mips.cc +++ b/src/mips/code-stubs-mips.cc @@ -50,6 +50,16 @@ void FastNewClosureStub::InitializeInterfaceDescriptor( } +void FastNewContextStub::InitializeInterfaceDescriptor( + Isolate* isolate, + CodeStubInterfaceDescriptor* descriptor) { + static Register registers[] = { a1 }; + descriptor->register_param_count_ = 1; + descriptor->register_params_ = registers; + descriptor->deoptimization_handler_ = NULL; +} + + void ToNumberStub::InitializeInterfaceDescriptor( Isolate* isolate, CodeStubInterfaceDescriptor* descriptor) { @@ -453,47 +463,6 @@ void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm) { } -void FastNewContextStub::Generate(MacroAssembler* masm) { - // Try to allocate the context in new space. - Label gc; - int length = slots_ + Context::MIN_CONTEXT_SLOTS; - - // Attempt to allocate the context in new space. - __ Allocate(FixedArray::SizeFor(length), v0, a1, a2, &gc, TAG_OBJECT); - - // Load the function from the stack. - __ lw(a3, MemOperand(sp, 0)); - - // Set up the object header. - __ LoadRoot(a1, Heap::kFunctionContextMapRootIndex); - __ li(a2, Operand(Smi::FromInt(length))); - __ sw(a2, FieldMemOperand(v0, FixedArray::kLengthOffset)); - __ sw(a1, FieldMemOperand(v0, HeapObject::kMapOffset)); - - // Set up the fixed slots, copy the global object from the previous context. - __ lw(a2, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX))); - __ li(a1, Operand(Smi::FromInt(0))); - __ sw(a3, MemOperand(v0, Context::SlotOffset(Context::CLOSURE_INDEX))); - __ sw(cp, MemOperand(v0, Context::SlotOffset(Context::PREVIOUS_INDEX))); - __ sw(a1, MemOperand(v0, Context::SlotOffset(Context::EXTENSION_INDEX))); - __ sw(a2, MemOperand(v0, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX))); - - // Initialize the rest of the slots to undefined. - __ LoadRoot(a1, Heap::kUndefinedValueRootIndex); - for (int i = Context::MIN_CONTEXT_SLOTS; i < length; i++) { - __ sw(a1, MemOperand(v0, Context::SlotOffset(i))); - } - - // Remove the on-stack argument and return. - __ mov(cp, v0); - __ DropAndRet(1); - - // Need to collect. Call into runtime system. - __ bind(&gc); - __ TailCallRuntime(Runtime::kNewFunctionContext, 1, 1); -} - - void FastNewBlockContextStub::Generate(MacroAssembler* masm) { // Stack layout on entry: // diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc index 77708cd..972210a 100644 --- a/src/mips/full-codegen-mips.cc +++ b/src/mips/full-codegen-mips.cc @@ -211,20 +211,22 @@ void FullCodeGenerator::Generate() { if (heap_slots > 0) { Comment cmnt(masm_, "[ Allocate context"); // Argument to NewContext is the function, which is still in a1. - __ push(a1); if (FLAG_harmony_scoping && info->scope()->is_global_scope()) { + __ push(a1); __ Push(info->scope()->GetScopeInfo()); __ CallRuntime(Runtime::kNewGlobalContext, 2); } else if (heap_slots <= FastNewContextStub::kMaximumSlots) { FastNewContextStub stub(heap_slots); __ CallStub(&stub); } else { + __ push(a1); __ CallRuntime(Runtime::kNewFunctionContext, 1); } function_in_register = false; - // Context is returned in both v0 and cp. It replaces the context - // passed to us. It's saved in the stack and kept live in cp. - __ sw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); + // Context is returned in v0. It replaces the context passed to us. + // It's saved in the stack and kept live in cp. + __ mov(cp, v0); + __ sw(v0, MemOperand(fp, StandardFrameConstants::kContextOffset)); // Copy any necessary parameters into the context. int num_parameters = info->scope()->num_parameters(); for (int i = 0; i < num_parameters; i++) { diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index 00954b8..dc1cd51 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -204,17 +204,18 @@ bool LCodeGen::GeneratePrologue() { if (heap_slots > 0) { Comment(";;; Allocate local context"); // Argument to NewContext is the function, which is in a1. - __ push(a1); if (heap_slots <= FastNewContextStub::kMaximumSlots) { FastNewContextStub stub(heap_slots); __ CallStub(&stub); } else { + __ push(a1); __ CallRuntime(Runtime::kNewFunctionContext, 1); } RecordSafepoint(Safepoint::kNoLazyDeopt); - // Context is returned in both v0 and cp. It replaces the context - // passed to us. It's saved in the stack and kept live in cp. - __ sw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); + // Context is returned in both v0. It replaces the context passed to us. + // It's saved in the stack and kept live in cp. + __ mov(cp, v0); + __ sw(v0, MemOperand(fp, StandardFrameConstants::kContextOffset)); // Copy any necessary parameters into the context. int num_parameters = scope()->num_parameters(); for (int i = 0; i < num_parameters; i++) { -- 2.7.4