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

Side by Side Diff: src/x64/builtins-x64.cc

Issue 596084: Fix array allocation in generated code on x64... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 10 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « src/x64/assembler-x64.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2009 the V8 project authors. All rights reserved. 1 // Copyright 2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 bool fill_with_hole, 583 bool fill_with_hole,
584 Label* gc_required) { 584 Label* gc_required) {
585 Label not_empty, allocated; 585 Label not_empty, allocated;
586 586
587 // Load the initial map from the array function. 587 // Load the initial map from the array function.
588 __ movq(elements_array, 588 __ movq(elements_array,
589 FieldOperand(array_function, 589 FieldOperand(array_function,
590 JSFunction::kPrototypeOrInitialMapOffset)); 590 JSFunction::kPrototypeOrInitialMapOffset));
591 591
592 // Check whether an empty sized array is requested. 592 // Check whether an empty sized array is requested.
593 __ SmiToInteger64(array_size, array_size);
593 __ testq(array_size, array_size); 594 __ testq(array_size, array_size);
594 __ j(not_zero, &not_empty); 595 __ j(not_zero, &not_empty);
595 596
596 // If an empty array is requested allocate a small elements array anyway. This 597 // If an empty array is requested allocate a small elements array anyway. This
597 // keeps the code below free of special casing for the empty array. 598 // keeps the code below free of special casing for the empty array.
598 int size = JSArray::kSize + FixedArray::SizeFor(kPreallocatedArrayElements); 599 int size = JSArray::kSize + FixedArray::SizeFor(kPreallocatedArrayElements);
599 __ AllocateInNewSpace(size, 600 __ AllocateInNewSpace(size,
600 result, 601 result,
601 elements_array_end, 602 elements_array_end,
602 scratch, 603 scratch,
603 gc_required, 604 gc_required,
604 TAG_OBJECT); 605 TAG_OBJECT);
605 __ jmp(&allocated); 606 __ jmp(&allocated);
606 607
607 // Allocate the JSArray object together with space for a FixedArray with the 608 // Allocate the JSArray object together with space for a FixedArray with the
608 // requested elements. 609 // requested elements.
609 __ bind(&not_empty); 610 __ bind(&not_empty);
610 ASSERT(kSmiTagSize == 1 && kSmiTag == 0); 611 ASSERT(kSmiTagSize == 1 && kSmiTag == 0);
611 __ AllocateInNewSpace(JSArray::kSize + FixedArray::kHeaderSize, 612 __ AllocateInNewSpace(JSArray::kSize + FixedArray::kHeaderSize,
612 times_half_pointer_size, // array_size is a smi. 613 times_pointer_size,
613 array_size, 614 array_size,
614 result, 615 result,
615 elements_array_end, 616 elements_array_end,
616 scratch, 617 scratch,
617 gc_required, 618 gc_required,
618 TAG_OBJECT); 619 TAG_OBJECT);
619 620
620 // Allocated the JSArray. Now initialize the fields except for the elements 621 // Allocated the JSArray. Now initialize the fields except for the elements
621 // array. 622 // array.
622 // result: JSObject 623 // result: JSObject
623 // elements_array: initial map 624 // elements_array: initial map
624 // elements_array_end: start of next object 625 // elements_array_end: start of next object
625 // array_size: size of array (smi) 626 // array_size: size of array
626 __ bind(&allocated); 627 __ bind(&allocated);
627 __ movq(FieldOperand(result, JSObject::kMapOffset), elements_array); 628 __ movq(FieldOperand(result, JSObject::kMapOffset), elements_array);
628 __ Move(elements_array, Factory::empty_fixed_array()); 629 __ Move(elements_array, Factory::empty_fixed_array());
629 __ movq(FieldOperand(result, JSArray::kPropertiesOffset), elements_array); 630 __ movq(FieldOperand(result, JSArray::kPropertiesOffset), elements_array);
630 // Field JSArray::kElementsOffset is initialized later. 631 // Field JSArray::kElementsOffset is initialized later.
631 __ movq(FieldOperand(result, JSArray::kLengthOffset), array_size); 632 __ Integer32ToSmi(scratch, array_size);
633 __ movq(FieldOperand(result, JSArray::kLengthOffset), scratch);
632 634
633 // Calculate the location of the elements array and set elements array member 635 // Calculate the location of the elements array and set elements array member
634 // of the JSArray. 636 // of the JSArray.
635 // result: JSObject 637 // result: JSObject
636 // elements_array_end: start of next object 638 // elements_array_end: start of next object
637 // array_size: size of array (smi) 639 // array_size: size of array
638 __ lea(elements_array, Operand(result, JSArray::kSize)); 640 __ lea(elements_array, Operand(result, JSArray::kSize));
639 __ movq(FieldOperand(result, JSArray::kElementsOffset), elements_array); 641 __ movq(FieldOperand(result, JSArray::kElementsOffset), elements_array);
640 642
641 // Initialize the fixed array. FixedArray length is not stored as a smi. 643 // Initialize the fixed array. FixedArray length is not stored as a smi.
642 // result: JSObject 644 // result: JSObject
643 // elements_array: elements array 645 // elements_array: elements array
644 // elements_array_end: start of next object 646 // elements_array_end: start of next object
645 // array_size: size of array (smi) 647 // array_size: size of array
646 ASSERT(kSmiTag == 0); 648 ASSERT(kSmiTag == 0);
647 __ SmiToInteger64(array_size, array_size);
648 __ Move(FieldOperand(elements_array, JSObject::kMapOffset), 649 __ Move(FieldOperand(elements_array, JSObject::kMapOffset),
649 Factory::fixed_array_map()); 650 Factory::fixed_array_map());
650 Label not_empty_2, fill_array; 651 Label not_empty_2, fill_array;
651 __ testq(array_size, array_size); 652 __ testq(array_size, array_size);
652 __ j(not_zero, &not_empty_2); 653 __ j(not_zero, &not_empty_2);
653 // Length of the FixedArray is the number of pre-allocated elements even 654 // Length of the FixedArray is the number of pre-allocated elements even
654 // though the actual JSArray has length 0. 655 // though the actual JSArray has length 0.
655 __ movq(FieldOperand(elements_array, Array::kLengthOffset), 656 __ movq(FieldOperand(elements_array, Array::kLengthOffset),
656 Immediate(kPreallocatedArrayElements)); 657 Immediate(kPreallocatedArrayElements));
657 __ jmp(&fill_array); 658 __ jmp(&fill_array);
(...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after
1290 void Builtins::Generate_JSEntryTrampoline(MacroAssembler* masm) { 1291 void Builtins::Generate_JSEntryTrampoline(MacroAssembler* masm) {
1291 Generate_JSEntryTrampolineHelper(masm, false); 1292 Generate_JSEntryTrampolineHelper(masm, false);
1292 } 1293 }
1293 1294
1294 1295
1295 void Builtins::Generate_JSConstructEntryTrampoline(MacroAssembler* masm) { 1296 void Builtins::Generate_JSConstructEntryTrampoline(MacroAssembler* masm) {
1296 Generate_JSEntryTrampolineHelper(masm, true); 1297 Generate_JSEntryTrampolineHelper(masm, true);
1297 } 1298 }
1298 1299
1299 } } // namespace v8::internal 1300 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/x64/assembler-x64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698