Chromium Code Reviews| Index: src/ia32/macro-assembler-ia32.cc |
| diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc |
| index 53ffa39357c97a47aa53df3f934a712fb30e9380..973bdd5874ea3b59c99e59adfe4f96324a970f51 100644 |
| --- a/src/ia32/macro-assembler-ia32.cc |
| +++ b/src/ia32/macro-assembler-ia32.cc |
| @@ -2399,19 +2399,46 @@ void MacroAssembler::PushHeapObject(Handle<HeapObject> object) { |
| void MacroAssembler::CmpWeakValue(Register value, Handle<WeakCell> cell, |
| Register scratch) { |
| mov(scratch, cell); |
| - cmp(value, FieldOperand(scratch, WeakCell::kValueOffset)); |
| + cmp(value, |
| + FieldOperand(scratch, WeakCell::kValueOffsetDontForgetTheReadBarrier)); |
| } |
| -void MacroAssembler::GetWeakValue(Register value, Handle<WeakCell> cell) { |
| +void MacroAssembler::GetWeakValueNoReadBarrier(Register value, |
| + Handle<WeakCell> cell) { |
| mov(value, cell); |
| - mov(value, FieldOperand(value, WeakCell::kValueOffset)); |
| + mov(value, |
| + FieldOperand(value, WeakCell::kValueOffsetDontForgetTheReadBarrier)); |
| +} |
| + |
| + |
| +void MacroAssembler::LoadWeakValueNoReadBarrier(Register value, |
| + Handle<WeakCell> cell, |
| + Label* miss) { |
| + GetWeakValueNoReadBarrier(value, cell); |
| + JumpIfSmi(value, miss); |
| +} |
| + |
| + |
| +void MacroAssembler::GetWeakValue(Register value, Register scratch, |
| + Handle<WeakCell> cell) { |
| + DCHECK(!value.is(scratch)); |
| + mov(value, cell); |
| + |
| + // The read barrier means we have to overwrite the cell map with the one that |
| + // indicates the cell has been read from. |
|
Hannes Payer (out of office)
2015/02/04 12:45:59
This seems to be more expensive than just clearing
|
| + Handle<Map> weak_cell_map(isolate()->heap()->used_weak_cell_map()); |
| + mov(scratch, weak_cell_map); |
| + mov(scratch, FieldOperand(value, HeapObject::kMapOffset)); |
|
ulan
2015/02/04 09:35:04
mov(FieldOperand(value, HeapObject::kMapOffset), s
|
| + |
| + mov(value, |
| + FieldOperand(value, WeakCell::kValueOffsetDontForgetTheReadBarrier)); |
| } |
| void MacroAssembler::LoadWeakValue(Register value, Handle<WeakCell> cell, |
| - Label* miss) { |
| - GetWeakValue(value, cell); |
| + Register scratch, Label* miss) { |
| + GetWeakValue(value, scratch, cell); |
| JumpIfSmi(value, miss); |
| } |