| 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/compiler/bytecode-analysis.h" | 5 #include "src/compiler/bytecode-analysis.h" |
| 6 | 6 |
| 7 #include "src/interpreter/bytecode-array-iterator.h" | 7 #include "src/interpreter/bytecode-array-iterator.h" |
| 8 #include "src/interpreter/bytecode-array-random-iterator.h" | 8 #include "src/interpreter/bytecode-array-random-iterator.h" |
| 9 #include "src/objects-inl.h" | 9 #include "src/objects-inl.h" |
| 10 | 10 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 BitVector(parameter_count + register_count, zone)) {} | 21 BitVector(parameter_count + register_count, zone)) {} |
| 22 | 22 |
| 23 void BytecodeLoopAssignments::Add(interpreter::Register r) { | 23 void BytecodeLoopAssignments::Add(interpreter::Register r) { |
| 24 if (r.is_parameter()) { | 24 if (r.is_parameter()) { |
| 25 bit_vector_->Add(r.ToParameterIndex(parameter_count_)); | 25 bit_vector_->Add(r.ToParameterIndex(parameter_count_)); |
| 26 } else { | 26 } else { |
| 27 bit_vector_->Add(parameter_count_ + r.index()); | 27 bit_vector_->Add(parameter_count_ + r.index()); |
| 28 } | 28 } |
| 29 } | 29 } |
| 30 | 30 |
| 31 void BytecodeLoopAssignments::AddPair(interpreter::Register r) { | 31 void BytecodeLoopAssignments::AddList(interpreter::Register r, uint32_t count) { |
| 32 if (r.is_parameter()) { | 32 if (r.is_parameter()) { |
| 33 DCHECK(interpreter::Register(r.index() + 1).is_parameter()); | 33 for (uint32_t i = 0; i < count; i++) { |
| 34 bit_vector_->Add(r.ToParameterIndex(parameter_count_)); | 34 DCHECK(interpreter::Register(r.index() + i).is_parameter()); |
| 35 bit_vector_->Add(r.ToParameterIndex(parameter_count_) + 1); | 35 bit_vector_->Add(r.ToParameterIndex(parameter_count_) + i); |
| 36 } |
| 36 } else { | 37 } else { |
| 37 DCHECK(!interpreter::Register(r.index() + 1).is_parameter()); | 38 for (uint32_t i = 0; i < count; i++) { |
| 38 bit_vector_->Add(parameter_count_ + r.index()); | 39 DCHECK(!interpreter::Register(r.index() + i).is_parameter()); |
| 39 bit_vector_->Add(parameter_count_ + r.index() + 1); | 40 bit_vector_->Add(parameter_count_ + r.index() + i); |
| 41 } |
| 40 } | 42 } |
| 41 } | 43 } |
| 42 | 44 |
| 43 void BytecodeLoopAssignments::AddTriple(interpreter::Register r) { | |
| 44 if (r.is_parameter()) { | |
| 45 DCHECK(interpreter::Register(r.index() + 1).is_parameter()); | |
| 46 DCHECK(interpreter::Register(r.index() + 2).is_parameter()); | |
| 47 bit_vector_->Add(r.ToParameterIndex(parameter_count_)); | |
| 48 bit_vector_->Add(r.ToParameterIndex(parameter_count_) + 1); | |
| 49 bit_vector_->Add(r.ToParameterIndex(parameter_count_) + 2); | |
| 50 } else { | |
| 51 DCHECK(!interpreter::Register(r.index() + 1).is_parameter()); | |
| 52 DCHECK(!interpreter::Register(r.index() + 2).is_parameter()); | |
| 53 bit_vector_->Add(parameter_count_ + r.index()); | |
| 54 bit_vector_->Add(parameter_count_ + r.index() + 1); | |
| 55 bit_vector_->Add(parameter_count_ + r.index() + 2); | |
| 56 } | |
| 57 } | |
| 58 | |
| 59 void BytecodeLoopAssignments::AddAll() { bit_vector_->AddAll(); } | 45 void BytecodeLoopAssignments::AddAll() { bit_vector_->AddAll(); } |
| 60 | 46 |
| 61 void BytecodeLoopAssignments::Union(const BytecodeLoopAssignments& other) { | 47 void BytecodeLoopAssignments::Union(const BytecodeLoopAssignments& other) { |
| 62 bit_vector_->Union(*other.bit_vector_); | 48 bit_vector_->Union(*other.bit_vector_); |
| 63 } | 49 } |
| 64 | 50 |
| 65 bool BytecodeLoopAssignments::ContainsParameter(int index) const { | 51 bool BytecodeLoopAssignments::ContainsParameter(int index) const { |
| 66 DCHECK_GE(index, 0); | 52 DCHECK_GE(index, 0); |
| 67 DCHECK_LT(index, parameter_count()); | 53 DCHECK_LT(index, parameter_count()); |
| 68 return bit_vector_->Contains(index); | 54 return bit_vector_->Contains(index); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 } | 91 } |
| 106 for (int i = 0; i < num_operands; ++i) { | 92 for (int i = 0; i < num_operands; ++i) { |
| 107 switch (operand_types[i]) { | 93 switch (operand_types[i]) { |
| 108 case OperandType::kRegOut: { | 94 case OperandType::kRegOut: { |
| 109 interpreter::Register r = accessor.GetRegisterOperand(i); | 95 interpreter::Register r = accessor.GetRegisterOperand(i); |
| 110 if (!r.is_parameter()) { | 96 if (!r.is_parameter()) { |
| 111 in_liveness.MarkRegisterDead(r.index()); | 97 in_liveness.MarkRegisterDead(r.index()); |
| 112 } | 98 } |
| 113 break; | 99 break; |
| 114 } | 100 } |
| 101 case OperandType::kRegOutList: { |
| 102 interpreter::Register r = accessor.GetRegisterOperand(i++); |
| 103 uint32_t reg_count = accessor.GetRegisterCountOperand(i); |
| 104 if (!r.is_parameter()) { |
| 105 for (uint32_t j = 0; j < reg_count; ++j) { |
| 106 DCHECK(!interpreter::Register(r.index() + j).is_parameter()); |
| 107 in_liveness.MarkRegisterDead(r.index() + j); |
| 108 } |
| 109 } |
| 110 break; |
| 111 } |
| 115 case OperandType::kRegOutPair: { | 112 case OperandType::kRegOutPair: { |
| 116 interpreter::Register r = accessor.GetRegisterOperand(i); | 113 interpreter::Register r = accessor.GetRegisterOperand(i); |
| 117 if (!r.is_parameter()) { | 114 if (!r.is_parameter()) { |
| 118 DCHECK(!interpreter::Register(r.index() + 1).is_parameter()); | 115 DCHECK(!interpreter::Register(r.index() + 1).is_parameter()); |
| 119 in_liveness.MarkRegisterDead(r.index()); | 116 in_liveness.MarkRegisterDead(r.index()); |
| 120 in_liveness.MarkRegisterDead(r.index() + 1); | 117 in_liveness.MarkRegisterDead(r.index() + 1); |
| 121 } | 118 } |
| 122 break; | 119 break; |
| 123 } | 120 } |
| 124 case OperandType::kRegOutTriple: { | 121 case OperandType::kRegOutTriple: { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 const BytecodeArrayAccessor& accessor) { | 217 const BytecodeArrayAccessor& accessor) { |
| 221 int num_operands = Bytecodes::NumberOfOperands(bytecode); | 218 int num_operands = Bytecodes::NumberOfOperands(bytecode); |
| 222 const OperandType* operand_types = Bytecodes::GetOperandTypes(bytecode); | 219 const OperandType* operand_types = Bytecodes::GetOperandTypes(bytecode); |
| 223 | 220 |
| 224 for (int i = 0; i < num_operands; ++i) { | 221 for (int i = 0; i < num_operands; ++i) { |
| 225 switch (operand_types[i]) { | 222 switch (operand_types[i]) { |
| 226 case OperandType::kRegOut: { | 223 case OperandType::kRegOut: { |
| 227 assignments.Add(accessor.GetRegisterOperand(i)); | 224 assignments.Add(accessor.GetRegisterOperand(i)); |
| 228 break; | 225 break; |
| 229 } | 226 } |
| 227 case OperandType::kRegOutList: { |
| 228 interpreter::Register r = accessor.GetRegisterOperand(i++); |
| 229 uint32_t reg_count = accessor.GetRegisterCountOperand(i); |
| 230 assignments.AddList(r, reg_count); |
| 231 break; |
| 232 } |
| 230 case OperandType::kRegOutPair: { | 233 case OperandType::kRegOutPair: { |
| 231 assignments.AddPair(accessor.GetRegisterOperand(i)); | 234 assignments.AddList(accessor.GetRegisterOperand(i), 2); |
| 232 break; | 235 break; |
| 233 } | 236 } |
| 234 case OperandType::kRegOutTriple: { | 237 case OperandType::kRegOutTriple: { |
| 235 assignments.AddTriple(accessor.GetRegisterOperand(i)); | 238 assignments.AddList(accessor.GetRegisterOperand(i), 3); |
| 236 break; | 239 break; |
| 237 } | 240 } |
| 238 default: | 241 default: |
| 239 DCHECK(!Bytecodes::IsRegisterOutputOperandType(operand_types[i])); | 242 DCHECK(!Bytecodes::IsRegisterOutputOperandType(operand_types[i])); |
| 240 break; | 243 break; |
| 241 } | 244 } |
| 242 } | 245 } |
| 243 } | 246 } |
| 244 | 247 |
| 245 } // namespace | 248 } // namespace |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 } | 622 } |
| 620 } | 623 } |
| 621 | 624 |
| 622 return invalid_offset == -1; | 625 return invalid_offset == -1; |
| 623 } | 626 } |
| 624 #endif | 627 #endif |
| 625 | 628 |
| 626 } // namespace compiler | 629 } // namespace compiler |
| 627 } // namespace internal | 630 } // namespace internal |
| 628 } // namespace v8 | 631 } // namespace v8 |
| OLD | NEW |