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

Unified Diff: src/objects.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/mark-compact.cc ('k') | src/objects.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index 2ae1429bca6a1a70a690302abc7e1339efe5f445..fbc5aff3abee5e165879c2bea47b7491199d2557 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -104,6 +104,8 @@
// - ExternalIntArray
// - ExternalUnsignedIntArray
// - ExternalFloatArray
+// - ExternalFloat32x4Array
+// - ExternalInt32x4Array
// - Name
// - String
// - SeqString
@@ -124,6 +126,8 @@
// - ExternalTwoByteInternalizedString
// - Symbol
// - HeapNumber
+// - Float32x4
+// - Int32x4
// - Cell
// - PropertyCell
// - Code
@@ -360,6 +364,8 @@ const int kStubMinorKeyBits = kBitsPerInt - kSmiTagSize - kStubMajorKeyBits;
V(PROPERTY_CELL_TYPE) \
\
V(HEAP_NUMBER_TYPE) \
+ V(FLOAT32x4_TYPE) \
+ V(INT32x4_TYPE) \
V(FOREIGN_TYPE) \
V(BYTE_ARRAY_TYPE) \
V(FREE_SPACE_TYPE) \
@@ -373,6 +379,8 @@ const int kStubMinorKeyBits = kBitsPerInt - kSmiTagSize - kStubMajorKeyBits;
V(EXTERNAL_INT_ARRAY_TYPE) \
V(EXTERNAL_UNSIGNED_INT_ARRAY_TYPE) \
V(EXTERNAL_FLOAT_ARRAY_TYPE) \
+ V(EXTERNAL_FLOAT32x4_ARRAY_TYPE) \
+ V(EXTERNAL_INT32x4_ARRAY_TYPE) \
V(EXTERNAL_DOUBLE_ARRAY_TYPE) \
V(EXTERNAL_PIXEL_ARRAY_TYPE) \
V(FILLER_TYPE) \
@@ -697,6 +705,8 @@ enum InstanceType {
// "Data", objects that cannot contain non-map-word pointers to heap
// objects.
HEAP_NUMBER_TYPE,
+ FLOAT32x4_TYPE,
+ INT32x4_TYPE,
FOREIGN_TYPE,
BYTE_ARRAY_TYPE,
FREE_SPACE_TYPE,
@@ -707,6 +717,8 @@ enum InstanceType {
EXTERNAL_INT_ARRAY_TYPE,
EXTERNAL_UNSIGNED_INT_ARRAY_TYPE,
EXTERNAL_FLOAT_ARRAY_TYPE,
+ EXTERNAL_FLOAT32x4_ARRAY_TYPE,
+ EXTERNAL_INT32x4_ARRAY_TYPE,
EXTERNAL_DOUBLE_ARRAY_TYPE,
EXTERNAL_PIXEL_ARRAY_TYPE, // LAST_EXTERNAL_ARRAY_TYPE
FIXED_DOUBLE_ARRAY_TYPE,
@@ -950,6 +962,8 @@ class MaybeObject BASE_EMBEDDED {
#define HEAP_OBJECT_TYPE_LIST(V) \
V(HeapNumber) \
+ V(Float32x4) \
+ V(Int32x4) \
V(Name) \
V(UniqueName) \
V(String) \
@@ -972,6 +986,8 @@ class MaybeObject BASE_EMBEDDED {
V(ExternalIntArray) \
V(ExternalUnsignedIntArray) \
V(ExternalFloatArray) \
+ V(ExternalFloat32x4Array) \
+ V(ExternalInt32x4Array) \
V(ExternalDoubleArray) \
V(ExternalPixelArray) \
V(ByteArray) \
@@ -1891,6 +1907,76 @@ class HeapNumber: public HeapObject {
};
+class Float32x4: public HeapObject {
+ public:
+ // [value]: number value.
+ inline float32x4_value_t value();
+ inline void set_value(float32x4_value_t value);
+
+ // Casting.
+ static inline Float32x4* cast(Object* obj);
+
+ inline void Float32x4Print() {
+ Float32x4Print(stdout);
+ }
+ void Float32x4Print(FILE* out);
+ void Float32x4Print(StringStream* accumulator);
+ DECLARE_VERIFIER(Float32x4)
+
+ inline float x();
+ inline float y();
+ inline float z();
+ inline float w();
+
+ inline void set_x(float x);
+ inline void set_y(float x);
+ inline void set_z(float x);
+ inline void set_w(float x);
+
+ // Layout description.
+ static const int kValueOffset = HeapObject::kHeaderSize;
+ static const int kSize = kValueOffset + kFloat32x4Size;
+
+ private:
+ DISALLOW_IMPLICIT_CONSTRUCTORS(Float32x4);
+};
+
+class Int32x4: public HeapObject {
+ public:
+ // [value]: number value.
+ inline int32x4_value_t value();
+ inline void set_value(int32x4_value_t value);
+
+ // Casting.
+ static inline Int32x4* cast(Object* obj);
+
+ inline void Int32x4Print() {
+ Int32x4Print(stdout);
+ }
+ void Int32x4Print(FILE* out);
+ void Int32x4Print(StringStream* accumulator);
+ DECLARE_VERIFIER(Int32x4)
+
+ inline int32_t x();
+ inline int32_t y();
+ inline int32_t z();
+ inline int32_t w();
+
+ inline void set_x(int32_t x);
+ inline void set_y(int32_t x);
+ inline void set_z(int32_t x);
+ inline void set_w(int32_t x);
+
+ // Layout description.
+ static const int kValueOffset = HeapObject::kHeaderSize;
+ static const int kSize = kValueOffset + kInt32x4Size;
+
+ private:
+ DISALLOW_IMPLICIT_CONSTRUCTORS(Int32x4);
+};
+
+
+
enum EnsureElementsMode {
DONT_ALLOW_DOUBLE_ELEMENTS,
ALLOW_COPIED_DOUBLE_ELEMENTS,
@@ -2099,6 +2185,8 @@ class JSObject: public JSReceiver {
inline bool HasExternalIntElements();
inline bool HasExternalUnsignedIntElements();
inline bool HasExternalFloatElements();
+ inline bool HasExternalFloat32x4Elements();
+ inline bool HasExternalInt32x4Elements();
inline bool HasExternalDoubleElements();
bool HasFastArgumentsElements();
bool HasDictionaryArgumentsElements();
@@ -4782,6 +4870,59 @@ class ExternalFloatArray: public ExternalArray {
};
+class ExternalFloat32x4Array: public ExternalArray {
+ public:
+ // Setter and getter.
+ inline float32x4_value_t get_scalar(int index);
+ MUST_USE_RESULT inline MaybeObject* get(int index);
+ inline void set(int index, const float32x4_value_t& value);
+
+ static Handle<Object> SetValue(Handle<ExternalFloat32x4Array> array,
+ uint32_t index,
+ Handle<Object> value);
+
+ // This accessor applies the correct conversion from Smi, HeapNumber
+ // and undefined.
+ MUST_USE_RESULT MaybeObject* SetValue(uint32_t index, Object* value);
+
+ // Casting.
+ static inline ExternalFloat32x4Array* cast(Object* obj);
+
+ // Dispatched behavior.
+ DECLARE_PRINTER(ExternalFloat32x4Array)
+ DECLARE_VERIFIER(ExternalFloat32x4Array)
+
+ private:
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalFloat32x4Array);
+};
+
+
+class ExternalInt32x4Array: public ExternalArray {
+ public:
+ // Setter and getter.
+ inline int32x4_value_t get_scalar(int index);
+ MUST_USE_RESULT inline MaybeObject* get(int index);
+ inline void set(int index, const int32x4_value_t& value);
+
+ static Handle<Object> SetValue(Handle<ExternalInt32x4Array> array,
+ uint32_t index,
+ Handle<Object> value);
+ // This accessor applies the correct conversion from Smi, HeapNumber
+ // and undefined.
+ MUST_USE_RESULT MaybeObject* SetValue(uint32_t index, Object* value);
+
+ // Casting.
+ static inline ExternalInt32x4Array* cast(Object* obj);
+
+ // Dispatched behavior.
+ DECLARE_PRINTER(ExternalInt32x4Array)
+ DECLARE_VERIFIER(ExternalInt32x4Array)
+
+ private:
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalInt32x4Array);
+};
+
+
class ExternalDoubleArray: public ExternalArray {
public:
// Setter and getter.
@@ -6527,15 +6668,96 @@ class Script: public Struct {
V(Math, min, MathMin) \
V(Math, imul, MathImul)
+#define EXPERIMENTAL_SIMD_FUNCTIONS_WITH_ID_LIST(V) \
+ V(SIMD.float32x4, abs, SIMDAbs) \
+ V(SIMD.float32x4, neg, SIMDNeg) \
+ V(SIMD.float32x4, add, SIMDAdd) \
+ V(SIMD.float32x4, sub, SIMDSub) \
+ V(SIMD.float32x4, mul, SIMDMul) \
+ V(SIMD.float32x4, div, SIMDDiv) \
+ V(SIMD.float32x4, clamp, SIMDClamp) \
+ V(SIMD.float32x4, min, SIMDMin) \
+ V(SIMD.float32x4, max, SIMDMax) \
+ V(SIMD.float32x4, reciprocal, SIMDReciprocal) \
+ V(SIMD.float32x4, reciprocalSqrt, SIMDReciprocalSqrt) \
+ V(SIMD.float32x4, scale, SIMDScale) \
+ V(SIMD.float32x4, sqrt, SIMDSqrt) \
+ V(SIMD.float32x4, shuffle, SIMDShuffle) \
+ V(SIMD.float32x4, shuffleMix, SIMDShuffleMix) \
+ V(SIMD.float32x4, withX, SIMDWithX) \
+ V(SIMD.float32x4, withY, SIMDWithY) \
+ V(SIMD.float32x4, withZ, SIMDWithZ) \
+ V(SIMD.float32x4, withW, SIMDWithW) \
+ V(SIMD.float32x4, lessThan, SIMDLessThan) \
+ V(SIMD.float32x4, lessThanOrEqual, SIMDLessThanOrEqual) \
+ V(SIMD.float32x4, equal, SIMDEqual) \
+ V(SIMD.float32x4, notEqual, SIMDNotEqual) \
+ V(SIMD.float32x4, greaterThanOrEqual, SIMDGreaterThanOrEqual) \
+ V(SIMD.float32x4, greaterThan, SIMDGreaterThan) \
+ V(SIMD.float32x4, bitsToInt32x4, SIMDBitsToInt32x4) \
+ V(SIMD.float32x4, toInt32x4, SIMDToInt32x4) \
+ V(SIMD.int32x4, and, SIMDAnd) \
+ V(SIMD.int32x4, or, SIMDOr) \
+ V(SIMD.int32x4, xor, SIMDXor) \
+ V(SIMD.int32x4, not, SIMDNot) \
+ V(SIMD.int32x4, neg, SIMDNegU32) \
+ V(SIMD.int32x4, add, SIMDAddU32) \
+ V(SIMD.int32x4, sub, SIMDSubU32) \
+ V(SIMD.int32x4, mul, SIMDMulU32) \
+ V(SIMD.int32x4, select, SIMDSelect) \
+ V(SIMD.int32x4, shuffle, SIMDShuffleU32) \
+ V(SIMD.int32x4, withX, SIMDWithXu32) \
+ V(SIMD.int32x4, withY, SIMDWithYu32) \
+ V(SIMD.int32x4, withZ, SIMDWithZu32) \
+ V(SIMD.int32x4, withW, SIMDWithWu32) \
+ V(SIMD.int32x4, withFlagX, SIMDWithFlagX) \
+ V(SIMD.int32x4, withFlagY, SIMDWithFlagY) \
+ V(SIMD.int32x4, withFlagZ, SIMDWithFlagZ) \
+ V(SIMD.int32x4, withFlagW, SIMDWithFlagW) \
+ V(SIMD.int32x4, bitsToFloat32x4, SIMDBitsToFloat32x4) \
+ V(SIMD.int32x4, toFloat32x4, SIMDToFloat32x4) \
+ V(float32x4, zero, Float32x4Zero) \
+ V(float32x4, splat, Float32x4Splat) \
+ V(int32x4, splat, Int32x4Splat) \
+ V(int32x4, bool, Int32x4Bool) \
+ V(Float32x4Array.prototype, getAt, Float32x4ArrayGetAt) \
+ V(Float32x4Array.prototype, setAt, Float32x4ArraySetAt) \
+ V(Int32x4Array.prototype, getAt, Int32x4ArrayGetAt) \
+ V(Int32x4Array.prototype, setAt, Int32x4ArraySetAt)
+
+
+#define EXPERIMENTAL_SIMD_FUNCTIONS_WITH_FAKE_ID_LIST(V) \
+ V(global, float32x4, Float32x4Constructor) \
+ V(global, int32x4, Int32x4Constructor) \
+ V(global, unreachable, Float32x4OrInt32x4Unreachable) \
+ V(global, change, Float32x4OrInt32x4Change) \
+ V(int32x4.prototype, signMask, Int32x4SignMask) \
+ V(int32x4.prototype, x, Int32x4X) \
+ V(int32x4.prototype, y, Int32x4Y) \
+ V(int32x4.prototype, z, Int32x4Z) \
+ V(int32x4.prototype, w, Int32x4W) \
+ V(int32x4.prototype, flagX, Int32x4FlagX) \
+ V(int32x4.prototype, flagY, Int32x4FlagY) \
+ V(int32x4.prototype, flagZ, Int32x4FlagZ) \
+ V(int32x4.prototype, flagW, Int32x4FlagW) \
+ V(float32x4.prototype, signMask, Float32x4SignMask) \
+ V(float32x4.prototype, x, Float32x4X) \
+ V(float32x4.prototype, y, Float32x4Y) \
+ V(float32x4.prototype, z, Float32x4Z) \
+ V(float32x4.prototype, w, Float32x4W)
+
enum BuiltinFunctionId {
kArrayCode,
#define DECLARE_FUNCTION_ID(ignored1, ignore2, name) \
k##name,
FUNCTIONS_WITH_ID_LIST(DECLARE_FUNCTION_ID)
-#undef DECLARE_FUNCTION_ID
// Fake id for a special case of Math.pow. Note, it continues the
// list of math functions.
- kMathPowHalf
+ kMathPowHalf,
+ EXPERIMENTAL_SIMD_FUNCTIONS_WITH_ID_LIST(DECLARE_FUNCTION_ID)
+ EXPERIMENTAL_SIMD_FUNCTIONS_WITH_FAKE_ID_LIST(DECLARE_FUNCTION_ID)
+#undef DECLARE_FUNCTION_ID
+ kNumberOfBuiltinFunction
};
@@ -7561,7 +7783,8 @@ class JSBuiltinsObject: public GlobalObject {
};
-// Representation for JS Wrapper objects, String, Number, Boolean, etc.
+// Representation for JS Wrapper objects, String, Number, Float32x4, Int32x4,
+// Boolean, etc.
class JSValue: public JSObject {
public:
// [value]: the object being wrapped.
« no previous file with comments | « src/mark-compact.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698