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:
parent
9c161bcf21
commit
617ccc1d93
@ -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;
|
||||||
|
@ -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: {
|
||||||
|
Loading…
Reference in New Issue
Block a user