| Index: runtime/vm/intermediate_language_arm64.cc
|
| diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
|
| index 1e4baa2673825cf84df5182a5843281c0fd81d62..fa404f501b536b6f46105d936c91046cdc54bc25 100644
|
| --- a/runtime/vm/intermediate_language_arm64.cc
|
| +++ b/runtime/vm/intermediate_language_arm64.cc
|
| @@ -2954,6 +2954,34 @@ void CheckedSmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| case Token::kBIT_XOR:
|
| __ eor(result, left, Operand(right));
|
| break;
|
| + case Token::kSHL:
|
| + ASSERT(result != left);
|
| + ASSERT(result != right);
|
| + __ CompareImmediate(
|
| + right, reinterpret_cast<int64_t>(Smi::New(Smi::kBits)));
|
| + __ b(slow_path->entry_label(), CS);
|
| +
|
| + __ SmiUntag(TMP, right);
|
| + __ lslv(result, left, TMP);
|
| + __ asrv(TMP2, result, TMP);
|
| + __ CompareRegisters(left, TMP2);
|
| + __ b(slow_path->entry_label(), NE); // Overflow.
|
| + break;
|
| + case Token::kSHR:
|
| + ASSERT(result != left);
|
| + ASSERT(result != right);
|
| + __ SmiUntag(result, right);
|
| + __ CompareRegisters(result, ZR);
|
| + __ b(slow_path->entry_label(), LT);
|
| +
|
| + // If shift amount is bigger than 63, set to 63.
|
| + __ LoadImmediate(TMP, 0x3F);
|
| + __ CompareRegisters(result, TMP);
|
| + __ csel(result, TMP, result, GT);
|
| + __ SmiUntag(TMP, left);
|
| + __ asrv(result, TMP, result);
|
| + __ SmiTag(result);
|
| + break;
|
| default:
|
| UNIMPLEMENTED();
|
| }
|
|
|