Chromium Code Reviews| 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 |