Index: src/ia32/regexp-macro-assembler-ia32.cc |
diff --git a/src/ia32/regexp-macro-assembler-ia32.cc b/src/ia32/regexp-macro-assembler-ia32.cc |
index 74b9d129cc6643c5a3a9801c8eda3c53bd7785e1..c6accbda99bb14d0207ae84b167183dee9a44d88 100644 |
--- a/src/ia32/regexp-macro-assembler-ia32.cc |
+++ b/src/ia32/regexp-macro-assembler-ia32.cc |
@@ -653,6 +653,8 @@ Handle<Object> RegExpMacroAssemblerIA32::GetCode(Handle<String> source) { |
__ j(not_zero, &exit_label_); |
__ bind(&stack_ok); |
+ // Load start index for later use. |
+ __ mov(ebx, Operand(ebp, kStartIndex)); |
// Allocate space on stack for registers. |
__ sub(Operand(esp), Immediate(num_registers_ * kPointerSize)); |
@@ -662,17 +664,23 @@ Handle<Object> RegExpMacroAssemblerIA32::GetCode(Handle<String> source) { |
__ mov(edi, Operand(ebp, kInputStart)); |
// Set up edi to be negative offset from string end. |
__ sub(edi, Operand(esi)); |
- // Set eax to address of char before start of input |
+ |
+ // Set eax to address of char before start of the string. |
// (effectively string position -1). |
- __ lea(eax, Operand(edi, -char_size())); |
+ __ neg(ebx); |
+ if (mode_ == UC16) { |
+ __ lea(eax, Operand(edi, ebx, times_2, -char_size())); |
+ } else { |
+ __ lea(eax, Operand(edi, ebx, times_1, -char_size())); |
+ } |
// Store this value in a local variable, for use when clearing |
// position registers. |
__ mov(Operand(ebp, kInputStartMinusOne), eax); |
// Determine whether the start index is zero, that is at the start of the |
// string, and store that value in a local variable. |
- __ mov(ebx, Operand(ebp, kStartIndex)); |
__ xor_(Operand(ecx), ecx); // setcc only operates on cl (lower byte of ecx). |
+ // Register ebx still holds -stringIndex. |
__ test(ebx, Operand(ebx)); |
__ setcc(zero, ecx); // 1 if 0 (start of string), 0 if positive. |
__ mov(Operand(ebp, kAtStart), ecx); |
@@ -721,10 +729,17 @@ Handle<Object> RegExpMacroAssemblerIA32::GetCode(Handle<String> source) { |
// copy captures to output |
__ mov(ebx, Operand(ebp, kRegisterOutput)); |
__ mov(ecx, Operand(ebp, kInputEnd)); |
+ __ mov(edx, Operand(ebp, kStartIndex)); |
__ sub(ecx, Operand(ebp, kInputStart)); |
+ if (mode_ == UC16) { |
+ __ lea(ecx, Operand(ecx, edx, times_2, 0)); |
+ } else { |
+ __ add(ecx, Operand(edx)); |
+ } |
for (int i = 0; i < num_saved_registers_; i++) { |
__ mov(eax, register_location(i)); |
- __ add(eax, Operand(ecx)); // Convert to index from start, not end. |
+ // Convert to index from start of string, not end. |
+ __ add(eax, Operand(ecx)); |
if (mode_ == UC16) { |
__ sar(eax, 1); // Convert byte index to character index. |
} |