Chromium Code Reviews| Index: src/ia32/lithium-codegen-ia32.cc |
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
| index 7f78d03da0db85dcb3ece1c63ba77e38791d418a..dbcaf66d0143ff59ae9fca9277d618dbf6574129 100644 |
| --- a/src/ia32/lithium-codegen-ia32.cc |
| +++ b/src/ia32/lithium-codegen-ia32.cc |
| @@ -3371,85 +3371,15 @@ void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { |
| LStringCharCodeAt* instr_; |
| }; |
| - Register string = ToRegister(instr->string()); |
| - Register index = ToRegister(instr->index()); |
| - Register result = ToRegister(instr->result()); |
| - |
| DeferredStringCharCodeAt* deferred = |
| new DeferredStringCharCodeAt(this, instr); |
| - // Fetch the instance type of the receiver into result register. |
| - __ mov(result, FieldOperand(string, HeapObject::kMapOffset)); |
| - __ movzx_b(result, FieldOperand(result, Map::kInstanceTypeOffset)); |
| - |
| - // We need special handling for indirect strings. |
| - Label check_sequential; |
| - __ test(result, Immediate(kIsIndirectStringMask)); |
| - __ j(zero, &check_sequential, Label::kNear); |
| - |
| - // Dispatch on the indirect string shape: slice or cons. |
| - Label cons_string; |
| - __ test(result, Immediate(kSlicedNotConsMask)); |
| - __ j(zero, &cons_string, Label::kNear); |
| - |
| - // Handle slices. |
| - Label indirect_string_loaded; |
| - __ mov(result, FieldOperand(string, SlicedString::kOffsetOffset)); |
| - __ SmiUntag(result); |
| - __ add(index, Operand(result)); |
| - __ mov(string, FieldOperand(string, SlicedString::kParentOffset)); |
| - __ jmp(&indirect_string_loaded, Label::kNear); |
| - |
| - // Handle conses. |
| - // Check whether the right hand side is the empty string (i.e. if |
| - // this is really a flat string in a cons string). If that is not |
| - // the case we would rather go to the runtime system now to flatten |
| - // the string. |
| - __ bind(&cons_string); |
| - __ cmp(FieldOperand(string, ConsString::kSecondOffset), |
| - Immediate(factory()->empty_string())); |
| - __ j(not_equal, deferred->entry()); |
| - __ mov(string, FieldOperand(string, ConsString::kFirstOffset)); |
| - |
| - __ bind(&indirect_string_loaded); |
| - __ mov(result, FieldOperand(string, HeapObject::kMapOffset)); |
| - __ movzx_b(result, FieldOperand(result, Map::kInstanceTypeOffset)); |
| - |
| - // Check whether the string is sequential. The only non-sequential |
| - // shapes we support have just been unwrapped above. |
| - // 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 adjusted index to the runtime function. |
| - __ bind(&check_sequential); |
| - STATIC_ASSERT(kSeqStringTag == 0); |
| - __ test(result, Immediate(kStringRepresentationMask)); |
| - __ j(not_zero, deferred->entry()); |
| - |
| - // Dispatch on the encoding: ASCII or two-byte. |
| - Label ascii_string; |
| - STATIC_ASSERT((kStringEncodingMask & kAsciiStringTag) != 0); |
| - STATIC_ASSERT((kStringEncodingMask & kTwoByteStringTag) == 0); |
| - __ test(result, Immediate(kStringEncodingMask)); |
| - __ j(not_zero, &ascii_string, Label::kNear); |
| - |
| - // Two-byte string. |
| - // Load the two-byte character code into the result register. |
| - Label done; |
| - STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize == 1); |
| - __ movzx_w(result, FieldOperand(string, |
| - index, |
| - times_2, |
| - SeqTwoByteString::kHeaderSize)); |
| - __ jmp(&done, Label::kNear); |
| - |
| - // ASCII string. |
| - // Load the byte into the result register. |
| - __ bind(&ascii_string); |
| - __ movzx_b(result, FieldOperand(string, |
| - index, |
| - times_1, |
| - SeqAsciiString::kHeaderSize)); |
| - __ bind(&done); |
| + StringCharCodeAtGenerator::GenerateCharLoad(masm(), |
|
Lasse Reichstein
2011/11/17 13:40:18
If GenerateCharLoad is used from outside StringCha
Yang
2011/11/17 17:06:23
Moved to codegen-*.cc instead. Big chunks of code
|
| + factory(), |
| + ToRegister(instr->string()), |
| + ToRegister(instr->index()), |
| + ToRegister(instr->result()), |
| + deferred->entry()); |
| __ bind(deferred->exit()); |
| } |