| Index: src/ia32/lithium-codegen-ia32.cc
|
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
|
| index ff35b8a318fadae93f84339206062442c611afbc..284c06fbdd4b3e9e04f11af0b4224d605e95c8be 100644
|
| --- a/src/ia32/lithium-codegen-ia32.cc
|
| +++ b/src/ia32/lithium-codegen-ia32.cc
|
| @@ -2962,6 +2962,7 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
| int offset = access.offset();
|
|
|
| if (access.IsExternalMemory()) {
|
| + DCHECK(!access.read_barrier());
|
| Register result = ToRegister(instr->result());
|
| MemOperand operand = instr->object()->IsConstantOperand()
|
| ? MemOperand::StaticVariable(ToExternalReference(
|
| @@ -2973,6 +2974,7 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
|
|
| Register object = ToRegister(instr->object());
|
| if (instr->hydrogen()->representation().IsDouble()) {
|
| + DCHECK(!access.read_barrier());
|
| XMMRegister result = ToDoubleRegister(instr->result());
|
| __ movsd(result, FieldOperand(object, offset));
|
| return;
|
| @@ -2980,9 +2982,26 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
|
|
| Register result = ToRegister(instr->result());
|
| if (!access.IsInobject()) {
|
| + DCHECK(!access.read_barrier());
|
| __ mov(result, FieldOperand(object, JSObject::kPropertiesOffset));
|
| object = result;
|
| }
|
| + if (access.read_barrier()) {
|
| + DCHECK(!result.is(object));
|
| + DCHECK(instr->hydrogen()->representation().IsTagged());
|
| + __ Load(result, FieldOperand(object, offset), access.representation());
|
| + Label done;
|
| + DCHECK_NE(kReadBarrierTag, 0);
|
| + __ test(result, Immediate(kReadBarrierMask));
|
| + __ j(zero, &done);
|
| + __ test(result, Immediate(kSmiTagMask));
|
| + DCHECK_EQ(kSmiTag, 0);
|
| + __ j(zero, &done);
|
| + __ and_(result, Immediate(~kReadBarrierTag));
|
| + __ mov(FieldOperand(object, offset), result);
|
| + __ bind(&done);
|
| + return;
|
| + }
|
| __ Load(result, FieldOperand(object, offset), access.representation());
|
| }
|
|
|
|
|