OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/js-builtin-reducer.h" | 5 #include "src/compiler/js-builtin-reducer.h" |
6 | 6 |
7 #include "src/compilation-dependencies.h" | 7 #include "src/compilation-dependencies.h" |
8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
(...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
957 if (HasInstanceTypeWitness(receiver, effect, JS_DATE_TYPE)) { | 957 if (HasInstanceTypeWitness(receiver, effect, JS_DATE_TYPE)) { |
958 Node* value = effect = graph()->NewNode( | 958 Node* value = effect = graph()->NewNode( |
959 simplified()->LoadField(AccessBuilder::ForJSDateValue()), receiver, | 959 simplified()->LoadField(AccessBuilder::ForJSDateValue()), receiver, |
960 effect, control); | 960 effect, control); |
961 ReplaceWithValue(node, value, effect, control); | 961 ReplaceWithValue(node, value, effect, control); |
962 return Replace(value); | 962 return Replace(value); |
963 } | 963 } |
964 return NoChange(); | 964 return NoChange(); |
965 } | 965 } |
966 | 966 |
967 // ES6 section 19.2.3.6 Function.prototype [ @@hasInstance ] ( V ) | |
968 Reduction JSBuiltinReducer::ReduceFunctionHasInstance(Node* node) { | |
969 Node* receiver = NodeProperties::GetValueInput(node, 1); | |
970 Node* object = (node->op()->ValueInputCount() >= 3) | |
971 ? NodeProperties::GetValueInput(node, 2) | |
972 : jsgraph()->UndefinedConstant(); | |
973 Node* context = NodeProperties::GetContextInput(node); | |
974 Node* frame_state = NodeProperties::GetFrameStateInput(node); | |
975 Node* effect = NodeProperties::GetEffectInput(node); | |
976 Node* control = NodeProperties::GetControlInput(node); | |
977 | |
978 // TODO(turbofan): If JSOrdinaryToInstance raises an exception, the | |
979 // stack trace doesn't contain the @@hasInstance call; we have the | |
980 // corresponding bug in the baseline case. Some massaging of the frame | |
981 // state would be necessary here. | |
982 | |
983 // Morph this {node} into a JSOrdinaryHasInstance node. | |
984 node->ReplaceInput(0, receiver); | |
985 node->ReplaceInput(1, object); | |
986 node->ReplaceInput(2, context); | |
987 node->ReplaceInput(3, frame_state); | |
988 node->ReplaceInput(4, effect); | |
989 node->ReplaceInput(5, control); | |
990 node->TrimInputCount(6); | |
991 NodeProperties::ChangeOp(node, javascript()->OrdinaryHasInstance()); | |
992 return Changed(node); | |
993 } | |
994 | |
995 // ES6 section 18.2.2 isFinite ( number ) | 967 // ES6 section 18.2.2 isFinite ( number ) |
996 Reduction JSBuiltinReducer::ReduceGlobalIsFinite(Node* node) { | 968 Reduction JSBuiltinReducer::ReduceGlobalIsFinite(Node* node) { |
997 JSCallReduction r(node); | 969 JSCallReduction r(node); |
998 if (r.InputsMatchOne(Type::PlainPrimitive())) { | 970 if (r.InputsMatchOne(Type::PlainPrimitive())) { |
999 // isFinite(a:plain-primitive) -> NumberEqual(a', a') | 971 // isFinite(a:plain-primitive) -> NumberEqual(a', a') |
1000 // where a' = NumberSubtract(ToNumber(a), ToNumber(a)) | 972 // where a' = NumberSubtract(ToNumber(a), ToNumber(a)) |
1001 Node* input = ToNumber(r.GetJSCallInput(0)); | 973 Node* input = ToNumber(r.GetJSCallInput(0)); |
1002 Node* diff = graph()->NewNode(simplified()->NumberSubtract(), input, input); | 974 Node* diff = graph()->NewNode(simplified()->NumberSubtract(), input, input); |
1003 Node* value = graph()->NewNode(simplified()->NumberEqual(), diff, diff); | 975 Node* value = graph()->NewNode(simplified()->NumberEqual(), diff, diff); |
1004 return Replace(value); | 976 return Replace(value); |
(...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1868 case kArrayValues: | 1840 case kArrayValues: |
1869 return ReduceArrayIterator(node, IterationKind::kValues); | 1841 return ReduceArrayIterator(node, IterationKind::kValues); |
1870 case kArrayIteratorNext: | 1842 case kArrayIteratorNext: |
1871 return ReduceArrayIteratorNext(node); | 1843 return ReduceArrayIteratorNext(node); |
1872 case kArrayPop: | 1844 case kArrayPop: |
1873 return ReduceArrayPop(node); | 1845 return ReduceArrayPop(node); |
1874 case kArrayPush: | 1846 case kArrayPush: |
1875 return ReduceArrayPush(node); | 1847 return ReduceArrayPush(node); |
1876 case kDateGetTime: | 1848 case kDateGetTime: |
1877 return ReduceDateGetTime(node); | 1849 return ReduceDateGetTime(node); |
1878 case kFunctionHasInstance: | |
1879 return ReduceFunctionHasInstance(node); | |
1880 break; | |
1881 case kGlobalIsFinite: | 1850 case kGlobalIsFinite: |
1882 reduction = ReduceGlobalIsFinite(node); | 1851 reduction = ReduceGlobalIsFinite(node); |
1883 break; | 1852 break; |
1884 case kGlobalIsNaN: | 1853 case kGlobalIsNaN: |
1885 reduction = ReduceGlobalIsNaN(node); | 1854 reduction = ReduceGlobalIsNaN(node); |
1886 break; | 1855 break; |
1887 case kMathAbs: | 1856 case kMathAbs: |
1888 reduction = ReduceMathAbs(node); | 1857 reduction = ReduceMathAbs(node); |
1889 break; | 1858 break; |
1890 case kMathAcos: | 1859 case kMathAcos: |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2074 return jsgraph()->simplified(); | 2043 return jsgraph()->simplified(); |
2075 } | 2044 } |
2076 | 2045 |
2077 JSOperatorBuilder* JSBuiltinReducer::javascript() const { | 2046 JSOperatorBuilder* JSBuiltinReducer::javascript() const { |
2078 return jsgraph()->javascript(); | 2047 return jsgraph()->javascript(); |
2079 } | 2048 } |
2080 | 2049 |
2081 } // namespace compiler | 2050 } // namespace compiler |
2082 } // namespace internal | 2051 } // namespace internal |
2083 } // namespace v8 | 2052 } // namespace v8 |
OLD | NEW |