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

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

Issue 9372063: MIPS: Enable serialization for MIPS architecture. (Closed)
Patch Set: Rework on serialization handling of root references. Created 8 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
OLDNEW
1 // Copyright 2006-2010 the V8 project authors. All rights reserved. 1 // Copyright 2006-2010 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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698