OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/compiler/effect-control-linearizer.h" | 5 #include "src/compiler/effect-control-linearizer.h" |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
9 #include "src/compiler/compiler-source-position-table.h" | 9 #include "src/compiler/compiler-source-position-table.h" |
10 #include "src/compiler/js-graph.h" | 10 #include "src/compiler/js-graph.h" |
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
731 break; | 731 break; |
732 case IrOpcode::kObjectIsSmi: | 732 case IrOpcode::kObjectIsSmi: |
733 result = LowerObjectIsSmi(node); | 733 result = LowerObjectIsSmi(node); |
734 break; | 734 break; |
735 case IrOpcode::kObjectIsString: | 735 case IrOpcode::kObjectIsString: |
736 result = LowerObjectIsString(node); | 736 result = LowerObjectIsString(node); |
737 break; | 737 break; |
738 case IrOpcode::kObjectIsUndetectable: | 738 case IrOpcode::kObjectIsUndetectable: |
739 result = LowerObjectIsUndetectable(node); | 739 result = LowerObjectIsUndetectable(node); |
740 break; | 740 break; |
741 case IrOpcode::kNewRestParameterElements: | 741 case IrOpcode::kArgumentsFrame: |
742 result = LowerNewRestParameterElements(node); | 742 result = LowerArgumentsFrame(node); |
| 743 break; |
| 744 case IrOpcode::kArgumentsLength: |
| 745 result = LowerArgumentsLength(node); |
743 break; | 746 break; |
744 case IrOpcode::kNewUnmappedArgumentsElements: | 747 case IrOpcode::kNewUnmappedArgumentsElements: |
745 result = LowerNewUnmappedArgumentsElements(node); | 748 result = LowerNewUnmappedArgumentsElements(node); |
746 break; | 749 break; |
747 case IrOpcode::kArrayBufferWasNeutered: | 750 case IrOpcode::kArrayBufferWasNeutered: |
748 result = LowerArrayBufferWasNeutered(node); | 751 result = LowerArrayBufferWasNeutered(node); |
749 break; | 752 break; |
750 case IrOpcode::kStringFromCharCode: | 753 case IrOpcode::kStringFromCharCode: |
751 result = LowerStringFromCharCode(node); | 754 result = LowerStringFromCharCode(node); |
752 break; | 755 break; |
(...skipping 1087 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1840 __ Int32Constant(0)); | 1843 __ Int32Constant(0)); |
1841 __ Goto(&done, vfalse); | 1844 __ Goto(&done, vfalse); |
1842 | 1845 |
1843 __ Bind(&if_smi); | 1846 __ Bind(&if_smi); |
1844 __ Goto(&done, __ Int32Constant(0)); | 1847 __ Goto(&done, __ Int32Constant(0)); |
1845 | 1848 |
1846 __ Bind(&done); | 1849 __ Bind(&done); |
1847 return done.PhiAt(0); | 1850 return done.PhiAt(0); |
1848 } | 1851 } |
1849 | 1852 |
1850 Node* EffectControlLinearizer::LowerNewRestParameterElements(Node* node) { | 1853 Node* EffectControlLinearizer::LowerArgumentsLength(Node* node) { |
1851 int const formal_parameter_count = ParameterCountOf(node->op()); | 1854 Node* arguments_frame = NodeProperties::GetValueInput(node, 0); |
| 1855 int formal_parameter_count = FormalParameterCountOf(node->op()); |
| 1856 bool is_rest_length = IsRestLengthOf(node->op()); |
| 1857 DCHECK(formal_parameter_count >= 0); |
1852 | 1858 |
1853 Callable const callable = CodeFactory::NewRestParameterElements(isolate()); | 1859 if (is_rest_length) { |
1854 Operator::Properties const properties = node->op()->properties(); | 1860 auto if_adaptor_frame = __ MakeLabel<1>(); |
1855 CallDescriptor::Flags const flags = CallDescriptor::kNoFlags; | 1861 auto done = __ MakeLabel<3>(MachineRepresentation::kTaggedSigned); |
1856 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 1862 |
1857 isolate(), graph()->zone(), callable.descriptor(), 0, flags, properties); | 1863 Node* frame = graph()->NewNode(machine()->LoadFramePointer()); |
1858 return __ Call(desc, __ HeapConstant(callable.code()), | 1864 __ GotoIf(__ WordEqual(arguments_frame, frame), &done, __ SmiConstant(0)); |
1859 __ IntPtrConstant(formal_parameter_count), | 1865 __ Goto(&if_adaptor_frame); |
1860 __ NoContextConstant()); | 1866 |
| 1867 __ Bind(&if_adaptor_frame); |
| 1868 Node* arguments_length = __ Load( |
| 1869 MachineType::TaggedSigned(), arguments_frame, |
| 1870 __ IntPtrConstant(ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| 1871 |
| 1872 Node* rest_length = |
| 1873 graph()->NewNode(machine()->IntSub(), arguments_length, |
| 1874 __ SmiConstant(formal_parameter_count)); |
| 1875 __ GotoIf(graph()->NewNode(machine()->IntLessThan(), rest_length, |
| 1876 __ SmiConstant(0)), |
| 1877 &done, __ SmiConstant(0)); |
| 1878 __ Goto(&done, rest_length); |
| 1879 |
| 1880 __ Bind(&done); |
| 1881 return done.PhiAt(0); |
| 1882 } else { |
| 1883 auto if_adaptor_frame = __ MakeLabel<1>(); |
| 1884 auto done = __ MakeLabel<2>(MachineRepresentation::kTaggedSigned); |
| 1885 |
| 1886 Node* frame = graph()->NewNode(machine()->LoadFramePointer()); |
| 1887 __ GotoIf(__ WordEqual(arguments_frame, frame), &done, |
| 1888 __ SmiConstant(formal_parameter_count)); |
| 1889 __ Goto(&if_adaptor_frame); |
| 1890 |
| 1891 __ Bind(&if_adaptor_frame); |
| 1892 Node* arguments_length = __ Load( |
| 1893 MachineType::TaggedSigned(), arguments_frame, |
| 1894 __ IntPtrConstant(ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| 1895 __ Goto(&done, arguments_length); |
| 1896 |
| 1897 __ Bind(&done); |
| 1898 return done.PhiAt(0); |
| 1899 } |
| 1900 } |
| 1901 |
| 1902 Node* EffectControlLinearizer::LowerArgumentsFrame(Node* node) { |
| 1903 auto done = __ MakeLabel<2>(MachineType::PointerRepresentation()); |
| 1904 |
| 1905 Node* frame = graph()->NewNode(machine()->LoadFramePointer()); |
| 1906 Node* parent_frame = |
| 1907 __ Load(MachineType::AnyTagged(), frame, |
| 1908 __ IntPtrConstant(StandardFrameConstants::kCallerFPOffset)); |
| 1909 Node* parent_frame_type = __ Load( |
| 1910 MachineType::AnyTagged(), parent_frame, |
| 1911 __ IntPtrConstant(CommonFrameConstants::kContextOrFrameTypeOffset)); |
| 1912 __ GotoIf(__ WordEqual(parent_frame_type, |
| 1913 __ SmiConstant(StackFrame::ARGUMENTS_ADAPTOR)), |
| 1914 &done, parent_frame); |
| 1915 __ Goto(&done, frame); |
| 1916 |
| 1917 __ Bind(&done); |
| 1918 return done.PhiAt(0); |
1861 } | 1919 } |
1862 | 1920 |
1863 Node* EffectControlLinearizer::LowerNewUnmappedArgumentsElements(Node* node) { | 1921 Node* EffectControlLinearizer::LowerNewUnmappedArgumentsElements(Node* node) { |
1864 int const formal_parameter_count = ParameterCountOf(node->op()); | 1922 Node* frame = NodeProperties::GetValueInput(node, 0); |
| 1923 Node* length = NodeProperties::GetValueInput(node, 1); |
1865 | 1924 |
1866 Callable const callable = | 1925 Callable const callable = |
1867 CodeFactory::NewUnmappedArgumentsElements(isolate()); | 1926 CodeFactory::NewUnmappedArgumentsElements(isolate()); |
1868 Operator::Properties const properties = node->op()->properties(); | 1927 Operator::Properties const properties = node->op()->properties(); |
1869 CallDescriptor::Flags const flags = CallDescriptor::kNoFlags; | 1928 CallDescriptor::Flags const flags = CallDescriptor::kNoFlags; |
1870 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 1929 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
1871 isolate(), graph()->zone(), callable.descriptor(), 0, flags, properties); | 1930 isolate(), graph()->zone(), callable.descriptor(), 0, flags, properties); |
1872 return __ Call(desc, __ HeapConstant(callable.code()), | 1931 return __ Call(desc, __ HeapConstant(callable.code()), frame, length, |
1873 __ IntPtrConstant(formal_parameter_count), | |
1874 __ NoContextConstant()); | 1932 __ NoContextConstant()); |
1875 } | 1933 } |
1876 | 1934 |
1877 Node* EffectControlLinearizer::LowerArrayBufferWasNeutered(Node* node) { | 1935 Node* EffectControlLinearizer::LowerArrayBufferWasNeutered(Node* node) { |
1878 Node* value = node->InputAt(0); | 1936 Node* value = node->InputAt(0); |
1879 | 1937 |
1880 Node* value_bit_field = | 1938 Node* value_bit_field = |
1881 __ LoadField(AccessBuilder::ForJSArrayBufferBitField(), value); | 1939 __ LoadField(AccessBuilder::ForJSArrayBufferBitField(), value); |
1882 return __ Word32Equal( | 1940 return __ Word32Equal( |
1883 __ Word32Equal( | 1941 __ Word32Equal( |
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2795 return isolate()->factory(); | 2853 return isolate()->factory(); |
2796 } | 2854 } |
2797 | 2855 |
2798 Isolate* EffectControlLinearizer::isolate() const { | 2856 Isolate* EffectControlLinearizer::isolate() const { |
2799 return jsgraph()->isolate(); | 2857 return jsgraph()->isolate(); |
2800 } | 2858 } |
2801 | 2859 |
2802 } // namespace compiler | 2860 } // namespace compiler |
2803 } // namespace internal | 2861 } // namespace internal |
2804 } // namespace v8 | 2862 } // namespace v8 |
OLD | NEW |