From 16800adf573f4ce02a96dae26bc19bcd0981ff03 Mon Sep 17 00:00:00 2001 From: "karlklose@chromium.org" Date: Thu, 23 Dec 2010 16:33:30 +0000 Subject: [PATCH] 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 --- src/arm/code-stubs-arm.cc | 26 +++++++++++++++----------- src/arm/lithium-arm.cc | 4 ++-- src/arm/lithium-codegen-arm.cc | 8 +++++--- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc index 5ec8584..7c3ea89 100644 --- a/src/arm/code-stubs-arm.cc +++ b/src/arm/code-stubs-arm.cc @@ -2894,45 +2894,45 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { // 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 // args_in_registers() is true. void InstanceofStub::Generate(MacroAssembler* masm) { // 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 function = r0; // Function (rhs). + const Register function = r1; // Function (rhs). const Register prototype = r4; // Prototype of the function. const Register scratch = r2; Label slow, loop, is_instance, is_not_instance, not_js_object; if (!args_in_registers()) { - __ ldr(function, MemOperand(sp, 1 * kPointerSize)); - __ ldr(object, MemOperand(sp, 0)); + __ ldr(object, MemOperand(sp, 1 * kPointerSize)); + __ ldr(function, MemOperand(sp, 0)); } // Check that the left hand is a JS object and load map. - __ BranchOnSmi(object, &slow); - __ IsObjectJSObjectType(object, map, scratch, &slow); + __ BranchOnSmi(object, ¬_js_object); + __ IsObjectJSObjectType(object, map, scratch, ¬_js_object); // Look up the function and the map in the instanceof cache. Label miss; __ LoadRoot(ip, Heap::kInstanceofCacheFunctionRootIndex); - __ cmp(object, ip); + __ cmp(function, ip); __ b(ne, &miss); __ LoadRoot(ip, Heap::kInstanceofCacheMapRootIndex); __ cmp(map, ip); __ b(ne, &miss); - __ LoadRoot(function, Heap::kInstanceofCacheAnswerRootIndex); + __ LoadRoot(r0, Heap::kInstanceofCacheAnswerRootIndex); __ Ret(args_in_registers() ? 0 : 2); __ bind(&miss); - __ TryGetFunctionPrototype(object, prototype, scratch, &slow); + __ TryGetFunctionPrototype(function, prototype, scratch, &slow); // Check that the function prototype is a JS object. __ BranchOnSmi(prototype, &slow); __ IsObjectJSObjectType(prototype, scratch, scratch, &slow); - __ StoreRoot(object, Heap::kInstanceofCacheFunctionRootIndex); + __ StoreRoot(function, Heap::kInstanceofCacheFunctionRootIndex); __ StoreRoot(map, Heap::kInstanceofCacheMapRootIndex); // Register mapping: r3 is object map and r4 is function prototype. @@ -2957,6 +2957,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) { __ bind(&is_not_instance); __ mov(r0, Operand(Smi::FromInt(1))); + __ StoreRoot(r0, Heap::kInstanceofCacheAnswerRootIndex); __ Ret(args_in_registers() ? 0 : 2); Label object_not_null, object_not_null_or_smi; @@ -2986,6 +2987,9 @@ void InstanceofStub::Generate(MacroAssembler* masm) { __ Ret(args_in_registers() ? 0 : 2); // Slow-case. Tail call builtin. + if (args_in_registers()) { + __ Push(r0, r1); + } __ bind(&slow); __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_JS); } diff --git a/src/arm/lithium-arm.cc b/src/arm/lithium-arm.cc index 7807d8a..bc0f153 100644 --- a/src/arm/lithium-arm.cc +++ b/src/arm/lithium-arm.cc @@ -1316,8 +1316,8 @@ LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { LInstruction* result = - new LInstanceOf(UseFixed(instr->left(), r1), - UseFixed(instr->right(), r0)); + new LInstanceOf(UseFixed(instr->left(), r0), + UseFixed(instr->right(), r1)); return MarkAsCall(DefineFixed(result, r0), instr); } diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index 6b75073..dd94c68 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -1337,14 +1337,16 @@ void LCodeGen::DoCmpMapAndBranch(LCmpMapAndBranch* 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); CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); Label true_value, done; __ tst(r0, r0); - __ mov(r0, Operand(Factory::false_value()), LeaveCC, eq); - __ mov(r0, Operand(Factory::true_value()), LeaveCC, ne); + __ mov(r0, Operand(Factory::false_value()), LeaveCC, ne); + __ mov(r0, Operand(Factory::true_value()), LeaveCC, eq); } -- 2.7.4