Chromium Code Reviews| 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)); |