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

Side by Side Diff: runtime/vm/stub_code_mips.cc

Issue 14307013: - Remember the fact that an object has been added to the (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/stub_code_ia32.cc ('k') | runtime/vm/stub_code_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 (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_MIPS) 6 #if defined(TARGET_ARCH_MIPS)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/code_generator.h" 9 #include "vm/code_generator.h"
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 966 matching lines...) Expand 10 before | Expand all | Expand 10 after
977 // Input parameters: 977 // Input parameters:
978 // T0: Address (i.e. object) being stored into. 978 // T0: Address (i.e. object) being stored into.
979 void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) { 979 void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) {
980 // Save values being destroyed. 980 // Save values being destroyed.
981 __ TraceSimMsg("UpdateStoreBufferStub"); 981 __ TraceSimMsg("UpdateStoreBufferStub");
982 __ addiu(SP, SP, Immediate(-3 * kWordSize)); 982 __ addiu(SP, SP, Immediate(-3 * kWordSize));
983 __ sw(T3, Address(SP, 2 * kWordSize)); 983 __ sw(T3, Address(SP, 2 * kWordSize));
984 __ sw(T2, Address(SP, 1 * kWordSize)); 984 __ sw(T2, Address(SP, 1 * kWordSize));
985 __ sw(T1, Address(SP, 0 * kWordSize)); 985 __ sw(T1, Address(SP, 0 * kWordSize));
986 986
987 Label add_to_buffer;
988 // Check whether this object has already been remembered. Skip adding to the
989 // store buffer if the object is in the store buffer already.
990 // Spilled: T1, T2, T3.
991 // T0: Address being stored.
992 __ lw(T2, FieldAddress(T0, Object::tags_offset()));
993 __ andi(T1, T2, Immediate(1 << RawObject::kRememberedBit));
994 __ beq(T1, ZR, &add_to_buffer);
995 __ lw(T1, Address(SP, 0 * kWordSize));
996 __ lw(T2, Address(SP, 1 * kWordSize));
997 __ lw(T3, Address(SP, 2 * kWordSize));
998 __ addiu(SP, SP, Immediate(3 * kWordSize));
999 __ Ret();
1000
1001 __ Bind(&add_to_buffer);
1002 __ ori(T2, T2, Immediate(1 << RawObject::kRememberedBit));
1003 __ sw(T2, FieldAddress(T0, Object::tags_offset()));
1004
987 // Load the isolate out of the context. 1005 // Load the isolate out of the context.
988 // Spilled: T1, T2, T3. 1006 // Spilled: T1, T2, T3.
989 // T0: Address being stored. 1007 // T0: Address being stored.
990 __ lw(T1, FieldAddress(CTX, Context::isolate_offset())); 1008 __ lw(T1, FieldAddress(CTX, Context::isolate_offset()));
991 1009
992 // Load top_ out of the StoreBufferBlock and add the address to the pointers_. 1010 // Load the StoreBuffer block out of the isolate. Then load top_ out of the
1011 // StoreBufferBlock and add the address to the pointers_.
993 // T1: Isolate. 1012 // T1: Isolate.
994 intptr_t store_buffer_offset = Isolate::store_buffer_block_offset(); 1013 __ lw(T1, Address(T1, Isolate::store_buffer_offset()));
995 __ lw(T2, Address(T1, store_buffer_offset + StoreBufferBlock::top_offset())); 1014 __ lw(T2, Address(T1, StoreBufferBlock::top_offset()));
996 __ sll(T3, T2, 2); 1015 __ sll(T3, T2, 2);
997 __ addu(T3, T1, T3); 1016 __ addu(T3, T1, T3);
998 __ sw(T0, 1017 __ sw(T0, Address(T3, StoreBufferBlock::pointers_offset()));
999 Address(T3, store_buffer_offset + StoreBufferBlock::pointers_offset()));
1000 1018
1001 // Increment top_ and check for overflow. 1019 // Increment top_ and check for overflow.
1002 // T2: top_ 1020 // T2: top_
1003 // T1: Isolate 1021 // T1: StoreBufferBlock
1004 Label L; 1022 Label L;
1005 __ AddImmediate(T2, 1); 1023 __ AddImmediate(T2, 1);
1006 __ sw(T2, Address(T1, store_buffer_offset + StoreBufferBlock::top_offset())); 1024 __ sw(T2, Address(T1, StoreBufferBlock::top_offset()));
1007 __ addiu(CMPRES, T2, Immediate(-StoreBufferBlock::kSize)); 1025 __ addiu(CMPRES, T2, Immediate(-StoreBufferBlock::kSize));
1008 // Restore values. 1026 // Restore values.
1009 __ lw(T1, Address(SP, 0 * kWordSize)); 1027 __ lw(T1, Address(SP, 0 * kWordSize));
1010 __ lw(T2, Address(SP, 1 * kWordSize)); 1028 __ lw(T2, Address(SP, 1 * kWordSize));
1011 __ lw(T3, Address(SP, 2 * kWordSize)); 1029 __ lw(T3, Address(SP, 2 * kWordSize));
1012 __ beq(CMPRES, ZR, &L); 1030 __ beq(CMPRES, ZR, &L);
1013 __ delay_slot()->addiu(SP, SP, Immediate(3 * kWordSize)); 1031 __ delay_slot()->addiu(SP, SP, Immediate(3 * kWordSize));
1014 __ Ret(); 1032 __ Ret();
1015 1033
1016 // Handle overflow: Call the runtime leaf function. 1034 // Handle overflow: Call the runtime leaf function.
(...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after
2106 __ Bind(&done); 2124 __ Bind(&done);
2107 __ lw(T0, Address(SP, 0 * kWordSize)); 2125 __ lw(T0, Address(SP, 0 * kWordSize));
2108 __ lw(T1, Address(SP, 1 * kWordSize)); 2126 __ lw(T1, Address(SP, 1 * kWordSize));
2109 __ Ret(); 2127 __ Ret();
2110 __ delay_slot()->addiu(SP, SP, Immediate(2 * kWordSize)); 2128 __ delay_slot()->addiu(SP, SP, Immediate(2 * kWordSize));
2111 } 2129 }
2112 2130
2113 } // namespace dart 2131 } // namespace dart
2114 2132
2115 #endif // defined TARGET_ARCH_MIPS 2133 #endif // defined TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « runtime/vm/stub_code_ia32.cc ('k') | runtime/vm/stub_code_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698