5 #ifndef V8_COMPILER_BACKEND_INSTRUCTION_SELECTOR_IMPL_H_ 6 #define V8_COMPILER_BACKEND_INSTRUCTION_SELECTOR_IMPL_H_ 8 #include "src/compiler/backend/instruction-selector.h" 9 #include "src/compiler/backend/instruction.h" 10 #include "src/compiler/common-operator.h" 11 #include "src/compiler/linkage.h" 12 #include "src/compiler/schedule.h" 13 #include "src/macro-assembler.h" 26 return l.order < r.order;
35 min_value_(min_value),
36 max_value_(min_value),
37 default_branch_(default_branch) {
38 if (cases.size() != 0) {
39 DCHECK_LE(min_value, max_value);
43 1u + bit_cast<
uint32_t>(max_value) - bit_cast<uint32_t>(min_value);
50 std::vector<CaseInfo> CasesSortedByOriginalOrder()
const {
51 std::vector<CaseInfo> result(cases_.begin(), cases_.end());
52 std::stable_sort(result.begin(), result.end());
55 std::vector<CaseInfo> CasesSortedByValue()
const {
56 std::vector<CaseInfo> result(cases_.begin(), cases_.end());
57 std::stable_sort(result.begin(), result.end(),
62 int32_t min_value()
const {
return min_value_; }
63 int32_t max_value()
const {
return max_value_; }
64 size_t value_range()
const {
return value_range_; }
65 size_t case_count()
const {
return cases_.size(); }
66 BasicBlock* default_branch()
const {
return default_branch_; }
81 : selector_(selector) {}
101 reg.code(), GetVReg(node)));
104 template <
typename FPRegType>
108 reg.code(), GetVReg(node)));
112 return DefineAsConstant(node, ToConstant(node));
116 selector()->MarkAsDefined(node);
117 int virtual_register = GetVReg(node);
118 sequence()->AddConstant(virtual_register, constant);
123 return Define(node, ToUnallocatedOperand(location, GetVReg(node)));
130 ToDualLocationUnallocatedOperand(
131 primary_location, secondary_location, GetVReg(node)));
136 UnallocatedOperand::USED_AT_START,
142 UnallocatedOperand::USED_AT_END,
148 UnallocatedOperand::USED_AT_START,
154 UnallocatedOperand::REGISTER_OR_SLOT_OR_CONSTANT,
155 UnallocatedOperand::USED_AT_START, GetVReg(node)));
160 UnallocatedOperand::REGISTER_OR_SLOT_OR_CONSTANT,
166 UnallocatedOperand::USED_AT_START,
191 reg.code(), GetVReg(node)));
194 template <
typename FPRegType>
197 reg.code(), GetVReg(node)));
201 MachineRepresentation rep = InstructionSequence::DefaultRepresentation();
202 if (location.IsRegister()) {
204 location.AsRegister());
207 location.GetLocation());
212 return sequence()->AddImmediate(
Constant(immediate));
216 return sequence()->AddImmediate(ToConstant(node));
220 return sequence()->AddImmediate(ToNegatedConstant(node));
224 return Use(node, ToUnallocatedOperand(location, GetVReg(node)));
232 UnallocatedOperand::cast(TempLocation(from_location));
233 selector_->Emit(kArchNop, casted_from_operand);
234 return ToUnallocatedOperand(to_location,
235 casted_from_operand.virtual_register());
240 UnallocatedOperand::USED_AT_START,
241 sequence()->NextVirtualRegister());
244 int AllocateVirtualRegister() {
return sequence()->NextVirtualRegister(); }
256 UnallocatedOperand::USED_AT_START, vreg);
261 UnallocatedOperand::MUST_HAVE_REGISTER,
262 UnallocatedOperand::USED_AT_START, sequence()->NextVirtualRegister());
263 sequence()->MarkAsRepresentation(MachineRepresentation::kFloat64,
264 op.virtual_register());
270 UnallocatedOperand::MUST_HAVE_REGISTER,
271 UnallocatedOperand::USED_AT_START, sequence()->NextVirtualRegister());
272 sequence()->MarkAsRepresentation(MachineRepresentation::kSimd128,
273 op.virtual_register());
279 InstructionOperand::kInvalidVirtualRegister);
283 return sequence()->AddImmediate(
Constant(imm));
287 return ToUnallocatedOperand(location, sequence()->NextVirtualRegister());
291 return sequence()->AddImmediate(
292 Constant(RpoNumber::FromInt(block->rpo_number())));
298 Zone* zone()
const {
return selector()->instruction_zone(); }
301 int GetVReg(
Node* node)
const {
return selector_->GetVirtualRegister(node); }
304 switch (node->opcode()) {
305 case IrOpcode::kInt32Constant:
306 return Constant(OpParameter<int32_t>(node->op()));
307 case IrOpcode::kInt64Constant:
308 return Constant(OpParameter<int64_t>(node->op()));
309 case IrOpcode::kFloat32Constant:
310 return Constant(OpParameter<float>(node->op()));
311 case IrOpcode::kRelocatableInt32Constant:
312 case IrOpcode::kRelocatableInt64Constant:
313 return Constant(OpParameter<RelocatablePtrConstantInfo>(node->op()));
314 case IrOpcode::kFloat64Constant:
315 case IrOpcode::kNumberConstant:
316 return Constant(OpParameter<double>(node->op()));
317 case IrOpcode::kExternalConstant:
318 return Constant(OpParameter<ExternalReference>(node->op()));
319 case IrOpcode::kComment: {
322 using ptrsize_int_t =
323 std::conditional<kPointerSize == 8, int64_t, int32_t>::type;
324 return Constant(reinterpret_cast<ptrsize_int_t>(
325 OpParameter<const char*>(node->op())));
327 case IrOpcode::kHeapConstant:
328 return Constant(HeapConstantOf(node->op()));
329 case IrOpcode::kDelayedStringConstant:
330 return Constant(StringConstantBaseOf(node->op()));
331 case IrOpcode::kDeadValue: {
332 switch (DeadValueRepresentationOf(node->op())) {
333 case MachineRepresentation::kBit:
334 case MachineRepresentation::kWord32:
335 case MachineRepresentation::kTagged:
336 case MachineRepresentation::kTaggedSigned:
337 case MachineRepresentation::kTaggedPointer:
338 return Constant(static_cast<int32_t>(0));
339 case MachineRepresentation::kFloat64:
340 return Constant(static_cast<double>(0));
341 case MachineRepresentation::kFloat32:
342 return Constant(static_cast<float>(0));
355 switch (node->opcode()) {
356 case IrOpcode::kInt32Constant:
357 return Constant(-OpParameter<int32_t>(node->op()));
358 case IrOpcode::kInt64Constant:
359 return Constant(-OpParameter<int64_t>(node->op()));
367 DCHECK_NOT_NULL(node);
368 DCHECK_EQ(operand.virtual_register(), GetVReg(node));
369 selector()->MarkAsDefined(node);
374 DCHECK_NOT_NULL(node);
375 DCHECK_EQ(operand.virtual_register(), GetVReg(node));
376 selector()->MarkAsUsed(node);
382 int virtual_register) {
385 DCHECK(primary_location.IsRegister() &&
386 secondary_location.IsCalleeFrameSlot());
387 int reg_id = primary_location.AsRegister();
388 int slot_id = secondary_location.AsCalleeFrameSlot();
393 int virtual_register) {
394 if (location.IsAnyRegister()) {
399 if (location.IsCallerFrameSlot()) {
402 location.AsCallerFrameSlot(), virtual_register);
404 if (location.IsCalleeFrameSlot()) {
407 location.AsCalleeFrameSlot(), virtual_register);
410 if (IsFloatingPoint(location.GetType().representation())) {
412 location.AsRegister(), virtual_register);
415 location.AsRegister(), virtual_register);
425 #endif // V8_COMPILER_BACKEND_INSTRUCTION_SELECTOR_IMPL_H_