| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // TODO(jochen): Remove this after the setting is turned on globally. | 5 // TODO(jochen): Remove this after the setting is turned on globally. |
| 6 #define V8_IMMINENT_DEPRECATION_WARNINGS | 6 #define V8_IMMINENT_DEPRECATION_WARNINGS |
| 7 | 7 |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "test/cctest/cctest.h" | 10 #include "test/cctest/cctest.h" |
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, | 445 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, |
| 446 IrOpcode::kChangeFloat64ToTagged, kRepFloat32, kRepTagged); | 446 IrOpcode::kChangeFloat64ToTagged, kRepFloat32, kRepTagged); |
| 447 CheckTwoChanges(IrOpcode::kChangeTaggedToFloat64, | 447 CheckTwoChanges(IrOpcode::kChangeTaggedToFloat64, |
| 448 IrOpcode::kTruncateFloat64ToFloat32, kRepTagged, kRepFloat32); | 448 IrOpcode::kTruncateFloat64ToFloat32, kRepTagged, kRepFloat32); |
| 449 } | 449 } |
| 450 | 450 |
| 451 | 451 |
| 452 TEST(SignednessInWord32) { | 452 TEST(SignednessInWord32) { |
| 453 RepresentationChangerTester r; | 453 RepresentationChangerTester r; |
| 454 | 454 |
| 455 // TODO(titzer): assume that uses of a word32 without a sign mean kTypeInt32. | |
| 456 CheckChange(IrOpcode::kChangeTaggedToInt32, kRepTagged | kTypeInt32, | 455 CheckChange(IrOpcode::kChangeTaggedToInt32, kRepTagged | kTypeInt32, |
| 457 kRepWord32 | kTypeInt32); | 456 kRepWord32); |
| 458 CheckChange(IrOpcode::kChangeTaggedToUint32, kRepTagged | kTypeUint32, | 457 CheckChange(IrOpcode::kChangeTaggedToUint32, kRepTagged | kTypeUint32, |
| 459 kRepWord32 | kTypeUint32); | 458 kRepWord32); |
| 460 CheckChange(IrOpcode::kChangeInt32ToFloat64, kRepWord32, kRepFloat64); | 459 CheckChange(IrOpcode::kChangeInt32ToFloat64, kRepWord32, kRepFloat64); |
| 461 CheckChange(IrOpcode::kChangeFloat64ToInt32, kRepFloat64 | kTypeInt32, | 460 CheckChange(IrOpcode::kChangeFloat64ToInt32, kRepFloat64 | kTypeInt32, |
| 462 kRepWord32); | 461 kRepWord32); |
| 463 CheckChange(IrOpcode::kTruncateFloat64ToInt32, kRepFloat64, kRepWord32); | 462 CheckChange(IrOpcode::kTruncateFloat64ToInt32, kRepFloat64, kRepWord32); |
| 464 | 463 |
| 465 CheckTwoChanges(IrOpcode::kChangeInt32ToFloat64, | 464 CheckTwoChanges(IrOpcode::kChangeInt32ToFloat64, |
| 466 IrOpcode::kTruncateFloat64ToFloat32, kRepWord32, kRepFloat32); | 465 IrOpcode::kTruncateFloat64ToFloat32, kRepWord32, kRepFloat32); |
| 467 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, | 466 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, |
| 468 IrOpcode::kTruncateFloat64ToInt32, kRepFloat32, kRepWord32); | 467 IrOpcode::kTruncateFloat64ToInt32, kRepFloat32, kRepWord32); |
| 469 } | 468 } |
| 470 | 469 |
| 471 | 470 |
| 472 TEST(Nops) { | 471 TEST(Nops) { |
| 473 RepresentationChangerTester r; | 472 RepresentationChangerTester r; |
| 474 | 473 |
| 475 // X -> X is always a nop for any single representation X. | 474 // X -> X is always a nop for any single representation X. |
| 476 for (size_t i = 0; i < arraysize(all_reps); i++) { | 475 for (size_t i = 0; i < arraysize(all_reps); i++) { |
| 477 r.CheckNop(all_reps[i], all_reps[i]); | 476 r.CheckNop(all_reps[i], all_reps[i]); |
| 478 } | 477 } |
| 479 | 478 |
| 480 // 32-bit floats. | 479 // 32-bit floats. |
| 481 r.CheckNop(kRepFloat32, kRepFloat32); | 480 r.CheckNop(kRepFloat32, kRepFloat32); |
| 482 r.CheckNop(kRepFloat32 | kTypeNumber, kRepFloat32); | 481 r.CheckNop(kRepFloat32 | kTypeNumber, kRepFloat32); |
| 483 r.CheckNop(kRepFloat32, kRepFloat32 | kTypeNumber); | |
| 484 | 482 |
| 485 // 32-bit words can be used as smaller word sizes and vice versa, because | 483 // 32-bit words can be used as smaller word sizes and vice versa, because |
| 486 // loads from memory implicitly sign or zero extend the value to the | 484 // loads from memory implicitly sign or zero extend the value to the |
| 487 // full machine word size, and stores implicitly truncate. | 485 // full machine word size, and stores implicitly truncate. |
| 488 r.CheckNop(kRepWord32, kRepWord8); | 486 r.CheckNop(kRepWord32, kRepWord8); |
| 489 r.CheckNop(kRepWord32, kRepWord16); | 487 r.CheckNop(kRepWord32, kRepWord16); |
| 490 r.CheckNop(kRepWord32, kRepWord32); | 488 r.CheckNop(kRepWord32, kRepWord32); |
| 491 r.CheckNop(kRepWord8, kRepWord32); | 489 r.CheckNop(kRepWord8, kRepWord32); |
| 492 r.CheckNop(kRepWord16, kRepWord32); | 490 r.CheckNop(kRepWord16, kRepWord32); |
| 493 | 491 |
| 494 // kRepBit (result of comparison) is implicitly a wordish thing. | 492 // kRepBit (result of comparison) is implicitly a wordish thing. |
| 495 r.CheckNop(kRepBit, kRepWord8); | 493 r.CheckNop(kRepBit, kRepWord8); |
| 496 r.CheckNop(kRepBit | kTypeBool, kRepWord8); | 494 r.CheckNop(kRepBit | kTypeBool, kRepWord8); |
| 497 r.CheckNop(kRepBit, kRepWord16); | 495 r.CheckNop(kRepBit, kRepWord16); |
| 498 r.CheckNop(kRepBit | kTypeBool, kRepWord16); | 496 r.CheckNop(kRepBit | kTypeBool, kRepWord16); |
| 499 r.CheckNop(kRepBit, kRepWord32); | 497 r.CheckNop(kRepBit, kRepWord32); |
| 500 r.CheckNop(kRepBit | kTypeBool, kRepWord32); | 498 r.CheckNop(kRepBit | kTypeBool, kRepWord32); |
| 501 r.CheckNop(kRepBit, kRepWord64); | 499 r.CheckNop(kRepBit, kRepWord64); |
| 502 r.CheckNop(kRepBit | kTypeBool, kRepWord64); | 500 r.CheckNop(kRepBit | kTypeBool, kRepWord64); |
| 503 } | 501 } |
| 504 | 502 |
| 505 | 503 |
| 506 TEST(TypeErrors) { | 504 TEST(TypeErrors) { |
| 507 RepresentationChangerTester r; | 505 RepresentationChangerTester r; |
| 508 | 506 |
| 509 // Wordish cannot be implicitly converted to/from comparison conditions. | 507 // Wordish cannot be implicitly converted to/from comparison conditions. |
| 510 r.CheckTypeError(kRepWord8, kRepBit); | 508 r.CheckTypeError(kRepWord8, kRepBit); |
| 511 r.CheckTypeError(kRepWord8, kRepBit | kTypeBool); | |
| 512 r.CheckTypeError(kRepWord16, kRepBit); | 509 r.CheckTypeError(kRepWord16, kRepBit); |
| 513 r.CheckTypeError(kRepWord16, kRepBit | kTypeBool); | |
| 514 r.CheckTypeError(kRepWord32, kRepBit); | 510 r.CheckTypeError(kRepWord32, kRepBit); |
| 515 r.CheckTypeError(kRepWord32, kRepBit | kTypeBool); | |
| 516 r.CheckTypeError(kRepWord64, kRepBit); | 511 r.CheckTypeError(kRepWord64, kRepBit); |
| 517 r.CheckTypeError(kRepWord64, kRepBit | kTypeBool); | |
| 518 | 512 |
| 519 // Floats cannot be implicitly converted to/from comparison conditions. | 513 // Floats cannot be implicitly converted to/from comparison conditions. |
| 520 r.CheckTypeError(kRepFloat64, kRepBit); | 514 r.CheckTypeError(kRepFloat64, kRepBit); |
| 521 r.CheckTypeError(kRepFloat64, kRepBit | kTypeBool); | |
| 522 r.CheckTypeError(kRepBit, kRepFloat64); | 515 r.CheckTypeError(kRepBit, kRepFloat64); |
| 523 r.CheckTypeError(kRepBit | kTypeBool, kRepFloat64); | 516 r.CheckTypeError(kRepBit | kTypeBool, kRepFloat64); |
| 524 | 517 |
| 525 // Floats cannot be implicitly converted to/from comparison conditions. | 518 // Floats cannot be implicitly converted to/from comparison conditions. |
| 526 r.CheckTypeError(kRepFloat32, kRepBit); | 519 r.CheckTypeError(kRepFloat32, kRepBit); |
| 527 r.CheckTypeError(kRepFloat32, kRepBit | kTypeBool); | |
| 528 r.CheckTypeError(kRepBit, kRepFloat32); | 520 r.CheckTypeError(kRepBit, kRepFloat32); |
| 529 r.CheckTypeError(kRepBit | kTypeBool, kRepFloat32); | 521 r.CheckTypeError(kRepBit | kTypeBool, kRepFloat32); |
| 530 | 522 |
| 531 // Word64 is internal and shouldn't be implicitly converted. | 523 // Word64 is internal and shouldn't be implicitly converted. |
| 532 r.CheckTypeError(kRepWord64, kRepTagged | kTypeBool); | |
| 533 r.CheckTypeError(kRepWord64, kRepTagged); | 524 r.CheckTypeError(kRepWord64, kRepTagged); |
| 534 r.CheckTypeError(kRepWord64, kRepTagged | kTypeBool); | |
| 535 r.CheckTypeError(kRepTagged, kRepWord64); | 525 r.CheckTypeError(kRepTagged, kRepWord64); |
| 536 r.CheckTypeError(kRepTagged | kTypeBool, kRepWord64); | 526 r.CheckTypeError(kRepTagged | kTypeBool, kRepWord64); |
| 537 | 527 |
| 538 // Word64 / Word32 shouldn't be implicitly converted. | 528 // Word64 / Word32 shouldn't be implicitly converted. |
| 539 r.CheckTypeError(kRepWord64, kRepWord32); | 529 r.CheckTypeError(kRepWord64, kRepWord32); |
| 540 r.CheckTypeError(kRepWord32, kRepWord64); | 530 r.CheckTypeError(kRepWord32, kRepWord64); |
| 541 r.CheckTypeError(kRepWord64, kRepWord32 | kTypeInt32); | |
| 542 r.CheckTypeError(kRepWord32 | kTypeInt32, kRepWord64); | 531 r.CheckTypeError(kRepWord32 | kTypeInt32, kRepWord64); |
| 543 r.CheckTypeError(kRepWord64, kRepWord32 | kTypeUint32); | |
| 544 r.CheckTypeError(kRepWord32 | kTypeUint32, kRepWord64); | 532 r.CheckTypeError(kRepWord32 | kTypeUint32, kRepWord64); |
| 545 | 533 |
| 546 for (size_t i = 0; i < arraysize(all_reps); i++) { | 534 for (size_t i = 0; i < arraysize(all_reps); i++) { |
| 547 for (size_t j = 0; j < arraysize(all_reps); j++) { | 535 for (size_t j = 0; j < arraysize(all_reps); j++) { |
| 548 if (i == j) continue; | 536 if (i == j) continue; |
| 549 // Only a single from representation is allowed. | 537 // Only a single from representation is allowed. |
| 550 r.CheckTypeError(all_reps[i] | all_reps[j], kRepTagged); | 538 r.CheckTypeError(all_reps[i] | all_reps[j], kRepTagged); |
| 551 } | 539 } |
| 552 } | 540 } |
| 553 } | 541 } |
| 554 | 542 |
| 555 } // namespace compiler | 543 } // namespace compiler |
| 556 } // namespace internal | 544 } // namespace internal |
| 557 } // namespace v8 | 545 } // namespace v8 |
| OLD | NEW |