From 7ad54344c186f408657cd74e89ce036d06a8239d Mon Sep 17 00:00:00 2001 From: bjaideep Date: Thu, 29 Dec 2016 12:53:44 -0800 Subject: [PATCH] PPC/s390: [stubs] Port FastNewObjectStub to TF Port 5b02a98bfada37eafe94373e3fed1e11318d9a27 Original Commit Message: In the process, convert from a code stub into a builtin. R=danno@chromium.org, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com BUG= LOG=N Review-Url: https://codereview.chromium.org/2601243003 Cr-Commit-Position: refs/heads/master@{#41992} --- src/builtins/ppc/builtins-ppc.cc | 12 +-- src/builtins/s390/builtins-s390.cc | 12 +-- src/ppc/code-stubs-ppc.cc | 116 ------------------------ src/ppc/interface-descriptors-ppc.cc | 6 -- src/s390/code-stubs-s390.cc | 118 ------------------------- src/s390/interface-descriptors-s390.cc | 6 -- 6 files changed, 12 insertions(+), 258 deletions(-) diff --git a/src/builtins/ppc/builtins-ppc.cc b/src/builtins/ppc/builtins-ppc.cc index 09e3fc83c2..b4aef8ead1 100644 --- a/src/builtins/ppc/builtins-ppc.cc +++ b/src/builtins/ppc/builtins-ppc.cc @@ -338,8 +338,8 @@ void Builtins::Generate_NumberConstructor_ConstructStub(MacroAssembler* masm) { __ SmiTag(r9); __ EnterBuiltinFrame(cp, r4, r9); __ Push(r5); // first argument - FastNewObjectStub stub(masm->isolate()); - __ CallStub(&stub); + __ Call(CodeFactory::FastNewObject(masm->isolate()).code(), + RelocInfo::CODE_TARGET); __ Pop(r5); __ LeaveBuiltinFrame(cp, r4, r9); __ SmiUntag(r9); @@ -490,8 +490,8 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) { __ SmiTag(r9); __ EnterBuiltinFrame(cp, r4, r9); __ Push(r5); // first argument - FastNewObjectStub stub(masm->isolate()); - __ CallStub(&stub); + __ Call(CodeFactory::FastNewObject(masm->isolate()).code(), + RelocInfo::CODE_TARGET); __ Pop(r5); __ LeaveBuiltinFrame(cp, r4, r9); __ SmiUntag(r9); @@ -587,8 +587,8 @@ void Generate_JSConstructStubHelper(MacroAssembler* masm, bool is_api_function, // Allocate the new receiver object. __ Push(r4, r6); - FastNewObjectStub stub(masm->isolate()); - __ CallStub(&stub); + __ Call(CodeFactory::FastNewObject(masm->isolate()).code(), + RelocInfo::CODE_TARGET); __ mr(r7, r3); __ Pop(r4, r6); diff --git a/src/builtins/s390/builtins-s390.cc b/src/builtins/s390/builtins-s390.cc index 306769b187..f149da9d9f 100644 --- a/src/builtins/s390/builtins-s390.cc +++ b/src/builtins/s390/builtins-s390.cc @@ -334,11 +334,11 @@ void Builtins::Generate_NumberConstructor_ConstructStub(MacroAssembler* masm) { __ bind(&new_object); { FrameScope scope(masm, StackFrame::MANUAL); - FastNewObjectStub stub(masm->isolate()); __ SmiTag(r8); __ EnterBuiltinFrame(cp, r3, r8); __ Push(r4); // first argument - __ CallStub(&stub); + __ Call(CodeFactory::FastNewObject(masm->isolate()).code(), + RelocInfo::CODE_TARGET); __ Pop(r4); __ LeaveBuiltinFrame(cp, r3, r8); __ SmiUntag(r8); @@ -484,11 +484,11 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) { __ bind(&new_object); { FrameScope scope(masm, StackFrame::MANUAL); - FastNewObjectStub stub(masm->isolate()); __ SmiTag(r8); __ EnterBuiltinFrame(cp, r3, r8); __ Push(r4); // first argument - __ CallStub(&stub); + __ Call(CodeFactory::FastNewObject(masm->isolate()).code(), + RelocInfo::CODE_TARGET); __ Pop(r4); __ LeaveBuiltinFrame(cp, r3, r8); __ SmiUntag(r8); @@ -584,8 +584,8 @@ void Generate_JSConstructStubHelper(MacroAssembler* masm, bool is_api_function, // Allocate the new receiver object. __ Push(r3, r5); - FastNewObjectStub stub(masm->isolate()); - __ CallStub(&stub); + __ Call(CodeFactory::FastNewObject(masm->isolate()).code(), + RelocInfo::CODE_TARGET); __ LoadRR(r6, r2); __ Pop(r3, r5); diff --git a/src/ppc/code-stubs-ppc.cc b/src/ppc/code-stubs-ppc.cc index 48a98a7edd..aae130c01e 100644 --- a/src/ppc/code-stubs-ppc.cc +++ b/src/ppc/code-stubs-ppc.cc @@ -3522,122 +3522,6 @@ void InternalArrayConstructorStub::Generate(MacroAssembler* masm) { GenerateCase(masm, FAST_ELEMENTS); } -void FastNewObjectStub::Generate(MacroAssembler* masm) { - // ----------- S t a t e ------------- - // -- r4 : target - // -- r6 : new target - // -- cp : context - // -- lr : return address - // ----------------------------------- - __ AssertFunction(r4); - __ AssertReceiver(r6); - - // Verify that the new target is a JSFunction. - Label new_object; - __ CompareObjectType(r6, r5, r5, JS_FUNCTION_TYPE); - __ bne(&new_object); - - // Load the initial map and verify that it's in fact a map. - __ LoadP(r5, FieldMemOperand(r6, JSFunction::kPrototypeOrInitialMapOffset)); - __ JumpIfSmi(r5, &new_object); - __ CompareObjectType(r5, r3, r3, MAP_TYPE); - __ bne(&new_object); - - // Fall back to runtime if the target differs from the new target's - // initial map constructor. - __ LoadP(r3, FieldMemOperand(r5, Map::kConstructorOrBackPointerOffset)); - __ cmp(r3, r4); - __ bne(&new_object); - - // Allocate the JSObject on the heap. - Label allocate, done_allocate; - __ lbz(r7, FieldMemOperand(r5, Map::kInstanceSizeOffset)); - __ Allocate(r7, r3, r8, r9, &allocate, SIZE_IN_WORDS); - __ bind(&done_allocate); - - // Initialize the JSObject fields. - __ StoreP(r5, FieldMemOperand(r3, JSObject::kMapOffset), r0); - __ LoadRoot(r6, Heap::kEmptyFixedArrayRootIndex); - __ StoreP(r6, FieldMemOperand(r3, JSObject::kPropertiesOffset), r0); - __ StoreP(r6, FieldMemOperand(r3, JSObject::kElementsOffset), r0); - STATIC_ASSERT(JSObject::kHeaderSize == 3 * kPointerSize); - __ addi(r4, r3, Operand(JSObject::kHeaderSize - kHeapObjectTag)); - - // ----------- S t a t e ------------- - // -- r3 : result (tagged) - // -- r4 : result fields (untagged) - // -- r8 : result end (untagged) - // -- r5 : initial map - // -- cp : context - // -- lr : return address - // ----------------------------------- - - // Perform in-object slack tracking if requested. - Label slack_tracking; - STATIC_ASSERT(Map::kNoSlackTracking == 0); - __ LoadRoot(r9, Heap::kUndefinedValueRootIndex); - __ lwz(r6, FieldMemOperand(r5, Map::kBitField3Offset)); - __ DecodeField(r10, r6, SetRC); - __ bne(&slack_tracking, cr0); - { - // Initialize all in-object fields with undefined. - __ InitializeFieldsWithFiller(r4, r8, r9); - __ Ret(); - } - __ bind(&slack_tracking); - { - // Decrease generous allocation count. - STATIC_ASSERT(Map::ConstructionCounter::kNext == 32); - __ Add(r6, r6, -(1 << Map::ConstructionCounter::kShift), r0); - __ stw(r6, FieldMemOperand(r5, Map::kBitField3Offset)); - - // Initialize the in-object fields with undefined. - __ lbz(r7, FieldMemOperand(r5, Map::kUnusedPropertyFieldsOffset)); - __ ShiftLeftImm(r7, r7, Operand(kPointerSizeLog2)); - __ sub(r7, r8, r7); - __ InitializeFieldsWithFiller(r4, r7, r9); - - // Initialize the remaining (reserved) fields with one pointer filler map. - __ LoadRoot(r9, Heap::kOnePointerFillerMapRootIndex); - __ InitializeFieldsWithFiller(r4, r8, r9); - - // Check if we can finalize the instance size. - __ cmpi(r10, Operand(Map::kSlackTrackingCounterEnd)); - __ Ret(ne); - - // Finalize the instance size. - { - FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); - __ Push(r3, r5); - __ CallRuntime(Runtime::kFinalizeInstanceSize); - __ Pop(r3); - } - __ Ret(); - } - - // Fall back to %AllocateInNewSpace. - __ bind(&allocate); - { - FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); - STATIC_ASSERT(kSmiTag == 0); - __ ShiftLeftImm(r7, r7, - Operand(kPointerSizeLog2 + kSmiTagSize + kSmiShiftSize)); - __ Push(r5, r7); - __ CallRuntime(Runtime::kAllocateInNewSpace); - __ Pop(r5); - } - __ lbz(r8, FieldMemOperand(r5, Map::kInstanceSizeOffset)); - __ ShiftLeftImm(r8, r8, Operand(kPointerSizeLog2)); - __ add(r8, r3, r8); - __ subi(r8, r8, Operand(kHeapObjectTag)); - __ b(&done_allocate); - - // Fall back to %NewObject. - __ bind(&new_object); - __ Push(r4, r6); - __ TailCallRuntime(Runtime::kNewObject); -} - void FastNewRestParameterStub::Generate(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- r4 : function diff --git a/src/ppc/interface-descriptors-ppc.cc b/src/ppc/interface-descriptors-ppc.cc index 74ad56405f..a7790ac9e9 100644 --- a/src/ppc/interface-descriptors-ppc.cc +++ b/src/ppc/interface-descriptors-ppc.cc @@ -67,12 +67,6 @@ void FastNewClosureDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } -void FastNewObjectDescriptor::InitializePlatformSpecific( - CallInterfaceDescriptorData* data) { - Register registers[] = {r4, r6}; - data->InitializePlatformSpecific(arraysize(registers), registers); -} - void FastNewRestParameterDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { Register registers[] = {r4}; diff --git a/src/s390/code-stubs-s390.cc b/src/s390/code-stubs-s390.cc index 53e3fd1397..03e1d98a03 100644 --- a/src/s390/code-stubs-s390.cc +++ b/src/s390/code-stubs-s390.cc @@ -3471,124 +3471,6 @@ void InternalArrayConstructorStub::Generate(MacroAssembler* masm) { GenerateCase(masm, FAST_ELEMENTS); } -void FastNewObjectStub::Generate(MacroAssembler* masm) { - // ----------- S t a t e ------------- - // -- r3 : target - // -- r5 : new target - // -- cp : context - // -- lr : return address - // ----------------------------------- - __ AssertFunction(r3); - __ AssertReceiver(r5); - - // Verify that the new target is a JSFunction. - Label new_object; - __ CompareObjectType(r5, r4, r4, JS_FUNCTION_TYPE); - __ bne(&new_object); - - // Load the initial map and verify that it's in fact a map. - __ LoadP(r4, FieldMemOperand(r5, JSFunction::kPrototypeOrInitialMapOffset)); - __ JumpIfSmi(r4, &new_object); - __ CompareObjectType(r4, r2, r2, MAP_TYPE); - __ bne(&new_object); - - // Fall back to runtime if the target differs from the new target's - // initial map constructor. - __ LoadP(r2, FieldMemOperand(r4, Map::kConstructorOrBackPointerOffset)); - __ CmpP(r2, r3); - __ bne(&new_object); - - // Allocate the JSObject on the heap. - Label allocate, done_allocate; - __ LoadlB(r6, FieldMemOperand(r4, Map::kInstanceSizeOffset)); - __ Allocate(r6, r2, r7, r8, &allocate, SIZE_IN_WORDS); - __ bind(&done_allocate); - - // Initialize the JSObject fields. - __ StoreP(r4, FieldMemOperand(r2, JSObject::kMapOffset)); - __ LoadRoot(r5, Heap::kEmptyFixedArrayRootIndex); - __ StoreP(r5, FieldMemOperand(r2, JSObject::kPropertiesOffset)); - __ StoreP(r5, FieldMemOperand(r2, JSObject::kElementsOffset)); - STATIC_ASSERT(JSObject::kHeaderSize == 3 * kPointerSize); - __ AddP(r3, r2, Operand(JSObject::kHeaderSize - kHeapObjectTag)); - - // ----------- S t a t e ------------- - // -- r2 : result (tagged) - // -- r3 : result fields (untagged) - // -- r7 : result end (untagged) - // -- r4 : initial map - // -- cp : context - // -- lr : return address - // ----------------------------------- - - // Perform in-object slack tracking if requested. - Label slack_tracking; - STATIC_ASSERT(Map::kNoSlackTracking == 0); - __ LoadRoot(r8, Heap::kUndefinedValueRootIndex); - __ LoadlW(r5, FieldMemOperand(r4, Map::kBitField3Offset)); - __ DecodeField(r9, r5); - __ LoadAndTestP(r9, r9); - __ bne(&slack_tracking); - { - // Initialize all in-object fields with undefined. - __ InitializeFieldsWithFiller(r3, r7, r8); - - __ Ret(); - } - __ bind(&slack_tracking); - { - // Decrease generous allocation count. - STATIC_ASSERT(Map::ConstructionCounter::kNext == 32); - __ Add32(r5, r5, Operand(-(1 << Map::ConstructionCounter::kShift))); - __ StoreW(r5, FieldMemOperand(r4, Map::kBitField3Offset)); - - // Initialize the in-object fields with undefined. - __ LoadlB(r6, FieldMemOperand(r4, Map::kUnusedPropertyFieldsOffset)); - __ ShiftLeftP(r6, r6, Operand(kPointerSizeLog2)); - __ SubP(r6, r7, r6); - __ InitializeFieldsWithFiller(r3, r6, r8); - - // Initialize the remaining (reserved) fields with one pointer filler map. - __ LoadRoot(r8, Heap::kOnePointerFillerMapRootIndex); - __ InitializeFieldsWithFiller(r3, r7, r8); - - // Check if we can finalize the instance size. - __ CmpP(r9, Operand(Map::kSlackTrackingCounterEnd)); - __ Ret(ne); - - // Finalize the instance size. - { - FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); - __ Push(r2, r4); - __ CallRuntime(Runtime::kFinalizeInstanceSize); - __ Pop(r2); - } - __ Ret(); - } - - // Fall back to %AllocateInNewSpace. - __ bind(&allocate); - { - FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); - STATIC_ASSERT(kSmiTag == 0); - __ ShiftLeftP(r6, r6, - Operand(kPointerSizeLog2 + kSmiTagSize + kSmiShiftSize)); - __ Push(r4, r6); - __ CallRuntime(Runtime::kAllocateInNewSpace); - __ Pop(r4); - } - __ LoadlB(r7, FieldMemOperand(r4, Map::kInstanceSizeOffset)); - __ ShiftLeftP(r7, r7, Operand(kPointerSizeLog2)); - __ AddP(r7, r2, r7); - __ SubP(r7, r7, Operand(kHeapObjectTag)); - __ b(&done_allocate); - - // Fall back to %NewObject. - __ bind(&new_object); - __ Push(r3, r5); - __ TailCallRuntime(Runtime::kNewObject); -} - void FastNewRestParameterStub::Generate(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- r3 : function diff --git a/src/s390/interface-descriptors-s390.cc b/src/s390/interface-descriptors-s390.cc index 7fdf99349e..8cf2306b78 100644 --- a/src/s390/interface-descriptors-s390.cc +++ b/src/s390/interface-descriptors-s390.cc @@ -65,12 +65,6 @@ void FastNewClosureDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } -void FastNewObjectDescriptor::InitializePlatformSpecific( - CallInterfaceDescriptorData* data) { - Register registers[] = {r3, r5}; - data->InitializePlatformSpecific(arraysize(registers), registers); -} - void FastNewRestParameterDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { Register registers[] = {r3};