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

Unified Diff: runtime/vm/intermediate_language_x64.cc

Issue 10867050: Separate branch on strict compare into a new IL instruction. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/intermediate_language_x64.cc
===================================================================
--- runtime/vm/intermediate_language_x64.cc (revision 11303)
+++ runtime/vm/intermediate_language_x64.cc (working copy)
@@ -449,7 +449,6 @@
Token::Kind kind,
BranchInstr* branch,
intptr_t deopt_id,
- intptr_t token_pos,
intptr_t try_index) {
ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
Register left = locs.in(0).reg();
@@ -551,7 +550,6 @@
Token::Kind kind,
BranchInstr* branch,
intptr_t deopt_id,
- intptr_t token_pos,
intptr_t try_index) {
Register left = locs.in(0).reg();
Register right = locs.in(1).reg();
@@ -608,7 +606,6 @@
Token::Kind kind,
BranchInstr* branch,
intptr_t deopt_id,
- intptr_t token_pos,
intptr_t try_index) {
Register left = locs.in(0).reg();
Register right = locs.in(1).reg();
@@ -635,20 +632,20 @@
if (receiver_class_id() == kSmiCid) {
// Deoptimizes if both arguments not Smi.
EmitSmiComparisonOp(compiler, *locs(), kind(), NULL, // No branch.
- deopt_id(), token_pos(), try_index());
+ deopt_id(), try_index());
return;
}
if (receiver_class_id() == kDoubleCid) {
// Deoptimizes if both arguments are Smi, or if none is Double or Smi.
EmitDoubleComparisonOp(compiler, *locs(), kind(), NULL, // No branch.
- deopt_id(), token_pos(), try_index());
+ deopt_id(), try_index());
return;
}
const bool is_checked_strict_equal =
HasICData() && ic_data()->AllTargetsHaveSameOwner(kInstanceCid);
if (is_checked_strict_equal) {
EmitCheckedStrictEqual(compiler, *ic_data(), *locs(), kind(), NULL,
- deopt_id(), token_pos(), try_index());
+ deopt_id(), try_index());
return;
}
if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
@@ -696,12 +693,12 @@
void RelationalOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
if (operands_class_id() == kSmiCid) {
EmitSmiComparisonOp(compiler, *locs(), kind(), NULL,
- deopt_id(), token_pos(), try_index());
+ deopt_id(), try_index());
return;
}
if (operands_class_id() == kDoubleCid) {
EmitDoubleComparisonOp(compiler, *locs(), kind(), NULL,
- deopt_id(), token_pos(), try_index());
+ deopt_id(), try_index());
return;
}
@@ -2035,15 +2032,6 @@
LocationSummary* BranchInstr::MakeLocationSummary() const {
- if ((kind() == Token::kEQ_STRICT) || (kind() == Token::kNE_STRICT)) {
- const int kNumInputs = 2;
- const int kNumTemps = 0;
- LocationSummary* locs =
- new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
- locs->set_in(0, Location::RequiresRegister());
- locs->set_in(1, Location::RequiresRegister());
- return locs;
- }
if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
if (ICDataWithBothClassIds(*ic_data(), kSmiCid) ||
ICDataWithBothClassIds(*ic_data(), kDoubleCid) ||
@@ -2081,29 +2069,21 @@
void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- if ((kind() == Token::kEQ_STRICT) || (kind() == Token::kNE_STRICT)) {
- Register left = locs()->in(0).reg();
- Register right = locs()->in(1).reg();
- __ cmpq(left, right);
- Condition cond = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
- EmitBranchOnCondition(compiler, cond);
- return;
- }
// Relational or equality.
if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
if (ICDataWithBothClassIds(*ic_data(), kSmiCid)) {
EmitSmiComparisonOp(compiler, *locs(), kind(), this,
- deopt_id(), token_pos(), try_index());
+ deopt_id(), try_index());
return;
}
if (ICDataWithBothClassIds(*ic_data(), kDoubleCid)) {
EmitDoubleComparisonOp(compiler, *locs(), kind(), this,
- deopt_id(), token_pos(), try_index());
+ deopt_id(), try_index());
return;
}
if (IsCheckedStrictEquals(*ic_data(), kind())) {
EmitCheckedStrictEqual(compiler, *ic_data(), *locs(), kind(), this,
- deopt_id(), token_pos(), try_index());
+ deopt_id(), try_index());
return;
}
// TODO(srdjan): Add Smi/Double, Double/Smi comparisons.
@@ -2149,6 +2129,27 @@
}
+LocationSummary* StrictCompareAndBranchInstr::MakeLocationSummary() const {
+ const int kNumInputs = 2;
+ const int kNumTemps = 0;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
+ locs->set_in(1, Location::RequiresRegister());
+ return locs;
+}
+
+
+void StrictCompareAndBranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ Register left = locs()->in(0).reg();
+ Register right = locs()->in(1).reg();
+ __ cmpq(left, right);
+ Condition cond = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL;
+ EmitBranchOnCondition(compiler, cond);
+ return;
+}
+
+
LocationSummary* CheckClassComp::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 1;

Powered by Google App Engine
This is Rietveld 408576698