| Index: src/ia32/lithium-codegen-ia32.cc | 
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc | 
| index 4ce7fd6067d106d92209b07a5f17d272bd15b292..3ddad068bfdfc0454442a87e3fd964269d5e6298 100644 | 
| --- a/src/ia32/lithium-codegen-ia32.cc | 
| +++ b/src/ia32/lithium-codegen-ia32.cc | 
| @@ -685,6 +685,13 @@ double LCodeGen::ToDouble(LConstantOperand* op) const { | 
| } | 
|  | 
|  | 
| +ExternalReference LCodeGen::ToExternalReference(LConstantOperand* op) const { | 
| +  HConstant* constant = chunk_->LookupConstant(op); | 
| +  ASSERT(constant->HasExternalReferenceValue()); | 
| +  return constant->ExternalReferenceValue(); | 
| +} | 
| + | 
| + | 
| bool LCodeGen::IsInteger32(LConstantOperand* op) const { | 
| return chunk_->LookupLiteralRepresentation(op).IsSmiOrInteger32(); | 
| } | 
| @@ -1853,6 +1860,11 @@ void LCodeGen::DoConstantD(LConstantD* instr) { | 
| } | 
|  | 
|  | 
| +void LCodeGen::DoConstantE(LConstantE* instr) { | 
| +  __ lea(ToRegister(instr->result()), Operand::StaticVariable(instr->value())); | 
| +} | 
| + | 
| + | 
| void LCodeGen::DoConstantT(LConstantT* instr) { | 
| Register reg = ToRegister(instr->result()); | 
| Handle<Object> handle = instr->value(); | 
| @@ -3049,6 +3061,19 @@ void LCodeGen::DoStoreContextSlot(LStoreContextSlot* instr) { | 
| void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { | 
| HObjectAccess access = instr->hydrogen()->access(); | 
| int offset = access.offset(); | 
| + | 
| +  if (access.IsExternalMemory()) { | 
| +    Register result = ToRegister(instr->result()); | 
| +    if (instr->object()->IsConstantOperand()) { | 
| +      ExternalReference external_reference = ToExternalReference( | 
| +          LConstantOperand::cast(instr->object())); | 
| +      __ mov(result, MemOperand::StaticVariable(external_reference)); | 
| +    } else { | 
| +      __ mov(result, MemOperand(ToRegister(instr->object()), offset)); | 
| +    } | 
| +    return; | 
| +  } | 
| + | 
| Register object = ToRegister(instr->object()); | 
| if (FLAG_track_double_fields && | 
| instr->hydrogen()->representation().IsDouble()) { | 
| @@ -4328,10 +4353,25 @@ void LCodeGen::DoInnerAllocatedObject(LInnerAllocatedObject* instr) { | 
| void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { | 
| Representation representation = instr->representation(); | 
|  | 
| -  Register object = ToRegister(instr->object()); | 
| HObjectAccess access = instr->hydrogen()->access(); | 
| int offset = access.offset(); | 
|  | 
| +  if (access.IsExternalMemory()) { | 
| +    MemOperand operand = instr->object()->IsConstantOperand() | 
| +        ? MemOperand::StaticVariable( | 
| +            ToExternalReference(LConstantOperand::cast(instr->object()))) | 
| +        : MemOperand(ToRegister(instr->object()), offset); | 
| +    if (instr->value()->IsConstantOperand()) { | 
| +      LConstantOperand* operand_value = LConstantOperand::cast(instr->value()); | 
| +      __ mov(operand, Immediate(ToInteger32(operand_value))); | 
| +    } else { | 
| +      Register value = ToRegister(instr->value()); | 
| +      __ mov(operand, value); | 
| +    } | 
| +    return; | 
| +  } | 
| + | 
| +  Register object = ToRegister(instr->object()); | 
| Handle<Map> transition = instr->transition(); | 
|  | 
| if (FLAG_track_fields && representation.IsSmi()) { | 
| @@ -4396,8 +4436,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { | 
| Register write_register = object; | 
| if (!access.IsInobject()) { | 
| write_register = ToRegister(instr->temp()); | 
| -    __ mov(write_register, | 
| -           FieldOperand(object, JSObject::kPropertiesOffset)); | 
| +    __ mov(write_register, FieldOperand(object, JSObject::kPropertiesOffset)); | 
| } | 
|  | 
| if (instr->value()->IsConstantOperand()) { | 
|  |