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

Side by Side Diff: src/x64/regexp-macro-assembler-x64.cc

Issue 1114001: Refactoring of RegExp interface to better support calling several times in a row. (Closed)
Patch Set: Fix type that snuck into the commit. Created 10 years, 9 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
« src/string.js ('K') | « src/x64/codegen-x64.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2009 the V8 project authors. All rights reserved. 1 // Copyright 2009 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 693 matching lines...) Expand 10 before | Expand all | Expand 10 after
704 __ bind(&stack_ok); 704 __ bind(&stack_ok);
705 705
706 // Allocate space on stack for registers. 706 // Allocate space on stack for registers.
707 __ subq(rsp, Immediate(num_registers_ * kPointerSize)); 707 __ subq(rsp, Immediate(num_registers_ * kPointerSize));
708 // Load string length. 708 // Load string length.
709 __ movq(rsi, Operand(rbp, kInputEnd)); 709 __ movq(rsi, Operand(rbp, kInputEnd));
710 // Load input position. 710 // Load input position.
711 __ movq(rdi, Operand(rbp, kInputStart)); 711 __ movq(rdi, Operand(rbp, kInputStart));
712 // Set up rdi to be negative offset from string end. 712 // Set up rdi to be negative offset from string end.
713 __ subq(rdi, rsi); 713 __ subq(rdi, rsi);
714 // Set rax to address of char before start of input 714 // Set rax to address of char before start of the string
715 // (effectively string position -1). 715 // (effectively string position -1).
716 __ lea(rax, Operand(rdi, -char_size())); 716 __ movq(rbx, Operand(rbp, kStartIndex));
717 __ neg(rbx);
718 if (mode_ == UC16) {
719 __ lea(rax, Operand(rdi, rbx, times_2, -char_size()));
720 } else {
721 __ lea(rax, Operand(rdi, rbx, times_1, -char_size()));
722 }
717 // Store this value in a local variable, for use when clearing 723 // Store this value in a local variable, for use when clearing
718 // position registers. 724 // position registers.
719 __ movq(Operand(rbp, kInputStartMinusOne), rax); 725 __ movq(Operand(rbp, kInputStartMinusOne), rax);
720 726
721 // Determine whether the start index is zero, that is at the start of the 727 // Determine whether the start index is zero, that is at the start of the
722 // string, and store that value in a local variable. 728 // string, and store that value in a local variable.
723 __ movq(rbx, Operand(rbp, kStartIndex)); 729 __ movq(rbx, Operand(rbp, kStartIndex));
724 __ xor_(rcx, rcx); // setcc only operates on cl (lower byte of rcx). 730 __ xor_(rcx, rcx); // setcc only operates on cl (lower byte of rcx).
725 __ testq(rbx, rbx); 731 __ testq(rbx, rbx);
726 __ setcc(zero, rcx); // 1 if 0 (start of string), 0 if positive. 732 __ setcc(zero, rcx); // 1 if 0 (start of string), 0 if positive.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 __ movq(current_character(), Immediate('\n')); 769 __ movq(current_character(), Immediate('\n'));
764 __ jmp(&start_label_); 770 __ jmp(&start_label_);
765 771
766 772
767 // Exit code: 773 // Exit code:
768 if (success_label_.is_linked()) { 774 if (success_label_.is_linked()) {
769 // Save captures when successful. 775 // Save captures when successful.
770 __ bind(&success_label_); 776 __ bind(&success_label_);
771 if (num_saved_registers_ > 0) { 777 if (num_saved_registers_ > 0) {
772 // copy captures to output 778 // copy captures to output
779 __ movq(rdx, Operand(rbp, kStartIndex));
773 __ movq(rbx, Operand(rbp, kRegisterOutput)); 780 __ movq(rbx, Operand(rbp, kRegisterOutput));
774 __ movq(rcx, Operand(rbp, kInputEnd)); 781 __ movq(rcx, Operand(rbp, kInputEnd));
775 __ subq(rcx, Operand(rbp, kInputStart)); 782 __ subq(rcx, Operand(rbp, kInputStart));
783 if (mode_ == UC16) {
784 __ lea(rcx, Operand(rcx, rdx, times_2, 0));
785 } else {
786 __ addq(rcx, rdx);
787 }
776 for (int i = 0; i < num_saved_registers_; i++) { 788 for (int i = 0; i < num_saved_registers_; i++) {
777 __ movq(rax, register_location(i)); 789 __ movq(rax, register_location(i));
778 __ addq(rax, rcx); // Convert to index from start, not end. 790 __ addq(rax, rcx); // Convert to index from start, not end.
779 if (mode_ == UC16) { 791 if (mode_ == UC16) {
780 __ sar(rax, Immediate(1)); // Convert byte index to character index. 792 __ sar(rax, Immediate(1)); // Convert byte index to character index.
781 } 793 }
782 __ movl(Operand(rbx, i * kIntSize), rax); 794 __ movl(Operand(rbx, i * kIntSize), rax);
783 } 795 }
784 } 796 }
785 __ movq(rax, Immediate(SUCCESS)); 797 __ movq(rax, Immediate(SUCCESS));
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after
1294 Operand(rsi, rdi, times_1, cp_offset * sizeof(uc16))); 1306 Operand(rsi, rdi, times_1, cp_offset * sizeof(uc16)));
1295 } 1307 }
1296 } 1308 }
1297 } 1309 }
1298 1310
1299 #undef __ 1311 #undef __
1300 1312
1301 #endif // V8_NATIVE_REGEXP 1313 #endif // V8_NATIVE_REGEXP
1302 1314
1303 }} // namespace v8::internal 1315 }} // namespace v8::internal
OLDNEW
« src/string.js ('K') | « src/x64/codegen-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698