Index: src/ia32/code-stubs-ia32.cc |
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
index aee57dc385c70368c9b89f84a064301862e89a91..e56c6aee5c594b643f72bd98cf2940c5acab8830 100644 |
--- a/src/ia32/code-stubs-ia32.cc |
+++ b/src/ia32/code-stubs-ia32.cc |
@@ -4112,9 +4112,9 @@ static void BranchIfNotInternalizedString(MacroAssembler* masm, |
__ JumpIfSmi(object, label); |
__ mov(scratch, FieldOperand(object, HeapObject::kMapOffset)); |
__ movzx_b(scratch, FieldOperand(scratch, Map::kInstanceTypeOffset)); |
- __ and_(scratch, kIsInternalizedMask | kIsNotStringMask); |
- __ cmp(scratch, kInternalizedTag | kStringTag); |
- __ j(not_equal, label); |
+ STATIC_ASSERT(kInternalizedTag == 0 && kStringTag == 0); |
+ __ test(scratch, Immediate(kIsNotStringMask | kIsNotInternalizedMask)); |
+ __ j(not_zero, label); |
} |
@@ -6609,14 +6609,10 @@ void ICCompareStub::GenerateInternalizedStrings(MacroAssembler* masm) { |
__ mov(tmp2, FieldOperand(right, HeapObject::kMapOffset)); |
__ movzx_b(tmp1, FieldOperand(tmp1, Map::kInstanceTypeOffset)); |
__ movzx_b(tmp2, FieldOperand(tmp2, Map::kInstanceTypeOffset)); |
- STATIC_ASSERT(kInternalizedTag != 0); |
- __ and_(tmp1, Immediate(kIsNotStringMask | kIsInternalizedMask)); |
- __ cmpb(tmp1, kInternalizedTag | kStringTag); |
- __ j(not_equal, &miss, Label::kNear); |
- |
- __ and_(tmp2, Immediate(kIsNotStringMask | kIsInternalizedMask)); |
- __ cmpb(tmp2, kInternalizedTag | kStringTag); |
- __ j(not_equal, &miss, Label::kNear); |
+ STATIC_ASSERT(kInternalizedTag == 0 && kStringTag == 0); |
+ __ or_(tmp1, tmp2); |
+ __ test(tmp1, Immediate(kIsNotStringMask | kIsNotInternalizedMask)); |
+ __ j(not_zero, &miss, Label::kNear); |
// Internalized strings are compared by identity. |
Label done; |
@@ -6655,7 +6651,6 @@ void ICCompareStub::GenerateUniqueNames(MacroAssembler* masm) { |
// Check that both operands are unique names. This leaves the instance |
// types loaded in tmp1 and tmp2. |
- STATIC_ASSERT(kInternalizedTag != 0); |
__ mov(tmp1, FieldOperand(left, HeapObject::kMapOffset)); |
__ mov(tmp2, FieldOperand(right, HeapObject::kMapOffset)); |
__ movzx_b(tmp1, FieldOperand(tmp1, Map::kInstanceTypeOffset)); |
@@ -6731,10 +6726,10 @@ void ICCompareStub::GenerateStrings(MacroAssembler* masm) { |
// also know they are both strings. |
if (equality) { |
Label do_compare; |
- STATIC_ASSERT(kInternalizedTag != 0); |
- __ and_(tmp1, tmp2); |
- __ test(tmp1, Immediate(kIsInternalizedMask)); |
- __ j(zero, &do_compare, Label::kNear); |
+ STATIC_ASSERT(kInternalizedTag == 0); |
+ __ or_(tmp1, tmp2); |
+ __ test(tmp1, Immediate(kIsNotInternalizedMask)); |
+ __ j(not_zero, &do_compare, Label::kNear); |
// Make sure eax is non-zero. At this point input operands are |
// guaranteed to be non-zero. |
ASSERT(right.is(eax)); |