Index: src/arm/codegen-arm.cc |
=================================================================== |
--- src/arm/codegen-arm.cc (revision 4579) |
+++ src/arm/codegen-arm.cc (working copy) |
@@ -8498,14 +8498,16 @@ |
__ ldr(r3, FieldMemOperand(subject, String::kLengthOffset)); |
// r2: Number of capture registers |
- // r3: Length of subject string |
+ // r3: Length of subject string as a smi |
// 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)); |
- __ cmp(r3, Operand(r0, ASR, kSmiTagSize + kSmiShiftSize)); |
- __ b(ls, &runtime); |
+ __ tst(r0, Operand(kSmiTagMask)); |
+ __ b(eq, &runtime); |
+ __ cmp(r3, Operand(r0)); |
+ __ b(le, &runtime); |
// r2: Number of capture registers |
// subject: Subject string |
@@ -8631,6 +8633,7 @@ |
// 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)); |
@@ -8890,7 +8893,7 @@ |
// Check for index out of range. |
__ ldr(scratch, FieldMemOperand(object, String::kLengthOffset)); |
// Now scratch has the length of the string. Compare with the index. |
- __ cmp(scratch, Operand(index, LSR, kSmiTagSize)); |
+ __ cmp(scratch, Operand(index)); |
__ b(ls, index_out_of_range); |
__ bind(&try_again_with_new_string); |
@@ -9277,7 +9280,7 @@ |
// If length is not 2 the string is not a candidate. |
__ ldr(scratch, FieldMemOperand(candidate, String::kLengthOffset)); |
- __ cmp(scratch, Operand(2)); |
+ __ cmp(scratch, Operand(Smi::FromInt(2))); |
__ b(ne, &next_probe[i]); |
// Check that the candidate is a non-external ascii string. |
@@ -9428,7 +9431,7 @@ |
// r6: from (smi) |
// r7: to (smi) |
__ ldr(r4, FieldMemOperand(r5, String::kLengthOffset)); |
- __ cmp(r4, Operand(r7, ASR, 1)); |
+ __ cmp(r4, Operand(r7)); |
__ b(lt, &runtime); // Fail if to > length. |
// r1: instance type. |
@@ -9547,9 +9550,13 @@ |
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, |
@@ -9659,9 +9666,12 @@ |
// 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)); |
- __ cmp(r2, Operand(0)); // Test if first string is empty. |
+ ASSERT(kSmiTag == 0); |
+ __ cmp(r2, Operand(Smi::FromInt(0))); // Test if first string is empty. |
__ mov(r0, Operand(r1), LeaveCC, eq); // If first is empty, return second. |
- __ cmp(r3, Operand(0), ne); // Else test if second string is empty. |
+ ASSERT(kSmiTag == 0); |
+ // Else test if second string is empty. |
+ __ cmp(r3, Operand(Smi::FromInt(0)), ne); |
__ b(ne, &strings_not_empty); // If either string was empty, return r0. |
__ IncrementCounter(&Counters::string_add_native, 1, r2, r3); |
@@ -9671,6 +9681,8 @@ |
__ 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 |