OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 #include <tuple> | 5 #include <tuple> |
6 | 6 |
7 #include "src/v8.h" | 7 #include "src/v8.h" |
8 | 8 |
9 #include "src/execution.h" | 9 #include "src/execution.h" |
10 #include "src/handles.h" | 10 #include "src/handles.h" |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 TEST(InterpreterStringAdd) { | 379 TEST(InterpreterStringAdd) { |
380 HandleAndZoneScope handles; | 380 HandleAndZoneScope handles; |
381 Isolate* isolate = handles.main_isolate(); | 381 Isolate* isolate = handles.main_isolate(); |
382 Factory* factory = isolate->factory(); | 382 Factory* factory = isolate->factory(); |
383 Zone zone(isolate->allocator()); | 383 Zone zone(isolate->allocator()); |
384 | 384 |
385 struct TestCase { | 385 struct TestCase { |
386 Handle<Object> lhs; | 386 Handle<Object> lhs; |
387 Handle<Object> rhs; | 387 Handle<Object> rhs; |
388 Handle<Object> expected_value; | 388 Handle<Object> expected_value; |
| 389 int32_t expected_feedback; |
389 } test_cases[] = { | 390 } test_cases[] = { |
390 {factory->NewStringFromStaticChars("a"), | 391 {factory->NewStringFromStaticChars("a"), |
391 factory->NewStringFromStaticChars("b"), | 392 factory->NewStringFromStaticChars("b"), |
392 factory->NewStringFromStaticChars("ab")}, | 393 factory->NewStringFromStaticChars("ab"), |
| 394 BinaryOperationFeedback::kString}, |
393 {factory->NewStringFromStaticChars("aaaaaa"), | 395 {factory->NewStringFromStaticChars("aaaaaa"), |
394 factory->NewStringFromStaticChars("b"), | 396 factory->NewStringFromStaticChars("b"), |
395 factory->NewStringFromStaticChars("aaaaaab")}, | 397 factory->NewStringFromStaticChars("aaaaaab"), |
| 398 BinaryOperationFeedback::kString}, |
396 {factory->NewStringFromStaticChars("aaa"), | 399 {factory->NewStringFromStaticChars("aaa"), |
397 factory->NewStringFromStaticChars("bbbbb"), | 400 factory->NewStringFromStaticChars("bbbbb"), |
398 factory->NewStringFromStaticChars("aaabbbbb")}, | 401 factory->NewStringFromStaticChars("aaabbbbb"), |
| 402 BinaryOperationFeedback::kString}, |
399 {factory->NewStringFromStaticChars(""), | 403 {factory->NewStringFromStaticChars(""), |
400 factory->NewStringFromStaticChars("b"), | 404 factory->NewStringFromStaticChars("b"), |
401 factory->NewStringFromStaticChars("b")}, | 405 factory->NewStringFromStaticChars("b"), |
| 406 BinaryOperationFeedback::kString}, |
402 {factory->NewStringFromStaticChars("a"), | 407 {factory->NewStringFromStaticChars("a"), |
403 factory->NewStringFromStaticChars(""), | 408 factory->NewStringFromStaticChars(""), |
404 factory->NewStringFromStaticChars("a")}, | 409 factory->NewStringFromStaticChars("a"), |
| 410 BinaryOperationFeedback::kString}, |
405 {factory->NewStringFromStaticChars("1.11"), factory->NewHeapNumber(2.5), | 411 {factory->NewStringFromStaticChars("1.11"), factory->NewHeapNumber(2.5), |
406 factory->NewStringFromStaticChars("1.112.5")}, | 412 factory->NewStringFromStaticChars("1.112.5"), |
| 413 BinaryOperationFeedback::kAny}, |
407 {factory->NewStringFromStaticChars("-1.11"), factory->NewHeapNumber(2.56), | 414 {factory->NewStringFromStaticChars("-1.11"), factory->NewHeapNumber(2.56), |
408 factory->NewStringFromStaticChars("-1.112.56")}, | 415 factory->NewStringFromStaticChars("-1.112.56"), |
| 416 BinaryOperationFeedback::kAny}, |
409 {factory->NewStringFromStaticChars(""), factory->NewHeapNumber(2.5), | 417 {factory->NewStringFromStaticChars(""), factory->NewHeapNumber(2.5), |
410 factory->NewStringFromStaticChars("2.5")}, | 418 factory->NewStringFromStaticChars("2.5"), BinaryOperationFeedback::kAny}, |
411 }; | 419 }; |
412 | 420 |
413 for (size_t i = 0; i < arraysize(test_cases); i++) { | 421 for (size_t i = 0; i < arraysize(test_cases); i++) { |
414 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); | 422 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); |
415 FeedbackVectorSpec feedback_spec(&zone); | 423 FeedbackVectorSpec feedback_spec(&zone); |
416 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); | 424 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); |
417 Handle<i::TypeFeedbackVector> vector = | 425 Handle<i::TypeFeedbackVector> vector = |
418 NewTypeFeedbackVector(isolate, &feedback_spec); | 426 NewTypeFeedbackVector(isolate, &feedback_spec); |
419 | 427 |
420 Register reg(0); | 428 Register reg(0); |
421 builder.LoadLiteral(test_cases[i].lhs) | 429 builder.LoadLiteral(test_cases[i].lhs) |
422 .StoreAccumulatorInRegister(reg) | 430 .StoreAccumulatorInRegister(reg) |
423 .LoadLiteral(test_cases[i].rhs) | 431 .LoadLiteral(test_cases[i].rhs) |
424 .BinaryOperation(Token::Value::ADD, reg, vector->GetIndex(slot)) | 432 .BinaryOperation(Token::Value::ADD, reg, vector->GetIndex(slot)) |
425 .Return(); | 433 .Return(); |
426 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); | 434 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); |
427 | 435 |
428 InterpreterTester tester(isolate, bytecode_array, vector); | 436 InterpreterTester tester(isolate, bytecode_array, vector); |
429 auto callable = tester.GetCallable<>(); | 437 auto callable = tester.GetCallable<>(); |
430 Handle<Object> return_value = callable().ToHandleChecked(); | 438 Handle<Object> return_value = callable().ToHandleChecked(); |
431 CHECK(return_value->SameValue(*test_cases[i].expected_value)); | 439 CHECK(return_value->SameValue(*test_cases[i].expected_value)); |
| 440 |
| 441 Object* feedback = vector->Get(slot); |
| 442 CHECK(feedback->IsSmi()); |
| 443 CHECK_EQ(test_cases[i].expected_feedback, |
| 444 static_cast<Smi*>(feedback)->value()); |
432 } | 445 } |
433 } | 446 } |
434 | 447 |
435 | 448 |
436 TEST(InterpreterParameter1) { | 449 TEST(InterpreterParameter1) { |
437 HandleAndZoneScope handles; | 450 HandleAndZoneScope handles; |
438 Isolate* isolate = handles.main_isolate(); | 451 Isolate* isolate = handles.main_isolate(); |
439 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0); | 452 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0); |
440 | 453 |
441 builder.LoadAccumulatorWithRegister(builder.Parameter(0)).Return(); | 454 builder.LoadAccumulatorWithRegister(builder.Parameter(0)).Return(); |
(...skipping 1254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1696 | 1709 |
1697 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); | 1710 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); |
1698 InterpreterTester tester(isolate, bytecode_array, vector); | 1711 InterpreterTester tester(isolate, bytecode_array, vector); |
1699 auto callable = tester.GetCallable<>(); | 1712 auto callable = tester.GetCallable<>(); |
1700 Handle<Object> return_value = callable().ToHandleChecked(); | 1713 Handle<Object> return_value = callable().ToHandleChecked(); |
1701 CHECK(return_value->IsBoolean()); | 1714 CHECK(return_value->IsBoolean()); |
1702 CHECK_EQ(return_value->BooleanValue(), | 1715 CHECK_EQ(return_value->BooleanValue(), |
1703 CompareC(comparison, inputs[i], inputs[j])); | 1716 CompareC(comparison, inputs[i], inputs[j])); |
1704 Object* feedback = vector->Get(slot); | 1717 Object* feedback = vector->Get(slot); |
1705 CHECK(feedback->IsSmi()); | 1718 CHECK(feedback->IsSmi()); |
1706 CHECK_EQ(BinaryOperationFeedback::kSignedSmall, | 1719 CHECK_EQ(CompareOperationFeedback::kSignedSmall, |
1707 static_cast<Smi*>(feedback)->value()); | 1720 static_cast<Smi*>(feedback)->value()); |
1708 } | 1721 } |
1709 } | 1722 } |
1710 } | 1723 } |
1711 } | 1724 } |
1712 | 1725 |
1713 | 1726 |
1714 TEST(InterpreterHeapNumberComparisons) { | 1727 TEST(InterpreterHeapNumberComparisons) { |
1715 double inputs[] = {std::numeric_limits<double>::min(), | 1728 double inputs[] = {std::numeric_limits<double>::min(), |
1716 std::numeric_limits<double>::max(), | 1729 std::numeric_limits<double>::max(), |
(...skipping 26 matching lines...) Expand all Loading... |
1743 | 1756 |
1744 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); | 1757 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); |
1745 InterpreterTester tester(isolate, bytecode_array, vector); | 1758 InterpreterTester tester(isolate, bytecode_array, vector); |
1746 auto callable = tester.GetCallable<>(); | 1759 auto callable = tester.GetCallable<>(); |
1747 Handle<Object> return_value = callable().ToHandleChecked(); | 1760 Handle<Object> return_value = callable().ToHandleChecked(); |
1748 CHECK(return_value->IsBoolean()); | 1761 CHECK(return_value->IsBoolean()); |
1749 CHECK_EQ(return_value->BooleanValue(), | 1762 CHECK_EQ(return_value->BooleanValue(), |
1750 CompareC(comparison, inputs[i], inputs[j])); | 1763 CompareC(comparison, inputs[i], inputs[j])); |
1751 Object* feedback = vector->Get(slot); | 1764 Object* feedback = vector->Get(slot); |
1752 CHECK(feedback->IsSmi()); | 1765 CHECK(feedback->IsSmi()); |
1753 CHECK_EQ(BinaryOperationFeedback::kNumber, | 1766 CHECK_EQ(CompareOperationFeedback::kNumber, |
1754 static_cast<Smi*>(feedback)->value()); | 1767 static_cast<Smi*>(feedback)->value()); |
1755 } | 1768 } |
1756 } | 1769 } |
1757 } | 1770 } |
1758 } | 1771 } |
1759 | 1772 |
1760 | 1773 |
1761 TEST(InterpreterStringComparisons) { | 1774 TEST(InterpreterStringComparisons) { |
1762 HandleAndZoneScope handles; | 1775 HandleAndZoneScope handles; |
1763 Isolate* isolate = handles.main_isolate(); | 1776 Isolate* isolate = handles.main_isolate(); |
(...skipping 25 matching lines...) Expand all Loading... |
1789 | 1802 |
1790 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); | 1803 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); |
1791 InterpreterTester tester(isolate, bytecode_array, vector); | 1804 InterpreterTester tester(isolate, bytecode_array, vector); |
1792 auto callable = tester.GetCallable<>(); | 1805 auto callable = tester.GetCallable<>(); |
1793 Handle<Object> return_value = callable().ToHandleChecked(); | 1806 Handle<Object> return_value = callable().ToHandleChecked(); |
1794 CHECK(return_value->IsBoolean()); | 1807 CHECK(return_value->IsBoolean()); |
1795 CHECK_EQ(return_value->BooleanValue(), | 1808 CHECK_EQ(return_value->BooleanValue(), |
1796 CompareC(comparison, inputs[i], inputs[j])); | 1809 CompareC(comparison, inputs[i], inputs[j])); |
1797 Object* feedback = vector->Get(slot); | 1810 Object* feedback = vector->Get(slot); |
1798 CHECK(feedback->IsSmi()); | 1811 CHECK(feedback->IsSmi()); |
1799 CHECK_EQ(BinaryOperationFeedback::kAny, | 1812 CHECK_EQ(CompareOperationFeedback::kAny, |
1800 static_cast<Smi*>(feedback)->value()); | 1813 static_cast<Smi*>(feedback)->value()); |
1801 } | 1814 } |
1802 } | 1815 } |
1803 } | 1816 } |
1804 } | 1817 } |
1805 | 1818 |
1806 | 1819 |
1807 TEST(InterpreterMixedComparisons) { | 1820 TEST(InterpreterMixedComparisons) { |
1808 // This test compares a HeapNumber with a String. The latter is | 1821 // This test compares a HeapNumber with a String. The latter is |
1809 // convertible to a HeapNumber so comparison will be between numeric | 1822 // convertible to a HeapNumber so comparison will be between numeric |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1855 Handle<BytecodeArray> bytecode_array = | 1868 Handle<BytecodeArray> bytecode_array = |
1856 builder.ToBytecodeArray(isolate); | 1869 builder.ToBytecodeArray(isolate); |
1857 InterpreterTester tester(isolate, bytecode_array, vector); | 1870 InterpreterTester tester(isolate, bytecode_array, vector); |
1858 auto callable = tester.GetCallable<>(); | 1871 auto callable = tester.GetCallable<>(); |
1859 Handle<Object> return_value = callable().ToHandleChecked(); | 1872 Handle<Object> return_value = callable().ToHandleChecked(); |
1860 CHECK(return_value->IsBoolean()); | 1873 CHECK(return_value->IsBoolean()); |
1861 CHECK_EQ(return_value->BooleanValue(), | 1874 CHECK_EQ(return_value->BooleanValue(), |
1862 CompareC(comparison, lhs, rhs, true)); | 1875 CompareC(comparison, lhs, rhs, true)); |
1863 Object* feedback = vector->Get(slot); | 1876 Object* feedback = vector->Get(slot); |
1864 CHECK(feedback->IsSmi()); | 1877 CHECK(feedback->IsSmi()); |
1865 CHECK_EQ(BinaryOperationFeedback::kAny, | 1878 CHECK_EQ(CompareOperationFeedback::kAny, |
1866 static_cast<Smi*>(feedback)->value()); | 1879 static_cast<Smi*>(feedback)->value()); |
1867 } | 1880 } |
1868 } | 1881 } |
1869 } | 1882 } |
1870 } | 1883 } |
1871 } | 1884 } |
1872 | 1885 |
1873 TEST(InterpreterStrictNotEqual) { | 1886 TEST(InterpreterStrictNotEqual) { |
1874 HandleAndZoneScope handles; | 1887 HandleAndZoneScope handles; |
1875 Isolate* isolate = handles.main_isolate(); | 1888 Isolate* isolate = handles.main_isolate(); |
(...skipping 2936 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4812 auto callable = tester.GetCallable<>(); | 4825 auto callable = tester.GetCallable<>(); |
4813 | 4826 |
4814 Handle<i::Object> return_value = callable().ToHandleChecked(); | 4827 Handle<i::Object> return_value = callable().ToHandleChecked(); |
4815 CHECK(return_value->SameValue(*tests[i].second)); | 4828 CHECK(return_value->SameValue(*tests[i].second)); |
4816 } | 4829 } |
4817 } | 4830 } |
4818 | 4831 |
4819 } // namespace interpreter | 4832 } // namespace interpreter |
4820 } // namespace internal | 4833 } // namespace internal |
4821 } // namespace v8 | 4834 } // namespace v8 |
OLD | NEW |