| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 2846 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2857 | 2857 |
| 2858 // rdi: subject string | 2858 // rdi: subject string |
| 2859 // rbx: previous index | 2859 // rbx: previous index |
| 2860 // rcx: encoding of subject string (1 if ASCII 0 if two_byte); | 2860 // rcx: encoding of subject string (1 if ASCII 0 if two_byte); |
| 2861 // r11: code | 2861 // r11: code |
| 2862 // All checks done. Now push arguments for native regexp code. | 2862 // All checks done. Now push arguments for native regexp code. |
| 2863 Counters* counters = masm->isolate()->counters(); | 2863 Counters* counters = masm->isolate()->counters(); |
| 2864 __ IncrementCounter(counters->regexp_entry_native(), 1); | 2864 __ IncrementCounter(counters->regexp_entry_native(), 1); |
| 2865 | 2865 |
| 2866 // Isolates: note we add an additional parameter here (isolate pointer). | 2866 // Isolates: note we add an additional parameter here (isolate pointer). |
| 2867 static const int kRegExpExecuteArguments = 8; | 2867 static const int kRegExpExecuteArguments = 9; |
| 2868 int argument_slots_on_stack = | 2868 int argument_slots_on_stack = |
| 2869 masm->ArgumentStackSlotsForCFunctionCall(kRegExpExecuteArguments); | 2869 masm->ArgumentStackSlotsForCFunctionCall(kRegExpExecuteArguments); |
| 2870 __ EnterApiExitFrame(argument_slots_on_stack); | 2870 __ EnterApiExitFrame(argument_slots_on_stack); |
| 2871 | 2871 |
| 2872 // Argument 8: Pass current isolate address. | 2872 // Argument 9: Pass current isolate address. |
| 2873 // __ movq(Operand(rsp, (argument_slots_on_stack - 1) * kPointerSize), | 2873 // __ movq(Operand(rsp, (argument_slots_on_stack - 1) * kPointerSize), |
| 2874 // Immediate(ExternalReference::isolate_address())); | 2874 // Immediate(ExternalReference::isolate_address())); |
| 2875 __ LoadAddress(kScratchRegister, ExternalReference::isolate_address()); | 2875 __ LoadAddress(kScratchRegister, ExternalReference::isolate_address()); |
| 2876 __ movq(Operand(rsp, (argument_slots_on_stack - 1) * kPointerSize), | 2876 __ movq(Operand(rsp, (argument_slots_on_stack - 1) * kPointerSize), |
| 2877 kScratchRegister); | 2877 kScratchRegister); |
| 2878 | 2878 |
| 2879 // Argument 7: Indicate that this is a direct call from JavaScript. | 2879 // Argument 8: Indicate that this is a direct call from JavaScript. |
| 2880 __ movq(Operand(rsp, (argument_slots_on_stack - 2) * kPointerSize), | 2880 __ movq(Operand(rsp, (argument_slots_on_stack - 2) * kPointerSize), |
| 2881 Immediate(1)); | 2881 Immediate(1)); |
| 2882 | 2882 |
| 2883 // Argument 6: Start (high end) of backtracking stack memory area. | 2883 // Argument 7: Start (high end) of backtracking stack memory area. |
| 2884 __ movq(kScratchRegister, address_of_regexp_stack_memory_address); | 2884 __ movq(kScratchRegister, address_of_regexp_stack_memory_address); |
| 2885 __ movq(r9, Operand(kScratchRegister, 0)); | 2885 __ movq(r9, Operand(kScratchRegister, 0)); |
| 2886 __ movq(kScratchRegister, address_of_regexp_stack_memory_size); | 2886 __ movq(kScratchRegister, address_of_regexp_stack_memory_size); |
| 2887 __ addq(r9, Operand(kScratchRegister, 0)); | 2887 __ addq(r9, Operand(kScratchRegister, 0)); |
| 2888 // Argument 6 passed in r9 on Linux and on the stack on Windows. | 2888 __ movq(Operand(rsp, (argument_slots_on_stack - 3) * kPointerSize), r9); |
| 2889 |
| 2890 // Argument 6: Clear the number of capture registers for non-global capture. |
| 2891 // Argument 6 is passed in r9 on Linux and on the stack on Windows. |
| 2889 #ifdef _WIN64 | 2892 #ifdef _WIN64 |
| 2890 __ movq(Operand(rsp, (argument_slots_on_stack - 3) * kPointerSize), r9); | 2893 __ movq(Operand(rsp, (argument_slots_on_stack - 4) * kPointerSize), |
| 2894 Immediate(0)); |
| 2895 #else |
| 2896 __ Set(r9, 0); |
| 2891 #endif | 2897 #endif |
| 2892 | 2898 |
| 2893 // Argument 5: static offsets vector buffer. | 2899 // Argument 5: static offsets vector buffer. |
| 2894 __ LoadAddress(r8, | 2900 __ LoadAddress(r8, |
| 2895 ExternalReference::address_of_static_offsets_vector(isolate)); | 2901 ExternalReference::address_of_static_offsets_vector(isolate)); |
| 2896 // Argument 5 passed in r8 on Linux and on the stack on Windows. | 2902 // Argument 5 passed in r8 on Linux and on the stack on Windows. |
| 2897 #ifdef _WIN64 | 2903 #ifdef _WIN64 |
| 2898 __ movq(Operand(rsp, (argument_slots_on_stack - 4) * kPointerSize), r8); | 2904 __ movq(Operand(rsp, (argument_slots_on_stack - 5) * kPointerSize), r8); |
| 2899 #endif | 2905 #endif |
| 2900 | 2906 |
| 2901 // First four arguments are passed in registers on both Linux and Windows. | 2907 // First four arguments are passed in registers on both Linux and Windows. |
| 2902 #ifdef _WIN64 | 2908 #ifdef _WIN64 |
| 2903 Register arg4 = r9; | 2909 Register arg4 = r9; |
| 2904 Register arg3 = r8; | 2910 Register arg3 = r8; |
| 2905 Register arg2 = rdx; | 2911 Register arg2 = rdx; |
| 2906 Register arg1 = rcx; | 2912 Register arg1 = rcx; |
| 2907 #else | 2913 #else |
| 2908 Register arg4 = rcx; | 2914 Register arg4 = rcx; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2954 // Locate the code entry and call it. | 2960 // Locate the code entry and call it. |
| 2955 __ addq(r11, Immediate(Code::kHeaderSize - kHeapObjectTag)); | 2961 __ addq(r11, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
| 2956 __ call(r11); | 2962 __ call(r11); |
| 2957 | 2963 |
| 2958 __ LeaveApiExitFrame(); | 2964 __ LeaveApiExitFrame(); |
| 2959 | 2965 |
| 2960 // Check the result. | 2966 // Check the result. |
| 2961 Label success; | 2967 Label success; |
| 2962 Label exception; | 2968 Label exception; |
| 2963 __ cmpl(rax, Immediate(NativeRegExpMacroAssembler::SUCCESS)); | 2969 __ cmpl(rax, Immediate(NativeRegExpMacroAssembler::SUCCESS)); |
| 2970 // We do not expect multiple results. |
| 2964 __ j(equal, &success, Label::kNear); | 2971 __ j(equal, &success, Label::kNear); |
| 2965 __ cmpl(rax, Immediate(NativeRegExpMacroAssembler::EXCEPTION)); | 2972 __ cmpl(rax, Immediate(NativeRegExpMacroAssembler::EXCEPTION)); |
| 2966 __ j(equal, &exception); | 2973 __ j(equal, &exception); |
| 2967 __ cmpl(rax, Immediate(NativeRegExpMacroAssembler::FAILURE)); | 2974 __ cmpl(rax, Immediate(NativeRegExpMacroAssembler::FAILURE)); |
| 2968 // If none of the above, it can only be retry. | 2975 // If none of the above, it can only be retry. |
| 2969 // Handle that in the runtime system. | 2976 // Handle that in the runtime system. |
| 2970 __ j(not_equal, &runtime); | 2977 __ j(not_equal, &runtime); |
| 2971 | 2978 |
| 2972 // For failure return null. | 2979 // For failure return null. |
| 2973 __ LoadRoot(rax, Heap::kNullValueRootIndex); | 2980 __ LoadRoot(rax, Heap::kNullValueRootIndex); |
| (...skipping 3352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6326 xmm0, | 6333 xmm0, |
| 6327 &slow_elements); | 6334 &slow_elements); |
| 6328 __ ret(0); | 6335 __ ret(0); |
| 6329 } | 6336 } |
| 6330 | 6337 |
| 6331 #undef __ | 6338 #undef __ |
| 6332 | 6339 |
| 6333 } } // namespace v8::internal | 6340 } } // namespace v8::internal |
| 6334 | 6341 |
| 6335 #endif // V8_TARGET_ARCH_X64 | 6342 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |