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

Side by Side Diff: src/ia32/macro-assembler-ia32.h

Issue 297763006: Improve write barriers in optimized code. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE Created 6 years, 6 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
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_IA32_MACRO_ASSEMBLER_IA32_H_ 5 #ifndef V8_IA32_MACRO_ASSEMBLER_IA32_H_
6 #define V8_IA32_MACRO_ASSEMBLER_IA32_H_ 6 #define V8_IA32_MACRO_ASSEMBLER_IA32_H_
7 7
8 #include "assembler.h" 8 #include "assembler.h"
9 #include "frames.h" 9 #include "frames.h"
10 #include "globals.h" 10 #include "globals.h"
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 // stored. value and scratch registers are clobbered by the operation. 133 // stored. value and scratch registers are clobbered by the operation.
134 // The offset is the offset from the start of the object, not the offset from 134 // The offset is the offset from the start of the object, not the offset from
135 // the tagged HeapObject pointer. For use with FieldOperand(reg, off). 135 // the tagged HeapObject pointer. For use with FieldOperand(reg, off).
136 void RecordWriteField( 136 void RecordWriteField(
137 Register object, 137 Register object,
138 int offset, 138 int offset,
139 Register value, 139 Register value,
140 Register scratch, 140 Register scratch,
141 SaveFPRegsMode save_fp, 141 SaveFPRegsMode save_fp,
142 RememberedSetAction remembered_set_action = EMIT_REMEMBERED_SET, 142 RememberedSetAction remembered_set_action = EMIT_REMEMBERED_SET,
143 SmiCheck smi_check = INLINE_SMI_CHECK); 143 SmiCheck smi_check = INLINE_SMI_CHECK,
144 bool value_is_in_new_space = false);
Hannes Payer (out of office) 2014/06/03 05:51:48 Can we make value_is_in_new_space an enum like Smi
Benedikt Meurer 2014/06/03 07:48:02 Done.
144 145
145 // As above, but the offset has the tag presubtracted. For use with 146 // As above, but the offset has the tag presubtracted. For use with
146 // Operand(reg, off). 147 // Operand(reg, off).
147 void RecordWriteContextSlot( 148 void RecordWriteContextSlot(
148 Register context, 149 Register context,
149 int offset, 150 int offset,
150 Register value, 151 Register value,
151 Register scratch, 152 Register scratch,
152 SaveFPRegsMode save_fp, 153 SaveFPRegsMode save_fp,
153 RememberedSetAction remembered_set_action = EMIT_REMEMBERED_SET, 154 RememberedSetAction remembered_set_action = EMIT_REMEMBERED_SET,
154 SmiCheck smi_check = INLINE_SMI_CHECK) { 155 SmiCheck smi_check = INLINE_SMI_CHECK,
156 bool value_is_in_new_space = false) {
155 RecordWriteField(context, 157 RecordWriteField(context,
156 offset + kHeapObjectTag, 158 offset + kHeapObjectTag,
157 value, 159 value,
158 scratch, 160 scratch,
159 save_fp, 161 save_fp,
160 remembered_set_action, 162 remembered_set_action,
161 smi_check); 163 smi_check,
164 value_is_in_new_space);
162 } 165 }
163 166
164 // Notify the garbage collector that we wrote a pointer into a fixed array. 167 // Notify the garbage collector that we wrote a pointer into a fixed array.
165 // |array| is the array being stored into, |value| is the 168 // |array| is the array being stored into, |value| is the
166 // object being stored. |index| is the array index represented as a 169 // object being stored. |index| is the array index represented as a
167 // Smi. All registers are clobbered by the operation RecordWriteArray 170 // Smi. All registers are clobbered by the operation RecordWriteArray
168 // filters out smis so it does not update the write barrier if the 171 // filters out smis so it does not update the write barrier if the
169 // value is a smi. 172 // value is a smi.
170 void RecordWriteArray( 173 void RecordWriteArray(
171 Register array, 174 Register array,
172 Register value, 175 Register value,
173 Register index, 176 Register index,
174 SaveFPRegsMode save_fp, 177 SaveFPRegsMode save_fp,
175 RememberedSetAction remembered_set_action = EMIT_REMEMBERED_SET, 178 RememberedSetAction remembered_set_action = EMIT_REMEMBERED_SET,
176 SmiCheck smi_check = INLINE_SMI_CHECK); 179 SmiCheck smi_check = INLINE_SMI_CHECK);
177 180
178 // For page containing |object| mark region covering |address| 181 // For page containing |object| mark region covering |address|
179 // dirty. |object| is the object being stored into, |value| is the 182 // dirty. |object| is the object being stored into, |value| is the
180 // object being stored. The address and value registers are clobbered by the 183 // object being stored. The address and value registers are clobbered by the
181 // operation. RecordWrite filters out smis so it does not update the 184 // operation. RecordWrite filters out smis so it does not update the
182 // write barrier if the value is a smi. 185 // write barrier if the value is a smi.
183 void RecordWrite( 186 void RecordWrite(
184 Register object, 187 Register object,
185 Register address, 188 Register address,
186 Register value, 189 Register value,
187 SaveFPRegsMode save_fp, 190 SaveFPRegsMode save_fp,
188 RememberedSetAction remembered_set_action = EMIT_REMEMBERED_SET, 191 RememberedSetAction remembered_set_action = EMIT_REMEMBERED_SET,
189 SmiCheck smi_check = INLINE_SMI_CHECK); 192 SmiCheck smi_check = INLINE_SMI_CHECK,
193 bool value_is_in_new_space = false);
190 194
191 // For page containing |object| mark the region covering the object's map 195 // For page containing |object| mark the region covering the object's map
192 // dirty. |object| is the object being stored into, |map| is the Map object 196 // dirty. |object| is the object being stored into, |map| is the Map object
193 // that was stored. 197 // that was stored.
194 void RecordWriteForMap( 198 void RecordWriteForMap(
195 Register object, 199 Register object,
196 Handle<Map> map, 200 Handle<Map> map,
197 Register scratch1, 201 Register scratch1,
198 Register scratch2, 202 Register scratch2,
199 SaveFPRegsMode save_fp); 203 SaveFPRegsMode save_fp);
(...skipping 900 matching lines...) Expand 10 before | Expand all | Expand 10 after
1100 } \ 1104 } \
1101 masm-> 1105 masm->
1102 #else 1106 #else
1103 #define ACCESS_MASM(masm) masm-> 1107 #define ACCESS_MASM(masm) masm->
1104 #endif 1108 #endif
1105 1109
1106 1110
1107 } } // namespace v8::internal 1111 } } // namespace v8::internal
1108 1112
1109 #endif // V8_IA32_MACRO_ASSEMBLER_IA32_H_ 1113 #endif // V8_IA32_MACRO_ASSEMBLER_IA32_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698