| Index: src/ia32/lithium-codegen-ia32.cc
 | 
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
 | 
| index 3f003540f1e1ef0042a79bd5de9098b622ae327c..7adeed192241aa74cc826e9388823dabec6bfa35 100644
 | 
| --- a/src/ia32/lithium-codegen-ia32.cc
 | 
| +++ b/src/ia32/lithium-codegen-ia32.cc
 | 
| @@ -4729,6 +4729,84 @@ void LCodeGen::DoIn(LIn* instr) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void LCodeGen::DoForInPrepareMap(LForInPrepareMap* instr) {
 | 
| +  __ cmp(eax, isolate()->factory()->undefined_value());
 | 
| +  DeoptimizeIf(equal, instr->environment());
 | 
| +
 | 
| +  __ cmp(eax, isolate()->factory()->null_value());
 | 
| +  DeoptimizeIf(equal, instr->environment());
 | 
| +
 | 
| +  __ test(eax, Immediate(kSmiTagMask));
 | 
| +  DeoptimizeIf(zero, instr->environment());
 | 
| +
 | 
| +  STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_SPEC_OBJECT_TYPE);
 | 
| +  __ CmpObjectType(eax, LAST_JS_PROXY_TYPE, ecx);
 | 
| +  DeoptimizeIf(below_equal, instr->environment());
 | 
| +
 | 
| +  Label use_cache, call_runtime;
 | 
| +  __ CheckEnumCache(&call_runtime);
 | 
| +
 | 
| +  __ mov(eax, FieldOperand(eax, HeapObject::kMapOffset));
 | 
| +  __ jmp(&use_cache, Label::kNear);
 | 
| +
 | 
| +  // Get the set of properties to enumerate.
 | 
| +  __ bind(&call_runtime);
 | 
| +  __ push(eax);
 | 
| +  CallRuntime(Runtime::kGetPropertyNamesFast, 1, instr);
 | 
| +
 | 
| +  __ cmp(FieldOperand(eax, HeapObject::kMapOffset),
 | 
| +         isolate()->factory()->meta_map());
 | 
| +  DeoptimizeIf(not_equal, instr->environment());
 | 
| +  __ bind(&use_cache);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void LCodeGen::DoForInCacheArray(LForInCacheArray* instr) {
 | 
| +  Register map = ToRegister(instr->map());
 | 
| +  Register result = ToRegister(instr->result());
 | 
| +  __ LoadInstanceDescriptors(map, result);
 | 
| +  __ mov(result,
 | 
| +         FieldOperand(result, DescriptorArray::kEnumerationIndexOffset));
 | 
| +  __ mov(result,
 | 
| +         FieldOperand(result, FixedArray::SizeFor(instr->idx())));
 | 
| +  __ test(result, result);
 | 
| +  DeoptimizeIf(equal, instr->environment());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void LCodeGen::DoCheckMapValue(LCheckMapValue* instr) {
 | 
| +  Register object = ToRegister(instr->value());
 | 
| +  __ cmp(ToRegister(instr->map()),
 | 
| +         FieldOperand(object, HeapObject::kMapOffset));
 | 
| +  DeoptimizeIf(not_equal, instr->environment());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) {
 | 
| +  Register object = ToRegister(instr->object());
 | 
| +  Register index = ToRegister(instr->index());
 | 
| +
 | 
| +  Label out_of_object, done;
 | 
| +  __ cmp(index, Immediate(0));
 | 
| +  __ j(less, &out_of_object);
 | 
| +  __ mov(object, FieldOperand(object,
 | 
| +                              index,
 | 
| +                              times_half_pointer_size,
 | 
| +                              JSObject::kHeaderSize));
 | 
| +  __ jmp(&done, Label::kNear);
 | 
| +
 | 
| +  __ bind(&out_of_object);
 | 
| +  __ mov(object, FieldOperand(object, JSObject::kPropertiesOffset));
 | 
| +  __ neg(index);
 | 
| +  // Index is now equal to out of object property index plus 1.
 | 
| +  __ mov(object, FieldOperand(object,
 | 
| +                              index,
 | 
| +                              times_half_pointer_size,
 | 
| +                              FixedArray::kHeaderSize - kPointerSize));
 | 
| +  __ bind(&done);
 | 
| +}
 | 
| +
 | 
| +
 | 
|  #undef __
 | 
|  
 | 
|  } }  // namespace v8::internal
 | 
| 
 |