| 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/globals.h" // Needed here to get TARGET_ARCH_MIPS. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_MIPS. |
| 6 #if defined(TARGET_ARCH_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
| 7 | 7 |
| 8 #include "vm/flow_graph_compiler.h" | 8 #include "vm/flow_graph_compiler.h" |
| 9 | 9 |
| 10 #include "lib/error.h" | 10 #include "lib/error.h" |
| (...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 ASSERT(parsed_function().first_parameter_index() == kFirstLocalSlotIndex); | 594 ASSERT(parsed_function().first_parameter_index() == kFirstLocalSlotIndex); |
| 595 | 595 |
| 596 // Check that min_num_pos_args <= num_pos_args <= max_num_pos_args, | 596 // Check that min_num_pos_args <= num_pos_args <= max_num_pos_args, |
| 597 // where num_pos_args is the number of positional arguments passed in. | 597 // where num_pos_args is the number of positional arguments passed in. |
| 598 const int min_num_pos_args = num_fixed_params; | 598 const int min_num_pos_args = num_fixed_params; |
| 599 const int max_num_pos_args = num_fixed_params + num_opt_pos_params; | 599 const int max_num_pos_args = num_fixed_params + num_opt_pos_params; |
| 600 | 600 |
| 601 __ lw(T2, FieldAddress(S4, ArgumentsDescriptor::positional_count_offset())); | 601 __ lw(T2, FieldAddress(S4, ArgumentsDescriptor::positional_count_offset())); |
| 602 // Check that min_num_pos_args <= num_pos_args. | 602 // Check that min_num_pos_args <= num_pos_args. |
| 603 Label wrong_num_arguments; | 603 Label wrong_num_arguments; |
| 604 __ BranchLess(T2, Smi::RawValue(min_num_pos_args), &wrong_num_arguments); | 604 __ BranchSignedLess(T2, Smi::RawValue(min_num_pos_args), |
| 605 &wrong_num_arguments); |
| 605 | 606 |
| 606 // Check that num_pos_args <= max_num_pos_args. | 607 // Check that num_pos_args <= max_num_pos_args. |
| 607 __ BranchGreater(T2, Smi::RawValue(max_num_pos_args), &wrong_num_arguments); | 608 __ BranchSignedGreater(T2, Smi::RawValue(max_num_pos_args), |
| 609 &wrong_num_arguments); |
| 608 | 610 |
| 609 // Copy positional arguments. | 611 // Copy positional arguments. |
| 610 // Argument i passed at fp[kLastParamSlotIndex + num_args - 1 - i] is copied | 612 // Argument i passed at fp[kLastParamSlotIndex + num_args - 1 - i] is copied |
| 611 // to fp[kFirstLocalSlotIndex - i]. | 613 // to fp[kFirstLocalSlotIndex - i]. |
| 612 | 614 |
| 613 __ lw(T1, FieldAddress(S4, ArgumentsDescriptor::count_offset())); | 615 __ lw(T1, FieldAddress(S4, ArgumentsDescriptor::count_offset())); |
| 614 // Since T1 and T2 are Smi, use sll 1 instead of sll 2. | 616 // Since T1 and T2 are Smi, use sll 1 instead of sll 2. |
| 615 // Let T1 point to the last passed positional argument, i.e. to | 617 // Let T1 point to the last passed positional argument, i.e. to |
| 616 // fp[kLastParamSlotIndex + num_args - 1 - (num_pos_args - 1)]. | 618 // fp[kLastParamSlotIndex + num_args - 1 - (num_pos_args - 1)]. |
| 617 __ subu(T1, T1, T2); | 619 __ subu(T1, T1, T2); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 ASSERT(num_opt_pos_params > 0); | 719 ASSERT(num_opt_pos_params > 0); |
| 718 __ lw(T2, | 720 __ lw(T2, |
| 719 FieldAddress(S4, ArgumentsDescriptor::positional_count_offset())); | 721 FieldAddress(S4, ArgumentsDescriptor::positional_count_offset())); |
| 720 __ SmiUntag(T2); | 722 __ SmiUntag(T2); |
| 721 for (int i = 0; i < num_opt_pos_params; i++) { | 723 for (int i = 0; i < num_opt_pos_params; i++) { |
| 722 Label next_parameter; | 724 Label next_parameter; |
| 723 // Handle this optional positional parameter only if k or fewer positional | 725 // Handle this optional positional parameter only if k or fewer positional |
| 724 // arguments have been passed, where k is param_pos, the position of this | 726 // arguments have been passed, where k is param_pos, the position of this |
| 725 // optional parameter in the formal parameter list. | 727 // optional parameter in the formal parameter list. |
| 726 const int param_pos = num_fixed_params + i; | 728 const int param_pos = num_fixed_params + i; |
| 727 __ BranchGreater(T2, param_pos, &next_parameter); | 729 __ BranchSignedGreater(T2, param_pos, &next_parameter); |
| 728 // Load T3 with default argument. | 730 // Load T3 with default argument. |
| 729 const Object& value = Object::ZoneHandle( | 731 const Object& value = Object::ZoneHandle( |
| 730 parsed_function().default_parameter_values().At(i)); | 732 parsed_function().default_parameter_values().At(i)); |
| 731 __ LoadObject(T3, value); | 733 __ LoadObject(T3, value); |
| 732 // Assign T3 to fp[kFirstLocalSlotIndex - param_pos]. | 734 // Assign T3 to fp[kFirstLocalSlotIndex - param_pos]. |
| 733 // We do not use the final allocation index of the variable here, i.e. | 735 // We do not use the final allocation index of the variable here, i.e. |
| 734 // scope->VariableAt(i)->index(), because captured variables still need | 736 // scope->VariableAt(i)->index(), because captured variables still need |
| 735 // to be copied to the context that is not yet allocated. | 737 // to be copied to the context that is not yet allocated. |
| 736 const intptr_t computed_param_pos = kFirstLocalSlotIndex - param_pos; | 738 const intptr_t computed_param_pos = kFirstLocalSlotIndex - param_pos; |
| 737 __ sw(T3, Address(FP, computed_param_pos * kWordSize)); | 739 __ sw(T3, Address(FP, computed_param_pos * kWordSize)); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 878 __ addiu(T1, T1, Immediate(1)); | 880 __ addiu(T1, T1, Immediate(1)); |
| 879 __ sw(T1, FieldAddress(function_reg, | 881 __ sw(T1, FieldAddress(function_reg, |
| 880 Function::usage_counter_offset())); | 882 Function::usage_counter_offset())); |
| 881 } else { | 883 } else { |
| 882 __ lw(T1, FieldAddress(function_reg, | 884 __ lw(T1, FieldAddress(function_reg, |
| 883 Function::usage_counter_offset())); | 885 Function::usage_counter_offset())); |
| 884 } | 886 } |
| 885 | 887 |
| 886 // Skip Branch if T1 is less than the threshold. | 888 // Skip Branch if T1 is less than the threshold. |
| 887 Label dont_branch; | 889 Label dont_branch; |
| 888 __ BranchLess(T1, FLAG_optimization_counter_threshold, &dont_branch); | 890 __ BranchSignedLess(T1, FLAG_optimization_counter_threshold, |
| 891 &dont_branch); |
| 889 | 892 |
| 890 ASSERT(function_reg == T0); | 893 ASSERT(function_reg == T0); |
| 891 __ Branch(&StubCode::OptimizeFunctionLabel()); | 894 __ Branch(&StubCode::OptimizeFunctionLabel()); |
| 892 | 895 |
| 893 __ Bind(&dont_branch); | 896 __ Bind(&dont_branch); |
| 894 } | 897 } |
| 895 } else { | 898 } else { |
| 896 AddCurrentDescriptor(PcDescriptors::kEntryPatch, | 899 AddCurrentDescriptor(PcDescriptors::kEntryPatch, |
| 897 Isolate::kNoDeoptId, | 900 Isolate::kNoDeoptId, |
| 898 0); // No token position. | 901 0); // No token position. |
| (...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1558 __ AddImmediate(SP, kDoubleSize); | 1561 __ AddImmediate(SP, kDoubleSize); |
| 1559 } | 1562 } |
| 1560 | 1563 |
| 1561 | 1564 |
| 1562 #undef __ | 1565 #undef __ |
| 1563 | 1566 |
| 1564 | 1567 |
| 1565 } // namespace dart | 1568 } // namespace dart |
| 1566 | 1569 |
| 1567 #endif // defined TARGET_ARCH_MIPS | 1570 #endif // defined TARGET_ARCH_MIPS |
| OLD | NEW |