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 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 // Found by adding negative string-end offset of current position (edi) | 386 // Found by adding negative string-end offset of current position (edi) |
387 // to end of string. | 387 // to end of string. |
388 __ add(edi, Operand(esi)); | 388 __ add(edi, Operand(esi)); |
389 __ mov(Operand(esp, 1 * kPointerSize), edi); | 389 __ mov(Operand(esp, 1 * kPointerSize), edi); |
390 // Set byte_offset1. | 390 // Set byte_offset1. |
391 // Start of capture, where edx already holds string-end negative offset. | 391 // Start of capture, where edx already holds string-end negative offset. |
392 __ add(edx, Operand(esi)); | 392 __ add(edx, Operand(esi)); |
393 __ mov(Operand(esp, 0 * kPointerSize), edx); | 393 __ mov(Operand(esp, 0 * kPointerSize), edx); |
394 | 394 |
395 ExternalReference compare = | 395 ExternalReference compare = |
396 ExternalReference::re_case_insensitive_compare_uc16(); | 396 ExternalReference::re_case_insensitive_compare_uc16(masm_->isolate()); |
397 __ CallCFunction(compare, argument_count); | 397 __ CallCFunction(compare, argument_count); |
398 // Pop original values before reacting on result value. | 398 // Pop original values before reacting on result value. |
399 __ pop(ebx); | 399 __ pop(ebx); |
400 __ pop(backtrack_stackpointer()); | 400 __ pop(backtrack_stackpointer()); |
401 __ pop(edi); | 401 __ pop(edi); |
402 __ pop(esi); | 402 __ pop(esi); |
403 | 403 |
404 // Check if function returned non-zero for success or zero for failure. | 404 // Check if function returned non-zero for success or zero for failure. |
405 __ or_(eax, Operand(eax)); | 405 __ or_(eax, Operand(eax)); |
406 BranchOrBacktrack(zero, on_no_match); | 406 BranchOrBacktrack(zero, on_no_match); |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 __ push(esi); | 672 __ push(esi); |
673 __ push(edi); | 673 __ push(edi); |
674 __ push(ebx); // Callee-save on MacOS. | 674 __ push(ebx); // Callee-save on MacOS. |
675 __ push(Immediate(0)); // Make room for "input start - 1" constant. | 675 __ push(Immediate(0)); // Make room for "input start - 1" constant. |
676 | 676 |
677 // Check if we have space on the stack for registers. | 677 // Check if we have space on the stack for registers. |
678 Label stack_limit_hit; | 678 Label stack_limit_hit; |
679 Label stack_ok; | 679 Label stack_ok; |
680 | 680 |
681 ExternalReference stack_limit = | 681 ExternalReference stack_limit = |
682 ExternalReference::address_of_stack_limit(); | 682 ExternalReference::address_of_stack_limit(masm_->isolate()); |
683 __ mov(ecx, esp); | 683 __ mov(ecx, esp); |
684 __ sub(ecx, Operand::StaticVariable(stack_limit)); | 684 __ sub(ecx, Operand::StaticVariable(stack_limit)); |
685 // Handle it if the stack pointer is already below the stack limit. | 685 // Handle it if the stack pointer is already below the stack limit. |
686 __ j(below_equal, &stack_limit_hit, not_taken); | 686 __ j(below_equal, &stack_limit_hit, not_taken); |
687 // Check if there is room for the variable number of registers above | 687 // Check if there is room for the variable number of registers above |
688 // the stack limit. | 688 // the stack limit. |
689 __ cmp(ecx, num_registers_ * kPointerSize); | 689 __ cmp(ecx, num_registers_ * kPointerSize); |
690 __ j(above_equal, &stack_ok, taken); | 690 __ j(above_equal, &stack_ok, taken); |
691 // Exit with OutOfMemory exception. There is not enough space on the stack | 691 // Exit with OutOfMemory exception. There is not enough space on the stack |
692 // for our working registers. | 692 // for our working registers. |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
836 // Save registers before calling C function | 836 // Save registers before calling C function |
837 __ push(esi); | 837 __ push(esi); |
838 __ push(edi); | 838 __ push(edi); |
839 | 839 |
840 // Call GrowStack(backtrack_stackpointer()) | 840 // Call GrowStack(backtrack_stackpointer()) |
841 static const int num_arguments = 2; | 841 static const int num_arguments = 2; |
842 __ PrepareCallCFunction(num_arguments, ebx); | 842 __ PrepareCallCFunction(num_arguments, ebx); |
843 __ lea(eax, Operand(ebp, kStackHighEnd)); | 843 __ lea(eax, Operand(ebp, kStackHighEnd)); |
844 __ mov(Operand(esp, 1 * kPointerSize), eax); | 844 __ mov(Operand(esp, 1 * kPointerSize), eax); |
845 __ mov(Operand(esp, 0 * kPointerSize), backtrack_stackpointer()); | 845 __ mov(Operand(esp, 0 * kPointerSize), backtrack_stackpointer()); |
846 ExternalReference grow_stack = ExternalReference::re_grow_stack(); | 846 ExternalReference grow_stack = |
| 847 ExternalReference::re_grow_stack(masm_->isolate()); |
847 __ CallCFunction(grow_stack, num_arguments); | 848 __ CallCFunction(grow_stack, num_arguments); |
848 // If return NULL, we have failed to grow the stack, and | 849 // If return NULL, we have failed to grow the stack, and |
849 // must exit with a stack-overflow exception. | 850 // must exit with a stack-overflow exception. |
850 __ or_(eax, Operand(eax)); | 851 __ or_(eax, Operand(eax)); |
851 __ j(equal, &exit_with_exception); | 852 __ j(equal, &exit_with_exception); |
852 // Otherwise use return value as new stack pointer. | 853 // Otherwise use return value as new stack pointer. |
853 __ mov(backtrack_stackpointer(), eax); | 854 __ mov(backtrack_stackpointer(), eax); |
854 // Restore saved registers and continue. | 855 // Restore saved registers and continue. |
855 __ pop(edi); | 856 __ pop(edi); |
856 __ pop(esi); | 857 __ pop(esi); |
857 SafeReturn(); | 858 SafeReturn(); |
858 } | 859 } |
859 | 860 |
860 if (exit_with_exception.is_linked()) { | 861 if (exit_with_exception.is_linked()) { |
861 // If any of the code above needed to exit with an exception. | 862 // If any of the code above needed to exit with an exception. |
862 __ bind(&exit_with_exception); | 863 __ bind(&exit_with_exception); |
863 // Exit with Result EXCEPTION(-1) to signal thrown exception. | 864 // Exit with Result EXCEPTION(-1) to signal thrown exception. |
864 __ mov(eax, EXCEPTION); | 865 __ mov(eax, EXCEPTION); |
865 __ jmp(&exit_label_); | 866 __ jmp(&exit_label_); |
866 } | 867 } |
867 | 868 |
868 CodeDesc code_desc; | 869 CodeDesc code_desc; |
869 masm_->GetCode(&code_desc); | 870 masm_->GetCode(&code_desc); |
870 Isolate* isolate = ISOLATE; | |
871 Handle<Code> code = | 871 Handle<Code> code = |
872 isolate->factory()->NewCode(code_desc, | 872 masm_->isolate()->factory()->NewCode(code_desc, |
873 Code::ComputeFlags(Code::REGEXP), | 873 Code::ComputeFlags(Code::REGEXP), |
874 masm_->CodeObject()); | 874 masm_->CodeObject()); |
875 PROFILE(isolate, RegExpCodeCreateEvent(*code, *source)); | 875 PROFILE(masm_->isolate(), RegExpCodeCreateEvent(*code, *source)); |
876 return Handle<Object>::cast(code); | 876 return Handle<Object>::cast(code); |
877 } | 877 } |
878 | 878 |
879 | 879 |
880 void RegExpMacroAssemblerIA32::GoTo(Label* to) { | 880 void RegExpMacroAssemblerIA32::GoTo(Label* to) { |
881 BranchOrBacktrack(no_condition, to); | 881 BranchOrBacktrack(no_condition, to); |
882 } | 882 } |
883 | 883 |
884 | 884 |
885 void RegExpMacroAssemblerIA32::IfRegisterGE(int reg, | 885 void RegExpMacroAssemblerIA32::IfRegisterGE(int reg, |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1020 static const int num_arguments = 3; | 1020 static const int num_arguments = 3; |
1021 __ PrepareCallCFunction(num_arguments, scratch); | 1021 __ PrepareCallCFunction(num_arguments, scratch); |
1022 // RegExp code frame pointer. | 1022 // RegExp code frame pointer. |
1023 __ mov(Operand(esp, 2 * kPointerSize), ebp); | 1023 __ mov(Operand(esp, 2 * kPointerSize), ebp); |
1024 // Code* of self. | 1024 // Code* of self. |
1025 __ mov(Operand(esp, 1 * kPointerSize), Immediate(masm_->CodeObject())); | 1025 __ mov(Operand(esp, 1 * kPointerSize), Immediate(masm_->CodeObject())); |
1026 // Next address on the stack (will be address of return address). | 1026 // Next address on the stack (will be address of return address). |
1027 __ lea(eax, Operand(esp, -kPointerSize)); | 1027 __ lea(eax, Operand(esp, -kPointerSize)); |
1028 __ mov(Operand(esp, 0 * kPointerSize), eax); | 1028 __ mov(Operand(esp, 0 * kPointerSize), eax); |
1029 ExternalReference check_stack_guard = | 1029 ExternalReference check_stack_guard = |
1030 ExternalReference::re_check_stack_guard_state(); | 1030 ExternalReference::re_check_stack_guard_state(masm_->isolate()); |
1031 __ CallCFunction(check_stack_guard, num_arguments); | 1031 __ CallCFunction(check_stack_guard, num_arguments); |
1032 } | 1032 } |
1033 | 1033 |
1034 | 1034 |
1035 // Helper function for reading a value out of a stack frame. | 1035 // Helper function for reading a value out of a stack frame. |
1036 template <typename T> | 1036 template <typename T> |
1037 static T& frame_entry(Address re_frame, int frame_offset) { | 1037 static T& frame_entry(Address re_frame, int frame_offset) { |
1038 return reinterpret_cast<T&>(Memory::int32_at(re_frame + frame_offset)); | 1038 return reinterpret_cast<T&>(Memory::int32_at(re_frame + frame_offset)); |
1039 } | 1039 } |
1040 | 1040 |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1194 __ mov(target, Operand(backtrack_stackpointer(), 0)); | 1194 __ mov(target, Operand(backtrack_stackpointer(), 0)); |
1195 // Notice: This updates flags, unlike normal Pop. | 1195 // Notice: This updates flags, unlike normal Pop. |
1196 __ add(Operand(backtrack_stackpointer()), Immediate(kPointerSize)); | 1196 __ add(Operand(backtrack_stackpointer()), Immediate(kPointerSize)); |
1197 } | 1197 } |
1198 | 1198 |
1199 | 1199 |
1200 void RegExpMacroAssemblerIA32::CheckPreemption() { | 1200 void RegExpMacroAssemblerIA32::CheckPreemption() { |
1201 // Check for preemption. | 1201 // Check for preemption. |
1202 Label no_preempt; | 1202 Label no_preempt; |
1203 ExternalReference stack_limit = | 1203 ExternalReference stack_limit = |
1204 ExternalReference::address_of_stack_limit(); | 1204 ExternalReference::address_of_stack_limit(masm_->isolate()); |
1205 __ cmp(esp, Operand::StaticVariable(stack_limit)); | 1205 __ cmp(esp, Operand::StaticVariable(stack_limit)); |
1206 __ j(above, &no_preempt, taken); | 1206 __ j(above, &no_preempt, taken); |
1207 | 1207 |
1208 SafeCall(&check_preempt_label_); | 1208 SafeCall(&check_preempt_label_); |
1209 | 1209 |
1210 __ bind(&no_preempt); | 1210 __ bind(&no_preempt); |
1211 } | 1211 } |
1212 | 1212 |
1213 | 1213 |
1214 void RegExpMacroAssemblerIA32::CheckStackLimit() { | 1214 void RegExpMacroAssemblerIA32::CheckStackLimit() { |
1215 Label no_stack_overflow; | 1215 Label no_stack_overflow; |
1216 ExternalReference stack_limit = | 1216 ExternalReference stack_limit = |
1217 ExternalReference::address_of_regexp_stack_limit(); | 1217 ExternalReference::address_of_regexp_stack_limit(masm_->isolate()); |
1218 __ cmp(backtrack_stackpointer(), Operand::StaticVariable(stack_limit)); | 1218 __ cmp(backtrack_stackpointer(), Operand::StaticVariable(stack_limit)); |
1219 __ j(above, &no_stack_overflow); | 1219 __ j(above, &no_stack_overflow); |
1220 | 1220 |
1221 SafeCall(&stack_overflow_label_); | 1221 SafeCall(&stack_overflow_label_); |
1222 | 1222 |
1223 __ bind(&no_stack_overflow); | 1223 __ bind(&no_stack_overflow); |
1224 } | 1224 } |
1225 | 1225 |
1226 | 1226 |
1227 void RegExpMacroAssemblerIA32::LoadCurrentCharacterUnchecked(int cp_offset, | 1227 void RegExpMacroAssemblerIA32::LoadCurrentCharacterUnchecked(int cp_offset, |
(...skipping 21 matching lines...) Expand all Loading... |
1249 } | 1249 } |
1250 | 1250 |
1251 | 1251 |
1252 #undef __ | 1252 #undef __ |
1253 | 1253 |
1254 #endif // V8_INTERPRETED_REGEXP | 1254 #endif // V8_INTERPRETED_REGEXP |
1255 | 1255 |
1256 }} // namespace v8::internal | 1256 }} // namespace v8::internal |
1257 | 1257 |
1258 #endif // V8_TARGET_ARCH_IA32 | 1258 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |