30 #if defined(V8_TARGET_ARCH_MIPS)
43 #ifndef V8_INTERPRETED_REGEXP
118 #define __ ACCESS_MASM(masm_)
122 int registers_to_save,
124 : NativeRegExpMacroAssembler(zone),
125 masm_(new MacroAssembler(Isolate::Current(),
NULL, kRegExpCodeSize)),
127 num_registers_(registers_to_save),
128 num_saved_registers_(registers_to_save),
134 internal_failure_label_() {
136 __ jmp(&entry_label_);
139 __ bind(&internal_failure_label_);
140 __ li(v0, Operand(FAILURE));
142 __ bind(&start_label_);
146 RegExpMacroAssemblerMIPS::~RegExpMacroAssemblerMIPS() {
149 entry_label_.Unuse();
150 start_label_.Unuse();
151 success_label_.Unuse();
152 backtrack_label_.Unuse();
154 check_preempt_label_.Unuse();
155 stack_overflow_label_.Unuse();
156 internal_failure_label_.Unuse();
160 int RegExpMacroAssemblerMIPS::stack_limit_slack() {
161 return RegExpStack::kStackLimitSlack;
165 void RegExpMacroAssemblerMIPS::AdvanceCurrentPosition(
int by) {
167 __ Addu(current_input_offset(),
168 current_input_offset(), Operand(by * char_size()));
173 void RegExpMacroAssemblerMIPS::AdvanceRegister(
int reg,
int by) {
175 ASSERT(reg < num_registers_);
177 __ lw(a0, register_location(reg));
178 __ Addu(a0, a0, Operand(by));
179 __ sw(a0, register_location(reg));
184 void RegExpMacroAssemblerMIPS::Backtrack() {
188 __ Addu(a0, a0, code_pointer());
193 void RegExpMacroAssemblerMIPS::Bind(Label* label) {
198 void RegExpMacroAssemblerMIPS::CheckCharacter(uint32_t c, Label* on_equal) {
199 BranchOrBacktrack(on_equal,
eq, current_character(), Operand(c));
203 void RegExpMacroAssemblerMIPS::CheckCharacterGT(
uc16 limit, Label* on_greater) {
204 BranchOrBacktrack(on_greater,
gt, current_character(), Operand(limit));
208 void RegExpMacroAssemblerMIPS::CheckAtStart(Label* on_at_start) {
212 BranchOrBacktrack(¬_at_start,
ne, a0, Operand(zero_reg));
216 __ Addu(a0, end_of_input_address(), Operand(current_input_offset()));
217 BranchOrBacktrack(on_at_start,
eq, a0, Operand(a1));
218 __ bind(¬_at_start);
222 void RegExpMacroAssemblerMIPS::CheckNotAtStart(Label* on_not_at_start) {
225 BranchOrBacktrack(on_not_at_start,
ne, a0, Operand(zero_reg));
228 __ Addu(a0, end_of_input_address(), Operand(current_input_offset()));
229 BranchOrBacktrack(on_not_at_start,
ne, a0, Operand(a1));
233 void RegExpMacroAssemblerMIPS::CheckCharacterLT(
uc16 limit, Label* on_less) {
234 BranchOrBacktrack(on_less,
lt, current_character(), Operand(limit));
238 void RegExpMacroAssemblerMIPS::CheckCharacters(Vector<const uc16> str,
241 bool check_end_of_string) {
242 if (on_failure ==
NULL) {
245 on_failure = &backtrack_label_;
248 if (check_end_of_string) {
250 CheckPosition(cp_offset + str.length() - 1, on_failure);
253 __ Addu(a0, end_of_input_address(), Operand(current_input_offset()));
254 if (cp_offset != 0) {
255 int byte_offset = cp_offset * char_size();
256 __ Addu(a0, a0, Operand(byte_offset));
260 int stored_high_byte = 0;
261 for (
int i = 0; i < str.length(); i++) {
262 if (mode_ == ASCII) {
264 __ addiu(a0, a0, char_size());
266 BranchOrBacktrack(on_failure,
ne, a1, Operand(str[i]));
269 __ addiu(a0, a0, char_size());
270 uc16 match_char = str[i];
271 int match_high_byte = (match_char >> 8);
272 if (match_high_byte == 0) {
273 BranchOrBacktrack(on_failure,
ne, a1, Operand(str[i]));
275 if (match_high_byte != stored_high_byte) {
276 __ li(a2, Operand(match_high_byte));
277 stored_high_byte = match_high_byte;
279 __ Addu(a3, a2, Operand(match_char & 0xff));
280 BranchOrBacktrack(on_failure,
ne, a1, Operand(a3));
287 void RegExpMacroAssemblerMIPS::CheckGreedyLoop(Label* on_equal) {
288 Label backtrack_non_equal;
290 __ Branch(&backtrack_non_equal,
ne, current_input_offset(), Operand(a0));
291 __ Addu(backtrack_stackpointer(),
292 backtrack_stackpointer(),
294 __ bind(&backtrack_non_equal);
295 BranchOrBacktrack(on_equal,
eq, current_input_offset(), Operand(a0));
299 void RegExpMacroAssemblerMIPS::CheckNotBackReferenceIgnoreCase(
301 Label* on_no_match) {
303 __ lw(a0, register_location(start_reg));
304 __ lw(a1, register_location(start_reg + 1));
309 __ Branch(&fallthrough,
eq, a1, Operand(zero_reg));
311 __ Addu(t5, a1, current_input_offset());
313 BranchOrBacktrack(on_no_match,
gt, t5, Operand(zero_reg));
315 if (mode_ == ASCII) {
322 __ Addu(a0, a0, Operand(end_of_input_address()));
323 __ Addu(a2, end_of_input_address(), Operand(current_input_offset()));
324 __ Addu(a1, a0, Operand(a1));
333 __ addiu(a0, a0, char_size());
335 __ addiu(a2, a2, char_size());
337 __ Branch(&loop_check,
eq, t0, Operand(a3));
340 __ Or(a3, a3, Operand(0x20));
341 __ Or(t0, t0, Operand(0x20));
342 __ Branch(&fail,
ne, t0, Operand(a3));
343 __ Subu(a3, a3, Operand(
'a'));
344 __ Branch(&fail,
hi, a3, Operand(
'z' -
'a'));
346 __ bind(&loop_check);
347 __ Branch(&loop,
lt, a0, Operand(a1));
355 __ Subu(current_input_offset(), a2, end_of_input_address());
359 RegList regexp_registers_to_retain = current_input_offset().bit() |
360 current_character().bit() | backtrack_stackpointer().bit();
361 __ MultiPush(regexp_registers_to_retain);
363 int argument_count = 4;
364 __ PrepareCallCFunction(argument_count, a2);
377 __ Addu(a0, a0, Operand(end_of_input_address()));
383 __ Addu(a1, current_input_offset(), Operand(end_of_input_address()));
385 __ li(a3, Operand(ExternalReference::isolate_address()));
388 AllowExternalCallThatCantCauseGC scope(masm_);
389 ExternalReference
function =
390 ExternalReference::re_case_insensitive_compare_uc16(masm_->isolate());
391 __ CallCFunction(
function, argument_count);
395 __ MultiPop(regexp_registers_to_retain);
397 __ lw(end_of_input_address(),
MemOperand(frame_pointer(), kInputEnd));
400 BranchOrBacktrack(on_no_match,
eq, v0, Operand(zero_reg));
402 __ Addu(current_input_offset(), current_input_offset(), Operand(
s3));
405 __ bind(&fallthrough);
409 void RegExpMacroAssemblerMIPS::CheckNotBackReference(
411 Label* on_no_match) {
416 __ lw(a0, register_location(start_reg));
417 __ lw(a1, register_location(start_reg + 1));
420 __ Branch(&fallthrough,
eq, a1, Operand(zero_reg));
422 __ Addu(t5, a1, current_input_offset());
424 BranchOrBacktrack(on_no_match,
gt, t5, Operand(zero_reg));
427 __ Addu(a0, a0, Operand(end_of_input_address()));
428 __ Addu(a2, end_of_input_address(), Operand(current_input_offset()));
429 __ Addu(a1, a1, Operand(a0));
433 if (mode_ == ASCII) {
435 __ addiu(a0, a0, char_size());
437 __ addiu(a2, a2, char_size());
441 __ addiu(a0, a0, char_size());
443 __ addiu(a2, a2, char_size());
445 BranchOrBacktrack(on_no_match,
ne, a3, Operand(t0));
446 __ Branch(&loop,
lt, a0, Operand(a1));
449 __ Subu(current_input_offset(), a2, end_of_input_address());
450 __ bind(&fallthrough);
454 void RegExpMacroAssemblerMIPS::CheckNotCharacter(uint32_t c,
455 Label* on_not_equal) {
456 BranchOrBacktrack(on_not_equal,
ne, current_character(), Operand(c));
460 void RegExpMacroAssemblerMIPS::CheckCharacterAfterAnd(uint32_t c,
463 __ And(a0, current_character(), Operand(mask));
464 Operand rhs = (c == 0) ? Operand(zero_reg) : Operand(c);
465 BranchOrBacktrack(on_equal,
eq, a0, rhs);
469 void RegExpMacroAssemblerMIPS::CheckNotCharacterAfterAnd(uint32_t c,
471 Label* on_not_equal) {
472 __ And(a0, current_character(), Operand(mask));
473 Operand rhs = (c == 0) ? Operand(zero_reg) : Operand(c);
474 BranchOrBacktrack(on_not_equal,
ne, a0, rhs);
478 void RegExpMacroAssemblerMIPS::CheckNotCharacterAfterMinusAnd(
482 Label* on_not_equal) {
483 ASSERT(minus < String::kMaxUtf16CodeUnit);
484 __ Subu(a0, current_character(), Operand(minus));
485 __ And(a0, a0, Operand(mask));
486 BranchOrBacktrack(on_not_equal,
ne, a0, Operand(c));
490 void RegExpMacroAssemblerMIPS::CheckCharacterInRange(
493 Label* on_in_range) {
494 __ Subu(a0, current_character(), Operand(from));
496 BranchOrBacktrack(on_in_range,
ls, a0, Operand(to - from));
500 void RegExpMacroAssemblerMIPS::CheckCharacterNotInRange(
503 Label* on_not_in_range) {
504 __ Subu(a0, current_character(), Operand(from));
506 BranchOrBacktrack(on_not_in_range,
hi, a0, Operand(to - from));
510 void RegExpMacroAssemblerMIPS::CheckBitInTable(
511 Handle<ByteArray> table,
513 __ li(a0, Operand(table));
515 __ And(a1, current_character(), Operand(kTableSize - 1));
518 __ Addu(a0, a0, current_character());
522 BranchOrBacktrack(on_bit_set,
ne, a0, Operand(zero_reg));
526 bool RegExpMacroAssemblerMIPS::CheckSpecialCharacterClass(
uc16 type,
527 Label* on_no_match) {
533 if (mode_ == ASCII) {
536 __ Branch(&success,
eq, current_character(), Operand(
' '));
538 __ Subu(a0, current_character(), Operand(
'\t'));
539 BranchOrBacktrack(on_no_match,
hi, a0, Operand(
'\r' -
'\t'));
546 if (mode_ == ASCII) {
548 BranchOrBacktrack(on_no_match,
eq, current_character(), Operand(
' '));
549 __ Subu(a0, current_character(), Operand(
'\t'));
550 BranchOrBacktrack(on_no_match,
ls, a0, Operand(
'\r' -
'\t'));
556 __ Subu(a0, current_character(), Operand(
'0'));
557 BranchOrBacktrack(on_no_match,
hi, a0, Operand(
'9' -
'0'));
561 __ Subu(a0, current_character(), Operand(
'0'));
562 BranchOrBacktrack(on_no_match,
ls, a0, Operand(
'9' -
'0'));
566 __ Xor(a0, current_character(), Operand(0x01));
568 __ Subu(a0, a0, Operand(0x0b));
569 BranchOrBacktrack(on_no_match,
ls, a0, Operand(0x0c - 0x0b));
574 __ Subu(a0, a0, Operand(0x2028 - 0x0b));
575 BranchOrBacktrack(on_no_match,
ls, a0, Operand(1));
581 __ Xor(a0, current_character(), Operand(0x01));
583 __ Subu(a0, a0, Operand(0x0b));
584 if (mode_ == ASCII) {
585 BranchOrBacktrack(on_no_match,
hi, a0, Operand(0x0c - 0x0b));
588 BranchOrBacktrack(&done,
ls, a0, Operand(0x0c - 0x0b));
592 __ Subu(a0, a0, Operand(0x2028 - 0x0b));
593 BranchOrBacktrack(on_no_match,
hi, a0, Operand(1));
599 if (mode_ != ASCII) {
601 BranchOrBacktrack(on_no_match,
hi, current_character(), Operand(
'z'));
603 ExternalReference map = ExternalReference::re_word_character_map();
604 __ li(a0, Operand(map));
605 __ Addu(a0, a0, current_character());
607 BranchOrBacktrack(on_no_match,
eq, a0, Operand(zero_reg));
612 if (mode_ != ASCII) {
614 __ Branch(&done,
hi, current_character(), Operand(
'z'));
616 ExternalReference map = ExternalReference::re_word_character_map();
617 __ li(a0, Operand(map));
618 __ Addu(a0, a0, current_character());
620 BranchOrBacktrack(on_no_match,
ne, a0, Operand(zero_reg));
621 if (mode_ != ASCII) {
637 __ li(v0, Operand(FAILURE));
638 __ jmp(&exit_label_);
642 Handle<HeapObject> RegExpMacroAssemblerMIPS::GetCode(Handle<String> source) {
644 if (masm_->has_exception()) {
648 __ bind_to(&entry_label_, internal_failure_label_.pos());
654 __ bind(&entry_label_);
658 FrameScope scope(masm_, StackFrame::MANUAL);
668 RegList argument_registers = a0.bit() | a1.bit() | a2.bit() | a3.bit();
669 __ MultiPush(argument_registers | registers_to_retain | ra.bit());
673 __ mov(a0, zero_reg);
678 Label stack_limit_hit;
681 ExternalReference stack_limit =
682 ExternalReference::address_of_stack_limit(masm_->isolate());
683 __ li(a0, Operand(stack_limit));
687 __ Branch(&stack_limit_hit,
le, a0, Operand(zero_reg));
693 __ li(v0, Operand(EXCEPTION));
696 __ bind(&stack_limit_hit);
697 CallCheckStackGuardState(a0);
699 __ Branch(&return_v0,
ne, v0, Operand(zero_reg));
705 __ lw(end_of_input_address(),
MemOperand(frame_pointer(), kInputEnd));
709 __ Subu(current_input_offset(), a0, end_of_input_address());
713 __ Subu(a0, current_input_offset(), Operand(char_size()));
714 __ sll(t5, a1, (mode_ == UC16) ? 1 : 0);
718 __ sw(a0,
MemOperand(frame_pointer(), kInputStartMinusOne));
723 Label load_char_start_regexp, start_regexp;
725 __ Branch(&load_char_start_regexp,
ne, a1, Operand(zero_reg));
726 __ li(current_character(), Operand(
'\n'));
727 __ jmp(&start_regexp);
730 __ bind(&load_char_start_regexp);
732 LoadCurrentCharacterUnchecked(-1, 1);
733 __ bind(&start_regexp);
736 if (num_saved_registers_ > 0) {
738 if (num_saved_registers_ > 8) {
740 __ Addu(a1, frame_pointer(), Operand(kRegisterZero));
741 __ li(a2, Operand(num_saved_registers_));
746 __ Subu(a2, a2, Operand(1));
747 __ Branch(&init_loop,
ne, a2, Operand(zero_reg));
749 for (
int i = 0; i < num_saved_registers_; i++) {
750 __ sw(a0, register_location(i));
756 __ lw(backtrack_stackpointer(),
MemOperand(frame_pointer(), kStackHighEnd));
758 __ jmp(&start_label_);
762 if (success_label_.is_linked()) {
764 __ bind(&success_label_);
765 if (num_saved_registers_ > 0) {
768 __ lw(a0,
MemOperand(frame_pointer(), kRegisterOutput));
770 __ Subu(a1, end_of_input_address(), a1);
776 __ Addu(a1, a1, Operand(a2));
783 for (
int i = 0; i < num_saved_registers_; i += 2) {
784 __ lw(a2, register_location(i));
785 __ lw(a3, register_location(i + 1));
786 if (i == 0 && global_with_zero_length_check()) {
796 __ Addu(a2, a1, Operand(a2));
797 __ Addu(a3, a1, Operand(a3));
808 __ lw(a0,
MemOperand(frame_pointer(), kSuccessfulCaptures));
809 __ lw(a1,
MemOperand(frame_pointer(), kNumOutputRegisters));
810 __ lw(a2,
MemOperand(frame_pointer(), kRegisterOutput));
813 __ sw(a0,
MemOperand(frame_pointer(), kSuccessfulCaptures));
816 __ Subu(a1, a1, num_saved_registers_);
819 __ Branch(&return_v0,
lt, a1, Operand(num_saved_registers_));
821 __ sw(a1,
MemOperand(frame_pointer(), kNumOutputRegisters));
824 __ sw(a2,
MemOperand(frame_pointer(), kRegisterOutput));
827 __ lw(a0,
MemOperand(frame_pointer(), kInputStartMinusOne));
829 if (global_with_zero_length_check()) {
834 &load_char_start_regexp,
ne, current_input_offset(), Operand(t7));
836 __ Branch(&exit_label_,
eq, current_input_offset(),
839 __ Addu(current_input_offset(),
840 current_input_offset(),
841 Operand((mode_ == UC16) ? 2 : 1));
844 __ Branch(&load_char_start_regexp);
846 __ li(v0, Operand(SUCCESS));
850 __ bind(&exit_label_);
852 __ lw(v0,
MemOperand(frame_pointer(), kSuccessfulCaptures));
857 __ mov(
sp, frame_pointer());
859 __ MultiPop(registers_to_retain | ra.bit());
863 if (backtrack_label_.is_linked()) {
864 __ bind(&backtrack_label_);
868 Label exit_with_exception;
871 if (check_preempt_label_.is_linked()) {
872 SafeCallTarget(&check_preempt_label_);
874 RegList regexp_registers_to_retain = current_input_offset().bit() |
875 current_character().bit() | backtrack_stackpointer().bit();
876 __ MultiPush(regexp_registers_to_retain);
877 CallCheckStackGuardState(a0);
878 __ MultiPop(regexp_registers_to_retain);
881 __ Branch(&return_v0,
ne, v0, Operand(zero_reg));
884 __ lw(end_of_input_address(),
MemOperand(frame_pointer(), kInputEnd));
890 if (stack_overflow_label_.is_linked()) {
891 SafeCallTarget(&stack_overflow_label_);
894 RegList regexp_registers = current_input_offset().bit() |
895 current_character().bit();
896 __ MultiPush(regexp_registers);
899 static const int num_arguments = 3;
900 __ PrepareCallCFunction(num_arguments, a0);
901 __ mov(a0, backtrack_stackpointer());
902 __ Addu(a1, frame_pointer(), Operand(kStackHighEnd));
903 __ li(a2, Operand(ExternalReference::isolate_address()));
904 ExternalReference grow_stack =
905 ExternalReference::re_grow_stack(masm_->isolate());
906 __ CallCFunction(grow_stack, num_arguments);
908 __ MultiPop(regexp_registers);
911 __ Branch(&exit_with_exception,
eq, v0, Operand(zero_reg));
913 __ mov(backtrack_stackpointer(), v0);
916 __ lw(end_of_input_address(),
MemOperand(frame_pointer(), kInputEnd));
920 if (exit_with_exception.is_linked()) {
922 __ bind(&exit_with_exception);
924 __ li(v0, Operand(EXCEPTION));
930 masm_->GetCode(&code_desc);
931 Handle<Code> code =
FACTORY->NewCode(code_desc,
932 Code::ComputeFlags(Code::REGEXP),
933 masm_->CodeObject());
934 LOG(Isolate::Current(), RegExpCodeCreateEvent(*code, *source));
935 return Handle<HeapObject>::cast(code);
939 void RegExpMacroAssemblerMIPS::GoTo(Label* to) {
949 void RegExpMacroAssemblerMIPS::IfRegisterGE(
int reg,
952 __ lw(a0, register_location(reg));
953 BranchOrBacktrack(if_ge,
ge, a0, Operand(comparand));
957 void RegExpMacroAssemblerMIPS::IfRegisterLT(
int reg,
960 __ lw(a0, register_location(reg));
961 BranchOrBacktrack(if_lt,
lt, a0, Operand(comparand));
965 void RegExpMacroAssemblerMIPS::IfRegisterEqPos(
int reg,
967 __ lw(a0, register_location(reg));
968 BranchOrBacktrack(if_eq,
eq, a0, Operand(current_input_offset()));
972 RegExpMacroAssembler::IrregexpImplementation
973 RegExpMacroAssemblerMIPS::Implementation() {
974 return kMIPSImplementation;
978 void RegExpMacroAssemblerMIPS::LoadCurrentCharacter(
int cp_offset,
979 Label* on_end_of_input,
983 ASSERT(cp_offset < (1<<30));
985 CheckPosition(cp_offset + characters - 1, on_end_of_input);
987 LoadCurrentCharacterUnchecked(cp_offset, characters);
991 void RegExpMacroAssemblerMIPS::PopCurrentPosition() {
992 Pop(current_input_offset());
996 void RegExpMacroAssemblerMIPS::PopRegister(
int register_index) {
998 __ sw(a0, register_location(register_index));
1002 void RegExpMacroAssemblerMIPS::PushBacktrack(Label* label) {
1003 if (label->is_bound()) {
1004 int target = label->pos();
1007 Label after_constant;
1008 __ Branch(&after_constant);
1009 int offset = masm_->pc_offset();
1012 masm_->label_at_put(label, offset);
1013 __ bind(&after_constant);
1017 __ Addu(a0, code_pointer(), cp_offset);
1026 void RegExpMacroAssemblerMIPS::PushCurrentPosition() {
1027 Push(current_input_offset());
1031 void RegExpMacroAssemblerMIPS::PushRegister(
int register_index,
1032 StackCheckFlag check_stack_limit) {
1033 __ lw(a0, register_location(register_index));
1035 if (check_stack_limit) CheckStackLimit();
1039 void RegExpMacroAssemblerMIPS::ReadCurrentPositionFromRegister(
int reg) {
1040 __ lw(current_input_offset(), register_location(reg));
1044 void RegExpMacroAssemblerMIPS::ReadStackPointerFromRegister(
int reg) {
1045 __ lw(backtrack_stackpointer(), register_location(reg));
1047 __ Addu(backtrack_stackpointer(), backtrack_stackpointer(), Operand(a0));
1051 void RegExpMacroAssemblerMIPS::SetCurrentPositionFromEnd(
int by) {
1052 Label after_position;
1053 __ Branch(&after_position,
1055 current_input_offset(),
1056 Operand(-by * char_size()));
1057 __ li(current_input_offset(), -by * char_size());
1061 LoadCurrentCharacterUnchecked(-1, 1);
1062 __ bind(&after_position);
1066 void RegExpMacroAssemblerMIPS::SetRegister(
int register_index,
int to) {
1067 ASSERT(register_index >= num_saved_registers_);
1068 __ li(a0, Operand(to));
1069 __ sw(a0, register_location(register_index));
1073 bool RegExpMacroAssemblerMIPS::Succeed() {
1074 __ jmp(&success_label_);
1079 void RegExpMacroAssemblerMIPS::WriteCurrentPositionToRegister(
int reg,
1081 if (cp_offset == 0) {
1082 __ sw(current_input_offset(), register_location(reg));
1084 __ Addu(a0, current_input_offset(), Operand(cp_offset * char_size()));
1085 __ sw(a0, register_location(reg));
1090 void RegExpMacroAssemblerMIPS::ClearRegisters(
int reg_from,
int reg_to) {
1091 ASSERT(reg_from <= reg_to);
1092 __ lw(a0,
MemOperand(frame_pointer(), kInputStartMinusOne));
1093 for (
int reg = reg_from; reg <= reg_to; reg++) {
1094 __ sw(a0, register_location(reg));
1099 void RegExpMacroAssemblerMIPS::WriteStackPointerToRegister(
int reg) {
1101 __ Subu(a0, backtrack_stackpointer(), a1);
1102 __ sw(a0, register_location(reg));
1108 void RegExpMacroAssemblerMIPS::CallCheckStackGuardState(Register scratch) {
1109 static const int num_arguments = 3;
1110 __ PrepareCallCFunction(num_arguments, scratch);
1111 __ mov(a2, frame_pointer());
1115 ExternalReference stack_guard_check =
1116 ExternalReference::re_check_stack_guard_state(masm_->isolate());
1117 CallCFunctionUsingStub(stack_guard_check, num_arguments);
1122 template <
typename T>
1123 static T& frame_entry(
Address re_frame,
int frame_offset) {
1124 return reinterpret_cast<T&
>(Memory::int32_at(re_frame + frame_offset));
1128 int RegExpMacroAssemblerMIPS::CheckStackGuardState(
Address* return_address,
1131 Isolate* isolate = frame_entry<Isolate*>(re_frame, kIsolate);
1132 ASSERT(isolate == Isolate::Current());
1133 if (isolate->stack_guard()->IsStackOverflow()) {
1134 isolate->StackOverflow();
1143 if (frame_entry<int>(re_frame, kDirectCall) == 1) {
1148 HandleScope handles(isolate);
1149 Handle<Code> code_handle(re_code);
1151 Handle<String> subject(frame_entry<String*>(re_frame, kInputString));
1153 bool is_ascii = subject->IsAsciiRepresentationUnderneath();
1155 ASSERT(re_code->instruction_start() <= *return_address);
1156 ASSERT(*return_address <=
1157 re_code->instruction_start() + re_code->instruction_size());
1159 MaybeObject* result = Execution::HandleStackGuardInterrupt(isolate);
1161 if (*code_handle != re_code) {
1162 int delta = code_handle->address() - re_code->address();
1164 *return_address += delta;
1167 if (result->IsException()) {
1171 Handle<String> subject_tmp = subject;
1172 int slice_offset = 0;
1175 if (StringShape(*subject_tmp).IsCons()) {
1176 subject_tmp = Handle<String>(ConsString::cast(*subject_tmp)->first());
1177 }
else if (StringShape(*subject_tmp).IsSliced()) {
1178 SlicedString* slice = SlicedString::cast(*subject_tmp);
1179 subject_tmp = Handle<String>(slice->parent());
1180 slice_offset = slice->offset();
1184 if (subject_tmp->IsAsciiRepresentation() != is_ascii) {
1195 ASSERT(StringShape(*subject_tmp).IsSequential() ||
1196 StringShape(*subject_tmp).IsExternal());
1199 const byte* start_address = frame_entry<const byte*>(re_frame, kInputStart);
1203 int start_index = frame_entry<int>(re_frame, kStartIndex);
1204 const byte* new_address = StringCharacterPosition(*subject_tmp,
1205 start_index + slice_offset);
1207 if (start_address != new_address) {
1210 const byte* end_address = frame_entry<const byte* >(re_frame, kInputEnd);
1211 int byte_length =
static_cast<int>(end_address - start_address);
1212 frame_entry<const String*>(re_frame, kInputString) = *subject;
1213 frame_entry<const byte*>(re_frame, kInputStart) = new_address;
1214 frame_entry<const byte*>(re_frame, kInputEnd) = new_address + byte_length;
1215 }
else if (frame_entry<const String*>(re_frame, kInputString) != *subject) {
1219 frame_entry<const String*>(re_frame, kInputString) = *subject;
1226 MemOperand RegExpMacroAssemblerMIPS::register_location(
int register_index) {
1227 ASSERT(register_index < (1<<30));
1228 if (num_registers_ <= register_index) {
1229 num_registers_ = register_index + 1;
1236 void RegExpMacroAssemblerMIPS::CheckPosition(
int cp_offset,
1237 Label* on_outside_input) {
1238 BranchOrBacktrack(on_outside_input,
1240 current_input_offset(),
1241 Operand(-cp_offset * char_size()));
1245 void RegExpMacroAssemblerMIPS::BranchOrBacktrack(Label* to,
1248 const Operand& rt) {
1249 if (condition ==
al) {
1258 __ Branch(&backtrack_label_, condition, rs, rt);
1261 __ Branch(to, condition, rs, rt);
1265 void RegExpMacroAssemblerMIPS::SafeCall(Label* to,
1268 const Operand& rt) {
1269 __ BranchAndLink(to, cond, rs, rt);
1273 void RegExpMacroAssemblerMIPS::SafeReturn() {
1275 __ Addu(t5, ra, Operand(masm_->CodeObject()));
1280 void RegExpMacroAssemblerMIPS::SafeCallTarget(Label*
name) {
1282 __ Subu(ra, ra, Operand(masm_->CodeObject()));
1287 void RegExpMacroAssemblerMIPS::Push(Register source) {
1288 ASSERT(!source.is(backtrack_stackpointer()));
1289 __ Addu(backtrack_stackpointer(),
1290 backtrack_stackpointer(),
1296 void RegExpMacroAssemblerMIPS::Pop(Register target) {
1297 ASSERT(!target.is(backtrack_stackpointer()));
1299 __ Addu(backtrack_stackpointer(), backtrack_stackpointer(),
kPointerSize);
1303 void RegExpMacroAssemblerMIPS::CheckPreemption() {
1305 ExternalReference stack_limit =
1306 ExternalReference::address_of_stack_limit(masm_->isolate());
1307 __ li(a0, Operand(stack_limit));
1309 SafeCall(&check_preempt_label_,
ls,
sp, Operand(a0));
1313 void RegExpMacroAssemblerMIPS::CheckStackLimit() {
1314 ExternalReference stack_limit =
1315 ExternalReference::address_of_regexp_stack_limit(masm_->isolate());
1317 __ li(a0, Operand(stack_limit));
1319 SafeCall(&stack_overflow_label_,
ls, backtrack_stackpointer(), Operand(a0));
1323 void RegExpMacroAssemblerMIPS::CallCFunctionUsingStub(
1324 ExternalReference
function,
1325 int num_arguments) {
1327 ASSERT(num_arguments <= 4);
1328 __ li(code_pointer(), Operand(
function));
1329 RegExpCEntryStub stub;
1331 if (OS::ActivationFrameAlignment() != 0) {
1338 void RegExpMacroAssemblerMIPS::LoadCurrentCharacterUnchecked(
int cp_offset,
1340 Register offset = current_input_offset();
1341 if (cp_offset != 0) {
1343 __ Addu(t7, current_input_offset(), Operand(cp_offset * char_size()));
1349 __ Addu(t5, end_of_input_address(), Operand(offset));
1350 if (mode_ == ASCII) {
1359 void RegExpCEntryStub::Generate(MacroAssembler* masm_) {
1360 int stack_alignment = OS::ActivationFrameAlignment();
1366 __ Addu(a0,
sp, return_address_offset);
1378 #endif // V8_INTERPRETED_REGEXP
1382 #endif // V8_TARGET_ARCH_MIPS
const int kCArgsSlotsSize
RegExpMacroAssemblerMIPS(Mode mode, int registers_to_save, Zone *zone)
v8::Handle< v8::Value > Fail(const v8::Arguments &args)
#define LOG(isolate, Call)
value format" "after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false, "print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false, "print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false, "report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true, "flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true, "use incremental marking") DEFINE_bool(incremental_marking_steps, true, "do incremental marking steps") DEFINE_bool(trace_incremental_marking, false, "trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true, "Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false, "Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true, "use inline caching") DEFINE_bool(native_code_counters, false, "generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false, "Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true, "Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false, "Never perform compaction on full GC-testing only") DEFINE_bool(compact_code_space, true, "Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true, "Flush inline caches prior to mark compact collection and" "flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0, "Default seed for initializing random generator" "(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true, "allows verbose printing") DEFINE_bool(allow_natives_syntax, false, "allow natives syntax") DEFINE_bool(trace_sim, false, "Trace simulator execution") DEFINE_bool(check_icache, false, "Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0, "Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8, "Stack alingment in bytes in simulator(4 or 8, 8 is default)") DEFINE_bool(trace_exception, false, "print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false, "preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true, "randomize hashes to avoid predictable hash collisions" "(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0, "Fixed seed to use to hash property keys(0 means random)" "(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false, "activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true, "generate optimized regexp code") DEFINE_bool(testing_bool_flag, true, "testing_bool_flag") DEFINE_int(testing_int_flag, 13, "testing_int_flag") DEFINE_float(testing_float_flag, 2.5, "float-flag") DEFINE_string(testing_string_flag, "Hello, world!", "string-flag") DEFINE_int(testing_prng_seed, 42, "Seed used for threading test randomness") DEFINE_string(testing_serialization_file, "/tmp/serdes", "file in which to serialize heap") DEFINE_bool(help, false, "Print usage message, including flags, on console") DEFINE_bool(dump_counters, false, "Dump counters on exit") DEFINE_string(map_counters, "", "Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT, "Pass all remaining arguments to the script.Alias for\"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#43"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2#define FLAG_MODE_DEFINE_DEFAULTS#1"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flag-definitions.h"1#define FLAG_FULL(ftype, ctype, nam, def, cmt)#define FLAG_READONLY(ftype, ctype, nam, def, cmt)#define DEFINE_implication(whenflag, thenflag)#define DEFINE_bool(nam, def, cmt)#define DEFINE_int(nam, def, cmt)#define DEFINE_float(nam, def, cmt)#define DEFINE_string(nam, def, cmt)#define DEFINE_args(nam, def, cmt)#define FLAG DEFINE_bool(use_strict, false,"enforce strict mode") DEFINE_bool(es5_readonly, false,"activate correct semantics for inheriting readonliness") DEFINE_bool(es52_globals, false,"activate new semantics for global var declarations") DEFINE_bool(harmony_typeof, false,"enable harmony semantics for typeof") DEFINE_bool(harmony_scoping, false,"enable harmony block scoping") DEFINE_bool(harmony_modules, false,"enable harmony modules (implies block scoping)") DEFINE_bool(harmony_proxies, false,"enable harmony proxies") DEFINE_bool(harmony_collections, false,"enable harmony collections (sets, maps, and weak maps)") DEFINE_bool(harmony, false,"enable all harmony features (except typeof)") DEFINE_implication(harmony, harmony_scoping) DEFINE_implication(harmony, harmony_modules) DEFINE_implication(harmony, harmony_proxies) DEFINE_implication(harmony, harmony_collections) DEFINE_implication(harmony_modules, harmony_scoping) DEFINE_bool(packed_arrays, false,"optimizes arrays that have no holes") DEFINE_bool(smi_only_arrays, true,"tracks arrays with only smi values") DEFINE_bool(clever_optimizations, true,"Optimize object size, Array shift, DOM strings and string +") DEFINE_bool(unbox_double_arrays, true,"automatically unbox arrays of doubles") DEFINE_bool(string_slices, true,"use string slices") DEFINE_bool(crankshaft, true,"use crankshaft") DEFINE_string(hydrogen_filter,"","optimization filter") DEFINE_bool(use_range, true,"use hydrogen range analysis") DEFINE_bool(eliminate_dead_phis, true,"eliminate dead phis") DEFINE_bool(use_gvn, true,"use hydrogen global value numbering") DEFINE_bool(use_canonicalizing, true,"use hydrogen instruction canonicalizing") DEFINE_bool(use_inlining, true,"use function inlining") DEFINE_int(max_inlined_source_size, 600,"maximum source size in bytes considered for a single inlining") DEFINE_int(max_inlined_nodes, 196,"maximum number of AST nodes considered for a single inlining") DEFINE_int(max_inlined_nodes_cumulative, 196,"maximum cumulative number of AST nodes considered for inlining") DEFINE_bool(loop_invariant_code_motion, true,"loop invariant code motion") DEFINE_bool(collect_megamorphic_maps_from_stub_cache, true,"crankshaft harvests type feedback from stub cache") DEFINE_bool(hydrogen_stats, false,"print statistics for hydrogen") DEFINE_bool(trace_hydrogen, false,"trace generated hydrogen to file") DEFINE_string(trace_phase,"Z","trace generated IR for specified phases") DEFINE_bool(trace_inlining, false,"trace inlining decisions") DEFINE_bool(trace_alloc, false,"trace register allocator") DEFINE_bool(trace_all_uses, false,"trace all use positions") DEFINE_bool(trace_range, false,"trace range analysis") DEFINE_bool(trace_gvn, false,"trace global value numbering") DEFINE_bool(trace_representation, false,"trace representation types") DEFINE_bool(stress_pointer_maps, false,"pointer map for every instruction") DEFINE_bool(stress_environments, false,"environment for every instruction") DEFINE_int(deopt_every_n_times, 0,"deoptimize every n times a deopt point is passed") DEFINE_bool(trap_on_deopt, false,"put a break point before deoptimizing") DEFINE_bool(deoptimize_uncommon_cases, true,"deoptimize uncommon cases") DEFINE_bool(polymorphic_inlining, true,"polymorphic inlining") DEFINE_bool(use_osr, true,"use on-stack replacement") DEFINE_bool(array_bounds_checks_elimination, false,"perform array bounds checks elimination") DEFINE_bool(array_index_dehoisting, false,"perform array index dehoisting") DEFINE_bool(trace_osr, false,"trace on-stack replacement") DEFINE_int(stress_runs, 0,"number of stress runs") DEFINE_bool(optimize_closures, true,"optimize closures") DEFINE_bool(inline_construct, true,"inline constructor calls") DEFINE_bool(inline_arguments, true,"inline functions with arguments object") DEFINE_int(loop_weight, 1,"loop weight for representation inference") DEFINE_bool(optimize_for_in, true,"optimize functions containing for-in loops") DEFINE_bool(experimental_profiler, true,"enable all profiler experiments") DEFINE_bool(watch_ic_patching, false,"profiler considers IC stability") DEFINE_int(frame_count, 1,"number of stack frames inspected by the profiler") DEFINE_bool(self_optimization, false,"primitive functions trigger their own optimization") DEFINE_bool(direct_self_opt, false,"call recompile stub directly when self-optimizing") DEFINE_bool(retry_self_opt, false,"re-try self-optimization if it failed") DEFINE_bool(count_based_interrupts, false,"trigger profiler ticks based on counting instead of timing") DEFINE_bool(interrupt_at_exit, false,"insert an interrupt check at function exit") DEFINE_bool(weighted_back_edges, false,"weight back edges by jump distance for interrupt triggering") DEFINE_int(interrupt_budget, 5900,"execution budget before interrupt is triggered") DEFINE_int(type_info_threshold, 15,"percentage of ICs that must have type info to allow optimization") DEFINE_int(self_opt_count, 130,"call count before self-optimization") DEFINE_implication(experimental_profiler, watch_ic_patching) DEFINE_implication(experimental_profiler, self_optimization) DEFINE_implication(experimental_profiler, retry_self_opt) DEFINE_implication(experimental_profiler, count_based_interrupts) DEFINE_implication(experimental_profiler, interrupt_at_exit) DEFINE_implication(experimental_profiler, weighted_back_edges) DEFINE_bool(trace_opt_verbose, false,"extra verbose compilation tracing") DEFINE_implication(trace_opt_verbose, trace_opt) DEFINE_bool(debug_code, false,"generate extra code (assertions) for debugging") DEFINE_bool(code_comments, false,"emit comments in code disassembly") DEFINE_bool(enable_sse2, true,"enable use of SSE2 instructions if available") DEFINE_bool(enable_sse3, true,"enable use of SSE3 instructions if available") DEFINE_bool(enable_sse4_1, true,"enable use of SSE4.1 instructions if available") DEFINE_bool(enable_cmov, true,"enable use of CMOV instruction if available") DEFINE_bool(enable_rdtsc, true,"enable use of RDTSC instruction if available") DEFINE_bool(enable_sahf, true,"enable use of SAHF instruction if available (X64 only)") DEFINE_bool(enable_vfp3, true,"enable use of VFP3 instructions if available - this implies ""enabling ARMv7 instructions (ARM only)") DEFINE_bool(enable_armv7, true,"enable use of ARMv7 instructions if available (ARM only)") DEFINE_bool(enable_fpu, true,"enable use of MIPS FPU instructions if available (MIPS only)") DEFINE_string(expose_natives_as, NULL,"expose natives in global object") DEFINE_string(expose_debug_as, NULL,"expose debug in global object") DEFINE_bool(expose_gc, false,"expose gc extension") DEFINE_bool(expose_externalize_string, false,"expose externalize string extension") DEFINE_int(stack_trace_limit, 10,"number of stack frames to capture") DEFINE_bool(builtins_in_stack_traces, false,"show built-in functions in stack traces") DEFINE_bool(disable_native_files, false,"disable builtin natives files") DEFINE_bool(inline_new, true,"use fast inline allocation") DEFINE_bool(stack_trace_on_abort, true,"print a stack trace if an assertion failure occurs") DEFINE_bool(trace, false,"trace function calls") DEFINE_bool(mask_constants_with_cookie, true,"use random jit cookie to mask large constants") DEFINE_bool(lazy, true,"use lazy compilation") DEFINE_bool(trace_opt, false,"trace lazy optimization") DEFINE_bool(trace_opt_stats, false,"trace lazy optimization statistics") DEFINE_bool(opt, true,"use adaptive optimizations") DEFINE_bool(always_opt, false,"always try to optimize functions") DEFINE_bool(prepare_always_opt, false,"prepare for turning on always opt") DEFINE_bool(trace_deopt, false,"trace deoptimization") DEFINE_int(min_preparse_length, 1024,"minimum length for automatic enable preparsing") DEFINE_bool(always_full_compiler, false,"try to use the dedicated run-once backend for all code") DEFINE_bool(trace_bailout, false,"print reasons for falling back to using the classic V8 backend") DEFINE_bool(compilation_cache, true,"enable compilation cache") DEFINE_bool(cache_prototype_transitions, true,"cache prototype transitions") DEFINE_bool(trace_debug_json, false,"trace debugging JSON request/response") DEFINE_bool(debugger_auto_break, true,"automatically set the debug break flag when debugger commands are ""in the queue") DEFINE_bool(enable_liveedit, true,"enable liveedit experimental feature") DEFINE_bool(break_on_abort, true,"always cause a debug break before aborting") DEFINE_int(stack_size, kPointerSize *123,"default size of stack region v8 is allowed to use (in kBytes)") DEFINE_int(max_stack_trace_source_length, 300,"maximum length of function source code printed in a stack trace.") DEFINE_bool(always_inline_smi_code, false,"always inline smi code in non-opt code") DEFINE_int(max_new_space_size, 0,"max size of the new generation (in kBytes)") DEFINE_int(max_old_space_size, 0,"max size of the old generation (in Mbytes)") DEFINE_int(max_executable_size, 0,"max size of executable memory (in Mbytes)") DEFINE_bool(gc_global, false,"always perform global GCs") DEFINE_int(gc_interval,-1,"garbage collect after <n> allocations") DEFINE_bool(trace_gc, false,"print one trace line following each garbage collection") DEFINE_bool(trace_gc_nvp, false,"print one detailed trace line in name=value format ""after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false,"print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false,"print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false,"report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true,"garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true,"flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true,"use incremental marking") DEFINE_bool(incremental_marking_steps, true,"do incremental marking steps") DEFINE_bool(trace_incremental_marking, false,"trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true,"Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false,"Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true,"use inline caching") DEFINE_bool(native_code_counters, false,"generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false,"Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true,"Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false,"Never perform compaction on full GC - testing only") DEFINE_bool(compact_code_space, true,"Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true,"Flush inline caches prior to mark compact collection and ""flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0,"Default seed for initializing random generator ""(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true,"allows verbose printing") DEFINE_bool(allow_natives_syntax, false,"allow natives syntax") DEFINE_bool(trace_sim, false,"Trace simulator execution") DEFINE_bool(check_icache, false,"Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0,"Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8,"Stack alingment in bytes in simulator (4 or 8, 8 is default)") DEFINE_bool(trace_exception, false,"print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false,"preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true,"randomize hashes to avoid predictable hash collisions ""(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0,"Fixed seed to use to hash property keys (0 means random)""(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false,"activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true,"generate optimized regexp code") DEFINE_bool(testing_bool_flag, true,"testing_bool_flag") DEFINE_int(testing_int_flag, 13,"testing_int_flag") DEFINE_float(testing_float_flag, 2.5,"float-flag") DEFINE_string(testing_string_flag,"Hello, world!","string-flag") DEFINE_int(testing_prng_seed, 42,"Seed used for threading test randomness") DEFINE_string(testing_serialization_file,"/tmp/serdes","file in which to serialize heap") DEFINE_bool(help, false,"Print usage message, including flags, on console") DEFINE_bool(dump_counters, false,"Dump counters on exit") DEFINE_string(map_counters,"","Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT,"Pass all remaining arguments to the script. Alias for \"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#47"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2 namespace{struct Flag{enum FlagType{TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS} name
#define ASSERT(condition)
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
#define T(name, string, precedence)
MemOperand FieldMemOperand(Register object, int offset)
#define ASSERT_EQ(v1, v2)
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
const uc32 kMaxAsciiCharCode