| 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));
|
| }
|
|
|
|
|
|
|