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

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

Issue 388863002: Better sequences for class id loading on ia32. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 5 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 | Annotate | Revision Log
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" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_IA32) 6 #if defined(TARGET_ARCH_IA32)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/code_generator.h" 9 #include "vm/code_generator.h"
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 283
284 284
285 void Assembler::cmove(Register dst, Register src) { 285 void Assembler::cmove(Register dst, Register src) {
286 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 286 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
287 EmitUint8(0x0F); 287 EmitUint8(0x0F);
288 EmitUint8(0x44); 288 EmitUint8(0x44);
289 EmitRegisterOperand(dst, src); 289 EmitRegisterOperand(dst, src);
290 } 290 }
291 291
292 292
293 void Assembler::cmovne(Register dst, Register src) {
294 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
295 EmitUint8(0x0F);
296 EmitUint8(0x45);
297 EmitRegisterOperand(dst, src);
298 }
299
300
293 void Assembler::cmovs(Register dst, Register src) { 301 void Assembler::cmovs(Register dst, Register src) {
294 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 302 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
295 EmitUint8(0x0F); 303 EmitUint8(0x0F);
296 EmitUint8(0x48); 304 EmitUint8(0x48);
297 EmitRegisterOperand(dst, src); 305 EmitRegisterOperand(dst, src);
298 } 306 }
299 307
300 308
301 void Assembler::cmovns(Register dst, Register src) { 309 void Assembler::cmovns(Register dst, Register src) {
302 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 310 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
(...skipping 2398 matching lines...) Expand 10 before | Expand all | Expand 10 after
2701 Register scratch) { 2709 Register scratch) {
2702 LoadClassId(scratch, object); 2710 LoadClassId(scratch, object);
2703 cmpl(scratch, Immediate(class_id)); 2711 cmpl(scratch, Immediate(class_id));
2704 } 2712 }
2705 2713
2706 2714
2707 void Assembler::LoadTaggedClassIdMayBeSmi( 2715 void Assembler::LoadTaggedClassIdMayBeSmi(
2708 Register result, Register object, Register tmp) { 2716 Register result, Register object, Register tmp) {
2709 ASSERT(object != tmp); 2717 ASSERT(object != tmp);
2710 ASSERT(result != tmp); 2718 ASSERT(result != tmp);
2719 static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos;
2711 2720
2712 // Make a copy of object since result and object can be the same register. 2721 if (result == object) {
2713 movl(tmp, object); 2722 movl(tmp, object);
2714 // Load up a null object. We only need it so we can use LoadClassId on it in 2723 } else {
2715 // the case that object is a Smi. 2724 tmp = object;
2716 movl(result, Immediate(reinterpret_cast<intptr_t>(Object::null()))); 2725 }
2717 // Check if the object is a Smi. 2726
2727 // Make a dummy "Object" whose cid is kSmiCid.
2728 movl(result, Immediate(reinterpret_cast<int32_t>(&kSmiCidSource) + 1));
2729
2730 // Check if object (in tmp) is a Smi.
2718 testl(tmp, Immediate(kSmiTagMask)); 2731 testl(tmp, Immediate(kSmiTagMask));
2719 // If the object *is* a Smi, load the null object into tmp. o/w leave alone.
2720 cmove(tmp, result);
2721 // Loads either the cid of the object if it isn't a Smi, or the cid of null
2722 // if it is a Smi, which will be ignored.
2723 LoadClassId(result, tmp);
2724 2732
2725 movl(tmp, Immediate(kSmiCid)); 2733 // If the object is not a Smi, use the original object to load the cid.
2726 // If object is a Smi, move the Smi cid into result. o/w leave alone. 2734 // Otherwise, the dummy object is used, and the result is kSmiCid.
2727 cmove(result, tmp); 2735 cmovne(result, tmp);
2728 // Finally, tag the result. 2736 LoadClassId(result, result);
2737
2738 // Tag the result.
2729 SmiTag(result); 2739 SmiTag(result);
2730 } 2740 }
2731 2741
2732 2742
2733 static const char* cpu_reg_names[kNumberOfCpuRegisters] = { 2743 static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
2734 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi" 2744 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"
2735 }; 2745 };
2736 2746
2737 2747
2738 const char* Assembler::RegisterName(Register reg) { 2748 const char* Assembler::RegisterName(Register reg) {
2739 ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters)); 2749 ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters));
2740 return cpu_reg_names[reg]; 2750 return cpu_reg_names[reg];
2741 } 2751 }
2742 2752
2743 2753
2744 static const char* xmm_reg_names[kNumberOfXmmRegisters] = { 2754 static const char* xmm_reg_names[kNumberOfXmmRegisters] = {
2745 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" 2755 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"
2746 }; 2756 };
2747 2757
2748 2758
2749 const char* Assembler::FpuRegisterName(FpuRegister reg) { 2759 const char* Assembler::FpuRegisterName(FpuRegister reg) {
2750 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); 2760 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters));
2751 return xmm_reg_names[reg]; 2761 return xmm_reg_names[reg];
2752 } 2762 }
2753 2763
2754 2764
2755 } // namespace dart 2765 } // namespace dart
2756 2766
2757 #endif // defined TARGET_ARCH_IA32 2767 #endif // defined TARGET_ARCH_IA32
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698