PPC: VectorICs: built-in function apply should use an IC.
authormbrandy <mbrandy@us.ibm.com>
Thu, 30 Apr 2015 16:18:09 +0000 (09:18 -0700)
committerCommit bot <commit-bot@chromium.org>
Thu, 30 Apr 2015 16:18:16 +0000 (16:18 +0000)
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

index d06d1c6d04d353538fa4929492ec2f615ddedfed..eed082d6f95865906b54f1a3b57707560c753a14 100644 (file)
@@ -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<Code> 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);
 }