Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index d35bfc9a2b60abd73a23064903f9d2d14b642d70..09fda267020f43b153851e4d6876bd6be50fc675 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -1928,13 +1928,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))); |
antonm
2011/01/27 14:00:07
maybe introduce additional instruction for this lo
|
__ mov(result, ContextOperand(result, instr->slot_index())); |
} |
+void LCodeGen::DoStoreContextSlot(LStoreContextSlot* instr) { |
+ Register context = ToRegister(instr->InputAt(0)); |
+ Register value = ToRegister(instr->InputAt(1)); |
+ __ mov(context, |
+ Operand(context, Context::SlotOffset(Context::FCONTEXT_INDEX))); |
+ __ mov(ContextOperand(context, instr->slot_index()), value); |
+ if (instr->TempAt(0) != NULL) { |
+ 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()); |
@@ -2164,16 +2179,31 @@ void LCodeGen::DoPushArgument(LPushArgument* instr) { |
} |
+void LCodeGen::DoContext(LContext* instr) { |
+ Register result = ToRegister(instr->result()); |
+ __ mov(result, esi); |
antonm
2011/01/27 14:00:07
Can we make it noop by requesting the result regis
fschneider
2011/01/28 11:54:50
esi will be replaced by [fixed-stack-slot] - so i'
|
+} |
+ |
+ |
+void LCodeGen::DoOuterContext(LOuterContext* instr) { |
+ Register context = ToRegister(instr->InputAt(0)); |
+ 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->InputAt(0)); |
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->InputAt(0)); |
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)); |
} |