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()) { |