OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #if V8_TARGET_ARCH_ARM | 5 #if V8_TARGET_ARCH_ARM |
6 | 6 |
7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 3301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3312 __ ldrb(scratch1, MemOperand(left, index)); | 3312 __ ldrb(scratch1, MemOperand(left, index)); |
3313 __ ldrb(scratch2, MemOperand(right, index)); | 3313 __ ldrb(scratch2, MemOperand(right, index)); |
3314 __ cmp(scratch1, scratch2); | 3314 __ cmp(scratch1, scratch2); |
3315 __ b(ne, chars_not_equal); | 3315 __ b(ne, chars_not_equal); |
3316 __ add(index, index, Operand(1), SetCC); | 3316 __ add(index, index, Operand(1), SetCC); |
3317 __ b(ne, &loop); | 3317 __ b(ne, &loop); |
3318 } | 3318 } |
3319 | 3319 |
3320 | 3320 |
3321 void StringCompareStub::Generate(MacroAssembler* masm) { | 3321 void StringCompareStub::Generate(MacroAssembler* masm) { |
3322 Label runtime; | 3322 // ----------- S t a t e ------------- |
3323 | 3323 // -- r1 : left |
3324 Counters* counters = isolate()->counters(); | 3324 // -- r0 : right |
3325 | 3325 // -- lr : return address |
3326 // Stack frame on entry. | 3326 // ----------------------------------- |
3327 // sp[0]: right string | 3327 __ AssertString(r1); |
3328 // sp[4]: left string | 3328 __ AssertString(r0); |
3329 __ Ldrd(r0 , r1, MemOperand(sp)); // Load right in r0, left in r1. | |
3330 | 3329 |
3331 Label not_same; | 3330 Label not_same; |
3332 __ cmp(r0, r1); | 3331 __ cmp(r0, r1); |
3333 __ b(ne, ¬_same); | 3332 __ b(ne, ¬_same); |
3334 STATIC_ASSERT(EQUAL == 0); | |
3335 STATIC_ASSERT(kSmiTag == 0); | |
3336 __ mov(r0, Operand(Smi::FromInt(EQUAL))); | 3333 __ mov(r0, Operand(Smi::FromInt(EQUAL))); |
3337 __ IncrementCounter(counters->string_compare_native(), 1, r1, r2); | 3334 __ IncrementCounter(isolate()->counters()->string_compare_native(), 1, r1, |
3338 __ add(sp, sp, Operand(2 * kPointerSize)); | 3335 r2); |
3339 __ Ret(); | 3336 __ Ret(); |
3340 | 3337 |
3341 __ bind(¬_same); | 3338 __ bind(¬_same); |
3342 | 3339 |
3343 // Check that both objects are sequential one-byte strings. | 3340 // Check that both objects are sequential one-byte strings. |
| 3341 Label runtime; |
3344 __ JumpIfNotBothSequentialOneByteStrings(r1, r0, r2, r3, &runtime); | 3342 __ JumpIfNotBothSequentialOneByteStrings(r1, r0, r2, r3, &runtime); |
3345 | 3343 |
3346 // Compare flat one-byte strings natively. Remove arguments from stack first. | 3344 // Compare flat one-byte strings natively. |
3347 __ IncrementCounter(counters->string_compare_native(), 1, r2, r3); | 3345 __ IncrementCounter(isolate()->counters()->string_compare_native(), 1, r2, |
3348 __ add(sp, sp, Operand(2 * kPointerSize)); | 3346 r3); |
3349 StringHelper::GenerateCompareFlatOneByteStrings(masm, r1, r0, r2, r3, r4, r5); | 3347 StringHelper::GenerateCompareFlatOneByteStrings(masm, r1, r0, r2, r3, r4, r5); |
3350 | 3348 |
3351 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 3349 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
3352 // tagged as a small integer. | 3350 // tagged as a small integer. |
3353 __ bind(&runtime); | 3351 __ bind(&runtime); |
| 3352 __ Push(r1, r0); |
3354 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 3353 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
3355 } | 3354 } |
3356 | 3355 |
3357 | 3356 |
3358 void BinaryOpICWithAllocationSiteStub::Generate(MacroAssembler* masm) { | 3357 void BinaryOpICWithAllocationSiteStub::Generate(MacroAssembler* masm) { |
3359 // ----------- S t a t e ------------- | 3358 // ----------- S t a t e ------------- |
3360 // -- r1 : left | 3359 // -- r1 : left |
3361 // -- r0 : right | 3360 // -- r0 : right |
3362 // -- lr : return address | 3361 // -- lr : return address |
3363 // ----------------------------------- | 3362 // ----------------------------------- |
(...skipping 2174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5538 MemOperand(fp, 6 * kPointerSize), NULL); | 5537 MemOperand(fp, 6 * kPointerSize), NULL); |
5539 } | 5538 } |
5540 | 5539 |
5541 | 5540 |
5542 #undef __ | 5541 #undef __ |
5543 | 5542 |
5544 } // namespace internal | 5543 } // namespace internal |
5545 } // namespace v8 | 5544 } // namespace v8 |
5546 | 5545 |
5547 #endif // V8_TARGET_ARCH_ARM | 5546 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |