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 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 break; | 777 break; |
778 case IrOpcode::kTransitionElementsKind: | 778 case IrOpcode::kTransitionElementsKind: |
779 state = LowerTransitionElementsKind(node, *effect, *control); | 779 state = LowerTransitionElementsKind(node, *effect, *control); |
780 break; | 780 break; |
781 case IrOpcode::kLoadTypedElement: | 781 case IrOpcode::kLoadTypedElement: |
782 state = LowerLoadTypedElement(node, *effect, *control); | 782 state = LowerLoadTypedElement(node, *effect, *control); |
783 break; | 783 break; |
784 case IrOpcode::kStoreTypedElement: | 784 case IrOpcode::kStoreTypedElement: |
785 state = LowerStoreTypedElement(node, *effect, *control); | 785 state = LowerStoreTypedElement(node, *effect, *control); |
786 break; | 786 break; |
| 787 case IrOpcode::kLoadFunctionPrototype: |
| 788 state = LowerLoadFunctionPrototype(node, *effect, *control); |
| 789 break; |
787 case IrOpcode::kFloat64RoundUp: | 790 case IrOpcode::kFloat64RoundUp: |
788 state = LowerFloat64RoundUp(node, *effect, *control); | 791 state = LowerFloat64RoundUp(node, *effect, *control); |
789 break; | 792 break; |
790 case IrOpcode::kFloat64RoundDown: | 793 case IrOpcode::kFloat64RoundDown: |
791 state = LowerFloat64RoundDown(node, *effect, *control); | 794 state = LowerFloat64RoundDown(node, *effect, *control); |
792 break; | 795 break; |
793 case IrOpcode::kFloat64RoundTruncate: | 796 case IrOpcode::kFloat64RoundTruncate: |
794 state = LowerFloat64RoundTruncate(node, *effect, *control); | 797 state = LowerFloat64RoundTruncate(node, *effect, *control); |
795 break; | 798 break; |
796 case IrOpcode::kFloat64RoundTiesEven: | 799 case IrOpcode::kFloat64RoundTiesEven: |
(...skipping 2470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3267 // Perform the actual typed element access. | 3270 // Perform the actual typed element access. |
3268 effect = graph()->NewNode( | 3271 effect = graph()->NewNode( |
3269 simplified()->StoreElement( | 3272 simplified()->StoreElement( |
3270 AccessBuilder::ForTypedArrayElement(array_type, true)), | 3273 AccessBuilder::ForTypedArrayElement(array_type, true)), |
3271 storage, index, value, effect, control); | 3274 storage, index, value, effect, control); |
3272 | 3275 |
3273 return ValueEffectControl(nullptr, effect, control); | 3276 return ValueEffectControl(nullptr, effect, control); |
3274 } | 3277 } |
3275 | 3278 |
3276 EffectControlLinearizer::ValueEffectControl | 3279 EffectControlLinearizer::ValueEffectControl |
| 3280 EffectControlLinearizer::LowerLoadFunctionPrototype(Node* node, Node* effect, |
| 3281 Node* control) { |
| 3282 Node* function = node->InputAt(0); |
| 3283 |
| 3284 // Load the {JSFunction::prototype-or-initial-map} field. |
| 3285 Node* function_prototype_or_initial_map = effect = |
| 3286 graph()->NewNode(simplified()->LoadField( |
| 3287 AccessBuilder::ForJSFunctionPrototypeOrInitialMap()), |
| 3288 function, effect, control); |
| 3289 Node* function_prototype_or_initial_map_map = effect = |
| 3290 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), |
| 3291 function, effect, control); |
| 3292 |
| 3293 // Check if the {function} has an initial map. |
| 3294 Node* check0 = graph()->NewNode( |
| 3295 machine()->WordEqual(), function_prototype_or_initial_map_map, |
| 3296 jsgraph()->HeapConstant(factory()->meta_map())); |
| 3297 Node* branch0 = |
| 3298 graph()->NewNode(common()->Branch(BranchHint::kTrue), check0, control); |
| 3299 |
| 3300 Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0); |
| 3301 Node* etrue0 = effect; |
| 3302 Node* vtrue0; |
| 3303 { |
| 3304 // Load the "prototype" from the initial map. |
| 3305 vtrue0 = etrue0 = graph()->NewNode( |
| 3306 simplified()->LoadField(AccessBuilder::ForMapPrototype()), |
| 3307 function_prototype_or_initial_map, etrue0, if_true0); |
| 3308 } |
| 3309 |
| 3310 Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0); |
| 3311 Node* efalse0 = effect; |
| 3312 Node* vfalse0 = function_prototype_or_initial_map; |
| 3313 |
| 3314 control = graph()->NewNode(common()->Merge(2), if_true0, if_false0); |
| 3315 effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control); |
| 3316 Node* value = |
| 3317 graph()->NewNode(common()->Phi(MachineRepresentation::kTaggedPointer, 2), |
| 3318 vtrue0, vfalse0, control); |
| 3319 |
| 3320 return ValueEffectControl(value, effect, control); |
| 3321 } |
| 3322 |
| 3323 EffectControlLinearizer::ValueEffectControl |
3277 EffectControlLinearizer::LowerFloat64RoundUp(Node* node, Node* effect, | 3324 EffectControlLinearizer::LowerFloat64RoundUp(Node* node, Node* effect, |
3278 Node* control) { | 3325 Node* control) { |
3279 // Nothing to be done if a fast hardware instruction is available. | 3326 // Nothing to be done if a fast hardware instruction is available. |
3280 if (machine()->Float64RoundUp().IsSupported()) { | 3327 if (machine()->Float64RoundUp().IsSupported()) { |
3281 return ValueEffectControl(node, effect, control); | 3328 return ValueEffectControl(node, effect, control); |
3282 } | 3329 } |
3283 | 3330 |
3284 Node* const one = jsgraph()->Float64Constant(1.0); | 3331 Node* const one = jsgraph()->Float64Constant(1.0); |
3285 Node* const zero = jsgraph()->Float64Constant(0.0); | 3332 Node* const zero = jsgraph()->Float64Constant(0.0); |
3286 Node* const minus_zero = jsgraph()->Float64Constant(-0.0); | 3333 Node* const minus_zero = jsgraph()->Float64Constant(-0.0); |
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3774 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 3821 isolate(), graph()->zone(), callable.descriptor(), 0, flags, |
3775 Operator::kEliminatable); | 3822 Operator::kEliminatable); |
3776 to_number_operator_.set(common()->Call(desc)); | 3823 to_number_operator_.set(common()->Call(desc)); |
3777 } | 3824 } |
3778 return to_number_operator_.get(); | 3825 return to_number_operator_.get(); |
3779 } | 3826 } |
3780 | 3827 |
3781 } // namespace compiler | 3828 } // namespace compiler |
3782 } // namespace internal | 3829 } // namespace internal |
3783 } // namespace v8 | 3830 } // namespace v8 |
OLD | NEW |