Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(691)

Side by Side Diff: runtime/vm/intermediate_language.cc

Issue 2955073005: VM-codegen: Add IL instruction to check if a Smi is in a constant range
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/intermediate_language.h" 5 #include "vm/intermediate_language.h"
6 6
7 #include "vm/bit_vector.h" 7 #include "vm/bit_vector.h"
8 #include "vm/bootstrap.h" 8 #include "vm/bootstrap.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/constant_propagator.h" 10 #include "vm/constant_propagator.h"
(...skipping 2960 matching lines...) Expand 10 before | Expand all | Expand 10 after
2971 2971
2972 // Spread class-ids to preceding classes where a lookup yields the same 2972 // Spread class-ids to preceding classes where a lookup yields the same
2973 // method. A polymorphic target is not really the same method since its 2973 // method. A polymorphic target is not really the same method since its
2974 // behaviour depends on the receiver class-id, so we don't spread the 2974 // behaviour depends on the receiver class-id, so we don't spread the
2975 // class-ids in that case. 2975 // class-ids in that case.
2976 for (int idx = 0; idx < length; idx++) { 2976 for (int idx = 0; idx < length; idx++) {
2977 int lower_limit_cid = (idx == 0) ? -1 : targets[idx - 1].cid_end; 2977 int lower_limit_cid = (idx == 0) ? -1 : targets[idx - 1].cid_end;
2978 const Function& target = *targets.TargetAt(idx)->target; 2978 const Function& target = *targets.TargetAt(idx)->target;
2979 if (MethodRecognizer::PolymorphicTarget(target)) continue; 2979 if (MethodRecognizer::PolymorphicTarget(target)) continue;
2980 for (int i = targets[idx].cid_start - 1; i > lower_limit_cid; i--) { 2980 for (int i = targets[idx].cid_start - 1; i > lower_limit_cid; i--) {
2981 if (FlowGraphCompiler::LookupMethodFor(i, name, args_desc, &fn) && 2981 bool class_is_abstract = false;
2982 if (FlowGraphCompiler::LookupMethodFor(i, name, args_desc, &fn,
2983 &class_is_abstract) &&
2982 fn.raw() == target.raw()) { 2984 fn.raw() == target.raw()) {
2983 targets[idx].cid_start = i; 2985 if (!class_is_abstract) {
2986 targets[idx].cid_start = i;
2987 }
2984 } else { 2988 } else {
2985 break; 2989 break;
2986 } 2990 }
2987 } 2991 }
2988 } 2992 }
2989 // Spread class-ids to following classes where a lookup yields the same 2993 // Spread class-ids to following classes where a lookup yields the same
2990 // method. 2994 // method.
2991 for (int idx = 0; idx < length; idx++) { 2995 for (int idx = 0; idx < length; idx++) {
2992 int upper_limit_cid = 2996 int upper_limit_cid =
2993 (idx == length - 1) ? 1000000000 : targets[idx + 1].cid_start; 2997 (idx == length - 1) ? 1000000000 : targets[idx + 1].cid_start;
2994 const Function& target = *targets.TargetAt(idx)->target; 2998 const Function& target = *targets.TargetAt(idx)->target;
2995 if (MethodRecognizer::PolymorphicTarget(target)) continue; 2999 if (MethodRecognizer::PolymorphicTarget(target)) continue;
2996 for (int i = targets[idx].cid_end + 1; i < upper_limit_cid; i++) { 3000 for (int i = targets[idx].cid_end + 1; i < upper_limit_cid; i++) {
2997 if (FlowGraphCompiler::LookupMethodFor(i, name, args_desc, &fn) && 3001 bool class_is_abstract = false;
3002 if (FlowGraphCompiler::LookupMethodFor(i, name, args_desc, &fn,
3003 &class_is_abstract) &&
2998 fn.raw() == target.raw()) { 3004 fn.raw() == target.raw()) {
2999 targets[idx].cid_end = i; 3005 if (!class_is_abstract) {
3006 targets[idx].cid_end = i;
3007 }
3000 } else { 3008 } else {
3001 break; 3009 break;
3002 } 3010 }
3003 } 3011 }
3004 } 3012 }
3005 targets.MergeIntoRanges(); 3013 targets.MergeIntoRanges();
3006 return &targets; 3014 return &targets;
3007 } 3015 }
3008 3016
3009 3017
(...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after
3878 } 3886 }
3879 3887
3880 3888
3881 ComparisonInstr* DoubleTestOpInstr::CopyWithNewOperands(Value* new_left, 3889 ComparisonInstr* DoubleTestOpInstr::CopyWithNewOperands(Value* new_left,
3882 Value* new_right) { 3890 Value* new_right) {
3883 UNREACHABLE(); 3891 UNREACHABLE();
3884 return NULL; 3892 return NULL;
3885 } 3893 }
3886 3894
3887 3895
3896 ComparisonInstr* SmiRangeComparisonInstr::CopyWithNewOperands(
3897 Value* new_left,
3898 Value* new_right) {
3899 UNREACHABLE();
3900 return NULL;
3901 }
3902
3903
3888 ComparisonInstr* EqualityCompareInstr::CopyWithNewOperands(Value* new_left, 3904 ComparisonInstr* EqualityCompareInstr::CopyWithNewOperands(Value* new_left,
3889 Value* new_right) { 3905 Value* new_right) {
3890 return new EqualityCompareInstr(token_pos(), kind(), new_left, new_right, 3906 return new EqualityCompareInstr(token_pos(), kind(), new_left, new_right,
3891 operation_cid(), deopt_id()); 3907 operation_cid(), deopt_id());
3892 } 3908 }
3893 3909
3894 3910
3895 ComparisonInstr* RelationalOpInstr::CopyWithNewOperands(Value* new_left, 3911 ComparisonInstr* RelationalOpInstr::CopyWithNewOperands(Value* new_left,
3896 Value* new_right) { 3912 Value* new_right) {
3897 return new RelationalOpInstr(token_pos(), kind(), new_left, new_right, 3913 return new RelationalOpInstr(token_pos(), kind(), new_left, new_right,
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after
4393 "native function '%s' (%" Pd " arguments) cannot be found", 4409 "native function '%s' (%" Pd " arguments) cannot be found",
4394 native_name().ToCString(), function().NumParameters()); 4410 native_name().ToCString(), function().NumParameters());
4395 } 4411 }
4396 set_is_auto_scope(auto_setup_scope); 4412 set_is_auto_scope(auto_setup_scope);
4397 set_native_c_function(native_function); 4413 set_native_c_function(native_function);
4398 } 4414 }
4399 4415
4400 #undef __ 4416 #undef __
4401 4417
4402 } // namespace dart 4418 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698