| Index: runtime/vm/assembler_ia32.cc
|
| diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
|
| index a62ce8114255ea45efa66d726cbc84bf47408c1b..12901c1c7ee62d1377ae41e9599ed97d72b118c1 100644
|
| --- a/runtime/vm/assembler_ia32.cc
|
| +++ b/runtime/vm/assembler_ia32.cc
|
| @@ -1562,6 +1562,36 @@ void Assembler::EmitGenericShift(int rm,
|
| }
|
|
|
|
|
| +void Assembler::GetClassOf(Register result, Register object, Register scratch) {
|
| + ASSERT(scratch != result);
|
| + LoadObjectClassId(scratch, object);
|
| +
|
| + movl(result, FieldAddress(CTX, Context::isolate_offset()));
|
| + const intptr_t table_offset_in_isolate =
|
| + Isolate::class_table_offset() + ClassTable::table_offset();
|
| + movl(result, Address(result, table_offset_in_isolate));
|
| + movl(result, Address(result, scratch, TIMES_4, 0));
|
| +}
|
| +
|
| +
|
| +void Assembler::LoadObjectClassId(Register result, Register object) {
|
| + ASSERT(RawObject::kClassTagBit == 16);
|
| + ASSERT(RawObject::kClassTagSize == 16);
|
| + const intptr_t class_id_offset = Object::tags_offset() +
|
| + RawObject::kClassTagBit / kBitsPerByte;
|
| + movzxw(result, FieldAddress(object, class_id_offset));
|
| +}
|
| +
|
| +
|
| +void Assembler::CompareClassOf(Register object,
|
| + const Class& clazz,
|
| + Register scratch) {
|
| + // TODO(vegorov): find all occurances of comparison pattern.
|
| + LoadObjectClassId(scratch, object);
|
| + CompareClassId(scratch, clazz);
|
| +}
|
| +
|
| +
|
| void Assembler::Comment(const char* comment) {
|
| if (FLAG_code_comments) {
|
| comments_.Add(new CodeComment(buffer_.GetPosition(),
|
|
|