| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 <setjmp.h> // NOLINT | 5 #include <setjmp.h> // NOLINT |
| 6 #include <stdlib.h> | 6 #include <stdlib.h> |
| 7 | 7 |
| 8 #include "vm/globals.h" | 8 #include "vm/globals.h" |
| 9 #if defined(TARGET_ARCH_DBC) | 9 #if defined(TARGET_ARCH_DBC) |
| 10 | 10 |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 return true; | 315 return true; |
| 316 } | 316 } |
| 317 | 317 |
| 318 static RawObject* AllocateDouble(Thread* thread, double value) { | 318 static RawObject* AllocateDouble(Thread* thread, double value) { |
| 319 const intptr_t instance_size = Double::InstanceSize(); | 319 const intptr_t instance_size = Double::InstanceSize(); |
| 320 const uword start = thread->heap()->new_space()->TryAllocate(instance_size); | 320 const uword start = thread->heap()->new_space()->TryAllocate(instance_size); |
| 321 if (LIKELY(start != 0)) { | 321 if (LIKELY(start != 0)) { |
| 322 uword tags = 0; | 322 uword tags = 0; |
| 323 tags = RawObject::ClassIdTag::update(kDoubleCid, tags); | 323 tags = RawObject::ClassIdTag::update(kDoubleCid, tags); |
| 324 tags = RawObject::SizeTag::update(instance_size, tags); | 324 tags = RawObject::SizeTag::update(instance_size, tags); |
| 325 // Also writes zero in the hash_ field. |
| 325 *reinterpret_cast<uword*>(start + Double::tags_offset()) = tags; | 326 *reinterpret_cast<uword*>(start + Double::tags_offset()) = tags; |
| 326 *reinterpret_cast<double*>(start + Double::value_offset()) = value; | 327 *reinterpret_cast<double*>(start + Double::value_offset()) = value; |
| 327 return reinterpret_cast<RawObject*>(start + kHeapObjectTag); | 328 return reinterpret_cast<RawObject*>(start + kHeapObjectTag); |
| 328 } | 329 } |
| 329 return NULL; | 330 return NULL; |
| 330 } | 331 } |
| 331 | 332 |
| 332 static bool Double_add(Thread* thread, RawObject** FP, RawObject** result) { | 333 static bool Double_add(Thread* thread, RawObject** FP, RawObject** result) { |
| 333 double d1, d2; | 334 double d1, d2; |
| 334 if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) { | 335 if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) { |
| (...skipping 2513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2848 } | 2849 } |
| 2849 | 2850 |
| 2850 // TODO(vegorov) allocation bytecodes can benefit from the new-space | 2851 // TODO(vegorov) allocation bytecodes can benefit from the new-space |
| 2851 // allocation fast-path that does not transition into the runtime system. | 2852 // allocation fast-path that does not transition into the runtime system. |
| 2852 { | 2853 { |
| 2853 BYTECODE(AllocateUninitializedContext, A_D); | 2854 BYTECODE(AllocateUninitializedContext, A_D); |
| 2854 const uint16_t num_context_variables = rD; | 2855 const uint16_t num_context_variables = rD; |
| 2855 const intptr_t instance_size = Context::InstanceSize(num_context_variables); | 2856 const intptr_t instance_size = Context::InstanceSize(num_context_variables); |
| 2856 const uword start = thread->heap()->new_space()->TryAllocate(instance_size); | 2857 const uword start = thread->heap()->new_space()->TryAllocate(instance_size); |
| 2857 if (LIKELY(start != 0)) { | 2858 if (LIKELY(start != 0)) { |
| 2858 uword tags = 0; | 2859 uint32_t tags = 0; |
| 2859 tags = RawObject::ClassIdTag::update(kContextCid, tags); | 2860 tags = RawObject::ClassIdTag::update(kContextCid, tags); |
| 2860 tags = RawObject::SizeTag::update(instance_size, tags); | 2861 tags = RawObject::SizeTag::update(instance_size, tags); |
| 2862 // Also writes 0 in the hash_ field of the header. |
| 2861 *reinterpret_cast<uword*>(start + Array::tags_offset()) = tags; | 2863 *reinterpret_cast<uword*>(start + Array::tags_offset()) = tags; |
| 2862 *reinterpret_cast<uword*>(start + Context::num_variables_offset()) = | 2864 *reinterpret_cast<uword*>(start + Context::num_variables_offset()) = |
| 2863 num_context_variables; | 2865 num_context_variables; |
| 2864 FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag); | 2866 FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag); |
| 2865 pc += 2; | 2867 pc += 2; |
| 2866 } | 2868 } |
| 2867 DISPATCH(); | 2869 DISPATCH(); |
| 2868 } | 2870 } |
| 2869 | 2871 |
| 2870 { | 2872 { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2891 DISPATCH(); | 2893 DISPATCH(); |
| 2892 } | 2894 } |
| 2893 | 2895 |
| 2894 { | 2896 { |
| 2895 BYTECODE(AllocateOpt, A_D); | 2897 BYTECODE(AllocateOpt, A_D); |
| 2896 const uword tags = | 2898 const uword tags = |
| 2897 static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD)))); | 2899 static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD)))); |
| 2898 const intptr_t instance_size = RawObject::SizeTag::decode(tags); | 2900 const intptr_t instance_size = RawObject::SizeTag::decode(tags); |
| 2899 const uword start = thread->heap()->new_space()->TryAllocate(instance_size); | 2901 const uword start = thread->heap()->new_space()->TryAllocate(instance_size); |
| 2900 if (LIKELY(start != 0)) { | 2902 if (LIKELY(start != 0)) { |
| 2903 // Writes both the tags and the initial identity hash on 64 bit platforms. |
| 2901 *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags; | 2904 *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags; |
| 2902 for (intptr_t current_offset = sizeof(RawInstance); | 2905 for (intptr_t current_offset = sizeof(RawInstance); |
| 2903 current_offset < instance_size; current_offset += kWordSize) { | 2906 current_offset < instance_size; current_offset += kWordSize) { |
| 2904 *reinterpret_cast<RawObject**>(start + current_offset) = null_value; | 2907 *reinterpret_cast<RawObject**>(start + current_offset) = null_value; |
| 2905 } | 2908 } |
| 2906 FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag); | 2909 FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag); |
| 2907 pc += 2; | 2910 pc += 2; |
| 2908 } | 2911 } |
| 2909 DISPATCH(); | 2912 DISPATCH(); |
| 2910 } | 2913 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2922 } | 2925 } |
| 2923 | 2926 |
| 2924 { | 2927 { |
| 2925 BYTECODE(AllocateTOpt, A_D); | 2928 BYTECODE(AllocateTOpt, A_D); |
| 2926 const uword tags = Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD))); | 2929 const uword tags = Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD))); |
| 2927 const intptr_t instance_size = RawObject::SizeTag::decode(tags); | 2930 const intptr_t instance_size = RawObject::SizeTag::decode(tags); |
| 2928 const uword start = thread->heap()->new_space()->TryAllocate(instance_size); | 2931 const uword start = thread->heap()->new_space()->TryAllocate(instance_size); |
| 2929 if (LIKELY(start != 0)) { | 2932 if (LIKELY(start != 0)) { |
| 2930 RawObject* type_args = SP[0]; | 2933 RawObject* type_args = SP[0]; |
| 2931 const intptr_t type_args_offset = Bytecode::DecodeD(*pc); | 2934 const intptr_t type_args_offset = Bytecode::DecodeD(*pc); |
| 2935 // Writes both the tags and the initial identity hash on 64 bit platforms. |
| 2932 *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags; | 2936 *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags; |
| 2933 for (intptr_t current_offset = sizeof(RawInstance); | 2937 for (intptr_t current_offset = sizeof(RawInstance); |
| 2934 current_offset < instance_size; current_offset += kWordSize) { | 2938 current_offset < instance_size; current_offset += kWordSize) { |
| 2935 *reinterpret_cast<RawObject**>(start + current_offset) = null_value; | 2939 *reinterpret_cast<RawObject**>(start + current_offset) = null_value; |
| 2936 } | 2940 } |
| 2937 *reinterpret_cast<RawObject**>(start + type_args_offset) = type_args; | 2941 *reinterpret_cast<RawObject**>(start + type_args_offset) = type_args; |
| 2938 FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag); | 2942 FP[rA] = reinterpret_cast<RawObject*>(start + kHeapObjectTag); |
| 2939 SP -= 1; // Consume the type arguments on the stack. | 2943 SP -= 1; // Consume the type arguments on the stack. |
| 2940 pc += 4; | 2944 pc += 4; |
| 2941 } | 2945 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2965 ~(kObjectAlignment - 1); | 2969 ~(kObjectAlignment - 1); |
| 2966 const uword start = | 2970 const uword start = |
| 2967 thread->heap()->new_space()->TryAllocate(instance_size); | 2971 thread->heap()->new_space()->TryAllocate(instance_size); |
| 2968 if (LIKELY(start != 0)) { | 2972 if (LIKELY(start != 0)) { |
| 2969 const intptr_t cid = kArrayCid; | 2973 const intptr_t cid = kArrayCid; |
| 2970 uword tags = 0; | 2974 uword tags = 0; |
| 2971 if (LIKELY(instance_size <= RawObject::SizeTag::kMaxSizeTag)) { | 2975 if (LIKELY(instance_size <= RawObject::SizeTag::kMaxSizeTag)) { |
| 2972 tags = RawObject::SizeTag::update(instance_size, tags); | 2976 tags = RawObject::SizeTag::update(instance_size, tags); |
| 2973 } | 2977 } |
| 2974 tags = RawObject::ClassIdTag::update(cid, tags); | 2978 tags = RawObject::ClassIdTag::update(cid, tags); |
| 2979 // Writes both the tags and the initial identity hash on 64 bit |
| 2980 // platforms. |
| 2975 *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags; | 2981 *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags; |
| 2976 *reinterpret_cast<RawObject**>(start + Array::length_offset()) = | 2982 *reinterpret_cast<RawObject**>(start + Array::length_offset()) = |
| 2977 FP[rB]; | 2983 FP[rB]; |
| 2978 *reinterpret_cast<RawObject**>( | 2984 *reinterpret_cast<RawObject**>( |
| 2979 start + Array::type_arguments_offset()) = FP[rC]; | 2985 start + Array::type_arguments_offset()) = FP[rC]; |
| 2980 RawObject** data = | 2986 RawObject** data = |
| 2981 reinterpret_cast<RawObject**>(start + Array::data_offset()); | 2987 reinterpret_cast<RawObject**>(start + Array::data_offset()); |
| 2982 for (intptr_t i = 0; i < length; i++) { | 2988 for (intptr_t i = 0; i < length; i++) { |
| 2983 data[i] = null_value; | 2989 data[i] = null_value; |
| 2984 } | 2990 } |
| (...skipping 915 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3900 pc_ = pc; | 3906 pc_ = pc; |
| 3901 } | 3907 } |
| 3902 | 3908 |
| 3903 buf->Longjmp(); | 3909 buf->Longjmp(); |
| 3904 UNREACHABLE(); | 3910 UNREACHABLE(); |
| 3905 } | 3911 } |
| 3906 | 3912 |
| 3907 } // namespace dart | 3913 } // namespace dart |
| 3908 | 3914 |
| 3909 #endif // defined TARGET_ARCH_DBC | 3915 #endif // defined TARGET_ARCH_DBC |
| OLD | NEW |