Chromium Code Reviews| Index: runtime/vm/assembler_ia32.cc |
| diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc |
| index f05f3bc832abc8066fe7ba6546724b593cebba93..411545e1278663b29b98e063c3b7d98d68af8ee4 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) { |
|
Florian Schneider
2014/12/12 12:12:40
Please add a test to assember cc tests.
Vyacheslav Egorov (Google)
2014/12/12 14:49:14
Done.
|
| + 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,48 @@ 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::kInt32Bit)); |
| + 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::kUint32Bit)); // Uint32 |
| + cmpl(hi_temp, Immediate(0)); |
| + j(EQUAL, &done, Assembler::kNearJump); |
| + movl(result, Immediate(ICData::kInt64Bit)); // Int64 |
| + Bind(&done); |
| +} |
| + |
| + |
| +void Assembler::UpdateRangeFeedback(Register value, |
| + intptr_t index, |
| + Register ic_data, |
| + Register scratch1, |
| + Register scratch2, |
| + Register scratch3, |
| + Label* miss) { |
| + 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, |