Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(92)

Side by Side Diff: runtime/vm/assembler_x64.cc

Issue 2893553002: More compact string representation on 64 bit. (Closed)
Patch Set: Slava feedback Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/assembler_arm64.cc ('k') | runtime/vm/clustered_snapshot.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 3606 matching lines...) Expand 10 before | Expand all | Expand 10 after
3617 EmitRegisterREX(operand, REX_W); 3617 EmitRegisterREX(operand, REX_W);
3618 } else { 3618 } else {
3619 EmitRegisterREX(operand, REX_NONE); 3619 EmitRegisterREX(operand, REX_NONE);
3620 } 3620 }
3621 EmitUint8(0xD3); 3621 EmitUint8(0xD3);
3622 EmitOperand(rm, Operand(operand)); 3622 EmitOperand(rm, Operand(operand));
3623 } 3623 }
3624 3624
3625 3625
3626 void Assembler::LoadClassId(Register result, Register object) { 3626 void Assembler::LoadClassId(Register result, Register object) {
3627 ASSERT(RawObject::kClassIdTagPos == kBitsPerInt32); 3627 ASSERT(RawObject::kClassIdTagPos == 16);
3628 ASSERT(RawObject::kClassIdTagSize == kBitsPerInt32); 3628 ASSERT(RawObject::kClassIdTagSize == 16);
3629 ASSERT(sizeof(classid_t) == sizeof(uint32_t)); 3629 ASSERT(sizeof(classid_t) == sizeof(uint16_t));
3630 const intptr_t class_id_offset = 3630 const intptr_t class_id_offset =
3631 Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte; 3631 Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
3632 movl(result, FieldAddress(object, class_id_offset)); 3632 movzxw(result, FieldAddress(object, class_id_offset));
3633 } 3633 }
3634 3634
3635 3635
3636 void Assembler::LoadClassById(Register result, Register class_id) { 3636 void Assembler::LoadClassById(Register result, Register class_id) {
3637 ASSERT(result != class_id); 3637 ASSERT(result != class_id);
3638 LoadIsolate(result); 3638 LoadIsolate(result);
3639 const intptr_t offset = 3639 const intptr_t offset =
3640 Isolate::class_table_offset() + ClassTable::table_offset(); 3640 Isolate::class_table_offset() + ClassTable::table_offset();
3641 movq(result, Address(result, offset)); 3641 movq(result, Address(result, offset));
3642 movq(result, Address(result, class_id, TIMES_8, 0)); 3642 movq(result, Address(result, class_id, TIMES_8, 0));
3643 } 3643 }
3644 3644
3645 3645
3646 void Assembler::LoadClass(Register result, Register object) { 3646 void Assembler::LoadClass(Register result, Register object) {
3647 LoadClassId(TMP, object); 3647 LoadClassId(TMP, object);
3648 LoadClassById(result, TMP); 3648 LoadClassById(result, TMP);
3649 } 3649 }
3650 3650
3651 3651
3652 void Assembler::CompareClassId(Register object, intptr_t class_id) { 3652 void Assembler::CompareClassId(Register object, intptr_t class_id) {
3653 LoadClassId(TMP, object); 3653 LoadClassId(TMP, object);
3654 cmpl(TMP, Immediate(class_id)); 3654 cmpl(TMP, Immediate(class_id));
3655 } 3655 }
3656 3656
3657 3657
3658 void Assembler::SmiUntagOrCheckClass(Register object, 3658 void Assembler::SmiUntagOrCheckClass(Register object,
3659 intptr_t class_id, 3659 intptr_t class_id,
3660 Label* is_smi) { 3660 Label* is_smi) {
3661 ASSERT(kSmiTagShift == 1); 3661 ASSERT(kSmiTagShift == 1);
3662 ASSERT(RawObject::kClassIdTagPos == kBitsPerInt32); 3662 ASSERT(RawObject::kClassIdTagPos == 16);
3663 ASSERT(RawObject::kClassIdTagSize == kBitsPerInt32); 3663 ASSERT(RawObject::kClassIdTagSize == 16);
3664 ASSERT(sizeof(classid_t) == sizeof(uint32_t)); 3664 ASSERT(sizeof(classid_t) == sizeof(uint16_t));
3665 const intptr_t class_id_offset = 3665 const intptr_t class_id_offset =
3666 Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte; 3666 Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
3667 3667
3668 // Untag optimistically. Tag bit is shifted into the CARRY. 3668 // Untag optimistically. Tag bit is shifted into the CARRY.
3669 SmiUntag(object); 3669 SmiUntag(object);
3670 j(NOT_CARRY, is_smi, kNearJump); 3670 j(NOT_CARRY, is_smi, kNearJump);
3671 // Load cid: can't use LoadClassId, object is untagged. Use TIMES_2 scale 3671 // Load cid: can't use LoadClassId, object is untagged. Use TIMES_2 scale
3672 // factor in the addressing mode to compensate for this. 3672 // factor in the addressing mode to compensate for this.
3673 movl(TMP, Address(object, TIMES_2, class_id_offset)); 3673 movzxw(TMP, Address(object, TIMES_2, class_id_offset));
3674 cmpl(TMP, Immediate(class_id)); 3674 cmpl(TMP, Immediate(class_id));
3675 } 3675 }
3676 3676
3677 3677
3678 void Assembler::LoadClassIdMayBeSmi(Register result, Register object) { 3678 void Assembler::LoadClassIdMayBeSmi(Register result, Register object) {
3679 Label smi; 3679 Label smi;
3680 3680
3681 if (result == object) { 3681 if (result == object) {
3682 Label join; 3682 Label join;
3683 3683
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
3799 3799
3800 3800
3801 const char* Assembler::FpuRegisterName(FpuRegister reg) { 3801 const char* Assembler::FpuRegisterName(FpuRegister reg) {
3802 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); 3802 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters));
3803 return xmm_reg_names[reg]; 3803 return xmm_reg_names[reg];
3804 } 3804 }
3805 3805
3806 } // namespace dart 3806 } // namespace dart
3807 3807
3808 #endif // defined TARGET_ARCH_X64 3808 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/assembler_arm64.cc ('k') | runtime/vm/clustered_snapshot.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698