Chromium Code Reviews| Index: src/arm/code-stubs-arm.cc |
| diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc |
| index 1d1fe83c2fee9ae565381c5ccb206e5b78e7811e..cde0ce6cc6b6ab8aa9ea9e7011e2281cd01fec0b 100644 |
| --- a/src/arm/code-stubs-arm.cc |
| +++ b/src/arm/code-stubs-arm.cc |
| @@ -892,12 +892,17 @@ static void EmitStrictTwoHeapObjectCompare(MacroAssembler* masm, |
| // Now that we have the types we might as well check for |
| // internalized-internalized. |
| - // Ensure that no non-strings have the internalized bit set. |
| - STATIC_ASSERT(LAST_TYPE < kNotStringTag + kIsInternalizedMask); |
| + Label not_internalized; |
| STATIC_ASSERT(kInternalizedTag != 0); |
| - __ and_(r2, r2, Operand(r3)); |
| - __ tst(r2, Operand(kIsInternalizedMask)); |
| - __ b(ne, &return_not_equal); |
| + __ and_(r2, r2, Operand(kIsNotStringMask | kIsInternalizedMask)); |
| + __ cmp(r2, Operand(kInternalizedTag | kStringTag)); |
| + __ b(ne, ¬_internalized); // r2 (rhs) is not an internalized string |
| + |
| + __ and_(r3, r3, Operand(kIsNotStringMask | kIsInternalizedMask)); |
| + __ cmp(r3, Operand(kInternalizedTag | kStringTag)); |
| + __ b(eq, &return_not_equal); // both rhs and lhs are internalized strings |
| + |
| + __ bind(¬_internalized); |
| } |
| @@ -937,7 +942,6 @@ static void EmitCheckForInternalizedStringsOrObjects(MacroAssembler* masm, |
| (lhs.is(r1) && rhs.is(r0))); |
| // r2 is object type of rhs. |
| - // Ensure that no non-strings have the internalized bit set. |
| Label object_test; |
| STATIC_ASSERT(kInternalizedTag != 0); |
| __ tst(r2, Operand(kIsNotStringMask)); |
| @@ -6213,9 +6217,14 @@ void ICCompareStub::GenerateInternalizedStrings(MacroAssembler* masm) { |
| __ ldrb(tmp1, FieldMemOperand(tmp1, Map::kInstanceTypeOffset)); |
| __ ldrb(tmp2, FieldMemOperand(tmp2, Map::kInstanceTypeOffset)); |
| STATIC_ASSERT(kInternalizedTag != 0); |
| - __ and_(tmp1, tmp1, Operand(tmp2)); |
| - __ tst(tmp1, Operand(kIsInternalizedMask)); |
| - __ b(eq, &miss); |
| + |
| + __ and_(tmp1, tmp1, Operand(kIsNotStringMask | kIsInternalizedMask)); |
| + __ cmp(tmp1, Operand(kInternalizedTag | kStringTag)); |
| + __ b(ne, &miss); |
| + |
| + __ and_(tmp2, tmp2, Operand(kIsNotStringMask | kIsInternalizedMask)); |
| + __ cmp(tmp2, Operand(kInternalizedTag | kStringTag)); |
| + __ b(ne, &miss); |
| // Internalized strings are compared by identity. |
| __ cmp(left, right); |
| @@ -6255,16 +6264,18 @@ void ICCompareStub::GenerateUniqueNames(MacroAssembler* masm) { |
| __ ldrb(tmp2, FieldMemOperand(tmp2, Map::kInstanceTypeOffset)); |
| Label succeed1; |
| - __ tst(tmp1, Operand(kIsInternalizedMask)); |
| - __ b(ne, &succeed1); |
| __ cmp(tmp1, Operand(SYMBOL_TYPE)); |
| + __ b(eq, &succeed1); |
| + __ and_(tmp1, tmp1, Operand(kIsNotStringMask | kIsInternalizedMask)); |
| + __ cmp(tmp1, Operand(kInternalizedTag | kStringTag)); |
|
Yang
2013/06/26 15:00:27
See my comment on x64.
mvstanton
2013/06/26 16:09:37
Done.
|
| __ b(ne, &miss); |
| __ bind(&succeed1); |
| Label succeed2; |
| - __ tst(tmp2, Operand(kIsInternalizedMask)); |
| - __ b(ne, &succeed2); |
| __ cmp(tmp2, Operand(SYMBOL_TYPE)); |
| + __ b(eq, &succeed2); |
| + __ and_(tmp2, tmp2, Operand(kIsNotStringMask | kIsInternalizedMask)); |
| + __ cmp(tmp2, Operand(kInternalizedTag | kStringTag)); |
| __ b(ne, &miss); |
| __ bind(&succeed2); |
| @@ -6321,7 +6332,8 @@ void ICCompareStub::GenerateStrings(MacroAssembler* masm) { |
| // Handle not identical strings. |
| // Check that both strings are internalized strings. If they are, we're done |
| - // because we already know they are not identical. |
| + // because we already know they are not identical. We know they are both |
| + // strings. |
| if (equality) { |
| ASSERT(GetCondition() == eq); |
| STATIC_ASSERT(kInternalizedTag != 0); |
| @@ -6507,11 +6519,12 @@ void NameDictionaryLookupStub::GenerateNegativeLookup(MacroAssembler* masm, |
| __ ldr(entity_name, FieldMemOperand(entity_name, HeapObject::kMapOffset)); |
| __ ldrb(entity_name, |
| FieldMemOperand(entity_name, Map::kInstanceTypeOffset)); |
| - __ tst(entity_name, Operand(kIsInternalizedMask)); |
| - __ b(ne, &good); |
| __ cmp(entity_name, Operand(SYMBOL_TYPE)); |
| + __ b(eq, &good); |
| + __ and_(entity_name, entity_name, |
| + Operand(kIsNotStringMask | kIsInternalizedMask)); |
| + __ cmp(entity_name, Operand(kInternalizedTag | kStringTag)); |
| __ b(ne, miss); |
| - |
| __ bind(&good); |
| // Restore the properties. |
| @@ -6682,9 +6695,11 @@ void NameDictionaryLookupStub::Generate(MacroAssembler* masm) { |
| __ ldr(entry_key, FieldMemOperand(entry_key, HeapObject::kMapOffset)); |
| __ ldrb(entry_key, |
| FieldMemOperand(entry_key, Map::kInstanceTypeOffset)); |
| - __ tst(entry_key, Operand(kIsInternalizedMask)); |
| - __ b(ne, &cont); |
| __ cmp(entry_key, Operand(SYMBOL_TYPE)); |
| + __ b(eq, &cont); |
| + __ and_(entry_key, entry_key, |
| + Operand(kIsNotStringMask | kIsInternalizedMask)); |
| + __ cmp(entry_key, Operand(kInternalizedTag | kStringTag)); |
| __ b(ne, &maybe_in_dictionary); |
| __ bind(&cont); |
| } |