Index: runtime/vm/intermediate_language_arm64.cc |
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc |
index cb225a2ac6b79183f2aa8962af8c23bf21bc4ba3..56d388298348c01fbc442a59ce67a599b04be714 100644 |
--- a/runtime/vm/intermediate_language_arm64.cc |
+++ b/runtime/vm/intermediate_language_arm64.cc |
@@ -2809,8 +2809,19 @@ void CheckedSmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
Register left = locs()->in(0).reg(); |
Register right = locs()->in(1).reg(); |
Register result = locs()->out(0).reg(); |
- __ orr(result, left, Operand(right)); |
- __ tsti(result, Immediate(kSmiTagMask)); |
+ intptr_t left_cid = this->left()->Type()->ToCid(); |
+ intptr_t right_cid = this->right()->Type()->ToCid(); |
+ bool combined_smi_check = false; |
+ if (left_cid == kSmiCid) { |
rmacnak
2016/03/22 16:46:16
Missing same definition case.
Florian Schneider
2016/03/22 17:02:44
Done here and for CheckEitherNonSmiInstr as well.
|
+ __ tsti(right, Immediate(kSmiTagMask)); |
+ } else if (right_cid == kSmiCid) { |
+ __ tsti(left, Immediate(kSmiTagMask)); |
+ } else { |
+ combined_smi_check = true; |
+ __ orr(result, left, Operand(right)); |
+ __ tsti(result, Immediate(kSmiTagMask)); |
+ } |
+ |
__ b(slow_path->entry_label(), NE); |
switch (op_kind()) { |
case Token::kADD: |
@@ -2822,7 +2833,10 @@ void CheckedSmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
__ b(slow_path->entry_label(), VS); |
break; |
case Token::kBIT_OR: |
- // Operation part of combined smi check. |
+ // Operation may be part of combined smi check. |
+ if (!combined_smi_check) { |
+ __ orr(result, left, Operand(right)); |
+ } |
break; |
case Token::kBIT_AND: |
__ and_(result, left, Operand(right)); |