| Index: src/regexp/x64/regexp-macro-assembler-x64.cc
|
| diff --git a/src/regexp/x64/regexp-macro-assembler-x64.cc b/src/regexp/x64/regexp-macro-assembler-x64.cc
|
| index 286f159cc8e5ac4d04416e6a2f32c7aec735aa06..549ddae05e9580062f7c93ebd5542623164886c2 100644
|
| --- a/src/regexp/x64/regexp-macro-assembler-x64.cc
|
| +++ b/src/regexp/x64/regexp-macro-assembler-x64.cc
|
| @@ -203,7 +203,7 @@ void RegExpMacroAssemblerX64::CheckGreedyLoop(Label* on_equal) {
|
|
|
|
|
| void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase(
|
| - int start_reg, bool read_backward, Label* on_no_match) {
|
| + int start_reg, bool read_backward, bool unicode, Label* on_no_match) {
|
| Label fallthrough;
|
| ReadPositionFromRegister(rdx, start_reg); // Offset of start of capture
|
| ReadPositionFromRegister(rbx, start_reg + 1); // Offset of end of capture
|
| @@ -308,8 +308,10 @@ void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase(
|
| // Address byte_offset1 - Address captured substring's start.
|
| // Address byte_offset2 - Address of current character position.
|
| // size_t byte_length - length of capture in bytes(!)
|
| - // Isolate* isolate
|
| +// Isolate* isolate or 0 if unicode flag.
|
| #ifdef _WIN64
|
| + DCHECK(rcx.is(arg_reg_1));
|
| + DCHECK(rdx.is(arg_reg_2));
|
| // Compute and set byte_offset1 (start of capture).
|
| __ leap(rcx, Operand(rsi, rdx, times_1, 0));
|
| // Set byte_offset2.
|
| @@ -317,11 +319,9 @@ void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase(
|
| if (read_backward) {
|
| __ subq(rdx, rbx);
|
| }
|
| - // Set byte_length.
|
| - __ movp(r8, rbx);
|
| - // Isolate.
|
| - __ LoadAddress(r9, ExternalReference::isolate_address(isolate()));
|
| #else // AMD64 calling convention
|
| + DCHECK(rdi.is(arg_reg_1));
|
| + DCHECK(rsi.is(arg_reg_2));
|
| // Compute byte_offset2 (current position = rsi+rdi).
|
| __ leap(rax, Operand(rsi, rdi, times_1, 0));
|
| // Compute and set byte_offset1 (start of capture).
|
| @@ -331,11 +331,19 @@ void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase(
|
| if (read_backward) {
|
| __ subq(rsi, rbx);
|
| }
|
| +#endif // _WIN64
|
| +
|
| // Set byte_length.
|
| - __ movp(rdx, rbx);
|
| + __ movp(arg_reg_3, rbx);
|
| // Isolate.
|
| - __ LoadAddress(rcx, ExternalReference::isolate_address(isolate()));
|
| -#endif
|
| +#ifdef V8_I18N_SUPPORT
|
| + if (unicode) {
|
| + __ movp(arg_reg_4, Immediate(0));
|
| + } else // NOLINT
|
| +#endif // V8_I18N_SUPPORT
|
| + {
|
| + __ LoadAddress(arg_reg_4, ExternalReference::isolate_address(isolate()));
|
| + }
|
|
|
| { // NOLINT: Can't find a way to open this scope without confusing the
|
| // linter.
|
|
|