| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 if (var->IsContextSlot()) { | 232 if (var->IsContextSlot()) { |
| 233 int parameter_offset = StandardFrameConstants::kCallerSPOffset + | 233 int parameter_offset = StandardFrameConstants::kCallerSPOffset + |
| 234 (num_parameters - 1 - i) * kPointerSize; | 234 (num_parameters - 1 - i) * kPointerSize; |
| 235 // Load parameter from stack. | 235 // Load parameter from stack. |
| 236 __ ldr(r0, MemOperand(fp, parameter_offset)); | 236 __ ldr(r0, MemOperand(fp, parameter_offset)); |
| 237 // Store it in the context. | 237 // Store it in the context. |
| 238 MemOperand target = ContextOperand(cp, var->index()); | 238 MemOperand target = ContextOperand(cp, var->index()); |
| 239 __ str(r0, target); | 239 __ str(r0, target); |
| 240 // Update the write barrier. This clobbers r3 and r0. | 240 // Update the write barrier. This clobbers r3 and r0. |
| 241 __ RecordWriteContextSlot( | 241 __ RecordWriteContextSlot( |
| 242 cp, target.offset(), r0, r3, kLRHasBeenSaved, kSaveFPRegs); | 242 cp, target.offset(), r0, r3, GetLinkRegisterState(), kSaveFPRegs); |
| 243 } | 243 } |
| 244 } | 244 } |
| 245 Comment(";;; End allocate local context"); | 245 Comment(";;; End allocate local context"); |
| 246 } | 246 } |
| 247 | 247 |
| 248 // Trace the call. | 248 // Trace the call. |
| 249 if (FLAG_trace && info()->IsOptimizing()) { | 249 if (FLAG_trace && info()->IsOptimizing()) { |
| 250 __ CallRuntime(Runtime::kTraceEnter, 0); | 250 __ CallRuntime(Runtime::kTraceEnter, 0); |
| 251 } | 251 } |
| 252 return !is_aborted(); | 252 return !is_aborted(); |
| (...skipping 2815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3068 | 3068 |
| 3069 __ str(value, target); | 3069 __ str(value, target); |
| 3070 if (instr->hydrogen()->NeedsWriteBarrier()) { | 3070 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 3071 HType type = instr->hydrogen()->value()->type(); | 3071 HType type = instr->hydrogen()->value()->type(); |
| 3072 SmiCheck check_needed = | 3072 SmiCheck check_needed = |
| 3073 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 3073 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 3074 __ RecordWriteContextSlot(context, | 3074 __ RecordWriteContextSlot(context, |
| 3075 target.offset(), | 3075 target.offset(), |
| 3076 value, | 3076 value, |
| 3077 scratch, | 3077 scratch, |
| 3078 kLRHasBeenSaved, | 3078 GetLinkRegisterState(), |
| 3079 kSaveFPRegs, | 3079 kSaveFPRegs, |
| 3080 EMIT_REMEMBERED_SET, | 3080 EMIT_REMEMBERED_SET, |
| 3081 check_needed); | 3081 check_needed); |
| 3082 } | 3082 } |
| 3083 | 3083 |
| 3084 __ bind(&skip_assignment); | 3084 __ bind(&skip_assignment); |
| 3085 } | 3085 } |
| 3086 | 3086 |
| 3087 | 3087 |
| 3088 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { | 3088 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { |
| (...skipping 1271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4360 if (!instr->transition().is_null()) { | 4360 if (!instr->transition().is_null()) { |
| 4361 __ mov(scratch, Operand(instr->transition())); | 4361 __ mov(scratch, Operand(instr->transition())); |
| 4362 __ str(scratch, FieldMemOperand(object, HeapObject::kMapOffset)); | 4362 __ str(scratch, FieldMemOperand(object, HeapObject::kMapOffset)); |
| 4363 if (instr->hydrogen()->NeedsWriteBarrierForMap()) { | 4363 if (instr->hydrogen()->NeedsWriteBarrierForMap()) { |
| 4364 Register temp = ToRegister(instr->temp()); | 4364 Register temp = ToRegister(instr->temp()); |
| 4365 // Update the write barrier for the map field. | 4365 // Update the write barrier for the map field. |
| 4366 __ RecordWriteField(object, | 4366 __ RecordWriteField(object, |
| 4367 HeapObject::kMapOffset, | 4367 HeapObject::kMapOffset, |
| 4368 scratch, | 4368 scratch, |
| 4369 temp, | 4369 temp, |
| 4370 kLRHasBeenSaved, | 4370 GetLinkRegisterState(), |
| 4371 kSaveFPRegs, | 4371 kSaveFPRegs, |
| 4372 OMIT_REMEMBERED_SET, | 4372 OMIT_REMEMBERED_SET, |
| 4373 OMIT_SMI_CHECK); | 4373 OMIT_SMI_CHECK); |
| 4374 } | 4374 } |
| 4375 } | 4375 } |
| 4376 | 4376 |
| 4377 // Do the store. | 4377 // Do the store. |
| 4378 HType type = instr->hydrogen()->value()->type(); | 4378 HType type = instr->hydrogen()->value()->type(); |
| 4379 SmiCheck check_needed = | 4379 SmiCheck check_needed = |
| 4380 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 4380 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 4381 if (instr->is_in_object()) { | 4381 if (instr->is_in_object()) { |
| 4382 __ str(value, FieldMemOperand(object, offset)); | 4382 __ str(value, FieldMemOperand(object, offset)); |
| 4383 if (instr->hydrogen()->NeedsWriteBarrier()) { | 4383 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 4384 // Update the write barrier for the object for in-object properties. | 4384 // Update the write barrier for the object for in-object properties. |
| 4385 __ RecordWriteField(object, | 4385 __ RecordWriteField(object, |
| 4386 offset, | 4386 offset, |
| 4387 value, | 4387 value, |
| 4388 scratch, | 4388 scratch, |
| 4389 kLRHasBeenSaved, | 4389 GetLinkRegisterState(), |
| 4390 kSaveFPRegs, | 4390 kSaveFPRegs, |
| 4391 EMIT_REMEMBERED_SET, | 4391 EMIT_REMEMBERED_SET, |
| 4392 check_needed); | 4392 check_needed); |
| 4393 } | 4393 } |
| 4394 } else { | 4394 } else { |
| 4395 __ ldr(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset)); | 4395 __ ldr(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset)); |
| 4396 __ str(value, FieldMemOperand(scratch, offset)); | 4396 __ str(value, FieldMemOperand(scratch, offset)); |
| 4397 if (instr->hydrogen()->NeedsWriteBarrier()) { | 4397 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 4398 // Update the write barrier for the properties array. | 4398 // Update the write barrier for the properties array. |
| 4399 // object is used as a scratch register. | 4399 // object is used as a scratch register. |
| 4400 __ RecordWriteField(scratch, | 4400 __ RecordWriteField(scratch, |
| 4401 offset, | 4401 offset, |
| 4402 value, | 4402 value, |
| 4403 object, | 4403 object, |
| 4404 kLRHasBeenSaved, | 4404 GetLinkRegisterState(), |
| 4405 kSaveFPRegs, | 4405 kSaveFPRegs, |
| 4406 EMIT_REMEMBERED_SET, | 4406 EMIT_REMEMBERED_SET, |
| 4407 check_needed); | 4407 check_needed); |
| 4408 } | 4408 } |
| 4409 } | 4409 } |
| 4410 } | 4410 } |
| 4411 | 4411 |
| 4412 | 4412 |
| 4413 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { | 4413 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { |
| 4414 ASSERT(ToRegister(instr->object()).is(r1)); | 4414 ASSERT(ToRegister(instr->object()).is(r1)); |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4595 | 4595 |
| 4596 if (instr->hydrogen()->NeedsWriteBarrier()) { | 4596 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 4597 HType type = instr->hydrogen()->value()->type(); | 4597 HType type = instr->hydrogen()->value()->type(); |
| 4598 SmiCheck check_needed = | 4598 SmiCheck check_needed = |
| 4599 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 4599 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 4600 // Compute address of modified element and store it into key register. | 4600 // Compute address of modified element and store it into key register. |
| 4601 __ add(key, store_base, Operand(offset - kHeapObjectTag)); | 4601 __ add(key, store_base, Operand(offset - kHeapObjectTag)); |
| 4602 __ RecordWrite(elements, | 4602 __ RecordWrite(elements, |
| 4603 key, | 4603 key, |
| 4604 value, | 4604 value, |
| 4605 kLRHasBeenSaved, | 4605 GetLinkRegisterState(), |
| 4606 kSaveFPRegs, | 4606 kSaveFPRegs, |
| 4607 EMIT_REMEMBERED_SET, | 4607 EMIT_REMEMBERED_SET, |
| 4608 check_needed); | 4608 check_needed); |
| 4609 } | 4609 } |
| 4610 } | 4610 } |
| 4611 | 4611 |
| 4612 | 4612 |
| 4613 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { | 4613 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { |
| 4614 // By cases: external, fast double | 4614 // By cases: external, fast double |
| 4615 if (instr->is_external()) { | 4615 if (instr->is_external()) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4647 __ ldr(scratch, FieldMemOperand(object_reg, HeapObject::kMapOffset)); | 4647 __ ldr(scratch, FieldMemOperand(object_reg, HeapObject::kMapOffset)); |
| 4648 __ cmp(scratch, Operand(from_map)); | 4648 __ cmp(scratch, Operand(from_map)); |
| 4649 __ b(ne, ¬_applicable); | 4649 __ b(ne, ¬_applicable); |
| 4650 | 4650 |
| 4651 if (IsSimpleMapChangeTransition(from_kind, to_kind)) { | 4651 if (IsSimpleMapChangeTransition(from_kind, to_kind)) { |
| 4652 Register new_map_reg = ToRegister(instr->new_map_temp()); | 4652 Register new_map_reg = ToRegister(instr->new_map_temp()); |
| 4653 __ mov(new_map_reg, Operand(to_map)); | 4653 __ mov(new_map_reg, Operand(to_map)); |
| 4654 __ str(new_map_reg, FieldMemOperand(object_reg, HeapObject::kMapOffset)); | 4654 __ str(new_map_reg, FieldMemOperand(object_reg, HeapObject::kMapOffset)); |
| 4655 // Write barrier. | 4655 // Write barrier. |
| 4656 __ RecordWriteField(object_reg, HeapObject::kMapOffset, new_map_reg, | 4656 __ RecordWriteField(object_reg, HeapObject::kMapOffset, new_map_reg, |
| 4657 scratch, kLRHasBeenSaved, kDontSaveFPRegs); | 4657 scratch, GetLinkRegisterState(), kDontSaveFPRegs); |
| 4658 } else if (FLAG_compiled_transitions) { | 4658 } else if (FLAG_compiled_transitions) { |
| 4659 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | 4659 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); |
| 4660 __ Move(r0, object_reg); | 4660 __ Move(r0, object_reg); |
| 4661 __ Move(r1, to_map); | 4661 __ Move(r1, to_map); |
| 4662 TransitionElementsKindStub stub(from_kind, to_kind); | 4662 TransitionElementsKindStub stub(from_kind, to_kind); |
| 4663 __ CallStub(&stub); | 4663 __ CallStub(&stub); |
| 4664 RecordSafepointWithRegisters( | 4664 RecordSafepointWithRegisters( |
| 4665 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); | 4665 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); |
| 4666 } else if (IsFastSmiElementsKind(from_kind) && | 4666 } else if (IsFastSmiElementsKind(from_kind) && |
| 4667 IsFastDoubleElementsKind(to_kind)) { | 4667 IsFastDoubleElementsKind(to_kind)) { |
| (...skipping 1725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6393 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); | 6393 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); |
| 6394 __ ldr(result, FieldMemOperand(scratch, | 6394 __ ldr(result, FieldMemOperand(scratch, |
| 6395 FixedArray::kHeaderSize - kPointerSize)); | 6395 FixedArray::kHeaderSize - kPointerSize)); |
| 6396 __ bind(&done); | 6396 __ bind(&done); |
| 6397 } | 6397 } |
| 6398 | 6398 |
| 6399 | 6399 |
| 6400 #undef __ | 6400 #undef __ |
| 6401 | 6401 |
| 6402 } } // namespace v8::internal | 6402 } } // namespace v8::internal |
| OLD | NEW |