OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 | 379 |
380 { | 380 { |
381 AllowExternalCallThatCantCauseGC scope(masm_); | 381 AllowExternalCallThatCantCauseGC scope(masm_); |
382 ExternalReference function = | 382 ExternalReference function = |
383 ExternalReference::re_case_insensitive_compare_uc16(masm_->isolate()); | 383 ExternalReference::re_case_insensitive_compare_uc16(masm_->isolate()); |
384 __ CallCFunction(function, argument_count); | 384 __ CallCFunction(function, argument_count); |
385 } | 385 } |
386 | 386 |
387 // Restore regexp engine registers. | 387 // Restore regexp engine registers. |
388 __ MultiPop(regexp_registers_to_retain); | 388 __ MultiPop(regexp_registers_to_retain); |
389 __ li(code_pointer(), Operand(masm_->CodeObject())); | 389 __ li(code_pointer(), Operand(masm_->CodeObject()), CONSTANT_SIZE); |
390 __ lw(end_of_input_address(), MemOperand(frame_pointer(), kInputEnd)); | 390 __ lw(end_of_input_address(), MemOperand(frame_pointer(), kInputEnd)); |
391 | 391 |
392 // Check if function returned non-zero for success or zero for failure. | 392 // Check if function returned non-zero for success or zero for failure. |
393 BranchOrBacktrack(on_no_match, eq, v0, Operand(zero_reg)); | 393 BranchOrBacktrack(on_no_match, eq, v0, Operand(zero_reg)); |
394 // On success, increment position by length of capture. | 394 // On success, increment position by length of capture. |
395 __ Addu(current_input_offset(), current_input_offset(), Operand(s3)); | 395 __ Addu(current_input_offset(), current_input_offset(), Operand(s3)); |
396 } | 396 } |
397 | 397 |
398 __ bind(&fallthrough); | 398 __ bind(&fallthrough); |
399 } | 399 } |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
691 __ bind(&init_loop); | 691 __ bind(&init_loop); |
692 __ sw(a0, MemOperand(a1)); | 692 __ sw(a0, MemOperand(a1)); |
693 __ Addu(a1, a1, Operand(-kPointerSize)); | 693 __ Addu(a1, a1, Operand(-kPointerSize)); |
694 __ Subu(a2, a2, Operand(1)); | 694 __ Subu(a2, a2, Operand(1)); |
695 __ Branch(&init_loop, ne, a2, Operand(zero_reg)); | 695 __ Branch(&init_loop, ne, a2, Operand(zero_reg)); |
696 } | 696 } |
697 | 697 |
698 // Initialize backtrack stack pointer. | 698 // Initialize backtrack stack pointer. |
699 __ lw(backtrack_stackpointer(), MemOperand(frame_pointer(), kStackHighEnd)); | 699 __ lw(backtrack_stackpointer(), MemOperand(frame_pointer(), kStackHighEnd)); |
700 // Initialize code pointer register | 700 // Initialize code pointer register |
701 __ li(code_pointer(), Operand(masm_->CodeObject())); | 701 __ li(code_pointer(), Operand(masm_->CodeObject()), CONSTANT_SIZE); |
702 // Load previous char as initial value of current character register. | 702 // Load previous char as initial value of current character register. |
703 Label at_start; | 703 Label at_start; |
704 __ lw(a0, MemOperand(frame_pointer(), kAtStart)); | 704 __ lw(a0, MemOperand(frame_pointer(), kAtStart)); |
705 __ Branch(&at_start, ne, a0, Operand(zero_reg)); | 705 __ Branch(&at_start, ne, a0, Operand(zero_reg)); |
706 LoadCurrentCharacterUnchecked(-1, 1); // Load previous char. | 706 LoadCurrentCharacterUnchecked(-1, 1); // Load previous char. |
707 __ jmp(&start_label_); | 707 __ jmp(&start_label_); |
708 __ bind(&at_start); | 708 __ bind(&at_start); |
709 __ li(current_character(), Operand('\n')); | 709 __ li(current_character(), Operand('\n')); |
710 __ jmp(&start_label_); | 710 __ jmp(&start_label_); |
711 | 711 |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 current_character().bit() | backtrack_stackpointer().bit(); | 776 current_character().bit() | backtrack_stackpointer().bit(); |
777 __ MultiPush(regexp_registers_to_retain); | 777 __ MultiPush(regexp_registers_to_retain); |
778 CallCheckStackGuardState(a0); | 778 CallCheckStackGuardState(a0); |
779 __ MultiPop(regexp_registers_to_retain); | 779 __ MultiPop(regexp_registers_to_retain); |
780 // If returning non-zero, we should end execution with the given | 780 // If returning non-zero, we should end execution with the given |
781 // result as return value. | 781 // result as return value. |
782 __ Branch(&exit_label_, ne, v0, Operand(zero_reg)); | 782 __ Branch(&exit_label_, ne, v0, Operand(zero_reg)); |
783 | 783 |
784 // String might have moved: Reload end of string from frame. | 784 // String might have moved: Reload end of string from frame. |
785 __ lw(end_of_input_address(), MemOperand(frame_pointer(), kInputEnd)); | 785 __ lw(end_of_input_address(), MemOperand(frame_pointer(), kInputEnd)); |
786 __ li(code_pointer(), Operand(masm_->CodeObject())); | 786 __ li(code_pointer(), Operand(masm_->CodeObject()), CONSTANT_SIZE); |
787 SafeReturn(); | 787 SafeReturn(); |
788 } | 788 } |
789 | 789 |
790 // Backtrack stack overflow code. | 790 // Backtrack stack overflow code. |
791 if (stack_overflow_label_.is_linked()) { | 791 if (stack_overflow_label_.is_linked()) { |
792 SafeCallTarget(&stack_overflow_label_); | 792 SafeCallTarget(&stack_overflow_label_); |
793 // Reached if the backtrack-stack limit has been hit. | 793 // Reached if the backtrack-stack limit has been hit. |
794 // Put regexp engine registers on stack first. | 794 // Put regexp engine registers on stack first. |
795 RegList regexp_registers = current_input_offset().bit() | | 795 RegList regexp_registers = current_input_offset().bit() | |
796 current_character().bit(); | 796 current_character().bit(); |
797 __ MultiPush(regexp_registers); | 797 __ MultiPush(regexp_registers); |
798 Label grow_failed; | 798 Label grow_failed; |
799 // Call GrowStack(backtrack_stackpointer(), &stack_base) | 799 // Call GrowStack(backtrack_stackpointer(), &stack_base) |
800 static const int num_arguments = 3; | 800 static const int num_arguments = 3; |
801 __ PrepareCallCFunction(num_arguments, a0); | 801 __ PrepareCallCFunction(num_arguments, a0); |
802 __ mov(a0, backtrack_stackpointer()); | 802 __ mov(a0, backtrack_stackpointer()); |
803 __ Addu(a1, frame_pointer(), Operand(kStackHighEnd)); | 803 __ Addu(a1, frame_pointer(), Operand(kStackHighEnd)); |
804 __ li(a2, Operand(ExternalReference::isolate_address())); | 804 __ li(a2, Operand(ExternalReference::isolate_address())); |
805 ExternalReference grow_stack = | 805 ExternalReference grow_stack = |
806 ExternalReference::re_grow_stack(masm_->isolate()); | 806 ExternalReference::re_grow_stack(masm_->isolate()); |
807 __ CallCFunction(grow_stack, num_arguments); | 807 __ CallCFunction(grow_stack, num_arguments); |
808 // Restore regexp registers. | 808 // Restore regexp registers. |
809 __ MultiPop(regexp_registers); | 809 __ MultiPop(regexp_registers); |
810 // If return NULL, we have failed to grow the stack, and | 810 // If return NULL, we have failed to grow the stack, and |
811 // must exit with a stack-overflow exception. | 811 // must exit with a stack-overflow exception. |
812 __ Branch(&exit_with_exception, eq, v0, Operand(zero_reg)); | 812 __ Branch(&exit_with_exception, eq, v0, Operand(zero_reg)); |
813 // Otherwise use return value as new stack pointer. | 813 // Otherwise use return value as new stack pointer. |
814 __ mov(backtrack_stackpointer(), v0); | 814 __ mov(backtrack_stackpointer(), v0); |
815 // Restore saved registers and continue. | 815 // Restore saved registers and continue. |
816 __ li(code_pointer(), Operand(masm_->CodeObject())); | 816 __ li(code_pointer(), Operand(masm_->CodeObject()), CONSTANT_SIZE); |
817 __ lw(end_of_input_address(), MemOperand(frame_pointer(), kInputEnd)); | 817 __ lw(end_of_input_address(), MemOperand(frame_pointer(), kInputEnd)); |
818 SafeReturn(); | 818 SafeReturn(); |
819 } | 819 } |
820 | 820 |
821 if (exit_with_exception.is_linked()) { | 821 if (exit_with_exception.is_linked()) { |
822 // If any of the code above needed to exit with an exception. | 822 // If any of the code above needed to exit with an exception. |
823 __ bind(&exit_with_exception); | 823 __ bind(&exit_with_exception); |
824 // Exit with Result EXCEPTION(-1) to signal thrown exception. | 824 // Exit with Result EXCEPTION(-1) to signal thrown exception. |
825 __ li(v0, Operand(EXCEPTION)); | 825 __ li(v0, Operand(EXCEPTION)); |
826 __ jmp(&exit_label_); | 826 __ jmp(&exit_label_); |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1003 } | 1003 } |
1004 | 1004 |
1005 | 1005 |
1006 // Private methods: | 1006 // Private methods: |
1007 | 1007 |
1008 void RegExpMacroAssemblerMIPS::CallCheckStackGuardState(Register scratch) { | 1008 void RegExpMacroAssemblerMIPS::CallCheckStackGuardState(Register scratch) { |
1009 static const int num_arguments = 3; | 1009 static const int num_arguments = 3; |
1010 __ PrepareCallCFunction(num_arguments, scratch); | 1010 __ PrepareCallCFunction(num_arguments, scratch); |
1011 __ mov(a2, frame_pointer()); | 1011 __ mov(a2, frame_pointer()); |
1012 // Code* of self. | 1012 // Code* of self. |
1013 __ li(a1, Operand(masm_->CodeObject())); | 1013 __ li(a1, Operand(masm_->CodeObject()), CONSTANT_SIZE); |
1014 // a0 becomes return address pointer. | 1014 // a0 becomes return address pointer. |
1015 ExternalReference stack_guard_check = | 1015 ExternalReference stack_guard_check = |
1016 ExternalReference::re_check_stack_guard_state(masm_->isolate()); | 1016 ExternalReference::re_check_stack_guard_state(masm_->isolate()); |
1017 CallCFunctionUsingStub(stack_guard_check, num_arguments); | 1017 CallCFunctionUsingStub(stack_guard_check, num_arguments); |
1018 } | 1018 } |
1019 | 1019 |
1020 | 1020 |
1021 // Helper function for reading a value out of a stack frame. | 1021 // Helper function for reading a value out of a stack frame. |
1022 template <typename T> | 1022 template <typename T> |
1023 static T& frame_entry(Address re_frame, int frame_offset) { | 1023 static T& frame_entry(Address re_frame, int frame_offset) { |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1222 ExternalReference function, | 1222 ExternalReference function, |
1223 int num_arguments) { | 1223 int num_arguments) { |
1224 // Must pass all arguments in registers. The stub pushes on the stack. | 1224 // Must pass all arguments in registers. The stub pushes on the stack. |
1225 ASSERT(num_arguments <= 4); | 1225 ASSERT(num_arguments <= 4); |
1226 __ li(code_pointer(), Operand(function)); | 1226 __ li(code_pointer(), Operand(function)); |
1227 RegExpCEntryStub stub; | 1227 RegExpCEntryStub stub; |
1228 __ CallStub(&stub); | 1228 __ CallStub(&stub); |
1229 if (OS::ActivationFrameAlignment() != 0) { | 1229 if (OS::ActivationFrameAlignment() != 0) { |
1230 __ lw(sp, MemOperand(sp, 16)); | 1230 __ lw(sp, MemOperand(sp, 16)); |
1231 } | 1231 } |
1232 __ li(code_pointer(), Operand(masm_->CodeObject())); | 1232 __ li(code_pointer(), Operand(masm_->CodeObject()), CONSTANT_SIZE); |
1233 } | 1233 } |
1234 | 1234 |
1235 | 1235 |
1236 void RegExpMacroAssemblerMIPS::LoadCurrentCharacterUnchecked(int cp_offset, | 1236 void RegExpMacroAssemblerMIPS::LoadCurrentCharacterUnchecked(int cp_offset, |
1237 int characters) { | 1237 int characters) { |
1238 Register offset = current_input_offset(); | 1238 Register offset = current_input_offset(); |
1239 if (cp_offset != 0) { | 1239 if (cp_offset != 0) { |
1240 __ Addu(a0, current_input_offset(), Operand(cp_offset * char_size())); | 1240 __ Addu(a0, current_input_offset(), Operand(cp_offset * char_size())); |
1241 offset = a0; | 1241 offset = a0; |
1242 } | 1242 } |
(...skipping 27 matching lines...) Expand all Loading... |
1270 } | 1270 } |
1271 | 1271 |
1272 | 1272 |
1273 #undef __ | 1273 #undef __ |
1274 | 1274 |
1275 #endif // V8_INTERPRETED_REGEXP | 1275 #endif // V8_INTERPRETED_REGEXP |
1276 | 1276 |
1277 }} // namespace v8::internal | 1277 }} // namespace v8::internal |
1278 | 1278 |
1279 #endif // V8_TARGET_ARCH_MIPS | 1279 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |