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

Side by Side Diff: src/arm/stub-cache-arm.cc

Issue 2119007: ARM: Don't require the receiver on the stack for load IC... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « src/arm/full-codegen-arm.cc ('k') | src/arm/virtual-frame-arm.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 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1599 matching lines...) Expand 10 before | Expand all | Expand 10 after
1610 1610
1611 // Return the generated code. 1611 // Return the generated code.
1612 return GetCode(NORMAL, name); 1612 return GetCode(NORMAL, name);
1613 } 1613 }
1614 1614
1615 1615
1616 Object* LoadStubCompiler::CompileLoadNonexistent(String* name, 1616 Object* LoadStubCompiler::CompileLoadNonexistent(String* name,
1617 JSObject* object, 1617 JSObject* object,
1618 JSObject* last) { 1618 JSObject* last) {
1619 // ----------- S t a t e ------------- 1619 // ----------- S t a t e -------------
1620 // -- r2 : name 1620 // -- r0 : receiver
1621 // -- lr : return address 1621 // -- lr : return address
1622 // -- [sp] : receiver
1623 // ----------------------------------- 1622 // -----------------------------------
1624 Label miss; 1623 Label miss;
1625 1624
1626 // Load receiver.
1627 __ ldr(r0, MemOperand(sp, 0));
1628
1629 // Check that receiver is not a smi. 1625 // Check that receiver is not a smi.
1630 __ tst(r0, Operand(kSmiTagMask)); 1626 __ tst(r0, Operand(kSmiTagMask));
1631 __ b(eq, &miss); 1627 __ b(eq, &miss);
1632 1628
1633 // Check the maps of the full prototype chain. 1629 // Check the maps of the full prototype chain.
1634 CheckPrototypes(object, r0, last, r3, r1, name, &miss); 1630 CheckPrototypes(object, r0, last, r3, r1, name, &miss);
1635 1631
1636 // If the last object in the prototype chain is a global object, 1632 // If the last object in the prototype chain is a global object,
1637 // check that the global property cell is empty. 1633 // check that the global property cell is empty.
1638 if (last->IsGlobalObject()) { 1634 if (last->IsGlobalObject()) {
(...skipping 16 matching lines...) Expand all
1655 // Return the generated code. 1651 // Return the generated code.
1656 return GetCode(NONEXISTENT, Heap::empty_string()); 1652 return GetCode(NONEXISTENT, Heap::empty_string());
1657 } 1653 }
1658 1654
1659 1655
1660 Object* LoadStubCompiler::CompileLoadField(JSObject* object, 1656 Object* LoadStubCompiler::CompileLoadField(JSObject* object,
1661 JSObject* holder, 1657 JSObject* holder,
1662 int index, 1658 int index,
1663 String* name) { 1659 String* name) {
1664 // ----------- S t a t e ------------- 1660 // ----------- S t a t e -------------
1661 // -- r0 : receiver
1665 // -- r2 : name 1662 // -- r2 : name
1666 // -- lr : return address 1663 // -- lr : return address
1667 // -- [sp] : receiver
1668 // ----------------------------------- 1664 // -----------------------------------
1669 Label miss; 1665 Label miss;
1670 1666
1671 __ ldr(r0, MemOperand(sp, 0));
1672
1673 GenerateLoadField(object, holder, r0, r3, r1, index, name, &miss); 1667 GenerateLoadField(object, holder, r0, r3, r1, index, name, &miss);
1674 __ bind(&miss); 1668 __ bind(&miss);
1675 GenerateLoadMiss(masm(), Code::LOAD_IC); 1669 GenerateLoadMiss(masm(), Code::LOAD_IC);
1676 1670
1677 // Return the generated code. 1671 // Return the generated code.
1678 return GetCode(FIELD, name); 1672 return GetCode(FIELD, name);
1679 } 1673 }
1680 1674
1681 1675
1682 Object* LoadStubCompiler::CompileLoadCallback(String* name, 1676 Object* LoadStubCompiler::CompileLoadCallback(String* name,
1683 JSObject* object, 1677 JSObject* object,
1684 JSObject* holder, 1678 JSObject* holder,
1685 AccessorInfo* callback) { 1679 AccessorInfo* callback) {
1686 // ----------- S t a t e ------------- 1680 // ----------- S t a t e -------------
1681 // -- r0 : receiver
1687 // -- r2 : name 1682 // -- r2 : name
1688 // -- lr : return address 1683 // -- lr : return address
1689 // -- [sp] : receiver
1690 // ----------------------------------- 1684 // -----------------------------------
1691 Label miss; 1685 Label miss;
1692 1686
1693 __ ldr(r0, MemOperand(sp, 0));
1694 Failure* failure = Failure::InternalError(); 1687 Failure* failure = Failure::InternalError();
1695 bool success = GenerateLoadCallback(object, holder, r0, r2, r3, r1, 1688 bool success = GenerateLoadCallback(object, holder, r0, r2, r3, r1,
1696 callback, name, &miss, &failure); 1689 callback, name, &miss, &failure);
1697 if (!success) return failure; 1690 if (!success) return failure;
1698 1691
1699 __ bind(&miss); 1692 __ bind(&miss);
1700 GenerateLoadMiss(masm(), Code::LOAD_IC); 1693 GenerateLoadMiss(masm(), Code::LOAD_IC);
1701 1694
1702 // Return the generated code. 1695 // Return the generated code.
1703 return GetCode(CALLBACKS, name); 1696 return GetCode(CALLBACKS, name);
1704 } 1697 }
1705 1698
1706 1699
1707 Object* LoadStubCompiler::CompileLoadConstant(JSObject* object, 1700 Object* LoadStubCompiler::CompileLoadConstant(JSObject* object,
1708 JSObject* holder, 1701 JSObject* holder,
1709 Object* value, 1702 Object* value,
1710 String* name) { 1703 String* name) {
1711 // ----------- S t a t e ------------- 1704 // ----------- S t a t e -------------
1705 // -- r0 : receiver
1712 // -- r2 : name 1706 // -- r2 : name
1713 // -- lr : return address 1707 // -- lr : return address
1714 // -- [sp] : receiver
1715 // ----------------------------------- 1708 // -----------------------------------
1716 Label miss; 1709 Label miss;
1717 1710
1718 __ ldr(r0, MemOperand(sp, 0));
1719
1720 GenerateLoadConstant(object, holder, r0, r3, r1, value, name, &miss); 1711 GenerateLoadConstant(object, holder, r0, r3, r1, value, name, &miss);
1721 __ bind(&miss); 1712 __ bind(&miss);
1722 GenerateLoadMiss(masm(), Code::LOAD_IC); 1713 GenerateLoadMiss(masm(), Code::LOAD_IC);
1723 1714
1724 // Return the generated code. 1715 // Return the generated code.
1725 return GetCode(CONSTANT_FUNCTION, name); 1716 return GetCode(CONSTANT_FUNCTION, name);
1726 } 1717 }
1727 1718
1728 1719
1729 Object* LoadStubCompiler::CompileLoadInterceptor(JSObject* object, 1720 Object* LoadStubCompiler::CompileLoadInterceptor(JSObject* object,
1730 JSObject* holder, 1721 JSObject* holder,
1731 String* name) { 1722 String* name) {
1732 // ----------- S t a t e ------------- 1723 // ----------- S t a t e -------------
1724 // -- r0 : receiver
1733 // -- r2 : name 1725 // -- r2 : name
1734 // -- lr : return address 1726 // -- lr : return address
1735 // -- [sp] : receiver
1736 // ----------------------------------- 1727 // -----------------------------------
1737 Label miss; 1728 Label miss;
1738 1729
1739 __ ldr(r0, MemOperand(sp, 0));
1740
1741 LookupResult lookup; 1730 LookupResult lookup;
1742 LookupPostInterceptor(holder, name, &lookup); 1731 LookupPostInterceptor(holder, name, &lookup);
1743 GenerateLoadInterceptor(object, 1732 GenerateLoadInterceptor(object,
1744 holder, 1733 holder,
1745 &lookup, 1734 &lookup,
1746 r0, 1735 r0,
1747 r2, 1736 r2,
1748 r3, 1737 r3,
1749 r1, 1738 r1,
1750 name, 1739 name,
1751 &miss); 1740 &miss);
1752 __ bind(&miss); 1741 __ bind(&miss);
1753 GenerateLoadMiss(masm(), Code::LOAD_IC); 1742 GenerateLoadMiss(masm(), Code::LOAD_IC);
1754 1743
1755 // Return the generated code. 1744 // Return the generated code.
1756 return GetCode(INTERCEPTOR, name); 1745 return GetCode(INTERCEPTOR, name);
1757 } 1746 }
1758 1747
1759 1748
1760 Object* LoadStubCompiler::CompileLoadGlobal(JSObject* object, 1749 Object* LoadStubCompiler::CompileLoadGlobal(JSObject* object,
1761 GlobalObject* holder, 1750 GlobalObject* holder,
1762 JSGlobalPropertyCell* cell, 1751 JSGlobalPropertyCell* cell,
1763 String* name, 1752 String* name,
1764 bool is_dont_delete) { 1753 bool is_dont_delete) {
1765 // ----------- S t a t e ------------- 1754 // ----------- S t a t e -------------
1755 // -- r0 : receiver
1766 // -- r2 : name 1756 // -- r2 : name
1767 // -- lr : return address 1757 // -- lr : return address
1768 // -- r0 : receiver
1769 // -- sp[0] : receiver
1770 // ----------------------------------- 1758 // -----------------------------------
1771 Label miss; 1759 Label miss;
1772 1760
1773 // If the object is the holder then we know that it's a global 1761 // If the object is the holder then we know that it's a global
1774 // object which can only happen for contextual calls. In this case, 1762 // object which can only happen for contextual calls. In this case,
1775 // the receiver cannot be a smi. 1763 // the receiver cannot be a smi.
1776 if (object != holder) { 1764 if (object != holder) {
1777 __ tst(r0, Operand(kSmiTagMask)); 1765 __ tst(r0, Operand(kSmiTagMask));
1778 __ b(eq, &miss); 1766 __ b(eq, &miss);
1779 } 1767 }
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
2146 // Return the generated code. 2134 // Return the generated code.
2147 return GetCode(); 2135 return GetCode();
2148 } 2136 }
2149 2137
2150 2138
2151 #undef __ 2139 #undef __
2152 2140
2153 } } // namespace v8::internal 2141 } } // namespace v8::internal
2154 2142
2155 #endif // V8_TARGET_ARCH_ARM 2143 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/arm/full-codegen-arm.cc ('k') | src/arm/virtual-frame-arm.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698