Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(279)

Side by Side Diff: src/ia32/code-stubs-ia32.cc

Issue 1922553002: Get rid of AllocationFlags::TAG_OBJECT (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove TAG_OBJECT from AllocationFlags Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/full-codegen/x87/full-codegen-x87.cc ('k') | src/ia32/codegen-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if V8_TARGET_ARCH_IA32 5 #if V8_TARGET_ARCH_IA32
6 6
7 #include "src/code-stubs.h" 7 #include "src/code-stubs.h"
8 #include "src/api-arguments.h" 8 #include "src/api-arguments.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 4696 matching lines...) Expand 10 before | Expand all | Expand 10 after
4707 __ j(not_equal, &new_object); 4707 __ j(not_equal, &new_object);
4708 4708
4709 // Allocate the JSObject on the heap. 4709 // Allocate the JSObject on the heap.
4710 Label allocate, done_allocate; 4710 Label allocate, done_allocate;
4711 __ movzx_b(ebx, FieldOperand(ecx, Map::kInstanceSizeOffset)); 4711 __ movzx_b(ebx, FieldOperand(ecx, Map::kInstanceSizeOffset));
4712 __ lea(ebx, Operand(ebx, times_pointer_size, 0)); 4712 __ lea(ebx, Operand(ebx, times_pointer_size, 0));
4713 __ Allocate(ebx, eax, edi, no_reg, &allocate, NO_ALLOCATION_FLAGS); 4713 __ Allocate(ebx, eax, edi, no_reg, &allocate, NO_ALLOCATION_FLAGS);
4714 __ bind(&done_allocate); 4714 __ bind(&done_allocate);
4715 4715
4716 // Initialize the JSObject fields. 4716 // Initialize the JSObject fields.
4717 __ mov(Operand(eax, JSObject::kMapOffset), ecx); 4717 __ mov(FieldOperand(eax, JSObject::kMapOffset), ecx);
4718 __ mov(Operand(eax, JSObject::kPropertiesOffset), 4718 __ mov(FieldOperand(eax, JSObject::kPropertiesOffset),
4719 masm->isolate()->factory()->empty_fixed_array()); 4719 masm->isolate()->factory()->empty_fixed_array());
4720 __ mov(Operand(eax, JSObject::kElementsOffset), 4720 __ mov(FieldOperand(eax, JSObject::kElementsOffset),
4721 masm->isolate()->factory()->empty_fixed_array()); 4721 masm->isolate()->factory()->empty_fixed_array());
4722 STATIC_ASSERT(JSObject::kHeaderSize == 3 * kPointerSize); 4722 STATIC_ASSERT(JSObject::kHeaderSize == 3 * kPointerSize);
4723 __ lea(ebx, Operand(eax, JSObject::kHeaderSize)); 4723 __ lea(ebx, FieldOperand(eax, JSObject::kHeaderSize));
4724 4724
4725 // ----------- S t a t e ------------- 4725 // ----------- S t a t e -------------
4726 // -- eax : result (untagged) 4726 // -- eax : result (tagged)
4727 // -- ebx : result fields (untagged) 4727 // -- ebx : result fields (untagged)
4728 // -- edi : result end (untagged) 4728 // -- edi : result end (untagged)
4729 // -- ecx : initial map 4729 // -- ecx : initial map
4730 // -- esi : context 4730 // -- esi : context
4731 // -- esp[0] : return address 4731 // -- esp[0] : return address
4732 // ----------------------------------- 4732 // -----------------------------------
4733 4733
4734 // Perform in-object slack tracking if requested. 4734 // Perform in-object slack tracking if requested.
4735 Label slack_tracking; 4735 Label slack_tracking;
4736 STATIC_ASSERT(Map::kNoSlackTracking == 0); 4736 STATIC_ASSERT(Map::kNoSlackTracking == 0);
4737 __ test(FieldOperand(ecx, Map::kBitField3Offset), 4737 __ test(FieldOperand(ecx, Map::kBitField3Offset),
4738 Immediate(Map::ConstructionCounter::kMask)); 4738 Immediate(Map::ConstructionCounter::kMask));
4739 __ j(not_zero, &slack_tracking, Label::kNear); 4739 __ j(not_zero, &slack_tracking, Label::kNear);
4740 { 4740 {
4741 // Initialize all in-object fields with undefined. 4741 // Initialize all in-object fields with undefined.
4742 __ LoadRoot(edx, Heap::kUndefinedValueRootIndex); 4742 __ LoadRoot(edx, Heap::kUndefinedValueRootIndex);
4743 __ InitializeFieldsWithFiller(ebx, edi, edx); 4743 __ InitializeFieldsWithFiller(ebx, edi, edx);
4744
4745 // Add the object tag to make the JSObject real.
4746 STATIC_ASSERT(kHeapObjectTag == 1);
4747 __ inc(eax);
4748 __ Ret(); 4744 __ Ret();
4749 } 4745 }
4750 __ bind(&slack_tracking); 4746 __ bind(&slack_tracking);
4751 { 4747 {
4752 // Decrease generous allocation count. 4748 // Decrease generous allocation count.
4753 STATIC_ASSERT(Map::ConstructionCounter::kNext == 32); 4749 STATIC_ASSERT(Map::ConstructionCounter::kNext == 32);
4754 __ sub(FieldOperand(ecx, Map::kBitField3Offset), 4750 __ sub(FieldOperand(ecx, Map::kBitField3Offset),
4755 Immediate(1 << Map::ConstructionCounter::kShift)); 4751 Immediate(1 << Map::ConstructionCounter::kShift));
4756 4752
4757 // Initialize the in-object fields with undefined. 4753 // Initialize the in-object fields with undefined.
4758 __ movzx_b(edx, FieldOperand(ecx, Map::kUnusedPropertyFieldsOffset)); 4754 __ movzx_b(edx, FieldOperand(ecx, Map::kUnusedPropertyFieldsOffset));
4759 __ neg(edx); 4755 __ neg(edx);
4760 __ lea(edx, Operand(edi, edx, times_pointer_size, 0)); 4756 __ lea(edx, Operand(edi, edx, times_pointer_size, 0));
4761 __ LoadRoot(edi, Heap::kUndefinedValueRootIndex); 4757 __ LoadRoot(edi, Heap::kUndefinedValueRootIndex);
4762 __ InitializeFieldsWithFiller(ebx, edx, edi); 4758 __ InitializeFieldsWithFiller(ebx, edx, edi);
4763 4759
4764 // Initialize the remaining (reserved) fields with one pointer filler map. 4760 // Initialize the remaining (reserved) fields with one pointer filler map.
4765 __ movzx_b(edx, FieldOperand(ecx, Map::kUnusedPropertyFieldsOffset)); 4761 __ movzx_b(edx, FieldOperand(ecx, Map::kUnusedPropertyFieldsOffset));
4766 __ lea(edx, Operand(ebx, edx, times_pointer_size, 0)); 4762 __ lea(edx, Operand(ebx, edx, times_pointer_size, 0));
4767 __ LoadRoot(edi, Heap::kOnePointerFillerMapRootIndex); 4763 __ LoadRoot(edi, Heap::kOnePointerFillerMapRootIndex);
4768 __ InitializeFieldsWithFiller(ebx, edx, edi); 4764 __ InitializeFieldsWithFiller(ebx, edx, edi);
4769 4765
4770 // Add the object tag to make the JSObject real.
4771 STATIC_ASSERT(kHeapObjectTag == 1);
4772 __ inc(eax);
4773
4774 // Check if we can finalize the instance size. 4766 // Check if we can finalize the instance size.
4775 Label finalize; 4767 Label finalize;
4776 STATIC_ASSERT(Map::kSlackTrackingCounterEnd == 1); 4768 STATIC_ASSERT(Map::kSlackTrackingCounterEnd == 1);
4777 __ test(FieldOperand(ecx, Map::kBitField3Offset), 4769 __ test(FieldOperand(ecx, Map::kBitField3Offset),
4778 Immediate(Map::ConstructionCounter::kMask)); 4770 Immediate(Map::ConstructionCounter::kMask));
4779 __ j(zero, &finalize, Label::kNear); 4771 __ j(zero, &finalize, Label::kNear);
4780 __ Ret(); 4772 __ Ret();
4781 4773
4782 // Finalize the instance size. 4774 // Finalize the instance size.
4783 __ bind(&finalize); 4775 __ bind(&finalize);
(...skipping 10 matching lines...) Expand all
4794 // Fall back to %AllocateInNewSpace. 4786 // Fall back to %AllocateInNewSpace.
4795 __ bind(&allocate); 4787 __ bind(&allocate);
4796 { 4788 {
4797 FrameScope scope(masm, StackFrame::INTERNAL); 4789 FrameScope scope(masm, StackFrame::INTERNAL);
4798 __ SmiTag(ebx); 4790 __ SmiTag(ebx);
4799 __ Push(ecx); 4791 __ Push(ecx);
4800 __ Push(ebx); 4792 __ Push(ebx);
4801 __ CallRuntime(Runtime::kAllocateInNewSpace); 4793 __ CallRuntime(Runtime::kAllocateInNewSpace);
4802 __ Pop(ecx); 4794 __ Pop(ecx);
4803 } 4795 }
4804 STATIC_ASSERT(kHeapObjectTag == 1);
4805 __ dec(eax);
4806 __ movzx_b(ebx, FieldOperand(ecx, Map::kInstanceSizeOffset)); 4796 __ movzx_b(ebx, FieldOperand(ecx, Map::kInstanceSizeOffset));
4807 __ lea(edi, Operand(eax, ebx, times_pointer_size, 0)); 4797 __ lea(edi, Operand(eax, ebx, times_pointer_size, 0));
4798 STATIC_ASSERT(kHeapObjectTag == 1);
4799 __ dec(edi);
4808 __ jmp(&done_allocate); 4800 __ jmp(&done_allocate);
4809 4801
4810 // Fall back to %NewObject. 4802 // Fall back to %NewObject.
4811 __ bind(&new_object); 4803 __ bind(&new_object);
4812 __ PopReturnAddressTo(ecx); 4804 __ PopReturnAddressTo(ecx);
4813 __ Push(edi); 4805 __ Push(edi);
4814 __ Push(edx); 4806 __ Push(edx);
4815 __ PushReturnAddressFrom(ecx); 4807 __ PushReturnAddressFrom(ecx);
4816 __ TailCallRuntime(Runtime::kNewObject); 4808 __ TailCallRuntime(Runtime::kNewObject);
4817 } 4809 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
4861 // Return an empty rest parameter array. 4853 // Return an empty rest parameter array.
4862 __ bind(&no_rest_parameters); 4854 __ bind(&no_rest_parameters);
4863 { 4855 {
4864 // ----------- S t a t e ------------- 4856 // ----------- S t a t e -------------
4865 // -- esi : context 4857 // -- esi : context
4866 // -- esp[0] : return address 4858 // -- esp[0] : return address
4867 // ----------------------------------- 4859 // -----------------------------------
4868 4860
4869 // Allocate an empty rest parameter array. 4861 // Allocate an empty rest parameter array.
4870 Label allocate, done_allocate; 4862 Label allocate, done_allocate;
4871 __ Allocate(JSArray::kSize, eax, edx, ecx, &allocate, TAG_OBJECT); 4863 __ Allocate(JSArray::kSize, eax, edx, ecx, &allocate, NO_ALLOCATION_FLAGS);
4872 __ bind(&done_allocate); 4864 __ bind(&done_allocate);
4873 4865
4874 // Setup the rest parameter array in rax. 4866 // Setup the rest parameter array in rax.
4875 __ LoadGlobalFunction(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, ecx); 4867 __ LoadGlobalFunction(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, ecx);
4876 __ mov(FieldOperand(eax, JSArray::kMapOffset), ecx); 4868 __ mov(FieldOperand(eax, JSArray::kMapOffset), ecx);
4877 __ mov(ecx, isolate()->factory()->empty_fixed_array()); 4869 __ mov(ecx, isolate()->factory()->empty_fixed_array());
4878 __ mov(FieldOperand(eax, JSArray::kPropertiesOffset), ecx); 4870 __ mov(FieldOperand(eax, JSArray::kPropertiesOffset), ecx);
4879 __ mov(FieldOperand(eax, JSArray::kElementsOffset), ecx); 4871 __ mov(FieldOperand(eax, JSArray::kElementsOffset), ecx);
4880 __ mov(FieldOperand(eax, JSArray::kLengthOffset), 4872 __ mov(FieldOperand(eax, JSArray::kLengthOffset),
4881 Immediate(Smi::FromInt(0))); 4873 Immediate(Smi::FromInt(0)));
(...skipping 21 matching lines...) Expand all
4903 // -- esi : context 4895 // -- esi : context
4904 // -- eax : number of rest parameters (tagged) 4896 // -- eax : number of rest parameters (tagged)
4905 // -- ebx : pointer to first rest parameters 4897 // -- ebx : pointer to first rest parameters
4906 // -- esp[0] : return address 4898 // -- esp[0] : return address
4907 // ----------------------------------- 4899 // -----------------------------------
4908 4900
4909 // Allocate space for the rest parameter array plus the backing store. 4901 // Allocate space for the rest parameter array plus the backing store.
4910 Label allocate, done_allocate; 4902 Label allocate, done_allocate;
4911 __ lea(ecx, Operand(eax, times_half_pointer_size, 4903 __ lea(ecx, Operand(eax, times_half_pointer_size,
4912 JSArray::kSize + FixedArray::kHeaderSize)); 4904 JSArray::kSize + FixedArray::kHeaderSize));
4913 __ Allocate(ecx, edx, edi, no_reg, &allocate, TAG_OBJECT); 4905 __ Allocate(ecx, edx, edi, no_reg, &allocate, NO_ALLOCATION_FLAGS);
4914 __ bind(&done_allocate); 4906 __ bind(&done_allocate);
4915 4907
4916 // Setup the elements array in edx. 4908 // Setup the elements array in edx.
4917 __ mov(FieldOperand(edx, FixedArray::kMapOffset), 4909 __ mov(FieldOperand(edx, FixedArray::kMapOffset),
4918 isolate()->factory()->fixed_array_map()); 4910 isolate()->factory()->fixed_array_map());
4919 __ mov(FieldOperand(edx, FixedArray::kLengthOffset), eax); 4911 __ mov(FieldOperand(edx, FixedArray::kLengthOffset), eax);
4920 { 4912 {
4921 Label loop, done_loop; 4913 Label loop, done_loop;
4922 __ Move(ecx, Smi::FromInt(0)); 4914 __ Move(ecx, Smi::FromInt(0));
4923 __ bind(&loop); 4915 __ bind(&loop);
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
5043 __ lea(ebx, Operand(ebx, times_2, kParameterMapHeaderSize)); 5035 __ lea(ebx, Operand(ebx, times_2, kParameterMapHeaderSize));
5044 __ bind(&no_parameter_map); 5036 __ bind(&no_parameter_map);
5045 5037
5046 // 2. Backing store. 5038 // 2. Backing store.
5047 __ lea(ebx, Operand(ebx, ecx, times_2, FixedArray::kHeaderSize)); 5039 __ lea(ebx, Operand(ebx, ecx, times_2, FixedArray::kHeaderSize));
5048 5040
5049 // 3. Arguments object. 5041 // 3. Arguments object.
5050 __ add(ebx, Immediate(JSSloppyArgumentsObject::kSize)); 5042 __ add(ebx, Immediate(JSSloppyArgumentsObject::kSize));
5051 5043
5052 // Do the allocation of all three objects in one go. 5044 // Do the allocation of all three objects in one go.
5053 __ Allocate(ebx, eax, edi, no_reg, &runtime, TAG_OBJECT); 5045 __ Allocate(ebx, eax, edi, no_reg, &runtime, NO_ALLOCATION_FLAGS);
5054 5046
5055 // eax = address of new object(s) (tagged) 5047 // eax = address of new object(s) (tagged)
5056 // ecx = argument count (smi-tagged) 5048 // ecx = argument count (smi-tagged)
5057 // esp[0] = mapped parameter count (tagged) 5049 // esp[0] = mapped parameter count (tagged)
5058 // esp[4] = function 5050 // esp[4] = function
5059 // esp[8] = parameter count (tagged) 5051 // esp[8] = parameter count (tagged)
5060 // Get the arguments map from the current native context into edi. 5052 // Get the arguments map from the current native context into edi.
5061 Label has_mapped_parameters, instantiate; 5053 Label has_mapped_parameters, instantiate;
5062 __ mov(edi, NativeContextOperand()); 5054 __ mov(edi, NativeContextOperand());
5063 __ mov(ebx, Operand(esp, 0 * kPointerSize)); 5055 __ mov(ebx, Operand(esp, 0 * kPointerSize));
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
5273 // -- ebx : pointer to the first argument 5265 // -- ebx : pointer to the first argument
5274 // -- esi : context 5266 // -- esi : context
5275 // -- esp[0] : return address 5267 // -- esp[0] : return address
5276 // ----------------------------------- 5268 // -----------------------------------
5277 5269
5278 // Allocate space for the strict arguments object plus the backing store. 5270 // Allocate space for the strict arguments object plus the backing store.
5279 Label allocate, done_allocate; 5271 Label allocate, done_allocate;
5280 __ lea(ecx, 5272 __ lea(ecx,
5281 Operand(eax, times_half_pointer_size, 5273 Operand(eax, times_half_pointer_size,
5282 JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize)); 5274 JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize));
5283 __ Allocate(ecx, edx, edi, no_reg, &allocate, TAG_OBJECT); 5275 __ Allocate(ecx, edx, edi, no_reg, &allocate, NO_ALLOCATION_FLAGS);
5284 __ bind(&done_allocate); 5276 __ bind(&done_allocate);
5285 5277
5286 // Setup the elements array in edx. 5278 // Setup the elements array in edx.
5287 __ mov(FieldOperand(edx, FixedArray::kMapOffset), 5279 __ mov(FieldOperand(edx, FixedArray::kMapOffset),
5288 isolate()->factory()->fixed_array_map()); 5280 isolate()->factory()->fixed_array_map());
5289 __ mov(FieldOperand(edx, FixedArray::kLengthOffset), eax); 5281 __ mov(FieldOperand(edx, FixedArray::kLengthOffset), eax);
5290 { 5282 {
5291 Label loop, done_loop; 5283 Label loop, done_loop;
5292 __ Move(ecx, Smi::FromInt(0)); 5284 __ Move(ecx, Smi::FromInt(0));
5293 __ bind(&loop); 5285 __ bind(&loop);
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
5861 kStackUnwindSpace, nullptr, return_value_operand, 5853 kStackUnwindSpace, nullptr, return_value_operand,
5862 NULL); 5854 NULL);
5863 } 5855 }
5864 5856
5865 #undef __ 5857 #undef __
5866 5858
5867 } // namespace internal 5859 } // namespace internal
5868 } // namespace v8 5860 } // namespace v8
5869 5861
5870 #endif // V8_TARGET_ARCH_IA32 5862 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/full-codegen/x87/full-codegen-x87.cc ('k') | src/ia32/codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698