| OLD | NEW | 
|---|
| 1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "vm/globals.h" | 5 #include "vm/globals.h" | 
| 6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) | 
| 7 | 7 | 
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" | 
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" | 
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" | 
| (...skipping 975 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 986   // Update the tags that this object has been remembered. | 986   // Update the tags that this object has been remembered. | 
| 987   // RDX: Address being stored | 987   // RDX: Address being stored | 
| 988   // RAX: Current tag value | 988   // RAX: Current tag value | 
| 989   __ Bind(&add_to_buffer); | 989   __ Bind(&add_to_buffer); | 
| 990   __ movq(RCX, RAX); | 990   __ movq(RCX, RAX); | 
| 991   __ orq(RCX, Immediate(1 << RawObject::kRememberedBit)); | 991   __ orq(RCX, Immediate(1 << RawObject::kRememberedBit)); | 
| 992   // Compare the tag word with RAX, update to RCX if unchanged. | 992   // Compare the tag word with RAX, update to RCX if unchanged. | 
| 993   __ LockCmpxchgq(FieldAddress(RDX, Object::tags_offset()), RCX); | 993   __ LockCmpxchgq(FieldAddress(RDX, Object::tags_offset()), RCX); | 
| 994   __ j(NOT_EQUAL, &reload); | 994   __ j(NOT_EQUAL, &reload); | 
| 995 | 995 | 
| 996   // Load the isolate. | 996   // Load the StoreBuffer block out of the thread. Then load top_ out of the | 
| 997   // RDX: Address being stored |  | 
| 998   __ LoadIsolate(RAX); |  | 
| 999 |  | 
| 1000   // Load the StoreBuffer block out of the isolate. Then load top_ out of the |  | 
| 1001   // StoreBufferBlock and add the address to the pointers_. | 997   // StoreBufferBlock and add the address to the pointers_. | 
| 1002   // RDX: Address being stored | 998   // RDX: Address being stored | 
| 1003   // RAX: Isolate | 999   __ movq(RAX, Address(THR, Thread::store_buffer_block_offset())); | 
| 1004   __ movq(RAX, Address(RAX, Isolate::store_buffer_offset())); |  | 
| 1005   __ movl(RCX, Address(RAX, StoreBufferBlock::top_offset())); | 1000   __ movl(RCX, Address(RAX, StoreBufferBlock::top_offset())); | 
| 1006   __ movq(Address(RAX, RCX, TIMES_8, StoreBufferBlock::pointers_offset()), RDX); | 1001   __ movq(Address(RAX, RCX, TIMES_8, StoreBufferBlock::pointers_offset()), RDX); | 
| 1007 | 1002 | 
| 1008   // Increment top_ and check for overflow. | 1003   // Increment top_ and check for overflow. | 
| 1009   // RCX: top_ | 1004   // RCX: top_ | 
| 1010   // RAX: StoreBufferBlock | 1005   // RAX: StoreBufferBlock | 
| 1011   Label L; | 1006   Label L; | 
| 1012   __ incq(RCX); | 1007   __ incq(RCX); | 
| 1013   __ movl(Address(RAX, StoreBufferBlock::top_offset()), RCX); | 1008   __ movl(Address(RAX, StoreBufferBlock::top_offset()), RCX); | 
| 1014   __ cmpl(RCX, Immediate(StoreBufferBlock::kSize)); | 1009   __ cmpl(RCX, Immediate(StoreBufferBlock::kSize)); | 
| 1015   // Restore values. | 1010   // Restore values. | 
| 1016   __ popq(RCX); | 1011   __ popq(RCX); | 
| 1017   __ popq(RAX); | 1012   __ popq(RAX); | 
| 1018   __ j(EQUAL, &L, Assembler::kNearJump); | 1013   __ j(EQUAL, &L, Assembler::kNearJump); | 
| 1019   __ ret(); | 1014   __ ret(); | 
| 1020 | 1015 | 
| 1021   // Handle overflow: Call the runtime leaf function. | 1016   // Handle overflow: Call the runtime leaf function. | 
| 1022   __ Bind(&L); | 1017   __ Bind(&L); | 
| 1023   // Setup frame, push callee-saved registers. | 1018   // Setup frame, push callee-saved registers. | 
| 1024   __ EnterCallRuntimeFrame(0); | 1019   __ EnterCallRuntimeFrame(0); | 
| 1025   __ LoadIsolate(CallingConventions::kArg1Reg); | 1020   __ movq(CallingConventions::kArg1Reg, THR); | 
| 1026   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1); | 1021   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1); | 
| 1027   __ LeaveCallRuntimeFrame(); | 1022   __ LeaveCallRuntimeFrame(); | 
| 1028   __ ret(); | 1023   __ ret(); | 
| 1029 } | 1024 } | 
| 1030 | 1025 | 
| 1031 | 1026 | 
| 1032 // Called for inline allocation of objects. | 1027 // Called for inline allocation of objects. | 
| 1033 // Input parameters: | 1028 // Input parameters: | 
| 1034 //   RSP + 8 : type arguments object (only if class is parameterized). | 1029 //   RSP + 8 : type arguments object (only if class is parameterized). | 
| 1035 //   RSP : points to return address. | 1030 //   RSP : points to return address. | 
| (...skipping 1104 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2140 // Result: | 2135 // Result: | 
| 2141 //  RCX: entry point. | 2136 //  RCX: entry point. | 
| 2142 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { | 2137 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { | 
| 2143   EmitMegamorphicLookup(assembler, RDI, RBX, RCX); | 2138   EmitMegamorphicLookup(assembler, RDI, RBX, RCX); | 
| 2144   __ ret(); | 2139   __ ret(); | 
| 2145 } | 2140 } | 
| 2146 | 2141 | 
| 2147 }  // namespace dart | 2142 }  // namespace dart | 
| 2148 | 2143 | 
| 2149 #endif  // defined TARGET_ARCH_X64 | 2144 #endif  // defined TARGET_ARCH_X64 | 
| OLD | NEW | 
|---|