| OLD | NEW |
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-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 711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 // Load address of new object into result. | 722 // Load address of new object into result. |
| 723 LoadAllocationTopHelper(result, result_end, scratch, flags); | 723 LoadAllocationTopHelper(result, result_end, scratch, flags); |
| 724 | 724 |
| 725 // Calculate new top and bail out if new space is exhausted. | 725 // Calculate new top and bail out if new space is exhausted. |
| 726 ExternalReference new_space_allocation_limit = | 726 ExternalReference new_space_allocation_limit = |
| 727 ExternalReference::new_space_allocation_limit_address(); | 727 ExternalReference::new_space_allocation_limit_address(); |
| 728 lea(result_end, Operand(result, object_size)); | 728 lea(result_end, Operand(result, object_size)); |
| 729 cmp(result_end, Operand::StaticVariable(new_space_allocation_limit)); | 729 cmp(result_end, Operand::StaticVariable(new_space_allocation_limit)); |
| 730 j(above, gc_required, not_taken); | 730 j(above, gc_required, not_taken); |
| 731 | 731 |
| 732 // Update allocation top. |
| 733 UpdateAllocationTopHelper(result_end, scratch); |
| 734 |
| 732 // Tag result if requested. | 735 // Tag result if requested. |
| 733 if ((flags & TAG_OBJECT) != 0) { | 736 if ((flags & TAG_OBJECT) != 0) { |
| 734 or_(Operand(result), Immediate(kHeapObjectTag)); | 737 or_(Operand(result), Immediate(kHeapObjectTag)); |
| 735 } | 738 } |
| 736 | |
| 737 // Update allocation top. | |
| 738 UpdateAllocationTopHelper(result_end, scratch); | |
| 739 } | 739 } |
| 740 | 740 |
| 741 | 741 |
| 742 void MacroAssembler::AllocateInNewSpace(int header_size, | 742 void MacroAssembler::AllocateInNewSpace(int header_size, |
| 743 ScaleFactor element_size, | 743 ScaleFactor element_size, |
| 744 Register element_count, | 744 Register element_count, |
| 745 Register result, | 745 Register result, |
| 746 Register result_end, | 746 Register result_end, |
| 747 Register scratch, | 747 Register scratch, |
| 748 Label* gc_required, | 748 Label* gc_required, |
| 749 AllocationFlags flags) { | 749 AllocationFlags flags) { |
| 750 ASSERT(!result.is(result_end)); | 750 ASSERT(!result.is(result_end)); |
| 751 | 751 |
| 752 // Load address of new object into result. | 752 // Load address of new object into result. |
| 753 LoadAllocationTopHelper(result, result_end, scratch, flags); | 753 LoadAllocationTopHelper(result, result_end, scratch, flags); |
| 754 | 754 |
| 755 // Calculate new top and bail out if new space is exhausted. | 755 // Calculate new top and bail out if new space is exhausted. |
| 756 ExternalReference new_space_allocation_limit = | 756 ExternalReference new_space_allocation_limit = |
| 757 ExternalReference::new_space_allocation_limit_address(); | 757 ExternalReference::new_space_allocation_limit_address(); |
| 758 lea(result_end, Operand(result, element_count, element_size, header_size)); | 758 lea(result_end, Operand(result, element_count, element_size, header_size)); |
| 759 cmp(result_end, Operand::StaticVariable(new_space_allocation_limit)); | 759 cmp(result_end, Operand::StaticVariable(new_space_allocation_limit)); |
| 760 j(above, gc_required); | 760 j(above, gc_required); |
| 761 | 761 |
| 762 // Update allocation top. |
| 763 UpdateAllocationTopHelper(result_end, scratch); |
| 764 |
| 762 // Tag result if requested. | 765 // Tag result if requested. |
| 763 if ((flags & TAG_OBJECT) != 0) { | 766 if ((flags & TAG_OBJECT) != 0) { |
| 764 or_(Operand(result), Immediate(kHeapObjectTag)); | 767 or_(Operand(result), Immediate(kHeapObjectTag)); |
| 765 } | 768 } |
| 766 | |
| 767 // Update allocation top. | |
| 768 UpdateAllocationTopHelper(result_end, scratch); | |
| 769 } | 769 } |
| 770 | 770 |
| 771 | 771 |
| 772 void MacroAssembler::AllocateInNewSpace(Register object_size, | 772 void MacroAssembler::AllocateInNewSpace(Register object_size, |
| 773 Register result, | 773 Register result, |
| 774 Register result_end, | 774 Register result_end, |
| 775 Register scratch, | 775 Register scratch, |
| 776 Label* gc_required, | 776 Label* gc_required, |
| 777 AllocationFlags flags) { | 777 AllocationFlags flags) { |
| 778 ASSERT(!result.is(result_end)); | 778 ASSERT(!result.is(result_end)); |
| 779 | 779 |
| 780 // Load address of new object into result. | 780 // Load address of new object into result. |
| 781 LoadAllocationTopHelper(result, result_end, scratch, flags); | 781 LoadAllocationTopHelper(result, result_end, scratch, flags); |
| 782 | 782 |
| 783 // Calculate new top and bail out if new space is exhausted. | 783 // Calculate new top and bail out if new space is exhausted. |
| 784 ExternalReference new_space_allocation_limit = | 784 ExternalReference new_space_allocation_limit = |
| 785 ExternalReference::new_space_allocation_limit_address(); | 785 ExternalReference::new_space_allocation_limit_address(); |
| 786 if (!object_size.is(result_end)) { | 786 if (!object_size.is(result_end)) { |
| 787 mov(result_end, object_size); | 787 mov(result_end, object_size); |
| 788 } | 788 } |
| 789 add(result_end, Operand(result)); | 789 add(result_end, Operand(result)); |
| 790 cmp(result_end, Operand::StaticVariable(new_space_allocation_limit)); | 790 cmp(result_end, Operand::StaticVariable(new_space_allocation_limit)); |
| 791 j(above, gc_required, not_taken); | 791 j(above, gc_required, not_taken); |
| 792 | 792 |
| 793 // Update allocation top. |
| 794 UpdateAllocationTopHelper(result_end, scratch); |
| 795 |
| 793 // Tag result if requested. | 796 // Tag result if requested. |
| 794 if ((flags & TAG_OBJECT) != 0) { | 797 if ((flags & TAG_OBJECT) != 0) { |
| 795 or_(Operand(result), Immediate(kHeapObjectTag)); | 798 or_(Operand(result), Immediate(kHeapObjectTag)); |
| 796 } | 799 } |
| 797 | |
| 798 // Update allocation top. | |
| 799 UpdateAllocationTopHelper(result_end, scratch); | |
| 800 } | 800 } |
| 801 | 801 |
| 802 | 802 |
| 803 void MacroAssembler::UndoAllocationInNewSpace(Register object) { | 803 void MacroAssembler::UndoAllocationInNewSpace(Register object) { |
| 804 ExternalReference new_space_allocation_top = | 804 ExternalReference new_space_allocation_top = |
| 805 ExternalReference::new_space_allocation_top_address(); | 805 ExternalReference::new_space_allocation_top_address(); |
| 806 | 806 |
| 807 // Make sure the object has no tag before resetting top. | 807 // Make sure the object has no tag before resetting top. |
| 808 and_(Operand(object), Immediate(~kHeapObjectTagMask)); | 808 and_(Operand(object), Immediate(~kHeapObjectTagMask)); |
| 809 #ifdef DEBUG | 809 #ifdef DEBUG |
| (...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1497 // Indicate that code has changed. | 1497 // Indicate that code has changed. |
| 1498 CPU::FlushICache(address_, size_); | 1498 CPU::FlushICache(address_, size_); |
| 1499 | 1499 |
| 1500 // Check that the code was patched as expected. | 1500 // Check that the code was patched as expected. |
| 1501 ASSERT(masm_.pc_ == address_ + size_); | 1501 ASSERT(masm_.pc_ == address_ + size_); |
| 1502 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); | 1502 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); |
| 1503 } | 1503 } |
| 1504 | 1504 |
| 1505 | 1505 |
| 1506 } } // namespace v8::internal | 1506 } } // namespace v8::internal |
| OLD | NEW |