Index: src/x64/code-stubs-x64.cc |
=================================================================== |
--- src/x64/code-stubs-x64.cc (revision 7009) |
+++ src/x64/code-stubs-x64.cc (working copy) |
@@ -4833,6 +4833,61 @@ |
__ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
} |
+ |
+void StringCharAtStub::Generate(MacroAssembler* masm) { |
+ // Expects two arguments (object, index) on the stack: |
+ |
+ // Stack frame on entry. |
+ // rsp[0]: return address |
+ // rsp[8]: index |
+ // rsp[16]: object |
+ |
+ Register object = rbx; |
+ Register index = rax; |
+ Register scratch1 = rcx; |
+ Register scratch2 = rdx; |
+ Register result = rax; |
+ |
+ __ pop(scratch1); // Return address. |
+ __ pop(index); |
+ __ pop(object); |
+ __ push(scratch1); |
+ |
+ Label need_conversion; |
+ Label index_out_of_range; |
+ Label done; |
+ StringCharAtGenerator generator(object, |
+ index, |
+ scratch1, |
+ scratch2, |
+ result, |
+ &need_conversion, |
+ &need_conversion, |
+ &index_out_of_range, |
+ STRING_INDEX_IS_NUMBER); |
+ generator.GenerateFast(masm); |
+ __ jmp(&done); |
+ |
+ __ bind(&index_out_of_range); |
+ // When the index is out of range, the spec requires us to return |
+ // the empty string. |
+ __ Move(result, Factory::empty_string()); |
+ __ jmp(&done); |
+ |
+ __ bind(&need_conversion); |
+ // Move smi zero into the result register, which will trigger |
+ // conversion. |
+ __ Move(result, Smi::FromInt(0)); |
+ __ jmp(&done); |
+ |
+ StubRuntimeCallHelper call_helper; |
+ generator.GenerateSlow(masm, call_helper); |
+ |
+ __ bind(&done); |
+ __ ret(0); |
+} |
+ |
+ |
void ICCompareStub::GenerateSmis(MacroAssembler* masm) { |
ASSERT(state_ == CompareIC::SMIS); |
NearLabel miss; |