Index: test/cctest/test-heap.cc |
diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc |
index a885c4ac03ca60172e8003ab0c662696da950026..eff83c039724d989e1d74d4500eaabb66e4d022d 100644 |
--- a/test/cctest/test-heap.cc |
+++ b/test/cctest/test-heap.cc |
@@ -59,6 +59,7 @@ TEST(HeapMaps) { |
Heap* heap = CcTest::heap(); |
CheckMap(heap->meta_map(), MAP_TYPE, Map::kSize); |
CheckMap(heap->heap_number_map(), HEAP_NUMBER_TYPE, HeapNumber::kSize); |
+ CheckMap(heap->float32x4_map(), FLOAT32X4_TYPE, Float32x4::kSize); |
CheckMap(heap->fixed_array_map(), FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
CheckMap(heap->string_map(), STRING_TYPE, kVariableSizeSentinel); |
} |
@@ -213,6 +214,60 @@ 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]; |
+ for (int i = 0; i < LANES; i++) { |
+ 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]); |
+ for (int j = 0; j < LANES; j++) { |
+ CHECK_EQ(lane_values[j], value->get_lane(j)); |
+ } |
+ } |
+} |
+ |
+ |
+TEST(SimdObjects) { |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ Factory* factory = isolate->factory(); |
+ |
+ HandleScope sc(isolate); |
+ |
+ Handle<Object> value = factory->NewFloat32x4(1, 2, 3, 4); |
+ CHECK(value->IsFloat32x4()); |
+ CHECK(value->BooleanValue()); // SIMD values map to true. |
+ |
+ Float32x4* float32x4 = *Handle<Float32x4>::cast(value); |
+ CheckSimdLanes<Float32x4, float, 4>(float32x4); |
+ |
+ // Check ToString for SIMD values. |
+ // TODO(bbudge): Switch to Check* style function to test ToString(). |
+ value = factory->NewFloat32x4(1, 2, 3, 4); |
+ float32x4 = *Handle<Float32x4>::cast(value); |
+ std::ostringstream os; |
+ float32x4->Float32x4Print(os); |
+ CHECK_EQ("1, 2, 3, 4", os.str()); |
+ |
+ // Check unusual lane values. |
+ float32x4->set_lane(0, 0); |
+ CHECK_EQ(0, float32x4->get_lane(0)); |
+ float32x4->set_lane(1, -0.0); |
+ CHECK_EQ(-0.0, float32x4->get_lane(1)); |
+ float quiet_NaN = std::numeric_limits<float>::quiet_NaN(); |
+ float signaling_NaN = std::numeric_limits<float>::signaling_NaN(); |
+ float32x4->set_lane(2, quiet_NaN); |
+ CHECK(std::isnan(float32x4->get_lane(2))); |
+ float32x4->set_lane(3, signaling_NaN); |
+ CHECK(std::isnan(float32x4->get_lane(3))); |
+} |
+ |
+ |
TEST(Tagging) { |
CcTest::InitializeVM(); |
int request = 24; |