Index: runtime/vm/assembler_ia32.cc |
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc |
index f05f3bc832abc8066fe7ba6546724b593cebba93..865fafa35c1167c0b8af09199c6f82be8fd5c7df 100644 |
--- a/runtime/vm/assembler_ia32.cc |
+++ b/runtime/vm/assembler_ia32.cc |
@@ -1497,6 +1497,13 @@ void Assembler::orl(Register dst, const Address& address) { |
} |
+void Assembler::orl(const Address& address, Register reg) { |
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
+ EmitUint8(0x09); |
+ EmitOperand(reg, address); |
+} |
+ |
+ |
void Assembler::xorl(Register dst, Register src) { |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0x33); |
@@ -2918,6 +2925,49 @@ void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) { |
} |
+void Assembler::ComputeRange(Register result, |
+ Register value, |
+ Register lo_temp, |
+ Register hi_temp, |
+ Label* not_mint) { |
+ Label done; |
+ movl(result, value); |
+ shrl(result, Immediate(kBitsPerWord - 1)); // Sign bit. |
+ testl(value, Immediate(kSmiTagMask)); |
+ j(ZERO, &done, Assembler::kNearJump); |
+ CompareClassId(value, kMintCid, result); |
+ j(NOT_EQUAL, not_mint); |
+ movl(lo_temp, FieldAddress(value, Mint::value_offset())); |
+ movl(hi_temp, FieldAddress(value, Mint::value_offset() + kWordSize)); |
+ movl(result, Immediate(ICData::kInt32RangeBit)); |
+ subl(result, hi_temp); // 10 (positive int32), 11 (negative int32) |
+ sarl(lo_temp, Immediate(kBitsPerWord - 1)); |
+ cmpl(lo_temp, hi_temp); |
+ j(EQUAL, &done, Assembler::kNearJump); |
+ movl(result, Immediate(ICData::kUint32RangeBit)); // Uint32 |
+ cmpl(hi_temp, Immediate(0)); |
+ j(EQUAL, &done, Assembler::kNearJump); |
+ movl(result, Immediate(ICData::kInt64RangeBit)); // Int64 |
+ Bind(&done); |
+} |
+ |
+ |
+void Assembler::UpdateRangeFeedback(Register value, |
+ intptr_t index, |
+ Register ic_data, |
+ Register scratch1, |
+ Register scratch2, |
+ Register scratch3, |
+ Label* miss) { |
+ ASSERT(ICData::IsValidRangeFeedbackIndex(index)); |
+ ComputeRange(scratch1, value, scratch2, scratch3, miss); |
+ if (index != 0) { |
+ shll(scratch1, Immediate(ICData::kBitsPerRangeFeedback * index)); |
+ } |
+ orl(FieldAddress(ic_data, ICData::range_feedback_offset()), scratch1); |
+} |
+ |
+ |
Address Assembler::ElementAddressForIntIndex(bool is_external, |
intptr_t cid, |
intptr_t index_scale, |