OLD | NEW |
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 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 // Address of start of capture. | 362 // Address of start of capture. |
363 __ add(r0, r0, Operand(end_of_input_address())); | 363 __ add(r0, r0, Operand(end_of_input_address())); |
364 // Length of capture. | 364 // Length of capture. |
365 __ mov(r2, Operand(r1)); | 365 __ mov(r2, Operand(r1)); |
366 // Save length in callee-save register for use on return. | 366 // Save length in callee-save register for use on return. |
367 __ mov(r4, Operand(r1)); | 367 __ mov(r4, Operand(r1)); |
368 // Address of current input position. | 368 // Address of current input position. |
369 __ add(r1, current_input_offset(), Operand(end_of_input_address())); | 369 __ add(r1, current_input_offset(), Operand(end_of_input_address())); |
370 | 370 |
371 ExternalReference function = | 371 ExternalReference function = |
372 ExternalReference::re_case_insensitive_compare_uc16(); | 372 ExternalReference::re_case_insensitive_compare_uc16(masm_->isolate()); |
373 __ CallCFunction(function, argument_count); | 373 __ CallCFunction(function, argument_count); |
374 | 374 |
375 // Check if function returned non-zero for success or zero for failure. | 375 // Check if function returned non-zero for success or zero for failure. |
376 __ cmp(r0, Operand(0, RelocInfo::NONE)); | 376 __ cmp(r0, Operand(0, RelocInfo::NONE)); |
377 BranchOrBacktrack(eq, on_no_match); | 377 BranchOrBacktrack(eq, on_no_match); |
378 // On success, increment position by length of capture. | 378 // On success, increment position by length of capture. |
379 __ add(current_input_offset(), current_input_offset(), Operand(r4)); | 379 __ add(current_input_offset(), current_input_offset(), Operand(r4)); |
380 } | 380 } |
381 | 381 |
382 __ bind(&fallthrough); | 382 __ bind(&fallthrough); |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 // Set frame pointer in space for it if this is not a direct call | 620 // Set frame pointer in space for it if this is not a direct call |
621 // from generated code. | 621 // from generated code. |
622 __ add(frame_pointer(), sp, Operand(4 * kPointerSize)); | 622 __ add(frame_pointer(), sp, Operand(4 * kPointerSize)); |
623 __ push(r0); // Make room for "position - 1" constant (value is irrelevant). | 623 __ push(r0); // Make room for "position - 1" constant (value is irrelevant). |
624 __ push(r0); // Make room for "at start" constant (value is irrelevant). | 624 __ push(r0); // Make room for "at start" constant (value is irrelevant). |
625 // Check if we have space on the stack for registers. | 625 // Check if we have space on the stack for registers. |
626 Label stack_limit_hit; | 626 Label stack_limit_hit; |
627 Label stack_ok; | 627 Label stack_ok; |
628 | 628 |
629 ExternalReference stack_limit = | 629 ExternalReference stack_limit = |
630 ExternalReference::address_of_stack_limit(); | 630 ExternalReference::address_of_stack_limit(masm_->isolate()); |
631 __ mov(r0, Operand(stack_limit)); | 631 __ mov(r0, Operand(stack_limit)); |
632 __ ldr(r0, MemOperand(r0)); | 632 __ ldr(r0, MemOperand(r0)); |
633 __ sub(r0, sp, r0, SetCC); | 633 __ sub(r0, sp, r0, SetCC); |
634 // Handle it if the stack pointer is already below the stack limit. | 634 // Handle it if the stack pointer is already below the stack limit. |
635 __ b(ls, &stack_limit_hit); | 635 __ b(ls, &stack_limit_hit); |
636 // Check if there is room for the variable number of registers above | 636 // Check if there is room for the variable number of registers above |
637 // the stack limit. | 637 // the stack limit. |
638 __ cmp(r0, Operand(num_registers_ * kPointerSize)); | 638 __ cmp(r0, Operand(num_registers_ * kPointerSize)); |
639 __ b(hs, &stack_ok); | 639 __ b(hs, &stack_ok); |
640 // Exit with OutOfMemory exception. There is not enough space on the stack | 640 // Exit with OutOfMemory exception. There is not enough space on the stack |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 SafeCallTarget(&stack_overflow_label_); | 776 SafeCallTarget(&stack_overflow_label_); |
777 // Reached if the backtrack-stack limit has been hit. | 777 // Reached if the backtrack-stack limit has been hit. |
778 Label grow_failed; | 778 Label grow_failed; |
779 | 779 |
780 // Call GrowStack(backtrack_stackpointer(), &stack_base) | 780 // Call GrowStack(backtrack_stackpointer(), &stack_base) |
781 static const int num_arguments = 2; | 781 static const int num_arguments = 2; |
782 __ PrepareCallCFunction(num_arguments, r0); | 782 __ PrepareCallCFunction(num_arguments, r0); |
783 __ mov(r0, backtrack_stackpointer()); | 783 __ mov(r0, backtrack_stackpointer()); |
784 __ add(r1, frame_pointer(), Operand(kStackHighEnd)); | 784 __ add(r1, frame_pointer(), Operand(kStackHighEnd)); |
785 ExternalReference grow_stack = | 785 ExternalReference grow_stack = |
786 ExternalReference::re_grow_stack(); | 786 ExternalReference::re_grow_stack(masm_->isolate()); |
787 __ CallCFunction(grow_stack, num_arguments); | 787 __ CallCFunction(grow_stack, num_arguments); |
788 // If return NULL, we have failed to grow the stack, and | 788 // If return NULL, we have failed to grow the stack, and |
789 // must exit with a stack-overflow exception. | 789 // must exit with a stack-overflow exception. |
790 __ cmp(r0, Operand(0, RelocInfo::NONE)); | 790 __ cmp(r0, Operand(0, RelocInfo::NONE)); |
791 __ b(eq, &exit_with_exception); | 791 __ b(eq, &exit_with_exception); |
792 // Otherwise use return value as new stack pointer. | 792 // Otherwise use return value as new stack pointer. |
793 __ mov(backtrack_stackpointer(), r0); | 793 __ mov(backtrack_stackpointer(), r0); |
794 // Restore saved registers and continue. | 794 // Restore saved registers and continue. |
795 SafeReturn(); | 795 SafeReturn(); |
796 } | 796 } |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
992 | 992 |
993 void RegExpMacroAssemblerARM::CallCheckStackGuardState(Register scratch) { | 993 void RegExpMacroAssemblerARM::CallCheckStackGuardState(Register scratch) { |
994 static const int num_arguments = 3; | 994 static const int num_arguments = 3; |
995 __ PrepareCallCFunction(num_arguments, scratch); | 995 __ PrepareCallCFunction(num_arguments, scratch); |
996 // RegExp code frame pointer. | 996 // RegExp code frame pointer. |
997 __ mov(r2, frame_pointer()); | 997 __ mov(r2, frame_pointer()); |
998 // Code* of self. | 998 // Code* of self. |
999 __ mov(r1, Operand(masm_->CodeObject())); | 999 __ mov(r1, Operand(masm_->CodeObject())); |
1000 // r0 becomes return address pointer. | 1000 // r0 becomes return address pointer. |
1001 ExternalReference stack_guard_check = | 1001 ExternalReference stack_guard_check = |
1002 ExternalReference::re_check_stack_guard_state(); | 1002 ExternalReference::re_check_stack_guard_state(masm_->isolate()); |
1003 CallCFunctionUsingStub(stack_guard_check, num_arguments); | 1003 CallCFunctionUsingStub(stack_guard_check, num_arguments); |
1004 } | 1004 } |
1005 | 1005 |
1006 | 1006 |
1007 // Helper function for reading a value out of a stack frame. | 1007 // Helper function for reading a value out of a stack frame. |
1008 template <typename T> | 1008 template <typename T> |
1009 static T& frame_entry(Address re_frame, int frame_offset) { | 1009 static T& frame_entry(Address re_frame, int frame_offset) { |
1010 return reinterpret_cast<T&>(Memory::int32_at(re_frame + frame_offset)); | 1010 return reinterpret_cast<T&>(Memory::int32_at(re_frame + frame_offset)); |
1011 } | 1011 } |
1012 | 1012 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1154 void RegExpMacroAssemblerARM::Pop(Register target) { | 1154 void RegExpMacroAssemblerARM::Pop(Register target) { |
1155 ASSERT(!target.is(backtrack_stackpointer())); | 1155 ASSERT(!target.is(backtrack_stackpointer())); |
1156 __ ldr(target, | 1156 __ ldr(target, |
1157 MemOperand(backtrack_stackpointer(), kPointerSize, PostIndex)); | 1157 MemOperand(backtrack_stackpointer(), kPointerSize, PostIndex)); |
1158 } | 1158 } |
1159 | 1159 |
1160 | 1160 |
1161 void RegExpMacroAssemblerARM::CheckPreemption() { | 1161 void RegExpMacroAssemblerARM::CheckPreemption() { |
1162 // Check for preemption. | 1162 // Check for preemption. |
1163 ExternalReference stack_limit = | 1163 ExternalReference stack_limit = |
1164 ExternalReference::address_of_stack_limit(); | 1164 ExternalReference::address_of_stack_limit(masm_->isolate()); |
1165 __ mov(r0, Operand(stack_limit)); | 1165 __ mov(r0, Operand(stack_limit)); |
1166 __ ldr(r0, MemOperand(r0)); | 1166 __ ldr(r0, MemOperand(r0)); |
1167 __ cmp(sp, r0); | 1167 __ cmp(sp, r0); |
1168 SafeCall(&check_preempt_label_, ls); | 1168 SafeCall(&check_preempt_label_, ls); |
1169 } | 1169 } |
1170 | 1170 |
1171 | 1171 |
1172 void RegExpMacroAssemblerARM::CheckStackLimit() { | 1172 void RegExpMacroAssemblerARM::CheckStackLimit() { |
1173 ExternalReference stack_limit = | 1173 ExternalReference stack_limit = |
1174 ExternalReference::address_of_regexp_stack_limit(); | 1174 ExternalReference::address_of_regexp_stack_limit(masm_->isolate()); |
1175 __ mov(r0, Operand(stack_limit)); | 1175 __ mov(r0, Operand(stack_limit)); |
1176 __ ldr(r0, MemOperand(r0)); | 1176 __ ldr(r0, MemOperand(r0)); |
1177 __ cmp(backtrack_stackpointer(), Operand(r0)); | 1177 __ cmp(backtrack_stackpointer(), Operand(r0)); |
1178 SafeCall(&stack_overflow_label_, ls); | 1178 SafeCall(&stack_overflow_label_, ls); |
1179 } | 1179 } |
1180 | 1180 |
1181 | 1181 |
1182 void RegExpMacroAssemblerARM::EmitBacktrackConstantPool() { | 1182 void RegExpMacroAssemblerARM::EmitBacktrackConstantPool() { |
1183 __ CheckConstPool(false, false); | 1183 __ CheckConstPool(false, false); |
1184 __ BlockConstPoolBefore( | 1184 __ BlockConstPoolBefore( |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1274 __ ldr(pc, MemOperand(sp, stack_alignment, PostIndex)); | 1274 __ ldr(pc, MemOperand(sp, stack_alignment, PostIndex)); |
1275 } | 1275 } |
1276 | 1276 |
1277 #undef __ | 1277 #undef __ |
1278 | 1278 |
1279 #endif // V8_INTERPRETED_REGEXP | 1279 #endif // V8_INTERPRETED_REGEXP |
1280 | 1280 |
1281 }} // namespace v8::internal | 1281 }} // namespace v8::internal |
1282 | 1282 |
1283 #endif // V8_TARGET_ARCH_ARM | 1283 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |