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 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { | 262 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { |
263 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { | 263 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { |
264 for (size_t o = 0; o < arraysize(kShiftOperators); o++) { | 264 for (size_t o = 0; o < arraysize(kShiftOperators); o++) { |
265 HandleAndZoneScope handles; | 265 HandleAndZoneScope handles; |
266 Isolate* isolate = handles.main_isolate(); | 266 Isolate* isolate = handles.main_isolate(); |
267 Factory* factory = isolate->factory(); | 267 Factory* factory = isolate->factory(); |
268 Zone zone(isolate->allocator()); | 268 Zone zone(isolate->allocator()); |
269 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); | 269 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); |
270 | 270 |
271 FeedbackVectorSpec feedback_spec(&zone); | 271 FeedbackVectorSpec feedback_spec(&zone); |
272 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); | 272 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); |
273 Handle<i::TypeFeedbackVector> vector = | 273 Handle<i::TypeFeedbackVector> vector = |
274 NewTypeFeedbackVector(isolate, &feedback_spec); | 274 NewTypeFeedbackVector(isolate, &feedback_spec); |
275 | 275 |
276 Register reg(0); | 276 Register reg(0); |
277 int lhs = lhs_inputs[l]; | 277 int lhs = lhs_inputs[l]; |
278 int rhs = rhs_inputs[r]; | 278 int rhs = rhs_inputs[r]; |
279 builder.LoadLiteral(Smi::FromInt(lhs)) | 279 builder.LoadLiteral(Smi::FromInt(lhs)) |
280 .StoreAccumulatorInRegister(reg) | 280 .StoreAccumulatorInRegister(reg) |
281 .LoadLiteral(Smi::FromInt(rhs)) | 281 .LoadLiteral(Smi::FromInt(rhs)) |
282 .BinaryOperation(kShiftOperators[o], reg, vector->GetIndex(slot)) | 282 .BinaryOperation(kShiftOperators[o], reg, vector->GetIndex(slot)) |
(...skipping 18 matching lines...) Expand all Loading... |
301 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { | 301 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { |
302 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { | 302 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { |
303 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { | 303 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { |
304 HandleAndZoneScope handles; | 304 HandleAndZoneScope handles; |
305 Isolate* isolate = handles.main_isolate(); | 305 Isolate* isolate = handles.main_isolate(); |
306 Factory* factory = isolate->factory(); | 306 Factory* factory = isolate->factory(); |
307 Zone zone(isolate->allocator()); | 307 Zone zone(isolate->allocator()); |
308 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); | 308 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); |
309 | 309 |
310 FeedbackVectorSpec feedback_spec(&zone); | 310 FeedbackVectorSpec feedback_spec(&zone); |
311 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); | 311 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); |
312 Handle<i::TypeFeedbackVector> vector = | 312 Handle<i::TypeFeedbackVector> vector = |
313 NewTypeFeedbackVector(isolate, &feedback_spec); | 313 NewTypeFeedbackVector(isolate, &feedback_spec); |
314 | 314 |
315 Register reg(0); | 315 Register reg(0); |
316 int lhs = lhs_inputs[l]; | 316 int lhs = lhs_inputs[l]; |
317 int rhs = rhs_inputs[r]; | 317 int rhs = rhs_inputs[r]; |
318 builder.LoadLiteral(Smi::FromInt(lhs)) | 318 builder.LoadLiteral(Smi::FromInt(lhs)) |
319 .StoreAccumulatorInRegister(reg) | 319 .StoreAccumulatorInRegister(reg) |
320 .LoadLiteral(Smi::FromInt(rhs)) | 320 .LoadLiteral(Smi::FromInt(rhs)) |
321 .BinaryOperation(kArithmeticOperators[o], reg, | 321 .BinaryOperation(kArithmeticOperators[o], reg, |
(...skipping 20 matching lines...) Expand all Loading... |
342 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { | 342 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { |
343 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { | 343 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { |
344 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { | 344 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { |
345 HandleAndZoneScope handles; | 345 HandleAndZoneScope handles; |
346 Isolate* isolate = handles.main_isolate(); | 346 Isolate* isolate = handles.main_isolate(); |
347 Factory* factory = isolate->factory(); | 347 Factory* factory = isolate->factory(); |
348 Zone zone(isolate->allocator()); | 348 Zone zone(isolate->allocator()); |
349 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); | 349 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); |
350 | 350 |
351 FeedbackVectorSpec feedback_spec(&zone); | 351 FeedbackVectorSpec feedback_spec(&zone); |
352 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); | 352 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); |
353 Handle<i::TypeFeedbackVector> vector = | 353 Handle<i::TypeFeedbackVector> vector = |
354 NewTypeFeedbackVector(isolate, &feedback_spec); | 354 NewTypeFeedbackVector(isolate, &feedback_spec); |
355 | 355 |
356 Register reg(0); | 356 Register reg(0); |
357 double lhs = lhs_inputs[l]; | 357 double lhs = lhs_inputs[l]; |
358 double rhs = rhs_inputs[r]; | 358 double rhs = rhs_inputs[r]; |
359 builder.LoadLiteral(factory->NewNumber(lhs)) | 359 builder.LoadLiteral(factory->NewNumber(lhs)) |
360 .StoreAccumulatorInRegister(reg) | 360 .StoreAccumulatorInRegister(reg) |
361 .LoadLiteral(factory->NewNumber(rhs)) | 361 .LoadLiteral(factory->NewNumber(rhs)) |
362 .BinaryOperation(kArithmeticOperators[o], reg, | 362 .BinaryOperation(kArithmeticOperators[o], reg, |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 } | 456 } |
457 | 457 |
458 | 458 |
459 TEST(InterpreterParameter8) { | 459 TEST(InterpreterParameter8) { |
460 HandleAndZoneScope handles; | 460 HandleAndZoneScope handles; |
461 Isolate* isolate = handles.main_isolate(); | 461 Isolate* isolate = handles.main_isolate(); |
462 Zone zone(isolate->allocator()); | 462 Zone zone(isolate->allocator()); |
463 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 8, 0, 0); | 463 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 8, 0, 0); |
464 | 464 |
465 FeedbackVectorSpec feedback_spec(&zone); | 465 FeedbackVectorSpec feedback_spec(&zone); |
466 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); | 466 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); |
467 FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); | 467 FeedbackVectorSlot slot1 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
468 FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot(); | 468 FeedbackVectorSlot slot2 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
469 FeedbackVectorSlot slot3 = feedback_spec.AddGeneralSlot(); | 469 FeedbackVectorSlot slot3 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
470 FeedbackVectorSlot slot4 = feedback_spec.AddGeneralSlot(); | 470 FeedbackVectorSlot slot4 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
471 FeedbackVectorSlot slot5 = feedback_spec.AddGeneralSlot(); | 471 FeedbackVectorSlot slot5 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
472 FeedbackVectorSlot slot6 = feedback_spec.AddGeneralSlot(); | 472 FeedbackVectorSlot slot6 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
473 | 473 |
474 Handle<i::TypeFeedbackVector> vector = | 474 Handle<i::TypeFeedbackVector> vector = |
475 NewTypeFeedbackVector(isolate, &feedback_spec); | 475 NewTypeFeedbackVector(isolate, &feedback_spec); |
476 | 476 |
477 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) | 477 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) |
478 .BinaryOperation(Token::Value::ADD, builder.Parameter(1), | 478 .BinaryOperation(Token::Value::ADD, builder.Parameter(1), |
479 vector->GetIndex(slot)) | 479 vector->GetIndex(slot)) |
480 .BinaryOperation(Token::Value::ADD, builder.Parameter(2), | 480 .BinaryOperation(Token::Value::ADD, builder.Parameter(2), |
481 vector->GetIndex(slot1)) | 481 vector->GetIndex(slot1)) |
482 .BinaryOperation(Token::Value::ADD, builder.Parameter(3), | 482 .BinaryOperation(Token::Value::ADD, builder.Parameter(3), |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
625 isolate->factory()->NewHeapNumber(fmod(-3.1415, -1.4142)), | 625 isolate->factory()->NewHeapNumber(fmod(-3.1415, -1.4142)), |
626 BinaryOperationFeedback::kNumber}, | 626 BinaryOperationFeedback::kNumber}, |
627 {Token::Value::MOD, Handle<Smi>(Smi::FromInt(3), isolate), | 627 {Token::Value::MOD, Handle<Smi>(Smi::FromInt(3), isolate), |
628 isolate->factory()->NewStringFromAsciiChecked("-2"), | 628 isolate->factory()->NewStringFromAsciiChecked("-2"), |
629 Handle<Smi>(Smi::FromInt(1), isolate), BinaryOperationFeedback::kAny}}; | 629 Handle<Smi>(Smi::FromInt(1), isolate), BinaryOperationFeedback::kAny}}; |
630 | 630 |
631 for (const BinaryOpExpectation& test_case : kTestCases) { | 631 for (const BinaryOpExpectation& test_case : kTestCases) { |
632 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); | 632 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); |
633 | 633 |
634 i::FeedbackVectorSpec feedback_spec(&zone); | 634 i::FeedbackVectorSpec feedback_spec(&zone); |
635 i::FeedbackVectorSlot slot0 = feedback_spec.AddGeneralSlot(); | 635 i::FeedbackVectorSlot slot0 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
636 | 636 |
637 Handle<i::TypeFeedbackVector> vector = | 637 Handle<i::TypeFeedbackVector> vector = |
638 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 638 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
639 | 639 |
640 Register reg(0); | 640 Register reg(0); |
641 builder.LoadLiteral(test_case.arg1) | 641 builder.LoadLiteral(test_case.arg1) |
642 .StoreAccumulatorInRegister(reg) | 642 .StoreAccumulatorInRegister(reg) |
643 .LoadLiteral(test_case.arg2) | 643 .LoadLiteral(test_case.arg2) |
644 .BinaryOperation(test_case.op, reg, vector->GetIndex(slot0)) | 644 .BinaryOperation(test_case.op, reg, vector->GetIndex(slot0)) |
645 .Return(); | 645 .Return(); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 BinaryOperationFeedback::kSignedSmall}, | 729 BinaryOperationFeedback::kSignedSmall}, |
730 {Token::Value::SAR, isolate->factory()->NewHeapNumber(3.1415), 2, | 730 {Token::Value::SAR, isolate->factory()->NewHeapNumber(3.1415), 2, |
731 Handle<Smi>(Smi::FromInt(0), isolate), BinaryOperationFeedback::kNumber}, | 731 Handle<Smi>(Smi::FromInt(0), isolate), BinaryOperationFeedback::kNumber}, |
732 {Token::Value::SAR, isolate->factory()->NewStringFromAsciiChecked("2"), 1, | 732 {Token::Value::SAR, isolate->factory()->NewStringFromAsciiChecked("2"), 1, |
733 Handle<Smi>(Smi::FromInt(1), isolate), BinaryOperationFeedback::kAny}}; | 733 Handle<Smi>(Smi::FromInt(1), isolate), BinaryOperationFeedback::kAny}}; |
734 | 734 |
735 for (const BinaryOpExpectation& test_case : kTestCases) { | 735 for (const BinaryOpExpectation& test_case : kTestCases) { |
736 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); | 736 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); |
737 | 737 |
738 i::FeedbackVectorSpec feedback_spec(&zone); | 738 i::FeedbackVectorSpec feedback_spec(&zone); |
739 i::FeedbackVectorSlot slot0 = feedback_spec.AddGeneralSlot(); | 739 i::FeedbackVectorSlot slot0 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
740 | 740 |
741 Handle<i::TypeFeedbackVector> vector = | 741 Handle<i::TypeFeedbackVector> vector = |
742 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 742 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
743 | 743 |
744 Register reg(0); | 744 Register reg(0); |
745 builder.LoadLiteral(test_case.arg1) | 745 builder.LoadLiteral(test_case.arg1) |
746 .StoreAccumulatorInRegister(reg) | 746 .StoreAccumulatorInRegister(reg) |
747 .LoadLiteral(Smi::FromInt(test_case.arg2)) | 747 .LoadLiteral(Smi::FromInt(test_case.arg2)) |
748 .BinaryOperation(test_case.op, reg, vector->GetIndex(slot0)) | 748 .BinaryOperation(test_case.op, reg, vector->GetIndex(slot0)) |
749 .Return(); | 749 .Return(); |
(...skipping 29 matching lines...) Expand all Loading... |
779 Handle<HeapNumber> number_feedback_value; | 779 Handle<HeapNumber> number_feedback_value; |
780 Handle<Object> any_feedback_value; | 780 Handle<Object> any_feedback_value; |
781 }; | 781 }; |
782 TestCase const kTestCases[] = { | 782 TestCase const kTestCases[] = { |
783 {Token::Value::ADD, smi_one, smi_max, number, str}, | 783 {Token::Value::ADD, smi_one, smi_max, number, str}, |
784 {Token::Value::SUB, smi_one, smi_min, number, str}}; | 784 {Token::Value::SUB, smi_one, smi_min, number, str}}; |
785 for (TestCase const& test_case : kTestCases) { | 785 for (TestCase const& test_case : kTestCases) { |
786 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 4, 0, 0); | 786 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 4, 0, 0); |
787 | 787 |
788 i::FeedbackVectorSpec feedback_spec(&zone); | 788 i::FeedbackVectorSpec feedback_spec(&zone); |
789 i::FeedbackVectorSlot slot0 = feedback_spec.AddGeneralSlot(); | 789 i::FeedbackVectorSlot slot0 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
790 i::FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); | 790 i::FeedbackVectorSlot slot1 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
791 i::FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot(); | 791 i::FeedbackVectorSlot slot2 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
792 i::FeedbackVectorSlot slot3 = feedback_spec.AddGeneralSlot(); | 792 i::FeedbackVectorSlot slot3 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
793 | 793 |
794 Handle<i::TypeFeedbackVector> vector = | 794 Handle<i::TypeFeedbackVector> vector = |
795 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 795 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
796 | 796 |
797 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) | 797 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) |
798 .CountOperation(test_case.op, vector->GetIndex(slot0)) | 798 .CountOperation(test_case.op, vector->GetIndex(slot0)) |
799 .LoadAccumulatorWithRegister(builder.Parameter(1)) | 799 .LoadAccumulatorWithRegister(builder.Parameter(1)) |
800 .CountOperation(test_case.op, vector->GetIndex(slot1)) | 800 .CountOperation(test_case.op, vector->GetIndex(slot1)) |
801 .LoadAccumulatorWithRegister(builder.Parameter(2)) | 801 .LoadAccumulatorWithRegister(builder.Parameter(2)) |
802 .CountOperation(test_case.op, vector->GetIndex(slot2)) | 802 .CountOperation(test_case.op, vector->GetIndex(slot2)) |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
843 i::Isolate* isolate = handles.main_isolate(); | 843 i::Isolate* isolate = handles.main_isolate(); |
844 i::Zone zone(isolate->allocator()); | 844 i::Zone zone(isolate->allocator()); |
845 const Token::Value kBitwiseBinaryOperators[] = { | 845 const Token::Value kBitwiseBinaryOperators[] = { |
846 Token::Value::BIT_OR, Token::Value::BIT_XOR, Token::Value::BIT_AND, | 846 Token::Value::BIT_OR, Token::Value::BIT_XOR, Token::Value::BIT_AND, |
847 Token::Value::SHL, Token::Value::SHR, Token::Value::SAR}; | 847 Token::Value::SHL, Token::Value::SHR, Token::Value::SAR}; |
848 | 848 |
849 for (Token::Value op : kBitwiseBinaryOperators) { | 849 for (Token::Value op : kBitwiseBinaryOperators) { |
850 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 4, 0, 0); | 850 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 4, 0, 0); |
851 | 851 |
852 i::FeedbackVectorSpec feedback_spec(&zone); | 852 i::FeedbackVectorSpec feedback_spec(&zone); |
853 i::FeedbackVectorSlot slot0 = feedback_spec.AddGeneralSlot(); | 853 i::FeedbackVectorSlot slot0 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
854 i::FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); | 854 i::FeedbackVectorSlot slot1 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
855 i::FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot(); | 855 i::FeedbackVectorSlot slot2 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
856 | 856 |
857 Handle<i::TypeFeedbackVector> vector = | 857 Handle<i::TypeFeedbackVector> vector = |
858 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 858 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
859 | 859 |
860 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) | 860 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) |
861 .BinaryOperation(op, builder.Parameter(1), vector->GetIndex(slot0)) | 861 .BinaryOperation(op, builder.Parameter(1), vector->GetIndex(slot0)) |
862 .BinaryOperation(op, builder.Parameter(2), vector->GetIndex(slot1)) | 862 .BinaryOperation(op, builder.Parameter(2), vector->GetIndex(slot1)) |
863 .BinaryOperation(op, builder.Parameter(3), vector->GetIndex(slot2)) | 863 .BinaryOperation(op, builder.Parameter(3), vector->GetIndex(slot2)) |
864 .Return(); | 864 .Return(); |
865 | 865 |
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1385 } | 1385 } |
1386 | 1386 |
1387 | 1387 |
1388 TEST(InterpreterJumps) { | 1388 TEST(InterpreterJumps) { |
1389 HandleAndZoneScope handles; | 1389 HandleAndZoneScope handles; |
1390 Isolate* isolate = handles.main_isolate(); | 1390 Isolate* isolate = handles.main_isolate(); |
1391 Zone zone(isolate->allocator()); | 1391 Zone zone(isolate->allocator()); |
1392 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 2); | 1392 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 2); |
1393 | 1393 |
1394 FeedbackVectorSpec feedback_spec(&zone); | 1394 FeedbackVectorSpec feedback_spec(&zone); |
1395 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); | 1395 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1396 FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); | 1396 FeedbackVectorSlot slot1 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1397 FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot(); | 1397 FeedbackVectorSlot slot2 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1398 | 1398 |
1399 Handle<i::TypeFeedbackVector> vector = | 1399 Handle<i::TypeFeedbackVector> vector = |
1400 NewTypeFeedbackVector(isolate, &feedback_spec); | 1400 NewTypeFeedbackVector(isolate, &feedback_spec); |
1401 | 1401 |
1402 Register reg(0), scratch(1); | 1402 Register reg(0), scratch(1); |
1403 BytecodeLabel label[3]; | 1403 BytecodeLabel label[3]; |
1404 | 1404 |
1405 builder.LoadLiteral(Smi::FromInt(0)) | 1405 builder.LoadLiteral(Smi::FromInt(0)) |
1406 .StoreAccumulatorInRegister(reg) | 1406 .StoreAccumulatorInRegister(reg) |
1407 .Jump(&label[1]); | 1407 .Jump(&label[1]); |
(...skipping 16 matching lines...) Expand all Loading... |
1424 } | 1424 } |
1425 | 1425 |
1426 | 1426 |
1427 TEST(InterpreterConditionalJumps) { | 1427 TEST(InterpreterConditionalJumps) { |
1428 HandleAndZoneScope handles; | 1428 HandleAndZoneScope handles; |
1429 Isolate* isolate = handles.main_isolate(); | 1429 Isolate* isolate = handles.main_isolate(); |
1430 Zone zone(isolate->allocator()); | 1430 Zone zone(isolate->allocator()); |
1431 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 2); | 1431 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 2); |
1432 | 1432 |
1433 FeedbackVectorSpec feedback_spec(&zone); | 1433 FeedbackVectorSpec feedback_spec(&zone); |
1434 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); | 1434 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1435 FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); | 1435 FeedbackVectorSlot slot1 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1436 FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot(); | 1436 FeedbackVectorSlot slot2 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1437 FeedbackVectorSlot slot3 = feedback_spec.AddGeneralSlot(); | 1437 FeedbackVectorSlot slot3 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1438 FeedbackVectorSlot slot4 = feedback_spec.AddGeneralSlot(); | 1438 FeedbackVectorSlot slot4 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1439 | 1439 |
1440 Handle<i::TypeFeedbackVector> vector = | 1440 Handle<i::TypeFeedbackVector> vector = |
1441 NewTypeFeedbackVector(isolate, &feedback_spec); | 1441 NewTypeFeedbackVector(isolate, &feedback_spec); |
1442 | 1442 |
1443 Register reg(0), scratch(1); | 1443 Register reg(0), scratch(1); |
1444 BytecodeLabel label[2]; | 1444 BytecodeLabel label[2]; |
1445 BytecodeLabel done, done1; | 1445 BytecodeLabel done, done1; |
1446 | 1446 |
1447 builder.LoadLiteral(Smi::FromInt(0)) | 1447 builder.LoadLiteral(Smi::FromInt(0)) |
1448 .StoreAccumulatorInRegister(reg) | 1448 .StoreAccumulatorInRegister(reg) |
(...skipping 25 matching lines...) Expand all Loading... |
1474 } | 1474 } |
1475 | 1475 |
1476 TEST(InterpreterConditionalJumps2) { | 1476 TEST(InterpreterConditionalJumps2) { |
1477 // TODO(oth): Add tests for all conditional jumps near and far. | 1477 // TODO(oth): Add tests for all conditional jumps near and far. |
1478 HandleAndZoneScope handles; | 1478 HandleAndZoneScope handles; |
1479 Isolate* isolate = handles.main_isolate(); | 1479 Isolate* isolate = handles.main_isolate(); |
1480 Zone zone(isolate->allocator()); | 1480 Zone zone(isolate->allocator()); |
1481 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 2); | 1481 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 2); |
1482 | 1482 |
1483 FeedbackVectorSpec feedback_spec(&zone); | 1483 FeedbackVectorSpec feedback_spec(&zone); |
1484 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); | 1484 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1485 FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); | 1485 FeedbackVectorSlot slot1 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1486 FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot(); | 1486 FeedbackVectorSlot slot2 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1487 FeedbackVectorSlot slot3 = feedback_spec.AddGeneralSlot(); | 1487 FeedbackVectorSlot slot3 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1488 FeedbackVectorSlot slot4 = feedback_spec.AddGeneralSlot(); | 1488 FeedbackVectorSlot slot4 = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1489 | 1489 |
1490 Handle<i::TypeFeedbackVector> vector = | 1490 Handle<i::TypeFeedbackVector> vector = |
1491 NewTypeFeedbackVector(isolate, &feedback_spec); | 1491 NewTypeFeedbackVector(isolate, &feedback_spec); |
1492 | 1492 |
1493 Register reg(0), scratch(1); | 1493 Register reg(0), scratch(1); |
1494 BytecodeLabel label[2]; | 1494 BytecodeLabel label[2]; |
1495 BytecodeLabel done, done1; | 1495 BytecodeLabel done, done1; |
1496 | 1496 |
1497 builder.LoadLiteral(Smi::FromInt(0)) | 1497 builder.LoadLiteral(Smi::FromInt(0)) |
1498 .StoreAccumulatorInRegister(reg) | 1498 .StoreAccumulatorInRegister(reg) |
(...skipping 25 matching lines...) Expand all Loading... |
1524 } | 1524 } |
1525 | 1525 |
1526 TEST(InterpreterJumpConstantWith16BitOperand) { | 1526 TEST(InterpreterJumpConstantWith16BitOperand) { |
1527 HandleAndZoneScope handles; | 1527 HandleAndZoneScope handles; |
1528 Isolate* isolate = handles.main_isolate(); | 1528 Isolate* isolate = handles.main_isolate(); |
1529 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 257); | 1529 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 257); |
1530 | 1530 |
1531 Zone zone(isolate->allocator()); | 1531 Zone zone(isolate->allocator()); |
1532 | 1532 |
1533 FeedbackVectorSpec feedback_spec(&zone); | 1533 FeedbackVectorSpec feedback_spec(&zone); |
1534 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); | 1534 FeedbackVectorSlot slot = feedback_spec.AddInterpreterBinaryOpICSlot(); |
1535 Handle<i::TypeFeedbackVector> vector = | 1535 Handle<i::TypeFeedbackVector> vector = |
1536 NewTypeFeedbackVector(isolate, &feedback_spec); | 1536 NewTypeFeedbackVector(isolate, &feedback_spec); |
1537 | 1537 |
1538 Register reg(0), scratch(256); | 1538 Register reg(0), scratch(256); |
1539 BytecodeLabel done, fake; | 1539 BytecodeLabel done, fake; |
1540 | 1540 |
1541 builder.LoadLiteral(Smi::FromInt(0)); | 1541 builder.LoadLiteral(Smi::FromInt(0)); |
1542 builder.StoreAccumulatorInRegister(reg); | 1542 builder.StoreAccumulatorInRegister(reg); |
1543 // Consume all 8-bit operands | 1543 // Consume all 8-bit operands |
1544 for (int i = 1; i <= 256; i++) { | 1544 for (int i = 1; i <= 256; i++) { |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1670 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { | 1670 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { |
1671 Token::Value comparison = kComparisonTypes[c]; | 1671 Token::Value comparison = kComparisonTypes[c]; |
1672 for (size_t i = 0; i < arraysize(inputs); i++) { | 1672 for (size_t i = 0; i < arraysize(inputs); i++) { |
1673 for (size_t j = 0; j < arraysize(inputs); j++) { | 1673 for (size_t j = 0; j < arraysize(inputs); j++) { |
1674 HandleAndZoneScope handles; | 1674 HandleAndZoneScope handles; |
1675 Isolate* isolate = handles.main_isolate(); | 1675 Isolate* isolate = handles.main_isolate(); |
1676 Zone zone(isolate->allocator()); | 1676 Zone zone(isolate->allocator()); |
1677 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1); | 1677 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1); |
1678 | 1678 |
1679 FeedbackVectorSpec feedback_spec(&zone); | 1679 FeedbackVectorSpec feedback_spec(&zone); |
1680 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); | 1680 FeedbackVectorSlot slot = feedback_spec.AddInterpreterCompareICSlot(); |
1681 Handle<i::TypeFeedbackVector> vector = | 1681 Handle<i::TypeFeedbackVector> vector = |
1682 NewTypeFeedbackVector(isolate, &feedback_spec); | 1682 NewTypeFeedbackVector(isolate, &feedback_spec); |
1683 | 1683 |
1684 Register r0(0); | 1684 Register r0(0); |
1685 builder.LoadLiteral(Smi::FromInt(inputs[i])) | 1685 builder.LoadLiteral(Smi::FromInt(inputs[i])) |
1686 .StoreAccumulatorInRegister(r0) | 1686 .StoreAccumulatorInRegister(r0) |
1687 .LoadLiteral(Smi::FromInt(inputs[j])) | 1687 .LoadLiteral(Smi::FromInt(inputs[j])) |
1688 .CompareOperation(comparison, r0, vector->GetIndex(slot)) | 1688 .CompareOperation(comparison, r0, vector->GetIndex(slot)) |
1689 .Return(); | 1689 .Return(); |
1690 | 1690 |
(...skipping 26 matching lines...) Expand all Loading... |
1717 Token::Value comparison = kComparisonTypes[c]; | 1717 Token::Value comparison = kComparisonTypes[c]; |
1718 for (size_t i = 0; i < arraysize(inputs); i++) { | 1718 for (size_t i = 0; i < arraysize(inputs); i++) { |
1719 for (size_t j = 0; j < arraysize(inputs); j++) { | 1719 for (size_t j = 0; j < arraysize(inputs); j++) { |
1720 HandleAndZoneScope handles; | 1720 HandleAndZoneScope handles; |
1721 Isolate* isolate = handles.main_isolate(); | 1721 Isolate* isolate = handles.main_isolate(); |
1722 Factory* factory = isolate->factory(); | 1722 Factory* factory = isolate->factory(); |
1723 Zone zone(isolate->allocator()); | 1723 Zone zone(isolate->allocator()); |
1724 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1); | 1724 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1); |
1725 | 1725 |
1726 FeedbackVectorSpec feedback_spec(&zone); | 1726 FeedbackVectorSpec feedback_spec(&zone); |
1727 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); | 1727 FeedbackVectorSlot slot = feedback_spec.AddInterpreterCompareICSlot(); |
1728 Handle<i::TypeFeedbackVector> vector = | 1728 Handle<i::TypeFeedbackVector> vector = |
1729 NewTypeFeedbackVector(isolate, &feedback_spec); | 1729 NewTypeFeedbackVector(isolate, &feedback_spec); |
1730 | 1730 |
1731 Register r0(0); | 1731 Register r0(0); |
1732 builder.LoadLiteral(factory->NewHeapNumber(inputs[i])) | 1732 builder.LoadLiteral(factory->NewHeapNumber(inputs[i])) |
1733 .StoreAccumulatorInRegister(r0) | 1733 .StoreAccumulatorInRegister(r0) |
1734 .LoadLiteral(factory->NewHeapNumber(inputs[j])) | 1734 .LoadLiteral(factory->NewHeapNumber(inputs[j])) |
1735 .CompareOperation(comparison, r0, vector->GetIndex(slot)) | 1735 .CompareOperation(comparison, r0, vector->GetIndex(slot)) |
1736 .Return(); | 1736 .Return(); |
1737 | 1737 |
(...skipping 24 matching lines...) Expand all Loading... |
1762 | 1762 |
1763 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { | 1763 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { |
1764 Token::Value comparison = kComparisonTypes[c]; | 1764 Token::Value comparison = kComparisonTypes[c]; |
1765 for (size_t i = 0; i < arraysize(inputs); i++) { | 1765 for (size_t i = 0; i < arraysize(inputs); i++) { |
1766 for (size_t j = 0; j < arraysize(inputs); j++) { | 1766 for (size_t j = 0; j < arraysize(inputs); j++) { |
1767 CanonicalHandleScope canonical(isolate); | 1767 CanonicalHandleScope canonical(isolate); |
1768 const char* lhs = inputs[i].c_str(); | 1768 const char* lhs = inputs[i].c_str(); |
1769 const char* rhs = inputs[j].c_str(); | 1769 const char* rhs = inputs[j].c_str(); |
1770 | 1770 |
1771 FeedbackVectorSpec feedback_spec(&zone); | 1771 FeedbackVectorSpec feedback_spec(&zone); |
1772 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); | 1772 FeedbackVectorSlot slot = feedback_spec.AddInterpreterCompareICSlot(); |
1773 Handle<i::TypeFeedbackVector> vector = | 1773 Handle<i::TypeFeedbackVector> vector = |
1774 NewTypeFeedbackVector(isolate, &feedback_spec); | 1774 NewTypeFeedbackVector(isolate, &feedback_spec); |
1775 | 1775 |
1776 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1); | 1776 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1); |
1777 Register r0(0); | 1777 Register r0(0); |
1778 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs)) | 1778 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs)) |
1779 .StoreAccumulatorInRegister(r0) | 1779 .StoreAccumulatorInRegister(r0) |
1780 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs)) | 1780 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs)) |
1781 .CompareOperation(comparison, r0, vector->GetIndex(slot)) | 1781 .CompareOperation(comparison, r0, vector->GetIndex(slot)) |
1782 .Return(); | 1782 .Return(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1818 ConversionFlags::NO_FLAGS); | 1818 ConversionFlags::NO_FLAGS); |
1819 double rhs = StringToDouble(&unicode_cache, rhs_cstr, | 1819 double rhs = StringToDouble(&unicode_cache, rhs_cstr, |
1820 ConversionFlags::NO_FLAGS); | 1820 ConversionFlags::NO_FLAGS); |
1821 HandleAndZoneScope handles; | 1821 HandleAndZoneScope handles; |
1822 Isolate* isolate = handles.main_isolate(); | 1822 Isolate* isolate = handles.main_isolate(); |
1823 Factory* factory = isolate->factory(); | 1823 Factory* factory = isolate->factory(); |
1824 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1); | 1824 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1); |
1825 Zone zone(isolate->allocator()); | 1825 Zone zone(isolate->allocator()); |
1826 | 1826 |
1827 FeedbackVectorSpec feedback_spec(&zone); | 1827 FeedbackVectorSpec feedback_spec(&zone); |
1828 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); | 1828 FeedbackVectorSlot slot = feedback_spec.AddInterpreterCompareICSlot(); |
1829 Handle<i::TypeFeedbackVector> vector = | 1829 Handle<i::TypeFeedbackVector> vector = |
1830 NewTypeFeedbackVector(isolate, &feedback_spec); | 1830 NewTypeFeedbackVector(isolate, &feedback_spec); |
1831 | 1831 |
1832 Register r0(0); | 1832 Register r0(0); |
1833 if (pass == 0) { | 1833 if (pass == 0) { |
1834 // Comparison with HeapNumber on the lhs and String on the rhs | 1834 // Comparison with HeapNumber on the lhs and String on the rhs |
1835 builder.LoadLiteral(factory->NewNumber(lhs)) | 1835 builder.LoadLiteral(factory->NewNumber(lhs)) |
1836 .StoreAccumulatorInRegister(r0) | 1836 .StoreAccumulatorInRegister(r0) |
1837 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs_cstr)) | 1837 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs_cstr)) |
1838 .CompareOperation(comparison, r0, vector->GetIndex(slot)) | 1838 .CompareOperation(comparison, r0, vector->GetIndex(slot)) |
(...skipping 2966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4805 auto callable = tester.GetCallable<>(); | 4805 auto callable = tester.GetCallable<>(); |
4806 | 4806 |
4807 Handle<i::Object> return_value = callable().ToHandleChecked(); | 4807 Handle<i::Object> return_value = callable().ToHandleChecked(); |
4808 CHECK(return_value->SameValue(*tests[i].second)); | 4808 CHECK(return_value->SameValue(*tests[i].second)); |
4809 } | 4809 } |
4810 } | 4810 } |
4811 | 4811 |
4812 } // namespace interpreter | 4812 } // namespace interpreter |
4813 } // namespace internal | 4813 } // namespace internal |
4814 } // namespace v8 | 4814 } // namespace v8 |
OLD | NEW |