| Index: runtime/vm/assembler_arm.cc
|
| ===================================================================
|
| --- runtime/vm/assembler_arm.cc (revision 20598)
|
| +++ runtime/vm/assembler_arm.cc (working copy)
|
| @@ -1296,6 +1296,45 @@
|
| }
|
|
|
|
|
| +void Assembler::LoadClassId(Register result, Register object) {
|
| + ASSERT(RawObject::kClassIdTagBit == 16);
|
| + ASSERT(RawObject::kClassIdTagSize == 16);
|
| + const intptr_t class_id_offset = Object::tags_offset() +
|
| + RawObject::kClassIdTagBit / kBitsPerByte;
|
| + ldrh(result, FieldAddress(object, class_id_offset));
|
| +}
|
| +
|
| +
|
| +void Assembler::LoadClassById(Register result, Register class_id) {
|
| + ASSERT(result != class_id);
|
| + ldr(result, FieldAddress(CTX, Context::isolate_offset()));
|
| + const intptr_t table_offset_in_isolate =
|
| + Isolate::class_table_offset() + ClassTable::table_offset();
|
| + ldr(result, Address(result, table_offset_in_isolate));
|
| + ldr(result, Address(result, class_id, LSL, 2));
|
| +}
|
| +
|
| +
|
| +void Assembler::LoadClass(Register result, Register object, Register scratch) {
|
| + ASSERT(scratch != result);
|
| + LoadClassId(scratch, object);
|
| +
|
| + ldr(result, FieldAddress(CTX, Context::isolate_offset()));
|
| + const intptr_t table_offset_in_isolate =
|
| + Isolate::class_table_offset() + ClassTable::table_offset();
|
| + ldr(result, Address(result, table_offset_in_isolate));
|
| + ldr(result, Address(result, scratch, LSL, 2));
|
| +}
|
| +
|
| +
|
| +void Assembler::CompareClassId(Register object,
|
| + intptr_t class_id,
|
| + Register scratch) {
|
| + LoadClassId(scratch, object);
|
| + CompareImmediate(scratch, class_id);
|
| +}
|
| +
|
| +
|
| void Assembler::Bind(Label* label) {
|
| ASSERT(!label->IsBound());
|
| int bound_pc = buffer_.Size();
|
|
|