Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: test/cctest/interpreter/test-interpreter.cc

Issue 2392533002: Reland of [interpreter] Add string type feedback to add (Closed)
Patch Set: Un-inline calling the stub Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/code-stubs.cc ('K') | « src/type-feedback-vector-inl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« src/code-stubs.cc ('K') | « src/type-feedback-vector-inl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698