| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index 2afd802f534629dc7b4335c677ec59388bf5c6ed..051c4ba3b7d16e54aef797fc6f8fd1a079786200 100644
|
| --- a/src/objects-inl.h
|
| +++ b/src/objects-inl.h
|
| @@ -1258,6 +1258,18 @@ MaybeHandle<Object> Object::GetProperty(Isolate* isolate, Handle<Object> object,
|
| #define WRITE_INTPTR_FIELD(p, offset, value) \
|
| (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value)
|
|
|
| +#define READ_UINT8_FIELD(p, offset) \
|
| + (*reinterpret_cast<const uint8_t*>(FIELD_ADDR_CONST(p, offset)))
|
| +
|
| +#define WRITE_UINT8_FIELD(p, offset, value) \
|
| + (*reinterpret_cast<uint8_t*>(FIELD_ADDR(p, offset)) = value)
|
| +
|
| +#define READ_INT8_FIELD(p, offset) \
|
| + (*reinterpret_cast<const int8_t*>(FIELD_ADDR_CONST(p, offset)))
|
| +
|
| +#define WRITE_INT8_FIELD(p, offset, value) \
|
| + (*reinterpret_cast<int8_t*>(FIELD_ADDR(p, offset)) = value)
|
| +
|
| #define READ_UINT16_FIELD(p, offset) \
|
| (*reinterpret_cast<const uint16_t*>(FIELD_ADDR_CONST(p, offset)))
|
|
|
| @@ -1544,184 +1556,71 @@ SIMD128_TYPES(SIMD128_VALUE_EQUALS)
|
| #undef SIMD128_VALUE_EQUALS
|
|
|
|
|
| -float Float32x4::get_lane(int lane) const {
|
| - DCHECK(lane < 4 && lane >= 0);
|
| -#if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - return READ_FLOAT_FIELD(this, kValueOffset + lane * kFloatSize);
|
| -#elif defined(V8_TARGET_BIG_ENDIAN)
|
| - return READ_FLOAT_FIELD(this, kValueOffset + (3 - lane) * kFloatSize);
|
| -#else
|
| -#error Unknown byte ordering
|
| -#endif
|
| -}
|
| -
|
| -
|
| -void Float32x4::set_lane(int lane, float value) {
|
| - DCHECK(lane < 4 && lane >= 0);
|
| -#if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - WRITE_FLOAT_FIELD(this, kValueOffset + lane * kFloatSize, value);
|
| -#elif defined(V8_TARGET_BIG_ENDIAN)
|
| - WRITE_FLOAT_FIELD(this, kValueOffset + (3 - lane) * kFloatSize, value);
|
| -#else
|
| -#error Unknown byte ordering
|
| -#endif
|
| -}
|
| -
|
| -
|
| -int32_t Int32x4::get_lane(int lane) const {
|
| - DCHECK(lane < 4 && lane >= 0);
|
| -#if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - return READ_INT32_FIELD(this, kValueOffset + lane * kInt32Size);
|
| -#elif defined(V8_TARGET_BIG_ENDIAN)
|
| - return READ_INT32_FIELD(this, kValueOffset + (3 - lane) * kInt32Size);
|
| -#else
|
| -#error Unknown byte ordering
|
| -#endif
|
| -}
|
| -
|
| -
|
| -void Int32x4::set_lane(int lane, int32_t value) {
|
| - DCHECK(lane < 4 && lane >= 0);
|
| -#if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - WRITE_INT32_FIELD(this, kValueOffset + lane * kInt32Size, value);
|
| -#elif defined(V8_TARGET_BIG_ENDIAN)
|
| - WRITE_INT32_FIELD(this, kValueOffset + (3 - lane) * kInt32Size, value);
|
| -#else
|
| -#error Unknown byte ordering
|
| -#endif
|
| -}
|
| -
|
| -
|
| -bool Bool32x4::get_lane(int lane) const {
|
| - DCHECK(lane < 4 && lane >= 0);
|
| - int32_t value;
|
| -#if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - value = READ_INT32_FIELD(this, kValueOffset + lane * kInt32Size);
|
| -#elif defined(V8_TARGET_BIG_ENDIAN)
|
| - value = READ_INT32_FIELD(this, kValueOffset + (3 - lane) * kInt32Size);
|
| -#else
|
| -#error Unknown byte ordering
|
| -#endif
|
| - DCHECK(value == 0 || value == -1);
|
| - return value != 0;
|
| -}
|
| -
|
| -
|
| -void Bool32x4::set_lane(int lane, bool value) {
|
| - DCHECK(lane < 4 && lane >= 0);
|
| - int32_t int_val = value ? -1 : 0;
|
| -#if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - WRITE_INT32_FIELD(this, kValueOffset + lane * kInt32Size, int_val);
|
| -#elif defined(V8_TARGET_BIG_ENDIAN)
|
| - WRITE_INT32_FIELD(this, kValueOffset + (3 - lane) * kInt32Size, int_val);
|
| -#else
|
| -#error Unknown byte ordering
|
| -#endif
|
| -}
|
| -
|
| -
|
| -int16_t Int16x8::get_lane(int lane) const {
|
| - DCHECK(lane < 8 && lane >= 0);
|
| -#if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - return READ_INT16_FIELD(this, kValueOffset + lane * kShortSize);
|
| -#elif defined(V8_TARGET_BIG_ENDIAN)
|
| - return READ_INT16_FIELD(this, kValueOffset + (7 - lane) * kShortSize);
|
| -#else
|
| -#error Unknown byte ordering
|
| -#endif
|
| -}
|
| -
|
| -
|
| -void Int16x8::set_lane(int lane, int16_t value) {
|
| - DCHECK(lane < 8 && lane >= 0);
|
| -#if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - WRITE_INT16_FIELD(this, kValueOffset + lane * kShortSize, value);
|
| -#elif defined(V8_TARGET_BIG_ENDIAN)
|
| - WRITE_INT16_FIELD(this, kValueOffset + (7 - lane) * kShortSize, value);
|
| -#else
|
| -#error Unknown byte ordering
|
| -#endif
|
| -}
|
| -
|
| -
|
| -bool Bool16x8::get_lane(int lane) const {
|
| - DCHECK(lane < 8 && lane >= 0);
|
| - int16_t value;
|
| #if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - return READ_INT16_FIELD(this, kValueOffset + lane * kShortSize);
|
| +#define SIMD128_READ_LANE(lane_type, lane_count, field_type, field_size) \
|
| + lane_type value = \
|
| + READ_##field_type##_FIELD(this, kValueOffset + lane * field_size);
|
| #elif defined(V8_TARGET_BIG_ENDIAN)
|
| - return READ_INT16_FIELD(this, kValueOffset + (7 - lane) * kShortSize);
|
| +#define SIMD128_READ_LANE(lane_type, lane_count, field_type, field_size) \
|
| + lane_type value = READ_##field_type##_FIELD( \
|
| + this, kValueOffset + (lane_count - lane - 1) * field_size);
|
| #else
|
| #error Unknown byte ordering
|
| #endif
|
| - DCHECK(value == 0 || value == -1);
|
| - return value != 0;
|
| -}
|
| -
|
|
|
| -void Bool16x8::set_lane(int lane, bool value) {
|
| - DCHECK(lane < 8 && lane >= 0);
|
| - int16_t int_val = value ? -1 : 0;
|
| #if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - WRITE_INT16_FIELD(this, kValueOffset + lane * kShortSize, int_val);
|
| +#define SIMD128_WRITE_LANE(lane_count, field_type, field_size, value) \
|
| + WRITE_##field_type##_FIELD(this, kValueOffset + lane * field_size, value);
|
| #elif defined(V8_TARGET_BIG_ENDIAN)
|
| - WRITE_INT16_FIELD(this, kValueOffset + (7 - lane) * kShortSize, int_val);
|
| +#define SIMD128_WRITE_LANE(lane_count, field_type, field_size, value) \
|
| + WRITE_##field_type##_FIELD( \
|
| + this, kValueOffset + (lane_count - lane - 1) * field_size, value);
|
| #else
|
| #error Unknown byte ordering
|
| #endif
|
| -}
|
|
|
| -
|
| -int8_t Int8x16::get_lane(int lane) const {
|
| - DCHECK(lane < 16 && lane >= 0);
|
| -#if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - return READ_BYTE_FIELD(this, kValueOffset + lane * kCharSize);
|
| -#elif defined(V8_TARGET_BIG_ENDIAN)
|
| - return READ_BYTE_FIELD(this, kValueOffset + (15 - lane) * kCharSize);
|
| -#else
|
| -#error Unknown byte ordering
|
| -#endif
|
| -}
|
| -
|
| -
|
| -void Int8x16::set_lane(int lane, int8_t value) {
|
| - DCHECK(lane < 16 && lane >= 0);
|
| -#if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - WRITE_BYTE_FIELD(this, kValueOffset + lane * kCharSize, value);
|
| -#elif defined(V8_TARGET_BIG_ENDIAN)
|
| - WRITE_BYTE_FIELD(this, kValueOffset + (15 - lane) * kCharSize, value);
|
| -#else
|
| -#error Unknown byte ordering
|
| -#endif
|
| -}
|
| -
|
| -
|
| -bool Bool8x16::get_lane(int lane) const {
|
| - DCHECK(lane < 16 && lane >= 0);
|
| - int8_t value;
|
| -#if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - value = READ_BYTE_FIELD(this, kValueOffset + lane * kCharSize);
|
| -#elif defined(V8_TARGET_BIG_ENDIAN)
|
| - value = READ_BYTE_FIELD(this, kValueOffset + (15 - lane) * kCharSize);
|
| -#else
|
| -#error Unknown byte ordering
|
| -#endif
|
| - DCHECK(value == 0 || value == -1);
|
| - return value != 0;
|
| -}
|
| -
|
| -
|
| -void Bool8x16::set_lane(int lane, bool value) {
|
| - DCHECK(lane < 16 && lane >= 0);
|
| - int8_t int_val = value ? -1 : 0;
|
| -#if defined(V8_TARGET_LITTLE_ENDIAN)
|
| - WRITE_BYTE_FIELD(this, kValueOffset + lane * kCharSize, int_val);
|
| -#elif defined(V8_TARGET_BIG_ENDIAN)
|
| - WRITE_BYTE_FIELD(this, kValueOffset + (15 - lane) * kCharSize, int_val);
|
| -#else
|
| -#error Unknown byte ordering
|
| -#endif
|
| -}
|
| +#define SIMD128_NUMERIC_LANE_FNS(type, lane_type, lane_count, field_type, \
|
| + field_size) \
|
| + lane_type type::get_lane(int lane) const { \
|
| + DCHECK(lane < lane_count && lane >= 0); \
|
| + SIMD128_READ_LANE(lane_type, lane_count, field_type, field_size) \
|
| + return value; \
|
| + } \
|
| + \
|
| + void type::set_lane(int lane, lane_type value) { \
|
| + DCHECK(lane < lane_count && lane >= 0); \
|
| + SIMD128_WRITE_LANE(lane_count, field_type, field_size, value) \
|
| + }
|
| +
|
| +SIMD128_NUMERIC_LANE_FNS(Float32x4, float, 4, FLOAT, kFloatSize)
|
| +SIMD128_NUMERIC_LANE_FNS(Int32x4, int32_t, 4, INT32, kInt32Size)
|
| +SIMD128_NUMERIC_LANE_FNS(Int16x8, int16_t, 8, INT16, kShortSize)
|
| +SIMD128_NUMERIC_LANE_FNS(Int8x16, int8_t, 16, INT8, kCharSize)
|
| +#undef SIMD128_NUMERIC_LANE_FNS
|
| +
|
| +
|
| +#define SIMD128_BOOLEAN_LANE_FNS(type, lane_type, lane_count, field_type, \
|
| + field_size) \
|
| + bool type::get_lane(int lane) const { \
|
| + DCHECK(lane < lane_count && lane >= 0); \
|
| + SIMD128_READ_LANE(lane_type, lane_count, field_type, field_size) \
|
| + DCHECK(value == 0 || value == -1); \
|
| + return value != 0; \
|
| + } \
|
| + \
|
| + void type::set_lane(int lane, bool value) { \
|
| + DCHECK(lane < lane_count && lane >= 0); \
|
| + int32_t int_val = value ? -1 : 0; \
|
| + SIMD128_WRITE_LANE(lane_count, field_type, field_size, int_val) \
|
| + }
|
| +
|
| +SIMD128_BOOLEAN_LANE_FNS(Bool32x4, int32_t, 4, INT32, kInt32Size)
|
| +SIMD128_BOOLEAN_LANE_FNS(Bool16x8, int16_t, 8, INT16, kShortSize)
|
| +SIMD128_BOOLEAN_LANE_FNS(Bool8x16, int8_t, 16, INT8, kCharSize)
|
| +#undef SIMD128_BOOLEAN_LANE_FNS
|
| +
|
| +#undef SIMD128_READ_LANE
|
| +#undef SIMD128_WRITE_LANE
|
|
|
|
|
| ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset)
|
| @@ -7900,6 +7799,10 @@ String::SubStringRange::iterator String::SubStringRange::end() {
|
| #undef WRITE_INT_FIELD
|
| #undef READ_INTPTR_FIELD
|
| #undef WRITE_INTPTR_FIELD
|
| +#undef READ_UINT8_FIELD
|
| +#undef WRITE_UINT8_FIELD
|
| +#undef READ_INT8_FIELD
|
| +#undef WRITE_INT8_FIELD
|
| #undef READ_UINT16_FIELD
|
| #undef WRITE_UINT16_FIELD
|
| #undef READ_INT16_FIELD
|
|
|