| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/factory.h" | 7 #include "src/factory.h" |
| 8 #include "src/interpreter/bytecode-label.h" | 8 #include "src/interpreter/bytecode-label.h" |
| 9 #include "src/interpreter/bytecode-peephole-optimizer.h" | 9 #include "src/interpreter/bytecode-peephole-optimizer.h" |
| 10 #include "src/objects-inl.h" | 10 #include "src/objects-inl.h" |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 {Bytecode::kBitwiseAnd, Bytecode::kBitwiseAndSmi}, | 451 {Bytecode::kBitwiseAnd, Bytecode::kBitwiseAndSmi}, |
| 452 {Bytecode::kBitwiseOr, Bytecode::kBitwiseOrSmi}, | 452 {Bytecode::kBitwiseOr, Bytecode::kBitwiseOrSmi}, |
| 453 {Bytecode::kShiftLeft, Bytecode::kShiftLeftSmi}, | 453 {Bytecode::kShiftLeft, Bytecode::kShiftLeftSmi}, |
| 454 {Bytecode::kShiftRight, Bytecode::kShiftRightSmi}}; | 454 {Bytecode::kShiftRight, Bytecode::kShiftRightSmi}}; |
| 455 | 455 |
| 456 for (auto operator_replacement : operator_replacement_pairs) { | 456 for (auto operator_replacement : operator_replacement_pairs) { |
| 457 uint32_t imm_operand = 17; | 457 uint32_t imm_operand = 17; |
| 458 BytecodeNode first(Bytecode::kLdaSmi, imm_operand); | 458 BytecodeNode first(Bytecode::kLdaSmi, imm_operand); |
| 459 first.source_info().Clone({3, true}); | 459 first.source_info().Clone({3, true}); |
| 460 uint32_t reg_operand = Register(0).ToOperand(); | 460 uint32_t reg_operand = Register(0).ToOperand(); |
| 461 BytecodeNode second(operator_replacement[0], reg_operand, 1); | 461 uint32_t idx_operand = 1; |
| 462 BytecodeNode second(operator_replacement[0], reg_operand, idx_operand); |
| 462 optimizer()->Write(&first); | 463 optimizer()->Write(&first); |
| 463 optimizer()->Write(&second); | 464 optimizer()->Write(&second); |
| 464 Flush(); | 465 Flush(); |
| 465 CHECK_EQ(write_count(), 1); | 466 CHECK_EQ(write_count(), 1); |
| 466 CHECK_EQ(last_written().bytecode(), operator_replacement[1]); | 467 CHECK_EQ(last_written().bytecode(), operator_replacement[1]); |
| 467 CHECK_EQ(last_written().operand_count(), 2); | 468 CHECK_EQ(last_written().operand_count(), 3); |
| 468 CHECK_EQ(last_written().operand(0), imm_operand); | 469 CHECK_EQ(last_written().operand(0), imm_operand); |
| 469 CHECK_EQ(last_written().operand(1), reg_operand); | 470 CHECK_EQ(last_written().operand(1), reg_operand); |
| 471 CHECK_EQ(last_written().operand(2), idx_operand); |
| 470 CHECK_EQ(last_written().source_info(), first.source_info()); | 472 CHECK_EQ(last_written().source_info(), first.source_info()); |
| 471 Reset(); | 473 Reset(); |
| 472 } | 474 } |
| 473 } | 475 } |
| 474 | 476 |
| 475 TEST_F(BytecodePeepholeOptimizerTest, NotMergingLdaSmiWithBinaryOp) { | 477 TEST_F(BytecodePeepholeOptimizerTest, NotMergingLdaSmiWithBinaryOp) { |
| 476 Bytecode operator_replacement_pairs[][2] = { | 478 Bytecode operator_replacement_pairs[][2] = { |
| 477 {Bytecode::kAdd, Bytecode::kAddSmi}, | 479 {Bytecode::kAdd, Bytecode::kAddSmi}, |
| 478 {Bytecode::kSub, Bytecode::kSubSmi}, | 480 {Bytecode::kSub, Bytecode::kSubSmi}, |
| 479 {Bytecode::kBitwiseAnd, Bytecode::kBitwiseAndSmi}, | 481 {Bytecode::kBitwiseAnd, Bytecode::kBitwiseAndSmi}, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 502 {Bytecode::kAdd, Bytecode::kAddSmi}, | 504 {Bytecode::kAdd, Bytecode::kAddSmi}, |
| 503 {Bytecode::kSub, Bytecode::kSubSmi}, | 505 {Bytecode::kSub, Bytecode::kSubSmi}, |
| 504 {Bytecode::kBitwiseAnd, Bytecode::kBitwiseAndSmi}, | 506 {Bytecode::kBitwiseAnd, Bytecode::kBitwiseAndSmi}, |
| 505 {Bytecode::kBitwiseOr, Bytecode::kBitwiseOrSmi}, | 507 {Bytecode::kBitwiseOr, Bytecode::kBitwiseOrSmi}, |
| 506 {Bytecode::kShiftLeft, Bytecode::kShiftLeftSmi}, | 508 {Bytecode::kShiftLeft, Bytecode::kShiftLeftSmi}, |
| 507 {Bytecode::kShiftRight, Bytecode::kShiftRightSmi}}; | 509 {Bytecode::kShiftRight, Bytecode::kShiftRightSmi}}; |
| 508 | 510 |
| 509 for (auto operator_replacement : operator_replacement_pairs) { | 511 for (auto operator_replacement : operator_replacement_pairs) { |
| 510 BytecodeNode first(Bytecode::kLdaZero); | 512 BytecodeNode first(Bytecode::kLdaZero); |
| 511 uint32_t reg_operand = Register(0).ToOperand(); | 513 uint32_t reg_operand = Register(0).ToOperand(); |
| 512 BytecodeNode second(operator_replacement[0], reg_operand, 1); | 514 uint32_t idx_operand = 1; |
| 515 BytecodeNode second(operator_replacement[0], reg_operand, idx_operand); |
| 513 optimizer()->Write(&first); | 516 optimizer()->Write(&first); |
| 514 optimizer()->Write(&second); | 517 optimizer()->Write(&second); |
| 515 Flush(); | 518 Flush(); |
| 516 CHECK_EQ(write_count(), 1); | 519 CHECK_EQ(write_count(), 1); |
| 517 CHECK_EQ(last_written().bytecode(), operator_replacement[1]); | 520 CHECK_EQ(last_written().bytecode(), operator_replacement[1]); |
| 518 CHECK_EQ(last_written().operand_count(), 2); | 521 CHECK_EQ(last_written().operand_count(), 3); |
| 519 CHECK_EQ(last_written().operand(0), 0); | 522 CHECK_EQ(last_written().operand(0), 0); |
| 520 CHECK_EQ(last_written().operand(1), reg_operand); | 523 CHECK_EQ(last_written().operand(1), reg_operand); |
| 524 CHECK_EQ(last_written().operand(2), idx_operand); |
| 521 Reset(); | 525 Reset(); |
| 522 } | 526 } |
| 523 } | 527 } |
| 524 | 528 |
| 525 } // namespace interpreter | 529 } // namespace interpreter |
| 526 } // namespace internal | 530 } // namespace internal |
| 527 } // namespace v8 | 531 } // namespace v8 |
| OLD | NEW |