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

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

Issue 3197011: Fixed remaining bugs in COW-regexp-results. (Closed)
Patch Set: Created 10 years, 4 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/runtime.cc ('k') | src/x64/full-codegen-x64.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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 4815 matching lines...) Expand 10 before | Expand all | Expand 10 after
4826 } 4826 }
4827 } 4827 }
4828 __ Push(Smi::FromInt(size_)); 4828 __ Push(Smi::FromInt(size_));
4829 __ CallRuntime(Runtime::kAllocateInNewSpace, 1); 4829 __ CallRuntime(Runtime::kAllocateInNewSpace, 1);
4830 if (!target_.is(rax)) { 4830 if (!target_.is(rax)) {
4831 __ movq(target_, rax); 4831 __ movq(target_, rax);
4832 } 4832 }
4833 for (int i = kNumRegs - 1; i >= 0; i--) { 4833 for (int i = kNumRegs - 1; i >= 0; i--) {
4834 if (registers_to_save_ & (1 << i)) { 4834 if (registers_to_save_ & (1 << i)) {
4835 Register save_register = { i }; 4835 Register save_register = { i };
4836 __ push(save_register); 4836 __ pop(save_register);
4837 } 4837 }
4838 } 4838 }
4839 } 4839 }
4840 4840
4841 4841
4842 void CodeGenerator::VisitRegExpLiteral(RegExpLiteral* node) { 4842 void CodeGenerator::VisitRegExpLiteral(RegExpLiteral* node) {
4843 Comment cmnt(masm_, "[ RegExp Literal"); 4843 Comment cmnt(masm_, "[ RegExp Literal");
4844 4844
4845 // Retrieve the literals array and check the allocated entry. Begin 4845 // Retrieve the literals array and check the allocated entry. Begin
4846 // with a writable copy of the function of this activation in a 4846 // with a writable copy of the function of this activation in a
(...skipping 1794 matching lines...) Expand 10 before | Expand all | Expand 10 after
6641 // which is either an unmodified JSRegExpResult or null. Anything not having 6641 // which is either an unmodified JSRegExpResult or null. Anything not having
6642 // the unmodified JSRegExpResult map is returned unmodified. 6642 // the unmodified JSRegExpResult map is returned unmodified.
6643 // This also ensures that elements are fast. 6643 // This also ensures that elements are fast.
6644 6644
6645 __ movq(rdx, ContextOperand(rsi, Context::GLOBAL_INDEX)); 6645 __ movq(rdx, ContextOperand(rsi, Context::GLOBAL_INDEX));
6646 __ movq(rdx, FieldOperand(rdx, GlobalObject::kGlobalContextOffset)); 6646 __ movq(rdx, FieldOperand(rdx, GlobalObject::kGlobalContextOffset));
6647 __ movq(rdx, ContextOperand(rdx, Context::REGEXP_RESULT_MAP_INDEX)); 6647 __ movq(rdx, ContextOperand(rdx, Context::REGEXP_RESULT_MAP_INDEX));
6648 __ cmpq(rdx, FieldOperand(rax, HeapObject::kMapOffset)); 6648 __ cmpq(rdx, FieldOperand(rax, HeapObject::kMapOffset));
6649 __ j(not_equal, &done); 6649 __ j(not_equal, &done);
6650 6650
6651 if (FLAG_debug_code) {
6652 // Check that object really has empty properties array, as the map
6653 // should guarantee.
6654 __ CompareRoot(FieldOperand(rax, JSObject::kPropertiesOffset),
6655 Heap::kEmptyFixedArrayRootIndex);
6656 __ Check(equal, "JSRegExpResult: default map but non-empty properties.");
6657 }
6658
6651 DeferredAllocateInNewSpace* allocate_fallback = 6659 DeferredAllocateInNewSpace* allocate_fallback =
6652 new DeferredAllocateInNewSpace(JSRegExpResult::kSize, 6660 new DeferredAllocateInNewSpace(JSRegExpResult::kSize,
6653 rbx, 6661 rbx,
6654 rdx.bit() | rax.bit()); 6662 rdx.bit() | rax.bit());
6655 6663
6656 // All set, copy the contents to a new object. 6664 // All set, copy the contents to a new object.
6657 __ AllocateInNewSpace(JSRegExpResult::kSize, 6665 __ AllocateInNewSpace(JSRegExpResult::kSize,
6658 rbx, 6666 rbx,
6659 no_reg, 6667 no_reg,
6660 no_reg, 6668 no_reg,
(...skipping 12 matching lines...) Expand all
6673 } 6681 }
6674 __ movq(rcx, FieldOperand(rax, i + kPointerSize)); 6682 __ movq(rcx, FieldOperand(rax, i + kPointerSize));
6675 6683
6676 STATIC_ASSERT(JSObject::kElementsOffset % (2 * kPointerSize) == 0); 6684 STATIC_ASSERT(JSObject::kElementsOffset % (2 * kPointerSize) == 0);
6677 if (i == JSObject::kElementsOffset) { 6685 if (i == JSObject::kElementsOffset) {
6678 // If the elements array isn't empty, make it copy-on-write 6686 // If the elements array isn't empty, make it copy-on-write
6679 // before copying it. 6687 // before copying it.
6680 Label empty; 6688 Label empty;
6681 __ CompareRoot(rdx, Heap::kEmptyFixedArrayRootIndex); 6689 __ CompareRoot(rdx, Heap::kEmptyFixedArrayRootIndex);
6682 __ j(equal, &empty); 6690 __ j(equal, &empty);
6683 ASSERT(!Heap::InNewSpace(Heap::fixed_cow_array_map()));
6684 __ LoadRoot(kScratchRegister, Heap::kFixedCOWArrayMapRootIndex); 6691 __ LoadRoot(kScratchRegister, Heap::kFixedCOWArrayMapRootIndex);
6685 __ movq(FieldOperand(rdx, HeapObject::kMapOffset), kScratchRegister); 6692 __ movq(FieldOperand(rdx, HeapObject::kMapOffset), kScratchRegister);
6686 __ bind(&empty); 6693 __ bind(&empty);
6687 } 6694 }
6688 __ movq(FieldOperand(rbx, i), rdx); 6695 __ movq(FieldOperand(rbx, i), rdx);
6689 __ movq(FieldOperand(rbx, i + kPointerSize), rcx); 6696 __ movq(FieldOperand(rbx, i + kPointerSize), rcx);
6690 } 6697 }
6691 __ movq(rax, rbx); 6698 __ movq(rax, rbx);
6692 6699
6693 __ bind(&done); 6700 __ bind(&done);
(...skipping 6158 matching lines...) Expand 10 before | Expand all | Expand 10 after
12852 #undef __ 12859 #undef __
12853 12860
12854 void RecordWriteStub::Generate(MacroAssembler* masm) { 12861 void RecordWriteStub::Generate(MacroAssembler* masm) {
12855 masm->RecordWriteHelper(object_, addr_, scratch_); 12862 masm->RecordWriteHelper(object_, addr_, scratch_);
12856 masm->ret(0); 12863 masm->ret(0);
12857 } 12864 }
12858 12865
12859 } } // namespace v8::internal 12866 } } // namespace v8::internal
12860 12867
12861 #endif // V8_TARGET_ARCH_X64 12868 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/runtime.cc ('k') | src/x64/full-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698