OLD | NEW |
1 // Copyright 2008-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2008-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 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
646 __ mov(eax, EXCEPTION); | 646 __ mov(eax, EXCEPTION); |
647 __ jmp(&exit_label_); | 647 __ jmp(&exit_label_); |
648 | 648 |
649 __ bind(&stack_limit_hit); | 649 __ bind(&stack_limit_hit); |
650 CallCheckStackGuardState(ebx); | 650 CallCheckStackGuardState(ebx); |
651 __ or_(eax, Operand(eax)); | 651 __ or_(eax, Operand(eax)); |
652 // If returned value is non-zero, we exit with the returned value as result. | 652 // If returned value is non-zero, we exit with the returned value as result. |
653 __ j(not_zero, &exit_label_); | 653 __ j(not_zero, &exit_label_); |
654 | 654 |
655 __ bind(&stack_ok); | 655 __ bind(&stack_ok); |
| 656 // Load start index for later use. |
| 657 __ mov(ebx, Operand(ebp, kStartIndex)); |
656 | 658 |
657 // Allocate space on stack for registers. | 659 // Allocate space on stack for registers. |
658 __ sub(Operand(esp), Immediate(num_registers_ * kPointerSize)); | 660 __ sub(Operand(esp), Immediate(num_registers_ * kPointerSize)); |
659 // Load string length. | 661 // Load string length. |
660 __ mov(esi, Operand(ebp, kInputEnd)); | 662 __ mov(esi, Operand(ebp, kInputEnd)); |
661 // Load input position. | 663 // Load input position. |
662 __ mov(edi, Operand(ebp, kInputStart)); | 664 __ mov(edi, Operand(ebp, kInputStart)); |
663 // Set up edi to be negative offset from string end. | 665 // Set up edi to be negative offset from string end. |
664 __ sub(edi, Operand(esi)); | 666 __ sub(edi, Operand(esi)); |
665 // Set eax to address of char before start of input | 667 |
| 668 // Set eax to address of char before start of the string. |
666 // (effectively string position -1). | 669 // (effectively string position -1). |
667 __ lea(eax, Operand(edi, -char_size())); | 670 __ neg(ebx); |
| 671 if (mode_ == UC16) { |
| 672 __ lea(eax, Operand(edi, ebx, times_2, -char_size())); |
| 673 } else { |
| 674 __ lea(eax, Operand(edi, ebx, times_1, -char_size())); |
| 675 } |
668 // Store this value in a local variable, for use when clearing | 676 // Store this value in a local variable, for use when clearing |
669 // position registers. | 677 // position registers. |
670 __ mov(Operand(ebp, kInputStartMinusOne), eax); | 678 __ mov(Operand(ebp, kInputStartMinusOne), eax); |
671 | 679 |
672 // Determine whether the start index is zero, that is at the start of the | 680 // Determine whether the start index is zero, that is at the start of the |
673 // string, and store that value in a local variable. | 681 // string, and store that value in a local variable. |
674 __ mov(ebx, Operand(ebp, kStartIndex)); | |
675 __ xor_(Operand(ecx), ecx); // setcc only operates on cl (lower byte of ecx). | 682 __ xor_(Operand(ecx), ecx); // setcc only operates on cl (lower byte of ecx). |
| 683 // Register ebx still holds -stringIndex. |
676 __ test(ebx, Operand(ebx)); | 684 __ test(ebx, Operand(ebx)); |
677 __ setcc(zero, ecx); // 1 if 0 (start of string), 0 if positive. | 685 __ setcc(zero, ecx); // 1 if 0 (start of string), 0 if positive. |
678 __ mov(Operand(ebp, kAtStart), ecx); | 686 __ mov(Operand(ebp, kAtStart), ecx); |
679 | 687 |
680 if (num_saved_registers_ > 0) { // Always is, if generated from a regexp. | 688 if (num_saved_registers_ > 0) { // Always is, if generated from a regexp. |
681 // Fill saved registers with initial value = start offset - 1 | 689 // Fill saved registers with initial value = start offset - 1 |
682 // Fill in stack push order, to avoid accessing across an unwritten | 690 // Fill in stack push order, to avoid accessing across an unwritten |
683 // page (a problem on Windows). | 691 // page (a problem on Windows). |
684 __ mov(ecx, kRegisterZero); | 692 __ mov(ecx, kRegisterZero); |
685 Label init_loop; | 693 Label init_loop; |
(...skipping 28 matching lines...) Expand all Loading... |
714 | 722 |
715 | 723 |
716 // Exit code: | 724 // Exit code: |
717 if (success_label_.is_linked()) { | 725 if (success_label_.is_linked()) { |
718 // Save captures when successful. | 726 // Save captures when successful. |
719 __ bind(&success_label_); | 727 __ bind(&success_label_); |
720 if (num_saved_registers_ > 0) { | 728 if (num_saved_registers_ > 0) { |
721 // copy captures to output | 729 // copy captures to output |
722 __ mov(ebx, Operand(ebp, kRegisterOutput)); | 730 __ mov(ebx, Operand(ebp, kRegisterOutput)); |
723 __ mov(ecx, Operand(ebp, kInputEnd)); | 731 __ mov(ecx, Operand(ebp, kInputEnd)); |
| 732 __ mov(edx, Operand(ebp, kStartIndex)); |
724 __ sub(ecx, Operand(ebp, kInputStart)); | 733 __ sub(ecx, Operand(ebp, kInputStart)); |
| 734 if (mode_ == UC16) { |
| 735 __ lea(ecx, Operand(ecx, edx, times_2, 0)); |
| 736 } else { |
| 737 __ add(ecx, Operand(edx)); |
| 738 } |
725 for (int i = 0; i < num_saved_registers_; i++) { | 739 for (int i = 0; i < num_saved_registers_; i++) { |
726 __ mov(eax, register_location(i)); | 740 __ mov(eax, register_location(i)); |
727 __ add(eax, Operand(ecx)); // Convert to index from start, not end. | 741 // Convert to index from start of string, not end. |
| 742 __ add(eax, Operand(ecx)); |
728 if (mode_ == UC16) { | 743 if (mode_ == UC16) { |
729 __ sar(eax, 1); // Convert byte index to character index. | 744 __ sar(eax, 1); // Convert byte index to character index. |
730 } | 745 } |
731 __ mov(Operand(ebx, i * kPointerSize), eax); | 746 __ mov(Operand(ebx, i * kPointerSize), eax); |
732 } | 747 } |
733 } | 748 } |
734 __ mov(eax, Immediate(SUCCESS)); | 749 __ mov(eax, Immediate(SUCCESS)); |
735 } | 750 } |
736 // Exit and return eax | 751 // Exit and return eax |
737 __ bind(&exit_label_); | 752 __ bind(&exit_label_); |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1176 } | 1191 } |
1177 } | 1192 } |
1178 } | 1193 } |
1179 | 1194 |
1180 | 1195 |
1181 #undef __ | 1196 #undef __ |
1182 | 1197 |
1183 #endif // V8_NATIVE_REGEXP | 1198 #endif // V8_NATIVE_REGEXP |
1184 | 1199 |
1185 }} // namespace v8::internal | 1200 }} // namespace v8::internal |
OLD | NEW |