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

Unified Diff: runtime/vm/intermediate_language_ia32.cc

Issue 10808035: Apply Kevin's suggestions, make branch-compare generation more robust (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/intermediate_language.h ('k') | runtime/vm/intermediate_language_x64.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/intermediate_language_ia32.cc
===================================================================
--- runtime/vm/intermediate_language_ia32.cc (revision 9777)
+++ runtime/vm/intermediate_language_ia32.cc (working copy)
@@ -192,6 +192,21 @@
}
+static Condition TokenKindToSmiCondition(Token::Kind kind) {
+ switch (kind) {
+ case Token::kEQ: return EQUAL;
+ case Token::kNE: return NOT_EQUAL;
+ case Token::kLT: return LESS;
+ case Token::kGT: return GREATER;
+ case Token::kLTE: return LESS_EQUAL;
+ case Token::kGTE: return GREATER_EQUAL;
+ default:
+ UNREACHABLE();
+ return OVERFLOW;
+ }
+}
+
+
LocationSummary* EqualityCompareComp::MakeLocationSummary() const {
const intptr_t kNumInputs = 2;
if (receiver_class_id() != kObject) {
@@ -248,7 +263,7 @@
__ cmpl(left, right);
Register result = comp->locs()->out().reg();
Label load_true, done;
- __ j(EQUAL, &load_true, Assembler::kNearJump);
+ __ j(TokenKindToSmiCondition(comp->kind()), &load_true, Assembler::kNearJump);
__ LoadObject(result, compiler->bool_false());
__ jmp(&done, Assembler::kNearJump);
__ Bind(&load_true);
@@ -277,8 +292,9 @@
__ j(NOT_EQUAL, deopt);
__ movsd(XMM0, FieldAddress(left, Double::value_offset()));
__ movsd(XMM1, FieldAddress(right, Double::value_offset()));
- compiler->EmitDoubleCompareBool(
- EQUAL, XMM0, XMM1, comp->locs()->out().reg());
+ compiler->EmitDoubleCompareBool(TokenKindToSmiCondition(comp->kind()),
+ XMM0, XMM1,
+ comp->locs()->out().reg());
}
@@ -301,6 +317,16 @@
kNoArgumentNames,
kNumArgumentsChecked);
ASSERT(comp->locs()->out().reg() == EAX);
+ if (comp->kind() == Token::kNE) {
+ Label done, false_label;
+ __ CompareObject(EAX, compiler->bool_true());
+ __ j(EQUAL, &false_label, Assembler::kNearJump);
+ __ LoadObject(EAX, compiler->bool_true());
+ __ jmp(&done, Assembler::kNearJump);
+ __ Bind(&false_label);
+ __ LoadObject(EAX, compiler->bool_false());
+ __ Bind(&done);
+ }
}
@@ -312,6 +338,7 @@
intptr_t cid,
intptr_t token_pos,
intptr_t try_index) {
+ ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
ASSERT(ic_data.NumberOfChecks() > 0);
ASSERT(ic_data.num_args_tested() == 1);
@@ -335,7 +362,7 @@
__ j(ZERO, deopt); // Smi deopts.
__ LoadClassId(temp, left);
}
- Condition cond = (kind == Token::kEQ) ? EQUAL : NOT_EQUAL;
+ Condition cond = TokenKindToSmiCondition(kind);
Label done;
for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
ASSERT((ic_data.GetReceiverClassIdAt(i) != kSmi) || (i == 0));
@@ -369,7 +396,18 @@
target,
kNumberOfArguments,
kNoArgumentNames);
- if (branch != NULL) {
+ if (branch == NULL) {
+ if (kind == Token::kNE) {
+ Label false_label;
+ __ CompareObject(EAX, compiler->bool_true());
+ __ j(EQUAL, &false_label, Assembler::kNearJump);
+ __ LoadObject(EAX, compiler->bool_true());
+ __ jmp(&done, Assembler::kNearJump);
+ __ Bind(&false_label);
+ __ LoadObject(EAX, compiler->bool_false());
+ __ jmp(&done);
+ }
+ } else {
__ CompareObject(EAX, compiler->bool_true());
branch->EmitBranchOnCondition(compiler, cond);
}
@@ -394,6 +432,7 @@
intptr_t cid,
intptr_t token_pos,
intptr_t try_index) {
+ ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
Register left = locs.in(0).reg();
Register right = locs.in(1).reg();
@@ -404,7 +443,7 @@
__ j(NOT_EQUAL, &non_null_compare, Assembler::kNearJump);
// Comparison with NULL is "===".
__ cmpl(left, right);
- Condition cond = (kind == Token::kEQ) ? EQUAL : NOT_EQUAL;
+ Condition cond = TokenKindToSmiCondition(kind);
if (branch != NULL) {
branch->EmitBranchOnCondition(compiler, cond);
} else {
@@ -436,7 +475,7 @@
return;
}
if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
- EmitGenericEqualityCompare(compiler, *locs(), Token::kEQ, NULL,
+ EmitGenericEqualityCompare(compiler, *locs(), kind(), NULL,
*ic_data(), cid(), token_pos(), try_index());
} else {
Register left = locs()->in(0).reg();
@@ -466,21 +505,6 @@
}
-static Condition TokenKindToSmiCondition(Token::Kind kind) {
- switch (kind) {
- case Token::kEQ: return EQUAL;
- case Token::kNE: return NOT_EQUAL;
- case Token::kLT: return LESS;
- case Token::kGT: return GREATER;
- case Token::kLTE: return LESS_EQUAL;
- case Token::kGTE: return GREATER_EQUAL;
- default:
- UNREACHABLE();
- return OVERFLOW;
- }
-}
-
-
static void EmitSmiComparisonOp(FlowGraphCompiler* compiler,
const LocationSummary& locs,
Token::Kind kind,
« no previous file with comments | « runtime/vm/intermediate_language.h ('k') | runtime/vm/intermediate_language_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698