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

Side by Side Diff: src/x87/code-stubs-x87.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, 7 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/x64/macro-assembler-x64.cc ('k') | src/x87/codegen-x87.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_X87 5 #if V8_TARGET_ARCH_X87
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 4368 matching lines...) Expand 10 before | Expand all | Expand 10 after
4379 __ j(not_equal, &new_object); 4379 __ j(not_equal, &new_object);
4380 4380
4381 // Allocate the JSObject on the heap. 4381 // Allocate the JSObject on the heap.
4382 Label allocate, done_allocate; 4382 Label allocate, done_allocate;
4383 __ movzx_b(ebx, FieldOperand(ecx, Map::kInstanceSizeOffset)); 4383 __ movzx_b(ebx, FieldOperand(ecx, Map::kInstanceSizeOffset));
4384 __ lea(ebx, Operand(ebx, times_pointer_size, 0)); 4384 __ lea(ebx, Operand(ebx, times_pointer_size, 0));
4385 __ Allocate(ebx, eax, edi, no_reg, &allocate, NO_ALLOCATION_FLAGS); 4385 __ Allocate(ebx, eax, edi, no_reg, &allocate, NO_ALLOCATION_FLAGS);
4386 __ bind(&done_allocate); 4386 __ bind(&done_allocate);
4387 4387
4388 // Initialize the JSObject fields. 4388 // Initialize the JSObject fields.
4389 __ mov(Operand(eax, JSObject::kMapOffset), ecx); 4389 __ mov(FieldOperand(eax, JSObject::kMapOffset), ecx);
4390 __ mov(Operand(eax, JSObject::kPropertiesOffset), 4390 __ mov(FieldOperand(eax, JSObject::kPropertiesOffset),
4391 masm->isolate()->factory()->empty_fixed_array()); 4391 masm->isolate()->factory()->empty_fixed_array());
4392 __ mov(Operand(eax, JSObject::kElementsOffset), 4392 __ mov(FieldOperand(eax, JSObject::kElementsOffset),
4393 masm->isolate()->factory()->empty_fixed_array()); 4393 masm->isolate()->factory()->empty_fixed_array());
4394 STATIC_ASSERT(JSObject::kHeaderSize == 3 * kPointerSize); 4394 STATIC_ASSERT(JSObject::kHeaderSize == 3 * kPointerSize);
4395 __ lea(ebx, Operand(eax, JSObject::kHeaderSize)); 4395 __ lea(ebx, FieldOperand(eax, JSObject::kHeaderSize));
4396 4396
4397 // ----------- S t a t e ------------- 4397 // ----------- S t a t e -------------
4398 // -- eax : result (untagged) 4398 // -- eax : result (tagged)
4399 // -- ebx : result fields (untagged) 4399 // -- ebx : result fields (untagged)
4400 // -- edi : result end (untagged) 4400 // -- edi : result end (untagged)
4401 // -- ecx : initial map 4401 // -- ecx : initial map
4402 // -- esi : context 4402 // -- esi : context
4403 // -- esp[0] : return address 4403 // -- esp[0] : return address
4404 // ----------------------------------- 4404 // -----------------------------------
4405 4405
4406 // Perform in-object slack tracking if requested. 4406 // Perform in-object slack tracking if requested.
4407 Label slack_tracking; 4407 Label slack_tracking;
4408 STATIC_ASSERT(Map::kNoSlackTracking == 0); 4408 STATIC_ASSERT(Map::kNoSlackTracking == 0);
4409 __ test(FieldOperand(ecx, Map::kBitField3Offset), 4409 __ test(FieldOperand(ecx, Map::kBitField3Offset),
4410 Immediate(Map::ConstructionCounter::kMask)); 4410 Immediate(Map::ConstructionCounter::kMask));
4411 __ j(not_zero, &slack_tracking, Label::kNear); 4411 __ j(not_zero, &slack_tracking, Label::kNear);
4412 { 4412 {
4413 // Initialize all in-object fields with undefined. 4413 // Initialize all in-object fields with undefined.
4414 __ LoadRoot(edx, Heap::kUndefinedValueRootIndex); 4414 __ LoadRoot(edx, Heap::kUndefinedValueRootIndex);
4415 __ InitializeFieldsWithFiller(ebx, edi, edx); 4415 __ InitializeFieldsWithFiller(ebx, edi, edx);
4416
4417 // Add the object tag to make the JSObject real.
4418 STATIC_ASSERT(kHeapObjectTag == 1);
4419 __ inc(eax);
4420 __ Ret(); 4416 __ Ret();
4421 } 4417 }
4422 __ bind(&slack_tracking); 4418 __ bind(&slack_tracking);
4423 { 4419 {
4424 // Decrease generous allocation count. 4420 // Decrease generous allocation count.
4425 STATIC_ASSERT(Map::ConstructionCounter::kNext == 32); 4421 STATIC_ASSERT(Map::ConstructionCounter::kNext == 32);
4426 __ sub(FieldOperand(ecx, Map::kBitField3Offset), 4422 __ sub(FieldOperand(ecx, Map::kBitField3Offset),
4427 Immediate(1 << Map::ConstructionCounter::kShift)); 4423 Immediate(1 << Map::ConstructionCounter::kShift));
4428 4424
4429 // Initialize the in-object fields with undefined. 4425 // Initialize the in-object fields with undefined.
4430 __ movzx_b(edx, FieldOperand(ecx, Map::kUnusedPropertyFieldsOffset)); 4426 __ movzx_b(edx, FieldOperand(ecx, Map::kUnusedPropertyFieldsOffset));
4431 __ neg(edx); 4427 __ neg(edx);
4432 __ lea(edx, Operand(edi, edx, times_pointer_size, 0)); 4428 __ lea(edx, Operand(edi, edx, times_pointer_size, 0));
4433 __ LoadRoot(edi, Heap::kUndefinedValueRootIndex); 4429 __ LoadRoot(edi, Heap::kUndefinedValueRootIndex);
4434 __ InitializeFieldsWithFiller(ebx, edx, edi); 4430 __ InitializeFieldsWithFiller(ebx, edx, edi);
4435 4431
4436 // Initialize the remaining (reserved) fields with one pointer filler map. 4432 // Initialize the remaining (reserved) fields with one pointer filler map.
4437 __ movzx_b(edx, FieldOperand(ecx, Map::kUnusedPropertyFieldsOffset)); 4433 __ movzx_b(edx, FieldOperand(ecx, Map::kUnusedPropertyFieldsOffset));
4438 __ lea(edx, Operand(ebx, edx, times_pointer_size, 0)); 4434 __ lea(edx, Operand(ebx, edx, times_pointer_size, 0));
4439 __ LoadRoot(edi, Heap::kOnePointerFillerMapRootIndex); 4435 __ LoadRoot(edi, Heap::kOnePointerFillerMapRootIndex);
4440 __ InitializeFieldsWithFiller(ebx, edx, edi); 4436 __ InitializeFieldsWithFiller(ebx, edx, edi);
4441 4437
4442 // Add the object tag to make the JSObject real.
4443 STATIC_ASSERT(kHeapObjectTag == 1);
4444 __ inc(eax);
4445
4446 // Check if we can finalize the instance size. 4438 // Check if we can finalize the instance size.
4447 Label finalize; 4439 Label finalize;
4448 STATIC_ASSERT(Map::kSlackTrackingCounterEnd == 1); 4440 STATIC_ASSERT(Map::kSlackTrackingCounterEnd == 1);
4449 __ test(FieldOperand(ecx, Map::kBitField3Offset), 4441 __ test(FieldOperand(ecx, Map::kBitField3Offset),
4450 Immediate(Map::ConstructionCounter::kMask)); 4442 Immediate(Map::ConstructionCounter::kMask));
4451 __ j(zero, &finalize, Label::kNear); 4443 __ j(zero, &finalize, Label::kNear);
4452 __ Ret(); 4444 __ Ret();
4453 4445
4454 // Finalize the instance size. 4446 // Finalize the instance size.
4455 __ bind(&finalize); 4447 __ bind(&finalize);
(...skipping 10 matching lines...) Expand all
4466 // Fall back to %AllocateInNewSpace. 4458 // Fall back to %AllocateInNewSpace.
4467 __ bind(&allocate); 4459 __ bind(&allocate);
4468 { 4460 {
4469 FrameScope scope(masm, StackFrame::INTERNAL); 4461 FrameScope scope(masm, StackFrame::INTERNAL);
4470 __ SmiTag(ebx); 4462 __ SmiTag(ebx);
4471 __ Push(ecx); 4463 __ Push(ecx);
4472 __ Push(ebx); 4464 __ Push(ebx);
4473 __ CallRuntime(Runtime::kAllocateInNewSpace); 4465 __ CallRuntime(Runtime::kAllocateInNewSpace);
4474 __ Pop(ecx); 4466 __ Pop(ecx);
4475 } 4467 }
4476 STATIC_ASSERT(kHeapObjectTag == 1);
4477 __ dec(eax);
4478 __ movzx_b(ebx, FieldOperand(ecx, Map::kInstanceSizeOffset)); 4468 __ movzx_b(ebx, FieldOperand(ecx, Map::kInstanceSizeOffset));
4479 __ lea(edi, Operand(eax, ebx, times_pointer_size, 0)); 4469 __ lea(edi, Operand(eax, ebx, times_pointer_size, 0));
4470 STATIC_ASSERT(kHeapObjectTag == 1);
4471 __ dec(edi);
4480 __ jmp(&done_allocate); 4472 __ jmp(&done_allocate);
4481 4473
4482 // Fall back to %NewObject. 4474 // Fall back to %NewObject.
4483 __ bind(&new_object); 4475 __ bind(&new_object);
4484 __ PopReturnAddressTo(ecx); 4476 __ PopReturnAddressTo(ecx);
4485 __ Push(edi); 4477 __ Push(edi);
4486 __ Push(edx); 4478 __ Push(edx);
4487 __ PushReturnAddressFrom(ecx); 4479 __ PushReturnAddressFrom(ecx);
4488 __ TailCallRuntime(Runtime::kNewObject); 4480 __ TailCallRuntime(Runtime::kNewObject);
4489 } 4481 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
4532 // Return an empty rest parameter array. 4524 // Return an empty rest parameter array.
4533 __ bind(&no_rest_parameters); 4525 __ bind(&no_rest_parameters);
4534 { 4526 {
4535 // ----------- S t a t e ------------- 4527 // ----------- S t a t e -------------
4536 // -- esi : context 4528 // -- esi : context
4537 // -- esp[0] : return address 4529 // -- esp[0] : return address
4538 // ----------------------------------- 4530 // -----------------------------------
4539 4531
4540 // Allocate an empty rest parameter array. 4532 // Allocate an empty rest parameter array.
4541 Label allocate, done_allocate; 4533 Label allocate, done_allocate;
4542 __ Allocate(JSArray::kSize, eax, edx, ecx, &allocate, TAG_OBJECT); 4534 __ Allocate(JSArray::kSize, eax, edx, ecx, &allocate, NO_ALLOCATION_FLAGS);
4543 __ bind(&done_allocate); 4535 __ bind(&done_allocate);
4544 4536
4545 // Setup the rest parameter array in rax. 4537 // Setup the rest parameter array in rax.
4546 __ LoadGlobalFunction(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, ecx); 4538 __ LoadGlobalFunction(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, ecx);
4547 __ mov(FieldOperand(eax, JSArray::kMapOffset), ecx); 4539 __ mov(FieldOperand(eax, JSArray::kMapOffset), ecx);
4548 __ mov(ecx, isolate()->factory()->empty_fixed_array()); 4540 __ mov(ecx, isolate()->factory()->empty_fixed_array());
4549 __ mov(FieldOperand(eax, JSArray::kPropertiesOffset), ecx); 4541 __ mov(FieldOperand(eax, JSArray::kPropertiesOffset), ecx);
4550 __ mov(FieldOperand(eax, JSArray::kElementsOffset), ecx); 4542 __ mov(FieldOperand(eax, JSArray::kElementsOffset), ecx);
4551 __ mov(FieldOperand(eax, JSArray::kLengthOffset), 4543 __ mov(FieldOperand(eax, JSArray::kLengthOffset),
4552 Immediate(Smi::FromInt(0))); 4544 Immediate(Smi::FromInt(0)));
(...skipping 21 matching lines...) Expand all
4574 // -- esi : context 4566 // -- esi : context
4575 // -- eax : number of rest parameters (tagged) 4567 // -- eax : number of rest parameters (tagged)
4576 // -- ebx : pointer to first rest parameters 4568 // -- ebx : pointer to first rest parameters
4577 // -- esp[0] : return address 4569 // -- esp[0] : return address
4578 // ----------------------------------- 4570 // -----------------------------------
4579 4571
4580 // Allocate space for the rest parameter array plus the backing store. 4572 // Allocate space for the rest parameter array plus the backing store.
4581 Label allocate, done_allocate; 4573 Label allocate, done_allocate;
4582 __ lea(ecx, Operand(eax, times_half_pointer_size, 4574 __ lea(ecx, Operand(eax, times_half_pointer_size,
4583 JSArray::kSize + FixedArray::kHeaderSize)); 4575 JSArray::kSize + FixedArray::kHeaderSize));
4584 __ Allocate(ecx, edx, edi, no_reg, &allocate, TAG_OBJECT); 4576 __ Allocate(ecx, edx, edi, no_reg, &allocate, NO_ALLOCATION_FLAGS);
4585 __ bind(&done_allocate); 4577 __ bind(&done_allocate);
4586 4578
4587 // Setup the elements array in edx. 4579 // Setup the elements array in edx.
4588 __ mov(FieldOperand(edx, FixedArray::kMapOffset), 4580 __ mov(FieldOperand(edx, FixedArray::kMapOffset),
4589 isolate()->factory()->fixed_array_map()); 4581 isolate()->factory()->fixed_array_map());
4590 __ mov(FieldOperand(edx, FixedArray::kLengthOffset), eax); 4582 __ mov(FieldOperand(edx, FixedArray::kLengthOffset), eax);
4591 { 4583 {
4592 Label loop, done_loop; 4584 Label loop, done_loop;
4593 __ Move(ecx, Smi::FromInt(0)); 4585 __ Move(ecx, Smi::FromInt(0));
4594 __ bind(&loop); 4586 __ bind(&loop);
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
4698 __ lea(ebx, Operand(ebx, times_2, kParameterMapHeaderSize)); 4690 __ lea(ebx, Operand(ebx, times_2, kParameterMapHeaderSize));
4699 __ bind(&no_parameter_map); 4691 __ bind(&no_parameter_map);
4700 4692
4701 // 2. Backing store. 4693 // 2. Backing store.
4702 __ lea(ebx, Operand(ebx, ecx, times_2, FixedArray::kHeaderSize)); 4694 __ lea(ebx, Operand(ebx, ecx, times_2, FixedArray::kHeaderSize));
4703 4695
4704 // 3. Arguments object. 4696 // 3. Arguments object.
4705 __ add(ebx, Immediate(JSSloppyArgumentsObject::kSize)); 4697 __ add(ebx, Immediate(JSSloppyArgumentsObject::kSize));
4706 4698
4707 // Do the allocation of all three objects in one go. 4699 // Do the allocation of all three objects in one go.
4708 __ Allocate(ebx, eax, edi, no_reg, &runtime, TAG_OBJECT); 4700 __ Allocate(ebx, eax, edi, no_reg, &runtime, NO_ALLOCATION_FLAGS);
4709 4701
4710 // eax = address of new object(s) (tagged) 4702 // eax = address of new object(s) (tagged)
4711 // ecx = argument count (smi-tagged) 4703 // ecx = argument count (smi-tagged)
4712 // esp[0] = mapped parameter count (tagged) 4704 // esp[0] = mapped parameter count (tagged)
4713 // esp[4] = function 4705 // esp[4] = function
4714 // esp[8] = parameter count (tagged) 4706 // esp[8] = parameter count (tagged)
4715 // Get the arguments map from the current native context into edi. 4707 // Get the arguments map from the current native context into edi.
4716 Label has_mapped_parameters, instantiate; 4708 Label has_mapped_parameters, instantiate;
4717 __ mov(edi, NativeContextOperand()); 4709 __ mov(edi, NativeContextOperand());
4718 __ mov(ebx, Operand(esp, 0 * kPointerSize)); 4710 __ mov(ebx, Operand(esp, 0 * kPointerSize));
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
4927 // -- ebx : pointer to the first argument 4919 // -- ebx : pointer to the first argument
4928 // -- esi : context 4920 // -- esi : context
4929 // -- esp[0] : return address 4921 // -- esp[0] : return address
4930 // ----------------------------------- 4922 // -----------------------------------
4931 4923
4932 // Allocate space for the strict arguments object plus the backing store. 4924 // Allocate space for the strict arguments object plus the backing store.
4933 Label allocate, done_allocate; 4925 Label allocate, done_allocate;
4934 __ lea(ecx, 4926 __ lea(ecx,
4935 Operand(eax, times_half_pointer_size, 4927 Operand(eax, times_half_pointer_size,
4936 JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize)); 4928 JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize));
4937 __ Allocate(ecx, edx, edi, no_reg, &allocate, TAG_OBJECT); 4929 __ Allocate(ecx, edx, edi, no_reg, &allocate, NO_ALLOCATION_FLAGS);
4938 __ bind(&done_allocate); 4930 __ bind(&done_allocate);
4939 4931
4940 // Setup the elements array in edx. 4932 // Setup the elements array in edx.
4941 __ mov(FieldOperand(edx, FixedArray::kMapOffset), 4933 __ mov(FieldOperand(edx, FixedArray::kMapOffset),
4942 isolate()->factory()->fixed_array_map()); 4934 isolate()->factory()->fixed_array_map());
4943 __ mov(FieldOperand(edx, FixedArray::kLengthOffset), eax); 4935 __ mov(FieldOperand(edx, FixedArray::kLengthOffset), eax);
4944 { 4936 {
4945 Label loop, done_loop; 4937 Label loop, done_loop;
4946 __ Move(ecx, Smi::FromInt(0)); 4938 __ Move(ecx, Smi::FromInt(0));
4947 __ bind(&loop); 4939 __ bind(&loop);
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after
5514 kStackUnwindSpace, nullptr, return_value_operand, 5506 kStackUnwindSpace, nullptr, return_value_operand,
5515 NULL); 5507 NULL);
5516 } 5508 }
5517 5509
5518 #undef __ 5510 #undef __
5519 5511
5520 } // namespace internal 5512 } // namespace internal
5521 } // namespace v8 5513 } // namespace v8
5522 5514
5523 #endif // V8_TARGET_ARCH_X87 5515 #endif // V8_TARGET_ARCH_X87
OLDNEW
« no previous file with comments | « src/x64/macro-assembler-x64.cc ('k') | src/x87/codegen-x87.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698