Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index 89b5ea2b9e4343ec211d68b035906140cb47111b..851a111ba85f25f70ccee668f84c4365daa8deed 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -1914,13 +1914,28 @@ void LCodeGen::DoStoreGlobal(LStoreGlobal* instr) { |
void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) { |
- // TODO(antonm): load a context with a separate instruction. |
+ Register context = ToRegister(instr->InputAt(0)); |
Register result = ToRegister(instr->result()); |
- __ LoadContext(result, instr->context_chain_length()); |
+ __ mov(result, |
+ Operand(context, Context::SlotOffset(Context::FCONTEXT_INDEX))); |
__ mov(result, ContextOperand(result, instr->slot_index())); |
} |
+void LCodeGen::DoStoreContextSlot(LStoreContextSlot* instr) { |
+ Register context = ToRegister(instr->context()); |
+ Register value = ToRegister(instr->value()); |
+ __ mov(context, |
+ Operand(context, Context::SlotOffset(Context::FCONTEXT_INDEX))); |
+ __ mov(ContextOperand(context, instr->slot_index()), value); |
+ if (instr->needs_write_barrier()) { |
+ Register temp = ToRegister(instr->TempAt(0)); |
+ int offset = Context::SlotOffset(instr->slot_index()); |
+ __ RecordWrite(context, offset, value, temp); |
+ } |
+} |
+ |
+ |
void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { |
Register object = ToRegister(instr->InputAt(0)); |
Register result = ToRegister(instr->result()); |
@@ -2155,16 +2170,31 @@ void LCodeGen::DoPushArgument(LPushArgument* instr) { |
} |
+void LCodeGen::DoContext(LContext* instr) { |
+ Register result = ToRegister(instr->result()); |
+ __ mov(result, esi); |
+} |
+ |
+ |
+void LCodeGen::DoOuterContext(LOuterContext* instr) { |
+ Register context = ToRegister(instr->context()); |
+ Register result = ToRegister(instr->result()); |
+ __ mov(result, Operand(context, Context::SlotOffset(Context::CLOSURE_INDEX))); |
+ __ mov(result, FieldOperand(result, JSFunction::kContextOffset)); |
+} |
+ |
+ |
void LCodeGen::DoGlobalObject(LGlobalObject* instr) { |
+ Register context = ToRegister(instr->context()); |
Register result = ToRegister(instr->result()); |
- __ mov(result, Operand(esi, Context::SlotOffset(Context::GLOBAL_INDEX))); |
+ __ mov(result, Operand(context, Context::SlotOffset(Context::GLOBAL_INDEX))); |
} |
void LCodeGen::DoGlobalReceiver(LGlobalReceiver* instr) { |
+ Register global = ToRegister(instr->global()); |
Register result = ToRegister(instr->result()); |
- __ mov(result, Operand(esi, Context::SlotOffset(Context::GLOBAL_INDEX))); |
- __ mov(result, FieldOperand(result, GlobalObject::kGlobalReceiverOffset)); |
+ __ mov(result, FieldOperand(global, GlobalObject::kGlobalReceiverOffset)); |
} |