Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(207)

Side by Side Diff: src/arm64/code-stubs-arm64.cc

Issue 1183593005: ARM64: remove stack pushes without frame in RegExpExecStub. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix offsets Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-487981.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_ARM64 7 #if V8_TARGET_ARCH_ARM64
8 8
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 2287 matching lines...) Expand 10 before | Expand all | Expand 10 after
2298 // x19 subject subject string 2298 // x19 subject subject string
2299 // x20 regexp_data RegExp data (FixedArray) 2299 // x20 regexp_data RegExp data (FixedArray)
2300 // x21 last_match_info_elements info relative to the last match 2300 // x21 last_match_info_elements info relative to the last match
2301 // (FixedArray) 2301 // (FixedArray)
2302 // x22 code_object generated regexp code 2302 // x22 code_object generated regexp code
2303 Register subject = x19; 2303 Register subject = x19;
2304 Register regexp_data = x20; 2304 Register regexp_data = x20;
2305 Register last_match_info_elements = x21; 2305 Register last_match_info_elements = x21;
2306 Register code_object = x22; 2306 Register code_object = x22;
2307 2307
2308 // TODO(jbramley): Is it necessary to preserve these? I don't think ARM does. 2308 // Stack frame.
2309 CPURegList used_callee_saved_registers(subject, 2309 // jssp[00]: last_match_info (JSArray)
2310 regexp_data, 2310 // jssp[08]: previous index
2311 last_match_info_elements, 2311 // jssp[16]: subject string
2312 code_object); 2312 // jssp[24]: JSRegExp object
2313 __ PushCPURegList(used_callee_saved_registers);
2314 2313
2315 // Stack frame. 2314 const int kLastMatchInfoOffset = 0 * kPointerSize;
2316 // jssp[0] : x19 2315 const int kPreviousIndexOffset = 1 * kPointerSize;
2317 // jssp[8] : x20 2316 const int kSubjectOffset = 2 * kPointerSize;
2318 // jssp[16]: x21 2317 const int kJSRegExpOffset = 3 * kPointerSize;
2319 // jssp[24]: x22
2320 // jssp[32]: last_match_info (JSArray)
2321 // jssp[40]: previous index
2322 // jssp[48]: subject string
2323 // jssp[56]: JSRegExp object
2324
2325 const int kLastMatchInfoOffset = 4 * kPointerSize;
2326 const int kPreviousIndexOffset = 5 * kPointerSize;
2327 const int kSubjectOffset = 6 * kPointerSize;
2328 const int kJSRegExpOffset = 7 * kPointerSize;
2329 2318
2330 // Ensure that a RegExp stack is allocated. 2319 // Ensure that a RegExp stack is allocated.
2331 ExternalReference address_of_regexp_stack_memory_address = 2320 ExternalReference address_of_regexp_stack_memory_address =
2332 ExternalReference::address_of_regexp_stack_memory_address(isolate()); 2321 ExternalReference::address_of_regexp_stack_memory_address(isolate());
2333 ExternalReference address_of_regexp_stack_memory_size = 2322 ExternalReference address_of_regexp_stack_memory_size =
2334 ExternalReference::address_of_regexp_stack_memory_size(isolate()); 2323 ExternalReference::address_of_regexp_stack_memory_size(isolate());
2335 __ Mov(x10, address_of_regexp_stack_memory_size); 2324 __ Mov(x10, address_of_regexp_stack_memory_size);
2336 __ Ldr(x10, MemOperand(x10)); 2325 __ Ldr(x10, MemOperand(x10));
2337 __ Cbz(x10, &runtime); 2326 __ Cbz(x10, &runtime);
2338 2327
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
2685 STATIC_ASSERT(kSmiTag == 0); 2674 STATIC_ASSERT(kSmiTag == 0);
2686 __ Bic(x11, current_offset, kSmiShiftMask); 2675 __ Bic(x11, current_offset, kSmiShiftMask);
2687 __ Stp(x10, 2676 __ Stp(x10,
2688 x11, 2677 x11,
2689 MemOperand(last_match_offsets, kXRegSize * 2, PostIndex)); 2678 MemOperand(last_match_offsets, kXRegSize * 2, PostIndex));
2690 __ B(&next_capture); 2679 __ B(&next_capture);
2691 __ Bind(&done); 2680 __ Bind(&done);
2692 2681
2693 // Return last match info. 2682 // Return last match info.
2694 __ Peek(x0, kLastMatchInfoOffset); 2683 __ Peek(x0, kLastMatchInfoOffset);
2695 __ PopCPURegList(used_callee_saved_registers);
2696 // Drop the 4 arguments of the stub from the stack. 2684 // Drop the 4 arguments of the stub from the stack.
2697 __ Drop(4); 2685 __ Drop(4);
2698 __ Ret(); 2686 __ Ret();
2699 2687
2700 __ Bind(&exception); 2688 __ Bind(&exception);
2701 Register exception_value = x0; 2689 Register exception_value = x0;
2702 // A stack overflow (on the backtrack stack) may have occured 2690 // A stack overflow (on the backtrack stack) may have occured
2703 // in the RegExp code but no exception has been created yet. 2691 // in the RegExp code but no exception has been created yet.
2704 // If there is no pending exception, handle that in the runtime system. 2692 // If there is no pending exception, handle that in the runtime system.
2705 __ Mov(x10, Operand(isolate()->factory()->the_hole_value())); 2693 __ Mov(x10, Operand(isolate()->factory()->the_hole_value()));
2706 __ Mov(x11, 2694 __ Mov(x11,
2707 Operand(ExternalReference(Isolate::kPendingExceptionAddress, 2695 Operand(ExternalReference(Isolate::kPendingExceptionAddress,
2708 isolate()))); 2696 isolate())));
2709 __ Ldr(exception_value, MemOperand(x11)); 2697 __ Ldr(exception_value, MemOperand(x11));
2710 __ Cmp(x10, exception_value); 2698 __ Cmp(x10, exception_value);
2711 __ B(eq, &runtime); 2699 __ B(eq, &runtime);
2712 2700
2713 // For exception, throw the exception again. 2701 // For exception, throw the exception again.
2714 __ TailCallRuntime(Runtime::kRegExpExecReThrow, 4, 1); 2702 __ TailCallRuntime(Runtime::kRegExpExecReThrow, 4, 1);
2715 2703
2716 __ Bind(&failure); 2704 __ Bind(&failure);
2717 __ Mov(x0, Operand(isolate()->factory()->null_value())); 2705 __ Mov(x0, Operand(isolate()->factory()->null_value()));
2718 __ PopCPURegList(used_callee_saved_registers);
2719 // Drop the 4 arguments of the stub from the stack. 2706 // Drop the 4 arguments of the stub from the stack.
2720 __ Drop(4); 2707 __ Drop(4);
2721 __ Ret(); 2708 __ Ret();
2722 2709
2723 __ Bind(&runtime); 2710 __ Bind(&runtime);
2724 __ PopCPURegList(used_callee_saved_registers);
2725 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); 2711 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1);
2726 2712
2727 // Deferred code for string handling. 2713 // Deferred code for string handling.
2728 // (6) Not a long external string? If yes, go to (8). 2714 // (6) Not a long external string? If yes, go to (8).
2729 __ Bind(&not_seq_nor_cons); 2715 __ Bind(&not_seq_nor_cons);
2730 // Compare flags are still set. 2716 // Compare flags are still set.
2731 __ B(ne, &not_long_external); // Go to (8). 2717 __ B(ne, &not_long_external); // Go to (8).
2732 2718
2733 // (7) External string. Make it, offset-wise, look like a sequential string. 2719 // (7) External string. Make it, offset-wise, look like a sequential string.
2734 __ Bind(&external_string); 2720 __ Bind(&external_string);
(...skipping 3096 matching lines...) Expand 10 before | Expand all | Expand 10 after
5831 MemOperand(fp, 6 * kPointerSize), NULL); 5817 MemOperand(fp, 6 * kPointerSize), NULL);
5832 } 5818 }
5833 5819
5834 5820
5835 #undef __ 5821 #undef __
5836 5822
5837 } // namespace internal 5823 } // namespace internal
5838 } // namespace v8 5824 } // namespace v8
5839 5825
5840 #endif // V8_TARGET_ARCH_ARM64 5826 #endif // V8_TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-487981.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698