| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/flow_graph_inliner.h" | 5 #include "vm/flow_graph_inliner.h" |
| 6 | 6 |
| 7 #include "vm/aot_optimizer.h" | 7 #include "vm/aot_optimizer.h" |
| 8 #include "vm/block_scheduler.h" | 8 #include "vm/block_scheduler.h" |
| 9 #include "vm/branch_optimizer.h" | 9 #include "vm/branch_optimizer.h" |
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
| (...skipping 2384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2395 new(Z) Value(left), | 2395 new(Z) Value(left), |
| 2396 new(Z) Value(right), | 2396 new(Z) Value(right), |
| 2397 call->deopt_id(), call->token_pos()); | 2397 call->deopt_id(), call->token_pos()); |
| 2398 flow_graph->AppendTo(*entry, double_bin_op, call->env(), FlowGraph::kValue); | 2398 flow_graph->AppendTo(*entry, double_bin_op, call->env(), FlowGraph::kValue); |
| 2399 *last = double_bin_op; | 2399 *last = double_bin_op; |
| 2400 | 2400 |
| 2401 return true; | 2401 return true; |
| 2402 } | 2402 } |
| 2403 | 2403 |
| 2404 | 2404 |
| 2405 static bool InlineDoubleTestOp(FlowGraph* flow_graph, |
| 2406 Instruction* call, |
| 2407 MethodRecognizer::Kind kind, |
| 2408 TargetEntryInstr** entry, |
| 2409 Definition** last) { |
| 2410 if (!CanUnboxDouble()) { |
| 2411 return false; |
| 2412 } |
| 2413 Definition* d = call->ArgumentAt(0); |
| 2414 |
| 2415 *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(), |
| 2416 call->GetBlock()->try_index()); |
| 2417 (*entry)->InheritDeoptTarget(Z, call); |
| 2418 // Arguments are checked. No need for class check. |
| 2419 |
| 2420 DoubleTestOpInstr* double_test_op = |
| 2421 new(Z) DoubleTestOpInstr(kind, |
| 2422 new(Z) Value(d), |
| 2423 call->deopt_id(), |
| 2424 call->token_pos()); |
| 2425 flow_graph->AppendTo( |
| 2426 *entry, double_test_op, call->env(), FlowGraph::kValue); |
| 2427 *last = double_test_op; |
| 2428 |
| 2429 return true; |
| 2430 } |
| 2431 |
| 2432 |
| 2405 static bool InlineSmiBitAndFromSmi(FlowGraph* flow_graph, | 2433 static bool InlineSmiBitAndFromSmi(FlowGraph* flow_graph, |
| 2406 Instruction* call, | 2434 Instruction* call, |
| 2407 TargetEntryInstr** entry, | 2435 TargetEntryInstr** entry, |
| 2408 Definition** last) { | 2436 Definition** last) { |
| 2409 Definition* left = call->ArgumentAt(0); | 2437 Definition* left = call->ArgumentAt(0); |
| 2410 Definition* right = call->ArgumentAt(1); | 2438 Definition* right = call->ArgumentAt(1); |
| 2411 | 2439 |
| 2412 *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(), | 2440 *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(), |
| 2413 call->GetBlock()->try_index()); | 2441 call->GetBlock()->try_index()); |
| 2414 (*entry)->InheritDeoptTarget(Z, call); | 2442 (*entry)->InheritDeoptTarget(Z, call); |
| (...skipping 1227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3642 return InlineStringBaseCharAt( | 3670 return InlineStringBaseCharAt( |
| 3643 flow_graph, call, receiver_cid, entry, last); | 3671 flow_graph, call, receiver_cid, entry, last); |
| 3644 case MethodRecognizer::kDoubleAdd: | 3672 case MethodRecognizer::kDoubleAdd: |
| 3645 return InlineDoubleOp(flow_graph, Token::kADD, call, entry, last); | 3673 return InlineDoubleOp(flow_graph, Token::kADD, call, entry, last); |
| 3646 case MethodRecognizer::kDoubleSub: | 3674 case MethodRecognizer::kDoubleSub: |
| 3647 return InlineDoubleOp(flow_graph, Token::kSUB, call, entry, last); | 3675 return InlineDoubleOp(flow_graph, Token::kSUB, call, entry, last); |
| 3648 case MethodRecognizer::kDoubleMul: | 3676 case MethodRecognizer::kDoubleMul: |
| 3649 return InlineDoubleOp(flow_graph, Token::kMUL, call, entry, last); | 3677 return InlineDoubleOp(flow_graph, Token::kMUL, call, entry, last); |
| 3650 case MethodRecognizer::kDoubleDiv: | 3678 case MethodRecognizer::kDoubleDiv: |
| 3651 return InlineDoubleOp(flow_graph, Token::kDIV, call, entry, last); | 3679 return InlineDoubleOp(flow_graph, Token::kDIV, call, entry, last); |
| 3680 case MethodRecognizer::kDouble_getIsNaN: |
| 3681 case MethodRecognizer::kDouble_getIsInfinite: |
| 3682 return InlineDoubleTestOp(flow_graph, call, kind, entry, last); |
| 3652 case MethodRecognizer::kGrowableArraySetData: | 3683 case MethodRecognizer::kGrowableArraySetData: |
| 3653 ASSERT(receiver_cid == kGrowableObjectArrayCid); | 3684 ASSERT(receiver_cid == kGrowableObjectArrayCid); |
| 3654 ASSERT(ic_data.NumberOfChecks() == 1); | 3685 ASSERT(ic_data.NumberOfChecks() == 1); |
| 3655 return InlineGrowableArraySetter( | 3686 return InlineGrowableArraySetter( |
| 3656 flow_graph, GrowableObjectArray::data_offset(), kEmitStoreBarrier, | 3687 flow_graph, GrowableObjectArray::data_offset(), kEmitStoreBarrier, |
| 3657 call, entry, last); | 3688 call, entry, last); |
| 3658 case MethodRecognizer::kGrowableArraySetLength: | 3689 case MethodRecognizer::kGrowableArraySetLength: |
| 3659 ASSERT(receiver_cid == kGrowableObjectArrayCid); | 3690 ASSERT(receiver_cid == kGrowableObjectArrayCid); |
| 3660 ASSERT(ic_data.NumberOfChecks() == 1); | 3691 ASSERT(ic_data.NumberOfChecks() == 1); |
| 3661 return InlineGrowableArraySetter( | 3692 return InlineGrowableArraySetter( |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3805 return true; | 3836 return true; |
| 3806 } | 3837 } |
| 3807 | 3838 |
| 3808 default: | 3839 default: |
| 3809 return false; | 3840 return false; |
| 3810 } | 3841 } |
| 3811 } | 3842 } |
| 3812 | 3843 |
| 3813 | 3844 |
| 3814 } // namespace dart | 3845 } // namespace dart |
| OLD | NEW |