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

Unified Diff: src/objects-inl.h

Issue 90643003: Experimental implementation: Exposing SIMD instructions into JavaScript Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index 6e2ad06ea7fec2e829eb312740849ad207fbf6a6..236f260edc5cb402e0a913cebbaf615e00b9a1d2 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -167,6 +167,8 @@ bool Object::NonFailureIsHeapObject() {
TYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE)
+TYPE_CHECKER(Float32x4, FLOAT32x4_TYPE)
+TYPE_CHECKER(Int32x4, INT32x4_TYPE)
TYPE_CHECKER(Symbol, SYMBOL_TYPE)
@@ -481,6 +483,8 @@ TYPE_CHECKER(ExternalUnsignedShortArray, EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE)
TYPE_CHECKER(ExternalIntArray, EXTERNAL_INT_ARRAY_TYPE)
TYPE_CHECKER(ExternalUnsignedIntArray, EXTERNAL_UNSIGNED_INT_ARRAY_TYPE)
TYPE_CHECKER(ExternalFloatArray, EXTERNAL_FLOAT_ARRAY_TYPE)
+TYPE_CHECKER(ExternalFloat32x4Array, EXTERNAL_FLOAT32x4_ARRAY_TYPE)
+TYPE_CHECKER(ExternalInt32x4Array, EXTERNAL_INT32x4_ARRAY_TYPE)
TYPE_CHECKER(ExternalDoubleArray, EXTERNAL_DOUBLE_ARRAY_TYPE)
@@ -990,6 +994,23 @@ MaybeObject* Object::GetProperty(Name* key, PropertyAttributes* attributes) {
write_double_field(p, offset, value)
#endif // V8_TARGET_ARCH_MIPS
+#define READ_FLOAT32x4_FIELD(p, offset) \
+ (*reinterpret_cast<float32x4_value_t*>(FIELD_ADDR(p, offset)))
+
+#define WRITE_FLOAT32x4_FIELD(p, offset, value) \
+ (*reinterpret_cast<float32x4_value_t*>(FIELD_ADDR(p, offset)) = value)
+
+#define READ_INT32x4_FIELD(p, offset) \
+ (*reinterpret_cast<int32x4_value_t*>(FIELD_ADDR(p, offset)))
+
+#define WRITE_INT32x4_FIELD(p, offset, value) \
+ (*reinterpret_cast<int32x4_value_t*>(FIELD_ADDR(p, offset)) = value)
+
+#define READ_FLOAT_FIELD(p, offset) \
+ (*reinterpret_cast<float*>(FIELD_ADDR(p, offset)))
+
+#define WRITE_FLOAT_FIELD(p, offset, value) \
+ (*reinterpret_cast<float*>(FIELD_ADDR(p, offset)) = value)
#define READ_INT_FIELD(p, offset) \
(*reinterpret_cast<int*>(FIELD_ADDR(p, offset)))
@@ -1262,6 +1283,106 @@ int HeapNumber::get_sign() {
}
+float32x4_value_t Float32x4::value() {
+ return READ_FLOAT32x4_FIELD(this, kValueOffset);
+}
+
+
+void Float32x4::set_value(float32x4_value_t value) {
+ WRITE_FLOAT32x4_FIELD(this, kValueOffset, value);
+}
+
+
+float Float32x4::x() {
+ return READ_FLOAT_FIELD(this, kValueOffset + 0 * kFloatSize);
+}
+
+
+float Float32x4::y() {
+ return READ_FLOAT_FIELD(this, kValueOffset + 1 * kFloatSize);
+}
+
+
+float Float32x4::z() {
+ return READ_FLOAT_FIELD(this, kValueOffset + 2 * kFloatSize);
+}
+
+
+float Float32x4::w() {
+ return READ_FLOAT_FIELD(this, kValueOffset + 3 * kFloatSize);
+}
+
+
+void Float32x4::set_x(float x) {
+ WRITE_FLOAT_FIELD(this, kValueOffset + 0 * kFloatSize, x);
+}
+
+
+void Float32x4::set_y(float y) {
+ WRITE_FLOAT_FIELD(this, kValueOffset + 1 * kFloatSize, y);
+}
+
+
+void Float32x4::set_z(float z) {
+ WRITE_FLOAT_FIELD(this, kValueOffset + 2 * kFloatSize, z);
+}
+
+
+void Float32x4::set_w(float w) {
+ WRITE_FLOAT_FIELD(this, kValueOffset + 3 * kFloatSize, w);
+}
+
+
+int32x4_value_t Int32x4::value() {
+ return READ_INT32x4_FIELD(this, kValueOffset);
+}
+
+
+void Int32x4::set_value(int32x4_value_t value) {
+ WRITE_INT32x4_FIELD(this, kValueOffset, value);
+}
+
+
+int32_t Int32x4::x() {
+ return READ_INT32_FIELD(this, kValueOffset + 0 * kInt32Size);
+}
+
+
+int32_t Int32x4::y() {
+ return READ_INT32_FIELD(this, kValueOffset + 1 * kInt32Size);
+}
+
+
+int32_t Int32x4::z() {
+ return READ_INT32_FIELD(this, kValueOffset + 2 * kInt32Size);
+}
+
+
+int32_t Int32x4::w() {
+ return READ_INT32_FIELD(this, kValueOffset + 3 * kInt32Size);
+}
+
+
+void Int32x4::set_x(int32_t x) {
+ WRITE_INT32_FIELD(this, kValueOffset + 0 * kInt32Size, x);
+}
+
+
+void Int32x4::set_y(int32_t y) {
+ WRITE_INT32_FIELD(this, kValueOffset + 1 * kInt32Size, y);
+}
+
+
+void Int32x4::set_z(int32_t z) {
+ WRITE_INT32_FIELD(this, kValueOffset + 2 * kInt32Size, z);
+}
+
+
+void Int32x4::set_w(int32_t w) {
+ WRITE_INT32_FIELD(this, kValueOffset + 3 * kInt32Size, w);
+}
+
+
ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset)
@@ -2610,6 +2731,8 @@ CAST_ACCESSOR(JSObject)
CAST_ACCESSOR(Smi)
CAST_ACCESSOR(HeapObject)
CAST_ACCESSOR(HeapNumber)
+CAST_ACCESSOR(Float32x4)
+CAST_ACCESSOR(Int32x4)
CAST_ACCESSOR(Oddball)
CAST_ACCESSOR(Cell)
CAST_ACCESSOR(PropertyCell)
@@ -2644,6 +2767,8 @@ CAST_ACCESSOR(ExternalUnsignedShortArray)
CAST_ACCESSOR(ExternalIntArray)
CAST_ACCESSOR(ExternalUnsignedIntArray)
CAST_ACCESSOR(ExternalFloatArray)
+CAST_ACCESSOR(ExternalFloat32x4Array)
+CAST_ACCESSOR(ExternalInt32x4Array)
CAST_ACCESSOR(ExternalDoubleArray)
CAST_ACCESSOR(ExternalPixelArray)
CAST_ACCESSOR(Struct)
@@ -3405,6 +3530,62 @@ void ExternalFloatArray::set(int index, float value) {
}
+float32x4_value_t ExternalFloat32x4Array::get_scalar(int index) {
+ ASSERT((index >= 0) && (index < this->length()));
+ float* ptr = static_cast<float*>(external_pointer());
+ float32x4_value_t value;
+ value.storage[0] = ptr[index * 4 + 0];
+ value.storage[1] = ptr[index * 4 + 1];
+ value.storage[2] = ptr[index * 4 + 2];
+ value.storage[3] = ptr[index * 4 + 3];
+ return value;
+}
+
+
+MaybeObject* ExternalFloat32x4Array::get(int index) {
+ float32x4_value_t value = get_scalar(index);
+ return GetHeap()->AllocateFloat32x4(value);
+}
+
+
+void ExternalFloat32x4Array::set(int index, const float32x4_value_t& value) {
+ ASSERT((index >= 0) && (index < this->length()));
+ float* ptr = static_cast<float*>(external_pointer());
+ ptr[index * 4 + 0] = value.storage[0];
+ ptr[index * 4 + 1] = value.storage[1];
+ ptr[index * 4 + 2] = value.storage[2];
+ ptr[index * 4 + 3] = value.storage[3];
+}
+
+
+int32x4_value_t ExternalInt32x4Array::get_scalar(int index) {
+ ASSERT((index >= 0) && (index < this->length()));
+ int32_t* ptr = static_cast<int32_t*>(external_pointer());
+ int32x4_value_t value;
+ value.storage[0] = ptr[index * 4 + 0];
+ value.storage[1] = ptr[index * 4 + 1];
+ value.storage[2] = ptr[index * 4 + 2];
+ value.storage[3] = ptr[index * 4 + 3];
+ return value;
+}
+
+
+MaybeObject* ExternalInt32x4Array::get(int index) {
+ int32x4_value_t value = get_scalar(index);
+ return GetHeap()->AllocateInt32x4(value);
+}
+
+
+void ExternalInt32x4Array::set(int index, const int32x4_value_t& value) {
+ ASSERT((index >= 0) && (index < this->length()));
+ int32_t* ptr = static_cast<int32_t*>(external_pointer());
+ ptr[index * 4 + 0] = value.storage[0];
+ ptr[index * 4 + 1] = value.storage[1];
+ ptr[index * 4 + 2] = value.storage[2];
+ ptr[index * 4 + 3] = value.storage[3];
+}
+
+
double ExternalDoubleArray::get_scalar(int index) {
ASSERT((index >= 0) && (index < this->length()));
double* ptr = static_cast<double*>(external_pointer());
@@ -5632,6 +5813,10 @@ EXTERNAL_ELEMENTS_CHECK(UnsignedInt,
EXTERNAL_UNSIGNED_INT_ARRAY_TYPE)
EXTERNAL_ELEMENTS_CHECK(Float,
EXTERNAL_FLOAT_ARRAY_TYPE)
+EXTERNAL_ELEMENTS_CHECK(Float32x4,
+ EXTERNAL_FLOAT32x4_ARRAY_TYPE)
+EXTERNAL_ELEMENTS_CHECK(Int32x4,
+ EXTERNAL_INT32x4_ARRAY_TYPE)
EXTERNAL_ELEMENTS_CHECK(Double,
EXTERNAL_DOUBLE_ARRAY_TYPE)
EXTERNAL_ELEMENTS_CHECK(Pixel, EXTERNAL_PIXEL_ARRAY_TYPE)
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698