| Index: runtime/vm/object.h
|
| diff --git a/runtime/vm/object.h b/runtime/vm/object.h
|
| index a0ba8ae17e246bc81015166c31f8fddd547b55c5..f83276b0fa4210f591ae3b90fe56435b828ee387 100644
|
| --- a/runtime/vm/object.h
|
| +++ b/runtime/vm/object.h
|
| @@ -4770,6 +4770,72 @@ class GrowableObjectArray : public Instance {
|
| };
|
|
|
|
|
| +class Float32x4 : public Instance {
|
| + public:
|
| + static RawFloat32x4* New(float value0, float value1, float value2,
|
| + float value3, Heap::Space space = Heap::kNew);
|
| + static RawFloat32x4* New(simd_value_t value, Heap::Space space = Heap::kNew);
|
| +
|
| + float x() const;
|
| + float y() const;
|
| + float z() const;
|
| + float w() const;
|
| +
|
| + void set_x(float x) const;
|
| + void set_y(float y) const;
|
| + void set_z(float z) const;
|
| + void set_w(float w) const;
|
| +
|
| + simd_value_t value() const;
|
| + void set_value(simd_value_t value) const;
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawFloat32x4));
|
| + }
|
| +
|
| + static intptr_t value_offset() {
|
| + return OFFSET_OF(RawFloat32x4, value_);
|
| + }
|
| +
|
| + private:
|
| + FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4, Instance);
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class Uint32x4 : public Instance {
|
| + public:
|
| + static RawUint32x4* New(uint32_t value0, uint32_t value1, uint32_t value2,
|
| + uint32_t value3, Heap::Space space = Heap::kNew);
|
| + static RawUint32x4* New(simd_value_t value, Heap::Space space = Heap::kNew);
|
| +
|
| + uint32_t x() const;
|
| + uint32_t y() const;
|
| + uint32_t z() const;
|
| + uint32_t w() const;
|
| +
|
| + void set_x(uint32_t x) const;
|
| + void set_y(uint32_t y) const;
|
| + void set_z(uint32_t z) const;
|
| + void set_w(uint32_t w) const;
|
| +
|
| + simd_value_t value() const;
|
| + void set_value(simd_value_t value) const;
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawUint32x4));
|
| + }
|
| +
|
| + static intptr_t value_offset() {
|
| + return OFFSET_OF(RawUint32x4, value_);
|
| + }
|
| +
|
| + private:
|
| + FINAL_HEAP_OBJECT_IMPLEMENTATION(Uint32x4, Instance);
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| class ByteArray : public Instance {
|
| public:
|
| intptr_t Length() const {
|
| @@ -5310,6 +5376,61 @@ class Uint64Array : public ByteArray {
|
| };
|
|
|
|
|
| +class Float32x4Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + simd_value_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + simd_value_t* load_ptr = &raw_ptr()->data_[index];
|
| + return simd_value_safe_load(load_ptr);
|
| + }
|
| +
|
| + void SetAt(intptr_t index, simd_value_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + simd_value_t* store_ptr = &raw_ptr()->data_[index];
|
| + simd_value_safe_store(store_ptr, value);
|
| + }
|
| +
|
| + static const intptr_t kBytesPerElement = 16;
|
| + static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
|
| +
|
| + static intptr_t data_offset() {
|
| + return OFFSET_OF(RawFloat32x4Array, data_);
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + ASSERT(sizeof(RawFloat32x4Array) ==
|
| + OFFSET_OF(RawFloat32x4Array, data_));
|
| + return 0;
|
| + }
|
| +
|
| + static intptr_t InstanceSize(intptr_t len) {
|
| + ASSERT(0 <= len && len <= kMaxElements);
|
| + return RoundedAllocationSize(
|
| + sizeof(RawFloat32x4Array) + (len * kBytesPerElement));
|
| + }
|
| +
|
| + static RawFloat32x4Array* New(intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| + static RawFloat32x4Array* New(const simd_value_t* data,
|
| + intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
|
| + }
|
| +
|
| + FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| class Float32Array : public ByteArray {
|
| public:
|
| intptr_t ByteLength() const {
|
| @@ -5909,6 +6030,68 @@ class ExternalUint64Array : public ByteArray {
|
| };
|
|
|
|
|
| +class ExternalFloat32x4Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + simd_value_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + simd_value_t* load_ptr = &raw_ptr()->data_[index];
|
| + return simd_value_safe_load(load_ptr);
|
| + }
|
| +
|
| + void SetAt(intptr_t index, simd_value_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + simd_value_t* store_ptr = &raw_ptr()->data_[index];
|
| + simd_value_safe_store(store_ptr, value);
|
| + }
|
| +
|
| +
|
| + simd_value_t* GetData() const {
|
| + return raw_ptr()->data_;
|
| + }
|
| +
|
| + void* GetPeer() const {
|
| + return raw_ptr()->peer_;
|
| + }
|
| +
|
| + static const intptr_t kBytesPerElement = 16;
|
| +
|
| + // Since external arrays may be serialized to non-external ones,
|
| + // enforce the same maximum element count.
|
| + static const intptr_t kMaxElements = Float32x4Array::kMaxElements;
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawExternalFloat32x4Array));
|
| + }
|
| +
|
| + static RawExternalFloat32x4Array* New(simd_value_t* data,
|
| + intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
|
| + return data + byte_offset;
|
| + }
|
| +
|
| + void SetData(simd_value_t* data) const {
|
| + raw_ptr()->data_ = data;
|
| + }
|
| +
|
| + void SetPeer(void* peer) const {
|
| + raw_ptr()->peer_ = peer;
|
| + }
|
| +
|
| + FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalFloat32x4Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| class ExternalFloat32Array : public ByteArray {
|
| public:
|
| intptr_t ByteLength() const {
|
|
|