| Index: test/cctest/test-heap.cc
|
| diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc
|
| index 87978c0d78f7b602d16b77e90b65432c52499a34..c54d67aeeb32f100a391369a10625be93b39d665 100644
|
| --- a/test/cctest/test-heap.cc
|
| +++ b/test/cctest/test-heap.cc
|
| @@ -215,20 +215,24 @@ TEST(HeapObjects) {
|
|
|
|
|
| template <typename T, typename LANE_TYPE, int LANES>
|
| -static void CheckSimdLanes(T* value) {
|
| - // Get the original values, and check that all lanes can be set to new values
|
| - // without disturbing the other lanes.
|
| - LANE_TYPE lane_values[LANES];
|
| +static void CheckSimdValue(T* value, LANE_TYPE lane_values[LANES],
|
| + LANE_TYPE other_value) {
|
| + // Check against lane_values, and check that all lanes can be set to
|
| + // other_value without disturbing the other lanes.
|
| for (int i = 0; i < LANES; i++) {
|
| - lane_values[i] = value->get_lane(i);
|
| + CHECK_EQ(lane_values[i], value->get_lane(i));
|
| }
|
| for (int i = 0; i < LANES; i++) {
|
| - lane_values[i] += 1;
|
| - value->set_lane(i, lane_values[i]);
|
| + value->set_lane(i, other_value); // change the value
|
| for (int j = 0; j < LANES; j++) {
|
| - CHECK_EQ(lane_values[j], value->get_lane(j));
|
| + if (i != j)
|
| + CHECK_EQ(lane_values[j], value->get_lane(j));
|
| + else
|
| + CHECK_EQ(other_value, value->get_lane(j));
|
| }
|
| + value->set_lane(i, lane_values[i]); // restore the lane
|
| }
|
| + CHECK(value->BooleanValue()); // SIMD values are 'true'.
|
| }
|
|
|
|
|
| @@ -239,42 +243,131 @@ TEST(SimdObjects) {
|
|
|
| HandleScope sc(isolate);
|
|
|
| - Handle<Float32x4> value = factory->NewFloat32x4(1, 2, 3, 4);
|
| - CHECK(value->IsFloat32x4());
|
| - CHECK(value->BooleanValue()); // SIMD values map to true.
|
| - CHECK_EQ(value->get_lane(0), 1);
|
| - CHECK_EQ(value->get_lane(1), 2);
|
| - CHECK_EQ(value->get_lane(2), 3);
|
| - CHECK_EQ(value->get_lane(3), 4);
|
| -
|
| - CheckSimdLanes<Float32x4, float, 4>(*value);
|
| -
|
| - // Check all lanes, and special lane values.
|
| - value->set_lane(0, 0);
|
| - CHECK_EQ(0, value->get_lane(0));
|
| - value->set_lane(1, -0.0);
|
| - CHECK_EQ(-0.0, value->get_lane(1));
|
| - CHECK(std::signbit(value->get_lane(1))); // Sign bit is preserved.
|
| - float quiet_NaN = std::numeric_limits<float>::quiet_NaN();
|
| - float signaling_NaN = std::numeric_limits<float>::signaling_NaN();
|
| - value->set_lane(2, quiet_NaN);
|
| - CHECK(std::isnan(value->get_lane(2)));
|
| - value->set_lane(3, signaling_NaN);
|
| - CHECK(std::isnan(value->get_lane(3)));
|
| -
|
| - // Check SIMD value printing.
|
| + // Float32x4
|
| {
|
| - value = factory->NewFloat32x4(1, 2, 3, 4);
|
| + float lanes[4] = {1, 2, 3, 4};
|
| + float quiet_NaN = std::numeric_limits<float>::quiet_NaN();
|
| + float signaling_NaN = std::numeric_limits<float>::signaling_NaN();
|
| +
|
| + Handle<Float32x4> value = factory->NewFloat32x4(lanes);
|
| + CHECK(value->IsFloat32x4());
|
| + CheckSimdValue<Float32x4, float, 4>(*value, lanes, 3.14f);
|
| +
|
| + // Check special lane values.
|
| + value->set_lane(1, -0.0);
|
| + CHECK_EQ(-0.0, value->get_lane(1));
|
| + CHECK(std::signbit(value->get_lane(1))); // Sign bit should be preserved.
|
| + value->set_lane(2, quiet_NaN);
|
| + CHECK(std::isnan(value->get_lane(2)));
|
| + value->set_lane(3, signaling_NaN);
|
| + CHECK(std::isnan(value->get_lane(3)));
|
| +
|
| +#ifdef OBJECT_PRINT
|
| + // Check value printing.
|
| + {
|
| + value = factory->NewFloat32x4(lanes);
|
| + std::ostringstream os;
|
| + value->Float32x4Print(os);
|
| + CHECK_EQ("1, 2, 3, 4", os.str());
|
| + }
|
| + {
|
| + float special_lanes[4] = {0, -0.0, quiet_NaN, signaling_NaN};
|
| + value = factory->NewFloat32x4(special_lanes);
|
| + std::ostringstream os;
|
| + value->Float32x4Print(os);
|
| + // Value printing doesn't preserve signed zeroes.
|
| + CHECK_EQ("0, 0, NaN, NaN", os.str());
|
| + }
|
| +#endif // OBJECT_PRINT
|
| + }
|
| + // Int32x4
|
| + {
|
| + int32_t lanes[4] = {-1, 0, 1, 2};
|
| +
|
| + Handle<Int32x4> value = factory->NewInt32x4(lanes);
|
| + CHECK(value->IsInt32x4());
|
| + CheckSimdValue<Int32x4, int32_t, 4>(*value, lanes, 3);
|
| +
|
| +#ifdef OBJECT_PRINT
|
| std::ostringstream os;
|
| - value->Float32x4Print(os);
|
| - CHECK_EQ("1, 2, 3, 4", os.str());
|
| + value->Int32x4Print(os);
|
| + CHECK_EQ("-1, 0, 1, 2", os.str());
|
| +#endif // OBJECT_PRINT
|
| }
|
| + // Bool32x4
|
| {
|
| - value = factory->NewFloat32x4(0, -0.0, quiet_NaN, signaling_NaN);
|
| + bool lanes[4] = {true, true, true, false};
|
| +
|
| + Handle<Bool32x4> value = factory->NewBool32x4(lanes);
|
| + CHECK(value->IsBool32x4());
|
| + CheckSimdValue<Bool32x4, bool, 4>(*value, lanes, false);
|
| +
|
| +#ifdef OBJECT_PRINT
|
| + std::ostringstream os;
|
| + value->Bool32x4Print(os);
|
| + CHECK_EQ("true, true, true, false", os.str());
|
| +#endif // OBJECT_PRINT
|
| + }
|
| + // Int16x8
|
| + {
|
| + int16_t lanes[8] = {-1, 0, 1, 2, 3, 4, 5, -32768};
|
| +
|
| + Handle<Int16x8> value = factory->NewInt16x8(lanes);
|
| + CHECK(value->IsInt16x8());
|
| + CheckSimdValue<Int16x8, int16_t, 8>(*value, lanes, 32767);
|
| +
|
| +#ifdef OBJECT_PRINT
|
| std::ostringstream os;
|
| - value->Float32x4Print(os);
|
| - // Value printing doesn't preserve signed zeroes.
|
| - CHECK_EQ("0, 0, NaN, NaN", os.str());
|
| + value->Int16x8Print(os);
|
| + CHECK_EQ("-1, 0, 1, 2, 3, 4, 5, -32768", os.str());
|
| +#endif // OBJECT_PRINT
|
| + }
|
| + // Bool16x8
|
| + {
|
| + bool lanes[8] = {true, true, true, true, true, true, true, false};
|
| +
|
| + Handle<Bool16x8> value = factory->NewBool16x8(lanes);
|
| + CHECK(value->IsBool16x8());
|
| + CheckSimdValue<Bool16x8, bool, 8>(*value, lanes, false);
|
| +
|
| +#ifdef OBJECT_PRINT
|
| + std::ostringstream os;
|
| + value->Bool16x8Print(os);
|
| + CHECK_EQ("true, true, true, true, true, true, true, false", os.str());
|
| +#endif // OBJECT_PRINT
|
| + }
|
| + // Int8x16
|
| + {
|
| + int8_t lanes[16] = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, -128};
|
| +
|
| + Handle<Int8x16> value = factory->NewInt8x16(lanes);
|
| + CHECK(value->IsInt8x16());
|
| + CheckSimdValue<Int8x16, int8_t, 16>(*value, lanes, 127);
|
| +
|
| +#ifdef OBJECT_PRINT
|
| + std::ostringstream os;
|
| + value->Int8x16Print(os);
|
| + CHECK_EQ("-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, -128",
|
| + os.str());
|
| +#endif // OBJECT_PRINT
|
| + }
|
| + // Bool8x16
|
| + {
|
| + bool lanes[16] = {true, true, true, true, true, true, true, false,
|
| + true, true, true, true, true, true, true, false};
|
| +
|
| + Handle<Bool8x16> value = factory->NewBool8x16(lanes);
|
| + CHECK(value->IsBool8x16());
|
| + CheckSimdValue<Bool8x16, bool, 16>(*value, lanes, false);
|
| +
|
| +#ifdef OBJECT_PRINT
|
| + std::ostringstream os;
|
| + value->Bool8x16Print(os);
|
| + CHECK_EQ(
|
| + "true, true, true, true, true, true, true, false, true, true, true, "
|
| + "true, true, true, true, false",
|
| + os.str());
|
| +#endif // OBJECT_PRINT
|
| }
|
| }
|
|
|
|
|