| Index: src/ia32/codegen-ia32.cc
 | 
| diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc
 | 
| index bf03d75e8e894cc8295b6758a511be84befe4a3a..b94df7aa42209ba5134fc0c396eaa32d6207ccd3 100644
 | 
| --- a/src/ia32/codegen-ia32.cc
 | 
| +++ b/src/ia32/codegen-ia32.cc
 | 
| @@ -4198,7 +4198,6 @@ void CodeGenerator::VisitForInStatement(ForInStatement* node) {
 | 
|    frame_->EmitPush(eax);  // <- slot 3
 | 
|    frame_->EmitPush(edx);  // <- slot 2
 | 
|    __ mov(eax, FieldOperand(edx, FixedArray::kLengthOffset));
 | 
| -  __ SmiTag(eax);
 | 
|    frame_->EmitPush(eax);  // <- slot 1
 | 
|    frame_->EmitPush(Immediate(Smi::FromInt(0)));  // <- slot 0
 | 
|    entry.Jump();
 | 
| @@ -4210,7 +4209,6 @@ void CodeGenerator::VisitForInStatement(ForInStatement* node) {
 | 
|  
 | 
|    // Push the length of the array and the initial index onto the stack.
 | 
|    __ mov(eax, FieldOperand(eax, FixedArray::kLengthOffset));
 | 
| -  __ SmiTag(eax);
 | 
|    frame_->EmitPush(eax);  // <- slot 1
 | 
|    frame_->EmitPush(Immediate(Smi::FromInt(0)));  // <- slot 0
 | 
|  
 | 
| @@ -6600,9 +6598,9 @@ void CodeGenerator::GenerateRegExpConstructResult(ZoneList<Expression*>* args) {
 | 
|      __ mov(FieldOperand(ebx, HeapObject::kMapOffset),
 | 
|             Immediate(Factory::fixed_array_map()));
 | 
|      // Set length.
 | 
| -    __ SmiUntag(ecx);
 | 
|      __ mov(FieldOperand(ebx, FixedArray::kLengthOffset), ecx);
 | 
|      // Fill contents of fixed-array with the-hole.
 | 
| +    __ SmiUntag(ecx);
 | 
|      __ mov(edx, Immediate(Factory::the_hole_value()));
 | 
|      __ lea(ebx, FieldOperand(ebx, FixedArray::kHeaderSize));
 | 
|      // Fill fixed array elements with hole.
 | 
| @@ -6706,7 +6704,6 @@ void DeferredSearchCache::Generate() {
 | 
|  
 | 
|    // Check if we could add new entry to cache.
 | 
|    __ mov(ebx, FieldOperand(ecx, FixedArray::kLengthOffset));
 | 
| -  __ SmiTag(ebx);
 | 
|    __ cmp(ebx, FieldOperand(ecx, JSFunctionResultCache::kCacheSizeOffset));
 | 
|    __ j(greater, &add_new_entry);
 | 
|  
 | 
| @@ -6904,12 +6901,8 @@ void CodeGenerator::GenerateSwapElements(ZoneList<Expression*>* args) {
 | 
|    // (or them and test against Smi mask.)
 | 
|  
 | 
|    __ mov(tmp2.reg(), tmp1.reg());
 | 
| -  RecordWriteStub recordWrite1(tmp2.reg(), index1.reg(), object.reg());
 | 
| -  __ CallStub(&recordWrite1);
 | 
| -
 | 
| -  RecordWriteStub recordWrite2(tmp1.reg(), index2.reg(), object.reg());
 | 
| -  __ CallStub(&recordWrite2);
 | 
| -
 | 
| +  __ RecordWriteHelper(tmp2.reg(), index1.reg(), object.reg());
 | 
| +  __ RecordWriteHelper(tmp1.reg(), index2.reg(), object.reg());
 | 
|    __ bind(&done);
 | 
|  
 | 
|    deferred->BindExit();
 | 
| @@ -8608,13 +8601,10 @@ Result CodeGenerator::EmitKeyedLoad() {
 | 
|      Result elements = allocator()->Allocate();
 | 
|      ASSERT(elements.is_valid());
 | 
|  
 | 
| -    // Use a fresh temporary for the index and later the loaded
 | 
| -    // value.
 | 
| -    result = allocator()->Allocate();
 | 
| -    ASSERT(result.is_valid());
 | 
| +    result = elements;
 | 
|  
 | 
|      DeferredReferenceGetKeyedValue* deferred =
 | 
| -        new DeferredReferenceGetKeyedValue(result.reg(),
 | 
| +        new DeferredReferenceGetKeyedValue(elements.reg(),
 | 
|                                             receiver.reg(),
 | 
|                                             key.reg());
 | 
|  
 | 
| @@ -8646,20 +8636,17 @@ Result CodeGenerator::EmitKeyedLoad() {
 | 
|             Immediate(Factory::fixed_array_map()));
 | 
|      deferred->Branch(not_equal);
 | 
|  
 | 
| -    // Shift the key to get the actual index value and check that
 | 
| -    // it is within bounds. Use unsigned comparison to handle negative keys.
 | 
| -    __ mov(result.reg(), key.reg());
 | 
| -    __ SmiUntag(result.reg());
 | 
| -    __ cmp(result.reg(),
 | 
| +    // Check that the key is within bounds.
 | 
| +    __ cmp(key.reg(),
 | 
|             FieldOperand(elements.reg(), FixedArray::kLengthOffset));
 | 
|      deferred->Branch(above_equal);
 | 
|  
 | 
|      // Load and check that the result is not the hole.
 | 
| +    ASSERT((kSmiTag == 0) && (kSmiTagSize == 1));
 | 
|      __ mov(result.reg(), Operand(elements.reg(),
 | 
| -                                 result.reg(),
 | 
| -                                 times_4,
 | 
| +                                 key.reg(),
 | 
| +                                 times_2,
 | 
|                                   FixedArray::kHeaderSize - kHeapObjectTag));
 | 
| -    elements.Unuse();
 | 
|      __ cmp(Operand(result.reg()), Immediate(Factory::the_hole_value()));
 | 
|      deferred->Branch(equal);
 | 
|      __ IncrementCounter(&Counters::keyed_load_inline, 1);
 | 
| @@ -8744,7 +8731,7 @@ Result CodeGenerator::EmitKeyedStore(StaticType* key_type) {
 | 
|  
 | 
|      // Check whether it is possible to omit the write barrier. If the elements
 | 
|      // array is in new space or the value written is a smi we can safely update
 | 
| -    // the elements array without updating the remembered set.
 | 
| +    // the elements array without write barrier.
 | 
|      Label in_new_space;
 | 
|      __ InNewSpace(tmp.reg(), tmp2.reg(), equal, &in_new_space);
 | 
|      if (!value_is_constant) {
 | 
| @@ -9014,7 +9001,8 @@ void FastNewContextStub::Generate(MacroAssembler* masm) {
 | 
|  
 | 
|    // Setup the object header.
 | 
|    __ mov(FieldOperand(eax, HeapObject::kMapOffset), Factory::context_map());
 | 
| -  __ mov(FieldOperand(eax, Array::kLengthOffset), Immediate(length));
 | 
| +  __ mov(FieldOperand(eax, Context::kLengthOffset),
 | 
| +         Immediate(Smi::FromInt(length)));
 | 
|  
 | 
|    // Setup the fixed slots.
 | 
|    __ xor_(ebx, Operand(ebx));  // Set to NULL.
 | 
| @@ -10977,9 +10965,8 @@ void ArgumentsAccessStub::GenerateNewObject(MacroAssembler* masm) {
 | 
|    __ test(ecx, Operand(ecx));
 | 
|    __ j(zero, &done);
 | 
|  
 | 
| -  // Get the parameters pointer from the stack and untag the length.
 | 
| +  // Get the parameters pointer from the stack.
 | 
|    __ mov(edx, Operand(esp, 2 * kPointerSize));
 | 
| -  __ SmiUntag(ecx);
 | 
|  
 | 
|    // Setup the elements pointer in the allocated arguments object and
 | 
|    // initialize the header in the elements fixed array.
 | 
| @@ -10988,6 +10975,8 @@ void ArgumentsAccessStub::GenerateNewObject(MacroAssembler* masm) {
 | 
|    __ mov(FieldOperand(edi, FixedArray::kMapOffset),
 | 
|           Immediate(Factory::fixed_array_map()));
 | 
|    __ mov(FieldOperand(edi, FixedArray::kLengthOffset), ecx);
 | 
| +  // Untag the length for the loop below.
 | 
| +  __ SmiUntag(ecx);
 | 
|  
 | 
|    // Copy the fixed array slots.
 | 
|    Label loop;
 | 
| @@ -11116,6 +11105,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
 | 
|    // Check that the last match info has space for the capture registers and the
 | 
|    // additional information.
 | 
|    __ mov(eax, FieldOperand(ebx, FixedArray::kLengthOffset));
 | 
| +  __ SmiUntag(eax);
 | 
|    __ add(Operand(edx), Immediate(RegExpImpl::kLastMatchOverhead));
 | 
|    __ cmp(edx, Operand(eax));
 | 
|    __ j(greater, &runtime);
 | 
| @@ -11359,7 +11349,7 @@ void NumberToStringStub::GenerateLookupNumberStringCache(MacroAssembler* masm,
 | 
|    // Make the hash mask from the length of the number string cache. It
 | 
|    // contains two elements (number and string) for each cache entry.
 | 
|    __ mov(mask, FieldOperand(number_string_cache, FixedArray::kLengthOffset));
 | 
| -  __ shr(mask, 1);  // Divide length by two (length is not a smi).
 | 
| +  __ shr(mask, kSmiTagSize + 1);  // Untag length and divide it by two.
 | 
|    __ sub(Operand(mask), Immediate(1));  // Make mask.
 | 
|  
 | 
|    // Calculate the entry in the number string cache. The hash value in the
 | 
| @@ -11450,12 +11440,6 @@ void NumberToStringStub::Generate(MacroAssembler* masm) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void RecordWriteStub::Generate(MacroAssembler* masm) {
 | 
| -  masm->RecordWriteHelper(object_, addr_, scratch_);
 | 
| -  masm->ret(0);
 | 
| -}
 | 
| -
 | 
| -
 | 
|  static int NegativeComparisonResult(Condition cc) {
 | 
|    ASSERT(cc != equal);
 | 
|    ASSERT((cc == less) || (cc == less_equal)
 | 
| 
 |