Chromium Code Reviews| Index: src/ia32/code-stubs-ia32.cc |
| diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
| index 432c10c9ece7bd45e4b4128f5d3355cc8db73cf7..92642a71c141556438ca8bd5d45840ae654d9123 100644 |
| --- a/src/ia32/code-stubs-ia32.cc |
| +++ b/src/ia32/code-stubs-ia32.cc |
| @@ -5108,11 +5108,10 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
| __ JumpIfNotSmi(index_, &index_not_smi_); |
| // Put smi-tagged index into scratch register. |
|
Lasse Reichstein
2011/11/09 12:48:11
Remove the comment too.
|
| - __ mov(scratch_, index_); |
| __ bind(&got_smi_index_); |
| // Check for index out of range. |
| - __ cmp(scratch_, FieldOperand(object_, String::kLengthOffset)); |
| + __ cmp(index_, FieldOperand(object_, String::kLengthOffset)); |
| __ j(above_equal, index_out_of_range_); |
| // We need special handling for non-flat strings. |
| @@ -5137,25 +5136,25 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
| __ cmp(FieldOperand(object_, ConsString::kSecondOffset), |
| Immediate(masm->isolate()->factory()->empty_string())); |
| __ j(not_equal, &call_runtime_); |
| - // Get the first of the two strings and load its instance type. |
| - __ mov(result_, FieldOperand(object_, ConsString::kFirstOffset)); |
| + // Get the first of the two parts. |
| + __ mov(object_, FieldOperand(object_, ConsString::kFirstOffset)); |
| __ jmp(&assure_seq_string, Label::kNear); |
| // SlicedString, unpack and add offset. |
| __ bind(&sliced_string); |
| - __ add(scratch_, FieldOperand(object_, SlicedString::kOffsetOffset)); |
| - __ mov(result_, FieldOperand(object_, SlicedString::kParentOffset)); |
| + __ add(index_, FieldOperand(object_, SlicedString::kOffsetOffset)); |
| + __ mov(object_, FieldOperand(object_, SlicedString::kParentOffset)); |
| // Assure that we are dealing with a sequential string. Go to runtime if not. |
| + // Note that if the original string is a cons or slice with an external |
| + // string as underlying string, we pass that unpacked underlying string with |
| + // the updated index to the runtime function. |
| __ bind(&assure_seq_string); |
| - __ mov(result_, FieldOperand(result_, HeapObject::kMapOffset)); |
| + __ mov(result_, FieldOperand(object_, HeapObject::kMapOffset)); |
| __ movzx_b(result_, FieldOperand(result_, Map::kInstanceTypeOffset)); |
| STATIC_ASSERT(kSeqStringTag == 0); |
| __ test(result_, Immediate(kStringRepresentationMask)); |
| __ j(not_zero, &call_runtime_); |
| - // Actually fetch the parent string if it is confirmed to be sequential. |
| - STATIC_ASSERT(SlicedString::kParentOffset == ConsString::kFirstOffset); |
| - __ mov(object_, FieldOperand(object_, SlicedString::kParentOffset)); |
| // Check for 1-byte or 2-byte string. |
| __ bind(&flat_string); |
| @@ -5168,16 +5167,16 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
| // Load the 2-byte character code into the result register. |
| STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize == 1); |
| __ movzx_w(result_, FieldOperand(object_, |
| - scratch_, times_1, // Scratch is smi-tagged. |
| + index_, times_1, // Scratch is smi-tagged. |
| SeqTwoByteString::kHeaderSize)); |
| __ jmp(&got_char_code, Label::kNear); |
| // ASCII string. |
| // Load the byte into the result register. |
| __ bind(&ascii_string); |
| - __ SmiUntag(scratch_); |
| + __ SmiUntag(index_); |
| __ movzx_b(result_, FieldOperand(object_, |
| - scratch_, times_1, |
| + index_, times_1, |
| SeqAsciiString::kHeaderSize)); |
| __ bind(&got_char_code); |
| __ SmiTag(result_); |
| @@ -5199,7 +5198,6 @@ void StringCharCodeAtGenerator::GenerateSlow( |
| DONT_DO_SMI_CHECK); |
| call_helper.BeforeCall(masm); |
| __ push(object_); |
| - __ push(index_); |
| __ push(index_); // Consumed by runtime conversion function. |
| if (index_flags_ == STRING_INDEX_IS_NUMBER) { |
| __ CallRuntime(Runtime::kNumberToIntegerMapMinusZero, 1); |
| @@ -5208,12 +5206,11 @@ void StringCharCodeAtGenerator::GenerateSlow( |
| // NumberToSmi discards numbers that are not exact integers. |
| __ CallRuntime(Runtime::kNumberToSmi, 1); |
| } |
| - if (!scratch_.is(eax)) { |
| + if (!index_.is(eax)) { |
| // Save the conversion result before the pop instructions below |
| // have a chance to overwrite it. |
| - __ mov(scratch_, eax); |
| + __ mov(index_, eax); |
| } |
| - __ pop(index_); |
| __ pop(object_); |
| // Reload the instance type. |
| __ mov(result_, FieldOperand(object_, HeapObject::kMapOffset)); |
| @@ -5221,7 +5218,7 @@ void StringCharCodeAtGenerator::GenerateSlow( |
| call_helper.AfterCall(masm); |
| // If index is still not a smi, it must be out of range. |
| STATIC_ASSERT(kSmiTag == 0); |
| - __ JumpIfNotSmi(scratch_, index_out_of_range_); |
| + __ JumpIfNotSmi(index_, index_out_of_range_); |
| // Otherwise, return to the fast path. |
| __ jmp(&got_smi_index_); |