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

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

Issue 1544583002: For background compilation we copy ICData so that it is immutable during comnpilation. However, we … (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: l Created 4 years, 12 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
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 2719 matching lines...) Expand 10 before | Expand all | Expand 10 after
2730 for (intptr_t i = 0; i < stack_elements; i++) { 2730 for (intptr_t i = 0; i < stack_elements; i++) {
2731 popq(tmp); 2731 popq(tmp);
2732 } 2732 }
2733 return; 2733 return;
2734 } 2734 }
2735 addq(RSP, Immediate(stack_elements * kWordSize)); 2735 addq(RSP, Immediate(stack_elements * kWordSize));
2736 } 2736 }
2737 2737
2738 2738
2739 bool Assembler::CanLoadFromObjectPool(const Object& object) const { 2739 bool Assembler::CanLoadFromObjectPool(const Object& object) const {
2740 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
2740 ASSERT(!Thread::CanLoadFromThread(object)); 2741 ASSERT(!Thread::CanLoadFromThread(object));
2741 if (!constant_pool_allowed()) { 2742 if (!constant_pool_allowed()) {
2742 return false; 2743 return false;
2743 } 2744 }
2744 2745
2745 // TODO(zra, kmillikin): Also load other large immediates from the object 2746 // TODO(zra, kmillikin): Also load other large immediates from the object
2746 // pool 2747 // pool
2747 if (object.IsSmi()) { 2748 if (object.IsSmi()) {
2748 // If the raw smi does not fit into a 32-bit signed int, then we'll keep 2749 // If the raw smi does not fit into a 32-bit signed int, then we'll keep
2749 // the raw value in the object pool. 2750 // the raw value in the object pool.
(...skipping 15 matching lines...) Expand all
2765 2766
2766 2767
2767 void Assembler::LoadIsolate(Register dst) { 2768 void Assembler::LoadIsolate(Register dst) {
2768 movq(dst, Address(THR, Thread::isolate_offset())); 2769 movq(dst, Address(THR, Thread::isolate_offset()));
2769 } 2770 }
2770 2771
2771 2772
2772 void Assembler::LoadObjectHelper(Register dst, 2773 void Assembler::LoadObjectHelper(Register dst,
2773 const Object& object, 2774 const Object& object,
2774 bool is_unique) { 2775 bool is_unique) {
2776 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
2775 if (Thread::CanLoadFromThread(object)) { 2777 if (Thread::CanLoadFromThread(object)) {
2776 movq(dst, Address(THR, Thread::OffsetFromThread(object))); 2778 movq(dst, Address(THR, Thread::OffsetFromThread(object)));
2777 } else if (CanLoadFromObjectPool(object)) { 2779 } else if (CanLoadFromObjectPool(object)) {
2778 const int32_t offset = ObjectPool::element_offset( 2780 const int32_t offset = ObjectPool::element_offset(
2779 is_unique ? object_pool_wrapper_.AddObject(object) 2781 is_unique ? object_pool_wrapper_.AddObject(object)
2780 : object_pool_wrapper_.FindObject(object)); 2782 : object_pool_wrapper_.FindObject(object));
2781 LoadWordFromPoolOffset(dst, offset - kHeapObjectTag); 2783 LoadWordFromPoolOffset(dst, offset - kHeapObjectTag);
2782 } else { 2784 } else {
2783 ASSERT(object.IsSmi() || object.InVMHeap()); 2785 ASSERT(object.IsSmi() || object.InVMHeap());
2784 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses); 2786 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses);
(...skipping 17 matching lines...) Expand all
2802 LoadObjectHelper(dst, object, false); 2804 LoadObjectHelper(dst, object, false);
2803 } 2805 }
2804 2806
2805 2807
2806 void Assembler::LoadUniqueObject(Register dst, const Object& object) { 2808 void Assembler::LoadUniqueObject(Register dst, const Object& object) {
2807 LoadObjectHelper(dst, object, true); 2809 LoadObjectHelper(dst, object, true);
2808 } 2810 }
2809 2811
2810 2812
2811 void Assembler::StoreObject(const Address& dst, const Object& object) { 2813 void Assembler::StoreObject(const Address& dst, const Object& object) {
2814 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
2812 if (Thread::CanLoadFromThread(object)) { 2815 if (Thread::CanLoadFromThread(object)) {
2813 movq(TMP, Address(THR, Thread::OffsetFromThread(object))); 2816 movq(TMP, Address(THR, Thread::OffsetFromThread(object)));
2814 movq(dst, TMP); 2817 movq(dst, TMP);
2815 } else if (CanLoadFromObjectPool(object)) { 2818 } else if (CanLoadFromObjectPool(object)) {
2816 LoadObject(TMP, object); 2819 LoadObject(TMP, object);
2817 movq(dst, TMP); 2820 movq(dst, TMP);
2818 } else { 2821 } else {
2819 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses); 2822 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses);
2820 MoveImmediate(dst, Immediate(reinterpret_cast<int64_t>(object.raw()))); 2823 MoveImmediate(dst, Immediate(reinterpret_cast<int64_t>(object.raw())));
2821 } 2824 }
2822 } 2825 }
2823 2826
2824 2827
2825 void Assembler::PushObject(const Object& object) { 2828 void Assembler::PushObject(const Object& object) {
2829 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
2826 if (Thread::CanLoadFromThread(object)) { 2830 if (Thread::CanLoadFromThread(object)) {
2827 pushq(Address(THR, Thread::OffsetFromThread(object))); 2831 pushq(Address(THR, Thread::OffsetFromThread(object)));
2828 } else if (CanLoadFromObjectPool(object)) { 2832 } else if (CanLoadFromObjectPool(object)) {
2829 LoadObject(TMP, object); 2833 LoadObject(TMP, object);
2830 pushq(TMP); 2834 pushq(TMP);
2831 } else { 2835 } else {
2832 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses); 2836 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses);
2833 PushImmediate(Immediate(reinterpret_cast<int64_t>(object.raw()))); 2837 PushImmediate(Immediate(reinterpret_cast<int64_t>(object.raw())));
2834 } 2838 }
2835 } 2839 }
2836 2840
2837 2841
2838 void Assembler::CompareObject(Register reg, const Object& object) { 2842 void Assembler::CompareObject(Register reg, const Object& object) {
2843 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal());
2839 if (Thread::CanLoadFromThread(object)) { 2844 if (Thread::CanLoadFromThread(object)) {
2840 cmpq(reg, Address(THR, Thread::OffsetFromThread(object))); 2845 cmpq(reg, Address(THR, Thread::OffsetFromThread(object)));
2841 } else if (CanLoadFromObjectPool(object)) { 2846 } else if (CanLoadFromObjectPool(object)) {
2842 const int32_t offset = 2847 const int32_t offset =
2843 ObjectPool::element_offset(object_pool_wrapper_.FindObject(object)); 2848 ObjectPool::element_offset(object_pool_wrapper_.FindObject(object));
2844 cmpq(reg, Address(PP, offset-kHeapObjectTag)); 2849 cmpq(reg, Address(PP, offset-kHeapObjectTag));
2845 } else { 2850 } else {
2846 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses); 2851 ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses);
2847 CompareImmediate( 2852 CompareImmediate(
2848 reg, Immediate(reinterpret_cast<int64_t>(object.raw()))); 2853 reg, Immediate(reinterpret_cast<int64_t>(object.raw())));
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
3055 popq(value); 3060 popq(value);
3056 #endif // defined(DEBUG) 3061 #endif // defined(DEBUG)
3057 // No store buffer update. 3062 // No store buffer update.
3058 } 3063 }
3059 3064
3060 3065
3061 void Assembler::StoreIntoObjectNoBarrier(Register object, 3066 void Assembler::StoreIntoObjectNoBarrier(Register object,
3062 const Address& dest, 3067 const Address& dest,
3063 const Object& value, 3068 const Object& value,
3064 FieldContent old_content) { 3069 FieldContent old_content) {
3070 ASSERT(!value.IsICData() || ICData::Cast(value).IsOriginal());
3065 VerifyHeapWord(dest, old_content); 3071 VerifyHeapWord(dest, old_content);
3066 if (VerifiedMemory::enabled()) { 3072 if (VerifiedMemory::enabled()) {
3067 const Register temp = RCX; 3073 const Register temp = RCX;
3068 pushq(temp); 3074 pushq(temp);
3069 leaq(temp, dest); 3075 leaq(temp, dest);
3070 StoreObject(Address(temp, 0), value); 3076 StoreObject(Address(temp, 0), value);
3071 StoreObject(Address(temp, VerifiedMemory::offset()), value); 3077 StoreObject(Address(temp, VerifiedMemory::offset()), value);
3072 popq(temp); 3078 popq(temp);
3073 } else { 3079 } else {
3074 StoreObject(dest, value); 3080 StoreObject(dest, value);
(...skipping 840 matching lines...) Expand 10 before | Expand all | Expand 10 after
3915 3921
3916 3922
3917 const char* Assembler::FpuRegisterName(FpuRegister reg) { 3923 const char* Assembler::FpuRegisterName(FpuRegister reg) {
3918 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); 3924 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters));
3919 return xmm_reg_names[reg]; 3925 return xmm_reg_names[reg];
3920 } 3926 }
3921 3927
3922 } // namespace dart 3928 } // namespace dart
3923 3929
3924 #endif // defined TARGET_ARCH_X64 3930 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/assembler_mips.cc ('k') | runtime/vm/compiler.cc » ('j') | runtime/vm/compiler.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698