1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/instruction-selector.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <limits>
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/adapters.h"
10c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/compiler/compiler-source-position-table.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/instruction-selector-impl.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/node-matchers.h"
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/pipeline.h"
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/schedule.h"
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/state-values-utils.h"
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/deoptimizer.h"
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochInstructionSelector::InstructionSelector(
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Zone* zone, size_t node_count, Linkage* linkage,
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionSequence* sequence, Schedule* schedule,
25109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SourcePositionTable* source_positions, Frame* frame,
26f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    SourcePositionMode source_position_mode, Features features,
27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    EnableScheduling enable_scheduling,
28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    EnableSerialization enable_serialization)
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    : zone_(zone),
30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      linkage_(linkage),
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      sequence_(sequence),
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      source_positions_(source_positions),
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      source_position_mode_(source_position_mode),
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      features_(features),
35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      schedule_(schedule),
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      current_block_(nullptr),
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      instructions_(zone),
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      defined_(node_count, false, zone),
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      used_(node_count, false, zone),
40109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      effect_level_(node_count, 0, zone),
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      virtual_registers_(node_count,
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         InstructionOperand::kInvalidVirtualRegister, zone),
43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      virtual_register_rename_(zone),
44109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      scheduler_(nullptr),
45f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      enable_scheduling_(enable_scheduling),
46f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      enable_serialization_(enable_serialization),
47f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      frame_(frame),
48f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      instruction_selection_failed_(false) {
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  instructions_.reserve(node_count);
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
52f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochbool InstructionSelector::SelectInstructions() {
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Mark the inputs of all phis in loop headers as used.
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BasicBlockVector* blocks = schedule()->rpo_order();
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (auto const block : *blocks) {
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!block->IsLoopHeader()) continue;
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_LE(2u, block->PredecessorCount());
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (Node* const phi : *block) {
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (phi->opcode() != IrOpcode::kPhi) continue;
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Mark all inputs as used.
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      for (Node* const input : phi->inputs()) {
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MarkAsUsed(input);
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Visit each basic block in post order.
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (auto i = blocks->rbegin(); i != blocks->rend(); ++i) {
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    VisitBlock(*i);
71f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    if (instruction_selection_failed()) return false;
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Schedule the selected instructions.
75f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (UseInstructionScheduling()) {
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    scheduler_ = new (zone()) InstructionScheduler(zone(), sequence());
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (auto const block : *blocks) {
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    InstructionBlock* instruction_block =
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        sequence()->InstructionBlockAt(RpoNumber::FromInt(block->rpo_number()));
82f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    for (size_t i = 0; i < instruction_block->phis().size(); i++) {
83f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      UpdateRenamesInPhi(instruction_block->PhiAt(i));
84f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    size_t end = instruction_block->code_end();
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    size_t start = instruction_block->code_start();
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_LE(end, start);
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StartBlock(RpoNumber::FromInt(block->rpo_number()));
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    while (start-- > end) {
90f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      UpdateRenames(instructions_[start]);
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AddInstruction(instructions_[start]);
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EndBlock(RpoNumber::FromInt(block->rpo_number()));
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#if DEBUG
963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  sequence()->ValidateSSA();
973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif
98f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return true;
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::StartBlock(RpoNumber rpo) {
102f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (UseInstructionScheduling()) {
103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_NOT_NULL(scheduler_);
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    scheduler_->StartBlock(rpo);
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    sequence()->StartBlock(rpo);
107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::EndBlock(RpoNumber rpo) {
112f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (UseInstructionScheduling()) {
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_NOT_NULL(scheduler_);
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    scheduler_->EndBlock(rpo);
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    sequence()->EndBlock(rpo);
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::AddInstruction(Instruction* instr) {
122f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (UseInstructionScheduling()) {
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_NOT_NULL(scheduler_);
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    scheduler_->AddInstruction(instr);
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    sequence()->AddInstruction(instr);
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstruction* InstructionSelector::Emit(InstructionCode opcode,
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand output,
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                       size_t temp_count,
134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand* temps) {
135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t output_count = output.IsInvalid() ? 0 : 1;
136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Emit(opcode, output_count, &output, 0, nullptr, temp_count, temps);
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstruction* InstructionSelector::Emit(InstructionCode opcode,
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand output,
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand a, size_t temp_count,
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand* temps) {
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t output_count = output.IsInvalid() ? 0 : 1;
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Emit(opcode, output_count, &output, 1, &a, temp_count, temps);
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstruction* InstructionSelector::Emit(InstructionCode opcode,
150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand output,
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand a,
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand b, size_t temp_count,
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand* temps) {
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t output_count = output.IsInvalid() ? 0 : 1;
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstructionOperand inputs[] = {a, b};
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  size_t input_count = arraysize(inputs);
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Emit(opcode, output_count, &output, input_count, inputs, temp_count,
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              temps);
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstruction* InstructionSelector::Emit(InstructionCode opcode,
163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand output,
164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand a,
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand b,
166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand c, size_t temp_count,
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperand* temps) {
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t output_count = output.IsInvalid() ? 0 : 1;
169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstructionOperand inputs[] = {a, b, c};
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  size_t input_count = arraysize(inputs);
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Emit(opcode, output_count, &output, input_count, inputs, temp_count,
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              temps);
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstruction* InstructionSelector::Emit(
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionCode opcode, InstructionOperand output, InstructionOperand a,
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionOperand b, InstructionOperand c, InstructionOperand d,
179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    size_t temp_count, InstructionOperand* temps) {
180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t output_count = output.IsInvalid() ? 0 : 1;
181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstructionOperand inputs[] = {a, b, c, d};
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  size_t input_count = arraysize(inputs);
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Emit(opcode, output_count, &output, input_count, inputs, temp_count,
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              temps);
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstruction* InstructionSelector::Emit(
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionCode opcode, InstructionOperand output, InstructionOperand a,
190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionOperand b, InstructionOperand c, InstructionOperand d,
191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionOperand e, size_t temp_count, InstructionOperand* temps) {
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t output_count = output.IsInvalid() ? 0 : 1;
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstructionOperand inputs[] = {a, b, c, d, e};
194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  size_t input_count = arraysize(inputs);
195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return Emit(opcode, output_count, &output, input_count, inputs, temp_count,
196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              temps);
197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierInstruction* InstructionSelector::Emit(
201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionCode opcode, InstructionOperand output, InstructionOperand a,
202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionOperand b, InstructionOperand c, InstructionOperand d,
203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionOperand e, InstructionOperand f, size_t temp_count,
204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionOperand* temps) {
205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t output_count = output.IsInvalid() ? 0 : 1;
206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstructionOperand inputs[] = {a, b, c, d, e, f};
207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  size_t input_count = arraysize(inputs);
208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return Emit(opcode, output_count, &output, input_count, inputs, temp_count,
209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              temps);
210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierInstruction* InstructionSelector::Emit(
214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionCode opcode, size_t output_count, InstructionOperand* outputs,
215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    size_t input_count, InstructionOperand* inputs, size_t temp_count,
216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionOperand* temps) {
217f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (output_count >= Instruction::kMaxOutputCount ||
218f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      input_count >= Instruction::kMaxInputCount ||
219f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      temp_count >= Instruction::kMaxTempCount) {
220f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    set_instruction_selection_failed();
221f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return nullptr;
222f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
223f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Instruction* instr =
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Instruction::New(instruction_zone(), opcode, output_count, outputs,
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       input_count, inputs, temp_count, temps);
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Emit(instr);
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstruction* InstructionSelector::Emit(Instruction* instr) {
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instructions_.push_back(instr);
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return instr;
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool InstructionSelector::CanCover(Node* user, Node* node) const {
2383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // 1. Both {user} and {node} must be in the same basic block.
2393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (schedule()->block(node) != schedule()->block(user)) {
2403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return false;
2413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
2423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // 2. Pure {node}s must be owned by the {user}.
2433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (node->op()->HasProperty(Operator::kPure)) {
2443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return node->OwnedBy(user);
2453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
2463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // 3. Impure {node}s must match the effect level of {user}.
2473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (GetEffectLevel(node) != GetEffectLevel(user)) {
2483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return false;
2493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
2503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // 4. Only {node} must have value edges pointing to {user}.
2513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  for (Edge const edge : node->use_edges()) {
2523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    if (edge.from() != user && NodeProperties::IsValueEdge(edge)) {
2533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return false;
2543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
2553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
2563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return true;
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool InstructionSelector::IsOnlyUserOfNodeInSameBlock(Node* user,
260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                                      Node* node) const {
261f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BasicBlock* bb_user = schedule()->block(user);
262f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  BasicBlock* bb_node = schedule()->block(node);
263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (bb_user != bb_node) return false;
264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  for (Edge const edge : node->use_edges()) {
265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Node* from = edge.from();
266f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if ((from != user) && (schedule()->block(from) == bb_user)) {
267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return false;
268f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
269f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
270f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return true;
271f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
272f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
273f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid InstructionSelector::UpdateRenames(Instruction* instruction) {
274f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  for (size_t i = 0; i < instruction->InputCount(); i++) {
275f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    TryRename(instruction->InputAt(i));
276f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
277f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
278f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
279f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid InstructionSelector::UpdateRenamesInPhi(PhiInstruction* phi) {
280f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  for (size_t i = 0; i < phi->operands().size(); i++) {
281f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    int vreg = phi->operands()[i];
282f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    int renamed = GetRename(vreg);
283f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    if (vreg != renamed) {
284f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      phi->RenameInput(i, renamed);
285f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
286f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
287f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
288f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
289f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochint InstructionSelector::GetRename(int virtual_register) {
290f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int rename = virtual_register;
291f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  while (true) {
292f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    if (static_cast<size_t>(rename) >= virtual_register_rename_.size()) break;
293f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    int next = virtual_register_rename_[rename];
294f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    if (next == InstructionOperand::kInvalidVirtualRegister) {
295f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      break;
296f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
297f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    rename = next;
298f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
299f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return rename;
300f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
301f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
302f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid InstructionSelector::TryRename(InstructionOperand* op) {
303f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (!op->IsUnallocated()) return;
304f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int vreg = UnallocatedOperand::cast(op)->virtual_register();
305f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int rename = GetRename(vreg);
306f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (rename != vreg) {
307f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    UnallocatedOperand::cast(op)->set_virtual_register(rename);
308f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
309f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
310f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
311f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid InstructionSelector::SetRename(const Node* node, const Node* rename) {
312f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int vreg = GetVirtualRegister(node);
313f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (static_cast<size_t>(vreg) >= virtual_register_rename_.size()) {
314f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    int invalid = InstructionOperand::kInvalidVirtualRegister;
315f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    virtual_register_rename_.resize(vreg + 1, invalid);
316f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
317f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  virtual_register_rename_[vreg] = GetVirtualRegister(rename);
318f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
319f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint InstructionSelector::GetVirtualRegister(const Node* node) {
321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_NOT_NULL(node);
322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t const id = node->id();
323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_LT(id, virtual_registers_.size());
324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int virtual_register = virtual_registers_[id];
325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (virtual_register == InstructionOperand::kInvalidVirtualRegister) {
326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    virtual_register = sequence()->NextVirtualRegister();
327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    virtual_registers_[id] = virtual_register;
328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return virtual_register;
330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst std::map<NodeId, int> InstructionSelector::GetVirtualRegistersForTesting()
334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const {
335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  std::map<NodeId, int> virtual_registers;
336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t n = 0; n < virtual_registers_.size(); ++n) {
337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (virtual_registers_[n] != InstructionOperand::kInvalidVirtualRegister) {
338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      NodeId const id = static_cast<NodeId>(n);
339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      virtual_registers.insert(std::make_pair(id, virtual_registers_[n]));
340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return virtual_registers;
343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool InstructionSelector::IsDefined(Node* node) const {
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_NOT_NULL(node);
348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t const id = node->id();
349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_LT(id, defined_.size());
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return defined_[id];
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::MarkAsDefined(Node* node) {
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_NOT_NULL(node);
356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t const id = node->id();
357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_LT(id, defined_.size());
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  defined_[id] = true;
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool InstructionSelector::IsUsed(Node* node) const {
363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_NOT_NULL(node);
364f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // TODO(bmeurer): This is a terrible monster hack, but we have to make sure
365f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // that the Retain is actually emitted, otherwise the GC will mess up.
366f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (node->opcode() == IrOpcode::kRetain) return true;
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!node->op()->HasProperty(Operator::kEliminatable)) return true;
368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t const id = node->id();
369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_LT(id, used_.size());
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return used_[id];
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::MarkAsUsed(Node* node) {
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_NOT_NULL(node);
376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t const id = node->id();
377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_LT(id, used_.size());
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  used_[id] = true;
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
381109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochint InstructionSelector::GetEffectLevel(Node* node) const {
382109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DCHECK_NOT_NULL(node);
383109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  size_t const id = node->id();
384109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DCHECK_LT(id, effect_level_.size());
385109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return effect_level_[id];
386109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
387109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
388109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid InstructionSelector::SetEffectLevel(Node* node, int effect_level) {
389109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DCHECK_NOT_NULL(node);
390109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  size_t const id = node->id();
391109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DCHECK_LT(id, effect_level_.size());
392109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  effect_level_[id] = effect_level;
393109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
395f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochbool InstructionSelector::CanAddressRelativeToRootsRegister() const {
396c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return enable_serialization_ == kDisableSerialization &&
397c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch         CanUseRootsRegister();
398c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
399c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
400c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochbool InstructionSelector::CanUseRootsRegister() const {
401c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return linkage()->GetIncomingDescriptor()->flags() &
402c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch         CallDescriptor::kCanUseRoots;
403f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
404f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::MarkAsRepresentation(MachineRepresentation rep,
406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               const InstructionOperand& op) {
407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UnallocatedOperand unalloc = UnallocatedOperand::cast(op);
408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  sequence()->MarkAsRepresentation(rep, unalloc.virtual_register());
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::MarkAsRepresentation(MachineRepresentation rep,
413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               Node* node) {
414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  sequence()->MarkAsRepresentation(rep, GetVirtualRegister(node));
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace {
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class FrameStateInputKind { kAny, kStackSlot };
421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochInstructionOperand OperandForDeopt(OperandGenerator* g, Node* input,
423f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                   FrameStateInputKind kind,
424f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                   MachineRepresentation rep) {
425f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (rep == MachineRepresentation::kNone) {
426f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return g->TempImmediate(FrameStateDescriptor::kImpossibleValue);
427f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
428f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (input->opcode()) {
430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kInt32Constant:
431f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kInt64Constant:
432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kNumberConstant:
433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32Constant:
434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat64Constant:
435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kHeapConstant:
436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return g->UseImmediate(input);
437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kObjectState:
438c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    case IrOpcode::kTypedObjectState:
439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      UNREACHABLE();
440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    default:
442f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      switch (kind) {
443f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        case FrameStateInputKind::kStackSlot:
444f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          return g->UseUniqueSlot(input);
445f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        case FrameStateInputKind::kAny:
446f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          // Currently deopts "wrap" other operations, so the deopt's inputs
447f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          // are potentially needed untill the end of the deoptimising code.
448f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          return g->UseAnyAtEnd(input);
449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNREACHABLE();
452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return InstructionOperand();
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass StateObjectDeduplicator {
457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit StateObjectDeduplicator(Zone* zone) : objects_(zone) {}
459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const size_t kNotDuplicated = SIZE_MAX;
460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t GetObjectId(Node* node) {
462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (size_t i = 0; i < objects_.size(); ++i) {
463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (objects_[i] == node) {
464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return i;
465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return kNotDuplicated;
468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t InsertObject(Node* node) {
471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    size_t id = objects_.size();
472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    objects_.push_back(node);
473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return id;
474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ZoneVector<Node*> objects_;
478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Returns the number of instruction operands added to inputs.
482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t AddOperandToStateValueDescriptor(StateValueDescriptor* descriptor,
483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        InstructionOperandVector* inputs,
484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        OperandGenerator* g,
485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        StateObjectDeduplicator* deduplicator,
486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        Node* input, MachineType type,
487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        FrameStateInputKind kind, Zone* zone) {
488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (input->opcode()) {
489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kObjectState: {
490c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      UNREACHABLE();
491c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      return 0;
492c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
493c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    case IrOpcode::kTypedObjectState: {
494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      size_t id = deduplicator->GetObjectId(input);
495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (id == StateObjectDeduplicator::kNotDuplicated) {
496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        size_t entries = 0;
497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        id = deduplicator->InsertObject(input);
498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        descriptor->fields().push_back(
499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            StateValueDescriptor::Recursive(zone, id));
500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        StateValueDescriptor* new_desc = &descriptor->fields().back();
501c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        int const input_count = input->op()->ValueInputCount();
502c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        ZoneVector<MachineType> const* types = MachineTypesOf(input->op());
503c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        for (int i = 0; i < input_count; ++i) {
504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          entries += AddOperandToStateValueDescriptor(
505c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch              new_desc, inputs, g, deduplicator, input->InputAt(i),
506c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch              types->at(i), kind, zone);
507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }
508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return entries;
509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      } else {
510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        // Crankshaft counts duplicate objects for the running id, so we have
511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        // to push the input again.
512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        deduplicator->InsertObject(input);
513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        descriptor->fields().push_back(
514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            StateValueDescriptor::Duplicate(zone, id));
515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return 0;
516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default: {
519f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      inputs->push_back(OperandForDeopt(g, input, kind, type.representation()));
520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      descriptor->fields().push_back(StateValueDescriptor::Plain(zone, type));
521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return 1;
522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Returns the number of instruction operands added to inputs.
528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t AddInputsToFrameStateDescriptor(FrameStateDescriptor* descriptor,
529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       Node* state, OperandGenerator* g,
530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       StateObjectDeduplicator* deduplicator,
531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       InstructionOperandVector* inputs,
532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       FrameStateInputKind kind, Zone* zone) {
533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(IrOpcode::kFrameState, state->op()->opcode());
534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t entries = 0;
536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t initial_size = inputs->size();
537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  USE(initial_size);  // initial_size is only used for debug.
538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (descriptor->outer_state()) {
540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    entries += AddInputsToFrameStateDescriptor(
541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        descriptor->outer_state(), state->InputAt(kFrameStateOuterStateInput),
542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        g, deduplicator, inputs, kind, zone);
543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* parameters = state->InputAt(kFrameStateParametersInput);
546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* locals = state->InputAt(kFrameStateLocalsInput);
547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* stack = state->InputAt(kFrameStateStackInput);
548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* context = state->InputAt(kFrameStateContextInput);
549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* function = state->InputAt(kFrameStateFunctionInput);
550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(descriptor->parameters_count(),
552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            StateValuesAccess(parameters).size());
553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(descriptor->locals_count(), StateValuesAccess(locals).size());
554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(descriptor->stack_count(), StateValuesAccess(stack).size());
555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  StateValueDescriptor* values_descriptor =
557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      descriptor->GetStateValueDescriptor();
558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  entries += AddOperandToStateValueDescriptor(
559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      values_descriptor, inputs, g, deduplicator, function,
560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType::AnyTagged(), FrameStateInputKind::kStackSlot, zone);
561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (StateValuesAccess::TypedNode input_node :
562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch       StateValuesAccess(parameters)) {
563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    entries += AddOperandToStateValueDescriptor(values_descriptor, inputs, g,
564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                deduplicator, input_node.node,
565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                input_node.type, kind, zone);
566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (descriptor->HasContext()) {
568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    entries += AddOperandToStateValueDescriptor(
569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        values_descriptor, inputs, g, deduplicator, context,
570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MachineType::AnyTagged(), FrameStateInputKind::kStackSlot, zone);
571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (StateValuesAccess::TypedNode input_node : StateValuesAccess(locals)) {
573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    entries += AddOperandToStateValueDescriptor(values_descriptor, inputs, g,
574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                deduplicator, input_node.node,
575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                input_node.type, kind, zone);
576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (StateValuesAccess::TypedNode input_node : StateValuesAccess(stack)) {
578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    entries += AddOperandToStateValueDescriptor(values_descriptor, inputs, g,
579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                deduplicator, input_node.node,
580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                input_node.type, kind, zone);
581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(initial_size + entries, inputs->size());
583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return entries;
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// An internal helper class for generating the operands to calls.
590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TODO(bmeurer): Get rid of the CallBuffer business and make
591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// InstructionSelector::VisitCall platform independent instead.
592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct CallBuffer {
593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CallBuffer(Zone* zone, const CallDescriptor* descriptor,
594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch             FrameStateDescriptor* frame_state)
595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : descriptor(descriptor),
596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        frame_state_descriptor(frame_state),
597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        output_nodes(zone),
598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        outputs(zone),
599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        instruction_args(zone),
600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        pushed_nodes(zone) {
601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    output_nodes.reserve(descriptor->ReturnCount());
602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    outputs.reserve(descriptor->ReturnCount());
603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    pushed_nodes.reserve(input_count());
604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    instruction_args.reserve(input_count() + frame_state_value_count());
605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const CallDescriptor* descriptor;
609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FrameStateDescriptor* frame_state_descriptor;
610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  NodeVector output_nodes;
611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstructionOperandVector outputs;
612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstructionOperandVector instruction_args;
613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ZoneVector<PushParameter> pushed_nodes;
614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t input_count() const { return descriptor->InputCount(); }
616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t frame_state_count() const { return descriptor->FrameStateCount(); }
618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t frame_state_value_count() const {
620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return (frame_state_descriptor == nullptr)
621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               ? 0
622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               : (frame_state_descriptor->GetTotalSize() +
623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  1);  // Include deopt id.
624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TODO(bmeurer): Get rid of the CallBuffer business and make
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// InstructionSelector::VisitCall platform independent instead.
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer,
631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               CallBufferFlags flags,
632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               int stack_param_delta) {
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OperandGenerator g(this);
634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_LE(call->op()->ValueOutputCount(),
635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            static_cast<int>(buffer->descriptor->ReturnCount()));
636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK_EQ(
637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      call->op()->ValueInputCount(),
638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      static_cast<int>(buffer->input_count() + buffer->frame_state_count()));
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (buffer->descriptor->ReturnCount() > 0) {
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Collect the projections that represent multiple outputs from this call.
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (buffer->descriptor->ReturnCount() == 1) {
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      buffer->output_nodes.push_back(call);
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      buffer->output_nodes.resize(buffer->descriptor->ReturnCount(), nullptr);
646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      for (auto use : call->uses()) {
647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (use->opcode() != IrOpcode::kProjection) continue;
648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        size_t const index = ProjectionIndexOf(use->op());
649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK_LT(index, buffer->output_nodes.size());
650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK(!buffer->output_nodes[index]);
651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        buffer->output_nodes[index] = use;
652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Filter out the outputs that aren't live because no projection uses them.
656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    size_t outputs_needed_by_framestate =
657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        buffer->frame_state_descriptor == nullptr
658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            ? 0
659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            : buffer->frame_state_descriptor->state_combine()
660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                  .ConsumedOutputCount();
661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (size_t i = 0; i < buffer->output_nodes.size(); i++) {
662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      bool output_is_live = buffer->output_nodes[i] != nullptr ||
663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            i < outputs_needed_by_framestate;
664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (output_is_live) {
665f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        MachineRepresentation rep =
666f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch            buffer->descriptor->GetReturnType(static_cast<int>(i))
667f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                .representation();
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LinkageLocation location =
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            buffer->descriptor->GetReturnLocation(static_cast<int>(i));
670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Node* output = buffer->output_nodes[i];
672f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        InstructionOperand op = output == nullptr
673f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                    ? g.TempLocation(location)
674f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                    : g.DefineAsLocation(output, location);
675f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        MarkAsRepresentation(rep, op);
676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        buffer->outputs.push_back(op);
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The first argument is always the callee code.
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* callee = call->InputAt(0);
684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool call_code_immediate = (flags & kCallCodeImmediate) != 0;
685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool call_address_immediate = (flags & kCallAddressImmediate) != 0;
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (buffer->descriptor->kind()) {
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case CallDescriptor::kCallCodeObject:
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      buffer->instruction_args.push_back(
689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (call_code_immediate && callee->opcode() == IrOpcode::kHeapConstant)
690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              ? g.UseImmediate(callee)
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              : g.UseRegister(callee));
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case CallDescriptor::kCallAddress:
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      buffer->instruction_args.push_back(
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (call_address_immediate &&
696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           callee->opcode() == IrOpcode::kExternalConstant)
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              ? g.UseImmediate(callee)
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              : g.UseRegister(callee));
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case CallDescriptor::kCallJSFunction:
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      buffer->instruction_args.push_back(
702f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          g.UseLocation(callee, buffer->descriptor->GetInputLocation(0)));
703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(1u, buffer->instruction_args.size());
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If the call needs a frame state, we insert the state information as
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // follows (n is the number of value inputs to the frame state):
709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // arg 1               : deoptimization id.
710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // arg 2 - arg (n + 1) : value inputs to the frame state.
711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t frame_state_entries = 0;
712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  USE(frame_state_entries);  // frame_state_entries is only used for debug.
713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (buffer->frame_state_descriptor != nullptr) {
714109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Node* frame_state =
715109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        call->InputAt(static_cast<int>(buffer->descriptor->InputCount()));
716109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
717109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // If it was a syntactic tail call we need to drop the current frame and
7183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // all the frames on top of it that are either an arguments adaptor frame
7193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // or a tail caller frame.
720109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    if (buffer->descriptor->SupportsTailCalls()) {
721f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      frame_state = NodeProperties::GetFrameStateInput(frame_state);
722109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      buffer->frame_state_descriptor =
723109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch          buffer->frame_state_descriptor->outer_state();
7243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      while (buffer->frame_state_descriptor != nullptr &&
7253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch             (buffer->frame_state_descriptor->type() ==
7263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                  FrameStateType::kArgumentsAdaptor ||
7273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch              buffer->frame_state_descriptor->type() ==
7283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                  FrameStateType::kTailCallerFunction)) {
729f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        frame_state = NodeProperties::GetFrameStateInput(frame_state);
730109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        buffer->frame_state_descriptor =
731109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch            buffer->frame_state_descriptor->outer_state();
732109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      }
733109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
734109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
735f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    int const state_id = sequence()->AddDeoptimizationEntry(
736f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        buffer->frame_state_descriptor, DeoptimizeReason::kNoReason);
737f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    buffer->instruction_args.push_back(g.TempImmediate(state_id));
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StateObjectDeduplicator deduplicator(instruction_zone());
740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    frame_state_entries =
742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        1 + AddInputsToFrameStateDescriptor(
743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                buffer->frame_state_descriptor, frame_state, &g, &deduplicator,
744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                &buffer->instruction_args, FrameStateInputKind::kStackSlot,
745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                instruction_zone());
746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_EQ(1 + frame_state_entries, buffer->instruction_args.size());
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  size_t input_count = static_cast<size_t>(buffer->input_count());
751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Split the arguments into pushed_nodes and instruction_args. Pushed
753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // arguments require an explicit push instruction before the call and do
754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // not appear as arguments to the call. Everything else ends up
755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // as an InstructionOperand argument to the call.
756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  auto iter(call->inputs().begin());
757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t pushed_count = 0;
758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool call_tail = (flags & kCallTail) != 0;
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (size_t index = 0; index < input_count; ++iter, ++index) {
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(iter != call->inputs().end());
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK((*iter)->op()->opcode() != IrOpcode::kFrameState);
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 0) continue;  // The first argument (callee) is already done.
763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LinkageLocation location = buffer->descriptor->GetInputLocation(index);
765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (call_tail) {
766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      location = LinkageLocation::ConvertToTailCallerLocation(
767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          location, stack_param_delta);
768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
769f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstructionOperand op = g.UseLocation(*iter, location);
770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (UnallocatedOperand::cast(op).HasFixedSlotPolicy() && !call_tail) {
771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int stack_index = -UnallocatedOperand::cast(op).fixed_slot_index() - 1;
772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (static_cast<size_t>(stack_index) >= buffer->pushed_nodes.size()) {
773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        buffer->pushed_nodes.resize(stack_index + 1);
774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      PushParameter parameter(*iter, buffer->descriptor->GetInputType(index));
776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      buffer->pushed_nodes[stack_index] = parameter;
777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      pushed_count++;
778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      buffer->instruction_args.push_back(op);
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(input_count, buffer->instruction_args.size() + pushed_count -
783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                             frame_state_entries);
784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (V8_TARGET_ARCH_STORES_RETURN_ADDRESS_ON_STACK && call_tail &&
785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      stack_param_delta != 0) {
786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // For tail calls that change the size of their parameter list and keep
787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // their return address on the stack, move the return address to just above
788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // the parameters.
789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LinkageLocation saved_return_location =
790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        LinkageLocation::ForSavedCallerReturnAddress();
791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    InstructionOperand return_address =
792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        g.UsePointerLocation(LinkageLocation::ConvertToTailCallerLocation(
793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 saved_return_location, stack_param_delta),
794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                             saved_return_location);
795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    buffer->instruction_args.push_back(return_address);
796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitBlock(BasicBlock* block) {
800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!current_block_);
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  current_block_ = block;
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int current_block_end = static_cast<int>(instructions_.size());
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
804109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int effect_level = 0;
805109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  for (Node* const node : *block) {
806109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    if (node->opcode() == IrOpcode::kStore ||
807f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        node->opcode() == IrOpcode::kUnalignedStore ||
808109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        node->opcode() == IrOpcode::kCheckedStore ||
809109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        node->opcode() == IrOpcode::kCall) {
810109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      ++effect_level;
811109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
812109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    SetEffectLevel(node, effect_level);
813109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
814109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
815bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // We visit the control first, then the nodes in the block, so the block's
816bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // control input should be on the same effect level as the last node.
817bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (block->control_input() != nullptr) {
818bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    SetEffectLevel(block->control_input(), effect_level);
819bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
820bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Generate code for the block control "top down", but schedule the code
822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // "bottom up".
823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VisitControl(block);
824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  std::reverse(instructions_.begin() + current_block_end, instructions_.end());
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Visit code in reverse control flow order, because architecture-specific
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // matching may cover more than one node at a time.
828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (auto node : base::Reversed(*block)) {
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Skip nodes that are unused or already defined.
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!IsUsed(node) || IsDefined(node)) continue;
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Generate code for this node "top down", but schedule the code "bottom
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // up".
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    size_t current_node_end = instructions_.size();
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    VisitNode(node);
835f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    if (instruction_selection_failed()) return;
836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    std::reverse(instructions_.begin() + current_node_end, instructions_.end());
837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (instructions_.size() == current_node_end) continue;
838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Mark source position on first instruction emitted.
839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SourcePosition source_position = source_positions_->GetSourcePosition(node);
840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (source_position.IsKnown() &&
841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        (source_position_mode_ == kAllSourcePositions ||
842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         node->opcode() == IrOpcode::kCall)) {
843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      sequence()->SetSourcePosition(instructions_[current_node_end],
844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    source_position);
845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We're done with the block.
849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  InstructionBlock* instruction_block =
850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      sequence()->InstructionBlockAt(RpoNumber::FromInt(block->rpo_number()));
851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  instruction_block->set_code_start(static_cast<int>(instructions_.size()));
852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  instruction_block->set_code_end(current_block_end);
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  current_block_ = nullptr;
855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitControl(BasicBlock* block) {
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // SSA deconstruction requires targets of branches not to have phis.
861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Edge split form guarantees this property, but is more strict.
862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (block->SuccessorCount() > 1) {
863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (BasicBlock* const successor : block->successors()) {
864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      for (Node* const node : *successor) {
865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK(!IrOpcode::IsPhiOpcode(node->opcode()));
866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Node* input = block->control_input();
872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (block->control()) {
873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BasicBlock::kGoto:
874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitGoto(block->SuccessorAt(0));
875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case BasicBlock::kCall: {
876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DCHECK_EQ(IrOpcode::kCall, input->opcode());
877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      BasicBlock* success = block->SuccessorAt(0);
878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      BasicBlock* exception = block->SuccessorAt(1);
879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return VisitCall(input, exception), VisitGoto(success);
880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case BasicBlock::kTailCall: {
882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DCHECK_EQ(IrOpcode::kTailCall, input->opcode());
883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return VisitTailCall(input);
884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BasicBlock::kBranch: {
886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK_EQ(IrOpcode::kBranch, input->opcode());
887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlock* tbranch = block->SuccessorAt(0);
888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      BasicBlock* fbranch = block->SuccessorAt(1);
889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (tbranch == fbranch) return VisitGoto(tbranch);
890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitBranch(input, tbranch, fbranch);
891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case BasicBlock::kSwitch: {
893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DCHECK_EQ(IrOpcode::kSwitch, input->opcode());
894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      SwitchInfo sw;
895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // Last successor must be Default.
896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      sw.default_branch = block->successors().back();
897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DCHECK_EQ(IrOpcode::kIfDefault, sw.default_branch->front()->opcode());
898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // All other successors must be cases.
899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      sw.case_count = block->SuccessorCount() - 1;
900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      sw.case_branches = &block->successors().front();
901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // Determine case values and their min/max.
902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      sw.case_values = zone()->NewArray<int32_t>(sw.case_count);
903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      sw.min_value = std::numeric_limits<int32_t>::max();
904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      sw.max_value = std::numeric_limits<int32_t>::min();
905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      for (size_t index = 0; index < sw.case_count; ++index) {
906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        BasicBlock* branch = sw.case_branches[index];
907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        int32_t value = OpParameter<int32_t>(branch->front()->op());
908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        sw.case_values[index] = value;
909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (sw.min_value > value) sw.min_value = value;
910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (sw.max_value < value) sw.max_value = value;
911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DCHECK_LE(sw.min_value, sw.max_value);
913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // Note that {value_range} can be 0 if {min_value} is -2^31 and
914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // {max_value}
915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // is 2^31-1, so don't assume that it's non-zero below.
916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      sw.value_range = 1u + bit_cast<uint32_t>(sw.max_value) -
917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       bit_cast<uint32_t>(sw.min_value);
918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return VisitSwitch(input, sw);
919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BasicBlock::kReturn: {
921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DCHECK_EQ(IrOpcode::kReturn, input->opcode());
922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return VisitReturn(input);
923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case BasicBlock::kDeoptimize: {
925f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      DeoptimizeParameters p = DeoptimizeParametersOf(input->op());
926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Node* value = input->InputAt(0);
927f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return VisitDeoptimize(p.kind(), p.reason(), value);
928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BasicBlock::kThrow:
930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DCHECK_EQ(IrOpcode::kThrow, input->opcode());
931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return VisitThrow(input->InputAt(0));
932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BasicBlock::kNone: {
933109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      // Exit block doesn't have control.
934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DCHECK_NULL(input);
935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UNREACHABLE();
939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
943c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid InstructionSelector::MarkPairProjectionsAsWord32(Node* node) {
944c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Node* projection0 = NodeProperties::FindProjection(node, 0);
945c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (projection0) {
946c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    MarkAsWord32(projection0);
947c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
948c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Node* projection1 = NodeProperties::FindProjection(node, 1);
949c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (projection1) {
950c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    MarkAsWord32(projection1);
951c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
952c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitNode(Node* node) {
955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_NOT_NULL(schedule()->block(node));  // should only use scheduled nodes.
956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (node->opcode()) {
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kStart:
958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kLoop:
959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kEnd:
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kBranch:
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kIfTrue:
962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kIfFalse:
963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kIfSuccess:
964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kSwitch:
965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kIfValue:
966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kIfDefault:
967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kEffectPhi:
968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kMerge:
969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kTerminate:
970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kBeginRegion:
971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // No code needed for these graph artifacts.
972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kIfException:
974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsReference(node), VisitIfException(node);
975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFinishRegion:
976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsReference(node), VisitFinishRegion(node);
977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kParameter: {
978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType type =
979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          linkage()->GetParameterType(ParameterIndexOf(node->op()));
980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MarkAsRepresentation(type.representation(), node);
981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitParameter(node);
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kOsrValue:
984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsReference(node), VisitOsrValue(node);
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kPhi: {
986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineRepresentation rep = PhiRepresentationOf(node->op());
987f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      if (rep == MachineRepresentation::kNone) return;
988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MarkAsRepresentation(rep, node);
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitPhi(node);
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kProjection:
992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitProjection(node);
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32Constant:
994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt64Constant:
995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kExternalConstant:
996bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    case IrOpcode::kRelocatableInt32Constant:
997bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    case IrOpcode::kRelocatableInt64Constant:
998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitConstant(node);
999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kFloat32Constant:
1000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitConstant(node);
1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Constant:
1002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitConstant(node);
1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kHeapConstant:
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return MarkAsReference(node), VisitConstant(node);
1005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kNumberConstant: {
1006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      double value = OpParameter<double>(node);
1007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (!IsSmiDouble(value)) MarkAsReference(node);
1008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return VisitConstant(node);
1009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kCall:
1011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return VisitCall(node);
10123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kDeoptimizeIf:
10133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return VisitDeoptimizeIf(node);
10143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kDeoptimizeUnless:
10153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return VisitDeoptimizeUnless(node);
1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFrameState:
1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kStateValues:
1018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kObjectState:
1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
102013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kDebugBreak:
102113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      VisitDebugBreak(node);
102213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return;
102313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kComment:
102413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      VisitComment(node);
102513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return;
1026f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kRetain:
1027f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      VisitRetain(node);
1028f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return;
1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kLoad: {
1030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LoadRepresentation type = LoadRepresentationOf(node->op());
1031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MarkAsRepresentation(type.representation(), node);
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitLoad(node);
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kStore:
1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitStore(node);
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32And:
1037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitWord32And(node);
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Or:
1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitWord32Or(node);
1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Xor:
1041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitWord32Xor(node);
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Shl:
1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitWord32Shl(node);
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Shr:
1045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitWord32Shr(node);
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Sar:
1047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitWord32Sar(node);
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Ror:
1049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitWord32Ror(node);
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord32Equal:
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitWord32Equal(node);
1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kWord32Clz:
1053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitWord32Clz(node);
1054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kWord32Ctz:
1055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitWord32Ctz(node);
1056109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    case IrOpcode::kWord32ReverseBits:
1057109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      return MarkAsWord32(node), VisitWord32ReverseBits(node);
1058f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kWord32ReverseBytes:
1059f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsWord32(node), VisitWord32ReverseBytes(node);
1060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kWord32Popcnt:
1061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitWord32Popcnt(node);
1062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kWord64Popcnt:
1063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitWord64Popcnt(node);
1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord64And:
1065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitWord64And(node);
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord64Or:
1067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitWord64Or(node);
1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord64Xor:
1069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitWord64Xor(node);
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord64Shl:
1071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitWord64Shl(node);
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord64Shr:
1073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitWord64Shr(node);
1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord64Sar:
1075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitWord64Sar(node);
1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord64Ror:
1077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitWord64Ror(node);
1078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kWord64Clz:
1079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitWord64Clz(node);
1080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kWord64Ctz:
1081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitWord64Ctz(node);
1082109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    case IrOpcode::kWord64ReverseBits:
1083109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      return MarkAsWord64(node), VisitWord64ReverseBits(node);
1084f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kWord64ReverseBytes:
1085f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsWord64(node), VisitWord64ReverseBytes(node);
1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kWord64Equal:
1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitWord64Equal(node);
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32Add:
1089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitInt32Add(node);
1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32AddWithOverflow:
1091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitInt32AddWithOverflow(node);
1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32Sub:
1093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitInt32Sub(node);
1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32SubWithOverflow:
1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitInt32SubWithOverflow(node);
1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32Mul:
1097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitInt32Mul(node);
1098f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kInt32MulWithOverflow:
1099f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsWord32(node), VisitInt32MulWithOverflow(node);
1100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kInt32MulHigh:
1101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return VisitInt32MulHigh(node);
1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32Div:
1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitInt32Div(node);
1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32Mod:
1105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitInt32Mod(node);
1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32LessThan:
1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitInt32LessThan(node);
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32LessThanOrEqual:
1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitInt32LessThanOrEqual(node);
1110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kUint32Div:
1111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitUint32Div(node);
1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kUint32LessThan:
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitUint32LessThan(node);
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kUint32LessThanOrEqual:
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitUint32LessThanOrEqual(node);
1116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kUint32Mod:
1117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitUint32Mod(node);
1118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kUint32MulHigh:
1119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return VisitUint32MulHigh(node);
1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt64Add:
1121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitInt64Add(node);
1122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kInt64AddWithOverflow:
1123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitInt64AddWithOverflow(node);
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt64Sub:
1125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitInt64Sub(node);
1126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kInt64SubWithOverflow:
1127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitInt64SubWithOverflow(node);
1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt64Mul:
1129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitInt64Mul(node);
1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt64Div:
1131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitInt64Div(node);
1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt64Mod:
1133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitInt64Mod(node);
1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt64LessThan:
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitInt64LessThan(node);
1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt64LessThanOrEqual:
1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitInt64LessThanOrEqual(node);
1138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kUint64Div:
1139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitUint64Div(node);
1140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kUint64LessThan:
1141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return VisitUint64LessThan(node);
1142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kUint64LessThanOrEqual:
1143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return VisitUint64LessThanOrEqual(node);
1144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kUint64Mod:
1145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitUint64Mod(node);
1146f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    case IrOpcode::kBitcastTaggedToWord:
1147f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      return MarkAsRepresentation(MachineType::PointerRepresentation(), node),
1148f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch             VisitBitcastTaggedToWord(node);
1149bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    case IrOpcode::kBitcastWordToTagged:
1150bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      return MarkAsReference(node), VisitBitcastWordToTagged(node);
1151f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    case IrOpcode::kBitcastWordToTaggedSigned:
1152f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      return MarkAsRepresentation(MachineRepresentation::kTaggedSigned, node),
1153f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch             EmitIdentity(node);
1154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kChangeFloat32ToFloat64:
1155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitChangeFloat32ToFloat64(node);
1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeInt32ToFloat64:
1157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitChangeInt32ToFloat64(node);
1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeUint32ToFloat64:
1159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitChangeUint32ToFloat64(node);
1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeFloat64ToInt32:
1161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitChangeFloat64ToInt32(node);
1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeFloat64ToUint32:
1163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitChangeFloat64ToUint32(node);
116413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64SilenceNaN:
116513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      MarkAsFloat64(node);
116613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      if (CanProduceSignalingNaN(node->InputAt(0))) {
116713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        return VisitFloat64SilenceNaN(node);
116813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      } else {
116913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        return EmitIdentity(node);
117013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      }
11713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kTruncateFloat64ToUint32:
11723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return MarkAsWord32(node), VisitTruncateFloat64ToUint32(node);
1173109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    case IrOpcode::kTruncateFloat32ToInt32:
1174109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      return MarkAsWord32(node), VisitTruncateFloat32ToInt32(node);
1175109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    case IrOpcode::kTruncateFloat32ToUint32:
1176109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      return MarkAsWord32(node), VisitTruncateFloat32ToUint32(node);
1177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kTryTruncateFloat32ToInt64:
1178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitTryTruncateFloat32ToInt64(node);
1179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kTryTruncateFloat64ToInt64:
1180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitTryTruncateFloat64ToInt64(node);
1181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kTryTruncateFloat32ToUint64:
1182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitTryTruncateFloat32ToUint64(node);
1183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kTryTruncateFloat64ToUint64:
1184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitTryTruncateFloat64ToUint64(node);
1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeInt32ToInt64:
1186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitChangeInt32ToInt64(node);
1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kChangeUint32ToUint64:
1188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitChangeUint32ToUint64(node);
1189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kTruncateFloat64ToFloat32:
1190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitTruncateFloat64ToFloat32(node);
1191bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    case IrOpcode::kTruncateFloat64ToWord32:
1192bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      return MarkAsWord32(node), VisitTruncateFloat64ToWord32(node);
1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kTruncateInt64ToInt32:
1194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitTruncateInt64ToInt32(node);
1195bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    case IrOpcode::kRoundFloat64ToInt32:
1196bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      return MarkAsWord32(node), VisitRoundFloat64ToInt32(node);
1197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kRoundInt64ToFloat32:
1198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitRoundInt64ToFloat32(node);
1199109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    case IrOpcode::kRoundInt32ToFloat32:
1200109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      return MarkAsFloat32(node), VisitRoundInt32ToFloat32(node);
1201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kRoundInt64ToFloat64:
1202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitRoundInt64ToFloat64(node);
1203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kBitcastFloat32ToInt32:
1204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitBitcastFloat32ToInt32(node);
1205109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    case IrOpcode::kRoundUint32ToFloat32:
1206109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      return MarkAsFloat32(node), VisitRoundUint32ToFloat32(node);
1207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kRoundUint64ToFloat32:
1208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitRoundUint64ToFloat32(node);
1209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kRoundUint64ToFloat64:
1210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitRoundUint64ToFloat64(node);
1211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kBitcastFloat64ToInt64:
1212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord64(node), VisitBitcastFloat64ToInt64(node);
1213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kBitcastInt32ToFloat32:
1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitBitcastInt32ToFloat32(node);
1215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kBitcastInt64ToFloat64:
1216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitBitcastInt64ToFloat64(node);
1217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32Add:
1218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitFloat32Add(node);
1219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32Sub:
1220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitFloat32Sub(node);
122113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat32Neg:
122213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat32(node), VisitFloat32Neg(node);
1223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32Mul:
1224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitFloat32Mul(node);
1225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32Div:
1226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitFloat32Div(node);
1227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32Abs:
1228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitFloat32Abs(node);
1229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32Sqrt:
1230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitFloat32Sqrt(node);
1231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32Equal:
1232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return VisitFloat32Equal(node);
1233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32LessThan:
1234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return VisitFloat32LessThan(node);
1235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32LessThanOrEqual:
1236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return VisitFloat32LessThanOrEqual(node);
1237f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kFloat32Max:
1238f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsFloat32(node), VisitFloat32Max(node);
1239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kFloat32Min:
1240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsFloat32(node), VisitFloat32Min(node);
1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Add:
1242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64Add(node);
1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Sub:
1244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64Sub(node);
124513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Neg:
124613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Neg(node);
1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Mul:
1248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64Mul(node);
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Div:
1250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64Div(node);
1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Mod:
1252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64Mod(node);
1253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat64Min:
1254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64Min(node);
1255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat64Max:
1256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64Max(node);
1257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat64Abs:
1258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64Abs(node);
1259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kFloat64Acos:
1260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsFloat64(node), VisitFloat64Acos(node);
1261f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kFloat64Acosh:
1262f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsFloat64(node), VisitFloat64Acosh(node);
1263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kFloat64Asin:
1264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsFloat64(node), VisitFloat64Asin(node);
1265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kFloat64Asinh:
1266f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsFloat64(node), VisitFloat64Asinh(node);
126713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Atan:
126813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Atan(node);
126913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Atanh:
127013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Atanh(node);
1271f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kFloat64Atan2:
1272f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsFloat64(node), VisitFloat64Atan2(node);
127313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Cbrt:
127413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Cbrt(node);
127513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Cos:
127613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Cos(node);
1277f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kFloat64Cosh:
1278f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsFloat64(node), VisitFloat64Cosh(node);
127913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Exp:
128013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Exp(node);
128113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Expm1:
128213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Expm1(node);
128313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Log:
128413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Log(node);
128513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Log1p:
128613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Log1p(node);
128713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Log10:
128813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Log10(node);
128913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Log2:
129013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Log2(node);
1291f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kFloat64Pow:
1292f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsFloat64(node), VisitFloat64Pow(node);
129313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Sin:
129413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Sin(node);
1295f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kFloat64Sinh:
1296f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsFloat64(node), VisitFloat64Sinh(node);
1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Sqrt:
1298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64Sqrt(node);
129913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case IrOpcode::kFloat64Tan:
130013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return MarkAsFloat64(node), VisitFloat64Tan(node);
1301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kFloat64Tanh:
1302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return MarkAsFloat64(node), VisitFloat64Tanh(node);
1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64Equal:
1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitFloat64Equal(node);
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64LessThan:
1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitFloat64LessThan(node);
1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kFloat64LessThanOrEqual:
1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return VisitFloat64LessThanOrEqual(node);
1309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32RoundDown:
1310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitFloat32RoundDown(node);
1311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat64RoundDown:
1312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64RoundDown(node);
1313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32RoundUp:
1314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitFloat32RoundUp(node);
1315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat64RoundUp:
1316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64RoundUp(node);
1317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32RoundTruncate:
1318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitFloat32RoundTruncate(node);
1319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kFloat64RoundTruncate:
1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64RoundTruncate(node);
1321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kFloat64RoundTiesAway:
1322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64RoundTiesAway(node);
1323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat32RoundTiesEven:
1324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat32(node), VisitFloat32RoundTiesEven(node);
1325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat64RoundTiesEven:
1326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64RoundTiesEven(node);
1327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat64ExtractLowWord32:
1328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitFloat64ExtractLowWord32(node);
1329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat64ExtractHighWord32:
1330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsWord32(node), VisitFloat64ExtractHighWord32(node);
1331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat64InsertLowWord32:
1332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64InsertLowWord32(node);
1333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kFloat64InsertHighWord32:
1334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MarkAsFloat64(node), VisitFloat64InsertHighWord32(node);
1335109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    case IrOpcode::kStackSlot:
1336109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      return VisitStackSlot(node);
1337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kLoadStackPointer:
1338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return VisitLoadStackPointer(node);
1339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kLoadFramePointer:
1340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return VisitLoadFramePointer(node);
1341109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    case IrOpcode::kLoadParentFramePointer:
1342109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      return VisitLoadParentFramePointer(node);
1343f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kUnalignedLoad: {
1344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      UnalignedLoadRepresentation type =
1345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          UnalignedLoadRepresentationOf(node->op());
1346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      MarkAsRepresentation(type.representation(), node);
1347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return VisitUnalignedLoad(node);
1348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
1349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kUnalignedStore:
1350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return VisitUnalignedStore(node);
1351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kCheckedLoad: {
1352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineRepresentation rep =
1353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          CheckedLoadRepresentationOf(node->op()).representation();
1354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      MarkAsRepresentation(rep, node);
1355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return VisitCheckedLoad(node);
1356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case IrOpcode::kCheckedStore:
1358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return VisitCheckedStore(node);
13593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kInt32PairAdd:
1360c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MarkAsWord32(node);
1361c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MarkPairProjectionsAsWord32(node);
13623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return VisitInt32PairAdd(node);
13633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kInt32PairSub:
1364c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MarkAsWord32(node);
1365c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MarkPairProjectionsAsWord32(node);
13663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return VisitInt32PairSub(node);
13673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kInt32PairMul:
1368c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MarkAsWord32(node);
1369c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MarkPairProjectionsAsWord32(node);
13703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return VisitInt32PairMul(node);
13713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kWord32PairShl:
1372c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MarkAsWord32(node);
1373c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MarkPairProjectionsAsWord32(node);
13743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return VisitWord32PairShl(node);
13753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kWord32PairShr:
1376c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MarkAsWord32(node);
1377c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MarkPairProjectionsAsWord32(node);
13783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return VisitWord32PairShr(node);
13793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kWord32PairSar:
1380c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MarkAsWord32(node);
1381c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MarkPairProjectionsAsWord32(node);
13823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return VisitWord32PairSar(node);
1383bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    case IrOpcode::kAtomicLoad: {
1384bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      LoadRepresentation type = LoadRepresentationOf(node->op());
1385bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      MarkAsRepresentation(type.representation(), node);
1386bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      return VisitAtomicLoad(node);
1387bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }
1388bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    case IrOpcode::kAtomicStore:
1389bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      return VisitAtomicStore(node);
1390f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    case IrOpcode::kProtectedLoad:
1391f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      return VisitProtectedLoad(node);
1392f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kUnsafePointerAdd:
1393f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      MarkAsRepresentation(MachineType::PointerRepresentation(), node);
1394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return VisitUnsafePointerAdd(node);
1395f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    case IrOpcode::kCreateInt32x4:
1396f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      return MarkAsSimd128(node), VisitCreateInt32x4(node);
1397f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    case IrOpcode::kInt32x4ExtractLane:
1398f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      return MarkAsWord32(node), VisitInt32x4ExtractLane(node);
1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      V8_Fatal(__FILE__, __LINE__, "Unexpected operator #%d:%s @ node #%d",
1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               node->opcode(), node->op()->mnemonic(), node->id());
1402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitLoadStackPointer(Node* node) {
1407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OperandGenerator g(this);
1408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Emit(kArchStackPointer, g.DefineAsRegister(node));
1409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitLoadFramePointer(Node* node) {
1412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OperandGenerator g(this);
1413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Emit(kArchFramePointer, g.DefineAsRegister(node));
1414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1416109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid InstructionSelector::VisitLoadParentFramePointer(Node* node) {
1417109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  OperandGenerator g(this);
1418109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Emit(kArchParentFramePointer, g.DefineAsRegister(node));
1419109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1421f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitFloat64Acos(Node* node) {
1422f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Acos);
142313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
142413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1425f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitFloat64Acosh(Node* node) {
1426f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Acosh);
1427f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1428f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1429f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitFloat64Asin(Node* node) {
1430f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Asin);
1431f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1432f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1433f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitFloat64Asinh(Node* node) {
1434f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Asinh);
1435f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1436f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1437f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitFloat64Atan(Node* node) {
1438f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Atan);
143913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
144013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
144113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitFloat64Atanh(Node* node) {
144213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Atanh);
144313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
144413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1445f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitFloat64Atan2(Node* node) {
1446f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VisitFloat64Ieee754Binop(node, kIeee754Float64Atan2);
1447f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1448f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
144913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitFloat64Cbrt(Node* node) {
145013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Cbrt);
145113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
145213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
145313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitFloat64Cos(Node* node) {
145413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Cos);
145513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
145613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1457f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitFloat64Cosh(Node* node) {
1458f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Cosh);
1459f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1460f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
146113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitFloat64Exp(Node* node) {
146213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Exp);
146313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
146413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
146513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitFloat64Expm1(Node* node) {
146613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Expm1);
146713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
146813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
146913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitFloat64Log(Node* node) {
147013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Log);
147113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
147213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
147313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitFloat64Log1p(Node* node) {
147413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Log1p);
147513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
147613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
147713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitFloat64Log2(Node* node) {
147813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Log2);
147913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
148013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
148113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitFloat64Log10(Node* node) {
148213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Log10);
148313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
148413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1485f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitFloat64Pow(Node* node) {
1486f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VisitFloat64Ieee754Binop(node, kIeee754Float64Pow);
1487f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1488f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
148913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitFloat64Sin(Node* node) {
149013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Sin);
149113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
149213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1493f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitFloat64Sinh(Node* node) {
1494f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Sinh);
1495f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1496f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
149713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitFloat64Tan(Node* node) {
149813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Tan);
149913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
150013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1501f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitFloat64Tanh(Node* node) {
1502f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VisitFloat64Ieee754Unop(node, kIeee754Float64Tanh);
1503f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1504f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::EmitTableSwitch(const SwitchInfo& sw,
1506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                          InstructionOperand& index_operand) {
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OperandGenerator g(this);
1508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t input_count = 2 + sw.value_range;
1509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  auto* inputs = zone()->NewArray<InstructionOperand>(input_count);
1510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inputs[0] = index_operand;
1511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstructionOperand default_operand = g.Label(sw.default_branch);
1512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  std::fill(&inputs[1], &inputs[input_count], default_operand);
1513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t index = 0; index < sw.case_count; ++index) {
1514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    size_t value = sw.case_values[index] - sw.min_value;
1515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BasicBlock* branch = sw.case_branches[index];
1516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_LE(0u, value);
1517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_LT(value + 2, input_count);
1518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs[value + 2] = g.Label(branch);
1519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Emit(kArchTableSwitch, 0, nullptr, input_count, inputs, 0, nullptr);
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::EmitLookupSwitch(const SwitchInfo& sw,
1525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           InstructionOperand& value_operand) {
1526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  OperandGenerator g(this);
1527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t input_count = 2 + sw.case_count * 2;
1528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  auto* inputs = zone()->NewArray<InstructionOperand>(input_count);
1529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inputs[0] = value_operand;
1530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inputs[1] = g.Label(sw.default_branch);
1531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t index = 0; index < sw.case_count; ++index) {
1532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int32_t value = sw.case_values[index];
1533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BasicBlock* branch = sw.case_branches[index];
1534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs[index * 2 + 2 + 0] = g.TempImmediate(value);
1535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs[index * 2 + 2 + 1] = g.Label(branch);
1536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Emit(kArchLookupSwitch, 0, nullptr, input_count, inputs, 0, nullptr);
1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1540109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid InstructionSelector::VisitStackSlot(Node* node) {
1541109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int size = 1 << ElementSizeLog2Of(StackSlotRepresentationOf(node->op()));
1542109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int slot = frame_->AllocateSpillSlot(size);
1543109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  OperandGenerator g(this);
1544109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1545109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Emit(kArchStackSlot, g.DefineAsRegister(node),
1546109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch       sequence()->AddImmediate(Constant(slot)), 0, nullptr);
1547109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1549f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid InstructionSelector::VisitBitcastTaggedToWord(Node* node) {
1550f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  OperandGenerator g(this);
1551f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(node->InputAt(0)));
1552f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
1553f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1554bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid InstructionSelector::VisitBitcastWordToTagged(Node* node) {
1555f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  OperandGenerator g(this);
1556f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(node->InputAt(0)));
1557bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
1558bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 32 bit targets do not implement the following instructions.
1560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_ARCH_32_BIT
1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitWord64And(Node* node) { UNIMPLEMENTED(); }
1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitWord64Or(Node* node) { UNIMPLEMENTED(); }
1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitWord64Xor(Node* node) { UNIMPLEMENTED(); }
1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitWord64Shl(Node* node) { UNIMPLEMENTED(); }
1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitWord64Shr(Node* node) { UNIMPLEMENTED(); }
1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitWord64Sar(Node* node) { UNIMPLEMENTED(); }
1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitWord64Ror(Node* node) { UNIMPLEMENTED(); }
1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitWord64Clz(Node* node) { UNIMPLEMENTED(); }
1584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitWord64Ctz(Node* node) { UNIMPLEMENTED(); }
1587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1589109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid InstructionSelector::VisitWord64ReverseBits(Node* node) {
1590109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  UNIMPLEMENTED();
1591109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
1592109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1593109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitWord64Popcnt(Node* node) { UNIMPLEMENTED(); }
1595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid InstructionSelector::VisitWord64Equal(Node* node) { UNIMPLEMENTED(); }
1598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitInt64Add(Node* node) { UNIMPLEMENTED(); }
1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitInt64AddWithOverflow(Node* node) {
1604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitInt64Sub(Node* node) { UNIMPLEMENTED(); }
1609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitInt64SubWithOverflow(Node* node) {
1612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitInt64Mul(Node* node) { UNIMPLEMENTED(); }
1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitInt64Div(Node* node) { UNIMPLEMENTED(); }
1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid InstructionSelector::VisitInt64LessThan(Node* node) { UNIMPLEMENTED(); }
1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid InstructionSelector::VisitInt64LessThanOrEqual(Node* node) {
1625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNIMPLEMENTED();
1626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid InstructionSelector::VisitUint64Div(Node* node) { UNIMPLEMENTED(); }
1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid InstructionSelector::VisitInt64Mod(Node* node) { UNIMPLEMENTED(); }
1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid InstructionSelector::VisitUint64LessThan(Node* node) { UNIMPLEMENTED(); }
1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitUint64LessThanOrEqual(Node* node) {
1639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid InstructionSelector::VisitUint64Mod(Node* node) { UNIMPLEMENTED(); }
1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid InstructionSelector::VisitChangeInt32ToInt64(Node* node) {
1647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNIMPLEMENTED();
1648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid InstructionSelector::VisitChangeUint32ToUint64(Node* node) {
1652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UNIMPLEMENTED();
1653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitTryTruncateFloat32ToInt64(Node* node) {
1657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitTryTruncateFloat64ToInt64(Node* node) {
1662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitTryTruncateFloat32ToUint64(Node* node) {
1667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitTryTruncateFloat64ToUint64(Node* node) {
1672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid InstructionSelector::VisitTruncateInt64ToInt32(Node* node) {
1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UNIMPLEMENTED();
1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitRoundInt64ToFloat32(Node* node) {
1682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitRoundInt64ToFloat64(Node* node) {
1687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitRoundUint64ToFloat32(Node* node) {
1692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitRoundUint64ToFloat64(Node* node) {
1697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitBitcastFloat64ToInt64(Node* node) {
1702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitBitcastInt64ToFloat64(Node* node) {
1707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNIMPLEMENTED();
1708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_TARGET_ARCH_32_BIT
1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// 64 bit targets do not implement the following instructions.
17123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#if V8_TARGET_ARCH_64_BIT
17133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid InstructionSelector::VisitInt32PairAdd(Node* node) { UNIMPLEMENTED(); }
17143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid InstructionSelector::VisitInt32PairSub(Node* node) { UNIMPLEMENTED(); }
17163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid InstructionSelector::VisitInt32PairMul(Node* node) { UNIMPLEMENTED(); }
17183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid InstructionSelector::VisitWord32PairShl(Node* node) { UNIMPLEMENTED(); }
17203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid InstructionSelector::VisitWord32PairShr(Node* node) { UNIMPLEMENTED(); }
17223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
17233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid InstructionSelector::VisitWord32PairSar(Node* node) { UNIMPLEMENTED(); }
17243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif  // V8_TARGET_ARCH_64_BIT
1725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1726f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#if !V8_TARGET_ARCH_X64
1727f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid InstructionSelector::VisitCreateInt32x4(Node* node) { UNIMPLEMENTED(); }
1728f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1729f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid InstructionSelector::VisitInt32x4ExtractLane(Node* node) {
1730f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  UNIMPLEMENTED();
1731f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
1732f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#endif  // !V8_TARGET_ARCH_X64
1733f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
173413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitFinishRegion(Node* node) { EmitIdentity(node); }
1735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitParameter(Node* node) {
1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OperandGenerator g(this);
1738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int index = ParameterIndexOf(node->op());
1739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstructionOperand op =
1740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      linkage()->ParameterHasSecondaryLocation(index)
1741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          ? g.DefineAsDualLocation(
1742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                node, linkage()->GetParameterLocation(index),
1743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                linkage()->GetParameterSecondaryLocation(index))
1744f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          : g.DefineAsLocation(node, linkage()->GetParameterLocation(index));
1745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Emit(kArchNop, op);
1747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1749f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace {
1750f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochLinkageLocation ExceptionLocation() {
1751f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return LinkageLocation::ForRegister(kReturnRegister0.code(),
1752f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                      MachineType::IntPtr());
1753f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
1754f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
1755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitIfException(Node* node) {
1757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OperandGenerator g(this);
1758f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_EQ(IrOpcode::kCall, node->InputAt(1)->opcode());
1759f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Emit(kArchNop, g.DefineAsLocation(node, ExceptionLocation()));
1760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitOsrValue(Node* node) {
1764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OperandGenerator g(this);
1765c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  int index = OsrValueIndexOf(node->op());
1766f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Emit(kArchNop,
1767f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch       g.DefineAsLocation(node, linkage()->GetOsrValueLocation(index)));
1768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitPhi(Node* node) {
1772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const int input_count = node->op()->ValueInputCount();
1773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PhiInstruction* phi = new (instruction_zone())
1774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      PhiInstruction(instruction_zone(), GetVirtualRegister(node),
1775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                     static_cast<size_t>(input_count));
1776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  sequence()
1777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ->InstructionBlockAt(RpoNumber::FromInt(current_block_->rpo_number()))
1778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ->AddPhi(phi);
1779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  for (int i = 0; i < input_count; ++i) {
1780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Node* const input = node->InputAt(i);
1781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    MarkAsUsed(input);
1782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    phi->SetInput(static_cast<size_t>(i), GetVirtualRegister(input));
1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitProjection(Node* node) {
1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OperandGenerator g(this);
1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Node* value = node->InputAt(0);
1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (value->opcode()) {
1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32AddWithOverflow:
1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case IrOpcode::kInt32SubWithOverflow:
1793f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case IrOpcode::kInt32MulWithOverflow:
1794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kInt64AddWithOverflow:
1795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kInt64SubWithOverflow:
1796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kTryTruncateFloat32ToInt64:
1797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kTryTruncateFloat64ToInt64:
1798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kTryTruncateFloat32ToUint64:
1799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IrOpcode::kTryTruncateFloat64ToUint64:
18003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kInt32PairAdd:
18013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kInt32PairSub:
18023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kInt32PairMul:
18033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kWord32PairShl:
18043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kWord32PairShr:
18053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IrOpcode::kWord32PairSar:
1806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (ProjectionIndexOf(node->op()) == 0u) {
1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(value));
1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
1809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK(ProjectionIndexOf(node->op()) == 1u);
1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        MarkAsUsed(value);
1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid InstructionSelector::VisitConstant(Node* node) {
1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We must emit a NOP here because every live range needs a defining
1821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // instruction in the register allocator.
1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OperandGenerator g(this);
1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Emit(kArchNop, g.DefineAsConstant(node));
1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitCall(Node* node, BasicBlock* handler) {
1828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OperandGenerator g(this);
1829bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  const CallDescriptor* descriptor = CallDescriptorOf(node->op());
1830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FrameStateDescriptor* frame_state_descriptor = nullptr;
1832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (descriptor->NeedsFrameState()) {
1833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    frame_state_descriptor = GetFrameStateDescriptor(
1834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        node->InputAt(static_cast<int>(descriptor->InputCount())));
1835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CallBuffer buffer(zone(), descriptor, frame_state_descriptor);
1838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Compute InstructionOperands for inputs and outputs.
1840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // TODO(turbofan): on some architectures it's probably better to use
1841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // the code object in a register if there are multiple uses of it.
1842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Improve constant pool and the heuristics in the register allocator
1843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // for where to emit constants.
1844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CallBufferFlags call_buffer_flags(kCallCodeImmediate | kCallAddressImmediate);
1845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InitializeCallBuffer(node, &buffer, call_buffer_flags);
1846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EmitPrepareArguments(&(buffer.pushed_nodes), descriptor, node);
1848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Pass label of exception handler block.
1850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CallDescriptor::Flags flags = descriptor->flags();
1851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (handler) {
1852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_EQ(IrOpcode::kIfException, handler->front()->opcode());
1853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    flags |= CallDescriptor::kHasExceptionHandler;
1854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    buffer.instruction_args.push_back(g.Label(handler));
1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
18573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool from_native_stack = linkage()->GetIncomingDescriptor()->UseNativeStack();
18583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool to_native_stack = descriptor->UseNativeStack();
18593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (from_native_stack != to_native_stack) {
18603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // (arm64 only) Mismatch in the use of stack pointers. One or the other
18613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // has to be restored manually by the code generator.
18623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    flags |= to_native_stack ? CallDescriptor::kRestoreJSSP
18633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                             : CallDescriptor::kRestoreCSP;
1864109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
1865109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Select the appropriate opcode based on the call type.
1867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstructionCode opcode = kArchNop;
1868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (descriptor->kind()) {
1869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case CallDescriptor::kCallAddress:
1870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      opcode =
1871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kArchCallCFunction |
1872f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          MiscField::encode(static_cast<int>(descriptor->ParameterCount()));
1873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
1874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case CallDescriptor::kCallCodeObject:
1875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      opcode = kArchCallCodeObject | MiscField::encode(flags);
1876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
1877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case CallDescriptor::kCallJSFunction:
1878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      opcode = kArchCallJSFunction | MiscField::encode(flags);
1879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
1880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Emit the call instruction.
1883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t const output_count = buffer.outputs.size();
1884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  auto* outputs = output_count ? &buffer.outputs.front() : nullptr;
1885f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Instruction* call_instr =
1886f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Emit(opcode, output_count, outputs, buffer.instruction_args.size(),
1887f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch           &buffer.instruction_args.front());
1888f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (instruction_selection_failed()) return;
1889f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  call_instr->MarkAsCall();
1890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitTailCall(Node* node) {
1894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OperandGenerator g(this);
1895bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  CallDescriptor const* descriptor = CallDescriptorOf(node->op());
1896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_NE(0, descriptor->flags() & CallDescriptor::kSupportsTailCalls);
1897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1898f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CallDescriptor* caller = linkage()->GetIncomingDescriptor();
1899c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK(caller->CanTailCall(node));
1900c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  const CallDescriptor* callee = CallDescriptorOf(node->op());
1901c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  int stack_param_delta = callee->GetStackParameterDelta(caller);
1902c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  CallBuffer buffer(zone(), descriptor, nullptr);
1903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1904c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Compute InstructionOperands for inputs and outputs.
1905c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  CallBufferFlags flags(kCallCodeImmediate | kCallTail);
1906c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (IsTailCallAddressImmediate()) {
1907c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    flags |= kCallAddressImmediate;
1908c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
1909c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  InitializeCallBuffer(node, &buffer, flags, stack_param_delta);
1910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1911c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Select the appropriate opcode based on the call type.
1912c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  InstructionCode opcode;
1913c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  InstructionOperandVector temps(zone());
1914c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) {
1915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    switch (descriptor->kind()) {
1916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case CallDescriptor::kCallCodeObject:
1917c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        opcode = kArchTailCallCodeObjectFromJSFunction;
1918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        break;
1919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case CallDescriptor::kCallJSFunction:
1920c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        opcode = kArchTailCallJSFunctionFromJSFunction;
1921c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        break;
1922c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      default:
1923c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        UNREACHABLE();
1924c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        return;
1925c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
1926c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    int temps_count = GetTempsCountForTailCallFromJSFunction();
1927c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    for (int i = 0; i < temps_count; i++) {
1928c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      temps.push_back(g.TempRegister());
1929c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    }
1930c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  } else {
1931c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    switch (descriptor->kind()) {
1932c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      case CallDescriptor::kCallCodeObject:
1933c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        opcode = kArchTailCallCodeObject;
1934c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        break;
1935c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      case CallDescriptor::kCallAddress:
1936c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        opcode = kArchTailCallAddress;
1937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        break;
1938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      default:
1939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        UNREACHABLE();
1940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return;
1941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1943c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  opcode |= MiscField::encode(descriptor->flags());
1944c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1945c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Emit(kArchPrepareTailCall, g.NoOutput());
1946c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1947c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  int first_unused_stack_slot =
1948c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      (V8_TARGET_ARCH_STORES_RETURN_ADDRESS_ON_STACK ? 1 : 0) +
1949c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      stack_param_delta;
1950c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  buffer.instruction_args.push_back(g.TempImmediate(first_unused_stack_slot));
1951c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1952c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Emit the tailcall instruction.
1953c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Emit(opcode, 0, nullptr, buffer.instruction_args.size(),
1954c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch       &buffer.instruction_args.front(), temps.size(),
1955c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch       temps.empty() ? nullptr : &temps.front());
1956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitGoto(BasicBlock* target) {
1960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // jump to the next block.
1961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OperandGenerator g(this);
1962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Emit(kArchJmp, g.NoOutput(), g.Label(target));
1963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitReturn(Node* ret) {
1966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OperandGenerator g(this);
1967c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  const int input_count = linkage()->GetIncomingDescriptor()->ReturnCount() == 0
1968c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                              ? 1
1969c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                              : ret->op()->ValueInputCount();
1970c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_GE(input_count, 1);
1971c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  auto value_locations = zone()->NewArray<InstructionOperand>(input_count);
1972c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Node* pop_count = ret->InputAt(0);
1973c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  value_locations[0] = pop_count->opcode() == IrOpcode::kInt32Constant
1974c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                           ? g.UseImmediate(pop_count)
1975c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                           : g.UseRegister(pop_count);
1976c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  for (int i = 1; i < input_count; ++i) {
1977c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    value_locations[i] =
1978c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        g.UseLocation(ret->InputAt(i), linkage()->GetReturnLocation(i - 1));
1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1980c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Emit(kArchRet, 0, nullptr, input_count, value_locations);
1981c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
1982c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1983c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochInstruction* InstructionSelector::EmitDeoptimize(InstructionCode opcode,
1984c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                 InstructionOperand output,
1985c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                 InstructionOperand a,
1986c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                 DeoptimizeReason reason,
1987c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                 Node* frame_state) {
1988c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  size_t output_count = output.IsInvalid() ? 0 : 1;
1989c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  InstructionOperand inputs[] = {a};
1990c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  size_t input_count = arraysize(inputs);
1991c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return EmitDeoptimize(opcode, output_count, &output, input_count, inputs,
1992c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                        reason, frame_state);
1993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1995f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochInstruction* InstructionSelector::EmitDeoptimize(
1996f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstructionCode opcode, InstructionOperand output, InstructionOperand a,
1997f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InstructionOperand b, DeoptimizeReason reason, Node* frame_state) {
19983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  size_t output_count = output.IsInvalid() ? 0 : 1;
19993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  InstructionOperand inputs[] = {a, b};
20003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  size_t input_count = arraysize(inputs);
20013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return EmitDeoptimize(opcode, output_count, &output, input_count, inputs,
2002f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                        reason, frame_state);
20033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
20053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochInstruction* InstructionSelector::EmitDeoptimize(
20063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    InstructionCode opcode, size_t output_count, InstructionOperand* outputs,
2007f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    size_t input_count, InstructionOperand* inputs, DeoptimizeReason reason,
2008f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Node* frame_state) {
2009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OperandGenerator g(this);
20103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  FrameStateDescriptor* const descriptor = GetFrameStateDescriptor(frame_state);
2011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstructionOperandVector args(instruction_zone());
20123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  args.reserve(input_count + 1 + descriptor->GetTotalSize());
20133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  for (size_t i = 0; i < input_count; ++i) {
20143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    args.push_back(inputs[i]);
20153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
20163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  opcode |= MiscField::encode(static_cast<int>(input_count));
2017f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  int const state_id = sequence()->AddDeoptimizationEntry(descriptor, reason);
2018f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  args.push_back(g.TempImmediate(state_id));
2019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  StateObjectDeduplicator deduplicator(instruction_zone());
20203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  AddInputsToFrameStateDescriptor(descriptor, frame_state, &g, &deduplicator,
20213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                  &args, FrameStateInputKind::kAny,
2022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                  instruction_zone());
20233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return Emit(opcode, output_count, outputs, args.size(), &args.front(), 0,
20243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch              nullptr);
20253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
202713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::EmitIdentity(Node* node) {
202813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  OperandGenerator g(this);
2029f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  MarkAsUsed(node->InputAt(0));
2030f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  SetRename(node, node->InputAt(0));
203113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
203213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
2033f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitDeoptimize(DeoptimizeKind kind,
2034f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                          DeoptimizeReason reason,
2035f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                          Node* value) {
2036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstructionCode opcode = kArchDeoptimize;
2037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (kind) {
2038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case DeoptimizeKind::kEager:
2039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      opcode |= MiscField::encode(Deoptimizer::EAGER);
2040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
2041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case DeoptimizeKind::kSoft:
2042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      opcode |= MiscField::encode(Deoptimizer::SOFT);
2043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
2044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2045f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EmitDeoptimize(opcode, 0, nullptr, 0, nullptr, reason, value);
2046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InstructionSelector::VisitThrow(Node* value) {
2050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OperandGenerator g(this);
2051109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Emit(kArchThrowTerminator, g.NoOutput());
2052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
205413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitDebugBreak(Node* node) {
205513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  OperandGenerator g(this);
205613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Emit(kArchDebugBreak, g.NoOutput());
205713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
205813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
205913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid InstructionSelector::VisitComment(Node* node) {
206013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  OperandGenerator g(this);
206113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  InstructionOperand operand(g.UseImmediate(node));
206213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Emit(kArchComment, 0, nullptr, 1, &operand);
206313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
206413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
2065f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitUnsafePointerAdd(Node* node) {
2066f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if V8_TARGET_ARCH_64_BIT
2067f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VisitInt64Add(node);
2068f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#else   // V8_TARGET_ARCH_64_BIT
2069f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VisitInt32Add(node);
2070f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif  // V8_TARGET_ARCH_64_BIT
2071f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
2072f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2073f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid InstructionSelector::VisitRetain(Node* node) {
2074f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  OperandGenerator g(this);
2075f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Emit(kArchNop, g.NoOutput(), g.UseAny(node->InputAt(0)));
2076f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
2077f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
207813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbool InstructionSelector::CanProduceSignalingNaN(Node* node) {
207913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // TODO(jarin) Improve the heuristic here.
208013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (node->opcode() == IrOpcode::kFloat64Add ||
208113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      node->opcode() == IrOpcode::kFloat64Sub ||
208213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      node->opcode() == IrOpcode::kFloat64Mul) {
208313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return false;
208413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
208513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return true;
208613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
2087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochFrameStateDescriptor* InstructionSelector::GetFrameStateDescriptor(
2089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node* state) {
2090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(state->opcode() == IrOpcode::kFrameState);
2091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(kFrameStateInputCount, state->InputCount());
2092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FrameStateInfo state_info = OpParameter<FrameStateInfo>(state);
2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int parameters = static_cast<int>(
2095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      StateValuesAccess(state->InputAt(kFrameStateParametersInput)).size());
2096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int locals = static_cast<int>(
2097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      StateValuesAccess(state->InputAt(kFrameStateLocalsInput)).size());
2098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int stack = static_cast<int>(
2099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      StateValuesAccess(state->InputAt(kFrameStateStackInput)).size());
2100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(parameters, state_info.parameter_count());
2102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(locals, state_info.local_count());
2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FrameStateDescriptor* outer_state = nullptr;
2105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* outer_node = state->InputAt(kFrameStateOuterStateInput);
2106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (outer_node->opcode() == IrOpcode::kFrameState) {
2107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    outer_state = GetFrameStateDescriptor(outer_node);
2108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (instruction_zone()) FrameStateDescriptor(
2111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      instruction_zone(), state_info.type(), state_info.bailout_id(),
2112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      state_info.state_combine(), parameters, locals, stack,
2113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      state_info.shared_info(), outer_state);
2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
2120