| Index: src/x64/regexp-macro-assembler-x64.cc
|
| ===================================================================
|
| --- src/x64/regexp-macro-assembler-x64.cc (revision 15486)
|
| +++ src/x64/regexp-macro-assembler-x64.cc (working copy)
|
| @@ -115,6 +115,7 @@
|
| */
|
|
|
| #define __ ACCESS_MASM((&masm_))
|
| +#define __k __
|
|
|
| RegExpMacroAssemblerX64::RegExpMacroAssemblerX64(
|
| Mode mode,
|
| @@ -157,7 +158,7 @@
|
|
|
| void RegExpMacroAssemblerX64::AdvanceCurrentPosition(int by) {
|
| if (by != 0) {
|
| - __ addq(rdi, Immediate(by * char_size()));
|
| + __k addq(rdi, Immediate(by * char_size()));
|
| }
|
| }
|
|
|
| @@ -241,8 +242,14 @@
|
| int start_reg,
|
| Label* on_no_match) {
|
| Label fallthrough;
|
| +#ifndef V8_TARGET_ARCH_X32
|
| __ movq(rdx, register_location(start_reg)); // Offset of start of capture
|
| __ movq(rbx, register_location(start_reg + 1)); // Offset of end of capture
|
| +#else
|
| + __ movsxlq(rdx, register_location(start_reg)); // Offset of start of capture
|
| + // Offset of end of capture
|
| + __ movsxlq(rbx, register_location(start_reg + 1));
|
| +#endif
|
| __ subq(rbx, rdx); // Length of capture.
|
|
|
| // -----------------------
|
| @@ -316,16 +323,16 @@
|
|
|
| // Compute new value of character position after the matched part.
|
| __ movq(rdi, r11);
|
| - __ subq(rdi, rsi);
|
| + __k subq(rdi, rsi);
|
| } else {
|
| ASSERT(mode_ == UC16);
|
| // Save important/volatile registers before calling C function.
|
| #ifndef _WIN64
|
| // Caller save on Linux and callee save in Windows.
|
| - __ push(rsi);
|
| - __ push(rdi);
|
| + __k push(rsi);
|
| + __k push(rdi);
|
| #endif
|
| - __ push(backtrack_stackpointer());
|
| + __k push(backtrack_stackpointer());
|
|
|
| static const int num_arguments = 4;
|
| __ PrepareCallCFunction(num_arguments);
|
| @@ -367,10 +374,10 @@
|
|
|
| // Restore original values before reacting on result value.
|
| __ Move(code_object_pointer(), masm_.CodeObject());
|
| - __ pop(backtrack_stackpointer());
|
| + __k pop(backtrack_stackpointer());
|
| #ifndef _WIN64
|
| - __ pop(rdi);
|
| - __ pop(rsi);
|
| + __k pop(rdi);
|
| + __k pop(rsi);
|
| #endif
|
|
|
| // Check if function returned non-zero for success or zero for failure.
|
| @@ -378,7 +385,7 @@
|
| BranchOrBacktrack(zero, on_no_match);
|
| // On success, increment position by length of capture.
|
| // Requires that rbx is callee save (true for both Win64 and AMD64 ABIs).
|
| - __ addq(rdi, rbx);
|
| + __k addq(rdi, rbx);
|
| }
|
| __ bind(&fallthrough);
|
| }
|
| @@ -390,8 +397,13 @@
|
| Label fallthrough;
|
|
|
| // Find length of back-referenced capture.
|
| +#ifndef V8_TARGET_ARCH_X32
|
| __ movq(rdx, register_location(start_reg));
|
| __ movq(rax, register_location(start_reg + 1));
|
| +#else
|
| + __ movsxlq(rdx, register_location(start_reg));
|
| + __ movsxlq(rax, register_location(start_reg + 1));
|
| +#endif
|
| __ subq(rax, rdx); // Length to check.
|
|
|
| // Fail on partial or illegal capture (start of capture after end of capture).
|
| @@ -442,7 +454,7 @@
|
| // Success.
|
| // Set current character position to position after match.
|
| __ movq(rdi, rbx);
|
| - __ subq(rdi, rsi);
|
| + __k subq(rdi, rsi);
|
|
|
| __ bind(&fallthrough);
|
| }
|
| @@ -681,31 +693,40 @@
|
| #ifdef _WIN64
|
| // MSVC passes arguments in rcx, rdx, r8, r9, with backing stack slots.
|
| // Store register parameters in pre-allocated stack slots,
|
| - __ movq(Operand(rbp, kInputString), rcx);
|
| - __ movq(Operand(rbp, kStartIndex), rdx); // Passed as int32 in edx.
|
| - __ movq(Operand(rbp, kInputStart), r8);
|
| - __ movq(Operand(rbp, kInputEnd), r9);
|
| + __k movq(Operand(rbp, kInputString), rcx);
|
| + __k movq(Operand(rbp, kStartIndex), rdx); // Passed as int32 in edx.
|
| + __k movq(Operand(rbp, kInputStart), r8);
|
| + __k movq(Operand(rbp, kInputEnd), r9);
|
| // Callee-save on Win64.
|
| - __ push(rsi);
|
| - __ push(rdi);
|
| - __ push(rbx);
|
| + __k push(rsi);
|
| + __k push(rdi);
|
| + __k push(rbx);
|
| #else
|
| // GCC passes arguments in rdi, rsi, rdx, rcx, r8, r9 (and then on stack).
|
| // Push register parameters on stack for reference.
|
| +#ifndef V8_TARGET_ARCH_X32
|
| ASSERT_EQ(kInputString, -1 * kPointerSize);
|
| ASSERT_EQ(kStartIndex, -2 * kPointerSize);
|
| ASSERT_EQ(kInputStart, -3 * kPointerSize);
|
| ASSERT_EQ(kInputEnd, -4 * kPointerSize);
|
| ASSERT_EQ(kRegisterOutput, -5 * kPointerSize);
|
| ASSERT_EQ(kNumOutputRegisters, -6 * kPointerSize);
|
| - __ push(rdi);
|
| - __ push(rsi);
|
| - __ push(rdx);
|
| - __ push(rcx);
|
| - __ push(r8);
|
| - __ push(r9);
|
| +#else
|
| + ASSERT_EQ(kInputString, -1 * kHWRegSize);
|
| + ASSERT_EQ(kStartIndex, -2 * kHWRegSize);
|
| + ASSERT_EQ(kInputStart, -3 * kHWRegSize);
|
| + ASSERT_EQ(kInputEnd, -4 * kHWRegSize);
|
| + ASSERT_EQ(kRegisterOutput, -5 * kHWRegSize);
|
| + ASSERT_EQ(kNumOutputRegisters, -6 * kHWRegSize);
|
| +#endif
|
| + __k push(rdi);
|
| + __k push(rsi);
|
| + __k push(rdx);
|
| + __k push(rcx);
|
| + __k push(r8);
|
| + __k push(r9);
|
|
|
| - __ push(rbx); // Callee-save
|
| + __k push(rbx); // Callee-save
|
| #endif
|
|
|
| __ push(Immediate(0)); // Number of successful matches in a global regexp.
|
| @@ -747,11 +768,11 @@
|
| // Load input position.
|
| __ movq(rdi, Operand(rbp, kInputStart));
|
| // Set up rdi to be negative offset from string end.
|
| - __ subq(rdi, rsi);
|
| + __k subq(rdi, rsi);
|
| // Set rax to address of char before start of the string
|
| // (effectively string position -1).
|
| __ movq(rbx, Operand(rbp, kStartIndex));
|
| - __ neg(rbx);
|
| + __k neg(rbx);
|
| if (mode_ == UC16) {
|
| __ lea(rax, Operand(rdi, rbx, times_2, -char_size()));
|
| } else {
|
| @@ -799,8 +820,8 @@
|
| Label init_loop;
|
| __ bind(&init_loop);
|
| __ movq(Operand(rbp, rcx, times_1, 0), rax);
|
| - __ subq(rcx, Immediate(kPointerSize));
|
| - __ cmpq(rcx,
|
| + __k subq(rcx, Immediate(kPointerSize));
|
| + __k cmpq(rcx,
|
| Immediate(kRegisterZero - num_saved_registers_ * kPointerSize));
|
| __ j(greater, &init_loop);
|
| } else { // Unroll the loop.
|
| @@ -831,7 +852,11 @@
|
| __ addq(rcx, rdx);
|
| }
|
| for (int i = 0; i < num_saved_registers_; i++) {
|
| +#ifndef V8_TARGET_ARCH_X32
|
| __ movq(rax, register_location(i));
|
| +#else
|
| + __ movsxlq(rax, register_location(i));
|
| +#endif
|
| if (i == 0 && global_with_zero_length_check()) {
|
| // Keep capture start in rdx for the zero-length check later.
|
| __ movq(rdx, rax);
|
| @@ -875,9 +900,9 @@
|
| __ j(zero, &exit_label_, Label::kNear);
|
| // Advance current position after a zero-length match.
|
| if (mode_ == UC16) {
|
| - __ addq(rdi, Immediate(2));
|
| + __k addq(rdi, Immediate(2));
|
| } else {
|
| - __ incq(rdi);
|
| + __k incq(rdi);
|
| }
|
| }
|
|
|
| @@ -897,9 +922,9 @@
|
| #ifdef _WIN64
|
| // Restore callee save registers.
|
| __ lea(rsp, Operand(rbp, kLastCalleeSaveRegister));
|
| - __ pop(rbx);
|
| - __ pop(rdi);
|
| - __ pop(rsi);
|
| + __k pop(rbx);
|
| + __k pop(rdi);
|
| + __k pop(rsi);
|
| // Stack now at rbp.
|
| #else
|
| // Restore callee save register.
|
| @@ -923,8 +948,8 @@
|
| if (check_preempt_label_.is_linked()) {
|
| SafeCallTarget(&check_preempt_label_);
|
|
|
| - __ push(backtrack_stackpointer());
|
| - __ push(rdi);
|
| + __k push(backtrack_stackpointer());
|
| + __k push(rdi);
|
|
|
| CallCheckStackGuardState();
|
| __ testq(rax, rax);
|
| @@ -934,8 +959,8 @@
|
|
|
| // Restore registers.
|
| __ Move(code_object_pointer(), masm_.CodeObject());
|
| - __ pop(rdi);
|
| - __ pop(backtrack_stackpointer());
|
| + __k pop(rdi);
|
| + __k pop(backtrack_stackpointer());
|
| // String might have moved: Reload esi from frame.
|
| __ movq(rsi, Operand(rbp, kInputEnd));
|
| SafeReturn();
|
| @@ -950,8 +975,8 @@
|
| // Save registers before calling C function
|
| #ifndef _WIN64
|
| // Callee-save in Microsoft 64-bit ABI, but not in AMD64 ABI.
|
| - __ push(rsi);
|
| - __ push(rdi);
|
| + __k push(rsi);
|
| + __k push(rdi);
|
| #endif
|
|
|
| // Call GrowStack(backtrack_stackpointer())
|
| @@ -980,8 +1005,8 @@
|
| // Restore saved registers and continue.
|
| __ Move(code_object_pointer(), masm_.CodeObject());
|
| #ifndef _WIN64
|
| - __ pop(rdi);
|
| - __ pop(rsi);
|
| + __k pop(rdi);
|
| + __k pop(rsi);
|
| #endif
|
| SafeReturn();
|
| }
|
| @@ -1085,13 +1110,22 @@
|
|
|
|
|
| void RegExpMacroAssemblerX64::ReadCurrentPositionFromRegister(int reg) {
|
| +#ifndef V8_TARGET_ARCH_X32
|
| __ movq(rdi, register_location(reg));
|
| +#else
|
| + __ movsxlq(rdi, register_location(reg));
|
| +#endif
|
| }
|
|
|
|
|
| void RegExpMacroAssemblerX64::ReadStackPointerFromRegister(int reg) {
|
| +#ifndef V8_TARGET_ARCH_X32
|
| __ movq(backtrack_stackpointer(), register_location(reg));
|
| __ addq(backtrack_stackpointer(), Operand(rbp, kStackHighEnd));
|
| +#else
|
| + __ movsxlq(backtrack_stackpointer(), register_location(reg));
|
| + __ addl(backtrack_stackpointer(), Operand(rbp, kStackHighEnd));
|
| +#endif
|
| }
|
|
|
|
|
| @@ -1099,7 +1133,7 @@
|
| Label after_position;
|
| __ cmpq(rdi, Immediate(-by * char_size()));
|
| __ j(greater_equal, &after_position, Label::kNear);
|
| - __ movq(rdi, Immediate(-by * char_size()));
|
| + __k movq(rdi, Immediate(-by * char_size()));
|
| // On RegExp code entry (where this operation is used), the character before
|
| // the current position is expected to be already loaded.
|
| // We have advanced the position, so it's safe to read backwards.
|
| @@ -1169,8 +1203,12 @@
|
| __ movq(rsi, code_object_pointer());
|
| // First argument: Next address on the stack (will be address of
|
| // return address).
|
| +#ifndef V8_TARGET_ARCH_X32
|
| __ lea(rdi, Operand(rsp, -kPointerSize));
|
| +#else
|
| + __ leal(rdi, Operand(rsp, -kHWRegSize));
|
| #endif
|
| +#endif
|
| ExternalReference stack_check =
|
| ExternalReference::re_check_stack_guard_state(isolate());
|
| __ CallCFunction(stack_check, num_arguments);
|
| @@ -1376,7 +1414,7 @@
|
|
|
| void RegExpMacroAssemblerX64::Pop(Register target) {
|
| ASSERT(!target.is(backtrack_stackpointer()));
|
| - __ movsxlq(target, Operand(backtrack_stackpointer(), 0));
|
| + __k movsxlq(target, Operand(backtrack_stackpointer(), 0));
|
| // Notice: This updates flags, unlike normal Pop.
|
| __ addq(backtrack_stackpointer(), Immediate(kIntSize));
|
| }
|
| @@ -1440,6 +1478,7 @@
|
| }
|
| }
|
|
|
| +#undef __k
|
| #undef __
|
|
|
| #endif // V8_INTERPRETED_REGEXP
|
|
|