Index: src/arm/regexp-macro-assembler-arm.cc |
diff --git a/src/arm/regexp-macro-assembler-arm.cc b/src/arm/regexp-macro-assembler-arm.cc |
index f621be47be2042e92bae539cf195c53ad4f7b21d..78f417c0d6a294bf91211c808503e93cb40a0381 100644 |
--- a/src/arm/regexp-macro-assembler-arm.cc |
+++ b/src/arm/regexp-macro-assembler-arm.cc |
@@ -650,14 +650,15 @@ Handle<Object> RegExpMacroAssemblerARM::GetCode(Handle<String> source) { |
__ sub(current_input_offset(), r0, end_of_input_address()); |
// Set r0 to address of char before start of input |
Erik Corry
2010/03/19 11:04:11
start of input -> match start position.
Lasse Reichstein
2010/03/19 11:25:42
Actually "start of the input string". This is the
|
// (effectively string position -1). |
+ __ ldr(r1, MemOperand(frame_pointer(), kStartIndex)); |
__ sub(r0, current_input_offset(), Operand(char_size())); |
+ __ sub(r0, r0, Operand(r1, LSL, (mode_ == UC16) ? 1 : 0)); |
// Store this value in a local variable, for use when clearing |
// position registers. |
__ str(r0, MemOperand(frame_pointer(), kInputStartMinusOne)); |
// Determine whether the start index is zero, that is at the start of the |
// string, and store that value in a local variable. |
- __ ldr(r1, MemOperand(frame_pointer(), kStartIndex)); |
__ tst(r1, Operand(r1)); |
__ mov(r1, Operand(1), LeaveCC, eq); |
__ mov(r1, Operand(0), LeaveCC, ne); |
@@ -700,12 +701,15 @@ Handle<Object> RegExpMacroAssemblerARM::GetCode(Handle<String> source) { |
// copy captures to output |
__ ldr(r1, MemOperand(frame_pointer(), kInputStart)); |
__ ldr(r0, MemOperand(frame_pointer(), kRegisterOutput)); |
+ __ ldr(r2, MemOperand(frame_pointer(), kStartIndex)); |
__ sub(r1, end_of_input_address(), r1); |
// r1 is length of input in bytes. |
if (mode_ == UC16) { |
__ mov(r1, Operand(r1, LSR, 1)); |
} |
// r1 is length of input in characters. |
+ __ add(r1, r1, Operand(r2)); |
+ // r1 is length of string in characters. |
ASSERT_EQ(0, num_saved_registers_ % 2); |
// Always an even number of capture registers. This allows us to |