diff options
author | Leon Clarke <leonclarke@google.com> | 2010-01-27 17:25:45 +0000 |
---|---|---|
committer | Leon Clarke <leonclarke@google.com> | 2010-01-27 17:31:21 +0000 |
commit | d91b9f7d46489a9ee00f9cb415630299c76a502b (patch) | |
tree | 741552f95883bb7461cf7c1d36335cef68804a5b /src/arm/macro-assembler-arm.cc | |
parent | eab96aab0834f21954b5d6aa6366bcfb348ed811 (diff) | |
download | android_external_v8-d91b9f7d46489a9ee00f9cb415630299c76a502b.tar.gz android_external_v8-d91b9f7d46489a9ee00f9cb415630299c76a502b.tar.bz2 android_external_v8-d91b9f7d46489a9ee00f9cb415630299c76a502b.zip |
Merge from v8 at revision 3723
Diffstat (limited to 'src/arm/macro-assembler-arm.cc')
-rw-r--r-- | src/arm/macro-assembler-arm.cc | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc index 18cadaca..6c3bbbb8 100644 --- a/src/arm/macro-assembler-arm.cc +++ b/src/arm/macro-assembler-arm.cc @@ -1221,6 +1221,46 @@ void MacroAssembler::LoadContext(Register dst, int context_chain_length) { } +void MacroAssembler::JumpIfNonSmisNotBothSequentialAsciiStrings( + Register first, + Register second, + Register scratch1, + Register scratch2, + Label* failure) { + // Test that both first and second are sequential ASCII strings. + // Assume that they are non-smis. + ldr(scratch1, FieldMemOperand(first, HeapObject::kMapOffset)); + ldr(scratch2, FieldMemOperand(second, HeapObject::kMapOffset)); + ldrb(scratch1, FieldMemOperand(scratch1, Map::kInstanceTypeOffset)); + ldrb(scratch2, FieldMemOperand(scratch2, Map::kInstanceTypeOffset)); + int kFlatAsciiStringMask = + kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask; + int kFlatAsciiStringTag = ASCII_STRING_TYPE; + and_(scratch1, scratch1, Operand(kFlatAsciiStringMask)); + and_(scratch2, scratch2, Operand(kFlatAsciiStringMask)); + cmp(scratch1, Operand(kFlatAsciiStringTag)); + // Ignore second test if first test failed. + cmp(scratch2, Operand(kFlatAsciiStringTag), eq); + b(ne, failure); +} + +void MacroAssembler::JumpIfNotBothSequentialAsciiStrings(Register first, + Register second, + Register scratch1, + Register scratch2, + Label* failure) { + // Check that neither is a smi. + ASSERT_EQ(0, kSmiTag); + and_(scratch1, first, Operand(second)); + tst(scratch1, Operand(kSmiTagMask)); + b(eq, failure); + JumpIfNonSmisNotBothSequentialAsciiStrings(first, + second, + scratch1, + scratch2, + failure); +} + #ifdef ENABLE_DEBUGGER_SUPPORT CodePatcher::CodePatcher(byte* address, int instructions) |