X64: Implement StringCharAtStub which is used from lithium codegen.

This fixes issue 1116 and enables the stub in lithium codegen.

Review URL: http://codereview.chromium.org/6588113

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7013 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
ricow@chromium.org 2011-03-02 09:28:04 +00:00
parent 9c161bcf21
commit 617ccc1d93
2 changed files with 57 additions and 2 deletions

View File

@ -4833,6 +4833,61 @@ void StringCompareStub::Generate(MacroAssembler* masm) {
__ TailCallRuntime(Runtime::kStringCompare, 2, 1); __ 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) { void ICCompareStub::GenerateSmis(MacroAssembler* masm) {
ASSERT(state_ == CompareIC::SMIS); ASSERT(state_ == CompareIC::SMIS);
NearLabel miss; NearLabel miss;

View File

@ -705,8 +705,8 @@ void LCodeGen::DoCallStub(LCallStub* instr) {
break; break;
} }
case CodeStub::StringCharAt: { case CodeStub::StringCharAt: {
// TODO(1116): Add StringCharAt stub to x64. StringCharAtStub stub;
Abort("Unimplemented: %s", "StringCharAt Stub"); CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
break; break;
} }
case CodeStub::MathPow: { case CodeStub::MathPow: {