| 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; | 
|  |