Chromium Code Reviews| Index: src/arm/lithium-codegen-arm.cc |
| =================================================================== |
| --- src/arm/lithium-codegen-arm.cc (revision 9605) |
| +++ src/arm/lithium-codegen-arm.cc (working copy) |
| @@ -2251,13 +2251,19 @@ |
| __ str(value, FieldMemOperand(scratch, JSGlobalPropertyCell::kValueOffset)); |
| // Cells are always in the remembered set. |
| - __ RecordWriteField(scratch, |
| - JSGlobalPropertyCell::kValueOffset, |
| - value, |
| - scratch2, |
| - kLRHasBeenSaved, |
| - kSaveFPRegs, |
| - OMIT_REMEMBERED_SET); |
| + if (instr->hydrogen()->NeedsWriteBarrier()) { |
| + HType type = instr->hydrogen()->value()->type(); |
| + SmiCheck check_needed = |
| + type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| + __ RecordWriteField(scratch, |
| + JSGlobalPropertyCell::kValueOffset, |
| + value, |
| + scratch2, |
| + kLRHasBeenSaved, |
| + kSaveFPRegs, |
| + OMIT_REMEMBERED_SET, |
| + check_needed); |
| + } |
| } |
| @@ -2285,13 +2291,18 @@ |
| Register value = ToRegister(instr->value()); |
| MemOperand target = ContextOperand(context, instr->slot_index()); |
| __ str(value, target); |
| - if (instr->needs_write_barrier()) { |
| + if (instr->hydrogen()->NeedsWriteBarrier()) { |
| + HType type = instr->hydrogen()->value()->type(); |
| + SmiCheck check_needed = |
| + type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| __ RecordWriteContextSlot(context, |
| target.offset(), |
| value, |
| scratch0(), |
| kLRHasBeenSaved, |
| - kSaveFPRegs); |
| + kSaveFPRegs, |
| + EMIT_REMEMBERED_SET, |
| + check_needed); |
| } |
| } |
| @@ -3297,21 +3308,26 @@ |
| } |
| // Do the store. |
| + HType type = instr->hydrogen()->value()->type(); |
| + SmiCheck check_needed = |
| + type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| if (instr->is_in_object()) { |
| __ str(value, FieldMemOperand(object, offset)); |
| - if (instr->needs_write_barrier()) { |
| + if (instr->hydrogen()->NeedsWriteBarrier()) { |
| // Update the write barrier for the object for in-object properties. |
| __ RecordWriteField( |
| - object, offset, value, scratch, kLRHasBeenSaved, kSaveFPRegs); |
| + object, offset, value, scratch, kLRHasBeenSaved, kSaveFPRegs, |
|
Vyacheslav Egorov (Chromium)
2011/10/13 14:07:57
argument per line
|
| + EMIT_REMEMBERED_SET, check_needed); |
| } |
| } else { |
| __ ldr(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset)); |
| __ str(value, FieldMemOperand(scratch, offset)); |
| - if (instr->needs_write_barrier()) { |
| + if (instr->hydrogen()->NeedsWriteBarrier()) { |
| // Update the write barrier for the properties array. |
| // object is used as a scratch register. |
| __ RecordWriteField( |
|
Vyacheslav Egorov (Chromium)
2011/10/13 14:07:57
argument per line
|
| - scratch, offset, value, object, kLRHasBeenSaved, kSaveFPRegs); |
| + scratch, offset, value, object, kLRHasBeenSaved, kSaveFPRegs, |
| + EMIT_REMEMBERED_SET, check_needed); |
| } |
| } |
| } |
| @@ -3362,9 +3378,13 @@ |
| } |
| if (instr->hydrogen()->NeedsWriteBarrier()) { |
| + HType type = instr->hydrogen()->value()->type(); |
| + SmiCheck check_needed = |
| + type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| // Compute address of modified element and store it into key register. |
| __ add(key, scratch, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
| - __ RecordWrite(elements, key, value, kLRHasBeenSaved, kSaveFPRegs); |
| + __ RecordWrite(elements, key, value, kLRHasBeenSaved, kSaveFPRegs, |
|
Vyacheslav Egorov (Chromium)
2011/10/13 14:07:57
ditto
|
| + EMIT_REMEMBERED_SET, check_needed); |
| } |
| } |
| @@ -4349,8 +4369,9 @@ |
| false_label, |
| input, |
| instr->type_literal()); |
| - |
| - EmitBranch(true_block, false_block, final_branch_condition); |
| + if (final_branch_condition != kNoCondition) { |
| + EmitBranch(true_block, false_block, final_branch_condition); |
| + } |
| } |
| @@ -4420,9 +4441,7 @@ |
| final_branch_condition = eq; |
| } else { |
| - final_branch_condition = ne; |
| __ b(false_label); |
| - // A dead branch instruction will be generated after this point. |
| } |
| return final_branch_condition; |