OLD | NEW |
---|---|
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // NOLINT | 5 #include "vm/globals.h" // NOLINT |
6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
10 #include "vm/heap.h" | 10 #include "vm/heap.h" |
(...skipping 3727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3738 EmitRegisterREX(operand, REX_W); | 3738 EmitRegisterREX(operand, REX_W); |
3739 } else { | 3739 } else { |
3740 EmitRegisterREX(operand, REX_NONE); | 3740 EmitRegisterREX(operand, REX_NONE); |
3741 } | 3741 } |
3742 EmitUint8(0xD3); | 3742 EmitUint8(0xD3); |
3743 EmitOperand(rm, Operand(operand)); | 3743 EmitOperand(rm, Operand(operand)); |
3744 } | 3744 } |
3745 | 3745 |
3746 | 3746 |
3747 void Assembler::LoadClassId(Register result, Register object) { | 3747 void Assembler::LoadClassId(Register result, Register object) { |
3748 ASSERT(RawObject::kClassIdTagPos == 16); | 3748 ASSERT(RawObject::kClassIdTagPos == 32); |
3749 ASSERT(RawObject::kClassIdTagSize == 16); | 3749 ASSERT(RawObject::kClassIdTagSize == 32); |
siva
2015/06/12 22:08:11
Ditto.
| |
3750 const intptr_t class_id_offset = Object::tags_offset() + | 3750 const intptr_t class_id_offset = Object::tags_offset() + |
3751 RawObject::kClassIdTagPos / kBitsPerByte; | 3751 RawObject::kClassIdTagPos / kBitsPerByte; |
3752 movzxw(result, FieldAddress(object, class_id_offset)); | 3752 movl(result, FieldAddress(object, class_id_offset)); |
3753 } | 3753 } |
siva
2015/06/12 22:08:11
We need the COMPILE_ASSERT here of sizeof(classid_
rmacnak
2015/06/12 23:27:22
Done.
| |
3754 | 3754 |
3755 | 3755 |
3756 void Assembler::LoadClassById(Register result, Register class_id, Register pp) { | 3756 void Assembler::LoadClassById(Register result, Register class_id, Register pp) { |
3757 ASSERT(result != class_id); | 3757 ASSERT(result != class_id); |
3758 Isolate* isolate = Isolate::Current(); | 3758 Isolate* isolate = Isolate::Current(); |
3759 LoadImmediate(result, Immediate(isolate->class_table()->TableAddress()), pp); | 3759 LoadImmediate(result, Immediate(isolate->class_table()->TableAddress()), pp); |
3760 movq(result, Address(result, 0)); | 3760 movq(result, Address(result, 0)); |
3761 movq(result, Address(result, class_id, TIMES_8, 0)); | 3761 movq(result, Address(result, class_id, TIMES_8, 0)); |
3762 } | 3762 } |
3763 | 3763 |
3764 | 3764 |
3765 void Assembler::LoadClass(Register result, Register object, Register pp) { | 3765 void Assembler::LoadClass(Register result, Register object, Register pp) { |
3766 LoadClassId(TMP, object); | 3766 LoadClassId(TMP, object); |
3767 LoadClassById(result, TMP, pp); | 3767 LoadClassById(result, TMP, pp); |
3768 } | 3768 } |
3769 | 3769 |
3770 | 3770 |
3771 void Assembler::CompareClassId(Register object, intptr_t class_id) { | 3771 void Assembler::CompareClassId(Register object, intptr_t class_id) { |
3772 LoadClassId(TMP, object); | 3772 LoadClassId(TMP, object); |
3773 cmpl(TMP, Immediate(class_id)); | 3773 cmpl(TMP, Immediate(class_id)); |
3774 } | 3774 } |
3775 | 3775 |
3776 | 3776 |
3777 void Assembler::SmiUntagOrCheckClass(Register object, | 3777 void Assembler::SmiUntagOrCheckClass(Register object, |
3778 intptr_t class_id, | 3778 intptr_t class_id, |
3779 Label* is_smi) { | 3779 Label* is_smi) { |
3780 ASSERT(kSmiTagShift == 1); | 3780 ASSERT(kSmiTagShift == 1); |
3781 ASSERT(RawObject::kClassIdTagPos == 16); | 3781 ASSERT(RawObject::kClassIdTagPos == 32); |
3782 ASSERT(RawObject::kClassIdTagSize == 16); | 3782 ASSERT(RawObject::kClassIdTagSize == 32); |
siva
2015/06/12 22:08:11
Ditto comment.
| |
3783 const intptr_t class_id_offset = Object::tags_offset() + | 3783 const intptr_t class_id_offset = Object::tags_offset() + |
3784 RawObject::kClassIdTagPos / kBitsPerByte; | 3784 RawObject::kClassIdTagPos / kBitsPerByte; |
3785 | 3785 |
3786 // Untag optimistically. Tag bit is shifted into the CARRY. | 3786 // Untag optimistically. Tag bit is shifted into the CARRY. |
3787 SmiUntag(object); | 3787 SmiUntag(object); |
3788 j(NOT_CARRY, is_smi, kNearJump); | 3788 j(NOT_CARRY, is_smi, kNearJump); |
3789 // Load cid: can't use LoadClassId, object is untagged. Use TIMES_2 scale | 3789 // Load cid: can't use LoadClassId, object is untagged. Use TIMES_2 scale |
3790 // factor in the addressing mode to compensate for this. | 3790 // factor in the addressing mode to compensate for this. |
3791 movzxw(TMP, Address(object, TIMES_2, class_id_offset)); | 3791 movl(TMP, Address(object, TIMES_2, class_id_offset)); |
3792 cmpl(TMP, Immediate(class_id)); | 3792 cmpl(TMP, Immediate(class_id)); |
3793 } | 3793 } |
3794 | 3794 |
3795 | 3795 |
3796 void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) { | 3796 void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) { |
3797 ASSERT(result != object); | 3797 ASSERT(result != object); |
3798 | 3798 |
3799 // Load up a null object. We only need it so we can use LoadClassId on it in | 3799 // Load up a null object. We only need it so we can use LoadClassId on it in |
3800 // the case that object is a Smi. | 3800 // the case that object is a Smi. |
3801 LoadObject(result, Object::null_object(), PP); | 3801 LoadObject(result, Object::null_object(), PP); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3926 | 3926 |
3927 | 3927 |
3928 const char* Assembler::FpuRegisterName(FpuRegister reg) { | 3928 const char* Assembler::FpuRegisterName(FpuRegister reg) { |
3929 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); | 3929 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); |
3930 return xmm_reg_names[reg]; | 3930 return xmm_reg_names[reg]; |
3931 } | 3931 } |
3932 | 3932 |
3933 } // namespace dart | 3933 } // namespace dart |
3934 | 3934 |
3935 #endif // defined TARGET_ARCH_X64 | 3935 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |