Index: runtime/vm/assembler_arm64.cc |
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc |
index e163e1d626ddfbbedcf37063647563f91d4e5f58..fa19776e001bf37d921758caf66150d38348e636 100644 |
--- a/runtime/vm/assembler_arm64.cc |
+++ b/runtime/vm/assembler_arm64.cc |
@@ -1133,6 +1133,50 @@ void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) { |
} |
+void Assembler::ComputeRange(Register result, |
+ Register value, |
+ Register scratch, |
+ Label* not_mint) { |
+ Label done, not_smi; |
+ tsti(value, Immediate(kSmiTagMask)); |
+ b(¬_smi, NE); |
+ |
+ AsrImmediate(scratch, value, 32); |
+ LoadImmediate(result, ICData::kUint32Bit, PP); |
+ cmp(scratch, Operand(1)); |
+ b(&done, EQ); |
+ |
+ neg(scratch, scratch); |
+ add(result, scratch, Operand(ICData::kInt32Bit)); |
+ cmp(scratch, Operand(1)); |
+ LoadImmediate(TMP, ICData::kInt64Bit, PP); |
+ csel(result, result, TMP, LS); |
+ b(&done); |
+ |
+ Bind(¬_smi); |
+ CompareClassId(value, kMintCid, PP); |
+ b(not_mint, NE); |
+ |
+ LoadImmediate(result, ICData::kInt64Bit, PP); |
+ Bind(&done); |
+} |
+ |
+ |
+void Assembler::UpdateRangeFeedback(Register value, |
+ intptr_t idx, |
+ Register ic_data, |
+ Register scratch1, |
+ Register scratch2, |
+ Label* miss) { |
+ ComputeRange(scratch1, value, scratch2, miss); |
+ ldr(scratch2, FieldAddress(ic_data, ICData::range_feedback_offset()), kWord); |
+ orrw(scratch2, |
+ scratch2, |
+ Operand(scratch1, LSL, ICData::kBitsPerRangeFeedback * idx)); |
+ str(scratch2, FieldAddress(ic_data, ICData::range_feedback_offset()), kWord); |
+} |
+ |
+ |
// Frame entry and exit. |
void Assembler::ReserveAlignedFrameSpace(intptr_t frame_space) { |
// Reserve space for arguments and align frame before entering |