OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 * int (*match)(String* input_string, | 102 * int (*match)(String* input_string, |
103 * int start_index, | 103 * int start_index, |
104 * Address start, | 104 * Address start, |
105 * Address end, | 105 * Address end, |
106 * int* capture_output_array, | 106 * int* capture_output_array, |
107 * bool at_start, | 107 * bool at_start, |
108 * byte* stack_area_base, | 108 * byte* stack_area_base, |
109 * bool direct_call) | 109 * bool direct_call) |
110 */ | 110 */ |
111 | 111 |
112 #define __ ACCESS_MASM(masm_) | 112 #define __ ACCESS_MASM((&masm_)) |
113 | 113 |
114 RegExpMacroAssemblerX64::RegExpMacroAssemblerX64( | 114 RegExpMacroAssemblerX64::RegExpMacroAssemblerX64( |
115 Mode mode, | 115 Mode mode, |
116 int registers_to_save) | 116 int registers_to_save) |
117 : masm_(new MacroAssembler(NULL, kRegExpCodeSize)), | 117 : masm_(NULL, kRegExpCodeSize), |
118 no_root_array_scope_(masm_), | 118 no_root_array_scope_(&masm_), |
119 code_relative_fixup_positions_(4), | 119 code_relative_fixup_positions_(4), |
120 mode_(mode), | 120 mode_(mode), |
121 num_registers_(registers_to_save), | 121 num_registers_(registers_to_save), |
122 num_saved_registers_(registers_to_save), | 122 num_saved_registers_(registers_to_save), |
123 entry_label_(), | 123 entry_label_(), |
124 start_label_(), | 124 start_label_(), |
125 success_label_(), | 125 success_label_(), |
126 backtrack_label_(), | 126 backtrack_label_(), |
127 exit_label_() { | 127 exit_label_() { |
128 ASSERT_EQ(0, registers_to_save % 2); | 128 ASSERT_EQ(0, registers_to_save % 2); |
129 __ jmp(&entry_label_); // We'll write the entry code when we know more. | 129 __ jmp(&entry_label_); // We'll write the entry code when we know more. |
130 __ bind(&start_label_); // And then continue from here. | 130 __ bind(&start_label_); // And then continue from here. |
131 } | 131 } |
132 | 132 |
133 | 133 |
134 RegExpMacroAssemblerX64::~RegExpMacroAssemblerX64() { | 134 RegExpMacroAssemblerX64::~RegExpMacroAssemblerX64() { |
135 delete masm_; | |
136 // Unuse labels in case we throw away the assembler without calling GetCode. | 135 // Unuse labels in case we throw away the assembler without calling GetCode. |
137 entry_label_.Unuse(); | 136 entry_label_.Unuse(); |
138 start_label_.Unuse(); | 137 start_label_.Unuse(); |
139 success_label_.Unuse(); | 138 success_label_.Unuse(); |
140 backtrack_label_.Unuse(); | 139 backtrack_label_.Unuse(); |
141 exit_label_.Unuse(); | 140 exit_label_.Unuse(); |
142 check_preempt_label_.Unuse(); | 141 check_preempt_label_.Unuse(); |
143 stack_overflow_label_.Unuse(); | 142 stack_overflow_label_.Unuse(); |
144 } | 143 } |
145 | 144 |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 // Compute byte_offset2 (current position = rsi+rdi). | 420 // Compute byte_offset2 (current position = rsi+rdi). |
422 __ lea(rax, Operand(rsi, rdi, times_1, 0)); | 421 __ lea(rax, Operand(rsi, rdi, times_1, 0)); |
423 // Compute and set byte_offset1 (start of capture). | 422 // Compute and set byte_offset1 (start of capture). |
424 __ lea(rdi, Operand(rsi, rdx, times_1, 0)); | 423 __ lea(rdi, Operand(rsi, rdx, times_1, 0)); |
425 // Set byte_offset2. | 424 // Set byte_offset2. |
426 __ movq(rsi, rax); | 425 __ movq(rsi, rax); |
427 // Set byte_length. | 426 // Set byte_length. |
428 __ movq(rdx, rbx); | 427 __ movq(rdx, rbx); |
429 #endif | 428 #endif |
430 ExternalReference compare = | 429 ExternalReference compare = |
431 ExternalReference::re_case_insensitive_compare_uc16(masm_->isolate()); | 430 ExternalReference::re_case_insensitive_compare_uc16(masm_.isolate()); |
432 __ CallCFunction(compare, num_arguments); | 431 __ CallCFunction(compare, num_arguments); |
433 | 432 |
434 // Restore original values before reacting on result value. | 433 // Restore original values before reacting on result value. |
435 __ Move(code_object_pointer(), masm_->CodeObject()); | 434 __ Move(code_object_pointer(), masm_.CodeObject()); |
436 __ pop(backtrack_stackpointer()); | 435 __ pop(backtrack_stackpointer()); |
437 #ifndef _WIN64 | 436 #ifndef _WIN64 |
438 __ pop(rdi); | 437 __ pop(rdi); |
439 __ pop(rsi); | 438 __ pop(rsi); |
440 #endif | 439 #endif |
441 | 440 |
442 // Check if function returned non-zero for success or zero for failure. | 441 // Check if function returned non-zero for success or zero for failure. |
443 __ testq(rax, rax); | 442 __ testq(rax, rax); |
444 BranchOrBacktrack(zero, on_no_match); | 443 BranchOrBacktrack(zero, on_no_match); |
445 // On success, increment position by length of capture. | 444 // On success, increment position by length of capture. |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
739 __ push(rbx); // Callee-save | 738 __ push(rbx); // Callee-save |
740 #endif | 739 #endif |
741 | 740 |
742 __ push(Immediate(0)); // Make room for "at start" constant. | 741 __ push(Immediate(0)); // Make room for "at start" constant. |
743 | 742 |
744 // Check if we have space on the stack for registers. | 743 // Check if we have space on the stack for registers. |
745 Label stack_limit_hit; | 744 Label stack_limit_hit; |
746 Label stack_ok; | 745 Label stack_ok; |
747 | 746 |
748 ExternalReference stack_limit = | 747 ExternalReference stack_limit = |
749 ExternalReference::address_of_stack_limit(masm_->isolate()); | 748 ExternalReference::address_of_stack_limit(masm_.isolate()); |
750 __ movq(rcx, rsp); | 749 __ movq(rcx, rsp); |
751 __ movq(kScratchRegister, stack_limit); | 750 __ movq(kScratchRegister, stack_limit); |
752 __ subq(rcx, Operand(kScratchRegister, 0)); | 751 __ subq(rcx, Operand(kScratchRegister, 0)); |
753 // Handle it if the stack pointer is already below the stack limit. | 752 // Handle it if the stack pointer is already below the stack limit. |
754 __ j(below_equal, &stack_limit_hit); | 753 __ j(below_equal, &stack_limit_hit); |
755 // Check if there is room for the variable number of registers above | 754 // Check if there is room for the variable number of registers above |
756 // the stack limit. | 755 // the stack limit. |
757 __ cmpq(rcx, Immediate(num_registers_ * kPointerSize)); | 756 __ cmpq(rcx, Immediate(num_registers_ * kPointerSize)); |
758 __ j(above_equal, &stack_ok); | 757 __ j(above_equal, &stack_ok); |
759 // Exit with OutOfMemory exception. There is not enough space on the stack | 758 // Exit with OutOfMemory exception. There is not enough space on the stack |
760 // for our working registers. | 759 // for our working registers. |
761 __ movq(rax, Immediate(EXCEPTION)); | 760 __ movq(rax, Immediate(EXCEPTION)); |
762 __ jmp(&exit_label_); | 761 __ jmp(&exit_label_); |
763 | 762 |
764 __ bind(&stack_limit_hit); | 763 __ bind(&stack_limit_hit); |
765 __ Move(code_object_pointer(), masm_->CodeObject()); | 764 __ Move(code_object_pointer(), masm_.CodeObject()); |
766 CallCheckStackGuardState(); // Preserves no registers beside rbp and rsp. | 765 CallCheckStackGuardState(); // Preserves no registers beside rbp and rsp. |
767 __ testq(rax, rax); | 766 __ testq(rax, rax); |
768 // If returned value is non-zero, we exit with the returned value as result. | 767 // If returned value is non-zero, we exit with the returned value as result. |
769 __ j(not_zero, &exit_label_); | 768 __ j(not_zero, &exit_label_); |
770 | 769 |
771 __ bind(&stack_ok); | 770 __ bind(&stack_ok); |
772 | 771 |
773 // Allocate space on stack for registers. | 772 // Allocate space on stack for registers. |
774 __ subq(rsp, Immediate(num_registers_ * kPointerSize)); | 773 __ subq(rsp, Immediate(num_registers_ * kPointerSize)); |
775 // Load string length. | 774 // Load string length. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 const int kRegistersPerPage = kPageSize / kPointerSize; | 809 const int kRegistersPerPage = kPageSize / kPointerSize; |
811 for (int i = num_saved_registers_ + kRegistersPerPage - 1; | 810 for (int i = num_saved_registers_ + kRegistersPerPage - 1; |
812 i < num_registers_; | 811 i < num_registers_; |
813 i += kRegistersPerPage) { | 812 i += kRegistersPerPage) { |
814 __ movq(register_location(i), rax); // One write every page. | 813 __ movq(register_location(i), rax); // One write every page. |
815 } | 814 } |
816 | 815 |
817 // Initialize backtrack stack pointer. | 816 // Initialize backtrack stack pointer. |
818 __ movq(backtrack_stackpointer(), Operand(rbp, kStackHighEnd)); | 817 __ movq(backtrack_stackpointer(), Operand(rbp, kStackHighEnd)); |
819 // Initialize code object pointer. | 818 // Initialize code object pointer. |
820 __ Move(code_object_pointer(), masm_->CodeObject()); | 819 __ Move(code_object_pointer(), masm_.CodeObject()); |
821 // Load previous char as initial value of current-character. | 820 // Load previous char as initial value of current-character. |
822 Label at_start; | 821 Label at_start; |
823 __ cmpb(Operand(rbp, kStartIndex), Immediate(0)); | 822 __ cmpb(Operand(rbp, kStartIndex), Immediate(0)); |
824 __ j(equal, &at_start); | 823 __ j(equal, &at_start); |
825 LoadCurrentCharacterUnchecked(-1, 1); // Load previous char. | 824 LoadCurrentCharacterUnchecked(-1, 1); // Load previous char. |
826 __ jmp(&start_label_); | 825 __ jmp(&start_label_); |
827 __ bind(&at_start); | 826 __ bind(&at_start); |
828 __ movq(current_character(), Immediate('\n')); | 827 __ movq(current_character(), Immediate('\n')); |
829 __ jmp(&start_label_); | 828 __ jmp(&start_label_); |
830 | 829 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 __ push(backtrack_stackpointer()); | 890 __ push(backtrack_stackpointer()); |
892 __ push(rdi); | 891 __ push(rdi); |
893 | 892 |
894 CallCheckStackGuardState(); | 893 CallCheckStackGuardState(); |
895 __ testq(rax, rax); | 894 __ testq(rax, rax); |
896 // If returning non-zero, we should end execution with the given | 895 // If returning non-zero, we should end execution with the given |
897 // result as return value. | 896 // result as return value. |
898 __ j(not_zero, &exit_label_); | 897 __ j(not_zero, &exit_label_); |
899 | 898 |
900 // Restore registers. | 899 // Restore registers. |
901 __ Move(code_object_pointer(), masm_->CodeObject()); | 900 __ Move(code_object_pointer(), masm_.CodeObject()); |
902 __ pop(rdi); | 901 __ pop(rdi); |
903 __ pop(backtrack_stackpointer()); | 902 __ pop(backtrack_stackpointer()); |
904 // String might have moved: Reload esi from frame. | 903 // String might have moved: Reload esi from frame. |
905 __ movq(rsi, Operand(rbp, kInputEnd)); | 904 __ movq(rsi, Operand(rbp, kInputEnd)); |
906 SafeReturn(); | 905 SafeReturn(); |
907 } | 906 } |
908 | 907 |
909 // Backtrack stack overflow code. | 908 // Backtrack stack overflow code. |
910 if (stack_overflow_label_.is_linked()) { | 909 if (stack_overflow_label_.is_linked()) { |
911 SafeCallTarget(&stack_overflow_label_); | 910 SafeCallTarget(&stack_overflow_label_); |
(...skipping 13 matching lines...) Expand all Loading... |
925 #ifdef _WIN64 | 924 #ifdef _WIN64 |
926 // Microsoft passes parameters in rcx, rdx. | 925 // Microsoft passes parameters in rcx, rdx. |
927 // First argument, backtrack stackpointer, is already in rcx. | 926 // First argument, backtrack stackpointer, is already in rcx. |
928 __ lea(rdx, Operand(rbp, kStackHighEnd)); // Second argument | 927 __ lea(rdx, Operand(rbp, kStackHighEnd)); // Second argument |
929 #else | 928 #else |
930 // AMD64 ABI passes parameters in rdi, rsi. | 929 // AMD64 ABI passes parameters in rdi, rsi. |
931 __ movq(rdi, backtrack_stackpointer()); // First argument. | 930 __ movq(rdi, backtrack_stackpointer()); // First argument. |
932 __ lea(rsi, Operand(rbp, kStackHighEnd)); // Second argument. | 931 __ lea(rsi, Operand(rbp, kStackHighEnd)); // Second argument. |
933 #endif | 932 #endif |
934 ExternalReference grow_stack = | 933 ExternalReference grow_stack = |
935 ExternalReference::re_grow_stack(masm_->isolate()); | 934 ExternalReference::re_grow_stack(masm_.isolate()); |
936 __ CallCFunction(grow_stack, num_arguments); | 935 __ CallCFunction(grow_stack, num_arguments); |
937 // If return NULL, we have failed to grow the stack, and | 936 // If return NULL, we have failed to grow the stack, and |
938 // must exit with a stack-overflow exception. | 937 // must exit with a stack-overflow exception. |
939 __ testq(rax, rax); | 938 __ testq(rax, rax); |
940 __ j(equal, &exit_with_exception); | 939 __ j(equal, &exit_with_exception); |
941 // Otherwise use return value as new stack pointer. | 940 // Otherwise use return value as new stack pointer. |
942 __ movq(backtrack_stackpointer(), rax); | 941 __ movq(backtrack_stackpointer(), rax); |
943 // Restore saved registers and continue. | 942 // Restore saved registers and continue. |
944 __ Move(code_object_pointer(), masm_->CodeObject()); | 943 __ Move(code_object_pointer(), masm_.CodeObject()); |
945 #ifndef _WIN64 | 944 #ifndef _WIN64 |
946 __ pop(rdi); | 945 __ pop(rdi); |
947 __ pop(rsi); | 946 __ pop(rsi); |
948 #endif | 947 #endif |
949 SafeReturn(); | 948 SafeReturn(); |
950 } | 949 } |
951 | 950 |
952 if (exit_with_exception.is_linked()) { | 951 if (exit_with_exception.is_linked()) { |
953 // If any of the code above needed to exit with an exception. | 952 // If any of the code above needed to exit with an exception. |
954 __ bind(&exit_with_exception); | 953 __ bind(&exit_with_exception); |
955 // Exit with Result EXCEPTION(-1) to signal thrown exception. | 954 // Exit with Result EXCEPTION(-1) to signal thrown exception. |
956 __ movq(rax, Immediate(EXCEPTION)); | 955 __ movq(rax, Immediate(EXCEPTION)); |
957 __ jmp(&exit_label_); | 956 __ jmp(&exit_label_); |
958 } | 957 } |
959 | 958 |
960 FixupCodeRelativePositions(); | 959 FixupCodeRelativePositions(); |
961 | 960 |
962 CodeDesc code_desc; | 961 CodeDesc code_desc; |
963 masm_->GetCode(&code_desc); | 962 masm_.GetCode(&code_desc); |
964 Isolate* isolate = ISOLATE; | 963 Isolate* isolate = ISOLATE; |
965 Handle<Code> code = isolate->factory()->NewCode( | 964 Handle<Code> code = isolate->factory()->NewCode( |
966 code_desc, Code::ComputeFlags(Code::REGEXP), | 965 code_desc, Code::ComputeFlags(Code::REGEXP), |
967 masm_->CodeObject()); | 966 masm_.CodeObject()); |
968 PROFILE(isolate, RegExpCodeCreateEvent(*code, *source)); | 967 PROFILE(isolate, RegExpCodeCreateEvent(*code, *source)); |
969 return Handle<Object>::cast(code); | 968 return Handle<Object>::cast(code); |
970 } | 969 } |
971 | 970 |
972 | 971 |
973 void RegExpMacroAssemblerX64::GoTo(Label* to) { | 972 void RegExpMacroAssemblerX64::GoTo(Label* to) { |
974 BranchOrBacktrack(no_condition, to); | 973 BranchOrBacktrack(no_condition, to); |
975 } | 974 } |
976 | 975 |
977 | 976 |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1127 #else | 1126 #else |
1128 // Third argument: RegExp code frame pointer. | 1127 // Third argument: RegExp code frame pointer. |
1129 __ movq(rdx, rbp); | 1128 __ movq(rdx, rbp); |
1130 // Second argument: Code* of self. | 1129 // Second argument: Code* of self. |
1131 __ movq(rsi, code_object_pointer()); | 1130 __ movq(rsi, code_object_pointer()); |
1132 // First argument: Next address on the stack (will be address of | 1131 // First argument: Next address on the stack (will be address of |
1133 // return address). | 1132 // return address). |
1134 __ lea(rdi, Operand(rsp, -kPointerSize)); | 1133 __ lea(rdi, Operand(rsp, -kPointerSize)); |
1135 #endif | 1134 #endif |
1136 ExternalReference stack_check = | 1135 ExternalReference stack_check = |
1137 ExternalReference::re_check_stack_guard_state(masm_->isolate()); | 1136 ExternalReference::re_check_stack_guard_state(masm_.isolate()); |
1138 __ CallCFunction(stack_check, num_arguments); | 1137 __ CallCFunction(stack_check, num_arguments); |
1139 } | 1138 } |
1140 | 1139 |
1141 | 1140 |
1142 // Helper function for reading a value out of a stack frame. | 1141 // Helper function for reading a value out of a stack frame. |
1143 template <typename T> | 1142 template <typename T> |
1144 static T& frame_entry(Address re_frame, int frame_offset) { | 1143 static T& frame_entry(Address re_frame, int frame_offset) { |
1145 return reinterpret_cast<T&>(Memory::int32_at(re_frame + frame_offset)); | 1144 return reinterpret_cast<T&>(Memory::int32_at(re_frame + frame_offset)); |
1146 } | 1145 } |
1147 | 1146 |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1292 } | 1291 } |
1293 | 1292 |
1294 | 1293 |
1295 void RegExpMacroAssemblerX64::FixupCodeRelativePositions() { | 1294 void RegExpMacroAssemblerX64::FixupCodeRelativePositions() { |
1296 for (int i = 0, n = code_relative_fixup_positions_.length(); i < n; i++) { | 1295 for (int i = 0, n = code_relative_fixup_positions_.length(); i < n; i++) { |
1297 int position = code_relative_fixup_positions_[i]; | 1296 int position = code_relative_fixup_positions_[i]; |
1298 // The position succeeds a relative label offset from position. | 1297 // The position succeeds a relative label offset from position. |
1299 // Patch the relative offset to be relative to the Code object pointer | 1298 // Patch the relative offset to be relative to the Code object pointer |
1300 // instead. | 1299 // instead. |
1301 int patch_position = position - kIntSize; | 1300 int patch_position = position - kIntSize; |
1302 int offset = masm_->long_at(patch_position); | 1301 int offset = masm_.long_at(patch_position); |
1303 masm_->long_at_put(patch_position, | 1302 masm_.long_at_put(patch_position, |
1304 offset | 1303 offset |
1305 + position | 1304 + position |
1306 + Code::kHeaderSize | 1305 + Code::kHeaderSize |
1307 - kHeapObjectTag); | 1306 - kHeapObjectTag); |
1308 } | 1307 } |
1309 code_relative_fixup_positions_.Clear(); | 1308 code_relative_fixup_positions_.Clear(); |
1310 } | 1309 } |
1311 | 1310 |
1312 | 1311 |
1313 void RegExpMacroAssemblerX64::Push(Label* backtrack_target) { | 1312 void RegExpMacroAssemblerX64::Push(Label* backtrack_target) { |
(...skipping 13 matching lines...) Expand all Loading... |
1327 | 1326 |
1328 void RegExpMacroAssemblerX64::Drop() { | 1327 void RegExpMacroAssemblerX64::Drop() { |
1329 __ addq(backtrack_stackpointer(), Immediate(kIntSize)); | 1328 __ addq(backtrack_stackpointer(), Immediate(kIntSize)); |
1330 } | 1329 } |
1331 | 1330 |
1332 | 1331 |
1333 void RegExpMacroAssemblerX64::CheckPreemption() { | 1332 void RegExpMacroAssemblerX64::CheckPreemption() { |
1334 // Check for preemption. | 1333 // Check for preemption. |
1335 Label no_preempt; | 1334 Label no_preempt; |
1336 ExternalReference stack_limit = | 1335 ExternalReference stack_limit = |
1337 ExternalReference::address_of_stack_limit(masm_->isolate()); | 1336 ExternalReference::address_of_stack_limit(masm_.isolate()); |
1338 __ load_rax(stack_limit); | 1337 __ load_rax(stack_limit); |
1339 __ cmpq(rsp, rax); | 1338 __ cmpq(rsp, rax); |
1340 __ j(above, &no_preempt); | 1339 __ j(above, &no_preempt); |
1341 | 1340 |
1342 SafeCall(&check_preempt_label_); | 1341 SafeCall(&check_preempt_label_); |
1343 | 1342 |
1344 __ bind(&no_preempt); | 1343 __ bind(&no_preempt); |
1345 } | 1344 } |
1346 | 1345 |
1347 | 1346 |
1348 void RegExpMacroAssemblerX64::CheckStackLimit() { | 1347 void RegExpMacroAssemblerX64::CheckStackLimit() { |
1349 Label no_stack_overflow; | 1348 Label no_stack_overflow; |
1350 ExternalReference stack_limit = | 1349 ExternalReference stack_limit = |
1351 ExternalReference::address_of_regexp_stack_limit(masm_->isolate()); | 1350 ExternalReference::address_of_regexp_stack_limit(masm_.isolate()); |
1352 __ load_rax(stack_limit); | 1351 __ load_rax(stack_limit); |
1353 __ cmpq(backtrack_stackpointer(), rax); | 1352 __ cmpq(backtrack_stackpointer(), rax); |
1354 __ j(above, &no_stack_overflow); | 1353 __ j(above, &no_stack_overflow); |
1355 | 1354 |
1356 SafeCall(&stack_overflow_label_); | 1355 SafeCall(&stack_overflow_label_); |
1357 | 1356 |
1358 __ bind(&no_stack_overflow); | 1357 __ bind(&no_stack_overflow); |
1359 } | 1358 } |
1360 | 1359 |
1361 | 1360 |
(...skipping 21 matching lines...) Expand all Loading... |
1383 } | 1382 } |
1384 } | 1383 } |
1385 | 1384 |
1386 #undef __ | 1385 #undef __ |
1387 | 1386 |
1388 #endif // V8_INTERPRETED_REGEXP | 1387 #endif // V8_INTERPRETED_REGEXP |
1389 | 1388 |
1390 }} // namespace v8::internal | 1389 }} // namespace v8::internal |
1391 | 1390 |
1392 #endif // V8_TARGET_ARCH_X64 | 1391 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |