From 543ae601de7e6c801adbc2ab0c23bac04c712615 Mon Sep 17 00:00:00 2001 From: mbrandy Date: Thu, 30 Apr 2015 09:18:09 -0700 Subject: [PATCH] PPC: VectorICs: built-in function apply should use an IC. Port 83a0af55009548238a2ff6ef71c3387a49da0a88 Original commit message: Handled a TODO that sent builtin function apply to the runtime on property get. R=mvstanton@chromium.org, dstence@us.ibm.com, michael_dawson@ca.ibm.com BUG= Review URL: https://codereview.chromium.org/1118713002 Cr-Commit-Position: refs/heads/master@{#28178} --- src/ppc/builtins-ppc.cc | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/ppc/builtins-ppc.cc b/src/ppc/builtins-ppc.cc index d06d1c6..eed082d 100644 --- a/src/ppc/builtins-ppc.cc +++ b/src/ppc/builtins-ppc.cc @@ -1420,35 +1420,37 @@ static void Generate_PushAppliedArguments(MacroAssembler* masm, const int argumentsOffset, const int indexOffset, const int limitOffset) { + Register receiver = LoadDescriptor::ReceiverRegister(); + Register key = LoadDescriptor::NameRegister(); + + // Copy all arguments from the array to the stack. Label entry, loop; - __ LoadP(r3, MemOperand(fp, indexOffset)); + __ LoadP(key, MemOperand(fp, indexOffset)); __ b(&entry); - - // Load the current argument from the arguments array and push it to the - // stack. - // r3: current argument index __ bind(&loop); - __ LoadP(r4, MemOperand(fp, argumentsOffset)); - __ Push(r4, r3); + __ LoadP(receiver, MemOperand(fp, argumentsOffset)); + + // Use inline caching to speed up access to arguments. + Handle ic = masm->isolate()->builtins()->KeyedLoadIC_Megamorphic(); + __ Call(ic, RelocInfo::CODE_TARGET); - // Call the runtime to access the property in the arguments array. - __ CallRuntime(Runtime::kGetProperty, 2); + // Push the nth argument. __ push(r3); - // Use inline caching to access the arguments. - __ LoadP(r3, MemOperand(fp, indexOffset)); - __ AddSmiLiteral(r3, r3, Smi::FromInt(1), r0); - __ StoreP(r3, MemOperand(fp, indexOffset)); + // Update the index on the stack and in register key. + __ LoadP(key, MemOperand(fp, indexOffset)); + __ AddSmiLiteral(key, key, Smi::FromInt(1), r0); + __ StoreP(key, MemOperand(fp, indexOffset)); // Test if the copy loop has finished copying all the elements from the // arguments object. __ bind(&entry); - __ LoadP(r4, MemOperand(fp, limitOffset)); - __ cmp(r3, r4); + __ LoadP(r0, MemOperand(fp, limitOffset)); + __ cmp(key, r0); __ bne(&loop); - // On exit, the pushed arguments count is in r0, untagged - __ SmiUntag(r3); + // On exit, the pushed arguments count is in r3, untagged + __ SmiUntag(r3, key); } -- 2.7.4