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