OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 7198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7209 __ vldr(d7, r7, HeapNumber::kValueOffset); | 7209 __ vldr(d7, r7, HeapNumber::kValueOffset); |
7210 } else { | 7210 } else { |
7211 __ Ldrd(r2, r3, FieldMemOperand(r1, HeapNumber::kValueOffset)); | 7211 __ Ldrd(r2, r3, FieldMemOperand(r1, HeapNumber::kValueOffset)); |
7212 __ Ldrd(r0, r1, FieldMemOperand(r0, HeapNumber::kValueOffset)); | 7212 __ Ldrd(r0, r1, FieldMemOperand(r0, HeapNumber::kValueOffset)); |
7213 } | 7213 } |
7214 __ jmp(both_loaded_as_doubles); | 7214 __ jmp(both_loaded_as_doubles); |
7215 } | 7215 } |
7216 | 7216 |
7217 | 7217 |
7218 // Fast negative check for symbol-to-symbol equality. | 7218 // Fast negative check for symbol-to-symbol equality. |
7219 static void EmitCheckForSymbols(MacroAssembler* masm, Label* slow) { | 7219 static void EmitCheckForSymbolsOrObjects(MacroAssembler* masm, |
| 7220 Label* possible_strings, |
| 7221 Label* not_both_strings) { |
7220 // r2 is object type of r0. | 7222 // r2 is object type of r0. |
7221 // Ensure that no non-strings have the symbol bit set. | 7223 // Ensure that no non-strings have the symbol bit set. |
7222 ASSERT(kNotStringTag + kIsSymbolMask > LAST_TYPE); | 7224 Label object_test; |
7223 ASSERT(kSymbolTag != 0); | 7225 ASSERT(kSymbolTag != 0); |
| 7226 __ tst(r2, Operand(kIsNotStringMask)); |
| 7227 __ b(ne, &object_test); |
7224 __ tst(r2, Operand(kIsSymbolMask)); | 7228 __ tst(r2, Operand(kIsSymbolMask)); |
7225 __ b(eq, slow); | 7229 __ b(eq, possible_strings); |
7226 __ ldr(r3, FieldMemOperand(r1, HeapObject::kMapOffset)); | 7230 __ CompareObjectType(r1, r3, r3, FIRST_NONSTRING_TYPE); |
7227 __ ldrb(r3, FieldMemOperand(r3, Map::kInstanceTypeOffset)); | 7231 __ b(ge, not_both_strings); |
7228 __ tst(r3, Operand(kIsSymbolMask)); | 7232 __ tst(r3, Operand(kIsSymbolMask)); |
7229 __ b(eq, slow); | 7233 __ b(eq, possible_strings); |
7230 | 7234 |
7231 // Both are symbols. We already checked they weren't the same pointer | 7235 // Both are symbols. We already checked they weren't the same pointer |
7232 // so they are not equal. | 7236 // so they are not equal. |
7233 __ mov(r0, Operand(1)); // Non-zero indicates not equal. | 7237 __ mov(r0, Operand(1)); // Non-zero indicates not equal. |
7234 __ mov(pc, Operand(lr)); // Return. | 7238 __ mov(pc, Operand(lr)); // Return. |
| 7239 |
| 7240 __ bind(&object_test); |
| 7241 __ cmp(r2, Operand(FIRST_JS_OBJECT_TYPE)); |
| 7242 __ b(lt, not_both_strings); |
| 7243 __ CompareObjectType(r1, r2, r3, FIRST_JS_OBJECT_TYPE); |
| 7244 __ b(lt, not_both_strings); |
| 7245 // If both objects are undetectable, they are equal. Otherwise, they |
| 7246 // are not equal, since they are different objects and an object is not |
| 7247 // equal to undefined. |
| 7248 __ ldr(r3, FieldMemOperand(r0, HeapObject::kMapOffset)); |
| 7249 __ ldrb(r2, FieldMemOperand(r2, Map::kBitFieldOffset)); |
| 7250 __ ldrb(r3, FieldMemOperand(r3, Map::kBitFieldOffset)); |
| 7251 __ and_(r0, r2, Operand(r3)); |
| 7252 __ and_(r0, r0, Operand(1 << Map::kIsUndetectable)); |
| 7253 __ eor(r0, r0, Operand(1 << Map::kIsUndetectable)); |
| 7254 __ mov(pc, Operand(lr)); // Return. |
7235 } | 7255 } |
7236 | 7256 |
7237 | 7257 |
7238 void NumberToStringStub::GenerateLookupNumberStringCache(MacroAssembler* masm, | 7258 void NumberToStringStub::GenerateLookupNumberStringCache(MacroAssembler* masm, |
7239 Register object, | 7259 Register object, |
7240 Register result, | 7260 Register result, |
7241 Register scratch1, | 7261 Register scratch1, |
7242 Register scratch2, | 7262 Register scratch2, |
7243 Register scratch3, | 7263 Register scratch3, |
7244 bool object_is_smi, | 7264 bool object_is_smi, |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7438 // In this case r2 will contain the type of r0. Never falls through. | 7458 // In this case r2 will contain the type of r0. Never falls through. |
7439 EmitCheckForTwoHeapNumbers(masm, | 7459 EmitCheckForTwoHeapNumbers(masm, |
7440 &both_loaded_as_doubles, | 7460 &both_loaded_as_doubles, |
7441 &check_for_symbols, | 7461 &check_for_symbols, |
7442 &flat_string_check); | 7462 &flat_string_check); |
7443 | 7463 |
7444 __ bind(&check_for_symbols); | 7464 __ bind(&check_for_symbols); |
7445 // In the strict case the EmitStrictTwoHeapObjectCompare already took care of | 7465 // In the strict case the EmitStrictTwoHeapObjectCompare already took care of |
7446 // symbols. | 7466 // symbols. |
7447 if (cc_ == eq && !strict_) { | 7467 if (cc_ == eq && !strict_) { |
7448 // Either jumps to slow or returns the answer. Assumes that r2 is the type | 7468 // Returns an answer for two symbols or two detectable objects. |
7449 // of r0 on entry. | 7469 // Otherwise jumps to string case or not both strings case. |
7450 EmitCheckForSymbols(masm, &flat_string_check); | 7470 // Assumes that r2 is the type of r0 on entry. |
| 7471 EmitCheckForSymbolsOrObjects(masm, &flat_string_check, &slow); |
7451 } | 7472 } |
7452 | 7473 |
7453 // Check for both being sequential ASCII strings, and inline if that is the | 7474 // Check for both being sequential ASCII strings, and inline if that is the |
7454 // case. | 7475 // case. |
7455 __ bind(&flat_string_check); | 7476 __ bind(&flat_string_check); |
7456 | 7477 |
7457 __ JumpIfNonSmisNotBothSequentialAsciiStrings(r0, r1, r2, r3, &slow); | 7478 __ JumpIfNonSmisNotBothSequentialAsciiStrings(r0, r1, r2, r3, &slow); |
7458 | 7479 |
7459 __ IncrementCounter(&Counters::string_compare_native, 1, r2, r3); | 7480 __ IncrementCounter(&Counters::string_compare_native, 1, r2, r3); |
7460 StringCompareStub::GenerateCompareFlatAsciiStrings(masm, | 7481 StringCompareStub::GenerateCompareFlatAsciiStrings(masm, |
(...skipping 3628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11089 __ bind(&string_add_runtime); | 11110 __ bind(&string_add_runtime); |
11090 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); | 11111 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); |
11091 } | 11112 } |
11092 | 11113 |
11093 | 11114 |
11094 #undef __ | 11115 #undef __ |
11095 | 11116 |
11096 } } // namespace v8::internal | 11117 } } // namespace v8::internal |
11097 | 11118 |
11098 #endif // V8_TARGET_ARCH_ARM | 11119 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |