Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(762)

Side by Side Diff: src/ppc/builtins-ppc.cc

Issue 1363883002: Version 4.6.85.21 (cherry-pick) (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@4.6
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/mips64/builtins-mips64.cc ('k') | src/type-feedback-vector.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if V8_TARGET_ARCH_PPC 5 #if V8_TARGET_ARCH_PPC
6 6
7 #include "src/codegen.h" 7 #include "src/codegen.h"
8 #include "src/debug/debug.h" 8 #include "src/debug/debug.h"
9 #include "src/deoptimizer.h" 9 #include "src/deoptimizer.h"
10 #include "src/full-codegen/full-codegen.h" 10 #include "src/full-codegen/full-codegen.h"
(...skipping 1448 matching lines...) Expand 10 before | Expand all | Expand 10 after
1459 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), 1459 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1460 RelocInfo::CODE_TARGET, ne); 1460 RelocInfo::CODE_TARGET, ne);
1461 1461
1462 __ LoadP(ip, FieldMemOperand(r4, JSFunction::kCodeEntryOffset)); 1462 __ LoadP(ip, FieldMemOperand(r4, JSFunction::kCodeEntryOffset));
1463 ParameterCount expected(0); 1463 ParameterCount expected(0);
1464 __ InvokeCode(ip, expected, expected, JUMP_FUNCTION, NullCallWrapper()); 1464 __ InvokeCode(ip, expected, expected, JUMP_FUNCTION, NullCallWrapper());
1465 } 1465 }
1466 1466
1467 1467
1468 static void Generate_PushAppliedArguments(MacroAssembler* masm, 1468 static void Generate_PushAppliedArguments(MacroAssembler* masm,
1469 const int vectorOffset,
1469 const int argumentsOffset, 1470 const int argumentsOffset,
1470 const int indexOffset, 1471 const int indexOffset,
1471 const int limitOffset) { 1472 const int limitOffset) {
1472 Register receiver = LoadDescriptor::ReceiverRegister(); 1473 Register receiver = LoadDescriptor::ReceiverRegister();
1473 Register key = LoadDescriptor::NameRegister(); 1474 Register key = LoadDescriptor::NameRegister();
1474 Register slot = LoadDescriptor::SlotRegister(); 1475 Register slot = LoadDescriptor::SlotRegister();
1475 Register vector = LoadWithVectorDescriptor::VectorRegister(); 1476 Register vector = LoadWithVectorDescriptor::VectorRegister();
1476 1477
1477 // Copy all arguments from the array to the stack. 1478 // Copy all arguments from the array to the stack.
1478 Label entry, loop; 1479 Label entry, loop;
1479 __ LoadP(key, MemOperand(fp, indexOffset)); 1480 __ LoadP(key, MemOperand(fp, indexOffset));
1480 __ b(&entry); 1481 __ b(&entry);
1481 __ bind(&loop); 1482 __ bind(&loop);
1482 __ LoadP(receiver, MemOperand(fp, argumentsOffset)); 1483 __ LoadP(receiver, MemOperand(fp, argumentsOffset));
1483 1484
1484 // Use inline caching to speed up access to arguments. 1485 // Use inline caching to speed up access to arguments.
1485 Code::Kind kinds[] = {Code::KEYED_LOAD_IC}; 1486 int slot_index = TypeFeedbackVector::PushAppliedArgumentsIndex();
1486 FeedbackVectorSpec spec(0, 1, kinds); 1487 __ LoadSmiLiteral(slot, Smi::FromInt(slot_index));
1487 Handle<TypeFeedbackVector> feedback_vector = 1488 __ LoadP(vector, MemOperand(fp, vectorOffset));
1488 masm->isolate()->factory()->NewTypeFeedbackVector(&spec);
1489 int index = feedback_vector->GetIndex(FeedbackVectorICSlot(0));
1490 __ LoadSmiLiteral(slot, Smi::FromInt(index));
1491 __ Move(vector, feedback_vector);
1492 Handle<Code> ic = 1489 Handle<Code> ic =
1493 KeyedLoadICStub(masm->isolate(), LoadICState(kNoExtraICState)).GetCode(); 1490 KeyedLoadICStub(masm->isolate(), LoadICState(kNoExtraICState)).GetCode();
1494 __ Call(ic, RelocInfo::CODE_TARGET); 1491 __ Call(ic, RelocInfo::CODE_TARGET);
1495 1492
1496 // Push the nth argument. 1493 // Push the nth argument.
1497 __ push(r3); 1494 __ push(r3);
1498 1495
1499 // Update the index on the stack and in register key. 1496 // Update the index on the stack and in register key.
1500 __ LoadP(key, MemOperand(fp, indexOffset)); 1497 __ LoadP(key, MemOperand(fp, indexOffset));
1501 __ AddSmiLiteral(key, key, Smi::FromInt(1), r0); 1498 __ AddSmiLiteral(key, key, Smi::FromInt(1), r0);
(...skipping 14 matching lines...) Expand all
1516 // Used by FunctionApply and ReflectApply 1513 // Used by FunctionApply and ReflectApply
1517 static void Generate_ApplyHelper(MacroAssembler* masm, bool targetIsArgument) { 1514 static void Generate_ApplyHelper(MacroAssembler* masm, bool targetIsArgument) {
1518 const int kFormalParameters = targetIsArgument ? 3 : 2; 1515 const int kFormalParameters = targetIsArgument ? 3 : 2;
1519 const int kStackSize = kFormalParameters + 1; 1516 const int kStackSize = kFormalParameters + 1;
1520 1517
1521 { 1518 {
1522 FrameAndConstantPoolScope frame_scope(masm, StackFrame::INTERNAL); 1519 FrameAndConstantPoolScope frame_scope(masm, StackFrame::INTERNAL);
1523 const int kArgumentsOffset = kFPOnStackSize + kPCOnStackSize; 1520 const int kArgumentsOffset = kFPOnStackSize + kPCOnStackSize;
1524 const int kReceiverOffset = kArgumentsOffset + kPointerSize; 1521 const int kReceiverOffset = kArgumentsOffset + kPointerSize;
1525 const int kFunctionOffset = kReceiverOffset + kPointerSize; 1522 const int kFunctionOffset = kReceiverOffset + kPointerSize;
1523 const int kVectorOffset =
1524 InternalFrameConstants::kCodeOffset - 1 * kPointerSize;
1525
1526 // Push the vector.
1527 __ LoadP(r4, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
1528 __ LoadP(r4,
1529 FieldMemOperand(r4, SharedFunctionInfo::kFeedbackVectorOffset));
1530 __ push(r4);
1526 1531
1527 __ LoadP(r3, MemOperand(fp, kFunctionOffset)); // get the function 1532 __ LoadP(r3, MemOperand(fp, kFunctionOffset)); // get the function
1528 __ push(r3); 1533 __ push(r3);
1529 __ LoadP(r3, MemOperand(fp, kArgumentsOffset)); // get the args array 1534 __ LoadP(r3, MemOperand(fp, kArgumentsOffset)); // get the args array
1530 __ push(r3); 1535 __ push(r3);
1531 if (targetIsArgument) { 1536 if (targetIsArgument) {
1532 __ InvokeBuiltin(Builtins::REFLECT_APPLY_PREPARE, CALL_FUNCTION); 1537 __ InvokeBuiltin(Builtins::REFLECT_APPLY_PREPARE, CALL_FUNCTION);
1533 } else { 1538 } else {
1534 __ InvokeBuiltin(Builtins::APPLY_PREPARE, CALL_FUNCTION); 1539 __ InvokeBuiltin(Builtins::APPLY_PREPARE, CALL_FUNCTION);
1535 } 1540 }
1536 1541
1537 Generate_CheckStackOverflow(masm, kFunctionOffset, r3, kArgcIsSmiTagged); 1542 Generate_CheckStackOverflow(masm, kFunctionOffset, r3, kArgcIsSmiTagged);
1538 1543
1539 // Push current limit and index. 1544 // Push current limit and index.
1540 const int kIndexOffset = 1545 const int kIndexOffset = kVectorOffset - (2 * kPointerSize);
1541 StandardFrameConstants::kExpressionsOffset - (2 * kPointerSize); 1546 const int kLimitOffset = kVectorOffset - (1 * kPointerSize);
1542 const int kLimitOffset =
1543 StandardFrameConstants::kExpressionsOffset - (1 * kPointerSize);
1544 __ li(r4, Operand::Zero()); 1547 __ li(r4, Operand::Zero());
1545 __ Push(r3, r4); // limit and initial index. 1548 __ Push(r3, r4); // limit and initial index.
1546 1549
1547 // Get the receiver. 1550 // Get the receiver.
1548 __ LoadP(r3, MemOperand(fp, kReceiverOffset)); 1551 __ LoadP(r3, MemOperand(fp, kReceiverOffset));
1549 1552
1550 // Check that the function is a JS function (otherwise it must be a proxy). 1553 // Check that the function is a JS function (otherwise it must be a proxy).
1551 Label push_receiver; 1554 Label push_receiver;
1552 __ LoadP(r4, MemOperand(fp, kFunctionOffset)); 1555 __ LoadP(r4, MemOperand(fp, kFunctionOffset));
1553 __ CompareObjectType(r4, r5, r5, JS_FUNCTION_TYPE); 1556 __ CompareObjectType(r4, r5, r5, JS_FUNCTION_TYPE);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1606 __ bind(&use_global_proxy); 1609 __ bind(&use_global_proxy);
1607 __ LoadP(r3, ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX)); 1610 __ LoadP(r3, ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX));
1608 __ LoadP(r3, FieldMemOperand(r3, GlobalObject::kGlobalProxyOffset)); 1611 __ LoadP(r3, FieldMemOperand(r3, GlobalObject::kGlobalProxyOffset));
1609 1612
1610 // Push the receiver. 1613 // Push the receiver.
1611 // r3: receiver 1614 // r3: receiver
1612 __ bind(&push_receiver); 1615 __ bind(&push_receiver);
1613 __ push(r3); 1616 __ push(r3);
1614 1617
1615 // Copy all arguments from the array to the stack. 1618 // Copy all arguments from the array to the stack.
1616 Generate_PushAppliedArguments(masm, kArgumentsOffset, kIndexOffset, 1619 Generate_PushAppliedArguments(masm, kVectorOffset, kArgumentsOffset,
1617 kLimitOffset); 1620 kIndexOffset, kLimitOffset);
1618 1621
1619 // Call the function. 1622 // Call the function.
1620 Label call_proxy; 1623 Label call_proxy;
1621 ParameterCount actual(r3); 1624 ParameterCount actual(r3);
1622 __ LoadP(r4, MemOperand(fp, kFunctionOffset)); 1625 __ LoadP(r4, MemOperand(fp, kFunctionOffset));
1623 __ CompareObjectType(r4, r5, r5, JS_FUNCTION_TYPE); 1626 __ CompareObjectType(r4, r5, r5, JS_FUNCTION_TYPE);
1624 __ bne(&call_proxy); 1627 __ bne(&call_proxy);
1625 __ InvokeFunction(r4, actual, CALL_FUNCTION, NullCallWrapper()); 1628 __ InvokeFunction(r4, actual, CALL_FUNCTION, NullCallWrapper());
1626 1629
1627 __ LeaveFrame(StackFrame::INTERNAL, kStackSize * kPointerSize); 1630 __ LeaveFrame(StackFrame::INTERNAL, kStackSize * kPointerSize);
(...skipping 17 matching lines...) Expand all
1645 1648
1646 static void Generate_ConstructHelper(MacroAssembler* masm) { 1649 static void Generate_ConstructHelper(MacroAssembler* masm) {
1647 const int kFormalParameters = 3; 1650 const int kFormalParameters = 3;
1648 const int kStackSize = kFormalParameters + 1; 1651 const int kStackSize = kFormalParameters + 1;
1649 1652
1650 { 1653 {
1651 FrameAndConstantPoolScope frame_scope(masm, StackFrame::INTERNAL); 1654 FrameAndConstantPoolScope frame_scope(masm, StackFrame::INTERNAL);
1652 const int kNewTargetOffset = kFPOnStackSize + kPCOnStackSize; 1655 const int kNewTargetOffset = kFPOnStackSize + kPCOnStackSize;
1653 const int kArgumentsOffset = kNewTargetOffset + kPointerSize; 1656 const int kArgumentsOffset = kNewTargetOffset + kPointerSize;
1654 const int kFunctionOffset = kArgumentsOffset + kPointerSize; 1657 const int kFunctionOffset = kArgumentsOffset + kPointerSize;
1658 static const int kVectorOffset =
1659 InternalFrameConstants::kCodeOffset - 1 * kPointerSize;
1660
1661 // Push the vector.
1662 __ LoadP(r4, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
1663 __ LoadP(r4,
1664 FieldMemOperand(r4, SharedFunctionInfo::kFeedbackVectorOffset));
1665 __ push(r4);
1655 1666
1656 // If newTarget is not supplied, set it to constructor 1667 // If newTarget is not supplied, set it to constructor
1657 Label validate_arguments; 1668 Label validate_arguments;
1658 __ LoadP(r3, MemOperand(fp, kNewTargetOffset)); 1669 __ LoadP(r3, MemOperand(fp, kNewTargetOffset));
1659 __ CompareRoot(r3, Heap::kUndefinedValueRootIndex); 1670 __ CompareRoot(r3, Heap::kUndefinedValueRootIndex);
1660 __ bne(&validate_arguments); 1671 __ bne(&validate_arguments);
1661 __ LoadP(r3, MemOperand(fp, kFunctionOffset)); 1672 __ LoadP(r3, MemOperand(fp, kFunctionOffset));
1662 __ StoreP(r3, MemOperand(fp, kNewTargetOffset)); 1673 __ StoreP(r3, MemOperand(fp, kNewTargetOffset));
1663 1674
1664 // Validate arguments 1675 // Validate arguments
1665 __ bind(&validate_arguments); 1676 __ bind(&validate_arguments);
1666 __ LoadP(r3, MemOperand(fp, kFunctionOffset)); // get the function 1677 __ LoadP(r3, MemOperand(fp, kFunctionOffset)); // get the function
1667 __ push(r3); 1678 __ push(r3);
1668 __ LoadP(r3, MemOperand(fp, kArgumentsOffset)); // get the args array 1679 __ LoadP(r3, MemOperand(fp, kArgumentsOffset)); // get the args array
1669 __ push(r3); 1680 __ push(r3);
1670 __ LoadP(r3, MemOperand(fp, kNewTargetOffset)); // get the new.target 1681 __ LoadP(r3, MemOperand(fp, kNewTargetOffset)); // get the new.target
1671 __ push(r3); 1682 __ push(r3);
1672 __ InvokeBuiltin(Builtins::REFLECT_CONSTRUCT_PREPARE, CALL_FUNCTION); 1683 __ InvokeBuiltin(Builtins::REFLECT_CONSTRUCT_PREPARE, CALL_FUNCTION);
1673 1684
1674 Generate_CheckStackOverflow(masm, kFunctionOffset, r3, kArgcIsSmiTagged); 1685 Generate_CheckStackOverflow(masm, kFunctionOffset, r3, kArgcIsSmiTagged);
1675 1686
1676 // Push current limit and index. 1687 // Push current limit and index.
1677 const int kIndexOffset = 1688 const int kIndexOffset = kVectorOffset - (2 * kPointerSize);
1678 StandardFrameConstants::kExpressionsOffset - (2 * kPointerSize); 1689 const int kLimitOffset = kVectorOffset - (1 * kPointerSize);
1679 const int kLimitOffset =
1680 StandardFrameConstants::kExpressionsOffset - (1 * kPointerSize);
1681 __ li(r4, Operand::Zero()); 1690 __ li(r4, Operand::Zero());
1682 __ Push(r3, r4); // limit and initial index. 1691 __ Push(r3, r4); // limit and initial index.
1683 // Push the constructor function as callee 1692 // Push the constructor function as callee
1684 __ LoadP(r3, MemOperand(fp, kFunctionOffset)); 1693 __ LoadP(r3, MemOperand(fp, kFunctionOffset));
1685 __ push(r3); 1694 __ push(r3);
1686 1695
1687 // Copy all arguments from the array to the stack. 1696 // Copy all arguments from the array to the stack.
1688 Generate_PushAppliedArguments(masm, kArgumentsOffset, kIndexOffset, 1697 Generate_PushAppliedArguments(masm, kVectorOffset, kArgumentsOffset,
1689 kLimitOffset); 1698 kIndexOffset, kLimitOffset);
1690 1699
1691 // Use undefined feedback vector 1700 // Use undefined feedback vector
1692 __ LoadRoot(r5, Heap::kUndefinedValueRootIndex); 1701 __ LoadRoot(r5, Heap::kUndefinedValueRootIndex);
1693 __ LoadP(r4, MemOperand(fp, kFunctionOffset)); 1702 __ LoadP(r4, MemOperand(fp, kFunctionOffset));
1694 __ LoadP(r7, MemOperand(fp, kNewTargetOffset)); 1703 __ LoadP(r7, MemOperand(fp, kNewTargetOffset));
1695 1704
1696 // Call the function. 1705 // Call the function.
1697 CallConstructStub stub(masm->isolate(), SUPER_CONSTRUCTOR_CALL); 1706 CallConstructStub stub(masm->isolate(), SUPER_CONSTRUCTOR_CALL);
1698 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); 1707 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL);
1699 1708
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
1923 __ bkpt(0); 1932 __ bkpt(0);
1924 } 1933 }
1925 } 1934 }
1926 1935
1927 1936
1928 #undef __ 1937 #undef __
1929 } // namespace internal 1938 } // namespace internal
1930 } // namespace v8 1939 } // namespace v8
1931 1940
1932 #endif // V8_TARGET_ARCH_PPC 1941 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « src/mips64/builtins-mips64.cc ('k') | src/type-feedback-vector.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698