| OLD | NEW |
| 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 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_ARM | 7 #if V8_TARGET_ARCH_ARM |
| 8 | 8 |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1528 StubRuntimeCallHelper call_helper; | 1528 StubRuntimeCallHelper call_helper; |
| 1529 char_at_generator.GenerateSlow(masm, PART_OF_IC_HANDLER, call_helper); | 1529 char_at_generator.GenerateSlow(masm, PART_OF_IC_HANDLER, call_helper); |
| 1530 | 1530 |
| 1531 __ bind(&miss); | 1531 __ bind(&miss); |
| 1532 PropertyAccessCompiler::TailCallBuiltin( | 1532 PropertyAccessCompiler::TailCallBuiltin( |
| 1533 masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC)); | 1533 masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC)); |
| 1534 } | 1534 } |
| 1535 | 1535 |
| 1536 | 1536 |
| 1537 void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { | 1537 void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { |
| 1538 CHECK(!has_new_target()); | |
| 1539 // The displacement is the offset of the last parameter (if any) | 1538 // The displacement is the offset of the last parameter (if any) |
| 1540 // relative to the frame pointer. | 1539 // relative to the frame pointer. |
| 1541 const int kDisplacement = | 1540 const int kDisplacement = |
| 1542 StandardFrameConstants::kCallerSPOffset - kPointerSize; | 1541 StandardFrameConstants::kCallerSPOffset - kPointerSize; |
| 1543 DCHECK(r1.is(ArgumentsAccessReadDescriptor::index())); | 1542 DCHECK(r1.is(ArgumentsAccessReadDescriptor::index())); |
| 1544 DCHECK(r0.is(ArgumentsAccessReadDescriptor::parameter_count())); | 1543 DCHECK(r0.is(ArgumentsAccessReadDescriptor::parameter_count())); |
| 1545 | 1544 |
| 1546 // Check that the key is a smi. | 1545 // Check that the key is a smi. |
| 1547 Label slow; | 1546 Label slow; |
| 1548 __ JumpIfNotSmi(r1, &slow); | 1547 __ JumpIfNotSmi(r1, &slow); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1586 __ push(r1); | 1585 __ push(r1); |
| 1587 __ TailCallRuntime(Runtime::kGetArgumentsProperty, 1, 1); | 1586 __ TailCallRuntime(Runtime::kGetArgumentsProperty, 1, 1); |
| 1588 } | 1587 } |
| 1589 | 1588 |
| 1590 | 1589 |
| 1591 void ArgumentsAccessStub::GenerateNewSloppySlow(MacroAssembler* masm) { | 1590 void ArgumentsAccessStub::GenerateNewSloppySlow(MacroAssembler* masm) { |
| 1592 // sp[0] : number of parameters | 1591 // sp[0] : number of parameters |
| 1593 // sp[4] : receiver displacement | 1592 // sp[4] : receiver displacement |
| 1594 // sp[8] : function | 1593 // sp[8] : function |
| 1595 | 1594 |
| 1596 CHECK(!has_new_target()); | |
| 1597 | |
| 1598 // Check if the calling frame is an arguments adaptor frame. | 1595 // Check if the calling frame is an arguments adaptor frame. |
| 1599 Label runtime; | 1596 Label runtime; |
| 1600 __ ldr(r3, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); | 1597 __ ldr(r3, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
| 1601 __ ldr(r2, MemOperand(r3, StandardFrameConstants::kContextOffset)); | 1598 __ ldr(r2, MemOperand(r3, StandardFrameConstants::kContextOffset)); |
| 1602 __ cmp(r2, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); | 1599 __ cmp(r2, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); |
| 1603 __ b(ne, &runtime); | 1600 __ b(ne, &runtime); |
| 1604 | 1601 |
| 1605 // Patch the arguments.length and the parameters pointer in the current frame. | 1602 // Patch the arguments.length and the parameters pointer in the current frame. |
| 1606 __ ldr(r2, MemOperand(r3, ArgumentsAdaptorFrameConstants::kLengthOffset)); | 1603 __ ldr(r2, MemOperand(r3, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| 1607 __ str(r2, MemOperand(sp, 0 * kPointerSize)); | 1604 __ str(r2, MemOperand(sp, 0 * kPointerSize)); |
| 1608 __ add(r3, r3, Operand(r2, LSL, 1)); | 1605 __ add(r3, r3, Operand(r2, LSL, 1)); |
| 1609 __ add(r3, r3, Operand(StandardFrameConstants::kCallerSPOffset)); | 1606 __ add(r3, r3, Operand(StandardFrameConstants::kCallerSPOffset)); |
| 1610 __ str(r3, MemOperand(sp, 1 * kPointerSize)); | 1607 __ str(r3, MemOperand(sp, 1 * kPointerSize)); |
| 1611 | 1608 |
| 1612 __ bind(&runtime); | 1609 __ bind(&runtime); |
| 1613 __ TailCallRuntime(Runtime::kNewSloppyArguments, 3, 1); | 1610 __ TailCallRuntime(Runtime::kNewSloppyArguments, 3, 1); |
| 1614 } | 1611 } |
| 1615 | 1612 |
| 1616 | 1613 |
| 1617 void ArgumentsAccessStub::GenerateNewSloppyFast(MacroAssembler* masm) { | 1614 void ArgumentsAccessStub::GenerateNewSloppyFast(MacroAssembler* masm) { |
| 1618 // Stack layout: | 1615 // Stack layout: |
| 1619 // sp[0] : number of parameters (tagged) | 1616 // sp[0] : number of parameters (tagged) |
| 1620 // sp[4] : address of receiver argument | 1617 // sp[4] : address of receiver argument |
| 1621 // sp[8] : function | 1618 // sp[8] : function |
| 1622 // Registers used over whole function: | 1619 // Registers used over whole function: |
| 1623 // r6 : allocated object (tagged) | 1620 // r6 : allocated object (tagged) |
| 1624 // r9 : mapped parameter count (tagged) | 1621 // r9 : mapped parameter count (tagged) |
| 1625 | 1622 |
| 1626 CHECK(!has_new_target()); | |
| 1627 | |
| 1628 __ ldr(r1, MemOperand(sp, 0 * kPointerSize)); | 1623 __ ldr(r1, MemOperand(sp, 0 * kPointerSize)); |
| 1629 // r1 = parameter count (tagged) | 1624 // r1 = parameter count (tagged) |
| 1630 | 1625 |
| 1631 // Check if the calling frame is an arguments adaptor frame. | 1626 // Check if the calling frame is an arguments adaptor frame. |
| 1632 Label runtime; | 1627 Label runtime; |
| 1633 Label adaptor_frame, try_allocate; | 1628 Label adaptor_frame, try_allocate; |
| 1634 __ ldr(r3, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); | 1629 __ ldr(r3, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
| 1635 __ ldr(r2, MemOperand(r3, StandardFrameConstants::kContextOffset)); | 1630 __ ldr(r2, MemOperand(r3, StandardFrameConstants::kContextOffset)); |
| 1636 __ cmp(r2, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); | 1631 __ cmp(r2, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); |
| 1637 __ b(eq, &adaptor_frame); | 1632 __ b(eq, &adaptor_frame); |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1858 __ cmp(r3, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); | 1853 __ cmp(r3, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); |
| 1859 __ b(eq, &adaptor_frame); | 1854 __ b(eq, &adaptor_frame); |
| 1860 | 1855 |
| 1861 // Get the length from the frame. | 1856 // Get the length from the frame. |
| 1862 __ ldr(r1, MemOperand(sp, 0)); | 1857 __ ldr(r1, MemOperand(sp, 0)); |
| 1863 __ b(&try_allocate); | 1858 __ b(&try_allocate); |
| 1864 | 1859 |
| 1865 // Patch the arguments.length and the parameters pointer. | 1860 // Patch the arguments.length and the parameters pointer. |
| 1866 __ bind(&adaptor_frame); | 1861 __ bind(&adaptor_frame); |
| 1867 __ ldr(r1, MemOperand(r2, ArgumentsAdaptorFrameConstants::kLengthOffset)); | 1862 __ ldr(r1, MemOperand(r2, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| 1868 if (has_new_target()) { | |
| 1869 __ cmp(r1, Operand(Smi::FromInt(0))); | |
| 1870 Label skip_decrement; | |
| 1871 __ b(eq, &skip_decrement); | |
| 1872 // Subtract 1 from smi-tagged arguments count. | |
| 1873 __ sub(r1, r1, Operand(2)); | |
| 1874 __ bind(&skip_decrement); | |
| 1875 } | |
| 1876 __ str(r1, MemOperand(sp, 0)); | 1863 __ str(r1, MemOperand(sp, 0)); |
| 1877 __ add(r3, r2, Operand::PointerOffsetFromSmiKey(r1)); | 1864 __ add(r3, r2, Operand::PointerOffsetFromSmiKey(r1)); |
| 1878 __ add(r3, r3, Operand(StandardFrameConstants::kCallerSPOffset)); | 1865 __ add(r3, r3, Operand(StandardFrameConstants::kCallerSPOffset)); |
| 1879 __ str(r3, MemOperand(sp, 1 * kPointerSize)); | 1866 __ str(r3, MemOperand(sp, 1 * kPointerSize)); |
| 1880 | 1867 |
| 1881 // Try the new space allocation. Start out with computing the size | 1868 // Try the new space allocation. Start out with computing the size |
| 1882 // of the arguments object and the elements array in words. | 1869 // of the arguments object and the elements array in words. |
| 1883 Label add_arguments_object; | 1870 Label add_arguments_object; |
| 1884 __ bind(&try_allocate); | 1871 __ bind(&try_allocate); |
| 1885 __ SmiUntag(r1, SetCC); | 1872 __ SmiUntag(r1, SetCC); |
| (...skipping 3474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5360 MemOperand(fp, 6 * kPointerSize), NULL); | 5347 MemOperand(fp, 6 * kPointerSize), NULL); |
| 5361 } | 5348 } |
| 5362 | 5349 |
| 5363 | 5350 |
| 5364 #undef __ | 5351 #undef __ |
| 5365 | 5352 |
| 5366 } // namespace internal | 5353 } // namespace internal |
| 5367 } // namespace v8 | 5354 } // namespace v8 |
| 5368 | 5355 |
| 5369 #endif // V8_TARGET_ARCH_ARM | 5356 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |