30 #if defined(V8_TARGET_ARCH_ARM)
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),
135 __ jmp(&entry_label_);
136 EmitBacktrackConstantPool();
137 __ bind(&start_label_);
141 RegExpMacroAssemblerARM::~RegExpMacroAssemblerARM() {
144 entry_label_.Unuse();
145 start_label_.Unuse();
146 success_label_.Unuse();
147 backtrack_label_.Unuse();
149 check_preempt_label_.Unuse();
150 stack_overflow_label_.Unuse();
154 int RegExpMacroAssemblerARM::stack_limit_slack() {
155 return RegExpStack::kStackLimitSlack;
159 void RegExpMacroAssemblerARM::AdvanceCurrentPosition(
int by) {
161 __ add(current_input_offset(),
162 current_input_offset(), Operand(by * char_size()));
167 void RegExpMacroAssemblerARM::AdvanceRegister(
int reg,
int by) {
169 ASSERT(reg < num_registers_);
171 __ ldr(
r0, register_location(reg));
172 __ add(
r0,
r0, Operand(by));
173 __ str(
r0, register_location(reg));
178 void RegExpMacroAssemblerARM::Backtrack() {
182 __ add(
pc,
r0, Operand(code_pointer()));
186 void RegExpMacroAssemblerARM::Bind(Label* label) {
191 void RegExpMacroAssemblerARM::CheckCharacter(uint32_t c, Label* on_equal) {
192 __ cmp(current_character(), Operand(c));
193 BranchOrBacktrack(
eq, on_equal);
197 void RegExpMacroAssemblerARM::CheckCharacterGT(
uc16 limit, Label* on_greater) {
198 __ cmp(current_character(), Operand(limit));
199 BranchOrBacktrack(
gt, on_greater);
203 void RegExpMacroAssemblerARM::CheckAtStart(Label* on_at_start) {
208 BranchOrBacktrack(
ne, ¬_at_start);
212 __ add(
r0, end_of_input_address(), Operand(current_input_offset()));
214 BranchOrBacktrack(
eq, on_at_start);
215 __ bind(¬_at_start);
219 void RegExpMacroAssemblerARM::CheckNotAtStart(Label* on_not_at_start) {
223 BranchOrBacktrack(
ne, on_not_at_start);
226 __ add(
r0, end_of_input_address(), Operand(current_input_offset()));
228 BranchOrBacktrack(
ne, on_not_at_start);
232 void RegExpMacroAssemblerARM::CheckCharacterLT(
uc16 limit, Label* on_less) {
233 __ cmp(current_character(), Operand(limit));
234 BranchOrBacktrack(
lt, on_less);
238 void RegExpMacroAssemblerARM::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 __ add(
r0, end_of_input_address(), Operand(current_input_offset()));
254 if (cp_offset != 0) {
255 int byte_offset = cp_offset * char_size();
256 __ add(
r0,
r0, Operand(byte_offset));
260 int stored_high_byte = 0;
261 for (
int i = 0; i < str.length(); i++) {
262 if (mode_ == ASCII) {
265 __ cmp(
r1, Operand(str[i]));
268 uc16 match_char = str[i];
269 int match_high_byte = (match_char >> 8);
270 if (match_high_byte == 0) {
271 __ cmp(
r1, Operand(str[i]));
273 if (match_high_byte != stored_high_byte) {
274 __ mov(
r2, Operand(match_high_byte));
275 stored_high_byte = match_high_byte;
277 __ add(
r3,
r2, Operand(match_char & 0xff));
281 BranchOrBacktrack(
ne, on_failure);
286 void RegExpMacroAssemblerARM::CheckGreedyLoop(Label* on_equal) {
288 __ cmp(current_input_offset(),
r0);
289 __ add(backtrack_stackpointer(),
291 BranchOrBacktrack(
eq, on_equal);
295 void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase(
297 Label* on_no_match) {
299 __ ldr(
r0, register_location(start_reg));
300 __ ldr(
r1, register_location(start_reg + 1));
305 __ b(
eq, &fallthrough);
308 __ cmn(
r1, Operand(current_input_offset()));
309 BranchOrBacktrack(
gt, on_no_match);
311 if (mode_ == ASCII) {
318 __ add(
r0,
r0, Operand(end_of_input_address()));
319 __ add(
r2, end_of_input_address(), Operand(current_input_offset()));
331 __ b(
eq, &loop_check);
334 __ orr(
r3,
r3, Operand(0x20));
335 __ orr(
r4,
r4, Operand(0x20));
338 __ sub(
r3,
r3, Operand(
'a'));
339 __ cmp(
r3, Operand(
'z' -
'a'));
343 __ bind(&loop_check);
349 BranchOrBacktrack(
al, on_no_match);
353 __ sub(current_input_offset(),
r2, end_of_input_address());
356 int argument_count = 4;
357 __ PrepareCallCFunction(argument_count,
r2);
370 __ add(
r0,
r0, Operand(end_of_input_address()));
376 __ add(
r1, current_input_offset(), Operand(end_of_input_address()));
378 __ mov(
r3, Operand(ExternalReference::isolate_address()));
381 AllowExternalCallThatCantCauseGC scope(masm_);
382 ExternalReference
function =
383 ExternalReference::re_case_insensitive_compare_uc16(masm_->isolate());
384 __ CallCFunction(
function, argument_count);
389 BranchOrBacktrack(
eq, on_no_match);
391 __ add(current_input_offset(), current_input_offset(), Operand(
r4));
394 __ bind(&fallthrough);
398 void RegExpMacroAssemblerARM::CheckNotBackReference(
400 Label* on_no_match) {
405 __ ldr(
r0, register_location(start_reg));
406 __ ldr(
r1, register_location(start_reg + 1));
409 __ b(
eq, &fallthrough);
412 __ cmn(
r1, Operand(current_input_offset()));
413 BranchOrBacktrack(
gt, on_no_match);
416 __ add(
r0,
r0, Operand(end_of_input_address()));
417 __ add(
r2, end_of_input_address(), Operand(current_input_offset()));
422 if (mode_ == ASCII) {
431 BranchOrBacktrack(
ne, on_no_match);
436 __ sub(current_input_offset(),
r2, end_of_input_address());
437 __ bind(&fallthrough);
441 void RegExpMacroAssemblerARM::CheckNotCharacter(
unsigned c,
442 Label* on_not_equal) {
443 __ cmp(current_character(), Operand(c));
444 BranchOrBacktrack(
ne, on_not_equal);
448 void RegExpMacroAssemblerARM::CheckCharacterAfterAnd(uint32_t c,
452 __ tst(current_character(), Operand(mask));
454 __ and_(
r0, current_character(), Operand(mask));
455 __ cmp(
r0, Operand(c));
457 BranchOrBacktrack(
eq, on_equal);
461 void RegExpMacroAssemblerARM::CheckNotCharacterAfterAnd(
unsigned c,
463 Label* on_not_equal) {
465 __ tst(current_character(), Operand(mask));
467 __ and_(
r0, current_character(), Operand(mask));
468 __ cmp(
r0, Operand(c));
470 BranchOrBacktrack(
ne, on_not_equal);
474 void RegExpMacroAssemblerARM::CheckNotCharacterAfterMinusAnd(
478 Label* on_not_equal) {
479 ASSERT(minus < String::kMaxUtf16CodeUnit);
480 __ sub(
r0, current_character(), Operand(minus));
481 __ and_(
r0,
r0, Operand(mask));
482 __ cmp(
r0, Operand(c));
483 BranchOrBacktrack(
ne, on_not_equal);
487 void RegExpMacroAssemblerARM::CheckCharacterInRange(
490 Label* on_in_range) {
491 __ sub(
r0, current_character(), Operand(from));
492 __ cmp(
r0, Operand(to - from));
493 BranchOrBacktrack(
ls, on_in_range);
497 void RegExpMacroAssemblerARM::CheckCharacterNotInRange(
500 Label* on_not_in_range) {
501 __ sub(
r0, current_character(), Operand(from));
502 __ cmp(
r0, Operand(to - from));
503 BranchOrBacktrack(
hi, on_not_in_range);
507 void RegExpMacroAssemblerARM::CheckBitInTable(
508 Handle<ByteArray> table,
510 __ mov(
r0, Operand(table));
512 __ and_(
r1, current_character(), Operand(kTableSize - 1));
520 __ cmp(
r0, Operand(0));
521 BranchOrBacktrack(
ne, on_bit_set);
525 bool RegExpMacroAssemblerARM::CheckSpecialCharacterClass(
uc16 type,
526 Label* on_no_match) {
532 if (mode_ == ASCII) {
535 __ cmp(current_character(), Operand(
' '));
538 __ sub(
r0, current_character(), Operand(
'\t'));
539 __ cmp(
r0, Operand(
'\r' -
'\t'));
540 BranchOrBacktrack(
hi, on_no_match);
547 if (mode_ == ASCII) {
549 __ cmp(current_character(), Operand(
' '));
550 BranchOrBacktrack(
eq, on_no_match);
551 __ sub(
r0, current_character(), Operand(
'\t'));
552 __ cmp(
r0, Operand(
'\r' -
'\t'));
553 BranchOrBacktrack(
ls, on_no_match);
559 __ sub(
r0, current_character(), Operand(
'0'));
560 __ cmp(current_character(), Operand(
'9' -
'0'));
561 BranchOrBacktrack(
hi, on_no_match);
565 __ sub(
r0, current_character(), Operand(
'0'));
566 __ cmp(
r0, Operand(
'9' -
'0'));
567 BranchOrBacktrack(
ls, on_no_match);
571 __ eor(
r0, current_character(), Operand(0x01));
573 __ sub(
r0,
r0, Operand(0x0b));
574 __ cmp(
r0, Operand(0x0c - 0x0b));
575 BranchOrBacktrack(
ls, on_no_match);
580 __ sub(
r0,
r0, Operand(0x2028 - 0x0b));
581 __ cmp(
r0, Operand(1));
582 BranchOrBacktrack(
ls, on_no_match);
588 __ eor(
r0, current_character(), Operand(0x01));
590 __ sub(
r0,
r0, Operand(0x0b));
591 __ cmp(
r0, Operand(0x0c - 0x0b));
592 if (mode_ == ASCII) {
593 BranchOrBacktrack(
hi, on_no_match);
600 __ sub(
r0,
r0, Operand(0x2028 - 0x0b));
601 __ cmp(
r0, Operand(1));
602 BranchOrBacktrack(
hi, on_no_match);
608 if (mode_ != ASCII) {
610 __ cmp(current_character(), Operand(
'z'));
611 BranchOrBacktrack(
hi, on_no_match);
613 ExternalReference map = ExternalReference::re_word_character_map();
614 __ mov(
r0, Operand(map));
616 __ cmp(
r0, Operand(0));
617 BranchOrBacktrack(
eq, on_no_match);
622 if (mode_ != ASCII) {
624 __ cmp(current_character(), Operand(
'z'));
627 ExternalReference map = ExternalReference::re_word_character_map();
628 __ mov(
r0, Operand(map));
630 __ cmp(
r0, Operand(0));
631 BranchOrBacktrack(
ne, on_no_match);
632 if (mode_ != ASCII) {
648 __ mov(
r0, Operand(FAILURE));
649 __ jmp(&exit_label_);
653 Handle<HeapObject> RegExpMacroAssemblerARM::GetCode(Handle<String> source) {
659 __ bind(&entry_label_);
663 FrameScope scope(masm_, StackFrame::MANUAL);
674 __ stm(
db_w,
sp, argument_registers | registers_to_retain |
lr.
bit());
682 Label stack_limit_hit;
685 ExternalReference stack_limit =
686 ExternalReference::address_of_stack_limit(masm_->isolate());
687 __ mov(
r0, Operand(stack_limit));
691 __ b(
ls, &stack_limit_hit);
698 __ mov(
r0, Operand(EXCEPTION));
701 __ bind(&stack_limit_hit);
702 CallCheckStackGuardState(
r0);
705 __ b(
ne, &return_r0);
712 __ ldr(end_of_input_address(),
MemOperand(frame_pointer(), kInputEnd));
716 __ sub(current_input_offset(),
r0, end_of_input_address());
720 __ sub(
r0, current_input_offset(), Operand(char_size()));
721 __ sub(
r0,
r0, Operand(
r1,
LSL, (mode_ == UC16) ? 1 : 0));
727 __ mov(code_pointer(), Operand(masm_->CodeObject()));
729 Label load_char_start_regexp, start_regexp;
732 __ b(
ne, &load_char_start_regexp);
733 __ mov(current_character(), Operand(
'\n'),
LeaveCC,
eq);
734 __ jmp(&start_regexp);
737 __ bind(&load_char_start_regexp);
739 LoadCurrentCharacterUnchecked(-1, 1);
740 __ bind(&start_regexp);
743 if (num_saved_registers_ > 0) {
745 if (num_saved_registers_ > 8) {
747 __ add(
r1, frame_pointer(), Operand(kRegisterZero));
748 __ mov(
r2, Operand(num_saved_registers_));
753 __ b(
ne, &init_loop);
755 for (
int i = 0; i < num_saved_registers_; i++) {
756 __ str(
r0, register_location(i));
762 __ ldr(backtrack_stackpointer(),
MemOperand(frame_pointer(), kStackHighEnd));
764 __ jmp(&start_label_);
767 if (success_label_.is_linked()) {
769 __ bind(&success_label_);
770 if (num_saved_registers_ > 0) {
775 __ sub(
r1, end_of_input_address(),
r1);
788 for (
int i = 0; i < num_saved_registers_; i += 2) {
789 __ ldr(
r2, register_location(i));
790 __ ldr(
r3, register_location(i + 1));
791 if (i == 0 && global_with_zero_length_check()) {
813 __ add(
r0,
r0, Operand(1));
817 __ sub(
r1,
r1, Operand(num_saved_registers_));
819 __ cmp(
r1, Operand(num_saved_registers_));
820 __ b(
lt, &return_r0);
830 if (global_with_zero_length_check()) {
833 __ cmp(current_input_offset(),
r4);
835 __ b(
ne, &load_char_start_regexp);
837 __ cmp(current_input_offset(), Operand(0));
838 __ b(
eq, &exit_label_);
840 __ add(current_input_offset(),
841 current_input_offset(),
842 Operand((mode_ == UC16) ? 2 : 1));
845 __ b(&load_char_start_regexp);
847 __ mov(
r0, Operand(SUCCESS));
852 __ bind(&exit_label_);
859 __ mov(
sp, frame_pointer());
864 if (backtrack_label_.is_linked()) {
865 __ bind(&backtrack_label_);
869 Label exit_with_exception;
872 if (check_preempt_label_.is_linked()) {
873 SafeCallTarget(&check_preempt_label_);
875 CallCheckStackGuardState(
r0);
879 __ b(
ne, &return_r0);
882 __ ldr(end_of_input_address(),
MemOperand(frame_pointer(), kInputEnd));
887 if (stack_overflow_label_.is_linked()) {
888 SafeCallTarget(&stack_overflow_label_);
893 static const int num_arguments = 3;
894 __ PrepareCallCFunction(num_arguments,
r0);
895 __ mov(
r0, backtrack_stackpointer());
896 __ add(
r1, frame_pointer(), Operand(kStackHighEnd));
897 __ mov(
r2, Operand(ExternalReference::isolate_address()));
898 ExternalReference grow_stack =
899 ExternalReference::re_grow_stack(masm_->isolate());
900 __ CallCFunction(grow_stack, num_arguments);
904 __ b(
eq, &exit_with_exception);
906 __ mov(backtrack_stackpointer(),
r0);
911 if (exit_with_exception.is_linked()) {
913 __ bind(&exit_with_exception);
915 __ mov(
r0, Operand(EXCEPTION));
920 masm_->GetCode(&code_desc);
921 Handle<Code> code =
FACTORY->NewCode(code_desc,
922 Code::ComputeFlags(Code::REGEXP),
923 masm_->CodeObject());
924 PROFILE(Isolate::Current(), RegExpCodeCreateEvent(*code, *source));
925 return Handle<HeapObject>::cast(code);
929 void RegExpMacroAssemblerARM::GoTo(Label* to) {
930 BranchOrBacktrack(
al, to);
934 void RegExpMacroAssemblerARM::IfRegisterGE(
int reg,
937 __ ldr(
r0, register_location(reg));
938 __ cmp(
r0, Operand(comparand));
939 BranchOrBacktrack(
ge, if_ge);
943 void RegExpMacroAssemblerARM::IfRegisterLT(
int reg,
946 __ ldr(
r0, register_location(reg));
947 __ cmp(
r0, Operand(comparand));
948 BranchOrBacktrack(
lt, if_lt);
952 void RegExpMacroAssemblerARM::IfRegisterEqPos(
int reg,
954 __ ldr(
r0, register_location(reg));
955 __ cmp(
r0, Operand(current_input_offset()));
956 BranchOrBacktrack(
eq, if_eq);
960 RegExpMacroAssembler::IrregexpImplementation
961 RegExpMacroAssemblerARM::Implementation() {
962 return kARMImplementation;
966 void RegExpMacroAssemblerARM::LoadCurrentCharacter(
int cp_offset,
967 Label* on_end_of_input,
971 ASSERT(cp_offset < (1<<30));
973 CheckPosition(cp_offset + characters - 1, on_end_of_input);
975 LoadCurrentCharacterUnchecked(cp_offset, characters);
979 void RegExpMacroAssemblerARM::PopCurrentPosition() {
980 Pop(current_input_offset());
984 void RegExpMacroAssemblerARM::PopRegister(
int register_index) {
986 __ str(
r0, register_location(register_index));
990 static bool is_valid_memory_offset(
int value) {
991 if (value < 0) value = -value;
992 return value < (1<<12);
996 void RegExpMacroAssemblerARM::PushBacktrack(Label* label) {
997 if (label->is_bound()) {
998 int target = label->pos();
1001 int constant_offset = GetBacktrackConstantPoolEntry();
1002 masm_->label_at_put(label, constant_offset);
1005 unsigned int offset_of_pc_register_read =
1006 masm_->pc_offset() + Assembler::kPcLoadDelta;
1007 int pc_offset_of_constant =
1008 constant_offset - offset_of_pc_register_read;
1009 ASSERT(pc_offset_of_constant < 0);
1010 if (is_valid_memory_offset(pc_offset_of_constant)) {
1011 Assembler::BlockConstPoolScope block_const_pool(masm_);
1016 Assembler::BlockConstPoolScope block_const_pool(masm_);
1017 __ mov(
r0, Operand(pc_offset_of_constant + Assembler::kInstrSize));
1026 void RegExpMacroAssemblerARM::PushCurrentPosition() {
1027 Push(current_input_offset());
1031 void RegExpMacroAssemblerARM::PushRegister(
int register_index,
1032 StackCheckFlag check_stack_limit) {
1033 __ ldr(
r0, register_location(register_index));
1035 if (check_stack_limit) CheckStackLimit();
1039 void RegExpMacroAssemblerARM::ReadCurrentPositionFromRegister(
int reg) {
1040 __ ldr(current_input_offset(), register_location(reg));
1044 void RegExpMacroAssemblerARM::ReadStackPointerFromRegister(
int reg) {
1045 __ ldr(backtrack_stackpointer(), register_location(reg));
1047 __ add(backtrack_stackpointer(), backtrack_stackpointer(), Operand(
r0));
1051 void RegExpMacroAssemblerARM::SetCurrentPositionFromEnd(
int by) {
1052 Label after_position;
1053 __ cmp(current_input_offset(), Operand(-by * char_size()));
1054 __ b(
ge, &after_position);
1055 __ mov(current_input_offset(), Operand(-by * char_size()));
1059 LoadCurrentCharacterUnchecked(-1, 1);
1060 __ bind(&after_position);
1064 void RegExpMacroAssemblerARM::SetRegister(
int register_index,
int to) {
1065 ASSERT(register_index >= num_saved_registers_);
1066 __ mov(
r0, Operand(to));
1067 __ str(
r0, register_location(register_index));
1071 bool RegExpMacroAssemblerARM::Succeed() {
1072 __ jmp(&success_label_);
1077 void RegExpMacroAssemblerARM::WriteCurrentPositionToRegister(
int reg,
1079 if (cp_offset == 0) {
1080 __ str(current_input_offset(), register_location(reg));
1082 __ add(
r0, current_input_offset(), Operand(cp_offset * char_size()));
1083 __ str(
r0, register_location(reg));
1088 void RegExpMacroAssemblerARM::ClearRegisters(
int reg_from,
int reg_to) {
1089 ASSERT(reg_from <= reg_to);
1091 for (
int reg = reg_from; reg <= reg_to; reg++) {
1092 __ str(
r0, register_location(reg));
1097 void RegExpMacroAssemblerARM::WriteStackPointerToRegister(
int reg) {
1099 __ sub(
r0, backtrack_stackpointer(),
r1);
1100 __ str(
r0, register_location(reg));
1106 void RegExpMacroAssemblerARM::CallCheckStackGuardState(Register scratch) {
1107 static const int num_arguments = 3;
1108 __ PrepareCallCFunction(num_arguments, scratch);
1110 __ mov(
r2, frame_pointer());
1112 __ mov(
r1, Operand(masm_->CodeObject()));
1114 ExternalReference stack_guard_check =
1115 ExternalReference::re_check_stack_guard_state(masm_->isolate());
1116 CallCFunctionUsingStub(stack_guard_check, num_arguments);
1121 template <
typename T>
1122 static T& frame_entry(
Address re_frame,
int frame_offset) {
1123 return reinterpret_cast<T&
>(Memory::int32_at(re_frame + frame_offset));
1127 int RegExpMacroAssemblerARM::CheckStackGuardState(
Address* return_address,
1130 Isolate* isolate = frame_entry<Isolate*>(re_frame, kIsolate);
1131 ASSERT(isolate == Isolate::Current());
1132 if (isolate->stack_guard()->IsStackOverflow()) {
1133 isolate->StackOverflow();
1142 if (frame_entry<int>(re_frame, kDirectCall) == 1) {
1147 HandleScope handles(isolate);
1148 Handle<Code> code_handle(re_code);
1150 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 RegExpMacroAssemblerARM::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 RegExpMacroAssemblerARM::CheckPosition(
int cp_offset,
1237 Label* on_outside_input) {
1238 __ cmp(current_input_offset(), Operand(-cp_offset * char_size()));
1239 BranchOrBacktrack(
ge, on_outside_input);
1243 void RegExpMacroAssemblerARM::BranchOrBacktrack(
Condition condition,
1245 if (condition ==
al) {
1254 __ b(condition, &backtrack_label_);
1257 __ b(condition, to);
1261 void RegExpMacroAssemblerARM::SafeCall(Label* to,
Condition cond) {
1266 void RegExpMacroAssemblerARM::SafeReturn() {
1268 __ add(
pc,
lr, Operand(masm_->CodeObject()));
1272 void RegExpMacroAssemblerARM::SafeCallTarget(Label*
name) {
1274 __ sub(
lr,
lr, Operand(masm_->CodeObject()));
1279 void RegExpMacroAssemblerARM::Push(Register source) {
1280 ASSERT(!source.is(backtrack_stackpointer()));
1286 void RegExpMacroAssemblerARM::Pop(Register target) {
1287 ASSERT(!target.is(backtrack_stackpointer()));
1293 void RegExpMacroAssemblerARM::CheckPreemption() {
1295 ExternalReference stack_limit =
1296 ExternalReference::address_of_stack_limit(masm_->isolate());
1297 __ mov(
r0, Operand(stack_limit));
1300 SafeCall(&check_preempt_label_,
ls);
1304 void RegExpMacroAssemblerARM::CheckStackLimit() {
1305 ExternalReference stack_limit =
1306 ExternalReference::address_of_regexp_stack_limit(masm_->isolate());
1307 __ mov(
r0, Operand(stack_limit));
1309 __ cmp(backtrack_stackpointer(), Operand(
r0));
1310 SafeCall(&stack_overflow_label_,
ls);
1314 void RegExpMacroAssemblerARM::EmitBacktrackConstantPool() {
1315 __ CheckConstPool(
false,
false);
1316 Assembler::BlockConstPoolScope block_const_pool(masm_);
1317 backtrack_constant_pool_offset_ = masm_->pc_offset();
1318 for (
int i = 0; i < kBacktrackConstantPoolSize; i++) {
1322 backtrack_constant_pool_capacity_ = kBacktrackConstantPoolSize;
1326 int RegExpMacroAssemblerARM::GetBacktrackConstantPoolEntry() {
1327 while (backtrack_constant_pool_capacity_ > 0) {
1328 int offset = backtrack_constant_pool_offset_;
1330 backtrack_constant_pool_capacity_--;
1331 if (masm_->pc_offset() - offset < 2 *
KB) {
1335 Label new_pool_skip;
1336 __ jmp(&new_pool_skip);
1337 EmitBacktrackConstantPool();
1338 __ bind(&new_pool_skip);
1339 int offset = backtrack_constant_pool_offset_;
1341 backtrack_constant_pool_capacity_--;
1346 void RegExpMacroAssemblerARM::CallCFunctionUsingStub(
1347 ExternalReference
function,
1348 int num_arguments) {
1350 ASSERT(num_arguments <= 4);
1351 __ mov(code_pointer(), Operand(
function));
1352 RegExpCEntryStub stub;
1354 if (OS::ActivationFrameAlignment() != 0) {
1357 __ mov(code_pointer(), Operand(masm_->CodeObject()));
1361 void RegExpMacroAssemblerARM::LoadCurrentCharacterUnchecked(
int cp_offset,
1363 Register offset = current_input_offset();
1364 if (cp_offset != 0) {
1366 __ add(
r4, current_input_offset(), Operand(cp_offset * char_size()));
1373 #if !V8_TARGET_CAN_READ_UNALIGNED
1377 if (mode_ == ASCII) {
1378 if (characters == 4) {
1379 __ ldr(current_character(),
MemOperand(end_of_input_address(), offset));
1380 }
else if (characters == 2) {
1381 __ ldrh(current_character(),
MemOperand(end_of_input_address(), offset));
1384 __ ldrb(current_character(),
MemOperand(end_of_input_address(), offset));
1388 if (characters == 2) {
1389 __ ldr(current_character(),
MemOperand(end_of_input_address(), offset));
1392 __ ldrh(current_character(),
MemOperand(end_of_input_address(), offset));
1398 void RegExpCEntryStub::Generate(MacroAssembler* masm_) {
1399 int stack_alignment = OS::ActivationFrameAlignment();
1411 #endif // V8_INTERPRETED_REGEXP
1415 #endif // V8_TARGET_ARCH_ARM
v8::Handle< v8::Value > Fail(const v8::Arguments &args)
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)
#define PROFILE(isolate, Call)
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)
#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
RegExpMacroAssemblerARM(Mode mode, int registers_to_save, Zone *zone)
const uc32 kMaxAsciiCharCode