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" | 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 Loading... | |
| 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 2395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2698 | 2706 |
| 2699 void Assembler::CompareClassId(Register object, | 2707 void Assembler::CompareClassId(Register object, |
| 2700 intptr_t class_id, | 2708 intptr_t class_id, |
| 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) { |
|
Vyacheslav Egorov (Google)
2014/07/12 00:19:40
I don't think you actually need tmp. When I was tr
| |
| 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); |
|
Vyacheslav Egorov (Google)
2014/07/12 00:19:40
I think this move is really redundant in all cases
| |
| 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)); | |
|
Vyacheslav Egorov (Google)
2014/07/12 00:19:40
+ kHeapObjectTag instead of +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 |
| OLD | NEW |