| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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_X64 | 5 #if V8_TARGET_ARCH_X64 |
| 6 | 6 |
| 7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
| 8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
| 9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
| 10 #include "src/ic/handler-compiler.h" | 10 #include "src/ic/handler-compiler.h" |
| (...skipping 3298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3309 __ bind(&loop); | 3309 __ bind(&loop); |
| 3310 __ movb(scratch, Operand(left, index, times_1, 0)); | 3310 __ movb(scratch, Operand(left, index, times_1, 0)); |
| 3311 __ cmpb(scratch, Operand(right, index, times_1, 0)); | 3311 __ cmpb(scratch, Operand(right, index, times_1, 0)); |
| 3312 __ j(not_equal, chars_not_equal, near_jump); | 3312 __ j(not_equal, chars_not_equal, near_jump); |
| 3313 __ incq(index); | 3313 __ incq(index); |
| 3314 __ j(not_zero, &loop); | 3314 __ j(not_zero, &loop); |
| 3315 } | 3315 } |
| 3316 | 3316 |
| 3317 | 3317 |
| 3318 void StringCompareStub::Generate(MacroAssembler* masm) { | 3318 void StringCompareStub::Generate(MacroAssembler* masm) { |
| 3319 Label runtime; | 3319 // ----------- S t a t e ------------- |
| 3320 | 3320 // -- rdx : left string |
| 3321 // Stack frame on entry. | 3321 // -- rax : right string |
| 3322 // rsp[0] : return address | 3322 // -- rsp[0] : return address |
| 3323 // rsp[8] : right string | 3323 // ----------------------------------- |
| 3324 // rsp[16] : left string | 3324 __ AssertString(rdx); |
| 3325 | 3325 __ AssertString(rax); |
| 3326 StackArgumentsAccessor args(rsp, 2, ARGUMENTS_DONT_CONTAIN_RECEIVER); | |
| 3327 __ movp(rdx, args.GetArgumentOperand(0)); // left | |
| 3328 __ movp(rax, args.GetArgumentOperand(1)); // right | |
| 3329 | 3326 |
| 3330 // Check for identity. | 3327 // Check for identity. |
| 3331 Label not_same; | 3328 Label not_same; |
| 3332 __ cmpp(rdx, rax); | 3329 __ cmpp(rdx, rax); |
| 3333 __ j(not_equal, ¬_same, Label::kNear); | 3330 __ j(not_equal, ¬_same, Label::kNear); |
| 3334 __ Move(rax, Smi::FromInt(EQUAL)); | 3331 __ Move(rax, Smi::FromInt(EQUAL)); |
| 3335 Counters* counters = isolate()->counters(); | 3332 __ IncrementCounter(isolate()->counters()->string_compare_native(), 1); |
| 3336 __ IncrementCounter(counters->string_compare_native(), 1); | 3333 __ Ret(); |
| 3337 __ ret(2 * kPointerSize); | |
| 3338 | 3334 |
| 3339 __ bind(¬_same); | 3335 __ bind(¬_same); |
| 3340 | 3336 |
| 3341 // Check that both are sequential one-byte strings. | 3337 // Check that both are sequential one-byte strings. |
| 3338 Label runtime; |
| 3342 __ JumpIfNotBothSequentialOneByteStrings(rdx, rax, rcx, rbx, &runtime); | 3339 __ JumpIfNotBothSequentialOneByteStrings(rdx, rax, rcx, rbx, &runtime); |
| 3343 | 3340 |
| 3344 // Inline comparison of one-byte strings. | 3341 // Inline comparison of one-byte strings. |
| 3345 __ IncrementCounter(counters->string_compare_native(), 1); | 3342 __ IncrementCounter(isolate()->counters()->string_compare_native(), 1); |
| 3346 // Drop arguments from the stack | |
| 3347 __ PopReturnAddressTo(rcx); | |
| 3348 __ addp(rsp, Immediate(2 * kPointerSize)); | |
| 3349 __ PushReturnAddressFrom(rcx); | |
| 3350 StringHelper::GenerateCompareFlatOneByteStrings(masm, rdx, rax, rcx, rbx, rdi, | 3343 StringHelper::GenerateCompareFlatOneByteStrings(masm, rdx, rax, rcx, rbx, rdi, |
| 3351 r8); | 3344 r8); |
| 3352 | 3345 |
| 3353 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 3346 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
| 3354 // tagged as a small integer. | 3347 // tagged as a small integer. |
| 3355 __ bind(&runtime); | 3348 __ bind(&runtime); |
| 3349 __ PopReturnAddressTo(rcx); |
| 3350 __ Push(rdx); |
| 3351 __ Push(rax); |
| 3352 __ PushReturnAddressFrom(rcx); |
| 3356 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 3353 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
| 3357 } | 3354 } |
| 3358 | 3355 |
| 3359 | 3356 |
| 3360 void BinaryOpICWithAllocationSiteStub::Generate(MacroAssembler* masm) { | 3357 void BinaryOpICWithAllocationSiteStub::Generate(MacroAssembler* masm) { |
| 3361 // ----------- S t a t e ------------- | 3358 // ----------- S t a t e ------------- |
| 3362 // -- rdx : left | 3359 // -- rdx : left |
| 3363 // -- rax : right | 3360 // -- rax : right |
| 3364 // -- rsp[0] : return address | 3361 // -- rsp[0] : return address |
| 3365 // ----------------------------------- | 3362 // ----------------------------------- |
| (...skipping 2195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5561 kStackSpace, nullptr, return_value_operand, NULL); | 5558 kStackSpace, nullptr, return_value_operand, NULL); |
| 5562 } | 5559 } |
| 5563 | 5560 |
| 5564 | 5561 |
| 5565 #undef __ | 5562 #undef __ |
| 5566 | 5563 |
| 5567 } // namespace internal | 5564 } // namespace internal |
| 5568 } // namespace v8 | 5565 } // namespace v8 |
| 5569 | 5566 |
| 5570 #endif // V8_TARGET_ARCH_X64 | 5567 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |