| Index: src/arm/codegen-arm.cc | 
| diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc | 
| index 0af200cd3aef7520c6fe61ffeaa49c30e5c20aa1..291a763fb994466796b9e44f91721e2f36f48bbd 100644 | 
| --- a/src/arm/codegen-arm.cc | 
| +++ b/src/arm/codegen-arm.cc | 
| @@ -3978,8 +3978,8 @@ void CodeGenerator::GenerateFastCharCodeAt(ZoneList<Expression*>* args) { | 
|  | 
| // Now r2 has the string type. | 
| __ ldr(r3, FieldMemOperand(r1, String::kLengthOffset)); | 
| -  // Now r3 has the length of the string. Compare with the index. | 
| -  __ cmp(r3, Operand(r0)); | 
| +  // Now r3 has the length of the string.  Compare with the index. | 
| +  __ cmp(r3, Operand(r0, LSR, kSmiTagSize)); | 
| __ b(le, &slow); | 
|  | 
| // Here we know the index is in range.  Check that string is sequential. | 
| @@ -8388,16 +8388,14 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { | 
| __ ldr(r3, FieldMemOperand(subject, String::kLengthOffset)); | 
|  | 
| // r2: Number of capture registers | 
| -  // r3: Length of subject string as a smi | 
| +  // r3: Length of subject string | 
| // subject: Subject string | 
| // regexp_data: RegExp data (FixedArray) | 
| // Check that the third argument is a positive smi less than the subject | 
| // string length. A negative value will be greater (unsigned comparison). | 
| __ ldr(r0, MemOperand(sp, kPreviousIndexOffset)); | 
| -  __ tst(r0, Operand(kSmiTagMask)); | 
| -  __ b(eq, &runtime); | 
| -  __ cmp(r3, Operand(r0)); | 
| -  __ b(le, &runtime); | 
| +  __ cmp(r3, Operand(r0, ASR, kSmiTagSize + kSmiShiftSize)); | 
| +  __ b(ls, &runtime); | 
|  | 
| // r2: Number of capture registers | 
| // subject: Subject string | 
| @@ -8523,7 +8521,6 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { | 
| // For arguments 4 and 3 get string length, calculate start of string data and | 
| // calculate the shift of the index (0 for ASCII and 1 for two byte). | 
| __ ldr(r0, FieldMemOperand(subject, String::kLengthOffset)); | 
| -  __ mov(r0, Operand(r0, ASR, kSmiTagSize)); | 
| ASSERT_EQ(SeqAsciiString::kHeaderSize, SeqTwoByteString::kHeaderSize); | 
| __ add(r9, subject, Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag)); | 
| __ eor(r3, r3, Operand(1)); | 
| @@ -9031,7 +9028,7 @@ void StringStubBase::GenerateTwoCharacterSymbolTableProbe(MacroAssembler* masm, | 
|  | 
| // If length is not 2 the string is not a candidate. | 
| __ ldr(scratch, FieldMemOperand(candidate, String::kLengthOffset)); | 
| -    __ cmp(scratch, Operand(Smi::FromInt(2))); | 
| +    __ cmp(scratch, Operand(2)); | 
| __ b(ne, &next_probe[i]); | 
|  | 
| // Check that the candidate is a non-external ascii string. | 
| @@ -9182,7 +9179,7 @@ void SubStringStub::Generate(MacroAssembler* masm) { | 
| // r6: from (smi) | 
| // r7: to (smi) | 
| __ ldr(r4, FieldMemOperand(r5, String::kLengthOffset)); | 
| -  __ cmp(r4, Operand(r7)); | 
| +  __ cmp(r4, Operand(r7, ASR, 1)); | 
| __ b(lt, &runtime);  // Fail if to > length. | 
|  | 
| // r1: instance type. | 
| @@ -9301,13 +9298,9 @@ void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm, | 
| Register length_delta = scratch3; | 
| __ mov(scratch1, scratch2, LeaveCC, gt); | 
| Register min_length = scratch1; | 
| -  ASSERT(kSmiTag == 0); | 
| __ tst(min_length, Operand(min_length)); | 
| __ b(eq, &compare_lengths); | 
|  | 
| -  // Untag smi. | 
| -  __ mov(min_length, Operand(min_length, ASR, kSmiTagSize)); | 
| - | 
| // Setup registers so that we only need to increment one register | 
| // in the loop. | 
| __ add(scratch2, min_length, | 
| @@ -9417,12 +9410,9 @@ void StringAddStub::Generate(MacroAssembler* masm) { | 
| // Check if either of the strings are empty. In that case return the other. | 
| __ ldr(r2, FieldMemOperand(r0, String::kLengthOffset)); | 
| __ ldr(r3, FieldMemOperand(r1, String::kLengthOffset)); | 
| -    ASSERT(kSmiTag == 0); | 
| -    __ cmp(r2, Operand(Smi::FromInt(0)));  // Test if first string is empty. | 
| +    __ cmp(r2, Operand(0));  // Test if first string is empty. | 
| __ mov(r0, Operand(r1), LeaveCC, eq);  // If first is empty, return second. | 
| -    ASSERT(kSmiTag == 0); | 
| -     // Else test if second string is empty. | 
| -    __ cmp(r3, Operand(Smi::FromInt(0)), ne); | 
| +    __ cmp(r3, Operand(0), ne);  // Else test if second string is empty. | 
| __ b(ne, &strings_not_empty);  // If either string was empty, return r0. | 
|  | 
| __ IncrementCounter(&Counters::string_add_native, 1, r2, r3); | 
| @@ -9432,8 +9422,6 @@ void StringAddStub::Generate(MacroAssembler* masm) { | 
| __ bind(&strings_not_empty); | 
| } | 
|  | 
| -  __ mov(r2, Operand(r2, ASR, kSmiTagSize)); | 
| -  __ mov(r3, Operand(r3, ASR, kSmiTagSize)); | 
| // Both strings are non-empty. | 
| // r0: first string | 
| // r1: second string | 
|  |