Chromium Code Reviews| 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)); |
| } |