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/interpreter/bytecode-register-optimizer.h" | 5 #include "src/interpreter/bytecode-register-optimizer.h" |
6 | 6 |
7 namespace v8 { | 7 namespace v8 { |
8 namespace internal { | 8 namespace internal { |
9 namespace interpreter { | 9 namespace interpreter { |
10 | 10 |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 void BytecodeRegisterOptimizer::PrepareRegisterOperands( | 497 void BytecodeRegisterOptimizer::PrepareRegisterOperands( |
498 BytecodeNode* const node) { | 498 BytecodeNode* const node) { |
499 // | 499 // |
500 // For each input operand, get a materialized equivalent if it is | 500 // For each input operand, get a materialized equivalent if it is |
501 // just a single register, otherwise materialize register range. | 501 // just a single register, otherwise materialize register range. |
502 // Update operand_scale if necessary. | 502 // Update operand_scale if necessary. |
503 // | 503 // |
504 // For each output register about to be clobbered, materialize an | 504 // For each output register about to be clobbered, materialize an |
505 // equivalent if it exists. Put each register in it's own equivalence set. | 505 // equivalent if it exists. Put each register in it's own equivalence set. |
506 // | 506 // |
507 int register_operand_bitmap = | 507 const uint32_t* operands = node->operands(); |
508 Bytecodes::GetRegisterOperandBitmap(node->bytecode()); | 508 int operand_count = node->operand_count(); |
509 const OperandType* operand_types = | 509 const OperandType* operand_types = |
510 Bytecodes::GetOperandTypes(node->bytecode()); | 510 Bytecodes::GetOperandTypes(node->bytecode()); |
511 uint32_t* operands = node->operands(); | 511 for (int i = 0; i < operand_count; ++i) { |
512 for (int i = 0; register_operand_bitmap != 0; | 512 int count; |
513 ++i, register_operand_bitmap >>= 1) { | 513 // operand_types is terminated by OperandType::kNone so this does not |
514 if ((register_operand_bitmap & 1) == 0) { | 514 // go out of bounds. |
515 continue; | |
516 } | |
517 OperandType operand_type = operand_types[i]; | |
518 int count = 0; | |
519 if (operand_types[i + 1] == OperandType::kRegCount) { | 515 if (operand_types[i + 1] == OperandType::kRegCount) { |
520 count = static_cast<int>(operands[i + 1]); | 516 count = static_cast<int>(operands[i + 1]); |
521 if (count == 0) { | |
522 continue; | |
523 } | |
524 } else { | 517 } else { |
525 count = Bytecodes::GetNumberOfRegistersRepresentedBy(operand_type); | 518 count = Bytecodes::GetNumberOfRegistersRepresentedBy(operand_types[i]); |
| 519 } |
| 520 |
| 521 if (count == 0) { |
| 522 continue; |
526 } | 523 } |
527 | 524 |
528 Register reg = Register::FromOperand(static_cast<int32_t>(operands[i])); | 525 Register reg = Register::FromOperand(static_cast<int32_t>(operands[i])); |
529 if (Bytecodes::IsRegisterInputOperandType(operand_type)) { | 526 if (Bytecodes::IsRegisterInputOperandType(operand_types[i])) { |
530 if (count == 1) { | 527 if (count == 1) { |
531 PrepareRegisterInputOperand(node, reg, i); | 528 PrepareRegisterInputOperand(node, reg, i); |
532 } else if (count > 1) { | 529 } else if (count > 1) { |
533 PrepareRegisterRangeInputOperand(reg, count); | 530 PrepareRegisterRangeInputOperand(reg, count); |
534 } | 531 } |
535 } else if (Bytecodes::IsRegisterOutputOperandType(operand_type)) { | 532 } else if (Bytecodes::IsRegisterOutputOperandType(operand_types[i])) { |
536 PrepareRegisterRangeOutputOperand(reg, count); | 533 PrepareRegisterRangeOutputOperand(reg, count); |
537 } | 534 } |
538 } | 535 } |
539 } | 536 } |
540 | 537 |
541 void BytecodeRegisterOptimizer::PrepareAccumulator(BytecodeNode* const node) { | 538 void BytecodeRegisterOptimizer::PrepareAccumulator(BytecodeNode* const node) { |
542 // Materialize the accumulator if it is read by the bytecode. The | 539 // Materialize the accumulator if it is read by the bytecode. The |
543 // accumulator is special and no other register can be materialized | 540 // accumulator is special and no other register can be materialized |
544 // in it's place. | 541 // in it's place. |
545 if (Bytecodes::ReadsAccumulator(node->bytecode()) && | 542 if (Bytecodes::ReadsAccumulator(node->bytecode()) && |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 if (info->materialized()) { | 618 if (info->materialized()) { |
622 CreateMaterializedEquivalent(info); | 619 CreateMaterializedEquivalent(info); |
623 } | 620 } |
624 info->MoveToNewEquivalenceSet(kInvalidEquivalenceId, false); | 621 info->MoveToNewEquivalenceSet(kInvalidEquivalenceId, false); |
625 } | 622 } |
626 } | 623 } |
627 | 624 |
628 } // namespace interpreter | 625 } // namespace interpreter |
629 } // namespace internal | 626 } // namespace internal |
630 } // namespace v8 | 627 } // namespace v8 |
OLD | NEW |