OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 | 141 |
142 void MacroAssembler::RecordWrite(Register object, | 142 void MacroAssembler::RecordWrite(Register object, |
143 int offset, | 143 int offset, |
144 Register value, | 144 Register value, |
145 Register scratch) { | 145 Register scratch) { |
146 // First, check if a write barrier is even needed. The tests below | 146 // First, check if a write barrier is even needed. The tests below |
147 // catch stores of Smis and stores into young gen. | 147 // catch stores of Smis and stores into young gen. |
148 Label done; | 148 Label done; |
149 | 149 |
150 // Skip barrier if writing a smi. | 150 // Skip barrier if writing a smi. |
151 ASSERT_EQ(0, kSmiTag); | 151 STATIC_ASSERT(kSmiTag == 0); |
152 JumpIfSmi(value, &done, Label::kNear); | 152 JumpIfSmi(value, &done, Label::kNear); |
153 | 153 |
154 InNewSpace(object, value, equal, &done, Label::kNear); | 154 InNewSpace(object, value, equal, &done, Label::kNear); |
155 | 155 |
156 // The offset is relative to a tagged or untagged HeapObject pointer, | 156 // The offset is relative to a tagged or untagged HeapObject pointer, |
157 // so either offset or offset + kHeapObjectTag must be a | 157 // so either offset or offset + kHeapObjectTag must be a |
158 // multiple of kPointerSize. | 158 // multiple of kPointerSize. |
159 ASSERT(IsAligned(offset, kPointerSize) || | 159 ASSERT(IsAligned(offset, kPointerSize) || |
160 IsAligned(offset + kHeapObjectTag, kPointerSize)); | 160 IsAligned(offset + kHeapObjectTag, kPointerSize)); |
161 | 161 |
162 Register dst = scratch; | 162 Register dst = scratch; |
163 if (offset != 0) { | 163 if (offset != 0) { |
164 lea(dst, Operand(object, offset)); | 164 lea(dst, Operand(object, offset)); |
165 } else { | 165 } else { |
166 // Array access: calculate the destination address in the same manner as | 166 // Array access: calculate the destination address in the same manner as |
167 // KeyedStoreIC::GenerateGeneric. Multiply a smi by 2 to get an offset | 167 // KeyedStoreIC::GenerateGeneric. Multiply a smi by 2 to get an offset |
168 // into an array of words. | 168 // into an array of words. |
169 ASSERT_EQ(1, kSmiTagSize); | 169 STATIC_ASSERT(kSmiTagSize == 1); |
170 ASSERT_EQ(0, kSmiTag); | 170 STATIC_ASSERT(kSmiTag == 0); |
171 lea(dst, Operand(object, dst, times_half_pointer_size, | 171 lea(dst, Operand(object, dst, times_half_pointer_size, |
172 FixedArray::kHeaderSize - kHeapObjectTag)); | 172 FixedArray::kHeaderSize - kHeapObjectTag)); |
173 } | 173 } |
174 RecordWriteHelper(object, dst, value); | 174 RecordWriteHelper(object, dst, value); |
175 | 175 |
176 bind(&done); | 176 bind(&done); |
177 | 177 |
178 // Clobber all input registers when running with the debug-code flag | 178 // Clobber all input registers when running with the debug-code flag |
179 // turned on to provoke errors. | 179 // turned on to provoke errors. |
180 if (emit_debug_code()) { | 180 if (emit_debug_code()) { |
181 mov(object, Immediate(BitCast<int32_t>(kZapValue))); | 181 mov(object, Immediate(BitCast<int32_t>(kZapValue))); |
182 mov(value, Immediate(BitCast<int32_t>(kZapValue))); | 182 mov(value, Immediate(BitCast<int32_t>(kZapValue))); |
183 mov(scratch, Immediate(BitCast<int32_t>(kZapValue))); | 183 mov(scratch, Immediate(BitCast<int32_t>(kZapValue))); |
184 } | 184 } |
185 } | 185 } |
186 | 186 |
187 | 187 |
188 void MacroAssembler::RecordWrite(Register object, | 188 void MacroAssembler::RecordWrite(Register object, |
189 Register address, | 189 Register address, |
190 Register value) { | 190 Register value) { |
191 // First, check if a write barrier is even needed. The tests below | 191 // First, check if a write barrier is even needed. The tests below |
192 // catch stores of Smis and stores into young gen. | 192 // catch stores of Smis and stores into young gen. |
193 Label done; | 193 Label done; |
194 | 194 |
195 // Skip barrier if writing a smi. | 195 // Skip barrier if writing a smi. |
196 ASSERT_EQ(0, kSmiTag); | 196 STATIC_ASSERT(kSmiTag == 0); |
197 JumpIfSmi(value, &done, Label::kNear); | 197 JumpIfSmi(value, &done, Label::kNear); |
198 | 198 |
199 InNewSpace(object, value, equal, &done); | 199 InNewSpace(object, value, equal, &done); |
200 | 200 |
201 RecordWriteHelper(object, address, value); | 201 RecordWriteHelper(object, address, value); |
202 | 202 |
203 bind(&done); | 203 bind(&done); |
204 | 204 |
205 // Clobber all input registers when running with the debug-code flag | 205 // Clobber all input registers when running with the debug-code flag |
206 // turned on to provoke errors. | 206 // turned on to provoke errors. |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 | 319 |
320 bind(&fail); | 320 bind(&fail); |
321 } | 321 } |
322 | 322 |
323 | 323 |
324 Condition MacroAssembler::IsObjectStringType(Register heap_object, | 324 Condition MacroAssembler::IsObjectStringType(Register heap_object, |
325 Register map, | 325 Register map, |
326 Register instance_type) { | 326 Register instance_type) { |
327 mov(map, FieldOperand(heap_object, HeapObject::kMapOffset)); | 327 mov(map, FieldOperand(heap_object, HeapObject::kMapOffset)); |
328 movzx_b(instance_type, FieldOperand(map, Map::kInstanceTypeOffset)); | 328 movzx_b(instance_type, FieldOperand(map, Map::kInstanceTypeOffset)); |
329 ASSERT(kNotStringTag != 0); | 329 STATIC_ASSERT(kNotStringTag != 0); |
330 test(instance_type, Immediate(kIsNotStringMask)); | 330 test(instance_type, Immediate(kIsNotStringMask)); |
331 return zero; | 331 return zero; |
332 } | 332 } |
333 | 333 |
334 | 334 |
335 void MacroAssembler::IsObjectJSObjectType(Register heap_object, | 335 void MacroAssembler::IsObjectJSObjectType(Register heap_object, |
336 Register map, | 336 Register map, |
337 Register scratch, | 337 Register scratch, |
338 Label* fail) { | 338 Label* fail) { |
339 mov(map, FieldOperand(heap_object, HeapObject::kMapOffset)); | 339 mov(map, FieldOperand(heap_object, HeapObject::kMapOffset)); |
(...skipping 1819 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2159 j(not_equal, failure); | 2159 j(not_equal, failure); |
2160 } | 2160 } |
2161 | 2161 |
2162 | 2162 |
2163 void MacroAssembler::JumpIfNotBothSequentialAsciiStrings(Register object1, | 2163 void MacroAssembler::JumpIfNotBothSequentialAsciiStrings(Register object1, |
2164 Register object2, | 2164 Register object2, |
2165 Register scratch1, | 2165 Register scratch1, |
2166 Register scratch2, | 2166 Register scratch2, |
2167 Label* failure) { | 2167 Label* failure) { |
2168 // Check that both objects are not smis. | 2168 // Check that both objects are not smis. |
2169 ASSERT_EQ(0, kSmiTag); | 2169 STATIC_ASSERT(kSmiTag == 0); |
2170 mov(scratch1, Operand(object1)); | 2170 mov(scratch1, Operand(object1)); |
2171 and_(scratch1, Operand(object2)); | 2171 and_(scratch1, Operand(object2)); |
2172 JumpIfSmi(scratch1, failure); | 2172 JumpIfSmi(scratch1, failure); |
2173 | 2173 |
2174 // Load instance type for both strings. | 2174 // Load instance type for both strings. |
2175 mov(scratch1, FieldOperand(object1, HeapObject::kMapOffset)); | 2175 mov(scratch1, FieldOperand(object1, HeapObject::kMapOffset)); |
2176 mov(scratch2, FieldOperand(object2, HeapObject::kMapOffset)); | 2176 mov(scratch2, FieldOperand(object2, HeapObject::kMapOffset)); |
2177 movzx_b(scratch1, FieldOperand(scratch1, Map::kInstanceTypeOffset)); | 2177 movzx_b(scratch1, FieldOperand(scratch1, Map::kInstanceTypeOffset)); |
2178 movzx_b(scratch2, FieldOperand(scratch2, Map::kInstanceTypeOffset)); | 2178 movzx_b(scratch2, FieldOperand(scratch2, Map::kInstanceTypeOffset)); |
2179 | 2179 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2248 | 2248 |
2249 // Check that the code was patched as expected. | 2249 // Check that the code was patched as expected. |
2250 ASSERT(masm_.pc_ == address_ + size_); | 2250 ASSERT(masm_.pc_ == address_ + size_); |
2251 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); | 2251 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); |
2252 } | 2252 } |
2253 | 2253 |
2254 | 2254 |
2255 } } // namespace v8::internal | 2255 } } // namespace v8::internal |
2256 | 2256 |
2257 #endif // V8_TARGET_ARCH_IA32 | 2257 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |