| Index: src/x64/regexp-macro-assembler-x64.cc | 
| =================================================================== | 
| --- src/x64/regexp-macro-assembler-x64.cc	(revision 3701) | 
| +++ src/x64/regexp-macro-assembler-x64.cc	(working copy) | 
| @@ -71,8 +71,6 @@ | 
| *                            through the runtime system) | 
| *    - stack_area_base      (High end of the memory area to use as | 
| *                            backtracking stack) | 
| - *    - at_start             (if 1, we are starting at the start of the | 
| - *                            string, otherwise 0) | 
| *    - int* capture_array   (int[num_saved_registers_], for output). | 
| *    - end of input         (Address of end of string) | 
| *    - start of input       (Address of first character in string) | 
| @@ -82,6 +80,8 @@ | 
| *    - backup of callee save registers (rbx, possibly rsi and rdi). | 
| *    - Offset of location before start of input (effectively character | 
| *      position -1). Used to initialize capture registers to a non-position. | 
| + *    - At start of string (if 1, we are starting at the start of the | 
| + *      string, otherwise 0) | 
| *    - register 0  rbp[-n]   (Only positions must be stored in the first | 
| *    - register 1  rbp[-n-8]  num_saved_registers_ registers) | 
| *    - ... | 
| @@ -661,7 +661,7 @@ | 
| ASSERT_EQ(kInputStart, -3 * kPointerSize); | 
| ASSERT_EQ(kInputEnd, -4 * kPointerSize); | 
| ASSERT_EQ(kRegisterOutput, -5 * kPointerSize); | 
| -  ASSERT_EQ(kAtStart, -6 * kPointerSize); | 
| +  ASSERT_EQ(kStackHighEnd, -6 * kPointerSize); | 
| __ push(rdi); | 
| __ push(rsi); | 
| __ push(rdx); | 
| @@ -672,6 +672,7 @@ | 
| __ push(rbx);  // Callee-save | 
| #endif | 
| __ push(Immediate(0));  // Make room for "input start - 1" constant. | 
| +  __ push(Immediate(0));  // Make room for "at start" constant. | 
|  | 
| // Check if we have space on the stack for registers. | 
| Label stack_limit_hit; | 
| @@ -716,6 +717,15 @@ | 
| // Store this value in a local variable, for use when clearing | 
| // position registers. | 
| __ movq(Operand(rbp, kInputStartMinusOne), rax); | 
| + | 
| +  // Determine whether the start index is zero, that is at the start of the | 
| +  // string, and store that value in a local variable. | 
| +  __ movq(rbx, Operand(rbp, kStartIndex)); | 
| +  __ xor_(rcx, rcx);  // setcc only operates on cl (lower byte of rcx). | 
| +  __ testq(rbx, rbx); | 
| +  __ setcc(zero, rcx);  // 1 if 0 (start of string), 0 if positive. | 
| +  __ movq(Operand(rbp, kAtStart), rcx); | 
| + | 
| if (num_saved_registers_ > 0) { | 
| // Fill saved registers with initial value = start offset - 1 | 
| // Fill in stack push order, to avoid accessing across an unwritten | 
|  |