OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 #ifndef VM_OBJECT_H_ | 5 #ifndef VM_OBJECT_H_ |
6 #define VM_OBJECT_H_ | 6 #define VM_OBJECT_H_ |
7 | 7 |
8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "platform/utils.h" | 10 #include "platform/utils.h" |
(...skipping 4882 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4893 FINAL_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray, Instance); | 4893 FINAL_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray, Instance); |
4894 friend class Array; | 4894 friend class Array; |
4895 friend class Class; | 4895 friend class Class; |
4896 }; | 4896 }; |
4897 | 4897 |
4898 | 4898 |
4899 class Float32x4 : public Instance { | 4899 class Float32x4 : public Instance { |
4900 public: | 4900 public: |
4901 static RawFloat32x4* New(float value0, float value1, float value2, | 4901 static RawFloat32x4* New(float value0, float value1, float value2, |
4902 float value3, Heap::Space space = Heap::kNew); | 4902 float value3, Heap::Space space = Heap::kNew); |
4903 static RawFloat32x4* New(simd_value_t value, Heap::Space space = Heap::kNew); | 4903 static RawFloat32x4* New(simd128_value_t value, |
| 4904 Heap::Space space = Heap::kNew); |
4904 | 4905 |
4905 float x() const; | 4906 float x() const; |
4906 float y() const; | 4907 float y() const; |
4907 float z() const; | 4908 float z() const; |
4908 float w() const; | 4909 float w() const; |
4909 | 4910 |
4910 void set_x(float x) const; | 4911 void set_x(float x) const; |
4911 void set_y(float y) const; | 4912 void set_y(float y) const; |
4912 void set_z(float z) const; | 4913 void set_z(float z) const; |
4913 void set_w(float w) const; | 4914 void set_w(float w) const; |
4914 | 4915 |
4915 simd_value_t value() const; | 4916 simd128_value_t value() const; |
4916 void set_value(simd_value_t value) const; | 4917 void set_value(simd128_value_t value) const; |
4917 | 4918 |
4918 static intptr_t InstanceSize() { | 4919 static intptr_t InstanceSize() { |
4919 return RoundedAllocationSize(sizeof(RawFloat32x4)); | 4920 return RoundedAllocationSize(sizeof(RawFloat32x4)); |
4920 } | 4921 } |
4921 | 4922 |
4922 static intptr_t value_offset() { | 4923 static intptr_t value_offset() { |
4923 return OFFSET_OF(RawFloat32x4, value_); | 4924 return OFFSET_OF(RawFloat32x4, value_); |
4924 } | 4925 } |
4925 | 4926 |
4926 private: | 4927 private: |
4927 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4, Instance); | 4928 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4, Instance); |
4928 friend class Class; | 4929 friend class Class; |
4929 }; | 4930 }; |
4930 | 4931 |
4931 | 4932 |
4932 class Uint32x4 : public Instance { | 4933 class Uint32x4 : public Instance { |
4933 public: | 4934 public: |
4934 static RawUint32x4* New(uint32_t value0, uint32_t value1, uint32_t value2, | 4935 static RawUint32x4* New(uint32_t value0, uint32_t value1, uint32_t value2, |
4935 uint32_t value3, Heap::Space space = Heap::kNew); | 4936 uint32_t value3, Heap::Space space = Heap::kNew); |
4936 static RawUint32x4* New(simd_value_t value, Heap::Space space = Heap::kNew); | 4937 static RawUint32x4* New(simd128_value_t value, |
| 4938 Heap::Space space = Heap::kNew); |
4937 | 4939 |
4938 uint32_t x() const; | 4940 uint32_t x() const; |
4939 uint32_t y() const; | 4941 uint32_t y() const; |
4940 uint32_t z() const; | 4942 uint32_t z() const; |
4941 uint32_t w() const; | 4943 uint32_t w() const; |
4942 | 4944 |
4943 void set_x(uint32_t x) const; | 4945 void set_x(uint32_t x) const; |
4944 void set_y(uint32_t y) const; | 4946 void set_y(uint32_t y) const; |
4945 void set_z(uint32_t z) const; | 4947 void set_z(uint32_t z) const; |
4946 void set_w(uint32_t w) const; | 4948 void set_w(uint32_t w) const; |
4947 | 4949 |
4948 simd_value_t value() const; | 4950 simd128_value_t value() const; |
4949 void set_value(simd_value_t value) const; | 4951 void set_value(simd128_value_t value) const; |
4950 | 4952 |
4951 static intptr_t InstanceSize() { | 4953 static intptr_t InstanceSize() { |
4952 return RoundedAllocationSize(sizeof(RawUint32x4)); | 4954 return RoundedAllocationSize(sizeof(RawUint32x4)); |
4953 } | 4955 } |
4954 | 4956 |
4955 static intptr_t value_offset() { | 4957 static intptr_t value_offset() { |
4956 return OFFSET_OF(RawUint32x4, value_); | 4958 return OFFSET_OF(RawUint32x4, value_); |
4957 } | 4959 } |
4958 | 4960 |
4959 private: | 4961 private: |
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5692 friend class Class; | 5694 friend class Class; |
5693 }; | 5695 }; |
5694 | 5696 |
5695 | 5697 |
5696 class Float32x4Array : public ByteArray { | 5698 class Float32x4Array : public ByteArray { |
5697 public: | 5699 public: |
5698 intptr_t ByteLength() const { | 5700 intptr_t ByteLength() const { |
5699 return Length() * kBytesPerElement; | 5701 return Length() * kBytesPerElement; |
5700 } | 5702 } |
5701 | 5703 |
5702 simd_value_t At(intptr_t index) const { | 5704 simd128_value_t At(intptr_t index) const { |
5703 ASSERT((index >= 0) && (index < Length())); | 5705 ASSERT((index >= 0) && (index < Length())); |
5704 simd_value_t* load_ptr = &raw_ptr()->data_[index]; | 5706 return raw_ptr()->data_[index]; |
5705 return simd_value_safe_load(load_ptr); | |
5706 } | 5707 } |
5707 | 5708 |
5708 void SetAt(intptr_t index, simd_value_t value) const { | 5709 void SetAt(intptr_t index, simd128_value_t value) const { |
5709 ASSERT((index >= 0) && (index < Length())); | 5710 ASSERT((index >= 0) && (index < Length())); |
5710 simd_value_t* store_ptr = &raw_ptr()->data_[index]; | 5711 raw_ptr()->data_[index] = value; |
5711 simd_value_safe_store(store_ptr, value); | |
5712 } | 5712 } |
5713 | 5713 |
5714 static const intptr_t kBytesPerElement = 16; | 5714 static const intptr_t kBytesPerElement = 16; |
5715 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; | 5715 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; |
5716 | 5716 |
5717 static intptr_t data_offset() { | 5717 static intptr_t data_offset() { |
5718 return OFFSET_OF(RawFloat32x4Array, data_); | 5718 return OFFSET_OF(RawFloat32x4Array, data_); |
5719 } | 5719 } |
5720 | 5720 |
5721 static intptr_t InstanceSize() { | 5721 static intptr_t InstanceSize() { |
5722 ASSERT(sizeof(RawFloat32x4Array) == | 5722 ASSERT(sizeof(RawFloat32x4Array) == |
5723 OFFSET_OF(RawFloat32x4Array, data_)); | 5723 OFFSET_OF(RawFloat32x4Array, data_)); |
5724 return 0; | 5724 return 0; |
5725 } | 5725 } |
5726 | 5726 |
5727 static intptr_t InstanceSize(intptr_t len) { | 5727 static intptr_t InstanceSize(intptr_t len) { |
5728 ASSERT(0 <= len && len <= kMaxElements); | 5728 ASSERT(0 <= len && len <= kMaxElements); |
5729 return RoundedAllocationSize( | 5729 return RoundedAllocationSize( |
5730 sizeof(RawFloat32x4Array) + (len * kBytesPerElement)); | 5730 sizeof(RawFloat32x4Array) + (len * kBytesPerElement)); |
5731 } | 5731 } |
5732 | 5732 |
5733 static RawFloat32x4Array* New(intptr_t len, | 5733 static RawFloat32x4Array* New(intptr_t len, |
5734 Heap::Space space = Heap::kNew); | 5734 Heap::Space space = Heap::kNew); |
5735 static RawFloat32x4Array* New(const simd_value_t* data, | 5735 static RawFloat32x4Array* New(const simd128_value_t* data, |
5736 intptr_t len, | 5736 intptr_t len, |
5737 Heap::Space space = Heap::kNew); | 5737 Heap::Space space = Heap::kNew); |
5738 | 5738 |
5739 private: | 5739 private: |
5740 uint8_t* ByteAddr(intptr_t byte_offset) const { | 5740 uint8_t* ByteAddr(intptr_t byte_offset) const { |
5741 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength())); | 5741 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength())); |
5742 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset; | 5742 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset; |
5743 } | 5743 } |
5744 | 5744 |
5745 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4Array, ByteArray); | 5745 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4Array, ByteArray); |
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6346 friend class Class; | 6346 friend class Class; |
6347 }; | 6347 }; |
6348 | 6348 |
6349 | 6349 |
6350 class ExternalFloat32x4Array : public ByteArray { | 6350 class ExternalFloat32x4Array : public ByteArray { |
6351 public: | 6351 public: |
6352 intptr_t ByteLength() const { | 6352 intptr_t ByteLength() const { |
6353 return Length() * kBytesPerElement; | 6353 return Length() * kBytesPerElement; |
6354 } | 6354 } |
6355 | 6355 |
6356 simd_value_t At(intptr_t index) const { | 6356 simd128_value_t At(intptr_t index) const { |
6357 ASSERT((index >= 0) && (index < Length())); | 6357 ASSERT((index >= 0) && (index < Length())); |
6358 simd_value_t* load_ptr = &raw_ptr()->data_[index]; | 6358 return raw_ptr()->data_[index]; |
6359 return simd_value_safe_load(load_ptr); | |
6360 } | 6359 } |
6361 | 6360 |
6362 void SetAt(intptr_t index, simd_value_t value) const { | 6361 void SetAt(intptr_t index, simd128_value_t value) const { |
6363 ASSERT((index >= 0) && (index < Length())); | 6362 ASSERT((index >= 0) && (index < Length())); |
6364 simd_value_t* store_ptr = &raw_ptr()->data_[index]; | 6363 raw_ptr()->data_[index] = value; |
6365 simd_value_safe_store(store_ptr, value); | |
6366 } | 6364 } |
6367 | 6365 |
6368 | 6366 |
6369 simd_value_t* GetData() const { | 6367 simd128_value_t* GetData() const { |
6370 return raw_ptr()->data_; | 6368 return raw_ptr()->data_; |
6371 } | 6369 } |
6372 | 6370 |
6373 void* GetPeer() const { | 6371 void* GetPeer() const { |
6374 return raw_ptr()->peer_; | 6372 return raw_ptr()->peer_; |
6375 } | 6373 } |
6376 | 6374 |
6377 static const intptr_t kBytesPerElement = 16; | 6375 static const intptr_t kBytesPerElement = 16; |
6378 | 6376 |
6379 // Since external arrays may be serialized to non-external ones, | 6377 // Since external arrays may be serialized to non-external ones, |
6380 // enforce the same maximum element count. | 6378 // enforce the same maximum element count. |
6381 static const intptr_t kMaxElements = Float32x4Array::kMaxElements; | 6379 static const intptr_t kMaxElements = Float32x4Array::kMaxElements; |
6382 | 6380 |
6383 static intptr_t InstanceSize() { | 6381 static intptr_t InstanceSize() { |
6384 return RoundedAllocationSize(sizeof(RawExternalFloat32x4Array)); | 6382 return RoundedAllocationSize(sizeof(RawExternalFloat32x4Array)); |
6385 } | 6383 } |
6386 | 6384 |
6387 static RawExternalFloat32x4Array* New(simd_value_t* data, | 6385 static RawExternalFloat32x4Array* New(simd128_value_t* data, intptr_t len, |
6388 intptr_t len, | 6386 Heap::Space space = Heap::kNew); |
6389 Heap::Space space = Heap::kNew); | |
6390 | 6387 |
6391 private: | 6388 private: |
6392 uint8_t* ByteAddr(intptr_t byte_offset) const { | 6389 uint8_t* ByteAddr(intptr_t byte_offset) const { |
6393 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength())); | 6390 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength())); |
6394 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_); | 6391 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_); |
6395 return data + byte_offset; | 6392 return data + byte_offset; |
6396 } | 6393 } |
6397 | 6394 |
6398 void SetData(simd_value_t* data) const { | 6395 void SetData(simd128_value_t* data) const { |
6399 raw_ptr()->data_ = data; | 6396 raw_ptr()->data_ = data; |
6400 } | 6397 } |
6401 | 6398 |
6402 void SetPeer(void* peer) const { | 6399 void SetPeer(void* peer) const { |
6403 raw_ptr()->peer_ = peer; | 6400 raw_ptr()->peer_ = peer; |
6404 } | 6401 } |
6405 | 6402 |
6406 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalFloat32x4Array, ByteArray); | 6403 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalFloat32x4Array, ByteArray); |
6407 friend class ByteArray; | 6404 friend class ByteArray; |
6408 friend class Class; | 6405 friend class Class; |
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6888 | 6885 |
6889 | 6886 |
6890 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 6887 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
6891 intptr_t index) { | 6888 intptr_t index) { |
6892 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 6889 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
6893 } | 6890 } |
6894 | 6891 |
6895 } // namespace dart | 6892 } // namespace dart |
6896 | 6893 |
6897 #endif // VM_OBJECT_H_ | 6894 #endif // VM_OBJECT_H_ |
OLD | NEW |