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 4928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4939 FINAL_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray, Instance); | 4939 FINAL_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray, Instance); |
4940 friend class Array; | 4940 friend class Array; |
4941 friend class Class; | 4941 friend class Class; |
4942 }; | 4942 }; |
4943 | 4943 |
4944 | 4944 |
4945 class Float32x4 : public Instance { | 4945 class Float32x4 : public Instance { |
4946 public: | 4946 public: |
4947 static RawFloat32x4* New(float value0, float value1, float value2, | 4947 static RawFloat32x4* New(float value0, float value1, float value2, |
4948 float value3, Heap::Space space = Heap::kNew); | 4948 float value3, Heap::Space space = Heap::kNew); |
4949 static RawFloat32x4* New(simd_value_t value, Heap::Space space = Heap::kNew); | 4949 static RawFloat32x4* New(simd128_value_t value, |
| 4950 Heap::Space space = Heap::kNew); |
4950 | 4951 |
4951 float x() const; | 4952 float x() const; |
4952 float y() const; | 4953 float y() const; |
4953 float z() const; | 4954 float z() const; |
4954 float w() const; | 4955 float w() const; |
4955 | 4956 |
4956 void set_x(float x) const; | 4957 void set_x(float x) const; |
4957 void set_y(float y) const; | 4958 void set_y(float y) const; |
4958 void set_z(float z) const; | 4959 void set_z(float z) const; |
4959 void set_w(float w) const; | 4960 void set_w(float w) const; |
4960 | 4961 |
4961 simd_value_t value() const; | 4962 simd128_value_t value() const; |
4962 void set_value(simd_value_t value) const; | 4963 void set_value(simd128_value_t value) const; |
4963 | 4964 |
4964 static intptr_t InstanceSize() { | 4965 static intptr_t InstanceSize() { |
4965 return RoundedAllocationSize(sizeof(RawFloat32x4)); | 4966 return RoundedAllocationSize(sizeof(RawFloat32x4)); |
4966 } | 4967 } |
4967 | 4968 |
4968 static intptr_t value_offset() { | 4969 static intptr_t value_offset() { |
4969 return OFFSET_OF(RawFloat32x4, value_); | 4970 return OFFSET_OF(RawFloat32x4, value_); |
4970 } | 4971 } |
4971 | 4972 |
4972 private: | 4973 private: |
4973 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4, Instance); | 4974 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4, Instance); |
4974 friend class Class; | 4975 friend class Class; |
4975 }; | 4976 }; |
4976 | 4977 |
4977 | 4978 |
4978 class Uint32x4 : public Instance { | 4979 class Uint32x4 : public Instance { |
4979 public: | 4980 public: |
4980 static RawUint32x4* New(uint32_t value0, uint32_t value1, uint32_t value2, | 4981 static RawUint32x4* New(uint32_t value0, uint32_t value1, uint32_t value2, |
4981 uint32_t value3, Heap::Space space = Heap::kNew); | 4982 uint32_t value3, Heap::Space space = Heap::kNew); |
4982 static RawUint32x4* New(simd_value_t value, Heap::Space space = Heap::kNew); | 4983 static RawUint32x4* New(simd128_value_t value, |
| 4984 Heap::Space space = Heap::kNew); |
4983 | 4985 |
4984 uint32_t x() const; | 4986 uint32_t x() const; |
4985 uint32_t y() const; | 4987 uint32_t y() const; |
4986 uint32_t z() const; | 4988 uint32_t z() const; |
4987 uint32_t w() const; | 4989 uint32_t w() const; |
4988 | 4990 |
4989 void set_x(uint32_t x) const; | 4991 void set_x(uint32_t x) const; |
4990 void set_y(uint32_t y) const; | 4992 void set_y(uint32_t y) const; |
4991 void set_z(uint32_t z) const; | 4993 void set_z(uint32_t z) const; |
4992 void set_w(uint32_t w) const; | 4994 void set_w(uint32_t w) const; |
4993 | 4995 |
4994 simd_value_t value() const; | 4996 simd128_value_t value() const; |
4995 void set_value(simd_value_t value) const; | 4997 void set_value(simd128_value_t value) const; |
4996 | 4998 |
4997 static intptr_t InstanceSize() { | 4999 static intptr_t InstanceSize() { |
4998 return RoundedAllocationSize(sizeof(RawUint32x4)); | 5000 return RoundedAllocationSize(sizeof(RawUint32x4)); |
4999 } | 5001 } |
5000 | 5002 |
5001 static intptr_t value_offset() { | 5003 static intptr_t value_offset() { |
5002 return OFFSET_OF(RawUint32x4, value_); | 5004 return OFFSET_OF(RawUint32x4, value_); |
5003 } | 5005 } |
5004 | 5006 |
5005 private: | 5007 private: |
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5738 friend class Class; | 5740 friend class Class; |
5739 }; | 5741 }; |
5740 | 5742 |
5741 | 5743 |
5742 class Float32x4Array : public ByteArray { | 5744 class Float32x4Array : public ByteArray { |
5743 public: | 5745 public: |
5744 intptr_t ByteLength() const { | 5746 intptr_t ByteLength() const { |
5745 return Length() * kBytesPerElement; | 5747 return Length() * kBytesPerElement; |
5746 } | 5748 } |
5747 | 5749 |
5748 simd_value_t At(intptr_t index) const { | 5750 simd128_value_t At(intptr_t index) const { |
5749 ASSERT((index >= 0) && (index < Length())); | 5751 ASSERT((index >= 0) && (index < Length())); |
5750 simd_value_t* load_ptr = &raw_ptr()->data_[index]; | 5752 return raw_ptr()->data_[index]; |
5751 return simd_value_safe_load(load_ptr); | |
5752 } | 5753 } |
5753 | 5754 |
5754 void SetAt(intptr_t index, simd_value_t value) const { | 5755 void SetAt(intptr_t index, simd128_value_t value) const { |
5755 ASSERT((index >= 0) && (index < Length())); | 5756 ASSERT((index >= 0) && (index < Length())); |
5756 simd_value_t* store_ptr = &raw_ptr()->data_[index]; | 5757 raw_ptr()->data_[index] = value; |
5757 simd_value_safe_store(store_ptr, value); | |
5758 } | 5758 } |
5759 | 5759 |
5760 static const intptr_t kBytesPerElement = 16; | 5760 static const intptr_t kBytesPerElement = 16; |
5761 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; | 5761 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; |
5762 | 5762 |
5763 static intptr_t data_offset() { | 5763 static intptr_t data_offset() { |
5764 return OFFSET_OF(RawFloat32x4Array, data_); | 5764 return OFFSET_OF(RawFloat32x4Array, data_); |
5765 } | 5765 } |
5766 | 5766 |
5767 static intptr_t InstanceSize() { | 5767 static intptr_t InstanceSize() { |
5768 ASSERT(sizeof(RawFloat32x4Array) == | 5768 ASSERT(sizeof(RawFloat32x4Array) == |
5769 OFFSET_OF(RawFloat32x4Array, data_)); | 5769 OFFSET_OF(RawFloat32x4Array, data_)); |
5770 return 0; | 5770 return 0; |
5771 } | 5771 } |
5772 | 5772 |
5773 static intptr_t InstanceSize(intptr_t len) { | 5773 static intptr_t InstanceSize(intptr_t len) { |
5774 ASSERT(0 <= len && len <= kMaxElements); | 5774 ASSERT(0 <= len && len <= kMaxElements); |
5775 return RoundedAllocationSize( | 5775 return RoundedAllocationSize( |
5776 sizeof(RawFloat32x4Array) + (len * kBytesPerElement)); | 5776 sizeof(RawFloat32x4Array) + (len * kBytesPerElement)); |
5777 } | 5777 } |
5778 | 5778 |
5779 static RawFloat32x4Array* New(intptr_t len, | 5779 static RawFloat32x4Array* New(intptr_t len, |
5780 Heap::Space space = Heap::kNew); | 5780 Heap::Space space = Heap::kNew); |
5781 static RawFloat32x4Array* New(const simd_value_t* data, | 5781 static RawFloat32x4Array* New(const simd128_value_t* data, |
5782 intptr_t len, | 5782 intptr_t len, |
5783 Heap::Space space = Heap::kNew); | 5783 Heap::Space space = Heap::kNew); |
5784 | 5784 |
5785 private: | 5785 private: |
5786 uint8_t* ByteAddr(intptr_t byte_offset) const { | 5786 uint8_t* ByteAddr(intptr_t byte_offset) const { |
5787 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength())); | 5787 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength())); |
5788 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset; | 5788 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset; |
5789 } | 5789 } |
5790 | 5790 |
5791 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4Array, ByteArray); | 5791 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4Array, ByteArray); |
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6392 friend class Class; | 6392 friend class Class; |
6393 }; | 6393 }; |
6394 | 6394 |
6395 | 6395 |
6396 class ExternalFloat32x4Array : public ByteArray { | 6396 class ExternalFloat32x4Array : public ByteArray { |
6397 public: | 6397 public: |
6398 intptr_t ByteLength() const { | 6398 intptr_t ByteLength() const { |
6399 return Length() * kBytesPerElement; | 6399 return Length() * kBytesPerElement; |
6400 } | 6400 } |
6401 | 6401 |
6402 simd_value_t At(intptr_t index) const { | 6402 simd128_value_t At(intptr_t index) const { |
6403 ASSERT((index >= 0) && (index < Length())); | 6403 ASSERT((index >= 0) && (index < Length())); |
6404 simd_value_t* load_ptr = &raw_ptr()->data_[index]; | 6404 return raw_ptr()->data_[index]; |
6405 return simd_value_safe_load(load_ptr); | |
6406 } | 6405 } |
6407 | 6406 |
6408 void SetAt(intptr_t index, simd_value_t value) const { | 6407 void SetAt(intptr_t index, simd128_value_t value) const { |
6409 ASSERT((index >= 0) && (index < Length())); | 6408 ASSERT((index >= 0) && (index < Length())); |
6410 simd_value_t* store_ptr = &raw_ptr()->data_[index]; | 6409 raw_ptr()->data_[index] = value; |
6411 simd_value_safe_store(store_ptr, value); | |
6412 } | 6410 } |
6413 | 6411 |
6414 | 6412 |
6415 simd_value_t* GetData() const { | 6413 simd128_value_t* GetData() const { |
6416 return raw_ptr()->data_; | 6414 return raw_ptr()->data_; |
6417 } | 6415 } |
6418 | 6416 |
6419 void* GetPeer() const { | 6417 void* GetPeer() const { |
6420 return raw_ptr()->peer_; | 6418 return raw_ptr()->peer_; |
6421 } | 6419 } |
6422 | 6420 |
6423 static const intptr_t kBytesPerElement = 16; | 6421 static const intptr_t kBytesPerElement = 16; |
6424 | 6422 |
6425 // Since external arrays may be serialized to non-external ones, | 6423 // Since external arrays may be serialized to non-external ones, |
6426 // enforce the same maximum element count. | 6424 // enforce the same maximum element count. |
6427 static const intptr_t kMaxElements = Float32x4Array::kMaxElements; | 6425 static const intptr_t kMaxElements = Float32x4Array::kMaxElements; |
6428 | 6426 |
6429 static intptr_t InstanceSize() { | 6427 static intptr_t InstanceSize() { |
6430 return RoundedAllocationSize(sizeof(RawExternalFloat32x4Array)); | 6428 return RoundedAllocationSize(sizeof(RawExternalFloat32x4Array)); |
6431 } | 6429 } |
6432 | 6430 |
6433 static RawExternalFloat32x4Array* New(simd_value_t* data, | 6431 static RawExternalFloat32x4Array* New(simd128_value_t* data, intptr_t len, |
6434 intptr_t len, | 6432 Heap::Space space = Heap::kNew); |
6435 Heap::Space space = Heap::kNew); | |
6436 | 6433 |
6437 private: | 6434 private: |
6438 uint8_t* ByteAddr(intptr_t byte_offset) const { | 6435 uint8_t* ByteAddr(intptr_t byte_offset) const { |
6439 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength())); | 6436 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength())); |
6440 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_); | 6437 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_); |
6441 return data + byte_offset; | 6438 return data + byte_offset; |
6442 } | 6439 } |
6443 | 6440 |
6444 void SetData(simd_value_t* data) const { | 6441 void SetData(simd128_value_t* data) const { |
6445 raw_ptr()->data_ = data; | 6442 raw_ptr()->data_ = data; |
6446 } | 6443 } |
6447 | 6444 |
6448 void SetPeer(void* peer) const { | 6445 void SetPeer(void* peer) const { |
6449 raw_ptr()->peer_ = peer; | 6446 raw_ptr()->peer_ = peer; |
6450 } | 6447 } |
6451 | 6448 |
6452 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalFloat32x4Array, ByteArray); | 6449 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalFloat32x4Array, ByteArray); |
6453 friend class ByteArray; | 6450 friend class ByteArray; |
6454 friend class Class; | 6451 friend class Class; |
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6934 | 6931 |
6935 | 6932 |
6936 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 6933 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
6937 intptr_t index) { | 6934 intptr_t index) { |
6938 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 6935 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
6939 } | 6936 } |
6940 | 6937 |
6941 } // namespace dart | 6938 } // namespace dart |
6942 | 6939 |
6943 #endif // VM_OBJECT_H_ | 6940 #endif // VM_OBJECT_H_ |
OLD | NEW |