| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 CHECK_EQ(type, map->instance_type()); | 61 CHECK_EQ(type, map->instance_type()); |
| 62 CHECK_EQ(instance_size, map->instance_size()); | 62 CHECK_EQ(instance_size, map->instance_size()); |
| 63 } | 63 } |
| 64 | 64 |
| 65 | 65 |
| 66 TEST(HeapMaps) { | 66 TEST(HeapMaps) { |
| 67 CcTest::InitializeVM(); | 67 CcTest::InitializeVM(); |
| 68 Heap* heap = CcTest::heap(); | 68 Heap* heap = CcTest::heap(); |
| 69 CheckMap(heap->meta_map(), MAP_TYPE, Map::kSize); | 69 CheckMap(heap->meta_map(), MAP_TYPE, Map::kSize); |
| 70 CheckMap(heap->heap_number_map(), HEAP_NUMBER_TYPE, HeapNumber::kSize); | 70 CheckMap(heap->heap_number_map(), HEAP_NUMBER_TYPE, HeapNumber::kSize); |
| 71 #define SIMD128_TYPE(TYPE, Type, type, lane_count, lane_type) \ | |
| 72 CheckMap(heap->type##_map(), SIMD128_VALUE_TYPE, Type::kSize); | |
| 73 SIMD128_TYPES(SIMD128_TYPE) | |
| 74 #undef SIMD128_TYPE | |
| 75 CheckMap(heap->fixed_array_map(), FIXED_ARRAY_TYPE, kVariableSizeSentinel); | 71 CheckMap(heap->fixed_array_map(), FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
| 76 CheckMap(heap->string_map(), STRING_TYPE, kVariableSizeSentinel); | 72 CheckMap(heap->string_map(), STRING_TYPE, kVariableSizeSentinel); |
| 77 } | 73 } |
| 78 | 74 |
| 79 static void VerifyStoredPrototypeMap(Isolate* isolate, | 75 static void VerifyStoredPrototypeMap(Isolate* isolate, |
| 80 int stored_map_context_index, | 76 int stored_map_context_index, |
| 81 int stored_ctor_context_index) { | 77 int stored_ctor_context_index) { |
| 82 Handle<Context> context = isolate->native_context(); | 78 Handle<Context> context = isolate->native_context(); |
| 83 | 79 |
| 84 Handle<Map> this_map(Map::cast(context->get(stored_map_context_index))); | 80 Handle<Map> this_map(Map::cast(context->get(stored_map_context_index))); |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 CheckSmi(isolate, 0, "0"); | 313 CheckSmi(isolate, 0, "0"); |
| 318 CheckSmi(isolate, 42, "42"); | 314 CheckSmi(isolate, 42, "42"); |
| 319 CheckSmi(isolate, -42, "-42"); | 315 CheckSmi(isolate, -42, "-42"); |
| 320 | 316 |
| 321 // Check ToString for Numbers | 317 // Check ToString for Numbers |
| 322 CheckNumber(isolate, 1.1, "1.1"); | 318 CheckNumber(isolate, 1.1, "1.1"); |
| 323 | 319 |
| 324 CheckFindCodeObject(isolate); | 320 CheckFindCodeObject(isolate); |
| 325 } | 321 } |
| 326 | 322 |
| 327 | |
| 328 template <typename T, typename LANE_TYPE, int LANES> | |
| 329 static void CheckSimdValue(T* value, LANE_TYPE lane_values[LANES], | |
| 330 LANE_TYPE other_value) { | |
| 331 // Check against lane_values, and check that all lanes can be set to | |
| 332 // other_value without disturbing the other lanes. | |
| 333 for (int i = 0; i < LANES; i++) { | |
| 334 CHECK_EQ(lane_values[i], value->get_lane(i)); | |
| 335 } | |
| 336 for (int i = 0; i < LANES; i++) { | |
| 337 value->set_lane(i, other_value); // change the value | |
| 338 for (int j = 0; j < LANES; j++) { | |
| 339 if (i != j) | |
| 340 CHECK_EQ(lane_values[j], value->get_lane(j)); | |
| 341 else | |
| 342 CHECK_EQ(other_value, value->get_lane(j)); | |
| 343 } | |
| 344 value->set_lane(i, lane_values[i]); // restore the lane | |
| 345 } | |
| 346 CHECK(value->BooleanValue()); // SIMD values are 'true'. | |
| 347 } | |
| 348 | |
| 349 | |
| 350 TEST(SimdObjects) { | |
| 351 CcTest::InitializeVM(); | |
| 352 Isolate* isolate = CcTest::i_isolate(); | |
| 353 Factory* factory = isolate->factory(); | |
| 354 | |
| 355 HandleScope sc(isolate); | |
| 356 | |
| 357 // Float32x4 | |
| 358 { | |
| 359 float lanes[4] = {1, 2, 3, 4}; | |
| 360 float quiet_NaN = std::numeric_limits<float>::quiet_NaN(); | |
| 361 float signaling_NaN = std::numeric_limits<float>::signaling_NaN(); | |
| 362 | |
| 363 Handle<Float32x4> value = factory->NewFloat32x4(lanes); | |
| 364 CHECK(value->IsFloat32x4()); | |
| 365 CheckSimdValue<Float32x4, float, 4>(*value, lanes, 3.14f); | |
| 366 | |
| 367 // Check special lane values. | |
| 368 value->set_lane(1, -0.0); | |
| 369 CHECK_EQ(-0.0f, value->get_lane(1)); | |
| 370 CHECK(std::signbit(value->get_lane(1))); // Sign bit should be preserved. | |
| 371 value->set_lane(2, quiet_NaN); | |
| 372 CHECK(std::isnan(value->get_lane(2))); | |
| 373 value->set_lane(3, signaling_NaN); | |
| 374 CHECK(std::isnan(value->get_lane(3))); | |
| 375 | |
| 376 #ifdef OBJECT_PRINT | |
| 377 // Check value printing. | |
| 378 { | |
| 379 value = factory->NewFloat32x4(lanes); | |
| 380 std::ostringstream os; | |
| 381 value->Float32x4Print(os); | |
| 382 CHECK_EQ("1, 2, 3, 4", os.str()); | |
| 383 } | |
| 384 { | |
| 385 float special_lanes[4] = {0, -0.0, quiet_NaN, signaling_NaN}; | |
| 386 value = factory->NewFloat32x4(special_lanes); | |
| 387 std::ostringstream os; | |
| 388 value->Float32x4Print(os); | |
| 389 // Value printing doesn't preserve signed zeroes. | |
| 390 CHECK_EQ("0, 0, NaN, NaN", os.str()); | |
| 391 } | |
| 392 #endif // OBJECT_PRINT | |
| 393 } | |
| 394 // Int32x4 | |
| 395 { | |
| 396 int32_t lanes[4] = {1, 2, 3, 4}; | |
| 397 | |
| 398 Handle<Int32x4> value = factory->NewInt32x4(lanes); | |
| 399 CHECK(value->IsInt32x4()); | |
| 400 CheckSimdValue<Int32x4, int32_t, 4>(*value, lanes, 3); | |
| 401 | |
| 402 #ifdef OBJECT_PRINT | |
| 403 std::ostringstream os; | |
| 404 value->Int32x4Print(os); | |
| 405 CHECK_EQ("1, 2, 3, 4", os.str()); | |
| 406 #endif // OBJECT_PRINT | |
| 407 } | |
| 408 // Uint32x4 | |
| 409 { | |
| 410 uint32_t lanes[4] = {1, 2, 3, 4}; | |
| 411 | |
| 412 Handle<Uint32x4> value = factory->NewUint32x4(lanes); | |
| 413 CHECK(value->IsUint32x4()); | |
| 414 CheckSimdValue<Uint32x4, uint32_t, 4>(*value, lanes, 3); | |
| 415 | |
| 416 #ifdef OBJECT_PRINT | |
| 417 std::ostringstream os; | |
| 418 value->Uint32x4Print(os); | |
| 419 CHECK_EQ("1, 2, 3, 4", os.str()); | |
| 420 #endif // OBJECT_PRINT | |
| 421 } | |
| 422 // Bool32x4 | |
| 423 { | |
| 424 bool lanes[4] = {true, false, true, false}; | |
| 425 | |
| 426 Handle<Bool32x4> value = factory->NewBool32x4(lanes); | |
| 427 CHECK(value->IsBool32x4()); | |
| 428 CheckSimdValue<Bool32x4, bool, 4>(*value, lanes, false); | |
| 429 | |
| 430 #ifdef OBJECT_PRINT | |
| 431 std::ostringstream os; | |
| 432 value->Bool32x4Print(os); | |
| 433 CHECK_EQ("true, false, true, false", os.str()); | |
| 434 #endif // OBJECT_PRINT | |
| 435 } | |
| 436 // Int16x8 | |
| 437 { | |
| 438 int16_t lanes[8] = {1, 2, 3, 4, 5, 6, 7, 8}; | |
| 439 | |
| 440 Handle<Int16x8> value = factory->NewInt16x8(lanes); | |
| 441 CHECK(value->IsInt16x8()); | |
| 442 CheckSimdValue<Int16x8, int16_t, 8>(*value, lanes, 32767); | |
| 443 | |
| 444 #ifdef OBJECT_PRINT | |
| 445 std::ostringstream os; | |
| 446 value->Int16x8Print(os); | |
| 447 CHECK_EQ("1, 2, 3, 4, 5, 6, 7, 8", os.str()); | |
| 448 #endif // OBJECT_PRINT | |
| 449 } | |
| 450 // Uint16x8 | |
| 451 { | |
| 452 uint16_t lanes[8] = {1, 2, 3, 4, 5, 6, 7, 8}; | |
| 453 | |
| 454 Handle<Uint16x8> value = factory->NewUint16x8(lanes); | |
| 455 CHECK(value->IsUint16x8()); | |
| 456 CheckSimdValue<Uint16x8, uint16_t, 8>(*value, lanes, 32767); | |
| 457 | |
| 458 #ifdef OBJECT_PRINT | |
| 459 std::ostringstream os; | |
| 460 value->Uint16x8Print(os); | |
| 461 CHECK_EQ("1, 2, 3, 4, 5, 6, 7, 8", os.str()); | |
| 462 #endif // OBJECT_PRINT | |
| 463 } | |
| 464 // Bool16x8 | |
| 465 { | |
| 466 bool lanes[8] = {true, false, true, false, true, false, true, false}; | |
| 467 | |
| 468 Handle<Bool16x8> value = factory->NewBool16x8(lanes); | |
| 469 CHECK(value->IsBool16x8()); | |
| 470 CheckSimdValue<Bool16x8, bool, 8>(*value, lanes, false); | |
| 471 | |
| 472 #ifdef OBJECT_PRINT | |
| 473 std::ostringstream os; | |
| 474 value->Bool16x8Print(os); | |
| 475 CHECK_EQ("true, false, true, false, true, false, true, false", os.str()); | |
| 476 #endif // OBJECT_PRINT | |
| 477 } | |
| 478 // Int8x16 | |
| 479 { | |
| 480 int8_t lanes[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; | |
| 481 | |
| 482 Handle<Int8x16> value = factory->NewInt8x16(lanes); | |
| 483 CHECK(value->IsInt8x16()); | |
| 484 CheckSimdValue<Int8x16, int8_t, 16>(*value, lanes, 127); | |
| 485 | |
| 486 #ifdef OBJECT_PRINT | |
| 487 std::ostringstream os; | |
| 488 value->Int8x16Print(os); | |
| 489 CHECK_EQ("1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16", os.str()); | |
| 490 #endif // OBJECT_PRINT | |
| 491 } | |
| 492 // Uint8x16 | |
| 493 { | |
| 494 uint8_t lanes[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; | |
| 495 | |
| 496 Handle<Uint8x16> value = factory->NewUint8x16(lanes); | |
| 497 CHECK(value->IsUint8x16()); | |
| 498 CheckSimdValue<Uint8x16, uint8_t, 16>(*value, lanes, 127); | |
| 499 | |
| 500 #ifdef OBJECT_PRINT | |
| 501 std::ostringstream os; | |
| 502 value->Uint8x16Print(os); | |
| 503 CHECK_EQ("1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16", os.str()); | |
| 504 #endif // OBJECT_PRINT | |
| 505 } | |
| 506 // Bool8x16 | |
| 507 { | |
| 508 bool lanes[16] = {true, false, true, false, true, false, true, false, | |
| 509 true, false, true, false, true, false, true, false}; | |
| 510 | |
| 511 Handle<Bool8x16> value = factory->NewBool8x16(lanes); | |
| 512 CHECK(value->IsBool8x16()); | |
| 513 CheckSimdValue<Bool8x16, bool, 16>(*value, lanes, false); | |
| 514 | |
| 515 #ifdef OBJECT_PRINT | |
| 516 std::ostringstream os; | |
| 517 value->Bool8x16Print(os); | |
| 518 CHECK_EQ( | |
| 519 "true, false, true, false, true, false, true, false, true, false, " | |
| 520 "true, false, true, false, true, false", | |
| 521 os.str()); | |
| 522 #endif // OBJECT_PRINT | |
| 523 } | |
| 524 } | |
| 525 | |
| 526 | |
| 527 TEST(Tagging) { | 323 TEST(Tagging) { |
| 528 CcTest::InitializeVM(); | 324 CcTest::InitializeVM(); |
| 529 int request = 24; | 325 int request = 24; |
| 530 CHECK_EQ(request, static_cast<int>(OBJECT_POINTER_ALIGN(request))); | 326 CHECK_EQ(request, static_cast<int>(OBJECT_POINTER_ALIGN(request))); |
| 531 CHECK(Smi::FromInt(42)->IsSmi()); | 327 CHECK(Smi::FromInt(42)->IsSmi()); |
| 532 CHECK(Smi::FromInt(Smi::kMinValue)->IsSmi()); | 328 CHECK(Smi::FromInt(Smi::kMinValue)->IsSmi()); |
| 533 CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi()); | 329 CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi()); |
| 534 } | 330 } |
| 535 | 331 |
| 536 | 332 |
| (...skipping 6406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6943 CHECK(!heap->code_space()->FirstPage()->Contains(code->address())); | 6739 CHECK(!heap->code_space()->FirstPage()->Contains(code->address())); |
| 6944 | 6740 |
| 6945 // Ensure it's not in large object space. | 6741 // Ensure it's not in large object space. |
| 6946 MemoryChunk* chunk = MemoryChunk::FromAddress(code->address()); | 6742 MemoryChunk* chunk = MemoryChunk::FromAddress(code->address()); |
| 6947 CHECK(chunk->owner()->identity() != LO_SPACE); | 6743 CHECK(chunk->owner()->identity() != LO_SPACE); |
| 6948 CHECK(chunk->NeverEvacuate()); | 6744 CHECK(chunk->NeverEvacuate()); |
| 6949 } | 6745 } |
| 6950 | 6746 |
| 6951 } // namespace internal | 6747 } // namespace internal |
| 6952 } // namespace v8 | 6748 } // namespace v8 |
| OLD | NEW |