From e7c6f40a65a8b103b6cc59dde0dfe8160b93275b Mon Sep 17 00:00:00 2001 From: "plind44@gmail.com" Date: Fri, 9 May 2014 15:49:42 +0000 Subject: [PATCH] MIPS: Improve Array.shift() performance for small arrays. Port r21203 (eaa92e4) TEST=mjsunit/array-shift,mjsunit/array-shift2,mjsunit/array-shift3 BUG= R=plind44@gmail.com Review URL: https://codereview.chromium.org/275883002 Patch from Balazs Kilvady . git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21229 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/code-stubs-mips.cc | 10 ++++++++++ src/mips/lithium-codegen-mips.cc | 9 +++++++++ src/mips/lithium-mips.cc | 8 ++++++++ src/mips/lithium-mips.h | 16 ++++++++++++++++ 4 files changed, 43 insertions(+) diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc index 486e4c2..a746d76 100644 --- a/src/mips/code-stubs-mips.cc +++ b/src/mips/code-stubs-mips.cc @@ -306,6 +306,16 @@ void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor( } +void ArrayShiftStub::InitializeInterfaceDescriptor( + CodeStubInterfaceDescriptor* descriptor) { + static Register registers[] = { a0 }; + descriptor->register_param_count_ = 1; + descriptor->register_params_ = registers; + descriptor->deoptimization_handler_ = + Builtins::c_function_address(Builtins::c_ArrayShift); +} + + void BinaryOpICStub::InitializeInterfaceDescriptor( CodeStubInterfaceDescriptor* descriptor) { static Register registers[] = { a1, a0 }; diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index 95ee3a6..b731baa 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -4442,6 +4442,15 @@ void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) { } +void LCodeGen::DoArrayShift(LArrayShift* instr) { + ASSERT(ToRegister(instr->context()).is(cp)); + ASSERT(ToRegister(instr->object()).is(a0)); + ASSERT(ToRegister(instr->result()).is(v0)); + ArrayShiftStub stub(isolate(), instr->hydrogen()->kind()); + CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); +} + + void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) { Register object = ToRegister(instr->object()); Register temp = ToRegister(instr->temp()); diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index e882655..97b91fa 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -2209,6 +2209,14 @@ LInstruction* LChunkBuilder::DoTransitionElementsKind( } +LInstruction* LChunkBuilder::DoArrayShift(HArrayShift* instr) { + LOperand* object = UseFixed(instr->object(), a0); + LOperand* context = UseFixed(instr->context(), cp); + LArrayShift* result = new(zone()) LArrayShift(context, object); + return MarkAsCall(DefineFixed(result, v0), instr, CANNOT_DEOPTIMIZE_EAGERLY); +} + + LInstruction* LChunkBuilder::DoTrapAllocationMemento( HTrapAllocationMemento* instr) { LOperand* object = UseRegister(instr->object()); diff --git a/src/mips/lithium-mips.h b/src/mips/lithium-mips.h index 14ac0a4..8133c31 100644 --- a/src/mips/lithium-mips.h +++ b/src/mips/lithium-mips.h @@ -26,6 +26,7 @@ class LCodeGen; V(ArgumentsLength) \ V(ArithmeticD) \ V(ArithmeticT) \ + V(ArrayShift) \ V(BitI) \ V(BoundsCheck) \ V(Branch) \ @@ -2236,6 +2237,21 @@ class LTransitionElementsKind V8_FINAL : public LTemplateInstruction<0, 2, 1> { }; +class LArrayShift V8_FINAL : public LTemplateInstruction<1, 2, 0> { + public: + LArrayShift(LOperand* context, LOperand* object) { + inputs_[0] = context; + inputs_[1] = object; + } + + LOperand* context() const { return inputs_[0]; } + LOperand* object() const { return inputs_[1]; } + + DECLARE_CONCRETE_INSTRUCTION(ArrayShift, "array-shift") + DECLARE_HYDROGEN_ACCESSOR(ArrayShift) +}; + + class LTrapAllocationMemento V8_FINAL : public LTemplateInstruction<0, 1, 1> { public: LTrapAllocationMemento(LOperand* object, -- 2.7.4