| 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
|
|
|