Fix inlining of instanceof stub for ARM (r6093).

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6117 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent c9928c05
...@@ -2894,45 +2894,45 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { ...@@ -2894,45 +2894,45 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
// Uses registers r0 to r4. Expected input is // Uses registers r0 to r4. Expected input is
// function in r0 (or at sp+1*ptrsz) and object in // object in r0 (or at sp+1*kPointerSize) and function in
// r1 (or at sp), depending on whether or not // r1 (or at sp), depending on whether or not
// args_in_registers() is true. // args_in_registers() is true.
void InstanceofStub::Generate(MacroAssembler* masm) { void InstanceofStub::Generate(MacroAssembler* masm) {
// Fixed register usage throughout the stub: // Fixed register usage throughout the stub:
const Register object = r1; // Object (lhs). const Register object = r0; // Object (lhs).
const Register map = r3; // Map of the object. const Register map = r3; // Map of the object.
const Register function = r0; // Function (rhs). const Register function = r1; // Function (rhs).
const Register prototype = r4; // Prototype of the function. const Register prototype = r4; // Prototype of the function.
const Register scratch = r2; const Register scratch = r2;
Label slow, loop, is_instance, is_not_instance, not_js_object; Label slow, loop, is_instance, is_not_instance, not_js_object;
if (!args_in_registers()) { if (!args_in_registers()) {
__ ldr(function, MemOperand(sp, 1 * kPointerSize)); __ ldr(object, MemOperand(sp, 1 * kPointerSize));
__ ldr(object, MemOperand(sp, 0)); __ ldr(function, MemOperand(sp, 0));
} }
// Check that the left hand is a JS object and load map. // Check that the left hand is a JS object and load map.
__ BranchOnSmi(object, &slow); __ BranchOnSmi(object, &not_js_object);
__ IsObjectJSObjectType(object, map, scratch, &slow); __ IsObjectJSObjectType(object, map, scratch, &not_js_object);
// Look up the function and the map in the instanceof cache. // Look up the function and the map in the instanceof cache.
Label miss; Label miss;
__ LoadRoot(ip, Heap::kInstanceofCacheFunctionRootIndex); __ LoadRoot(ip, Heap::kInstanceofCacheFunctionRootIndex);
__ cmp(object, ip); __ cmp(function, ip);
__ b(ne, &miss); __ b(ne, &miss);
__ LoadRoot(ip, Heap::kInstanceofCacheMapRootIndex); __ LoadRoot(ip, Heap::kInstanceofCacheMapRootIndex);
__ cmp(map, ip); __ cmp(map, ip);
__ b(ne, &miss); __ b(ne, &miss);
__ LoadRoot(function, Heap::kInstanceofCacheAnswerRootIndex); __ LoadRoot(r0, Heap::kInstanceofCacheAnswerRootIndex);
__ Ret(args_in_registers() ? 0 : 2); __ Ret(args_in_registers() ? 0 : 2);
__ bind(&miss); __ bind(&miss);
__ TryGetFunctionPrototype(object, prototype, scratch, &slow); __ TryGetFunctionPrototype(function, prototype, scratch, &slow);
// Check that the function prototype is a JS object. // Check that the function prototype is a JS object.
__ BranchOnSmi(prototype, &slow); __ BranchOnSmi(prototype, &slow);
__ IsObjectJSObjectType(prototype, scratch, scratch, &slow); __ IsObjectJSObjectType(prototype, scratch, scratch, &slow);
__ StoreRoot(object, Heap::kInstanceofCacheFunctionRootIndex); __ StoreRoot(function, Heap::kInstanceofCacheFunctionRootIndex);
__ StoreRoot(map, Heap::kInstanceofCacheMapRootIndex); __ StoreRoot(map, Heap::kInstanceofCacheMapRootIndex);
// Register mapping: r3 is object map and r4 is function prototype. // Register mapping: r3 is object map and r4 is function prototype.
...@@ -2957,6 +2957,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) { ...@@ -2957,6 +2957,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
__ bind(&is_not_instance); __ bind(&is_not_instance);
__ mov(r0, Operand(Smi::FromInt(1))); __ mov(r0, Operand(Smi::FromInt(1)));
__ StoreRoot(r0, Heap::kInstanceofCacheAnswerRootIndex);
__ Ret(args_in_registers() ? 0 : 2); __ Ret(args_in_registers() ? 0 : 2);
Label object_not_null, object_not_null_or_smi; Label object_not_null, object_not_null_or_smi;
...@@ -2986,6 +2987,9 @@ void InstanceofStub::Generate(MacroAssembler* masm) { ...@@ -2986,6 +2987,9 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
__ Ret(args_in_registers() ? 0 : 2); __ Ret(args_in_registers() ? 0 : 2);
// Slow-case. Tail call builtin. // Slow-case. Tail call builtin.
if (args_in_registers()) {
__ Push(r0, r1);
}
__ bind(&slow); __ bind(&slow);
__ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_JS); __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_JS);
} }
......
...@@ -1316,8 +1316,8 @@ LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { ...@@ -1316,8 +1316,8 @@ LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
LInstruction* result = LInstruction* result =
new LInstanceOf(UseFixed(instr->left(), r1), new LInstanceOf(UseFixed(instr->left(), r0),
UseFixed(instr->right(), r0)); UseFixed(instr->right(), r1));
return MarkAsCall(DefineFixed(result, r0), instr); return MarkAsCall(DefineFixed(result, r0), instr);
} }
......
...@@ -1337,14 +1337,16 @@ void LCodeGen::DoCmpMapAndBranch(LCmpMapAndBranch* instr) { ...@@ -1337,14 +1337,16 @@ void LCodeGen::DoCmpMapAndBranch(LCmpMapAndBranch* instr) {
void LCodeGen::DoInstanceOf(LInstanceOf* instr) { void LCodeGen::DoInstanceOf(LInstanceOf* instr) {
// We expect object and function in registers r1 and r0. ASSERT(ToRegister(instr->left()).is(r0)); // Object is in r0.
ASSERT(ToRegister(instr->right()).is(r1)); // Function is in r1.
InstanceofStub stub(InstanceofStub::kArgsInRegisters); InstanceofStub stub(InstanceofStub::kArgsInRegisters);
CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
Label true_value, done; Label true_value, done;
__ tst(r0, r0); __ tst(r0, r0);
__ mov(r0, Operand(Factory::false_value()), LeaveCC, eq); __ mov(r0, Operand(Factory::false_value()), LeaveCC, ne);
__ mov(r0, Operand(Factory::true_value()), LeaveCC, ne); __ mov(r0, Operand(Factory::true_value()), LeaveCC, eq);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment