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

Side by Side Diff: src/mips/code-stubs-mips.cc

Issue 1608933003: MIPS: Use the Lsa() macro/r6 instruction in existing code. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 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/mips/builtins-mips.cc ('k') | src/mips/codegen-mips.cc » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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_MIPS 5 #if V8_TARGET_ARCH_MIPS
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/bootstrapper.h" 8 #include "src/bootstrapper.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 1057 matching lines...) Expand 10 before | Expand all | Expand 10 after
1068 // If argv_in_register(): 1068 // If argv_in_register():
1069 // a2: pointer to the first argument 1069 // a2: pointer to the first argument
1070 1070
1071 ProfileEntryHookStub::MaybeCallEntryHook(masm); 1071 ProfileEntryHookStub::MaybeCallEntryHook(masm);
1072 1072
1073 if (argv_in_register()) { 1073 if (argv_in_register()) {
1074 // Move argv into the correct register. 1074 // Move argv into the correct register.
1075 __ mov(s1, a2); 1075 __ mov(s1, a2);
1076 } else { 1076 } else {
1077 // Compute the argv pointer in a callee-saved register. 1077 // Compute the argv pointer in a callee-saved register.
1078 __ sll(s1, a0, kPointerSizeLog2); 1078 __ Lsa(s1, sp, a0, kPointerSizeLog2);
1079 __ Addu(s1, sp, s1);
1080 __ Subu(s1, s1, kPointerSize); 1079 __ Subu(s1, s1, kPointerSize);
1081 } 1080 }
1082 1081
1083 // Enter the exit frame that transitions from JavaScript to C++. 1082 // Enter the exit frame that transitions from JavaScript to C++.
1084 FrameScope scope(masm, StackFrame::MANUAL); 1083 FrameScope scope(masm, StackFrame::MANUAL);
1085 __ EnterExitFrame(save_doubles()); 1084 __ EnterExitFrame(save_doubles());
1086 1085
1087 // s0: number of arguments including receiver (C callee-saved) 1086 // s0: number of arguments including receiver (C callee-saved)
1088 // s1: pointer to first argument (C callee-saved) 1087 // s1: pointer to first argument (C callee-saved)
1089 // s2: pointer to builtin function (C callee-saved) 1088 // s2: pointer to builtin function (C callee-saved)
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after
1605 a3, 1604 a3,
1606 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); 1605 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
1607 1606
1608 // Check index (a1) against formal parameters count limit passed in 1607 // Check index (a1) against formal parameters count limit passed in
1609 // through register a0. Use unsigned comparison to get negative 1608 // through register a0. Use unsigned comparison to get negative
1610 // check for free. 1609 // check for free.
1611 __ Branch(&slow, hs, a1, Operand(a0)); 1610 __ Branch(&slow, hs, a1, Operand(a0));
1612 1611
1613 // Read the argument from the stack and return it. 1612 // Read the argument from the stack and return it.
1614 __ subu(a3, a0, a1); 1613 __ subu(a3, a0, a1);
1615 __ sll(t3, a3, kPointerSizeLog2 - kSmiTagSize); 1614 __ Lsa(a3, fp, a3, kPointerSizeLog2 - kSmiTagSize);
1616 __ Addu(a3, fp, Operand(t3));
1617 __ Ret(USE_DELAY_SLOT); 1615 __ Ret(USE_DELAY_SLOT);
1618 __ lw(v0, MemOperand(a3, kDisplacement)); 1616 __ lw(v0, MemOperand(a3, kDisplacement));
1619 1617
1620 // Arguments adaptor case: Check index (a1) against actual arguments 1618 // Arguments adaptor case: Check index (a1) against actual arguments
1621 // limit found in the arguments adaptor frame. Use unsigned 1619 // limit found in the arguments adaptor frame. Use unsigned
1622 // comparison to get negative check for free. 1620 // comparison to get negative check for free.
1623 __ bind(&adaptor); 1621 __ bind(&adaptor);
1624 __ lw(a0, MemOperand(a2, ArgumentsAdaptorFrameConstants::kLengthOffset)); 1622 __ lw(a0, MemOperand(a2, ArgumentsAdaptorFrameConstants::kLengthOffset));
1625 __ Branch(&slow, Ugreater_equal, a1, Operand(a0)); 1623 __ Branch(&slow, Ugreater_equal, a1, Operand(a0));
1626 1624
1627 // Read the argument from the adaptor frame and return it. 1625 // Read the argument from the adaptor frame and return it.
1628 __ subu(a3, a0, a1); 1626 __ subu(a3, a0, a1);
1629 __ sll(t3, a3, kPointerSizeLog2 - kSmiTagSize); 1627 __ Lsa(a3, a2, a3, kPointerSizeLog2 - kSmiTagSize);
1630 __ Addu(a3, a2, Operand(t3));
1631 __ Ret(USE_DELAY_SLOT); 1628 __ Ret(USE_DELAY_SLOT);
1632 __ lw(v0, MemOperand(a3, kDisplacement)); 1629 __ lw(v0, MemOperand(a3, kDisplacement));
1633 1630
1634 // Slow-case: Handle non-smi or out-of-bounds access to arguments 1631 // Slow-case: Handle non-smi or out-of-bounds access to arguments
1635 // by calling the runtime system. 1632 // by calling the runtime system.
1636 __ bind(&slow); 1633 __ bind(&slow);
1637 __ push(a1); 1634 __ push(a1);
1638 __ TailCallRuntime(Runtime::kArguments); 1635 __ TailCallRuntime(Runtime::kArguments);
1639 } 1636 }
1640 1637
1641 1638
1642 void ArgumentsAccessStub::GenerateNewSloppySlow(MacroAssembler* masm) { 1639 void ArgumentsAccessStub::GenerateNewSloppySlow(MacroAssembler* masm) {
1643 // a1 : function 1640 // a1 : function
1644 // a2 : number of parameters (tagged) 1641 // a2 : number of parameters (tagged)
1645 // a3 : parameters pointer 1642 // a3 : parameters pointer
1646 1643
1647 DCHECK(a1.is(ArgumentsAccessNewDescriptor::function())); 1644 DCHECK(a1.is(ArgumentsAccessNewDescriptor::function()));
1648 DCHECK(a2.is(ArgumentsAccessNewDescriptor::parameter_count())); 1645 DCHECK(a2.is(ArgumentsAccessNewDescriptor::parameter_count()));
1649 DCHECK(a3.is(ArgumentsAccessNewDescriptor::parameter_pointer())); 1646 DCHECK(a3.is(ArgumentsAccessNewDescriptor::parameter_pointer()));
1650 1647
1651 // Check if the calling frame is an arguments adaptor frame. 1648 // Check if the calling frame is an arguments adaptor frame.
1652 Label runtime; 1649 Label runtime;
1653 __ lw(t0, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); 1650 __ lw(t0, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
1654 __ lw(a0, MemOperand(t0, StandardFrameConstants::kContextOffset)); 1651 __ lw(a0, MemOperand(t0, StandardFrameConstants::kContextOffset));
1655 __ Branch(&runtime, ne, a0, 1652 __ Branch(&runtime, ne, a0,
1656 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); 1653 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
1657 1654
1658 // Patch the arguments.length and the parameters pointer in the current frame. 1655 // Patch the arguments.length and the parameters pointer in the current frame.
1659 __ lw(a2, MemOperand(t0, ArgumentsAdaptorFrameConstants::kLengthOffset)); 1656 __ lw(a2, MemOperand(t0, ArgumentsAdaptorFrameConstants::kLengthOffset));
1660 __ sll(t3, a2, 1); 1657 __ Lsa(t0, t0, a2, 1);
1661 __ Addu(t0, t0, Operand(t3));
1662 __ addiu(a3, t0, StandardFrameConstants::kCallerSPOffset); 1658 __ addiu(a3, t0, StandardFrameConstants::kCallerSPOffset);
1663 1659
1664 __ bind(&runtime); 1660 __ bind(&runtime);
1665 __ Push(a1, a3, a2); 1661 __ Push(a1, a3, a2);
1666 __ TailCallRuntime(Runtime::kNewSloppyArguments); 1662 __ TailCallRuntime(Runtime::kNewSloppyArguments);
1667 } 1663 }
1668 1664
1669 1665
1670 void ArgumentsAccessStub::GenerateNewSloppyFast(MacroAssembler* masm) { 1666 void ArgumentsAccessStub::GenerateNewSloppyFast(MacroAssembler* masm) {
1671 // a1 : function 1667 // a1 : function
(...skipping 15 matching lines...) Expand all
1687 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); 1683 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
1688 1684
1689 // No adaptor, parameter count = argument count. 1685 // No adaptor, parameter count = argument count.
1690 __ mov(t1, a2); 1686 __ mov(t1, a2);
1691 __ Branch(USE_DELAY_SLOT, &try_allocate); 1687 __ Branch(USE_DELAY_SLOT, &try_allocate);
1692 __ mov(t2, a2); // In delay slot. 1688 __ mov(t2, a2); // In delay slot.
1693 1689
1694 // We have an adaptor frame. Patch the parameters pointer. 1690 // We have an adaptor frame. Patch the parameters pointer.
1695 __ bind(&adaptor_frame); 1691 __ bind(&adaptor_frame);
1696 __ lw(t1, MemOperand(t0, ArgumentsAdaptorFrameConstants::kLengthOffset)); 1692 __ lw(t1, MemOperand(t0, ArgumentsAdaptorFrameConstants::kLengthOffset));
1697 __ sll(t6, t1, 1); 1693 __ Lsa(t0, t0, t1, 1);
1698 __ Addu(t0, t0, Operand(t6));
1699 __ Addu(a3, t0, Operand(StandardFrameConstants::kCallerSPOffset)); 1694 __ Addu(a3, t0, Operand(StandardFrameConstants::kCallerSPOffset));
1700 1695
1701 // t1 = argument count (tagged) 1696 // t1 = argument count (tagged)
1702 // t2 = parameter count (tagged) 1697 // t2 = parameter count (tagged)
1703 // Compute the mapped parameter count = min(t2, t1) in t2. 1698 // Compute the mapped parameter count = min(t2, t1) in t2.
1704 __ mov(t2, a2); 1699 __ mov(t2, a2);
1705 __ Branch(&try_allocate, le, t2, Operand(t1)); 1700 __ Branch(&try_allocate, le, t2, Operand(t1));
1706 __ mov(t2, t1); 1701 __ mov(t2, t1);
1707 1702
1708 __ bind(&try_allocate); 1703 __ bind(&try_allocate);
1709 1704
1710 // Compute the sizes of backing store, parameter map, and arguments object. 1705 // Compute the sizes of backing store, parameter map, and arguments object.
1711 // 1. Parameter map, has 2 extra words containing context and backing store. 1706 // 1. Parameter map, has 2 extra words containing context and backing store.
1712 const int kParameterMapHeaderSize = 1707 const int kParameterMapHeaderSize =
1713 FixedArray::kHeaderSize + 2 * kPointerSize; 1708 FixedArray::kHeaderSize + 2 * kPointerSize;
1714 // If there are no mapped parameters, we do not need the parameter_map. 1709 // If there are no mapped parameters, we do not need the parameter_map.
1715 Label param_map_size; 1710 Label param_map_size;
1716 DCHECK_EQ(static_cast<Smi*>(0), Smi::FromInt(0)); 1711 DCHECK_EQ(static_cast<Smi*>(0), Smi::FromInt(0));
1717 __ Branch(USE_DELAY_SLOT, &param_map_size, eq, t2, Operand(zero_reg)); 1712 __ Branch(USE_DELAY_SLOT, &param_map_size, eq, t2, Operand(zero_reg));
1718 __ mov(t5, zero_reg); // In delay slot: param map size = 0 when t2 == 0. 1713 __ mov(t5, zero_reg); // In delay slot: param map size = 0 when t2 == 0.
1719 __ sll(t5, t2, 1); 1714 __ sll(t5, t2, 1);
1720 __ addiu(t5, t5, kParameterMapHeaderSize); 1715 __ addiu(t5, t5, kParameterMapHeaderSize);
1721 __ bind(&param_map_size); 1716 __ bind(&param_map_size);
1722 1717
1723 // 2. Backing store. 1718 // 2. Backing store.
1724 __ sll(t6, t1, 1); 1719 __ Lsa(t5, t5, t1, 1);
1725 __ Addu(t5, t5, Operand(t6));
1726 __ Addu(t5, t5, Operand(FixedArray::kHeaderSize)); 1720 __ Addu(t5, t5, Operand(FixedArray::kHeaderSize));
1727 1721
1728 // 3. Arguments object. 1722 // 3. Arguments object.
1729 __ Addu(t5, t5, Operand(Heap::kSloppyArgumentsObjectSize)); 1723 __ Addu(t5, t5, Operand(Heap::kSloppyArgumentsObjectSize));
1730 1724
1731 // Do the allocation of all three objects in one go. 1725 // Do the allocation of all three objects in one go.
1732 __ Allocate(t5, v0, t5, t0, &runtime, TAG_OBJECT); 1726 __ Allocate(t5, v0, t5, t0, &runtime, TAG_OBJECT);
1733 1727
1734 // v0 = address of new object(s) (tagged) 1728 // v0 = address of new object(s) (tagged)
1735 // a2 = argument count (smi-tagged) 1729 // a2 = argument count (smi-tagged)
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1791 __ mov(a1, t0); 1785 __ mov(a1, t0);
1792 __ bind(&skip3); 1786 __ bind(&skip3);
1793 1787
1794 __ Branch(&skip_parameter_map, eq, t2, Operand(Smi::FromInt(0))); 1788 __ Branch(&skip_parameter_map, eq, t2, Operand(Smi::FromInt(0)));
1795 1789
1796 __ LoadRoot(t1, Heap::kSloppyArgumentsElementsMapRootIndex); 1790 __ LoadRoot(t1, Heap::kSloppyArgumentsElementsMapRootIndex);
1797 __ sw(t1, FieldMemOperand(t0, FixedArray::kMapOffset)); 1791 __ sw(t1, FieldMemOperand(t0, FixedArray::kMapOffset));
1798 __ Addu(t1, t2, Operand(Smi::FromInt(2))); 1792 __ Addu(t1, t2, Operand(Smi::FromInt(2)));
1799 __ sw(t1, FieldMemOperand(t0, FixedArray::kLengthOffset)); 1793 __ sw(t1, FieldMemOperand(t0, FixedArray::kLengthOffset));
1800 __ sw(cp, FieldMemOperand(t0, FixedArray::kHeaderSize + 0 * kPointerSize)); 1794 __ sw(cp, FieldMemOperand(t0, FixedArray::kHeaderSize + 0 * kPointerSize));
1801 __ sll(t6, t2, 1); 1795 __ Lsa(t1, t0, t2, 1);
1802 __ Addu(t1, t0, Operand(t6));
1803 __ Addu(t1, t1, Operand(kParameterMapHeaderSize)); 1796 __ Addu(t1, t1, Operand(kParameterMapHeaderSize));
1804 __ sw(t1, FieldMemOperand(t0, FixedArray::kHeaderSize + 1 * kPointerSize)); 1797 __ sw(t1, FieldMemOperand(t0, FixedArray::kHeaderSize + 1 * kPointerSize));
1805 1798
1806 // Copy the parameter slots and the holes in the arguments. 1799 // Copy the parameter slots and the holes in the arguments.
1807 // We need to fill in mapped_parameter_count slots. They index the context, 1800 // We need to fill in mapped_parameter_count slots. They index the context,
1808 // where parameters are stored in reverse order, at 1801 // where parameters are stored in reverse order, at
1809 // MIN_CONTEXT_SLOTS .. MIN_CONTEXT_SLOTS+parameter_count-1 1802 // MIN_CONTEXT_SLOTS .. MIN_CONTEXT_SLOTS+parameter_count-1
1810 // The mapped parameter thus need to get indices 1803 // The mapped parameter thus need to get indices
1811 // MIN_CONTEXT_SLOTS+parameter_count-1 .. 1804 // MIN_CONTEXT_SLOTS+parameter_count-1 ..
1812 // MIN_CONTEXT_SLOTS+parameter_count-mapped_parameter_count 1805 // MIN_CONTEXT_SLOTS+parameter_count-mapped_parameter_count
1813 // We loop from right to left. 1806 // We loop from right to left.
1814 Label parameters_loop, parameters_test; 1807 Label parameters_loop, parameters_test;
1815 __ mov(t1, t2); 1808 __ mov(t1, t2);
1816 __ Addu(t5, a2, Operand(Smi::FromInt(Context::MIN_CONTEXT_SLOTS))); 1809 __ Addu(t5, a2, Operand(Smi::FromInt(Context::MIN_CONTEXT_SLOTS)));
1817 __ Subu(t5, t5, Operand(t2)); 1810 __ Subu(t5, t5, Operand(t2));
1818 __ LoadRoot(t3, Heap::kTheHoleValueRootIndex); 1811 __ LoadRoot(t3, Heap::kTheHoleValueRootIndex);
1819 __ sll(t6, t1, 1); 1812 __ Lsa(a1, t0, t1, 1);
1820 __ Addu(a1, t0, Operand(t6));
1821 __ Addu(a1, a1, Operand(kParameterMapHeaderSize)); 1813 __ Addu(a1, a1, Operand(kParameterMapHeaderSize));
1822 1814
1823 // a1 = address of backing store (tagged) 1815 // a1 = address of backing store (tagged)
1824 // t0 = address of parameter map (tagged) 1816 // t0 = address of parameter map (tagged)
1825 // a0 = temporary scratch (a.o., for address calculation) 1817 // a0 = temporary scratch (a.o., for address calculation)
1826 // t1 = loop variable (tagged) 1818 // t1 = loop variable (tagged)
1827 // t3 = the hole value 1819 // t3 = the hole value
1828 __ jmp(&parameters_test); 1820 __ jmp(&parameters_test);
1829 1821
1830 __ bind(&parameters_loop); 1822 __ bind(&parameters_loop);
(...skipping 24 matching lines...) Expand all
1855 __ sw(t1, FieldMemOperand(a1, FixedArray::kLengthOffset)); 1847 __ sw(t1, FieldMemOperand(a1, FixedArray::kLengthOffset));
1856 1848
1857 Label arguments_loop, arguments_test; 1849 Label arguments_loop, arguments_test;
1858 __ sll(t6, t2, 1); 1850 __ sll(t6, t2, 1);
1859 __ Subu(a3, a3, Operand(t6)); 1851 __ Subu(a3, a3, Operand(t6));
1860 __ jmp(&arguments_test); 1852 __ jmp(&arguments_test);
1861 1853
1862 __ bind(&arguments_loop); 1854 __ bind(&arguments_loop);
1863 __ Subu(a3, a3, Operand(kPointerSize)); 1855 __ Subu(a3, a3, Operand(kPointerSize));
1864 __ lw(t0, MemOperand(a3, 0)); 1856 __ lw(t0, MemOperand(a3, 0));
1865 __ sll(t6, t2, 1); 1857 __ Lsa(t5, a1, t2, 1);
1866 __ Addu(t5, a1, Operand(t6));
1867 __ sw(t0, FieldMemOperand(t5, FixedArray::kHeaderSize)); 1858 __ sw(t0, FieldMemOperand(t5, FixedArray::kHeaderSize));
1868 __ Addu(t2, t2, Operand(Smi::FromInt(1))); 1859 __ Addu(t2, t2, Operand(Smi::FromInt(1)));
1869 1860
1870 __ bind(&arguments_test); 1861 __ bind(&arguments_test);
1871 __ Branch(&arguments_loop, lt, t2, Operand(t1)); 1862 __ Branch(&arguments_loop, lt, t2, Operand(t1));
1872 1863
1873 // Return. 1864 // Return.
1874 __ Ret(); 1865 __ Ret();
1875 1866
1876 // Do the runtime call to allocate the arguments object. 1867 // Do the runtime call to allocate the arguments object.
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1915 1906
1916 // Check if the calling frame is an arguments adaptor frame. 1907 // Check if the calling frame is an arguments adaptor frame.
1917 Label try_allocate, runtime; 1908 Label try_allocate, runtime;
1918 __ lw(t0, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); 1909 __ lw(t0, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
1919 __ lw(a0, MemOperand(t0, StandardFrameConstants::kContextOffset)); 1910 __ lw(a0, MemOperand(t0, StandardFrameConstants::kContextOffset));
1920 __ Branch(&try_allocate, ne, a0, 1911 __ Branch(&try_allocate, ne, a0,
1921 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); 1912 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
1922 1913
1923 // Patch the arguments.length and the parameters pointer. 1914 // Patch the arguments.length and the parameters pointer.
1924 __ lw(a2, MemOperand(t0, ArgumentsAdaptorFrameConstants::kLengthOffset)); 1915 __ lw(a2, MemOperand(t0, ArgumentsAdaptorFrameConstants::kLengthOffset));
1925 __ sll(at, a2, kPointerSizeLog2 - kSmiTagSize); 1916 __ Lsa(t0, t0, a2, kPointerSizeLog2 - kSmiTagSize);
1926 __ Addu(t0, t0, Operand(at));
1927 __ Addu(a3, t0, Operand(StandardFrameConstants::kCallerSPOffset)); 1917 __ Addu(a3, t0, Operand(StandardFrameConstants::kCallerSPOffset));
1928 1918
1929 // Try the new space allocation. Start out with computing the size 1919 // Try the new space allocation. Start out with computing the size
1930 // of the arguments object and the elements array in words. 1920 // of the arguments object and the elements array in words.
1931 Label add_arguments_object; 1921 Label add_arguments_object;
1932 __ bind(&try_allocate); 1922 __ bind(&try_allocate);
1933 __ SmiUntag(t5, a2); 1923 __ SmiUntag(t5, a2);
1934 __ Branch(&add_arguments_object, eq, a2, Operand(zero_reg)); 1924 __ Branch(&add_arguments_object, eq, a2, Operand(zero_reg));
1935 1925
1936 __ Addu(t5, t5, Operand(FixedArray::kHeaderSize / kPointerSize)); 1926 __ Addu(t5, t5, Operand(FixedArray::kHeaderSize / kPointerSize));
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2001 // Check if the calling frame is an arguments adaptor frame. 1991 // Check if the calling frame is an arguments adaptor frame.
2002 1992
2003 Label runtime; 1993 Label runtime;
2004 __ lw(t0, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); 1994 __ lw(t0, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
2005 __ lw(t1, MemOperand(t0, StandardFrameConstants::kContextOffset)); 1995 __ lw(t1, MemOperand(t0, StandardFrameConstants::kContextOffset));
2006 __ Branch(&runtime, ne, t1, 1996 __ Branch(&runtime, ne, t1,
2007 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); 1997 Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
2008 1998
2009 // Patch the arguments.length and the parameters pointer. 1999 // Patch the arguments.length and the parameters pointer.
2010 __ lw(a2, MemOperand(t0, ArgumentsAdaptorFrameConstants::kLengthOffset)); 2000 __ lw(a2, MemOperand(t0, ArgumentsAdaptorFrameConstants::kLengthOffset));
2011 __ sll(t1, a2, kPointerSizeLog2 - kSmiTagSize); 2001 __ Lsa(a3, t0, a2, kPointerSizeLog2 - kSmiTagSize);
2012 __ Addu(a3, t0, Operand(t1));
2013 __ Addu(a3, a3, Operand(StandardFrameConstants::kCallerSPOffset)); 2002 __ Addu(a3, a3, Operand(StandardFrameConstants::kCallerSPOffset));
2014 2003
2015 // Do the runtime call to allocate the arguments object. 2004 // Do the runtime call to allocate the arguments object.
2016 __ bind(&runtime); 2005 __ bind(&runtime);
2017 __ Push(a2, a3, a1); 2006 __ Push(a2, a3, a1);
2018 __ TailCallRuntime(Runtime::kNewRestParam); 2007 __ TailCallRuntime(Runtime::kNewRestParam);
2019 } 2008 }
2020 2009
2021 2010
2022 void RegExpExecStub::Generate(MacroAssembler* masm) { 2011 void RegExpExecStub::Generate(MacroAssembler* masm) {
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after
2482 // a2 : feedback vector 2471 // a2 : feedback vector
2483 // a3 : slot in feedback vector (Smi) 2472 // a3 : slot in feedback vector (Smi)
2484 Label initialize, done, miss, megamorphic, not_array_function; 2473 Label initialize, done, miss, megamorphic, not_array_function;
2485 2474
2486 DCHECK_EQ(*TypeFeedbackVector::MegamorphicSentinel(masm->isolate()), 2475 DCHECK_EQ(*TypeFeedbackVector::MegamorphicSentinel(masm->isolate()),
2487 masm->isolate()->heap()->megamorphic_symbol()); 2476 masm->isolate()->heap()->megamorphic_symbol());
2488 DCHECK_EQ(*TypeFeedbackVector::UninitializedSentinel(masm->isolate()), 2477 DCHECK_EQ(*TypeFeedbackVector::UninitializedSentinel(masm->isolate()),
2489 masm->isolate()->heap()->uninitialized_symbol()); 2478 masm->isolate()->heap()->uninitialized_symbol());
2490 2479
2491 // Load the cache state into t2. 2480 // Load the cache state into t2.
2492 __ sll(t2, a3, kPointerSizeLog2 - kSmiTagSize); 2481 __ Lsa(t2, a2, a3, kPointerSizeLog2 - kSmiTagSize);
2493 __ Addu(t2, a2, Operand(t2));
2494 __ lw(t2, FieldMemOperand(t2, FixedArray::kHeaderSize)); 2482 __ lw(t2, FieldMemOperand(t2, FixedArray::kHeaderSize));
2495 2483
2496 // A monomorphic cache hit or an already megamorphic state: invoke the 2484 // A monomorphic cache hit or an already megamorphic state: invoke the
2497 // function without changing the state. 2485 // function without changing the state.
2498 // We don't know if t2 is a WeakCell or a Symbol, but it's harmless to read at 2486 // We don't know if t2 is a WeakCell or a Symbol, but it's harmless to read at
2499 // this position in a symbol (see static asserts in type-feedback-vector.h). 2487 // this position in a symbol (see static asserts in type-feedback-vector.h).
2500 Label check_allocation_site; 2488 Label check_allocation_site;
2501 Register feedback_map = t1; 2489 Register feedback_map = t1;
2502 Register weak_value = t4; 2490 Register weak_value = t4;
2503 __ lw(weak_value, FieldMemOperand(t2, WeakCell::kValueOffset)); 2491 __ lw(weak_value, FieldMemOperand(t2, WeakCell::kValueOffset));
(...skipping 23 matching lines...) Expand all
2527 2515
2528 __ bind(&miss); 2516 __ bind(&miss);
2529 2517
2530 // A monomorphic miss (i.e, here the cache is not uninitialized) goes 2518 // A monomorphic miss (i.e, here the cache is not uninitialized) goes
2531 // megamorphic. 2519 // megamorphic.
2532 __ LoadRoot(at, Heap::kuninitialized_symbolRootIndex); 2520 __ LoadRoot(at, Heap::kuninitialized_symbolRootIndex);
2533 __ Branch(&initialize, eq, t2, Operand(at)); 2521 __ Branch(&initialize, eq, t2, Operand(at));
2534 // MegamorphicSentinel is an immortal immovable object (undefined) so no 2522 // MegamorphicSentinel is an immortal immovable object (undefined) so no
2535 // write-barrier is needed. 2523 // write-barrier is needed.
2536 __ bind(&megamorphic); 2524 __ bind(&megamorphic);
2537 __ sll(t2, a3, kPointerSizeLog2 - kSmiTagSize); 2525 __ Lsa(t2, a2, a3, kPointerSizeLog2 - kSmiTagSize);
2538 __ Addu(t2, a2, Operand(t2));
2539 __ LoadRoot(at, Heap::kmegamorphic_symbolRootIndex); 2526 __ LoadRoot(at, Heap::kmegamorphic_symbolRootIndex);
2540 __ sw(at, FieldMemOperand(t2, FixedArray::kHeaderSize)); 2527 __ sw(at, FieldMemOperand(t2, FixedArray::kHeaderSize));
2541 __ jmp(&done); 2528 __ jmp(&done);
2542 2529
2543 // An uninitialized cache is patched with the function. 2530 // An uninitialized cache is patched with the function.
2544 __ bind(&initialize); 2531 __ bind(&initialize);
2545 // Make sure the function is the Array() function. 2532 // Make sure the function is the Array() function.
2546 __ LoadNativeContextSlot(Context::ARRAY_FUNCTION_INDEX, t2); 2533 __ LoadNativeContextSlot(Context::ARRAY_FUNCTION_INDEX, t2);
2547 __ Branch(&not_array_function, ne, a1, Operand(t2)); 2534 __ Branch(&not_array_function, ne, a1, Operand(t2));
2548 2535
(...skipping 19 matching lines...) Expand all
2568 2555
2569 Label non_function; 2556 Label non_function;
2570 // Check that the function is not a smi. 2557 // Check that the function is not a smi.
2571 __ JumpIfSmi(a1, &non_function); 2558 __ JumpIfSmi(a1, &non_function);
2572 // Check that the function is a JSFunction. 2559 // Check that the function is a JSFunction.
2573 __ GetObjectType(a1, t1, t1); 2560 __ GetObjectType(a1, t1, t1);
2574 __ Branch(&non_function, ne, t1, Operand(JS_FUNCTION_TYPE)); 2561 __ Branch(&non_function, ne, t1, Operand(JS_FUNCTION_TYPE));
2575 2562
2576 GenerateRecordCallTarget(masm); 2563 GenerateRecordCallTarget(masm);
2577 2564
2578 __ sll(at, a3, kPointerSizeLog2 - kSmiTagSize); 2565 __ Lsa(t1, a2, a3, kPointerSizeLog2 - kSmiTagSize);
2579 __ Addu(t1, a2, at);
2580 Label feedback_register_initialized; 2566 Label feedback_register_initialized;
2581 // Put the AllocationSite from the feedback vector into a2, or undefined. 2567 // Put the AllocationSite from the feedback vector into a2, or undefined.
2582 __ lw(a2, FieldMemOperand(t1, FixedArray::kHeaderSize)); 2568 __ lw(a2, FieldMemOperand(t1, FixedArray::kHeaderSize));
2583 __ lw(t1, FieldMemOperand(a2, AllocationSite::kMapOffset)); 2569 __ lw(t1, FieldMemOperand(a2, AllocationSite::kMapOffset));
2584 __ LoadRoot(at, Heap::kAllocationSiteMapRootIndex); 2570 __ LoadRoot(at, Heap::kAllocationSiteMapRootIndex);
2585 __ Branch(&feedback_register_initialized, eq, t1, Operand(at)); 2571 __ Branch(&feedback_register_initialized, eq, t1, Operand(at));
2586 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex); 2572 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex);
2587 __ bind(&feedback_register_initialized); 2573 __ bind(&feedback_register_initialized);
2588 2574
2589 __ AssertUndefinedOrAllocationSite(a2, t1); 2575 __ AssertUndefinedOrAllocationSite(a2, t1);
(...skipping 18 matching lines...) Expand all
2608 // a1 - function 2594 // a1 - function
2609 // a3 - slot id 2595 // a3 - slot id
2610 // a2 - vector 2596 // a2 - vector
2611 // t0 - loaded from vector[slot] 2597 // t0 - loaded from vector[slot]
2612 __ LoadNativeContextSlot(Context::ARRAY_FUNCTION_INDEX, at); 2598 __ LoadNativeContextSlot(Context::ARRAY_FUNCTION_INDEX, at);
2613 __ Branch(miss, ne, a1, Operand(at)); 2599 __ Branch(miss, ne, a1, Operand(at));
2614 2600
2615 __ li(a0, Operand(arg_count())); 2601 __ li(a0, Operand(arg_count()));
2616 2602
2617 // Increment the call count for monomorphic function calls. 2603 // Increment the call count for monomorphic function calls.
2618 __ sll(at, a3, kPointerSizeLog2 - kSmiTagSize); 2604 __ Lsa(at, a2, a3, kPointerSizeLog2 - kSmiTagSize);
2619 __ Addu(at, a2, Operand(at));
2620 __ lw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); 2605 __ lw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize));
2621 __ Addu(a3, a3, Operand(Smi::FromInt(CallICNexus::kCallCountIncrement))); 2606 __ Addu(a3, a3, Operand(Smi::FromInt(CallICNexus::kCallCountIncrement)));
2622 __ sw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); 2607 __ sw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize));
2623 2608
2624 __ mov(a2, t0); 2609 __ mov(a2, t0);
2625 __ mov(a3, a1); 2610 __ mov(a3, a1);
2626 ArrayConstructorStub stub(masm->isolate(), arg_count()); 2611 ArrayConstructorStub stub(masm->isolate(), arg_count());
2627 __ TailCallStub(&stub); 2612 __ TailCallStub(&stub);
2628 } 2613 }
2629 2614
2630 2615
2631 void CallICStub::Generate(MacroAssembler* masm) { 2616 void CallICStub::Generate(MacroAssembler* masm) {
2632 // a1 - function 2617 // a1 - function
2633 // a3 - slot id (Smi) 2618 // a3 - slot id (Smi)
2634 // a2 - vector 2619 // a2 - vector
2635 Label extra_checks_or_miss, call, call_function; 2620 Label extra_checks_or_miss, call, call_function;
2636 int argc = arg_count(); 2621 int argc = arg_count();
2637 ParameterCount actual(argc); 2622 ParameterCount actual(argc);
2638 2623
2639 // The checks. First, does r1 match the recorded monomorphic target? 2624 // The checks. First, does r1 match the recorded monomorphic target?
2640 __ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize); 2625 __ Lsa(t0, a2, a3, kPointerSizeLog2 - kSmiTagSize);
2641 __ Addu(t0, a2, Operand(t0));
2642 __ lw(t0, FieldMemOperand(t0, FixedArray::kHeaderSize)); 2626 __ lw(t0, FieldMemOperand(t0, FixedArray::kHeaderSize));
2643 2627
2644 // We don't know that we have a weak cell. We might have a private symbol 2628 // We don't know that we have a weak cell. We might have a private symbol
2645 // or an AllocationSite, but the memory is safe to examine. 2629 // or an AllocationSite, but the memory is safe to examine.
2646 // AllocationSite::kTransitionInfoOffset - contains a Smi or pointer to 2630 // AllocationSite::kTransitionInfoOffset - contains a Smi or pointer to
2647 // FixedArray. 2631 // FixedArray.
2648 // WeakCell::kValueOffset - contains a JSFunction or Smi(0) 2632 // WeakCell::kValueOffset - contains a JSFunction or Smi(0)
2649 // Symbol::kHashFieldSlot - if the low bit is 1, then the hash is not 2633 // Symbol::kHashFieldSlot - if the low bit is 1, then the hash is not
2650 // computed, meaning that it can't appear to be a pointer. If the low bit is 2634 // computed, meaning that it can't appear to be a pointer. If the low bit is
2651 // 0, then hash is computed, but the 0 bit prevents the field from appearing 2635 // 0, then hash is computed, but the 0 bit prevents the field from appearing
2652 // to be a pointer. 2636 // to be a pointer.
2653 STATIC_ASSERT(WeakCell::kSize >= kPointerSize); 2637 STATIC_ASSERT(WeakCell::kSize >= kPointerSize);
2654 STATIC_ASSERT(AllocationSite::kTransitionInfoOffset == 2638 STATIC_ASSERT(AllocationSite::kTransitionInfoOffset ==
2655 WeakCell::kValueOffset && 2639 WeakCell::kValueOffset &&
2656 WeakCell::kValueOffset == Symbol::kHashFieldSlot); 2640 WeakCell::kValueOffset == Symbol::kHashFieldSlot);
2657 2641
2658 __ lw(t1, FieldMemOperand(t0, WeakCell::kValueOffset)); 2642 __ lw(t1, FieldMemOperand(t0, WeakCell::kValueOffset));
2659 __ Branch(&extra_checks_or_miss, ne, a1, Operand(t1)); 2643 __ Branch(&extra_checks_or_miss, ne, a1, Operand(t1));
2660 2644
2661 // The compare above could have been a SMI/SMI comparison. Guard against this 2645 // The compare above could have been a SMI/SMI comparison. Guard against this
2662 // convincing us that we have a monomorphic JSFunction. 2646 // convincing us that we have a monomorphic JSFunction.
2663 __ JumpIfSmi(a1, &extra_checks_or_miss); 2647 __ JumpIfSmi(a1, &extra_checks_or_miss);
2664 2648
2665 // Increment the call count for monomorphic function calls. 2649 // Increment the call count for monomorphic function calls.
2666 __ sll(at, a3, kPointerSizeLog2 - kSmiTagSize); 2650 __ Lsa(at, a2, a3, kPointerSizeLog2 - kSmiTagSize);
2667 __ Addu(at, a2, Operand(at));
2668 __ lw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); 2651 __ lw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize));
2669 __ Addu(a3, a3, Operand(Smi::FromInt(CallICNexus::kCallCountIncrement))); 2652 __ Addu(a3, a3, Operand(Smi::FromInt(CallICNexus::kCallCountIncrement)));
2670 __ sw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); 2653 __ sw(a3, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize));
2671 2654
2672 __ bind(&call_function); 2655 __ bind(&call_function);
2673 __ Jump(masm->isolate()->builtins()->CallFunction(convert_mode()), 2656 __ Jump(masm->isolate()->builtins()->CallFunction(convert_mode()),
2674 RelocInfo::CODE_TARGET, al, zero_reg, Operand(zero_reg), 2657 RelocInfo::CODE_TARGET, al, zero_reg, Operand(zero_reg),
2675 USE_DELAY_SLOT); 2658 USE_DELAY_SLOT);
2676 __ li(a0, Operand(argc)); // In delay slot. 2659 __ li(a0, Operand(argc)); // In delay slot.
2677 2660
(...skipping 19 matching lines...) Expand all
2697 } 2680 }
2698 2681
2699 __ LoadRoot(at, Heap::kuninitialized_symbolRootIndex); 2682 __ LoadRoot(at, Heap::kuninitialized_symbolRootIndex);
2700 __ Branch(&uninitialized, eq, t0, Operand(at)); 2683 __ Branch(&uninitialized, eq, t0, Operand(at));
2701 2684
2702 // We are going megamorphic. If the feedback is a JSFunction, it is fine 2685 // We are going megamorphic. If the feedback is a JSFunction, it is fine
2703 // to handle it here. More complex cases are dealt with in the runtime. 2686 // to handle it here. More complex cases are dealt with in the runtime.
2704 __ AssertNotSmi(t0); 2687 __ AssertNotSmi(t0);
2705 __ GetObjectType(t0, t1, t1); 2688 __ GetObjectType(t0, t1, t1);
2706 __ Branch(&miss, ne, t1, Operand(JS_FUNCTION_TYPE)); 2689 __ Branch(&miss, ne, t1, Operand(JS_FUNCTION_TYPE));
2707 __ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize); 2690 __ Lsa(t0, a2, a3, kPointerSizeLog2 - kSmiTagSize);
2708 __ Addu(t0, a2, Operand(t0));
2709 __ LoadRoot(at, Heap::kmegamorphic_symbolRootIndex); 2691 __ LoadRoot(at, Heap::kmegamorphic_symbolRootIndex);
2710 __ sw(at, FieldMemOperand(t0, FixedArray::kHeaderSize)); 2692 __ sw(at, FieldMemOperand(t0, FixedArray::kHeaderSize));
2711 2693
2712 __ bind(&call); 2694 __ bind(&call);
2713 __ Jump(masm->isolate()->builtins()->Call(convert_mode()), 2695 __ Jump(masm->isolate()->builtins()->Call(convert_mode()),
2714 RelocInfo::CODE_TARGET, al, zero_reg, Operand(zero_reg), 2696 RelocInfo::CODE_TARGET, al, zero_reg, Operand(zero_reg),
2715 USE_DELAY_SLOT); 2697 USE_DELAY_SLOT);
2716 __ li(a0, Operand(argc)); // In delay slot. 2698 __ li(a0, Operand(argc)); // In delay slot.
2717 2699
2718 __ bind(&uninitialized); 2700 __ bind(&uninitialized);
(...skipping 10 matching lines...) Expand all
2729 __ LoadNativeContextSlot(Context::ARRAY_FUNCTION_INDEX, t0); 2711 __ LoadNativeContextSlot(Context::ARRAY_FUNCTION_INDEX, t0);
2730 __ Branch(&miss, eq, a1, Operand(t0)); 2712 __ Branch(&miss, eq, a1, Operand(t0));
2731 2713
2732 // Make sure the function belongs to the same native context. 2714 // Make sure the function belongs to the same native context.
2733 __ lw(t0, FieldMemOperand(a1, JSFunction::kContextOffset)); 2715 __ lw(t0, FieldMemOperand(a1, JSFunction::kContextOffset));
2734 __ lw(t0, ContextMemOperand(t0, Context::NATIVE_CONTEXT_INDEX)); 2716 __ lw(t0, ContextMemOperand(t0, Context::NATIVE_CONTEXT_INDEX));
2735 __ lw(t1, NativeContextMemOperand()); 2717 __ lw(t1, NativeContextMemOperand());
2736 __ Branch(&miss, ne, t0, Operand(t1)); 2718 __ Branch(&miss, ne, t0, Operand(t1));
2737 2719
2738 // Initialize the call counter. 2720 // Initialize the call counter.
2739 __ sll(at, a3, kPointerSizeLog2 - kSmiTagSize); 2721 __ Lsa(at, a2, a3, kPointerSizeLog2 - kSmiTagSize);
2740 __ Addu(at, a2, Operand(at));
2741 __ li(t0, Operand(Smi::FromInt(CallICNexus::kCallCountIncrement))); 2722 __ li(t0, Operand(Smi::FromInt(CallICNexus::kCallCountIncrement)));
2742 __ sw(t0, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize)); 2723 __ sw(t0, FieldMemOperand(at, FixedArray::kHeaderSize + kPointerSize));
2743 2724
2744 // Store the function. Use a stub since we need a frame for allocation. 2725 // Store the function. Use a stub since we need a frame for allocation.
2745 // a2 - vector 2726 // a2 - vector
2746 // a3 - slot 2727 // a3 - slot
2747 // a1 - function 2728 // a1 - function
2748 { 2729 {
2749 FrameScope scope(masm, StackFrame::INTERNAL); 2730 FrameScope scope(masm, StackFrame::INTERNAL);
2750 CreateWeakCellStub create_stub(masm->isolate()); 2731 CreateWeakCellStub create_stub(masm->isolate());
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
2894 STATIC_ASSERT(kSmiTag == 0); 2875 STATIC_ASSERT(kSmiTag == 0);
2895 STATIC_ASSERT(kSmiShiftSize == 0); 2876 STATIC_ASSERT(kSmiShiftSize == 0);
2896 DCHECK(base::bits::IsPowerOfTwo32(String::kMaxOneByteCharCodeU + 1)); 2877 DCHECK(base::bits::IsPowerOfTwo32(String::kMaxOneByteCharCodeU + 1));
2897 __ And(t0, code_, Operand(kSmiTagMask | 2878 __ And(t0, code_, Operand(kSmiTagMask |
2898 ((~String::kMaxOneByteCharCodeU) << kSmiTagSize))); 2879 ((~String::kMaxOneByteCharCodeU) << kSmiTagSize)));
2899 __ Branch(&slow_case_, ne, t0, Operand(zero_reg)); 2880 __ Branch(&slow_case_, ne, t0, Operand(zero_reg));
2900 2881
2901 __ LoadRoot(result_, Heap::kSingleCharacterStringCacheRootIndex); 2882 __ LoadRoot(result_, Heap::kSingleCharacterStringCacheRootIndex);
2902 // At this point code register contains smi tagged one-byte char code. 2883 // At this point code register contains smi tagged one-byte char code.
2903 STATIC_ASSERT(kSmiTag == 0); 2884 STATIC_ASSERT(kSmiTag == 0);
2904 __ sll(t0, code_, kPointerSizeLog2 - kSmiTagSize); 2885 __ Lsa(result_, result_, code_, kPointerSizeLog2 - kSmiTagSize);
2905 __ Addu(result_, result_, t0);
2906 __ lw(result_, FieldMemOperand(result_, FixedArray::kHeaderSize)); 2886 __ lw(result_, FieldMemOperand(result_, FixedArray::kHeaderSize));
2907 __ LoadRoot(t0, Heap::kUndefinedValueRootIndex); 2887 __ LoadRoot(t0, Heap::kUndefinedValueRootIndex);
2908 __ Branch(&slow_case_, eq, result_, Operand(t0)); 2888 __ Branch(&slow_case_, eq, result_, Operand(t0));
2909 __ bind(&exit_); 2889 __ bind(&exit_);
2910 } 2890 }
2911 2891
2912 2892
2913 void StringCharFromCodeGenerator::GenerateSlow( 2893 void StringCharFromCodeGenerator::GenerateSlow(
2914 MacroAssembler* masm, 2894 MacroAssembler* masm,
2915 const RuntimeCallHelper& call_helper) { 2895 const RuntimeCallHelper& call_helper) {
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
3152 StringHelper::GenerateCopyCharacters( 3132 StringHelper::GenerateCopyCharacters(
3153 masm, a1, t1, a2, a3, String::ONE_BYTE_ENCODING); 3133 masm, a1, t1, a2, a3, String::ONE_BYTE_ENCODING);
3154 __ jmp(&return_v0); 3134 __ jmp(&return_v0);
3155 3135
3156 // Allocate and copy the resulting two-byte string. 3136 // Allocate and copy the resulting two-byte string.
3157 __ bind(&two_byte_sequential); 3137 __ bind(&two_byte_sequential);
3158 __ AllocateTwoByteString(v0, a2, t0, t2, t3, &runtime); 3138 __ AllocateTwoByteString(v0, a2, t0, t2, t3, &runtime);
3159 3139
3160 // Locate first character of substring to copy. 3140 // Locate first character of substring to copy.
3161 STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0); 3141 STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0);
3162 __ sll(t0, a3, 1); 3142 __ Lsa(t1, t1, a3, 1);
3163 __ Addu(t1, t1, t0);
3164 // Locate first character of result. 3143 // Locate first character of result.
3165 __ Addu(a1, v0, Operand(SeqTwoByteString::kHeaderSize - kHeapObjectTag)); 3144 __ Addu(a1, v0, Operand(SeqTwoByteString::kHeaderSize - kHeapObjectTag));
3166 3145
3167 // v0: result string. 3146 // v0: result string.
3168 // a1: first character of result. 3147 // a1: first character of result.
3169 // a2: result length. 3148 // a2: result length.
3170 // t1: first character of substring to copy. 3149 // t1: first character of substring to copy.
3171 STATIC_ASSERT((SeqTwoByteString::kHeaderSize & kObjectAlignmentMask) == 0); 3150 STATIC_ASSERT((SeqTwoByteString::kHeaderSize & kObjectAlignmentMask) == 0);
3172 StringHelper::GenerateCopyCharacters( 3151 StringHelper::GenerateCopyCharacters(
3173 masm, a1, t1, a2, a3, String::TWO_BYTE_ENCODING); 3152 masm, a1, t1, a2, a3, String::TWO_BYTE_ENCODING);
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after
3888 // Compute the masked index: (hash + i + i * i) & mask. 3867 // Compute the masked index: (hash + i + i * i) & mask.
3889 Register index = scratch0; 3868 Register index = scratch0;
3890 // Capacity is smi 2^n. 3869 // Capacity is smi 2^n.
3891 __ lw(index, FieldMemOperand(properties, kCapacityOffset)); 3870 __ lw(index, FieldMemOperand(properties, kCapacityOffset));
3892 __ Subu(index, index, Operand(1)); 3871 __ Subu(index, index, Operand(1));
3893 __ And(index, index, Operand( 3872 __ And(index, index, Operand(
3894 Smi::FromInt(name->Hash() + NameDictionary::GetProbeOffset(i)))); 3873 Smi::FromInt(name->Hash() + NameDictionary::GetProbeOffset(i))));
3895 3874
3896 // Scale the index by multiplying by the entry size. 3875 // Scale the index by multiplying by the entry size.
3897 STATIC_ASSERT(NameDictionary::kEntrySize == 3); 3876 STATIC_ASSERT(NameDictionary::kEntrySize == 3);
3898 __ sll(at, index, 1); 3877 __ Lsa(index, index, index, 1);
3899 __ Addu(index, index, at);
3900 3878
3901 Register entity_name = scratch0; 3879 Register entity_name = scratch0;
3902 // Having undefined at this place means the name is not contained. 3880 // Having undefined at this place means the name is not contained.
3903 STATIC_ASSERT(kSmiTagSize == 1); 3881 STATIC_ASSERT(kSmiTagSize == 1);
3904 Register tmp = properties; 3882 Register tmp = properties;
3905 __ sll(scratch0, index, 1); 3883 __ Lsa(tmp, properties, index, 1);
3906 __ Addu(tmp, properties, scratch0);
3907 __ lw(entity_name, FieldMemOperand(tmp, kElementsStartOffset)); 3884 __ lw(entity_name, FieldMemOperand(tmp, kElementsStartOffset));
3908 3885
3909 DCHECK(!tmp.is(entity_name)); 3886 DCHECK(!tmp.is(entity_name));
3910 __ LoadRoot(tmp, Heap::kUndefinedValueRootIndex); 3887 __ LoadRoot(tmp, Heap::kUndefinedValueRootIndex);
3911 __ Branch(done, eq, entity_name, Operand(tmp)); 3888 __ Branch(done, eq, entity_name, Operand(tmp));
3912 3889
3913 // Load the hole ready for use below: 3890 // Load the hole ready for use below:
3914 __ LoadRoot(tmp, Heap::kTheHoleValueRootIndex); 3891 __ LoadRoot(tmp, Heap::kTheHoleValueRootIndex);
3915 3892
3916 // Stop if found the property. 3893 // Stop if found the property.
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
3986 __ Addu(scratch2, scratch2, Operand( 3963 __ Addu(scratch2, scratch2, Operand(
3987 NameDictionary::GetProbeOffset(i) << Name::kHashShift)); 3964 NameDictionary::GetProbeOffset(i) << Name::kHashShift));
3988 } 3965 }
3989 __ srl(scratch2, scratch2, Name::kHashShift); 3966 __ srl(scratch2, scratch2, Name::kHashShift);
3990 __ And(scratch2, scratch1, scratch2); 3967 __ And(scratch2, scratch1, scratch2);
3991 3968
3992 // Scale the index by multiplying by the element size. 3969 // Scale the index by multiplying by the element size.
3993 STATIC_ASSERT(NameDictionary::kEntrySize == 3); 3970 STATIC_ASSERT(NameDictionary::kEntrySize == 3);
3994 // scratch2 = scratch2 * 3. 3971 // scratch2 = scratch2 * 3.
3995 3972
3996 __ sll(at, scratch2, 1); 3973 __ Lsa(scratch2, scratch2, scratch2, 1);
3997 __ Addu(scratch2, scratch2, at);
3998 3974
3999 // Check if the key is identical to the name. 3975 // Check if the key is identical to the name.
4000 __ sll(at, scratch2, 2); 3976 __ Lsa(scratch2, elements, scratch2, 2);
4001 __ Addu(scratch2, elements, at);
4002 __ lw(at, FieldMemOperand(scratch2, kElementsStartOffset)); 3977 __ lw(at, FieldMemOperand(scratch2, kElementsStartOffset));
4003 __ Branch(done, eq, name, Operand(at)); 3978 __ Branch(done, eq, name, Operand(at));
4004 } 3979 }
4005 3980
4006 const int spill_mask = 3981 const int spill_mask =
4007 (ra.bit() | t2.bit() | t1.bit() | t0.bit() | 3982 (ra.bit() | t2.bit() | t1.bit() | t0.bit() |
4008 a3.bit() | a2.bit() | a1.bit() | a0.bit() | v0.bit()) & 3983 a3.bit() | a2.bit() | a1.bit() | a0.bit() | v0.bit()) &
4009 ~(scratch1.bit() | scratch2.bit()); 3984 ~(scratch1.bit() | scratch2.bit());
4010 3985
4011 __ MultiPush(spill_mask); 3986 __ MultiPush(spill_mask);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
4073 } else { 4048 } else {
4074 __ mov(index, hash); 4049 __ mov(index, hash);
4075 } 4050 }
4076 __ srl(index, index, Name::kHashShift); 4051 __ srl(index, index, Name::kHashShift);
4077 __ And(index, mask, index); 4052 __ And(index, mask, index);
4078 4053
4079 // Scale the index by multiplying by the entry size. 4054 // Scale the index by multiplying by the entry size.
4080 STATIC_ASSERT(NameDictionary::kEntrySize == 3); 4055 STATIC_ASSERT(NameDictionary::kEntrySize == 3);
4081 // index *= 3. 4056 // index *= 3.
4082 __ mov(at, index); 4057 __ mov(at, index);
4083 __ sll(index, index, 1); 4058 __ Lsa(index, index, index, 1);
4084 __ Addu(index, index, at);
4085 4059
4086 4060
4087 STATIC_ASSERT(kSmiTagSize == 1); 4061 STATIC_ASSERT(kSmiTagSize == 1);
4088 __ sll(index, index, 2); 4062 __ Lsa(index, dictionary, index, 2);
4089 __ Addu(index, index, dictionary);
4090 __ lw(entry_key, FieldMemOperand(index, kElementsStartOffset)); 4063 __ lw(entry_key, FieldMemOperand(index, kElementsStartOffset));
4091 4064
4092 // Having undefined at this place means the name is not contained. 4065 // Having undefined at this place means the name is not contained.
4093 __ Branch(&not_in_dictionary, eq, entry_key, Operand(undefined)); 4066 __ Branch(&not_in_dictionary, eq, entry_key, Operand(undefined));
4094 4067
4095 // Stop if found the property. 4068 // Stop if found the property.
4096 __ Branch(&in_dictionary, eq, entry_key, Operand(key)); 4069 __ Branch(&in_dictionary, eq, entry_key, Operand(key));
4097 4070
4098 if (i != kTotalProbes - 1 && mode() == NEGATIVE_LOOKUP) { 4071 if (i != kTotalProbes - 1 && mode() == NEGATIVE_LOOKUP) {
4099 // Check if the entry name is not a unique name. 4072 // Check if the entry name is not a unique name.
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
4403 // +-----+------+------+-----+-----+ ... ----+ 4376 // +-----+------+------+-----+-----+ ... ----+
4404 // | map | len | wm0 | h0 | wm1 | hN | 4377 // | map | len | wm0 | h0 | wm1 | hN |
4405 // +-----+------+------+-----+-----+ ... ----+ 4378 // +-----+------+------+-----+-----+ ... ----+
4406 // 0 1 2 len-1 4379 // 0 1 2 len-1
4407 // ^ ^ 4380 // ^ ^
4408 // | | 4381 // | |
4409 // pointer_reg too_far 4382 // pointer_reg too_far
4410 // aka feedback scratch2 4383 // aka feedback scratch2
4411 // also need receiver_map 4384 // also need receiver_map
4412 // use cached_map (scratch1) to look in the weak map values. 4385 // use cached_map (scratch1) to look in the weak map values.
4413 __ sll(at, length, kPointerSizeLog2 - kSmiTagSize); 4386 __ Lsa(too_far, feedback, length, kPointerSizeLog2 - kSmiTagSize);
4414 __ Addu(too_far, feedback, Operand(at));
4415 __ Addu(too_far, too_far, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); 4387 __ Addu(too_far, too_far, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
4416 __ Addu(pointer_reg, feedback, 4388 __ Addu(pointer_reg, feedback,
4417 Operand(FixedArray::OffsetOfElementAt(2) - kHeapObjectTag)); 4389 Operand(FixedArray::OffsetOfElementAt(2) - kHeapObjectTag));
4418 4390
4419 __ bind(&next_loop); 4391 __ bind(&next_loop);
4420 __ lw(cached_map, MemOperand(pointer_reg)); 4392 __ lw(cached_map, MemOperand(pointer_reg));
4421 __ lw(cached_map, FieldMemOperand(cached_map, WeakCell::kValueOffset)); 4393 __ lw(cached_map, FieldMemOperand(cached_map, WeakCell::kValueOffset));
4422 __ Branch(&prepare_next, ne, receiver_map, Operand(cached_map)); 4394 __ Branch(&prepare_next, ne, receiver_map, Operand(cached_map));
4423 __ lw(handler, MemOperand(pointer_reg, kPointerSize)); 4395 __ lw(handler, MemOperand(pointer_reg, kPointerSize));
4424 __ Addu(t9, handler, Operand(Code::kHeaderSize - kHeapObjectTag)); 4396 __ Addu(t9, handler, Operand(Code::kHeaderSize - kHeapObjectTag));
(...skipping 15 matching lines...) Expand all
4440 Label* load_smi_map, Label* try_array) { 4412 Label* load_smi_map, Label* try_array) {
4441 __ JumpIfSmi(receiver, load_smi_map); 4413 __ JumpIfSmi(receiver, load_smi_map);
4442 __ lw(receiver_map, FieldMemOperand(receiver, HeapObject::kMapOffset)); 4414 __ lw(receiver_map, FieldMemOperand(receiver, HeapObject::kMapOffset));
4443 __ bind(compare_map); 4415 __ bind(compare_map);
4444 Register cached_map = scratch; 4416 Register cached_map = scratch;
4445 // Move the weak map into the weak_cell register. 4417 // Move the weak map into the weak_cell register.
4446 __ lw(cached_map, FieldMemOperand(feedback, WeakCell::kValueOffset)); 4418 __ lw(cached_map, FieldMemOperand(feedback, WeakCell::kValueOffset));
4447 __ Branch(try_array, ne, cached_map, Operand(receiver_map)); 4419 __ Branch(try_array, ne, cached_map, Operand(receiver_map));
4448 Register handler = feedback; 4420 Register handler = feedback;
4449 4421
4450 __ sll(at, slot, kPointerSizeLog2 - kSmiTagSize); 4422 __ Lsa(handler, vector, slot, kPointerSizeLog2 - kSmiTagSize);
4451 __ Addu(handler, vector, Operand(at));
4452 __ lw(handler, 4423 __ lw(handler,
4453 FieldMemOperand(handler, FixedArray::kHeaderSize + kPointerSize)); 4424 FieldMemOperand(handler, FixedArray::kHeaderSize + kPointerSize));
4454 __ Addu(t9, handler, Operand(Code::kHeaderSize - kHeapObjectTag)); 4425 __ Addu(t9, handler, Operand(Code::kHeaderSize - kHeapObjectTag));
4455 __ Jump(t9); 4426 __ Jump(t9);
4456 } 4427 }
4457 4428
4458 4429
4459 void LoadICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { 4430 void LoadICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) {
4460 Register receiver = LoadWithVectorDescriptor::ReceiverRegister(); // a1 4431 Register receiver = LoadWithVectorDescriptor::ReceiverRegister(); // a1
4461 Register name = LoadWithVectorDescriptor::NameRegister(); // a2 4432 Register name = LoadWithVectorDescriptor::NameRegister(); // a2
4462 Register vector = LoadWithVectorDescriptor::VectorRegister(); // a3 4433 Register vector = LoadWithVectorDescriptor::VectorRegister(); // a3
4463 Register slot = LoadWithVectorDescriptor::SlotRegister(); // a0 4434 Register slot = LoadWithVectorDescriptor::SlotRegister(); // a0
4464 Register feedback = t0; 4435 Register feedback = t0;
4465 Register receiver_map = t1; 4436 Register receiver_map = t1;
4466 Register scratch1 = t4; 4437 Register scratch1 = t4;
4467 4438
4468 __ sll(at, slot, kPointerSizeLog2 - kSmiTagSize); 4439 __ Lsa(feedback, vector, slot, kPointerSizeLog2 - kSmiTagSize);
4469 __ Addu(feedback, vector, Operand(at));
4470 __ lw(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize)); 4440 __ lw(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize));
4471 4441
4472 // Try to quickly handle the monomorphic case without knowing for sure 4442 // Try to quickly handle the monomorphic case without knowing for sure
4473 // if we have a weak cell in feedback. We do know it's safe to look 4443 // if we have a weak cell in feedback. We do know it's safe to look
4474 // at WeakCell::kValueOffset. 4444 // at WeakCell::kValueOffset.
4475 Label try_array, load_smi_map, compare_map; 4445 Label try_array, load_smi_map, compare_map;
4476 Label not_array, miss; 4446 Label not_array, miss;
4477 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot, 4447 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot,
4478 scratch1, &compare_map, &load_smi_map, &try_array); 4448 scratch1, &compare_map, &load_smi_map, &try_array);
4479 4449
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
4514 4484
4515 void KeyedLoadICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { 4485 void KeyedLoadICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) {
4516 Register receiver = LoadWithVectorDescriptor::ReceiverRegister(); // a1 4486 Register receiver = LoadWithVectorDescriptor::ReceiverRegister(); // a1
4517 Register key = LoadWithVectorDescriptor::NameRegister(); // a2 4487 Register key = LoadWithVectorDescriptor::NameRegister(); // a2
4518 Register vector = LoadWithVectorDescriptor::VectorRegister(); // a3 4488 Register vector = LoadWithVectorDescriptor::VectorRegister(); // a3
4519 Register slot = LoadWithVectorDescriptor::SlotRegister(); // a0 4489 Register slot = LoadWithVectorDescriptor::SlotRegister(); // a0
4520 Register feedback = t0; 4490 Register feedback = t0;
4521 Register receiver_map = t1; 4491 Register receiver_map = t1;
4522 Register scratch1 = t4; 4492 Register scratch1 = t4;
4523 4493
4524 __ sll(at, slot, kPointerSizeLog2 - kSmiTagSize); 4494 __ Lsa(feedback, vector, slot, kPointerSizeLog2 - kSmiTagSize);
4525 __ Addu(feedback, vector, Operand(at));
4526 __ lw(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize)); 4495 __ lw(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize));
4527 4496
4528 // Try to quickly handle the monomorphic case without knowing for sure 4497 // Try to quickly handle the monomorphic case without knowing for sure
4529 // if we have a weak cell in feedback. We do know it's safe to look 4498 // if we have a weak cell in feedback. We do know it's safe to look
4530 // at WeakCell::kValueOffset. 4499 // at WeakCell::kValueOffset.
4531 Label try_array, load_smi_map, compare_map; 4500 Label try_array, load_smi_map, compare_map;
4532 Label not_array, miss; 4501 Label not_array, miss;
4533 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot, 4502 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot,
4534 scratch1, &compare_map, &load_smi_map, &try_array); 4503 scratch1, &compare_map, &load_smi_map, &try_array);
4535 4504
(...skipping 15 matching lines...) Expand all
4551 __ Branch(&try_poly_name, ne, at, Operand(feedback)); 4520 __ Branch(&try_poly_name, ne, at, Operand(feedback));
4552 Handle<Code> megamorphic_stub = 4521 Handle<Code> megamorphic_stub =
4553 KeyedLoadIC::ChooseMegamorphicStub(masm->isolate(), GetExtraICState()); 4522 KeyedLoadIC::ChooseMegamorphicStub(masm->isolate(), GetExtraICState());
4554 __ Jump(megamorphic_stub, RelocInfo::CODE_TARGET); 4523 __ Jump(megamorphic_stub, RelocInfo::CODE_TARGET);
4555 4524
4556 __ bind(&try_poly_name); 4525 __ bind(&try_poly_name);
4557 // We might have a name in feedback, and a fixed array in the next slot. 4526 // We might have a name in feedback, and a fixed array in the next slot.
4558 __ Branch(&miss, ne, key, Operand(feedback)); 4527 __ Branch(&miss, ne, key, Operand(feedback));
4559 // If the name comparison succeeded, we know we have a fixed array with 4528 // If the name comparison succeeded, we know we have a fixed array with
4560 // at least one map/handler pair. 4529 // at least one map/handler pair.
4561 __ sll(at, slot, kPointerSizeLog2 - kSmiTagSize); 4530 __ Lsa(feedback, vector, slot, kPointerSizeLog2 - kSmiTagSize);
4562 __ Addu(feedback, vector, Operand(at));
4563 __ lw(feedback, 4531 __ lw(feedback,
4564 FieldMemOperand(feedback, FixedArray::kHeaderSize + kPointerSize)); 4532 FieldMemOperand(feedback, FixedArray::kHeaderSize + kPointerSize));
4565 HandleArrayCases(masm, feedback, receiver_map, scratch1, t5, false, &miss); 4533 HandleArrayCases(masm, feedback, receiver_map, scratch1, t5, false, &miss);
4566 4534
4567 __ bind(&miss); 4535 __ bind(&miss);
4568 KeyedLoadIC::GenerateMiss(masm); 4536 KeyedLoadIC::GenerateMiss(masm);
4569 4537
4570 __ bind(&load_smi_map); 4538 __ bind(&load_smi_map);
4571 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); 4539 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex);
4572 __ jmp(&compare_map); 4540 __ jmp(&compare_map);
(...skipping 27 matching lines...) Expand all
4600 void VectorStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { 4568 void VectorStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) {
4601 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // a1 4569 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // a1
4602 Register key = VectorStoreICDescriptor::NameRegister(); // a2 4570 Register key = VectorStoreICDescriptor::NameRegister(); // a2
4603 Register vector = VectorStoreICDescriptor::VectorRegister(); // a3 4571 Register vector = VectorStoreICDescriptor::VectorRegister(); // a3
4604 Register slot = VectorStoreICDescriptor::SlotRegister(); // t0 4572 Register slot = VectorStoreICDescriptor::SlotRegister(); // t0
4605 DCHECK(VectorStoreICDescriptor::ValueRegister().is(a0)); // a0 4573 DCHECK(VectorStoreICDescriptor::ValueRegister().is(a0)); // a0
4606 Register feedback = t1; 4574 Register feedback = t1;
4607 Register receiver_map = t2; 4575 Register receiver_map = t2;
4608 Register scratch1 = t5; 4576 Register scratch1 = t5;
4609 4577
4610 __ sll(scratch1, slot, kPointerSizeLog2 - kSmiTagSize); 4578 __ Lsa(feedback, vector, slot, kPointerSizeLog2 - kSmiTagSize);
4611 __ Addu(feedback, vector, Operand(scratch1));
4612 __ lw(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize)); 4579 __ lw(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize));
4613 4580
4614 // Try to quickly handle the monomorphic case without knowing for sure 4581 // Try to quickly handle the monomorphic case without knowing for sure
4615 // if we have a weak cell in feedback. We do know it's safe to look 4582 // if we have a weak cell in feedback. We do know it's safe to look
4616 // at WeakCell::kValueOffset. 4583 // at WeakCell::kValueOffset.
4617 Label try_array, load_smi_map, compare_map; 4584 Label try_array, load_smi_map, compare_map;
4618 Label not_array, miss; 4585 Label not_array, miss;
4619 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot, 4586 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot,
4620 scratch1, &compare_map, &load_smi_map, &try_array); 4587 scratch1, &compare_map, &load_smi_map, &try_array);
4621 4588
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
4673 // +-----+------+------+-----+-----+-----+ ... ----+ 4640 // +-----+------+------+-----+-----+-----+ ... ----+
4674 // | map | len | wm0 | wt0 | h0 | wm1 | hN | 4641 // | map | len | wm0 | wt0 | h0 | wm1 | hN |
4675 // +-----+------+------+-----+-----+ ----+ ... ----+ 4642 // +-----+------+------+-----+-----+ ----+ ... ----+
4676 // 0 1 2 len-1 4643 // 0 1 2 len-1
4677 // ^ ^ 4644 // ^ ^
4678 // | | 4645 // | |
4679 // pointer_reg too_far 4646 // pointer_reg too_far
4680 // aka feedback scratch2 4647 // aka feedback scratch2
4681 // also need receiver_map 4648 // also need receiver_map
4682 // use cached_map (scratch1) to look in the weak map values. 4649 // use cached_map (scratch1) to look in the weak map values.
4683 __ sll(scratch1, too_far, kPointerSizeLog2 - kSmiTagSize); 4650 __ Lsa(too_far, feedback, too_far, kPointerSizeLog2 - kSmiTagSize);
4684 __ Addu(too_far, feedback, Operand(scratch1));
4685 __ Addu(too_far, too_far, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); 4651 __ Addu(too_far, too_far, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
4686 __ Addu(pointer_reg, feedback, 4652 __ Addu(pointer_reg, feedback,
4687 Operand(FixedArray::OffsetOfElementAt(0) - kHeapObjectTag)); 4653 Operand(FixedArray::OffsetOfElementAt(0) - kHeapObjectTag));
4688 4654
4689 __ bind(&next_loop); 4655 __ bind(&next_loop);
4690 __ lw(cached_map, MemOperand(pointer_reg)); 4656 __ lw(cached_map, MemOperand(pointer_reg));
4691 __ lw(cached_map, FieldMemOperand(cached_map, WeakCell::kValueOffset)); 4657 __ lw(cached_map, FieldMemOperand(cached_map, WeakCell::kValueOffset));
4692 __ Branch(&prepare_next, ne, receiver_map, Operand(cached_map)); 4658 __ Branch(&prepare_next, ne, receiver_map, Operand(cached_map));
4693 // Is it a transitioning store? 4659 // Is it a transitioning store?
4694 __ lw(too_far, MemOperand(pointer_reg, kPointerSize)); 4660 __ lw(too_far, MemOperand(pointer_reg, kPointerSize));
(...skipping 28 matching lines...) Expand all
4723 void VectorKeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { 4689 void VectorKeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) {
4724 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // a1 4690 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // a1
4725 Register key = VectorStoreICDescriptor::NameRegister(); // a2 4691 Register key = VectorStoreICDescriptor::NameRegister(); // a2
4726 Register vector = VectorStoreICDescriptor::VectorRegister(); // a3 4692 Register vector = VectorStoreICDescriptor::VectorRegister(); // a3
4727 Register slot = VectorStoreICDescriptor::SlotRegister(); // t0 4693 Register slot = VectorStoreICDescriptor::SlotRegister(); // t0
4728 DCHECK(VectorStoreICDescriptor::ValueRegister().is(a0)); // a0 4694 DCHECK(VectorStoreICDescriptor::ValueRegister().is(a0)); // a0
4729 Register feedback = t1; 4695 Register feedback = t1;
4730 Register receiver_map = t2; 4696 Register receiver_map = t2;
4731 Register scratch1 = t5; 4697 Register scratch1 = t5;
4732 4698
4733 __ sll(scratch1, slot, kPointerSizeLog2 - kSmiTagSize); 4699 __ Lsa(feedback, vector, slot, kPointerSizeLog2 - kSmiTagSize);
4734 __ Addu(feedback, vector, Operand(scratch1));
4735 __ lw(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize)); 4700 __ lw(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize));
4736 4701
4737 // Try to quickly handle the monomorphic case without knowing for sure 4702 // Try to quickly handle the monomorphic case without knowing for sure
4738 // if we have a weak cell in feedback. We do know it's safe to look 4703 // if we have a weak cell in feedback. We do know it's safe to look
4739 // at WeakCell::kValueOffset. 4704 // at WeakCell::kValueOffset.
4740 Label try_array, load_smi_map, compare_map; 4705 Label try_array, load_smi_map, compare_map;
4741 Label not_array, miss; 4706 Label not_array, miss;
4742 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot, 4707 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot,
4743 scratch1, &compare_map, &load_smi_map, &try_array); 4708 scratch1, &compare_map, &load_smi_map, &try_array);
4744 4709
(...skipping 18 matching lines...) Expand all
4763 __ Branch(&try_poly_name, ne, feedback, Operand(at)); 4728 __ Branch(&try_poly_name, ne, feedback, Operand(at));
4764 Handle<Code> megamorphic_stub = 4729 Handle<Code> megamorphic_stub =
4765 KeyedStoreIC::ChooseMegamorphicStub(masm->isolate(), GetExtraICState()); 4730 KeyedStoreIC::ChooseMegamorphicStub(masm->isolate(), GetExtraICState());
4766 __ Jump(megamorphic_stub, RelocInfo::CODE_TARGET); 4731 __ Jump(megamorphic_stub, RelocInfo::CODE_TARGET);
4767 4732
4768 __ bind(&try_poly_name); 4733 __ bind(&try_poly_name);
4769 // We might have a name in feedback, and a fixed array in the next slot. 4734 // We might have a name in feedback, and a fixed array in the next slot.
4770 __ Branch(&miss, ne, key, Operand(feedback)); 4735 __ Branch(&miss, ne, key, Operand(feedback));
4771 // If the name comparison succeeded, we know we have a fixed array with 4736 // If the name comparison succeeded, we know we have a fixed array with
4772 // at least one map/handler pair. 4737 // at least one map/handler pair.
4773 __ sll(scratch1, slot, kPointerSizeLog2 - kSmiTagSize); 4738 __ Lsa(feedback, vector, slot, kPointerSizeLog2 - kSmiTagSize);
4774 __ Addu(feedback, vector, Operand(scratch1));
4775 __ lw(feedback, 4739 __ lw(feedback,
4776 FieldMemOperand(feedback, FixedArray::kHeaderSize + kPointerSize)); 4740 FieldMemOperand(feedback, FixedArray::kHeaderSize + kPointerSize));
4777 HandleArrayCases(masm, feedback, receiver_map, scratch1, scratch2, false, 4741 HandleArrayCases(masm, feedback, receiver_map, scratch1, scratch2, false,
4778 &miss); 4742 &miss);
4779 4743
4780 __ bind(&miss); 4744 __ bind(&miss);
4781 KeyedStoreIC::GenerateMiss(masm); 4745 KeyedStoreIC::GenerateMiss(masm);
4782 4746
4783 __ bind(&load_smi_map); 4747 __ bind(&load_smi_map);
4784 __ Branch(USE_DELAY_SLOT, &compare_map); 4748 __ Branch(USE_DELAY_SLOT, &compare_map);
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
5071 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); 5035 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE);
5072 5036
5073 __ bind(&no_info); 5037 __ bind(&no_info);
5074 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); 5038 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES);
5075 5039
5076 // Subclassing. 5040 // Subclassing.
5077 __ bind(&subclassing); 5041 __ bind(&subclassing);
5078 switch (argument_count()) { 5042 switch (argument_count()) {
5079 case ANY: 5043 case ANY:
5080 case MORE_THAN_ONE: 5044 case MORE_THAN_ONE:
5081 __ sll(at, a0, kPointerSizeLog2); 5045 __ Lsa(at, sp, a0, kPointerSizeLog2);
5082 __ addu(at, sp, at);
5083 __ sw(a1, MemOperand(at)); 5046 __ sw(a1, MemOperand(at));
5084 __ li(at, Operand(3)); 5047 __ li(at, Operand(3));
5085 __ addu(a0, a0, at); 5048 __ addu(a0, a0, at);
5086 break; 5049 break;
5087 case NONE: 5050 case NONE:
5088 __ sw(a1, MemOperand(sp, 0 * kPointerSize)); 5051 __ sw(a1, MemOperand(sp, 0 * kPointerSize));
5089 __ li(a0, Operand(3)); 5052 __ li(a0, Operand(3));
5090 break; 5053 break;
5091 case ONE: 5054 case ONE:
5092 __ sw(a1, MemOperand(sp, 1 * kPointerSize)); 5055 __ sw(a1, MemOperand(sp, 1 * kPointerSize));
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
5178 Register result_reg = v0; 5141 Register result_reg = v0;
5179 Label slow_case; 5142 Label slow_case;
5180 5143
5181 // Go up context chain to the script context. 5144 // Go up context chain to the script context.
5182 for (int i = 0; i < depth(); ++i) { 5145 for (int i = 0; i < depth(); ++i) {
5183 __ lw(result_reg, ContextMemOperand(context_reg, Context::PREVIOUS_INDEX)); 5146 __ lw(result_reg, ContextMemOperand(context_reg, Context::PREVIOUS_INDEX));
5184 context_reg = result_reg; 5147 context_reg = result_reg;
5185 } 5148 }
5186 5149
5187 // Load the PropertyCell value at the specified slot. 5150 // Load the PropertyCell value at the specified slot.
5188 __ sll(at, slot_reg, kPointerSizeLog2); 5151 __ Lsa(at, context_reg, slot_reg, kPointerSizeLog2);
5189 __ Addu(at, at, Operand(context_reg));
5190 __ lw(result_reg, ContextMemOperand(at, 0)); 5152 __ lw(result_reg, ContextMemOperand(at, 0));
5191 __ lw(result_reg, FieldMemOperand(result_reg, PropertyCell::kValueOffset)); 5153 __ lw(result_reg, FieldMemOperand(result_reg, PropertyCell::kValueOffset));
5192 5154
5193 // Check that value is not the_hole. 5155 // Check that value is not the_hole.
5194 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); 5156 __ LoadRoot(at, Heap::kTheHoleValueRootIndex);
5195 __ Branch(&slow_case, eq, result_reg, Operand(at)); 5157 __ Branch(&slow_case, eq, result_reg, Operand(at));
5196 __ Ret(); 5158 __ Ret();
5197 5159
5198 // Fallback to the runtime. 5160 // Fallback to the runtime.
5199 __ bind(&slow_case); 5161 __ bind(&slow_case);
(...skipping 17 matching lines...) Expand all
5217 __ Check(ne, kUnexpectedValue, value_reg, Operand(at)); 5179 __ Check(ne, kUnexpectedValue, value_reg, Operand(at));
5218 } 5180 }
5219 5181
5220 // Go up context chain to the script context. 5182 // Go up context chain to the script context.
5221 for (int i = 0; i < depth(); ++i) { 5183 for (int i = 0; i < depth(); ++i) {
5222 __ lw(cell_reg, ContextMemOperand(context_reg, Context::PREVIOUS_INDEX)); 5184 __ lw(cell_reg, ContextMemOperand(context_reg, Context::PREVIOUS_INDEX));
5223 context_reg = cell_reg; 5185 context_reg = cell_reg;
5224 } 5186 }
5225 5187
5226 // Load the PropertyCell at the specified slot. 5188 // Load the PropertyCell at the specified slot.
5227 __ sll(at, slot_reg, kPointerSizeLog2); 5189 __ Lsa(at, context_reg, slot_reg, kPointerSizeLog2);
5228 __ Addu(at, at, Operand(context_reg));
5229 __ lw(cell_reg, ContextMemOperand(at, 0)); 5190 __ lw(cell_reg, ContextMemOperand(at, 0));
5230 5191
5231 // Load PropertyDetails for the cell (actually only the cell_type and kind). 5192 // Load PropertyDetails for the cell (actually only the cell_type and kind).
5232 __ lw(cell_details_reg, 5193 __ lw(cell_details_reg,
5233 FieldMemOperand(cell_reg, PropertyCell::kDetailsOffset)); 5194 FieldMemOperand(cell_reg, PropertyCell::kDetailsOffset));
5234 __ SmiUntag(cell_details_reg); 5195 __ SmiUntag(cell_details_reg);
5235 __ And(cell_details_reg, cell_details_reg, 5196 __ And(cell_details_reg, cell_details_reg,
5236 PropertyDetails::PropertyCellTypeField::kMask | 5197 PropertyDetails::PropertyCellTypeField::kMask |
5237 PropertyDetails::KindField::kMask | 5198 PropertyDetails::KindField::kMask |
5238 PropertyDetails::kAttributesReadOnlyMask); 5199 PropertyDetails::kAttributesReadOnlyMask);
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
5619 MemOperand(fp, 6 * kPointerSize), NULL); 5580 MemOperand(fp, 6 * kPointerSize), NULL);
5620 } 5581 }
5621 5582
5622 5583
5623 #undef __ 5584 #undef __
5624 5585
5625 } // namespace internal 5586 } // namespace internal
5626 } // namespace v8 5587 } // namespace v8
5627 5588
5628 #endif // V8_TARGET_ARCH_MIPS 5589 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « src/mips/builtins-mips.cc ('k') | src/mips/codegen-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698