summaryrefslogtreecommitdiffstats
path: root/src/arm/macro-assembler-arm.cc
diff options
context:
space:
mode:
authorLeon Clarke <leonclarke@google.com>2010-01-27 17:25:45 +0000
committerLeon Clarke <leonclarke@google.com>2010-01-27 17:31:21 +0000
commitd91b9f7d46489a9ee00f9cb415630299c76a502b (patch)
tree741552f95883bb7461cf7c1d36335cef68804a5b /src/arm/macro-assembler-arm.cc
parenteab96aab0834f21954b5d6aa6366bcfb348ed811 (diff)
downloadandroid_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.cc40
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)