Index: runtime/vm/intermediate_language_x64.cc |
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc |
index a6212c2b9add40c0dd882e9bcc3e186e692af11b..9623ec2b51f0b04559952a8140f63ee3a1c94df8 100644 |
--- a/runtime/vm/intermediate_language_x64.cc |
+++ b/runtime/vm/intermediate_language_x64.cc |
@@ -479,8 +479,7 @@ static void EmitBranchOnCondition(FlowGraphCompiler* compiler, |
static Condition EmitInt64ComparisonOp(FlowGraphCompiler* compiler, |
const LocationSummary& locs, |
- Token::Kind kind, |
- BranchLabels labels) { |
+ Token::Kind kind) { |
Location left = locs.in(0); |
Location right = locs.in(1); |
ASSERT(!left.IsConstant() || !right.IsConstant()); |
@@ -536,7 +535,7 @@ static Condition EmitDoubleComparisonOp(FlowGraphCompiler* compiler, |
Condition EqualityCompareInstr::EmitComparisonCode(FlowGraphCompiler* compiler, |
BranchLabels labels) { |
if ((operation_cid() == kSmiCid) || (operation_cid() == kMintCid)) { |
- return EmitInt64ComparisonOp(compiler, *locs(), kind(), labels); |
+ return EmitInt64ComparisonOp(compiler, *locs(), kind()); |
} else { |
ASSERT(operation_cid() == kDoubleCid); |
return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels); |
@@ -727,7 +726,7 @@ LocationSummary* RelationalOpInstr::MakeLocationSummary(Zone* zone, |
Condition RelationalOpInstr::EmitComparisonCode(FlowGraphCompiler* compiler, |
BranchLabels labels) { |
if ((operation_cid() == kSmiCid) || (operation_cid() == kMintCid)) { |
- return EmitInt64ComparisonOp(compiler, *locs(), kind(), labels); |
+ return EmitInt64ComparisonOp(compiler, *locs(), kind()); |
} else { |
ASSERT(operation_cid() == kDoubleCid); |
return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels); |
@@ -2838,6 +2837,11 @@ LocationSummary* CheckedSmiOpInstr::MakeLocationSummary(Zone* zone, |
summary->set_in(0, Location::RequiresRegister()); |
summary->set_in(1, Location::RequiresRegister()); |
switch (op_kind()) { |
+ case Token::kEQ: |
+ case Token::kLT: |
+ case Token::kLTE: |
+ case Token::kGT: |
+ case Token::kGTE: |
case Token::kADD: |
case Token::kSUB: |
summary->set_out(0, Location::RequiresRegister()); |
@@ -2889,6 +2893,24 @@ void CheckedSmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
ASSERT(left == result); |
__ xorq(result, right); |
break; |
+ case Token::kEQ: |
+ case Token::kLT: |
+ case Token::kLTE: |
+ case Token::kGT: |
+ case Token::kGTE: { |
+ Label true_label, false_label, done; |
+ BranchLabels labels = { &true_label, &false_label, &false_label }; |
+ Condition true_condition = |
+ EmitInt64ComparisonOp(compiler, *locs(), op_kind()); |
+ EmitBranchOnCondition(compiler, true_condition, labels); |
+ __ Bind(&false_label); |
+ __ LoadObject(result, Bool::False()); |
+ __ jmp(&done); |
+ __ Bind(&true_label); |
+ __ LoadObject(result, Bool::True()); |
+ __ Bind(&done); |
+ break; |
+ } |
default: |
UNIMPLEMENTED(); |
} |