LCOV - code coverage report
Current view: top level - src/compiler/backend - instruction-selector.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 1029 1232 83.5 %
Date: 2019-02-19 Functions: 82 142 57.7 %

          Line data    Source code
       1             : // Copyright 2014 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #include "src/compiler/backend/instruction-selector.h"
       6             : 
       7             : #include <limits>
       8             : 
       9             : #include "src/assembler-inl.h"
      10             : #include "src/base/adapters.h"
      11             : #include "src/compiler/backend/instruction-selector-impl.h"
      12             : #include "src/compiler/compiler-source-position-table.h"
      13             : #include "src/compiler/node-matchers.h"
      14             : #include "src/compiler/pipeline.h"
      15             : #include "src/compiler/schedule.h"
      16             : #include "src/compiler/state-values-utils.h"
      17             : #include "src/deoptimizer.h"
      18             : 
      19             : namespace v8 {
      20             : namespace internal {
      21             : namespace compiler {
      22             : 
      23     2141604 : InstructionSelector::InstructionSelector(
      24             :     Zone* zone, size_t node_count, Linkage* linkage,
      25     6424994 :     InstructionSequence* sequence, Schedule* schedule,
      26             :     SourcePositionTable* source_positions, Frame* frame,
      27             :     EnableSwitchJumpTable enable_switch_jump_table,
      28             :     SourcePositionMode source_position_mode, Features features,
      29             :     EnableScheduling enable_scheduling,
      30             :     EnableRootsRelativeAddressing enable_roots_relative_addressing,
      31             :     PoisoningMitigationLevel poisoning_level, EnableTraceTurboJson trace_turbo)
      32             :     : zone_(zone),
      33             :       linkage_(linkage),
      34             :       sequence_(sequence),
      35             :       source_positions_(source_positions),
      36             :       source_position_mode_(source_position_mode),
      37             :       features_(features),
      38             :       schedule_(schedule),
      39             :       current_block_(nullptr),
      40             :       instructions_(zone),
      41             :       continuation_inputs_(sequence->zone()),
      42             :       continuation_outputs_(sequence->zone()),
      43             :       defined_(node_count, false, zone),
      44             :       used_(node_count, false, zone),
      45             :       effect_level_(node_count, 0, zone),
      46             :       virtual_registers_(node_count,
      47             :                          InstructionOperand::kInvalidVirtualRegister, zone),
      48             :       virtual_register_rename_(zone),
      49             :       scheduler_(nullptr),
      50             :       enable_scheduling_(enable_scheduling),
      51             :       enable_roots_relative_addressing_(enable_roots_relative_addressing),
      52             :       enable_switch_jump_table_(enable_switch_jump_table),
      53             :       poisoning_level_(poisoning_level),
      54             :       frame_(frame),
      55             :       instruction_selection_failed_(false),
      56             :       instr_origins_(sequence->zone()),
      57     6425176 :       trace_turbo_(trace_turbo) {
      58     2141786 :   instructions_.reserve(node_count);
      59     2141789 :   continuation_inputs_.reserve(5);
      60     2141805 :   continuation_outputs_.reserve(2);
      61             : 
      62     2141814 :   if (trace_turbo_ == kEnableTraceTurboJson) {
      63           4 :     instr_origins_.assign(node_count, {-1, 0});
      64             :   }
      65     2141814 : }
      66             : 
      67    43169505 : bool InstructionSelector::SelectInstructions() {
      68             :   // Mark the inputs of all phis in loop headers as used.
      69             :   BasicBlockVector* blocks = schedule()->rpo_order();
      70    23725458 :   for (auto const block : *blocks) {
      71    19441938 :     if (!block->IsLoopHeader()) continue;
      72             :     DCHECK_LE(2u, block->PredecessorCount());
      73     2506738 :     for (Node* const phi : *block) {
      74     2019674 :       if (phi->opcode() != IrOpcode::kPhi) continue;
      75             : 
      76             :       // Mark all inputs as used.
      77     1879927 :       for (Node* const input : phi->inputs()) {
      78             :         MarkAsUsed(input);
      79             :       }
      80             :     }
      81             :   }
      82             : 
      83             :   // Visit each basic block in post order.
      84    21583747 :   for (auto i = blocks->rbegin(); i != blocks->rend(); ++i) {
      85    19442015 :     VisitBlock(*i);
      86    19441970 :     if (instruction_selection_failed()) return false;
      87             :   }
      88             : 
      89             :   // Schedule the selected instructions.
      90     2141732 :   if (UseInstructionScheduling()) {
      91        2172 :     scheduler_ = new (zone()) InstructionScheduler(zone(), sequence());
      92             :   }
      93             : 
      94    62609334 :   for (auto const block : *blocks) {
      95    38883918 :     InstructionBlock* instruction_block =
      96    19441871 :         sequence()->InstructionBlockAt(RpoNumber::FromInt(block->rpo_number()));
      97    43081510 :     for (size_t i = 0; i < instruction_block->phis().size(); i++) {
      98     2098796 :       UpdateRenamesInPhi(instruction_block->PhiAt(i));
      99             :     }
     100    19441959 :     size_t end = instruction_block->code_end();
     101    19441959 :     size_t start = instruction_block->code_start();
     102             :     DCHECK_LE(end, start);
     103    19441959 :     StartBlock(RpoNumber::FromInt(block->rpo_number()));
     104    19441879 :     if (end != start) {
     105    63174757 :       while (start-- > end + 1) {
     106   126349573 :         UpdateRenames(instructions_[start]);
     107    43732959 :         AddInstruction(instructions_[start]);
     108             :       }
     109    19441922 :       UpdateRenames(instructions_[end]);
     110    19441981 :       AddTerminator(instructions_[end]);
     111             :     }
     112    19441918 :     EndBlock(RpoNumber::FromInt(block->rpo_number()));
     113             :   }
     114             : #if DEBUG
     115             :   sequence()->ValidateSSA();
     116             : #endif
     117             :   return true;
     118             : }
     119             : 
     120    38743234 : void InstructionSelector::StartBlock(RpoNumber rpo) {
     121    19441796 :   if (UseInstructionScheduling()) {
     122             :     DCHECK_NOT_NULL(scheduler_);
     123      140358 :     scheduler_->StartBlock(rpo);
     124             :   } else {
     125    19301438 :     sequence()->StartBlock(rpo);
     126             :   }
     127    19441885 : }
     128             : 
     129    38743458 : void InstructionSelector::EndBlock(RpoNumber rpo) {
     130    19441908 :   if (UseInstructionScheduling()) {
     131             :     DCHECK_NOT_NULL(scheduler_);
     132      140358 :     scheduler_->EndBlock(rpo);
     133             :   } else {
     134    19301550 :     sequence()->EndBlock(rpo);
     135             :   }
     136    19442002 : }
     137             : 
     138    38743524 : void InstructionSelector::AddTerminator(Instruction* instr) {
     139    19441941 :   if (UseInstructionScheduling()) {
     140             :     DCHECK_NOT_NULL(scheduler_);
     141      140358 :     scheduler_->AddTerminator(instr);
     142             :   } else {
     143    19301583 :     sequence()->AddInstruction(instr);
     144             :   }
     145    19441959 : }
     146             : 
     147    87260074 : void InstructionSelector::AddInstruction(Instruction* instr) {
     148    43732930 :   if (UseInstructionScheduling()) {
     149             :     DCHECK_NOT_NULL(scheduler_);
     150      205786 :     scheduler_->AddInstruction(instr);
     151             :   } else {
     152    43527144 :     sequence()->AddInstruction(instr);
     153             :   }
     154    43732937 : }
     155             : 
     156    16728174 : Instruction* InstructionSelector::Emit(InstructionCode opcode,
     157             :                                        InstructionOperand output,
     158             :                                        size_t temp_count,
     159             :                                        InstructionOperand* temps) {
     160    16728174 :   size_t output_count = output.IsInvalid() ? 0 : 1;
     161    16728174 :   return Emit(opcode, output_count, &output, 0, nullptr, temp_count, temps);
     162             : }
     163             : 
     164    13836090 : Instruction* InstructionSelector::Emit(InstructionCode opcode,
     165             :                                        InstructionOperand output,
     166             :                                        InstructionOperand a, size_t temp_count,
     167             :                                        InstructionOperand* temps) {
     168    13836090 :   size_t output_count = output.IsInvalid() ? 0 : 1;
     169    13836090 :   return Emit(opcode, output_count, &output, 1, &a, temp_count, temps);
     170             : }
     171             : 
     172     1363820 : Instruction* InstructionSelector::Emit(InstructionCode opcode,
     173             :                                        InstructionOperand output,
     174             :                                        InstructionOperand a,
     175             :                                        InstructionOperand b, size_t temp_count,
     176             :                                        InstructionOperand* temps) {
     177     1363820 :   size_t output_count = output.IsInvalid() ? 0 : 1;
     178     1363820 :   InstructionOperand inputs[] = {a, b};
     179             :   size_t input_count = arraysize(inputs);
     180             :   return Emit(opcode, output_count, &output, input_count, inputs, temp_count,
     181     1363820 :               temps);
     182             : }
     183             : 
     184        1988 : Instruction* InstructionSelector::Emit(InstructionCode opcode,
     185             :                                        InstructionOperand output,
     186             :                                        InstructionOperand a,
     187             :                                        InstructionOperand b,
     188             :                                        InstructionOperand c, size_t temp_count,
     189             :                                        InstructionOperand* temps) {
     190        1988 :   size_t output_count = output.IsInvalid() ? 0 : 1;
     191        1988 :   InstructionOperand inputs[] = {a, b, c};
     192             :   size_t input_count = arraysize(inputs);
     193             :   return Emit(opcode, output_count, &output, input_count, inputs, temp_count,
     194        1988 :               temps);
     195             : }
     196             : 
     197           0 : Instruction* InstructionSelector::Emit(
     198             :     InstructionCode opcode, InstructionOperand output, InstructionOperand a,
     199             :     InstructionOperand b, InstructionOperand c, InstructionOperand d,
     200             :     size_t temp_count, InstructionOperand* temps) {
     201           0 :   size_t output_count = output.IsInvalid() ? 0 : 1;
     202           0 :   InstructionOperand inputs[] = {a, b, c, d};
     203             :   size_t input_count = arraysize(inputs);
     204             :   return Emit(opcode, output_count, &output, input_count, inputs, temp_count,
     205           0 :               temps);
     206             : }
     207             : 
     208           0 : Instruction* InstructionSelector::Emit(
     209             :     InstructionCode opcode, InstructionOperand output, InstructionOperand a,
     210             :     InstructionOperand b, InstructionOperand c, InstructionOperand d,
     211             :     InstructionOperand e, size_t temp_count, InstructionOperand* temps) {
     212           0 :   size_t output_count = output.IsInvalid() ? 0 : 1;
     213           0 :   InstructionOperand inputs[] = {a, b, c, d, e};
     214             :   size_t input_count = arraysize(inputs);
     215             :   return Emit(opcode, output_count, &output, input_count, inputs, temp_count,
     216           0 :               temps);
     217             : }
     218             : 
     219           0 : Instruction* InstructionSelector::Emit(
     220             :     InstructionCode opcode, InstructionOperand output, InstructionOperand a,
     221             :     InstructionOperand b, InstructionOperand c, InstructionOperand d,
     222             :     InstructionOperand e, InstructionOperand f, size_t temp_count,
     223             :     InstructionOperand* temps) {
     224           0 :   size_t output_count = output.IsInvalid() ? 0 : 1;
     225           0 :   InstructionOperand inputs[] = {a, b, c, d, e, f};
     226             :   size_t input_count = arraysize(inputs);
     227             :   return Emit(opcode, output_count, &output, input_count, inputs, temp_count,
     228           0 :               temps);
     229             : }
     230             : 
     231    61033571 : Instruction* InstructionSelector::Emit(
     232             :     InstructionCode opcode, size_t output_count, InstructionOperand* outputs,
     233             :     size_t input_count, InstructionOperand* inputs, size_t temp_count,
     234             :     InstructionOperand* temps) {
     235   122067142 :   if (output_count >= Instruction::kMaxOutputCount ||
     236   122067068 :       input_count >= Instruction::kMaxInputCount ||
     237             :       temp_count >= Instruction::kMaxTempCount) {
     238             :     set_instruction_selection_failed();
     239           9 :     return nullptr;
     240             :   }
     241             : 
     242             :   Instruction* instr =
     243             :       Instruction::New(instruction_zone(), opcode, output_count, outputs,
     244    61033562 :                        input_count, inputs, temp_count, temps);
     245    61033409 :   return Emit(instr);
     246             : }
     247             : 
     248           0 : Instruction* InstructionSelector::Emit(Instruction* instr) {
     249    63174168 :   instructions_.push_back(instr);
     250    61033409 :   return instr;
     251             : }
     252             : 
     253    45990075 : bool InstructionSelector::CanCover(Node* user, Node* node) const {
     254             :   // 1. Both {user} and {node} must be in the same basic block.
     255    25333092 :   if (schedule()->block(node) != schedule()->block(user)) {
     256             :     return false;
     257             :   }
     258             :   // 2. Pure {node}s must be owned by the {user}.
     259    11726826 :   if (node->op()->HasProperty(Operator::kPure)) {
     260     8930157 :     return node->OwnedBy(user);
     261             :   }
     262             :   // 3. Impure {node}s must match the effect level of {user}.
     263     2796669 :   if (GetEffectLevel(node) != GetEffectLevel(user)) {
     264             :     return false;
     265             :   }
     266             :   // 4. Only {node} must have value edges pointing to {user}.
     267    20138197 :   for (Edge const edge : node->use_edges()) {
     268     7395946 :     if (edge.from() != user && NodeProperties::IsValueEdge(edge)) {
     269      169723 :       return false;
     270             :     }
     271             :   }
     272     2588297 :   return true;
     273             : }
     274             : 
     275      736739 : bool InstructionSelector::CanCoverTransitively(Node* user, Node* node,
     276      268481 :                                                Node* node_input) const {
     277      468258 :   if (CanCover(user, node) && CanCover(node, node_input)) {
     278             :     // If {node} is pure, transitivity might not hold.
     279      268481 :     if (node->op()->HasProperty(Operator::kPure)) {
     280             :       // If {node_input} is pure, the effect levels do not matter.
     281      268481 :       if (node_input->op()->HasProperty(Operator::kPure)) return true;
     282             :       // Otherwise, {user} and {node_input} must have the same effect level.
     283      264150 :       return GetEffectLevel(user) == GetEffectLevel(node_input);
     284             :     }
     285             :     return true;
     286             :   }
     287             :   return false;
     288             : }
     289             : 
     290      147378 : bool InstructionSelector::IsOnlyUserOfNodeInSameBlock(Node* user,
     291      341808 :                                                       Node* node) const {
     292      147378 :   BasicBlock* bb_user = schedule()->block(user);
     293      147380 :   BasicBlock* bb_node = schedule()->block(node);
     294      147382 :   if (bb_user != bb_node) return false;
     295      456612 :   for (Edge const edge : node->use_edges()) {
     296             :     Node* from = edge.from();
     297      230054 :     if ((from != user) && (schedule()->block(from) == bb_user)) {
     298             :       return false;
     299             :     }
     300             :   }
     301      135033 :   return true;
     302             : }
     303             : 
     304   259114766 : void InstructionSelector::UpdateRenames(Instruction* instruction) {
     305   391880998 :   for (size_t i = 0; i < instruction->InputCount(); i++) {
     306   132765995 :     TryRename(instruction->InputAt(i));
     307             :   }
     308    63174504 : }
     309             : 
     310     2098797 : void InstructionSelector::UpdateRenamesInPhi(PhiInstruction* phi) {
     311    14358646 :   for (size_t i = 0; i < phi->operands().size(); i++) {
     312     5080521 :     int vreg = phi->operands()[i];
     313             :     int renamed = GetRename(vreg);
     314     5080521 :     if (vreg != renamed) {
     315      301954 :       phi->RenameInput(i, renamed);
     316             :     }
     317             :   }
     318     2098802 : }
     319             : 
     320           0 : int InstructionSelector::GetRename(int virtual_register) {
     321             :   int rename = virtual_register;
     322             :   while (true) {
     323   155672038 :     if (static_cast<size_t>(rename) >= virtual_register_rename_.size()) break;
     324    45992751 :     int next = virtual_register_rename_[rename];
     325    45992751 :     if (next == InstructionOperand::kInvalidVirtualRegister) {
     326             :       break;
     327             :     }
     328             :     rename = next;
     329             :   }
     330           0 :   return rename;
     331             : }
     332             : 
     333   132766052 : void InstructionSelector::TryRename(InstructionOperand* op) {
     334   265532104 :   if (!op->IsUnallocated()) return;
     335             :   UnallocatedOperand* unalloc = UnallocatedOperand::cast(op);
     336             :   int vreg = unalloc->virtual_register();
     337             :   int rename = GetRename(vreg);
     338    69959478 :   if (rename != vreg) {
     339     2490817 :     *unalloc = UnallocatedOperand(*unalloc, rename);
     340             :   }
     341             : }
     342             : 
     343     2493658 : void InstructionSelector::SetRename(const Node* node, const Node* rename) {
     344     2493658 :   int vreg = GetVirtualRegister(node);
     345     7480981 :   if (static_cast<size_t>(vreg) >= virtual_register_rename_.size()) {
     346     2185573 :     int invalid = InstructionOperand::kInvalidVirtualRegister;
     347     2185573 :     virtual_register_rename_.resize(vreg + 1, invalid);
     348             :   }
     349     2493661 :   virtual_register_rename_[vreg] = GetVirtualRegister(rename);
     350     2493665 : }
     351             : 
     352   189449924 : int InstructionSelector::GetVirtualRegister(const Node* node) {
     353             :   DCHECK_NOT_NULL(node);
     354   149202770 :   size_t const id = node->id();
     355             :   DCHECK_LT(id, virtual_registers_.size());
     356   338652695 :   int virtual_register = virtual_registers_[id];
     357   149202770 :   if (virtual_register == InstructionOperand::kInvalidVirtualRegister) {
     358    40247154 :     virtual_register = sequence()->NextVirtualRegister();
     359    40247155 :     virtual_registers_[id] = virtual_register;
     360             :   }
     361   149202771 :   return virtual_register;
     362             : }
     363             : 
     364         250 : const std::map<NodeId, int> InstructionSelector::GetVirtualRegistersForTesting()
     365             :     const {
     366             :   std::map<NodeId, int> virtual_registers;
     367        4772 :   for (size_t n = 0; n < virtual_registers_.size(); ++n) {
     368        4522 :     if (virtual_registers_[n] != InstructionOperand::kInvalidVirtualRegister) {
     369         728 :       NodeId const id = static_cast<NodeId>(n);
     370        1456 :       virtual_registers.insert(std::make_pair(id, virtual_registers_[n]));
     371             :     }
     372             :   }
     373         250 :   return virtual_registers;
     374             : }
     375             : 
     376    48256104 : bool InstructionSelector::IsDefined(Node* node) const {
     377             :   DCHECK_NOT_NULL(node);
     378    48256104 :   size_t const id = node->id();
     379             :   DCHECK_LT(id, defined_.size());
     380    49266793 :   return defined_[id];
     381             : }
     382             : 
     383    35067869 : void InstructionSelector::MarkAsDefined(Node* node) {
     384             :   DCHECK_NOT_NULL(node);
     385    35067869 :   size_t const id = node->id();
     386             :   DCHECK_LT(id, defined_.size());
     387    35067869 :   defined_[id] = true;
     388    12255804 : }
     389             : 
     390   205023417 : bool InstructionSelector::IsUsed(Node* node) const {
     391             :   DCHECK_NOT_NULL(node);
     392             :   // TODO(bmeurer): This is a terrible monster hack, but we have to make sure
     393             :   // that the Retain is actually emitted, otherwise the GC will mess up.
     394   108886046 :   if (node->opcode() == IrOpcode::kRetain) return true;
     395   108877363 :   if (!node->op()->HasProperty(Operator::kEliminatable)) return true;
     396    96137371 :   size_t const id = node->id();
     397             :   DCHECK_LT(id, used_.size());
     398   192274742 :   return used_[id];
     399             : }
     400             : 
     401    82421687 : void InstructionSelector::MarkAsUsed(Node* node) {
     402             :   DCHECK_NOT_NULL(node);
     403    82421687 :   size_t const id = node->id();
     404             :   DCHECK_LT(id, used_.size());
     405    82421687 :   used_[id] = true;
     406     8534952 : }
     407             : 
     408    21240151 : int InstructionSelector::GetEffectLevel(Node* node) const {
     409             :   DCHECK_NOT_NULL(node);
     410    21240151 :   size_t const id = node->id();
     411             :   DCHECK_LT(id, effect_level_.size());
     412    39419483 :   return effect_level_[id];
     413             : }
     414             : 
     415   116400666 : void InstructionSelector::SetEffectLevel(Node* node, int effect_level) {
     416             :   DCHECK_NOT_NULL(node);
     417   116400666 :   size_t const id = node->id();
     418             :   DCHECK_LT(id, effect_level_.size());
     419   232801332 :   effect_level_[id] = effect_level;
     420           0 : }
     421             : 
     422    12288051 : bool InstructionSelector::CanAddressRelativeToRootsRegister() const {
     423    19504236 :   return enable_roots_relative_addressing_ == kEnableRootsRelativeAddressing &&
     424    12288051 :          CanUseRootsRegister();
     425             : }
     426             : 
     427    10245481 : bool InstructionSelector::CanUseRootsRegister() const {
     428             :   return linkage()->GetIncomingDescriptor()->flags() &
     429     3029296 :          CallDescriptor::kCanUseRoots;
     430             : }
     431             : 
     432           0 : void InstructionSelector::MarkAsRepresentation(MachineRepresentation rep,
     433     5715970 :                                                const InstructionOperand& op) {
     434             :   UnallocatedOperand unalloc = UnallocatedOperand::cast(op);
     435     5715970 :   sequence()->MarkAsRepresentation(rep, unalloc.virtual_register());
     436           0 : }
     437             : 
     438    25411612 : void InstructionSelector::MarkAsRepresentation(MachineRepresentation rep,
     439    25411718 :                                                Node* node) {
     440    50823330 :   sequence()->MarkAsRepresentation(rep, GetVirtualRegister(node));
     441    25411961 : }
     442             : 
     443             : namespace {
     444             : 
     445    23808067 : InstructionOperand OperandForDeopt(Isolate* isolate, OperandGenerator* g,
     446    23808067 :                                    Node* input, FrameStateInputKind kind,
     447             :                                    MachineRepresentation rep) {
     448    23808067 :   if (rep == MachineRepresentation::kNone) {
     449           0 :     return g->TempImmediate(FrameStateDescriptor::kImpossibleValue);
     450             :   }
     451             : 
     452    23808067 :   switch (input->opcode()) {
     453             :     case IrOpcode::kInt32Constant:
     454             :     case IrOpcode::kInt64Constant:
     455             :     case IrOpcode::kNumberConstant:
     456             :     case IrOpcode::kFloat32Constant:
     457             :     case IrOpcode::kFloat64Constant:
     458             :     case IrOpcode::kDelayedStringConstant:
     459      660402 :       return g->UseImmediate(input);
     460             :     case IrOpcode::kHeapConstant: {
     461     5986621 :       if (!CanBeTaggedPointer(rep)) {
     462             :         // If we have inconsistent static and dynamic types, e.g. if we
     463             :         // smi-check a string, we can get here with a heap object that
     464             :         // says it is a smi. In that case, we return an invalid instruction
     465             :         // operand, which will be interpreted as an optimized-out value.
     466             : 
     467             :         // TODO(jarin) Ideally, we should turn the current instruction
     468             :         // into an abort (we should never execute it).
     469           0 :         return InstructionOperand();
     470             :       }
     471             : 
     472     5986621 :       Handle<HeapObject> constant = HeapConstantOf(input->op());
     473             :       RootIndex root_index;
     474     5986622 :       if (isolate->roots_table().IsRootHandle(constant, &root_index) &&
     475             :           root_index == RootIndex::kOptimizedOut) {
     476             :         // For an optimized-out object we return an invalid instruction
     477             :         // operand, so that we take the fast path for optimized-out values.
     478         336 :         return InstructionOperand();
     479             :       }
     480             : 
     481     5986286 :       return g->UseImmediate(input);
     482             :     }
     483             :     case IrOpcode::kArgumentsElementsState:
     484             :     case IrOpcode::kArgumentsLengthState:
     485             :     case IrOpcode::kObjectState:
     486             :     case IrOpcode::kTypedObjectState:
     487           0 :       UNREACHABLE();
     488             :       break;
     489             :     default:
     490    17161044 :       switch (kind) {
     491             :         case FrameStateInputKind::kStackSlot:
     492    14781638 :           return g->UseUniqueSlot(input);
     493             :         case FrameStateInputKind::kAny:
     494             :           // Currently deopts "wrap" other operations, so the deopt's inputs
     495             :           // are potentially needed until the end of the deoptimising code.
     496     2379406 :           return g->UseAnyAtEnd(input);
     497             :       }
     498             :   }
     499           0 :   UNREACHABLE();
     500             : }
     501             : 
     502             : }  // namespace
     503             : 
     504             : class StateObjectDeduplicator {
     505             :  public:
     506             :   explicit StateObjectDeduplicator(Zone* zone) : objects_(zone) {}
     507             :   static const size_t kNotDuplicated = SIZE_MAX;
     508             : 
     509      220850 :   size_t GetObjectId(Node* node) {
     510             :     DCHECK(node->opcode() == IrOpcode::kTypedObjectState ||
     511             :            node->opcode() == IrOpcode::kObjectId ||
     512             :            node->opcode() == IrOpcode::kArgumentsElementsState);
     513      397752 :     for (size_t i = 0; i < objects_.size(); ++i) {
     514      299295 :       if (objects_[i] == node) return i;
     515             :       // ObjectId nodes are the Turbofan way to express objects with the same
     516             :       // identity in the deopt info. So they should always be mapped to
     517             :       // previously appearing TypedObjectState nodes.
     518      299647 :       if (HasObjectId(objects_[i]) && HasObjectId(node) &&
     519      199228 :           ObjectIdOf(objects_[i]->op()) == ObjectIdOf(node->op())) {
     520             :         return i;
     521             :       }
     522             :     }
     523             :     DCHECK(node->opcode() == IrOpcode::kTypedObjectState ||
     524             :            node->opcode() == IrOpcode::kArgumentsElementsState);
     525             :     return kNotDuplicated;
     526             :   }
     527             : 
     528             :   size_t InsertObject(Node* node) {
     529             :     DCHECK(node->opcode() == IrOpcode::kTypedObjectState ||
     530             :            node->opcode() == IrOpcode::kObjectId ||
     531             :            node->opcode() == IrOpcode::kArgumentsElementsState);
     532       98457 :     size_t id = objects_.size();
     533      127416 :     objects_.push_back(node);
     534             :     return id;
     535             :   }
     536             : 
     537             :  private:
     538      200033 :   static bool HasObjectId(Node* node) {
     539      200033 :     return node->opcode() == IrOpcode::kTypedObjectState ||
     540             :            node->opcode() == IrOpcode::kObjectId;
     541             :   }
     542             : 
     543             :   ZoneVector<Node*> objects_;
     544             : };
     545             : 
     546             : // Returns the number of instruction operands added to inputs.
     547    51778367 : size_t InstructionSelector::AddOperandToStateValueDescriptor(
     548             :     StateValueList* values, InstructionOperandVector* inputs,
     549    24040022 :     OperandGenerator* g, StateObjectDeduplicator* deduplicator, Node* input,
     550             :     MachineType type, FrameStateInputKind kind, Zone* zone) {
     551    51778367 :   if (input == nullptr) {
     552    27836802 :     values->PushOptimizedOut();
     553    27836954 :     return 0;
     554             :   }
     555             : 
     556    23941565 :   switch (input->opcode()) {
     557             :     case IrOpcode::kArgumentsElementsState: {
     558        6180 :       values->PushArgumentsElements(ArgumentsStateTypeOf(input->op()));
     559             :       // The elements backing store of an arguments object participates in the
     560             :       // duplicate object counting, but can itself never appear duplicated.
     561             :       DCHECK_EQ(StateObjectDeduplicator::kNotDuplicated,
     562             :                 deduplicator->GetObjectId(input));
     563             :       deduplicator->InsertObject(input);
     564        6180 :       return 0;
     565             :     }
     566             :     case IrOpcode::kArgumentsLengthState: {
     567        6500 :       values->PushArgumentsLength(ArgumentsStateTypeOf(input->op()));
     568        6500 :       return 0;
     569             :     }
     570             :     case IrOpcode::kObjectState: {
     571           0 :       UNREACHABLE();
     572             :     }
     573             :     case IrOpcode::kTypedObjectState:
     574             :     case IrOpcode::kObjectId: {
     575      121236 :       size_t id = deduplicator->GetObjectId(input);
     576      121236 :       if (id == StateObjectDeduplicator::kNotDuplicated) {
     577             :         DCHECK_EQ(IrOpcode::kTypedObjectState, input->opcode());
     578             :         size_t entries = 0;
     579             :         id = deduplicator->InsertObject(input);
     580       98457 :         StateValueList* nested = values->PushRecursiveField(zone, id);
     581       98457 :         int const input_count = input->op()->ValueInputCount();
     582       98457 :         ZoneVector<MachineType> const* types = MachineTypesOf(input->op());
     583      692827 :         for (int i = 0; i < input_count; ++i) {
     584             :           entries += AddOperandToStateValueDescriptor(
     585      594370 :               nested, inputs, g, deduplicator, input->InputAt(i), types->at(i),
     586      594370 :               kind, zone);
     587             :         }
     588             :         return entries;
     589             :       } else {
     590             :         // Deoptimizer counts duplicate objects for the running id, so we have
     591             :         // to push the input again.
     592             :         deduplicator->InsertObject(input);
     593       22779 :         values->PushDuplicate(id);
     594       22779 :         return 0;
     595             :       }
     596             :     }
     597             :     default: {
     598             :       InstructionOperand op =
     599    47615298 :           OperandForDeopt(isolate(), g, input, kind, type.representation());
     600    23807767 :       if (op.kind() == InstructionOperand::INVALID) {
     601             :         // Invalid operand means the value is impossible or optimized-out.
     602         336 :         values->PushOptimizedOut();
     603         336 :         return 0;
     604             :       } else {
     605    23807431 :         inputs->push_back(op);
     606    23807390 :         values->PushPlain(type);
     607    23807829 :         return 1;
     608             :       }
     609             :     }
     610             :   }
     611             : }
     612             : 
     613             : // Returns the number of instruction operands added to inputs.
     614     3946968 : size_t InstructionSelector::AddInputsToFrameStateDescriptor(
     615     7893947 :     FrameStateDescriptor* descriptor, Node* state, OperandGenerator* g,
     616             :     StateObjectDeduplicator* deduplicator, InstructionOperandVector* inputs,
     617             :     FrameStateInputKind kind, Zone* zone) {
     618             :   DCHECK_EQ(IrOpcode::kFrameState, state->op()->opcode());
     619             : 
     620             :   size_t entries = 0;
     621             :   size_t initial_size = inputs->size();
     622             :   USE(initial_size);  // initial_size is only used for debug.
     623             : 
     624     3946968 :   if (descriptor->outer_state()) {
     625             :     entries += AddInputsToFrameStateDescriptor(
     626             :         descriptor->outer_state(), state->InputAt(kFrameStateOuterStateInput),
     627      377930 :         g, deduplicator, inputs, kind, zone);
     628             :   }
     629             : 
     630             :   Node* parameters = state->InputAt(kFrameStateParametersInput);
     631             :   Node* locals = state->InputAt(kFrameStateLocalsInput);
     632             :   Node* stack = state->InputAt(kFrameStateStackInput);
     633             :   Node* context = state->InputAt(kFrameStateContextInput);
     634             :   Node* function = state->InputAt(kFrameStateFunctionInput);
     635             : 
     636             :   DCHECK_EQ(descriptor->parameters_count(),
     637             :             StateValuesAccess(parameters).size());
     638             :   DCHECK_EQ(descriptor->locals_count(), StateValuesAccess(locals).size());
     639             :   DCHECK_EQ(descriptor->stack_count(), StateValuesAccess(stack).size());
     640             : 
     641     3946960 :   StateValueList* values_descriptor = descriptor->GetStateValueDescriptors();
     642             : 
     643             :   DCHECK_EQ(values_descriptor->size(), 0u);
     644     3946960 :   values_descriptor->ReserveSize(descriptor->GetSize());
     645             : 
     646             :   entries += AddOperandToStateValueDescriptor(
     647             :       values_descriptor, inputs, g, deduplicator, function,
     648     3946962 :       MachineType::AnyTagged(), FrameStateInputKind::kStackSlot, zone);
     649     9975302 :   for (StateValuesAccess::TypedNode input_node :
     650     9975233 :        StateValuesAccess(parameters)) {
     651             :     entries += AddOperandToStateValueDescriptor(values_descriptor, inputs, g,
     652             :                                                 deduplicator, input_node.node,
     653     9975207 :                                                 input_node.type, kind, zone);
     654             :   }
     655     3946979 :   if (descriptor->HasContext()) {
     656             :     entries += AddOperandToStateValueDescriptor(
     657             :         values_descriptor, inputs, g, deduplicator, context,
     658     3863251 :         MachineType::AnyTagged(), FrameStateInputKind::kStackSlot, zone);
     659             :   }
     660    59150922 :   for (StateValuesAccess::TypedNode input_node : StateValuesAccess(locals)) {
     661             :     entries += AddOperandToStateValueDescriptor(values_descriptor, inputs, g,
     662             :                                                 deduplicator, input_node.node,
     663    29575036 :                                                 input_node.type, kind, zone);
     664             :   }
     665     7647104 :   for (StateValuesAccess::TypedNode input_node : StateValuesAccess(stack)) {
     666             :     entries += AddOperandToStateValueDescriptor(values_descriptor, inputs, g,
     667             :                                                 deduplicator, input_node.node,
     668     3823544 :                                                 input_node.type, kind, zone);
     669             :   }
     670             :   DCHECK_EQ(initial_size + entries, inputs->size());
     671     3946981 :   return entries;
     672             : }
     673             : 
     674      556441 : Instruction* InstructionSelector::EmitWithContinuation(
     675             :     InstructionCode opcode, FlagsContinuation* cont) {
     676      556441 :   return EmitWithContinuation(opcode, 0, nullptr, 0, nullptr, cont);
     677             : }
     678             : 
     679           0 : Instruction* InstructionSelector::EmitWithContinuation(
     680             :     InstructionCode opcode, InstructionOperand a, FlagsContinuation* cont) {
     681           0 :   return EmitWithContinuation(opcode, 0, nullptr, 1, &a, cont);
     682             : }
     683             : 
     684     4167045 : Instruction* InstructionSelector::EmitWithContinuation(
     685             :     InstructionCode opcode, InstructionOperand a, InstructionOperand b,
     686             :     FlagsContinuation* cont) {
     687     4167045 :   InstructionOperand inputs[] = {a, b};
     688             :   return EmitWithContinuation(opcode, 0, nullptr, arraysize(inputs), inputs,
     689     4167045 :                               cont);
     690             : }
     691             : 
     692           0 : Instruction* InstructionSelector::EmitWithContinuation(
     693             :     InstructionCode opcode, InstructionOperand a, InstructionOperand b,
     694             :     InstructionOperand c, FlagsContinuation* cont) {
     695           0 :   InstructionOperand inputs[] = {a, b, c};
     696             :   return EmitWithContinuation(opcode, 0, nullptr, arraysize(inputs), inputs,
     697           0 :                               cont);
     698             : }
     699             : 
     700     6718985 : Instruction* InstructionSelector::EmitWithContinuation(
     701             :     InstructionCode opcode, size_t output_count, InstructionOperand* outputs,
     702    25231931 :     size_t input_count, InstructionOperand* inputs, FlagsContinuation* cont) {
     703             :   OperandGenerator g(this);
     704             : 
     705             :   opcode = cont->Encode(opcode);
     706             : 
     707    13438054 :   continuation_inputs_.resize(0);
     708    20085985 :   for (size_t i = 0; i < input_count; i++) {
     709    13366905 :     continuation_inputs_.push_back(inputs[i]);
     710             :   }
     711             : 
     712    13438149 :   continuation_outputs_.resize(0);
     713     7652125 :   for (size_t i = 0; i < output_count; i++) {
     714      933092 :     continuation_outputs_.push_back(outputs[i]);
     715             :   }
     716             : 
     717     6719033 :   if (cont->IsBranch()) {
     718    10717111 :     continuation_inputs_.push_back(g.Label(cont->true_block()));
     719    10717128 :     continuation_inputs_.push_back(g.Label(cont->false_block()));
     720     1360481 :   } else if (cont->IsDeoptimize()) {
     721      333244 :     opcode |= MiscField::encode(static_cast<int>(input_count));
     722             :     AppendDeoptimizeArguments(&continuation_inputs_, cont->kind(),
     723      333244 :                               cont->reason(), cont->feedback(),
     724      333244 :                               cont->frame_state());
     725     1027237 :   } else if (cont->IsSet()) {
     726      753738 :     continuation_outputs_.push_back(g.DefineAsRegister(cont->result()));
     727      650367 :   } else if (cont->IsTrap()) {
     728       33444 :     int trap_id = static_cast<int>(cont->trap_id());
     729       66889 :     continuation_inputs_.push_back(g.UseImmediate(trap_id));
     730             :   } else {
     731             :     DCHECK(cont->IsNone());
     732             :   }
     733             : 
     734             :   size_t const emit_inputs_size = continuation_inputs_.size();
     735             :   auto* emit_inputs =
     736     6719069 :       emit_inputs_size ? &continuation_inputs_.front() : nullptr;
     737             :   size_t const emit_outputs_size = continuation_outputs_.size();
     738             :   auto* emit_outputs =
     739     6719069 :       emit_outputs_size ? &continuation_outputs_.front() : nullptr;
     740             :   return Emit(opcode, emit_outputs_size, emit_outputs, emit_inputs_size,
     741     6719069 :               emit_inputs, 0, nullptr);
     742             : }
     743             : 
     744      378853 : void InstructionSelector::AppendDeoptimizeArguments(
     745             :     InstructionOperandVector* args, DeoptimizeKind kind,
     746             :     DeoptimizeReason reason, VectorSlotPair const& feedback,
     747      378861 :     Node* frame_state) {
     748             :   OperandGenerator g(this);
     749      378853 :   FrameStateDescriptor* const descriptor = GetFrameStateDescriptor(frame_state);
     750             :   DCHECK_NE(DeoptimizeKind::kLazy, kind);
     751             :   int const state_id =
     752      378861 :       sequence()->AddDeoptimizationEntry(descriptor, kind, reason, feedback);
     753      757721 :   args->push_back(g.TempImmediate(state_id));
     754             :   StateObjectDeduplicator deduplicator(instruction_zone());
     755             :   AddInputsToFrameStateDescriptor(descriptor, frame_state, &g, &deduplicator,
     756             :                                   args, FrameStateInputKind::kAny,
     757      378861 :                                   instruction_zone());
     758      378861 : }
     759             : 
     760       45611 : Instruction* InstructionSelector::EmitDeoptimize(
     761             :     InstructionCode opcode, size_t output_count, InstructionOperand* outputs,
     762             :     size_t input_count, InstructionOperand* inputs, DeoptimizeKind kind,
     763             :     DeoptimizeReason reason, VectorSlotPair const& feedback,
     764             :     Node* frame_state) {
     765             :   InstructionOperandVector args(instruction_zone());
     766       45611 :   for (size_t i = 0; i < input_count; ++i) {
     767           0 :     args.push_back(inputs[i]);
     768             :   }
     769       45611 :   opcode |= MiscField::encode(static_cast<int>(input_count));
     770       45611 :   AppendDeoptimizeArguments(&args, kind, reason, feedback, frame_state);
     771             :   return Emit(opcode, output_count, outputs, args.size(), &args.front(), 0,
     772       91222 :               nullptr);
     773             : }
     774             : 
     775             : // An internal helper class for generating the operands to calls.
     776             : // TODO(bmeurer): Get rid of the CallBuffer business and make
     777             : // InstructionSelector::VisitCall platform independent instead.
     778             : struct CallBuffer {
     779    17519844 :   CallBuffer(Zone* zone, const CallDescriptor* call_descriptor,
     780    17519910 :              FrameStateDescriptor* frame_state)
     781             :       : descriptor(call_descriptor),
     782             :         frame_state_descriptor(frame_state),
     783             :         output_nodes(zone),
     784             :         outputs(zone),
     785             :         instruction_args(zone),
     786     5839942 :         pushed_nodes(zone) {
     787     5839942 :     output_nodes.reserve(call_descriptor->ReturnCount());
     788     5839960 :     outputs.reserve(call_descriptor->ReturnCount());
     789     5839966 :     pushed_nodes.reserve(input_count());
     790     5839967 :     instruction_args.reserve(input_count() + frame_state_value_count());
     791     5839964 :   }
     792             : 
     793             :   const CallDescriptor* descriptor;
     794             :   FrameStateDescriptor* frame_state_descriptor;
     795             :   ZoneVector<PushParameter> output_nodes;
     796             :   InstructionOperandVector outputs;
     797             :   InstructionOperandVector instruction_args;
     798             :   ZoneVector<PushParameter> pushed_nodes;
     799             : 
     800    17519873 :   size_t input_count() const { return descriptor->InputCount(); }
     801             : 
     802             :   size_t frame_state_count() const { return descriptor->FrameStateCount(); }
     803             : 
     804             :   size_t frame_state_value_count() const {
     805             :     return (frame_state_descriptor == nullptr)
     806             :                ? 0
     807     3190201 :                : (frame_state_descriptor->GetTotalSize() +
     808     9030168 :                   1);  // Include deopt id.
     809             :   }
     810             : };
     811             : 
     812             : // TODO(bmeurer): Get rid of the CallBuffer business and make
     813             : // InstructionSelector::VisitCall platform independent instead.
     814    11679872 : void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer,
     815             :                                                CallBufferFlags flags,
     816             :                                                bool is_tail_call,
     817     3190192 :                                                int stack_param_delta) {
     818             :   OperandGenerator g(this);
     819    14895357 :   size_t ret_count = buffer->descriptor->ReturnCount();
     820             :   DCHECK_LE(call->op()->ValueOutputCount(), ret_count);
     821             :   DCHECK_EQ(
     822             :       call->op()->ValueInputCount(),
     823             :       static_cast<int>(buffer->input_count() + buffer->frame_state_count()));
     824             : 
     825     5839937 :   if (ret_count > 0) {
     826             :     // Collect the projections that represent multiple outputs from this call.
     827     5706758 :     if (ret_count == 1) {
     828             :       PushParameter result = {call, buffer->descriptor->GetReturnLocation(0)};
     829    22885675 :       buffer->output_nodes.push_back(result);
     830             :     } else {
     831        5284 :       buffer->output_nodes.resize(ret_count);
     832             :       int stack_count = 0;
     833       30558 :       for (size_t i = 0; i < ret_count; ++i) {
     834       25274 :         LinkageLocation location = buffer->descriptor->GetReturnLocation(i);
     835       25274 :         buffer->output_nodes[i] = PushParameter(nullptr, location);
     836       25274 :         if (location.IsCallerFrameSlot()) {
     837       14704 :           stack_count += location.GetSizeInPointers();
     838             :         }
     839             :       }
     840       84294 :       for (Edge const edge : call->use_edges()) {
     841       36863 :         if (!NodeProperties::IsValueEdge(edge)) continue;
     842       14480 :         Node* node = edge.from();
     843             :         DCHECK_EQ(IrOpcode::kProjection, node->opcode());
     844       14480 :         size_t const index = ProjectionIndexOf(node->op());
     845             : 
     846             :         DCHECK_LT(index, buffer->output_nodes.size());
     847             :         DCHECK(!buffer->output_nodes[index].node);
     848       14480 :         buffer->output_nodes[index].node = node;
     849             :       }
     850        5284 :       frame_->EnsureReturnSlots(stack_count);
     851             :     }
     852             : 
     853             :     // Filter out the outputs that aren't live because no projection uses them.
     854             :     size_t outputs_needed_by_framestate =
     855     5706769 :         buffer->frame_state_descriptor == nullptr
     856             :             ? 0
     857             :             : buffer->frame_state_descriptor->state_combine()
     858     5706769 :                   .ConsumedOutputCount();
     859    22867084 :     for (size_t i = 0; i < buffer->output_nodes.size(); i++) {
     860     5726757 :       bool output_is_live = buffer->output_nodes[i].node != nullptr ||
     861             :                             i < outputs_needed_by_framestate;
     862     5726757 :       if (output_is_live) {
     863     5715962 :         LinkageLocation location = buffer->output_nodes[i].location;
     864             :         MachineRepresentation rep = location.GetType().representation();
     865             : 
     866             :         Node* output = buffer->output_nodes[i].node;
     867             :         InstructionOperand op = output == nullptr
     868             :                                     ? g.TempLocation(location)
     869     5715962 :                                     : g.DefineAsLocation(output, location);
     870             :         MarkAsRepresentation(rep, op);
     871             : 
     872     5715981 :         if (!UnallocatedOperand::cast(op).HasFixedSlotPolicy()) {
     873     5710908 :           buffer->outputs.push_back(op);
     874     5710905 :           buffer->output_nodes[i].node = nullptr;
     875             :         }
     876             :       }
     877             :     }
     878             :   }
     879             : 
     880             :   // The first argument is always the callee code.
     881     5813654 :   Node* callee = call->InputAt(0);
     882             :   bool call_code_immediate = (flags & kCallCodeImmediate) != 0;
     883     5839964 :   bool call_address_immediate = (flags & kCallAddressImmediate) != 0;
     884     5839964 :   bool call_use_fixed_target_reg = (flags & kCallFixedTargetRegister) != 0;
     885             :   bool call_through_slot = (flags & kAllowCallThroughSlot) != 0;
     886    11679928 :   switch (buffer->descriptor->kind()) {
     887             :     case CallDescriptor::kCallCodeObject:
     888             :       // TODO(jgruber, v8:7449): The below is a hack to support tail-calls from
     889             :       // JS-linkage callers with a register code target. The problem is that the
     890             :       // code target register may be clobbered before the final jmp by
     891             :       // AssemblePopArgumentsAdaptorFrame. As a more permanent fix we could
     892             :       // entirely remove support for tail-calls from JS-linkage callers.
     893             :       buffer->instruction_args.push_back(
     894     4746532 :           (call_code_immediate && callee->opcode() == IrOpcode::kHeapConstant)
     895             :               ? g.UseImmediate(callee)
     896             :               : call_use_fixed_target_reg
     897             :                     ? g.UseFixed(callee, kJavaScriptCallCodeStartRegister)
     898             :                     : is_tail_call ? g.UseUniqueRegister(callee)
     899             :                                    : call_through_slot ? g.UseUniqueSlot(callee)
     900    14225731 :                                                        : g.UseRegister(callee));
     901     4746535 :       break;
     902             :     case CallDescriptor::kCallAddress:
     903             :       buffer->instruction_args.push_back(
     904      110929 :           (call_address_immediate &&
     905             :            callee->opcode() == IrOpcode::kExternalConstant)
     906             :               ? g.UseImmediate(callee)
     907             :               : call_use_fixed_target_reg
     908             :                     ? g.UseFixed(callee, kJavaScriptCallCodeStartRegister)
     909      246919 :                     : g.UseRegister(callee));
     910      110929 :       break;
     911             :     case CallDescriptor::kCallWasmFunction:
     912             :     case CallDescriptor::kCallWasmImportWrapper:
     913             :       buffer->instruction_args.push_back(
     914      956193 :           (call_address_immediate &&
     915      875399 :            (callee->opcode() == IrOpcode::kRelocatableInt64Constant ||
     916             :             callee->opcode() == IrOpcode::kRelocatableInt32Constant))
     917             :               ? g.UseImmediate(callee)
     918             :               : call_use_fixed_target_reg
     919             :                     ? g.UseFixed(callee, kJavaScriptCallCodeStartRegister)
     920     1993190 :                     : g.UseRegister(callee));
     921      956202 :       break;
     922             :     case CallDescriptor::kCallBuiltinPointer:
     923             :       // The common case for builtin pointers is to have the target in a
     924             :       // register. If we have a constant, we use a register anyway to simplify
     925             :       // related code.
     926             :       buffer->instruction_args.push_back(
     927             :           call_use_fixed_target_reg
     928             :               ? g.UseFixed(callee, kJavaScriptCallCodeStartRegister)
     929        4976 :               : g.UseRegister(callee));
     930        2488 :       break;
     931             :     case CallDescriptor::kCallJSFunction:
     932             :       buffer->instruction_args.push_back(
     933       47588 :           g.UseLocation(callee, buffer->descriptor->GetInputLocation(0)));
     934       23794 :       break;
     935             :   }
     936             :   DCHECK_EQ(1u, buffer->instruction_args.size());
     937             : 
     938             :   // Argument 1 is used for poison-alias index (encoded in a word-sized
     939             :   // immediate. This an index of the operand that aliases with poison register
     940             :   // or -1 if there is no aliasing.
     941    11679892 :   buffer->instruction_args.push_back(g.TempImmediate(-1));
     942             :   const size_t poison_alias_index = 1;
     943             :   DCHECK_EQ(buffer->instruction_args.size() - 1, poison_alias_index);
     944             : 
     945             :   // If the call needs a frame state, we insert the state information as
     946             :   // follows (n is the number of value inputs to the frame state):
     947             :   // arg 2               : deoptimization id.
     948             :   // arg 3 - arg (n + 2) : value inputs to the frame state.
     949             :   size_t frame_state_entries = 0;
     950             :   USE(frame_state_entries);  // frame_state_entries is only used for debug.
     951     5839915 :   if (buffer->frame_state_descriptor != nullptr) {
     952             :     Node* frame_state =
     953     6380364 :         call->InputAt(static_cast<int>(buffer->descriptor->InputCount()));
     954             : 
     955             :     // If it was a syntactic tail call we need to drop the current frame and
     956             :     // all the frames on top of it that are either an arguments adaptor frame
     957             :     // or a tail caller frame.
     958     3190182 :     if (is_tail_call) {
     959           0 :       frame_state = NodeProperties::GetFrameStateInput(frame_state);
     960             :       buffer->frame_state_descriptor =
     961           0 :           buffer->frame_state_descriptor->outer_state();
     962           0 :       while (buffer->frame_state_descriptor != nullptr &&
     963             :              buffer->frame_state_descriptor->type() ==
     964             :                  FrameStateType::kArgumentsAdaptor) {
     965           0 :         frame_state = NodeProperties::GetFrameStateInput(frame_state);
     966             :         buffer->frame_state_descriptor =
     967           0 :             buffer->frame_state_descriptor->outer_state();
     968             :       }
     969             :     }
     970             : 
     971             :     int const state_id = sequence()->AddDeoptimizationEntry(
     972             :         buffer->frame_state_descriptor, DeoptimizeKind::kLazy,
     973     6380374 :         DeoptimizeReason::kUnknown, VectorSlotPair());
     974     6380390 :     buffer->instruction_args.push_back(g.TempImmediate(state_id));
     975             : 
     976             :     StateObjectDeduplicator deduplicator(instruction_zone());
     977             : 
     978             :     frame_state_entries =
     979             :         1 + AddInputsToFrameStateDescriptor(
     980             :                 buffer->frame_state_descriptor, frame_state, &g, &deduplicator,
     981             :                 &buffer->instruction_args, FrameStateInputKind::kStackSlot,
     982     3190197 :                 instruction_zone());
     983             : 
     984             :     DCHECK_EQ(2 + frame_state_entries, buffer->instruction_args.size());
     985             :   }
     986             : 
     987             :   size_t input_count = static_cast<size_t>(buffer->input_count());
     988             : 
     989             :   // Split the arguments into pushed_nodes and instruction_args. Pushed
     990             :   // arguments require an explicit push instruction before the call and do
     991             :   // not appear as arguments to the call. Everything else ends up
     992             :   // as an InstructionOperand argument to the call.
     993             :   auto iter(call->inputs().begin());
     994             :   size_t pushed_count = 0;
     995     5839935 :   bool call_tail = (flags & kCallTail) != 0;
     996    30861609 :   for (size_t index = 0; index < input_count; ++iter, ++index) {
     997             :     DCHECK(iter != call->inputs().end());
     998             :     DCHECK_NE(IrOpcode::kFrameState, (*iter)->op()->opcode());
     999    30861585 :     if (index == 0) continue;  // The first argument (callee) is already done.
    1000             : 
    1001    19181703 :     LinkageLocation location = buffer->descriptor->GetInputLocation(index);
    1002    19181722 :     if (call_tail) {
    1003             :       location = LinkageLocation::ConvertToTailCallerLocation(
    1004             :           location, stack_param_delta);
    1005             :     }
    1006    19181722 :     InstructionOperand op = g.UseLocation(*iter, location);
    1007             :     UnallocatedOperand unallocated = UnallocatedOperand::cast(op);
    1008    19181751 :     if (unallocated.HasFixedSlotPolicy() && !call_tail) {
    1009     3092796 :       int stack_index = -unallocated.fixed_slot_index() - 1;
    1010     9278388 :       if (static_cast<size_t>(stack_index) >= buffer->pushed_nodes.size()) {
    1011     1360188 :         buffer->pushed_nodes.resize(stack_index + 1);
    1012             :       }
    1013             :       PushParameter param = {*iter, location};
    1014     3092796 :       buffer->pushed_nodes[stack_index] = param;
    1015             :       pushed_count++;
    1016             :     } else {
    1017             :       // If we do load poisoning and the linkage uses the poisoning register,
    1018             :       // then we request the input in memory location, and during code
    1019             :       // generation, we move the input to the register.
    1020    16088962 :       if (poisoning_level_ != PoisoningMitigationLevel::kDontPoison &&
    1021             :           unallocated.HasFixedRegisterPolicy()) {
    1022             :         int reg = unallocated.fixed_register_index();
    1023           7 :         if (Register::from_code(reg) == kSpeculationPoisonRegister) {
    1024           0 :           buffer->instruction_args[poison_alias_index] = g.TempImmediate(
    1025           0 :               static_cast<int32_t>(buffer->instruction_args.size()));
    1026           0 :           op = g.UseRegisterOrSlotOrConstant(*iter);
    1027             :         }
    1028             :       }
    1029    16088955 :       buffer->instruction_args.push_back(op);
    1030             :     }
    1031             :   }
    1032             :   DCHECK_EQ(input_count, buffer->instruction_args.size() + pushed_count -
    1033             :                              frame_state_entries - 1);
    1034     5839965 :   if (V8_TARGET_ARCH_STORES_RETURN_ADDRESS_ON_STACK && call_tail &&
    1035     5839965 :       stack_param_delta != 0) {
    1036             :     // For tail calls that change the size of their parameter list and keep
    1037             :     // their return address on the stack, move the return address to just above
    1038             :     // the parameters.
    1039             :     LinkageLocation saved_return_location =
    1040       18436 :         LinkageLocation::ForSavedCallerReturnAddress();
    1041             :     InstructionOperand return_address =
    1042             :         g.UsePointerLocation(LinkageLocation::ConvertToTailCallerLocation(
    1043             :                                  saved_return_location, stack_param_delta),
    1044       18436 :                              saved_return_location);
    1045       18436 :     buffer->instruction_args.push_back(return_address);
    1046             :   }
    1047     5839965 : }
    1048             : 
    1049    38935947 : bool InstructionSelector::IsSourcePositionUsed(Node* node) {
    1050    38935947 :   return (source_position_mode_ == kAllSourcePositions ||
    1051    15178737 :           node->opcode() == IrOpcode::kCall ||
    1052    15178747 :           node->opcode() == IrOpcode::kCallWithCallerSavedRegisters ||
    1053    15173453 :           node->opcode() == IrOpcode::kTrapIf ||
    1054    15145292 :           node->opcode() == IrOpcode::kTrapUnless ||
    1055    34749076 :           node->opcode() == IrOpcode::kProtectedLoad ||
    1056    19697919 :           node->opcode() == IrOpcode::kProtectedStore);
    1057             : }
    1058             : 
    1059    77767868 : void InstructionSelector::VisitBlock(BasicBlock* block) {
    1060             :   DCHECK(!current_block_);
    1061    19442132 :   current_block_ = block;
    1062             :   auto current_num_instructions = [&] {
    1063             :     DCHECK_GE(kMaxInt, instructions_.size());
    1064   465431388 :     return static_cast<int>(instructions_.size());
    1065    19442132 :   };
    1066             :   int current_block_end = current_num_instructions();
    1067             : 
    1068             :   int effect_level = 0;
    1069   254810134 :   for (Node* const node : *block) {
    1070             :     SetEffectLevel(node, effect_level);
    1071   211085369 :     if (node->opcode() == IrOpcode::kStore ||
    1072   103122767 :         node->opcode() == IrOpcode::kUnalignedStore ||
    1073    97619524 :         node->opcode() == IrOpcode::kCall ||
    1074    97619183 :         node->opcode() == IrOpcode::kCallWithCallerSavedRegisters ||
    1075   205487884 :         node->opcode() == IrOpcode::kProtectedLoad ||
    1076             :         node->opcode() == IrOpcode::kProtectedStore) {
    1077    10582793 :       ++effect_level;
    1078             :     }
    1079             :   }
    1080             : 
    1081             :   // We visit the control first, then the nodes in the block, so the block's
    1082             :   // control input should be on the same effect level as the last node.
    1083    19442132 :   if (block->control_input() != nullptr) {
    1084             :     SetEffectLevel(block->control_input(), effect_level);
    1085             :   }
    1086             : 
    1087    66428645 :   auto FinishEmittedInstructions = [&](Node* node, int instruction_start) {
    1088    71219573 :     if (instruction_selection_failed()) return false;
    1089   132857512 :     if (current_num_instructions() == instruction_start) return true;
    1090             :     std::reverse(instructions_.begin() + instruction_start,
    1091    62342703 :                  instructions_.end());
    1092    57551775 :     if (!node) return true;
    1093    48688401 :     if (!source_positions_) return true;
    1094    38815303 :     SourcePosition source_position = source_positions_->GetSourcePosition(node);
    1095    38815266 :     if (source_position.IsKnown() && IsSourcePositionUsed(node)) {
    1096     4790928 :       sequence()->SetSourcePosition(instructions_[instruction_start],
    1097     9581856 :                                     source_position);
    1098             :     }
    1099             :     return true;
    1100    19442132 :   };
    1101             : 
    1102             :   // Generate code for the block control "top down", but schedule the code
    1103             :   // "bottom up".
    1104    19442132 :   VisitControl(block);
    1105    19441741 :   if (!FinishEmittedInstructions(block->control_input(), current_block_end))
    1106           9 :     return;
    1107             : 
    1108             :   // Visit code in reverse control flow order, because architecture-specific
    1109             :   // matching may cover more than one node at a time.
    1110   235363597 :   for (auto node : base::Reversed(*block)) {
    1111             :     int current_node_end = current_num_instructions();
    1112             :     // Skip nodes that are unused or already defined.
    1113   155206223 :     if (IsUsed(node) && !IsDefined(node)) {
    1114             :       // Generate code for this node "top down", but schedule the code "bottom
    1115             :       // up".
    1116    46988131 :       VisitNode(node);
    1117    46987643 :       if (!FinishEmittedInstructions(node, current_node_end)) return;
    1118             :     }
    1119   107960894 :     if (trace_turbo_ == kEnableTraceTurboJson) {
    1120         118 :       instr_origins_[node->id()] = {current_num_instructions(),
    1121             :                                     current_node_end};
    1122             :     }
    1123             :   }
    1124             : 
    1125             :   // We're done with the block.
    1126             :   InstructionBlock* instruction_block =
    1127    19441863 :       sequence()->InstructionBlockAt(RpoNumber::FromInt(block->rpo_number()));
    1128    19441936 :   if (current_num_instructions() == current_block_end) {
    1129             :     // Avoid empty block: insert a {kArchNop} instruction.
    1130     2140689 :     Emit(Instruction::New(sequence()->zone(), kArchNop));
    1131             :   }
    1132             :   instruction_block->set_code_start(current_num_instructions());
    1133             :   instruction_block->set_code_end(current_block_end);
    1134    19441944 :   current_block_ = nullptr;
    1135             : }
    1136             : 
    1137    38919034 : void InstructionSelector::VisitControl(BasicBlock* block) {
    1138             : #ifdef DEBUG
    1139             :   // SSA deconstruction requires targets of branches not to have phis.
    1140             :   // Edge split form guarantees this property, but is more strict.
    1141             :   if (block->SuccessorCount() > 1) {
    1142             :     for (BasicBlock* const successor : block->successors()) {
    1143             :       for (Node* const node : *successor) {
    1144             :         if (IrOpcode::IsPhiOpcode(node->opcode())) {
    1145             :           std::ostringstream str;
    1146             :           str << "You might have specified merged variables for a label with "
    1147             :               << "only one predecessor." << std::endl
    1148             :               << "# Current Block: " << *successor << std::endl
    1149             :               << "#          Node: " << *node;
    1150             :           FATAL("%s", str.str().c_str());
    1151             :         }
    1152             :       }
    1153             :     }
    1154             :   }
    1155             : #endif
    1156             : 
    1157       45618 :   Node* input = block->control_input();
    1158    38884005 :   int instruction_end = static_cast<int>(instructions_.size());
    1159    19441999 :   switch (block->control()) {
    1160             :     case BasicBlock::kGoto:
    1161     8863710 :       VisitGoto(block->SuccessorAt(0));
    1162     8863707 :       break;
    1163             :     case BasicBlock::kCall: {
    1164             :       DCHECK_EQ(IrOpcode::kCall, input->opcode());
    1165             :       BasicBlock* success = block->SuccessorAt(0);
    1166             :       BasicBlock* exception = block->SuccessorAt(1);
    1167      218354 :       VisitCall(input, exception);
    1168      218353 :       VisitGoto(success);
    1169      218353 :       break;
    1170             :     }
    1171             :     case BasicBlock::kTailCall: {
    1172             :       DCHECK_EQ(IrOpcode::kTailCall, input->opcode());
    1173      119272 :       VisitTailCall(input);
    1174      119272 :       break;
    1175             :     }
    1176             :     case BasicBlock::kBranch: {
    1177             :       DCHECK_EQ(IrOpcode::kBranch, input->opcode());
    1178             :       BasicBlock* tbranch = block->SuccessorAt(0);
    1179             :       BasicBlock* fbranch = block->SuccessorAt(1);
    1180     5358567 :       if (tbranch == fbranch) {
    1181           0 :         VisitGoto(tbranch);
    1182             :       } else {
    1183     5358567 :         VisitBranch(input, tbranch, fbranch);
    1184             :       }
    1185             :       break;
    1186             :     }
    1187             :     case BasicBlock::kSwitch: {
    1188             :       DCHECK_EQ(IrOpcode::kSwitch, input->opcode());
    1189             :       // Last successor must be {IfDefault}.
    1190       35036 :       BasicBlock* default_branch = block->successors().back();
    1191             :       DCHECK_EQ(IrOpcode::kIfDefault, default_branch->front()->opcode());
    1192             :       // All other successors must be {IfValue}s.
    1193             :       int32_t min_value = std::numeric_limits<int32_t>::max();
    1194             :       int32_t max_value = std::numeric_limits<int32_t>::min();
    1195       35036 :       size_t case_count = block->SuccessorCount() - 1;
    1196             :       ZoneVector<CaseInfo> cases(case_count, zone());
    1197      438325 :       for (size_t i = 0; i < case_count; ++i) {
    1198             :         BasicBlock* branch = block->SuccessorAt(i);
    1199     1209867 :         const IfValueParameters& p = IfValueParametersOf(branch->front()->op());
    1200      806578 :         cases[i] = CaseInfo{p.value(), p.comparison_order(), branch};
    1201      403289 :         if (min_value > p.value()) min_value = p.value();
    1202      403289 :         if (max_value < p.value()) max_value = p.value();
    1203             :       }
    1204             :       SwitchInfo sw(cases, min_value, max_value, default_branch);
    1205       35036 :       VisitSwitch(input, sw);
    1206             :       break;
    1207             :     }
    1208             :     case BasicBlock::kReturn: {
    1209             :       DCHECK_EQ(IrOpcode::kReturn, input->opcode());
    1210     2426977 :       VisitReturn(input);
    1211     2426753 :       break;
    1212             :     }
    1213             :     case BasicBlock::kDeoptimize: {
    1214       45611 :       DeoptimizeParameters p = DeoptimizeParametersOf(input->op());
    1215             :       Node* value = input->InputAt(0);
    1216       45611 :       VisitDeoptimize(p.kind(), p.reason(), p.feedback(), value);
    1217             :       break;
    1218             :     }
    1219             :     case BasicBlock::kThrow:
    1220             :       DCHECK_EQ(IrOpcode::kThrow, input->opcode());
    1221             :       VisitThrow(input);
    1222             :       break;
    1223             :     case BasicBlock::kNone: {
    1224             :       // Exit block doesn't have control.
    1225             :       DCHECK_NULL(input);
    1226             :       break;
    1227             :     }
    1228             :     default:
    1229           0 :       UNREACHABLE();
    1230             :       break;
    1231             :   }
    1232    19441693 :   if (trace_turbo_ == kEnableTraceTurboJson && input) {
    1233           7 :     int instruction_start = static_cast<int>(instructions_.size());
    1234           7 :     instr_origins_[input->id()] = {instruction_start, instruction_end};
    1235             :   }
    1236    19441693 : }
    1237             : 
    1238           0 : void InstructionSelector::MarkPairProjectionsAsWord32(Node* node) {
    1239           0 :   Node* projection0 = NodeProperties::FindProjection(node, 0);
    1240           0 :   if (projection0) {
    1241             :     MarkAsWord32(projection0);
    1242             :   }
    1243           0 :   Node* projection1 = NodeProperties::FindProjection(node, 1);
    1244           0 :   if (projection1) {
    1245             :     MarkAsWord32(projection1);
    1246             :   }
    1247           0 : }
    1248             : 
    1249    50154713 : void InstructionSelector::VisitNode(Node* node) {
    1250             :   DCHECK_NOT_NULL(schedule()->block(node));  // should only use scheduled nodes.
    1251    46987953 :   switch (node->opcode()) {
    1252             :     case IrOpcode::kStart:
    1253             :     case IrOpcode::kLoop:
    1254             :     case IrOpcode::kEnd:
    1255             :     case IrOpcode::kBranch:
    1256             :     case IrOpcode::kIfTrue:
    1257             :     case IrOpcode::kIfFalse:
    1258             :     case IrOpcode::kIfSuccess:
    1259             :     case IrOpcode::kSwitch:
    1260             :     case IrOpcode::kIfValue:
    1261             :     case IrOpcode::kIfDefault:
    1262             :     case IrOpcode::kEffectPhi:
    1263             :     case IrOpcode::kMerge:
    1264             :     case IrOpcode::kTerminate:
    1265             :     case IrOpcode::kBeginRegion:
    1266             :       // No code needed for these graph artifacts.
    1267             :       return;
    1268             :     case IrOpcode::kIfException:
    1269      197251 :       return MarkAsReference(node), VisitIfException(node);
    1270             :     case IrOpcode::kFinishRegion:
    1271             :       return MarkAsReference(node), VisitFinishRegion(node);
    1272             :     case IrOpcode::kParameter: {
    1273             :       MachineType type =
    1274     6333602 :           linkage()->GetParameterType(ParameterIndexOf(node->op()));
    1275     3166888 :       MarkAsRepresentation(type.representation(), node);
    1276     3166966 :       return VisitParameter(node);
    1277             :     }
    1278             :     case IrOpcode::kOsrValue:
    1279       22985 :       return MarkAsReference(node), VisitOsrValue(node);
    1280             :     case IrOpcode::kPhi: {
    1281     2098808 :       MachineRepresentation rep = PhiRepresentationOf(node->op());
    1282     2098809 :       if (rep == MachineRepresentation::kNone) return;
    1283     2098813 :       MarkAsRepresentation(rep, node);
    1284     2098815 :       return VisitPhi(node);
    1285             :     }
    1286             :     case IrOpcode::kProjection:
    1287      292325 :       return VisitProjection(node);
    1288             :     case IrOpcode::kInt32Constant:
    1289             :     case IrOpcode::kInt64Constant:
    1290             :     case IrOpcode::kExternalConstant:
    1291             :     case IrOpcode::kRelocatableInt32Constant:
    1292             :     case IrOpcode::kRelocatableInt64Constant:
    1293     6530961 :       return VisitConstant(node);
    1294             :     case IrOpcode::kFloat32Constant:
    1295       10344 :       return MarkAsFloat32(node), VisitConstant(node);
    1296             :     case IrOpcode::kFloat64Constant:
    1297      202390 :       return MarkAsFloat64(node), VisitConstant(node);
    1298             :     case IrOpcode::kHeapConstant:
    1299     4798102 :       return MarkAsReference(node), VisitConstant(node);
    1300             :     case IrOpcode::kNumberConstant: {
    1301      984356 :       double value = OpParameter<double>(node->op());
    1302      984356 :       if (!IsSmiDouble(value)) MarkAsReference(node);
    1303      984356 :       return VisitConstant(node);
    1304             :     }
    1305             :     case IrOpcode::kDelayedStringConstant:
    1306        1657 :       return MarkAsReference(node), VisitConstant(node);
    1307             :     case IrOpcode::kCall:
    1308     5501644 :       return VisitCall(node);
    1309             :     case IrOpcode::kCallWithCallerSavedRegisters:
    1310         676 :       return VisitCallWithCallerSavedRegisters(node);
    1311             :     case IrOpcode::kDeoptimizeIf:
    1312      113160 :       return VisitDeoptimizeIf(node);
    1313             :     case IrOpcode::kDeoptimizeUnless:
    1314      220087 :       return VisitDeoptimizeUnless(node);
    1315             :     case IrOpcode::kTrapIf:
    1316        5281 :       return VisitTrapIf(node, TrapIdOf(node->op()));
    1317             :     case IrOpcode::kTrapUnless:
    1318       28158 :       return VisitTrapUnless(node, TrapIdOf(node->op()));
    1319             :     case IrOpcode::kFrameState:
    1320             :     case IrOpcode::kStateValues:
    1321             :     case IrOpcode::kObjectState:
    1322             :       return;
    1323             :     case IrOpcode::kDebugAbort:
    1324         152 :       VisitDebugAbort(node);
    1325         152 :       return;
    1326             :     case IrOpcode::kDebugBreak:
    1327             :       VisitDebugBreak(node);
    1328             :       return;
    1329             :     case IrOpcode::kUnreachable:
    1330             :       VisitUnreachable(node);
    1331             :       return;
    1332             :     case IrOpcode::kDeadValue:
    1333           0 :       VisitDeadValue(node);
    1334           0 :       return;
    1335             :     case IrOpcode::kComment:
    1336           4 :       VisitComment(node);
    1337           4 :       return;
    1338             :     case IrOpcode::kRetain:
    1339        9156 :       VisitRetain(node);
    1340        9156 :       return;
    1341             :     case IrOpcode::kLoad: {
    1342     6001349 :       LoadRepresentation type = LoadRepresentationOf(node->op());
    1343     6001340 :       MarkAsRepresentation(type.representation(), node);
    1344     6001375 :       return VisitLoad(node);
    1345             :     }
    1346             :     case IrOpcode::kPoisonedLoad: {
    1347           0 :       LoadRepresentation type = LoadRepresentationOf(node->op());
    1348           0 :       MarkAsRepresentation(type.representation(), node);
    1349           0 :       return VisitPoisonedLoad(node);
    1350             :     }
    1351             :     case IrOpcode::kStore:
    1352     4840133 :       return VisitStore(node);
    1353             :     case IrOpcode::kProtectedStore:
    1354      144138 :       return VisitProtectedStore(node);
    1355             :     case IrOpcode::kWord32And:
    1356      180052 :       return MarkAsWord32(node), VisitWord32And(node);
    1357             :     case IrOpcode::kWord32Or:
    1358       61326 :       return MarkAsWord32(node), VisitWord32Or(node);
    1359             :     case IrOpcode::kWord32Xor:
    1360       22123 :       return MarkAsWord32(node), VisitWord32Xor(node);
    1361             :     case IrOpcode::kWord32Shl:
    1362       41558 :       return MarkAsWord32(node), VisitWord32Shl(node);
    1363             :     case IrOpcode::kWord32Shr:
    1364       96229 :       return MarkAsWord32(node), VisitWord32Shr(node);
    1365             :     case IrOpcode::kWord32Sar:
    1366       25676 :       return MarkAsWord32(node), VisitWord32Sar(node);
    1367             :     case IrOpcode::kWord32Ror:
    1368       27709 :       return MarkAsWord32(node), VisitWord32Ror(node);
    1369             :     case IrOpcode::kWord32Equal:
    1370      107964 :       return VisitWord32Equal(node);
    1371             :     case IrOpcode::kWord32Clz:
    1372         447 :       return MarkAsWord32(node), VisitWord32Clz(node);
    1373             :     case IrOpcode::kWord32Ctz:
    1374         332 :       return MarkAsWord32(node), VisitWord32Ctz(node);
    1375             :     case IrOpcode::kWord32ReverseBits:
    1376           0 :       return MarkAsWord32(node), VisitWord32ReverseBits(node);
    1377             :     case IrOpcode::kWord32ReverseBytes:
    1378          44 :       return MarkAsWord32(node), VisitWord32ReverseBytes(node);
    1379             :     case IrOpcode::kInt32AbsWithOverflow:
    1380           0 :       return MarkAsWord32(node), VisitInt32AbsWithOverflow(node);
    1381             :     case IrOpcode::kWord32Popcnt:
    1382          64 :       return MarkAsWord32(node), VisitWord32Popcnt(node);
    1383             :     case IrOpcode::kWord64Popcnt:
    1384          44 :       return MarkAsWord32(node), VisitWord64Popcnt(node);
    1385             :     case IrOpcode::kWord64And:
    1386      185141 :       return MarkAsWord64(node), VisitWord64And(node);
    1387             :     case IrOpcode::kWord64Or:
    1388       92250 :       return MarkAsWord64(node), VisitWord64Or(node);
    1389             :     case IrOpcode::kWord64Xor:
    1390         305 :       return MarkAsWord64(node), VisitWord64Xor(node);
    1391             :     case IrOpcode::kWord64Shl:
    1392      388410 :       return MarkAsWord64(node), VisitWord64Shl(node);
    1393             :     case IrOpcode::kWord64Shr:
    1394       47377 :       return MarkAsWord64(node), VisitWord64Shr(node);
    1395             :     case IrOpcode::kWord64Sar:
    1396      203101 :       return MarkAsWord64(node), VisitWord64Sar(node);
    1397             :     case IrOpcode::kWord64Ror:
    1398         112 :       return MarkAsWord64(node), VisitWord64Ror(node);
    1399             :     case IrOpcode::kWord64Clz:
    1400          36 :       return MarkAsWord64(node), VisitWord64Clz(node);
    1401             :     case IrOpcode::kWord64Ctz:
    1402          44 :       return MarkAsWord64(node), VisitWord64Ctz(node);
    1403             :     case IrOpcode::kWord64ReverseBits:
    1404           0 :       return MarkAsWord64(node), VisitWord64ReverseBits(node);
    1405             :     case IrOpcode::kWord64ReverseBytes:
    1406          12 :       return MarkAsWord64(node), VisitWord64ReverseBytes(node);
    1407             :     case IrOpcode::kInt64AbsWithOverflow:
    1408           0 :       return MarkAsWord64(node), VisitInt64AbsWithOverflow(node);
    1409             :     case IrOpcode::kWord64Equal:
    1410       39235 :       return VisitWord64Equal(node);
    1411             :     case IrOpcode::kInt32Add:
    1412      266970 :       return MarkAsWord32(node), VisitInt32Add(node);
    1413             :     case IrOpcode::kInt32AddWithOverflow:
    1414       13924 :       return MarkAsWord32(node), VisitInt32AddWithOverflow(node);
    1415             :     case IrOpcode::kInt32Sub:
    1416       49712 :       return MarkAsWord32(node), VisitInt32Sub(node);
    1417             :     case IrOpcode::kInt32SubWithOverflow:
    1418       13924 :       return VisitInt32SubWithOverflow(node);
    1419             :     case IrOpcode::kInt32Mul:
    1420       57696 :       return MarkAsWord32(node), VisitInt32Mul(node);
    1421             :     case IrOpcode::kInt32MulWithOverflow:
    1422       13924 :       return MarkAsWord32(node), VisitInt32MulWithOverflow(node);
    1423             :     case IrOpcode::kInt32MulHigh:
    1424        3764 :       return VisitInt32MulHigh(node);
    1425             :     case IrOpcode::kInt32Div:
    1426       15712 :       return MarkAsWord32(node), VisitInt32Div(node);
    1427             :     case IrOpcode::kInt32Mod:
    1428       16288 :       return MarkAsWord32(node), VisitInt32Mod(node);
    1429             :     case IrOpcode::kInt32LessThan:
    1430       28135 :       return VisitInt32LessThan(node);
    1431             :     case IrOpcode::kInt32LessThanOrEqual:
    1432       27762 :       return VisitInt32LessThanOrEqual(node);
    1433             :     case IrOpcode::kUint32Div:
    1434       14453 :       return MarkAsWord32(node), VisitUint32Div(node);
    1435             :     case IrOpcode::kUint32LessThan:
    1436       32833 :       return VisitUint32LessThan(node);
    1437             :     case IrOpcode::kUint32LessThanOrEqual:
    1438       27942 :       return VisitUint32LessThanOrEqual(node);
    1439             :     case IrOpcode::kUint32Mod:
    1440       14650 :       return MarkAsWord32(node), VisitUint32Mod(node);
    1441             :     case IrOpcode::kUint32MulHigh:
    1442        1438 :       return VisitUint32MulHigh(node);
    1443             :     case IrOpcode::kInt64Add:
    1444     2115685 :       return MarkAsWord64(node), VisitInt64Add(node);
    1445             :     case IrOpcode::kInt64AddWithOverflow:
    1446       26896 :       return MarkAsWord64(node), VisitInt64AddWithOverflow(node);
    1447             :     case IrOpcode::kInt64Sub:
    1448       33270 :       return MarkAsWord64(node), VisitInt64Sub(node);
    1449             :     case IrOpcode::kInt64SubWithOverflow:
    1450       26896 :       return MarkAsWord64(node), VisitInt64SubWithOverflow(node);
    1451             :     case IrOpcode::kInt64Mul:
    1452       21342 :       return MarkAsWord64(node), VisitInt64Mul(node);
    1453             :     case IrOpcode::kInt64Div:
    1454        1852 :       return MarkAsWord64(node), VisitInt64Div(node);
    1455             :     case IrOpcode::kInt64Mod:
    1456         880 :       return MarkAsWord64(node), VisitInt64Mod(node);
    1457             :     case IrOpcode::kInt64LessThan:
    1458        1360 :       return VisitInt64LessThan(node);
    1459             :     case IrOpcode::kInt64LessThanOrEqual:
    1460         829 :       return VisitInt64LessThanOrEqual(node);
    1461             :     case IrOpcode::kUint64Div:
    1462         896 :       return MarkAsWord64(node), VisitUint64Div(node);
    1463             :     case IrOpcode::kUint64LessThan:
    1464        5690 :       return VisitUint64LessThan(node);
    1465             :     case IrOpcode::kUint64LessThanOrEqual:
    1466         408 :       return VisitUint64LessThanOrEqual(node);
    1467             :     case IrOpcode::kUint64Mod:
    1468         872 :       return MarkAsWord64(node), VisitUint64Mod(node);
    1469             :     case IrOpcode::kBitcastTaggedToWord:
    1470     1341695 :       return MarkAsRepresentation(MachineType::PointerRepresentation(), node),
    1471             :              VisitBitcastTaggedToWord(node);
    1472             :     case IrOpcode::kBitcastWordToTagged:
    1473      541323 :       return MarkAsReference(node), VisitBitcastWordToTagged(node);
    1474             :     case IrOpcode::kBitcastWordToTaggedSigned:
    1475      744252 :       return MarkAsRepresentation(MachineRepresentation::kTaggedSigned, node),
    1476      744252 :              EmitIdentity(node);
    1477             :     case IrOpcode::kChangeFloat32ToFloat64:
    1478       21283 :       return MarkAsFloat64(node), VisitChangeFloat32ToFloat64(node);
    1479             :     case IrOpcode::kChangeInt32ToFloat64:
    1480      372591 :       return MarkAsFloat64(node), VisitChangeInt32ToFloat64(node);
    1481             :     case IrOpcode::kChangeInt64ToFloat64:
    1482         242 :       return MarkAsFloat64(node), VisitChangeInt64ToFloat64(node);
    1483             :     case IrOpcode::kChangeUint32ToFloat64:
    1484       10747 :       return MarkAsFloat64(node), VisitChangeUint32ToFloat64(node);
    1485             :     case IrOpcode::kChangeFloat64ToInt32:
    1486        2051 :       return MarkAsWord32(node), VisitChangeFloat64ToInt32(node);
    1487             :     case IrOpcode::kChangeFloat64ToInt64:
    1488          27 :       return MarkAsWord64(node), VisitChangeFloat64ToInt64(node);
    1489             :     case IrOpcode::kChangeFloat64ToUint32:
    1490         700 :       return MarkAsWord32(node), VisitChangeFloat64ToUint32(node);
    1491             :     case IrOpcode::kChangeFloat64ToUint64:
    1492        3696 :       return MarkAsWord64(node), VisitChangeFloat64ToUint64(node);
    1493             :     case IrOpcode::kFloat64SilenceNaN:
    1494             :       MarkAsFloat64(node);
    1495        6103 :       if (CanProduceSignalingNaN(node->InputAt(0))) {
    1496        5907 :         return VisitFloat64SilenceNaN(node);
    1497             :       } else {
    1498         196 :         return EmitIdentity(node);
    1499             :       }
    1500             :     case IrOpcode::kTruncateFloat64ToInt64:
    1501          84 :       return MarkAsWord64(node), VisitTruncateFloat64ToInt64(node);
    1502             :     case IrOpcode::kTruncateFloat64ToUint32:
    1503          60 :       return MarkAsWord32(node), VisitTruncateFloat64ToUint32(node);
    1504             :     case IrOpcode::kTruncateFloat32ToInt32:
    1505         348 :       return MarkAsWord32(node), VisitTruncateFloat32ToInt32(node);
    1506             :     case IrOpcode::kTruncateFloat32ToUint32:
    1507          56 :       return MarkAsWord32(node), VisitTruncateFloat32ToUint32(node);
    1508             :     case IrOpcode::kTryTruncateFloat32ToInt64:
    1509          52 :       return MarkAsWord64(node), VisitTryTruncateFloat32ToInt64(node);
    1510             :     case IrOpcode::kTryTruncateFloat64ToInt64:
    1511         608 :       return MarkAsWord64(node), VisitTryTruncateFloat64ToInt64(node);
    1512             :     case IrOpcode::kTryTruncateFloat32ToUint64:
    1513          52 :       return MarkAsWord64(node), VisitTryTruncateFloat32ToUint64(node);
    1514             :     case IrOpcode::kTryTruncateFloat64ToUint64:
    1515          60 :       return MarkAsWord64(node), VisitTryTruncateFloat64ToUint64(node);
    1516             :     case IrOpcode::kChangeInt32ToInt64:
    1517      355844 :       return MarkAsWord64(node), VisitChangeInt32ToInt64(node);
    1518             :     case IrOpcode::kChangeUint32ToUint64:
    1519      281273 :       return MarkAsWord64(node), VisitChangeUint32ToUint64(node);
    1520             :     case IrOpcode::kTruncateFloat64ToFloat32:
    1521       17939 :       return MarkAsFloat32(node), VisitTruncateFloat64ToFloat32(node);
    1522             :     case IrOpcode::kTruncateFloat64ToWord32:
    1523       52340 :       return MarkAsWord32(node), VisitTruncateFloat64ToWord32(node);
    1524             :     case IrOpcode::kTruncateInt64ToInt32:
    1525      493387 :       return MarkAsWord32(node), VisitTruncateInt64ToInt32(node);
    1526             :     case IrOpcode::kRoundFloat64ToInt32:
    1527      123482 :       return MarkAsWord32(node), VisitRoundFloat64ToInt32(node);
    1528             :     case IrOpcode::kRoundInt64ToFloat32:
    1529          32 :       return MarkAsFloat32(node), VisitRoundInt64ToFloat32(node);
    1530             :     case IrOpcode::kRoundInt32ToFloat32:
    1531         960 :       return MarkAsFloat32(node), VisitRoundInt32ToFloat32(node);
    1532             :     case IrOpcode::kRoundInt64ToFloat64:
    1533        2952 :       return MarkAsFloat64(node), VisitRoundInt64ToFloat64(node);
    1534             :     case IrOpcode::kBitcastFloat32ToInt32:
    1535         554 :       return MarkAsWord32(node), VisitBitcastFloat32ToInt32(node);
    1536             :     case IrOpcode::kRoundUint32ToFloat32:
    1537          88 :       return MarkAsFloat32(node), VisitRoundUint32ToFloat32(node);
    1538             :     case IrOpcode::kRoundUint64ToFloat32:
    1539          32 :       return MarkAsFloat64(node), VisitRoundUint64ToFloat32(node);
    1540             :     case IrOpcode::kRoundUint64ToFloat64:
    1541        3496 :       return MarkAsFloat64(node), VisitRoundUint64ToFloat64(node);
    1542             :     case IrOpcode::kBitcastFloat64ToInt64:
    1543         523 :       return MarkAsWord64(node), VisitBitcastFloat64ToInt64(node);
    1544             :     case IrOpcode::kBitcastInt32ToFloat32:
    1545         308 :       return MarkAsFloat32(node), VisitBitcastInt32ToFloat32(node);
    1546             :     case IrOpcode::kBitcastInt64ToFloat64:
    1547         156 :       return MarkAsFloat64(node), VisitBitcastInt64ToFloat64(node);
    1548             :     case IrOpcode::kFloat32Add:
    1549        1745 :       return MarkAsFloat32(node), VisitFloat32Add(node);
    1550             :     case IrOpcode::kFloat32Sub:
    1551        2552 :       return MarkAsFloat32(node), VisitFloat32Sub(node);
    1552             :     case IrOpcode::kFloat32Neg:
    1553         169 :       return MarkAsFloat32(node), VisitFloat32Neg(node);
    1554             :     case IrOpcode::kFloat32Mul:
    1555         873 :       return MarkAsFloat32(node), VisitFloat32Mul(node);
    1556             :     case IrOpcode::kFloat32Div:
    1557         353 :       return MarkAsFloat32(node), VisitFloat32Div(node);
    1558             :     case IrOpcode::kFloat32Abs:
    1559          68 :       return MarkAsFloat32(node), VisitFloat32Abs(node);
    1560             :     case IrOpcode::kFloat32Sqrt:
    1561         174 :       return MarkAsFloat32(node), VisitFloat32Sqrt(node);
    1562             :     case IrOpcode::kFloat32Equal:
    1563         106 :       return VisitFloat32Equal(node);
    1564             :     case IrOpcode::kFloat32LessThan:
    1565         138 :       return VisitFloat32LessThan(node);
    1566             :     case IrOpcode::kFloat32LessThanOrEqual:
    1567         103 :       return VisitFloat32LessThanOrEqual(node);
    1568             :     case IrOpcode::kFloat32Max:
    1569          66 :       return MarkAsFloat32(node), VisitFloat32Max(node);
    1570             :     case IrOpcode::kFloat32Min:
    1571          66 :       return MarkAsFloat32(node), VisitFloat32Min(node);
    1572             :     case IrOpcode::kFloat64Add:
    1573       80198 :       return MarkAsFloat64(node), VisitFloat64Add(node);
    1574             :     case IrOpcode::kFloat64Sub:
    1575       15161 :       return MarkAsFloat64(node), VisitFloat64Sub(node);
    1576             :     case IrOpcode::kFloat64Neg:
    1577        9732 :       return MarkAsFloat64(node), VisitFloat64Neg(node);
    1578             :     case IrOpcode::kFloat64Mul:
    1579       12542 :       return MarkAsFloat64(node), VisitFloat64Mul(node);
    1580             :     case IrOpcode::kFloat64Div:
    1581       11927 :       return MarkAsFloat64(node), VisitFloat64Div(node);
    1582             :     case IrOpcode::kFloat64Mod:
    1583        1614 :       return MarkAsFloat64(node), VisitFloat64Mod(node);
    1584             :     case IrOpcode::kFloat64Min:
    1585         335 :       return MarkAsFloat64(node), VisitFloat64Min(node);
    1586             :     case IrOpcode::kFloat64Max:
    1587         250 :       return MarkAsFloat64(node), VisitFloat64Max(node);
    1588             :     case IrOpcode::kFloat64Abs:
    1589         623 :       return MarkAsFloat64(node), VisitFloat64Abs(node);
    1590             :     case IrOpcode::kFloat64Acos:
    1591             :       return MarkAsFloat64(node), VisitFloat64Acos(node);
    1592             :     case IrOpcode::kFloat64Acosh:
    1593             :       return MarkAsFloat64(node), VisitFloat64Acosh(node);
    1594             :     case IrOpcode::kFloat64Asin:
    1595             :       return MarkAsFloat64(node), VisitFloat64Asin(node);
    1596             :     case IrOpcode::kFloat64Asinh:
    1597             :       return MarkAsFloat64(node), VisitFloat64Asinh(node);
    1598             :     case IrOpcode::kFloat64Atan:
    1599             :       return MarkAsFloat64(node), VisitFloat64Atan(node);
    1600             :     case IrOpcode::kFloat64Atanh:
    1601             :       return MarkAsFloat64(node), VisitFloat64Atanh(node);
    1602             :     case IrOpcode::kFloat64Atan2:
    1603             :       return MarkAsFloat64(node), VisitFloat64Atan2(node);
    1604             :     case IrOpcode::kFloat64Cbrt:
    1605             :       return MarkAsFloat64(node), VisitFloat64Cbrt(node);
    1606             :     case IrOpcode::kFloat64Cos:
    1607             :       return MarkAsFloat64(node), VisitFloat64Cos(node);
    1608             :     case IrOpcode::kFloat64Cosh:
    1609             :       return MarkAsFloat64(node), VisitFloat64Cosh(node);
    1610             :     case IrOpcode::kFloat64Exp:
    1611             :       return MarkAsFloat64(node), VisitFloat64Exp(node);
    1612             :     case IrOpcode::kFloat64Expm1:
    1613             :       return MarkAsFloat64(node), VisitFloat64Expm1(node);
    1614             :     case IrOpcode::kFloat64Log:
    1615             :       return MarkAsFloat64(node), VisitFloat64Log(node);
    1616             :     case IrOpcode::kFloat64Log1p:
    1617             :       return MarkAsFloat64(node), VisitFloat64Log1p(node);
    1618             :     case IrOpcode::kFloat64Log10:
    1619             :       return MarkAsFloat64(node), VisitFloat64Log10(node);
    1620             :     case IrOpcode::kFloat64Log2:
    1621             :       return MarkAsFloat64(node), VisitFloat64Log2(node);
    1622             :     case IrOpcode::kFloat64Pow:
    1623             :       return MarkAsFloat64(node), VisitFloat64Pow(node);
    1624             :     case IrOpcode::kFloat64Sin:
    1625             :       return MarkAsFloat64(node), VisitFloat64Sin(node);
    1626             :     case IrOpcode::kFloat64Sinh:
    1627             :       return MarkAsFloat64(node), VisitFloat64Sinh(node);
    1628             :     case IrOpcode::kFloat64Sqrt:
    1629         415 :       return MarkAsFloat64(node), VisitFloat64Sqrt(node);
    1630             :     case IrOpcode::kFloat64Tan:
    1631             :       return MarkAsFloat64(node), VisitFloat64Tan(node);
    1632             :     case IrOpcode::kFloat64Tanh:
    1633             :       return MarkAsFloat64(node), VisitFloat64Tanh(node);
    1634             :     case IrOpcode::kFloat64Equal:
    1635        2814 :       return VisitFloat64Equal(node);
    1636             :     case IrOpcode::kFloat64LessThan:
    1637        4846 :       return VisitFloat64LessThan(node);
    1638             :     case IrOpcode::kFloat64LessThanOrEqual:
    1639        1148 :       return VisitFloat64LessThanOrEqual(node);
    1640             :     case IrOpcode::kFloat32RoundDown:
    1641          50 :       return MarkAsFloat32(node), VisitFloat32RoundDown(node);
    1642             :     case IrOpcode::kFloat64RoundDown:
    1643       25619 :       return MarkAsFloat64(node), VisitFloat64RoundDown(node);
    1644             :     case IrOpcode::kFloat32RoundUp:
    1645          50 :       return MarkAsFloat32(node), VisitFloat32RoundUp(node);
    1646             :     case IrOpcode::kFloat64RoundUp:
    1647        8500 :       return MarkAsFloat64(node), VisitFloat64RoundUp(node);
    1648             :     case IrOpcode::kFloat32RoundTruncate:
    1649         195 :       return MarkAsFloat32(node), VisitFloat32RoundTruncate(node);
    1650             :     case IrOpcode::kFloat64RoundTruncate:
    1651        7921 :       return MarkAsFloat64(node), VisitFloat64RoundTruncate(node);
    1652             :     case IrOpcode::kFloat64RoundTiesAway:
    1653           0 :       return MarkAsFloat64(node), VisitFloat64RoundTiesAway(node);
    1654             :     case IrOpcode::kFloat32RoundTiesEven:
    1655          24 :       return MarkAsFloat32(node), VisitFloat32RoundTiesEven(node);
    1656             :     case IrOpcode::kFloat64RoundTiesEven:
    1657        1059 :       return MarkAsFloat64(node), VisitFloat64RoundTiesEven(node);
    1658             :     case IrOpcode::kFloat64ExtractLowWord32:
    1659         116 :       return MarkAsWord32(node), VisitFloat64ExtractLowWord32(node);
    1660             :     case IrOpcode::kFloat64ExtractHighWord32:
    1661       93237 :       return MarkAsWord32(node), VisitFloat64ExtractHighWord32(node);
    1662             :     case IrOpcode::kFloat64InsertLowWord32:
    1663         116 :       return MarkAsFloat64(node), VisitFloat64InsertLowWord32(node);
    1664             :     case IrOpcode::kFloat64InsertHighWord32:
    1665         116 :       return MarkAsFloat64(node), VisitFloat64InsertHighWord32(node);
    1666             :     case IrOpcode::kTaggedPoisonOnSpeculation:
    1667             :       return MarkAsReference(node), VisitTaggedPoisonOnSpeculation(node);
    1668             :     case IrOpcode::kWord32PoisonOnSpeculation:
    1669             :       return MarkAsWord32(node), VisitWord32PoisonOnSpeculation(node);
    1670             :     case IrOpcode::kWord64PoisonOnSpeculation:
    1671             :       return MarkAsWord64(node), VisitWord64PoisonOnSpeculation(node);
    1672             :     case IrOpcode::kStackSlot:
    1673        2459 :       return VisitStackSlot(node);
    1674             :     case IrOpcode::kLoadStackPointer:
    1675           1 :       return VisitLoadStackPointer(node);
    1676             :     case IrOpcode::kLoadFramePointer:
    1677       31038 :       return VisitLoadFramePointer(node);
    1678             :     case IrOpcode::kLoadParentFramePointer:
    1679       50404 :       return VisitLoadParentFramePointer(node);
    1680             :     case IrOpcode::kUnalignedLoad: {
    1681           0 :       LoadRepresentation type = LoadRepresentationOf(node->op());
    1682           0 :       MarkAsRepresentation(type.representation(), node);
    1683           0 :       return VisitUnalignedLoad(node);
    1684             :     }
    1685             :     case IrOpcode::kUnalignedStore:
    1686           0 :       return VisitUnalignedStore(node);
    1687             :     case IrOpcode::kInt32PairAdd:
    1688             :       MarkAsWord32(node);
    1689           0 :       MarkPairProjectionsAsWord32(node);
    1690           0 :       return VisitInt32PairAdd(node);
    1691             :     case IrOpcode::kInt32PairSub:
    1692             :       MarkAsWord32(node);
    1693           0 :       MarkPairProjectionsAsWord32(node);
    1694           0 :       return VisitInt32PairSub(node);
    1695             :     case IrOpcode::kInt32PairMul:
    1696             :       MarkAsWord32(node);
    1697           0 :       MarkPairProjectionsAsWord32(node);
    1698           0 :       return VisitInt32PairMul(node);
    1699             :     case IrOpcode::kWord32PairShl:
    1700             :       MarkAsWord32(node);
    1701           0 :       MarkPairProjectionsAsWord32(node);
    1702           0 :       return VisitWord32PairShl(node);
    1703             :     case IrOpcode::kWord32PairShr:
    1704             :       MarkAsWord32(node);
    1705           0 :       MarkPairProjectionsAsWord32(node);
    1706           0 :       return VisitWord32PairShr(node);
    1707             :     case IrOpcode::kWord32PairSar:
    1708             :       MarkAsWord32(node);
    1709           0 :       MarkPairProjectionsAsWord32(node);
    1710           0 :       return VisitWord32PairSar(node);
    1711             :     case IrOpcode::kWord32AtomicLoad: {
    1712        1054 :       LoadRepresentation type = LoadRepresentationOf(node->op());
    1713        1054 :       MarkAsRepresentation(type.representation(), node);
    1714        1054 :       return VisitWord32AtomicLoad(node);
    1715             :     }
    1716             :     case IrOpcode::kWord64AtomicLoad: {
    1717         544 :       LoadRepresentation type = LoadRepresentationOf(node->op());
    1718         544 :       MarkAsRepresentation(type.representation(), node);
    1719         544 :       return VisitWord64AtomicLoad(node);
    1720             :     }
    1721             :     case IrOpcode::kWord32AtomicStore:
    1722        2035 :       return VisitWord32AtomicStore(node);
    1723             :     case IrOpcode::kWord64AtomicStore:
    1724        2248 :       return VisitWord64AtomicStore(node);
    1725             :     case IrOpcode::kWord32AtomicPairStore:
    1726           0 :       return VisitWord32AtomicPairStore(node);
    1727             :     case IrOpcode::kWord32AtomicPairLoad: {
    1728             :       MarkAsWord32(node);
    1729           0 :       MarkPairProjectionsAsWord32(node);
    1730           0 :       return VisitWord32AtomicPairLoad(node);
    1731             :     }
    1732             : #define ATOMIC_CASE(name, rep)                         \
    1733             :   case IrOpcode::k##rep##Atomic##name: {               \
    1734             :     MachineType type = AtomicOpType(node->op());       \
    1735             :     MarkAsRepresentation(type.representation(), node); \
    1736             :     return Visit##rep##Atomic##name(node);             \
    1737             :   }
    1738        2567 :       ATOMIC_CASE(Add, Word32)
    1739        2205 :       ATOMIC_CASE(Add, Word64)
    1740        2676 :       ATOMIC_CASE(Sub, Word32)
    1741        2056 :       ATOMIC_CASE(Sub, Word64)
    1742        2644 :       ATOMIC_CASE(And, Word32)
    1743        2262 :       ATOMIC_CASE(And, Word64)
    1744        2552 :       ATOMIC_CASE(Or, Word32)
    1745        1916 :       ATOMIC_CASE(Or, Word64)
    1746        2770 :       ATOMIC_CASE(Xor, Word32)
    1747        2348 :       ATOMIC_CASE(Xor, Word64)
    1748        2441 :       ATOMIC_CASE(Exchange, Word32)
    1749        2960 :       ATOMIC_CASE(Exchange, Word64)
    1750         739 :       ATOMIC_CASE(CompareExchange, Word32)
    1751         332 :       ATOMIC_CASE(CompareExchange, Word64)
    1752             : #undef ATOMIC_CASE
    1753             : #define ATOMIC_CASE(name)                     \
    1754             :   case IrOpcode::kWord32AtomicPair##name: {   \
    1755             :     MarkAsWord32(node);                       \
    1756             :     MarkPairProjectionsAsWord32(node);        \
    1757             :     return VisitWord32AtomicPair##name(node); \
    1758             :   }
    1759           0 :       ATOMIC_CASE(Add)
    1760           0 :       ATOMIC_CASE(Sub)
    1761           0 :       ATOMIC_CASE(And)
    1762           0 :       ATOMIC_CASE(Or)
    1763           0 :       ATOMIC_CASE(Xor)
    1764           0 :       ATOMIC_CASE(Exchange)
    1765           0 :       ATOMIC_CASE(CompareExchange)
    1766             : #undef ATOMIC_CASE
    1767             :     case IrOpcode::kSpeculationFence:
    1768           1 :       return VisitSpeculationFence(node);
    1769             :     case IrOpcode::kProtectedLoad: {
    1770       94150 :       LoadRepresentation type = LoadRepresentationOf(node->op());
    1771       94150 :       MarkAsRepresentation(type.representation(), node);
    1772       94154 :       return VisitProtectedLoad(node);
    1773             :     }
    1774             :     case IrOpcode::kSignExtendWord8ToInt32:
    1775           4 :       return MarkAsWord32(node), VisitSignExtendWord8ToInt32(node);
    1776             :     case IrOpcode::kSignExtendWord16ToInt32:
    1777           4 :       return MarkAsWord32(node), VisitSignExtendWord16ToInt32(node);
    1778             :     case IrOpcode::kSignExtendWord8ToInt64:
    1779           4 :       return MarkAsWord64(node), VisitSignExtendWord8ToInt64(node);
    1780             :     case IrOpcode::kSignExtendWord16ToInt64:
    1781           4 :       return MarkAsWord64(node), VisitSignExtendWord16ToInt64(node);
    1782             :     case IrOpcode::kSignExtendWord32ToInt64:
    1783           4 :       return MarkAsWord64(node), VisitSignExtendWord32ToInt64(node);
    1784             :     case IrOpcode::kUnsafePointerAdd:
    1785        6699 :       MarkAsRepresentation(MachineType::PointerRepresentation(), node);
    1786             :       return VisitUnsafePointerAdd(node);
    1787             :     case IrOpcode::kF32x4Splat:
    1788         140 :       return MarkAsSimd128(node), VisitF32x4Splat(node);
    1789             :     case IrOpcode::kF32x4ExtractLane:
    1790         288 :       return MarkAsFloat32(node), VisitF32x4ExtractLane(node);
    1791             :     case IrOpcode::kF32x4ReplaceLane:
    1792          32 :       return MarkAsSimd128(node), VisitF32x4ReplaceLane(node);
    1793             :     case IrOpcode::kF32x4SConvertI32x4:
    1794           4 :       return MarkAsSimd128(node), VisitF32x4SConvertI32x4(node);
    1795             :     case IrOpcode::kF32x4UConvertI32x4:
    1796           4 :       return MarkAsSimd128(node), VisitF32x4UConvertI32x4(node);
    1797             :     case IrOpcode::kF32x4Abs:
    1798           4 :       return MarkAsSimd128(node), VisitF32x4Abs(node);
    1799             :     case IrOpcode::kF32x4Neg:
    1800           4 :       return MarkAsSimd128(node), VisitF32x4Neg(node);
    1801             :     case IrOpcode::kF32x4RecipApprox:
    1802           4 :       return MarkAsSimd128(node), VisitF32x4RecipApprox(node);
    1803             :     case IrOpcode::kF32x4RecipSqrtApprox:
    1804           4 :       return MarkAsSimd128(node), VisitF32x4RecipSqrtApprox(node);
    1805             :     case IrOpcode::kF32x4Add:
    1806          12 :       return MarkAsSimd128(node), VisitF32x4Add(node);
    1807             :     case IrOpcode::kF32x4AddHoriz:
    1808           4 :       return MarkAsSimd128(node), VisitF32x4AddHoriz(node);
    1809             :     case IrOpcode::kF32x4Sub:
    1810           4 :       return MarkAsSimd128(node), VisitF32x4Sub(node);
    1811             :     case IrOpcode::kF32x4Mul:
    1812           4 :       return MarkAsSimd128(node), VisitF32x4Mul(node);
    1813             :     case IrOpcode::kF32x4Min:
    1814           4 :       return MarkAsSimd128(node), VisitF32x4Min(node);
    1815             :     case IrOpcode::kF32x4Max:
    1816           4 :       return MarkAsSimd128(node), VisitF32x4Max(node);
    1817             :     case IrOpcode::kF32x4Eq:
    1818           4 :       return MarkAsSimd128(node), VisitF32x4Eq(node);
    1819             :     case IrOpcode::kF32x4Ne:
    1820           4 :       return MarkAsSimd128(node), VisitF32x4Ne(node);
    1821             :     case IrOpcode::kF32x4Lt:
    1822           8 :       return MarkAsSimd128(node), VisitF32x4Lt(node);
    1823             :     case IrOpcode::kF32x4Le:
    1824           8 :       return MarkAsSimd128(node), VisitF32x4Le(node);
    1825             :     case IrOpcode::kI32x4Splat:
    1826        1076 :       return MarkAsSimd128(node), VisitI32x4Splat(node);
    1827             :     case IrOpcode::kI32x4ExtractLane:
    1828        3996 :       return MarkAsWord32(node), VisitI32x4ExtractLane(node);
    1829             :     case IrOpcode::kI32x4ReplaceLane:
    1830        1784 :       return MarkAsSimd128(node), VisitI32x4ReplaceLane(node);
    1831             :     case IrOpcode::kI32x4SConvertF32x4:
    1832           4 :       return MarkAsSimd128(node), VisitI32x4SConvertF32x4(node);
    1833             :     case IrOpcode::kI32x4SConvertI16x8Low:
    1834           4 :       return MarkAsSimd128(node), VisitI32x4SConvertI16x8Low(node);
    1835             :     case IrOpcode::kI32x4SConvertI16x8High:
    1836           4 :       return MarkAsSimd128(node), VisitI32x4SConvertI16x8High(node);
    1837             :     case IrOpcode::kI32x4Neg:
    1838           4 :       return MarkAsSimd128(node), VisitI32x4Neg(node);
    1839             :     case IrOpcode::kI32x4Shl:
    1840         124 :       return MarkAsSimd128(node), VisitI32x4Shl(node);
    1841             :     case IrOpcode::kI32x4ShrS:
    1842         124 :       return MarkAsSimd128(node), VisitI32x4ShrS(node);
    1843             :     case IrOpcode::kI32x4Add:
    1844          12 :       return MarkAsSimd128(node), VisitI32x4Add(node);
    1845             :     case IrOpcode::kI32x4AddHoriz:
    1846           4 :       return MarkAsSimd128(node), VisitI32x4AddHoriz(node);
    1847             :     case IrOpcode::kI32x4Sub:
    1848           4 :       return MarkAsSimd128(node), VisitI32x4Sub(node);
    1849             :     case IrOpcode::kI32x4Mul:
    1850           4 :       return MarkAsSimd128(node), VisitI32x4Mul(node);
    1851             :     case IrOpcode::kI32x4MinS:
    1852           4 :       return MarkAsSimd128(node), VisitI32x4MinS(node);
    1853             :     case IrOpcode::kI32x4MaxS:
    1854           4 :       return MarkAsSimd128(node), VisitI32x4MaxS(node);
    1855             :     case IrOpcode::kI32x4Eq:
    1856          12 :       return MarkAsSimd128(node), VisitI32x4Eq(node);
    1857             :     case IrOpcode::kI32x4Ne:
    1858          16 :       return MarkAsSimd128(node), VisitI32x4Ne(node);
    1859             :     case IrOpcode::kI32x4GtS:
    1860           8 :       return MarkAsSimd128(node), VisitI32x4GtS(node);
    1861             :     case IrOpcode::kI32x4GeS:
    1862           8 :       return MarkAsSimd128(node), VisitI32x4GeS(node);
    1863             :     case IrOpcode::kI32x4UConvertF32x4:
    1864           4 :       return MarkAsSimd128(node), VisitI32x4UConvertF32x4(node);
    1865             :     case IrOpcode::kI32x4UConvertI16x8Low:
    1866           4 :       return MarkAsSimd128(node), VisitI32x4UConvertI16x8Low(node);
    1867             :     case IrOpcode::kI32x4UConvertI16x8High:
    1868           4 :       return MarkAsSimd128(node), VisitI32x4UConvertI16x8High(node);
    1869             :     case IrOpcode::kI32x4ShrU:
    1870         124 :       return MarkAsSimd128(node), VisitI32x4ShrU(node);
    1871             :     case IrOpcode::kI32x4MinU:
    1872           4 :       return MarkAsSimd128(node), VisitI32x4MinU(node);
    1873             :     case IrOpcode::kI32x4MaxU:
    1874           4 :       return MarkAsSimd128(node), VisitI32x4MaxU(node);
    1875             :     case IrOpcode::kI32x4GtU:
    1876           8 :       return MarkAsSimd128(node), VisitI32x4GtU(node);
    1877             :     case IrOpcode::kI32x4GeU:
    1878           8 :       return MarkAsSimd128(node), VisitI32x4GeU(node);
    1879             :     case IrOpcode::kI16x8Splat:
    1880         408 :       return MarkAsSimd128(node), VisitI16x8Splat(node);
    1881             :     case IrOpcode::kI16x8ExtractLane:
    1882        2656 :       return MarkAsWord32(node), VisitI16x8ExtractLane(node);
    1883             :     case IrOpcode::kI16x8ReplaceLane:
    1884          56 :       return MarkAsSimd128(node), VisitI16x8ReplaceLane(node);
    1885             :     case IrOpcode::kI16x8SConvertI8x16Low:
    1886           4 :       return MarkAsSimd128(node), VisitI16x8SConvertI8x16Low(node);
    1887             :     case IrOpcode::kI16x8SConvertI8x16High:
    1888           4 :       return MarkAsSimd128(node), VisitI16x8SConvertI8x16High(node);
    1889             :     case IrOpcode::kI16x8Neg:
    1890           4 :       return MarkAsSimd128(node), VisitI16x8Neg(node);
    1891             :     case IrOpcode::kI16x8Shl:
    1892          60 :       return MarkAsSimd128(node), VisitI16x8Shl(node);
    1893             :     case IrOpcode::kI16x8ShrS:
    1894          60 :       return MarkAsSimd128(node), VisitI16x8ShrS(node);
    1895             :     case IrOpcode::kI16x8SConvertI32x4:
    1896           4 :       return MarkAsSimd128(node), VisitI16x8SConvertI32x4(node);
    1897             :     case IrOpcode::kI16x8Add:
    1898           4 :       return MarkAsSimd128(node), VisitI16x8Add(node);
    1899             :     case IrOpcode::kI16x8AddSaturateS:
    1900           4 :       return MarkAsSimd128(node), VisitI16x8AddSaturateS(node);
    1901             :     case IrOpcode::kI16x8AddHoriz:
    1902           4 :       return MarkAsSimd128(node), VisitI16x8AddHoriz(node);
    1903             :     case IrOpcode::kI16x8Sub:
    1904           4 :       return MarkAsSimd128(node), VisitI16x8Sub(node);
    1905             :     case IrOpcode::kI16x8SubSaturateS:
    1906           4 :       return MarkAsSimd128(node), VisitI16x8SubSaturateS(node);
    1907             :     case IrOpcode::kI16x8Mul:
    1908           4 :       return MarkAsSimd128(node), VisitI16x8Mul(node);
    1909             :     case IrOpcode::kI16x8MinS:
    1910           4 :       return MarkAsSimd128(node), VisitI16x8MinS(node);
    1911             :     case IrOpcode::kI16x8MaxS:
    1912           4 :       return MarkAsSimd128(node), VisitI16x8MaxS(node);
    1913             :     case IrOpcode::kI16x8Eq:
    1914          12 :       return MarkAsSimd128(node), VisitI16x8Eq(node);
    1915             :     case IrOpcode::kI16x8Ne:
    1916          16 :       return MarkAsSimd128(node), VisitI16x8Ne(node);
    1917             :     case IrOpcode::kI16x8GtS:
    1918           8 :       return MarkAsSimd128(node), VisitI16x8GtS(node);
    1919             :     case IrOpcode::kI16x8GeS:
    1920           8 :       return MarkAsSimd128(node), VisitI16x8GeS(node);
    1921             :     case IrOpcode::kI16x8UConvertI8x16Low:
    1922           4 :       return MarkAsSimd128(node), VisitI16x8UConvertI8x16Low(node);
    1923             :     case IrOpcode::kI16x8UConvertI8x16High:
    1924           4 :       return MarkAsSimd128(node), VisitI16x8UConvertI8x16High(node);
    1925             :     case IrOpcode::kI16x8ShrU:
    1926          60 :       return MarkAsSimd128(node), VisitI16x8ShrU(node);
    1927             :     case IrOpcode::kI16x8UConvertI32x4:
    1928           4 :       return MarkAsSimd128(node), VisitI16x8UConvertI32x4(node);
    1929             :     case IrOpcode::kI16x8AddSaturateU:
    1930           4 :       return MarkAsSimd128(node), VisitI16x8AddSaturateU(node);
    1931             :     case IrOpcode::kI16x8SubSaturateU:
    1932           4 :       return MarkAsSimd128(node), VisitI16x8SubSaturateU(node);
    1933             :     case IrOpcode::kI16x8MinU:
    1934           4 :       return MarkAsSimd128(node), VisitI16x8MinU(node);
    1935             :     case IrOpcode::kI16x8MaxU:
    1936           4 :       return MarkAsSimd128(node), VisitI16x8MaxU(node);
    1937             :     case IrOpcode::kI16x8GtU:
    1938           8 :       return MarkAsSimd128(node), VisitI16x8GtU(node);
    1939             :     case IrOpcode::kI16x8GeU:
    1940           8 :       return MarkAsSimd128(node), VisitI16x8GeU(node);
    1941             :     case IrOpcode::kI8x16Splat:
    1942         304 :       return MarkAsSimd128(node), VisitI8x16Splat(node);
    1943             :     case IrOpcode::kI8x16ExtractLane:
    1944        3968 :       return MarkAsWord32(node), VisitI8x16ExtractLane(node);
    1945             :     case IrOpcode::kI8x16ReplaceLane:
    1946          88 :       return MarkAsSimd128(node), VisitI8x16ReplaceLane(node);
    1947             :     case IrOpcode::kI8x16Neg:
    1948           4 :       return MarkAsSimd128(node), VisitI8x16Neg(node);
    1949             :     case IrOpcode::kI8x16Shl:
    1950          28 :       return MarkAsSimd128(node), VisitI8x16Shl(node);
    1951             :     case IrOpcode::kI8x16ShrS:
    1952          28 :       return MarkAsSimd128(node), VisitI8x16ShrS(node);
    1953             :     case IrOpcode::kI8x16SConvertI16x8:
    1954           4 :       return MarkAsSimd128(node), VisitI8x16SConvertI16x8(node);
    1955             :     case IrOpcode::kI8x16Add:
    1956           4 :       return MarkAsSimd128(node), VisitI8x16Add(node);
    1957             :     case IrOpcode::kI8x16AddSaturateS:
    1958           4 :       return MarkAsSimd128(node), VisitI8x16AddSaturateS(node);
    1959             :     case IrOpcode::kI8x16Sub:
    1960           4 :       return MarkAsSimd128(node), VisitI8x16Sub(node);
    1961             :     case IrOpcode::kI8x16SubSaturateS:
    1962           4 :       return MarkAsSimd128(node), VisitI8x16SubSaturateS(node);
    1963             :     case IrOpcode::kI8x16Mul:
    1964           4 :       return MarkAsSimd128(node), VisitI8x16Mul(node);
    1965             :     case IrOpcode::kI8x16MinS:
    1966           4 :       return MarkAsSimd128(node), VisitI8x16MinS(node);
    1967             :     case IrOpcode::kI8x16MaxS:
    1968           4 :       return MarkAsSimd128(node), VisitI8x16MaxS(node);
    1969             :     case IrOpcode::kI8x16Eq:
    1970          12 :       return MarkAsSimd128(node), VisitI8x16Eq(node);
    1971             :     case IrOpcode::kI8x16Ne:
    1972          16 :       return MarkAsSimd128(node), VisitI8x16Ne(node);
    1973             :     case IrOpcode::kI8x16GtS:
    1974           8 :       return MarkAsSimd128(node), VisitI8x16GtS(node);
    1975             :     case IrOpcode::kI8x16GeS:
    1976           8 :       return MarkAsSimd128(node), VisitI8x16GeS(node);
    1977             :     case IrOpcode::kI8x16ShrU:
    1978          28 :       return MarkAsSimd128(node), VisitI8x16ShrU(node);
    1979             :     case IrOpcode::kI8x16UConvertI16x8:
    1980           4 :       return MarkAsSimd128(node), VisitI8x16UConvertI16x8(node);
    1981             :     case IrOpcode::kI8x16AddSaturateU:
    1982           4 :       return MarkAsSimd128(node), VisitI8x16AddSaturateU(node);
    1983             :     case IrOpcode::kI8x16SubSaturateU:
    1984           4 :       return MarkAsSimd128(node), VisitI8x16SubSaturateU(node);
    1985             :     case IrOpcode::kI8x16MinU:
    1986           4 :       return MarkAsSimd128(node), VisitI8x16MinU(node);
    1987             :     case IrOpcode::kI8x16MaxU:
    1988           4 :       return MarkAsSimd128(node), VisitI8x16MaxU(node);
    1989             :     case IrOpcode::kI8x16GtU:
    1990           8 :       return MarkAsSimd128(node), VisitI8x16GtU(node);
    1991             :     case IrOpcode::kI8x16GeU:
    1992           8 :       return MarkAsSimd128(node), VisitI16x8GeU(node);
    1993             :     case IrOpcode::kS128Zero:
    1994          16 :       return MarkAsSimd128(node), VisitS128Zero(node);
    1995             :     case IrOpcode::kS128And:
    1996           4 :       return MarkAsSimd128(node), VisitS128And(node);
    1997             :     case IrOpcode::kS128Or:
    1998           4 :       return MarkAsSimd128(node), VisitS128Or(node);
    1999             :     case IrOpcode::kS128Xor:
    2000           4 :       return MarkAsSimd128(node), VisitS128Xor(node);
    2001             :     case IrOpcode::kS128Not:
    2002           4 :       return MarkAsSimd128(node), VisitS128Not(node);
    2003             :     case IrOpcode::kS128Select:
    2004          28 :       return MarkAsSimd128(node), VisitS128Select(node);
    2005             :     case IrOpcode::kS8x16Shuffle:
    2006        5144 :       return MarkAsSimd128(node), VisitS8x16Shuffle(node);
    2007             :     case IrOpcode::kS1x4AnyTrue:
    2008          20 :       return MarkAsWord32(node), VisitS1x4AnyTrue(node);
    2009             :     case IrOpcode::kS1x4AllTrue:
    2010          20 :       return MarkAsWord32(node), VisitS1x4AllTrue(node);
    2011             :     case IrOpcode::kS1x8AnyTrue:
    2012          20 :       return MarkAsWord32(node), VisitS1x8AnyTrue(node);
    2013             :     case IrOpcode::kS1x8AllTrue:
    2014          20 :       return MarkAsWord32(node), VisitS1x8AllTrue(node);
    2015             :     case IrOpcode::kS1x16AnyTrue:
    2016          20 :       return MarkAsWord32(node), VisitS1x16AnyTrue(node);
    2017             :     case IrOpcode::kS1x16AllTrue:
    2018          20 :       return MarkAsWord32(node), VisitS1x16AllTrue(node);
    2019             :     default:
    2020           0 :       FATAL("Unexpected operator #%d:%s @ node #%d", node->opcode(),
    2021           0 :             node->op()->mnemonic(), node->id());
    2022             :       break;
    2023             :   }
    2024             : }
    2025             : 
    2026           0 : void InstructionSelector::EmitWordPoisonOnSpeculation(Node* node) {
    2027           0 :   if (poisoning_level_ != PoisoningMitigationLevel::kDontPoison) {
    2028             :     OperandGenerator g(this);
    2029           0 :     Node* input_node = NodeProperties::GetValueInput(node, 0);
    2030           0 :     InstructionOperand input = g.UseRegister(input_node);
    2031           0 :     InstructionOperand output = g.DefineSameAsFirst(node);
    2032           0 :     Emit(kArchWordPoisonOnSpeculation, output, input);
    2033             :   } else {
    2034           0 :     EmitIdentity(node);
    2035             :   }
    2036           0 : }
    2037             : 
    2038           0 : void InstructionSelector::VisitWord32PoisonOnSpeculation(Node* node) {
    2039           0 :   EmitWordPoisonOnSpeculation(node);
    2040           0 : }
    2041             : 
    2042           0 : void InstructionSelector::VisitWord64PoisonOnSpeculation(Node* node) {
    2043           0 :   EmitWordPoisonOnSpeculation(node);
    2044           0 : }
    2045             : 
    2046           0 : void InstructionSelector::VisitTaggedPoisonOnSpeculation(Node* node) {
    2047           0 :   EmitWordPoisonOnSpeculation(node);
    2048           0 : }
    2049             : 
    2050           1 : void InstructionSelector::VisitLoadStackPointer(Node* node) {
    2051             :   OperandGenerator g(this);
    2052           1 :   Emit(kArchStackPointer, g.DefineAsRegister(node));
    2053           1 : }
    2054             : 
    2055       31038 : void InstructionSelector::VisitLoadFramePointer(Node* node) {
    2056             :   OperandGenerator g(this);
    2057       31038 :   Emit(kArchFramePointer, g.DefineAsRegister(node));
    2058       31038 : }
    2059             : 
    2060       50404 : void InstructionSelector::VisitLoadParentFramePointer(Node* node) {
    2061             :   OperandGenerator g(this);
    2062       50404 :   Emit(kArchParentFramePointer, g.DefineAsRegister(node));
    2063       50404 : }
    2064             : 
    2065           0 : void InstructionSelector::VisitFloat64Acos(Node* node) {
    2066         116 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Acos);
    2067           0 : }
    2068             : 
    2069           0 : void InstructionSelector::VisitFloat64Acosh(Node* node) {
    2070         116 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Acosh);
    2071           0 : }
    2072             : 
    2073           0 : void InstructionSelector::VisitFloat64Asin(Node* node) {
    2074         116 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Asin);
    2075           0 : }
    2076             : 
    2077           0 : void InstructionSelector::VisitFloat64Asinh(Node* node) {
    2078         116 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Asinh);
    2079           0 : }
    2080             : 
    2081           0 : void InstructionSelector::VisitFloat64Atan(Node* node) {
    2082         133 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Atan);
    2083           0 : }
    2084             : 
    2085           0 : void InstructionSelector::VisitFloat64Atanh(Node* node) {
    2086         116 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Atanh);
    2087           0 : }
    2088             : 
    2089           0 : void InstructionSelector::VisitFloat64Atan2(Node* node) {
    2090         129 :   VisitFloat64Ieee754Binop(node, kIeee754Float64Atan2);
    2091           0 : }
    2092             : 
    2093           0 : void InstructionSelector::VisitFloat64Cbrt(Node* node) {
    2094         116 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Cbrt);
    2095           0 : }
    2096             : 
    2097           0 : void InstructionSelector::VisitFloat64Cos(Node* node) {
    2098         265 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Cos);
    2099           0 : }
    2100             : 
    2101           0 : void InstructionSelector::VisitFloat64Cosh(Node* node) {
    2102         123 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Cosh);
    2103           0 : }
    2104             : 
    2105           0 : void InstructionSelector::VisitFloat64Exp(Node* node) {
    2106         148 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Exp);
    2107           0 : }
    2108             : 
    2109           0 : void InstructionSelector::VisitFloat64Expm1(Node* node) {
    2110         123 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Expm1);
    2111           0 : }
    2112             : 
    2113           0 : void InstructionSelector::VisitFloat64Log(Node* node) {
    2114         284 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Log);
    2115           0 : }
    2116             : 
    2117           0 : void InstructionSelector::VisitFloat64Log1p(Node* node) {
    2118         116 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Log1p);
    2119           0 : }
    2120             : 
    2121           0 : void InstructionSelector::VisitFloat64Log2(Node* node) {
    2122         116 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Log2);
    2123           0 : }
    2124             : 
    2125           0 : void InstructionSelector::VisitFloat64Log10(Node* node) {
    2126         116 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Log10);
    2127           0 : }
    2128             : 
    2129           0 : void InstructionSelector::VisitFloat64Pow(Node* node) {
    2130         336 :   VisitFloat64Ieee754Binop(node, kIeee754Float64Pow);
    2131           0 : }
    2132             : 
    2133           0 : void InstructionSelector::VisitFloat64Sin(Node* node) {
    2134         268 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Sin);
    2135           0 : }
    2136             : 
    2137           0 : void InstructionSelector::VisitFloat64Sinh(Node* node) {
    2138         123 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Sinh);
    2139           0 : }
    2140             : 
    2141           0 : void InstructionSelector::VisitFloat64Tan(Node* node) {
    2142         168 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Tan);
    2143           0 : }
    2144             : 
    2145           0 : void InstructionSelector::VisitFloat64Tanh(Node* node) {
    2146         123 :   VisitFloat64Ieee754Unop(node, kIeee754Float64Tanh);
    2147           0 : }
    2148             : 
    2149      202299 : void InstructionSelector::EmitTableSwitch(const SwitchInfo& sw,
    2150         314 :                                           InstructionOperand& index_operand) {
    2151             :   OperandGenerator g(this);
    2152         314 :   size_t input_count = 2 + sw.value_range();
    2153             :   DCHECK_LE(sw.value_range(), std::numeric_limits<size_t>::max() - 2);
    2154             :   auto* inputs = zone()->NewArray<InstructionOperand>(input_count);
    2155         314 :   inputs[0] = index_operand;
    2156         314 :   InstructionOperand default_operand = g.Label(sw.default_branch());
    2157         314 :   std::fill(&inputs[1], &inputs[input_count], default_operand);
    2158      201671 :   for (const CaseInfo& c : sw.CasesUnsorted()) {
    2159      402086 :     size_t value = c.value - sw.min_value();
    2160             :     DCHECK_LE(0u, value);
    2161             :     DCHECK_LT(value + 2, input_count);
    2162      201043 :     inputs[value + 2] = g.Label(c.branch);
    2163             :   }
    2164         314 :   Emit(kArchTableSwitch, 0, nullptr, input_count, inputs, 0, nullptr);
    2165         314 : }
    2166             : 
    2167           0 : void InstructionSelector::EmitLookupSwitch(const SwitchInfo& sw,
    2168           0 :                                            InstructionOperand& value_operand) {
    2169             :   OperandGenerator g(this);
    2170           0 :   std::vector<CaseInfo> cases = sw.CasesSortedByOriginalOrder();
    2171           0 :   size_t input_count = 2 + sw.case_count() * 2;
    2172             :   DCHECK_LE(sw.case_count(), (std::numeric_limits<size_t>::max() - 2) / 2);
    2173             :   auto* inputs = zone()->NewArray<InstructionOperand>(input_count);
    2174           0 :   inputs[0] = value_operand;
    2175           0 :   inputs[1] = g.Label(sw.default_branch());
    2176           0 :   for (size_t index = 0; index < cases.size(); ++index) {
    2177             :     const CaseInfo& c = cases[index];
    2178           0 :     inputs[index * 2 + 2 + 0] = g.TempImmediate(c.value);
    2179           0 :     inputs[index * 2 + 2 + 1] = g.Label(c.branch);
    2180             :   }
    2181           0 :   Emit(kArchLookupSwitch, 0, nullptr, input_count, inputs, 0, nullptr);
    2182           0 : }
    2183             : 
    2184       34722 : void InstructionSelector::EmitBinarySearchSwitch(
    2185      138888 :     const SwitchInfo& sw, InstructionOperand& value_operand) {
    2186             :   OperandGenerator g(this);
    2187       34722 :   size_t input_count = 2 + sw.case_count() * 2;
    2188             :   DCHECK_LE(sw.case_count(), (std::numeric_limits<size_t>::max() - 2) / 2);
    2189             :   auto* inputs = zone()->NewArray<InstructionOperand>(input_count);
    2190       34722 :   inputs[0] = value_operand;
    2191       69444 :   inputs[1] = g.Label(sw.default_branch());
    2192       34722 :   std::vector<CaseInfo> cases = sw.CasesSortedByValue();
    2193             :   std::stable_sort(cases.begin(), cases.end(),
    2194       34722 :                    [](CaseInfo a, CaseInfo b) { return a.value < b.value; });
    2195      508658 :   for (size_t index = 0; index < cases.size(); ++index) {
    2196             :     const CaseInfo& c = cases[index];
    2197      202246 :     inputs[index * 2 + 2 + 0] = g.TempImmediate(c.value);
    2198      202245 :     inputs[index * 2 + 2 + 1] = g.Label(c.branch);
    2199             :   }
    2200       34722 :   Emit(kArchBinarySearchSwitch, 0, nullptr, input_count, inputs, 0, nullptr);
    2201       34722 : }
    2202             : 
    2203           0 : void InstructionSelector::VisitBitcastTaggedToWord(Node* node) {
    2204     1341695 :   EmitIdentity(node);
    2205           0 : }
    2206             : 
    2207      541323 : void InstructionSelector::VisitBitcastWordToTagged(Node* node) {
    2208             :   OperandGenerator g(this);
    2209      541323 :   Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(node->InputAt(0)));
    2210      541325 : }
    2211             : 
    2212             : // 32 bit targets do not implement the following instructions.
    2213             : #if V8_TARGET_ARCH_32_BIT
    2214             : 
    2215             : void InstructionSelector::VisitWord64And(Node* node) { UNIMPLEMENTED(); }
    2216             : 
    2217             : void InstructionSelector::VisitWord64Or(Node* node) { UNIMPLEMENTED(); }
    2218             : 
    2219             : void InstructionSelector::VisitWord64Xor(Node* node) { UNIMPLEMENTED(); }
    2220             : 
    2221             : void InstructionSelector::VisitWord64Shl(Node* node) { UNIMPLEMENTED(); }
    2222             : 
    2223             : void InstructionSelector::VisitWord64Shr(Node* node) { UNIMPLEMENTED(); }
    2224             : 
    2225             : void InstructionSelector::VisitWord64Sar(Node* node) { UNIMPLEMENTED(); }
    2226             : 
    2227             : void InstructionSelector::VisitWord64Ror(Node* node) { UNIMPLEMENTED(); }
    2228             : 
    2229             : void InstructionSelector::VisitWord64Clz(Node* node) { UNIMPLEMENTED(); }
    2230             : 
    2231             : void InstructionSelector::VisitWord64Ctz(Node* node) { UNIMPLEMENTED(); }
    2232             : 
    2233             : void InstructionSelector::VisitWord64ReverseBits(Node* node) {
    2234             :   UNIMPLEMENTED();
    2235             : }
    2236             : 
    2237             : void InstructionSelector::VisitWord64Popcnt(Node* node) { UNIMPLEMENTED(); }
    2238             : 
    2239             : void InstructionSelector::VisitWord64Equal(Node* node) { UNIMPLEMENTED(); }
    2240             : 
    2241             : void InstructionSelector::VisitInt64Add(Node* node) { UNIMPLEMENTED(); }
    2242             : 
    2243             : void InstructionSelector::VisitInt64AddWithOverflow(Node* node) {
    2244             :   UNIMPLEMENTED();
    2245             : }
    2246             : 
    2247             : void InstructionSelector::VisitInt64Sub(Node* node) { UNIMPLEMENTED(); }
    2248             : 
    2249             : void InstructionSelector::VisitInt64SubWithOverflow(Node* node) {
    2250             :   UNIMPLEMENTED();
    2251             : }
    2252             : 
    2253             : void InstructionSelector::VisitInt64Mul(Node* node) { UNIMPLEMENTED(); }
    2254             : 
    2255             : void InstructionSelector::VisitInt64Div(Node* node) { UNIMPLEMENTED(); }
    2256             : 
    2257             : void InstructionSelector::VisitInt64LessThan(Node* node) { UNIMPLEMENTED(); }
    2258             : 
    2259             : void InstructionSelector::VisitInt64LessThanOrEqual(Node* node) {
    2260             :   UNIMPLEMENTED();
    2261             : }
    2262             : 
    2263             : void InstructionSelector::VisitUint64Div(Node* node) { UNIMPLEMENTED(); }
    2264             : 
    2265             : void InstructionSelector::VisitInt64Mod(Node* node) { UNIMPLEMENTED(); }
    2266             : 
    2267             : void InstructionSelector::VisitUint64LessThan(Node* node) { UNIMPLEMENTED(); }
    2268             : 
    2269             : void InstructionSelector::VisitUint64LessThanOrEqual(Node* node) {
    2270             :   UNIMPLEMENTED();
    2271             : }
    2272             : 
    2273             : void InstructionSelector::VisitUint64Mod(Node* node) { UNIMPLEMENTED(); }
    2274             : 
    2275             : void InstructionSelector::VisitChangeInt32ToInt64(Node* node) {
    2276             :   UNIMPLEMENTED();
    2277             : }
    2278             : 
    2279             : void InstructionSelector::VisitChangeInt64ToFloat64(Node* node) {
    2280             :   UNIMPLEMENTED();
    2281             : }
    2282             : 
    2283             : void InstructionSelector::VisitChangeUint32ToUint64(Node* node) {
    2284             :   UNIMPLEMENTED();
    2285             : }
    2286             : 
    2287             : void InstructionSelector::VisitChangeFloat64ToInt64(Node* node) {
    2288             :   UNIMPLEMENTED();
    2289             : }
    2290             : 
    2291             : void InstructionSelector::VisitChangeFloat64ToUint64(Node* node) {
    2292             :   UNIMPLEMENTED();
    2293             : }
    2294             : 
    2295             : void InstructionSelector::VisitTruncateFloat64ToInt64(Node* node) {
    2296             :   UNIMPLEMENTED();
    2297             : }
    2298             : 
    2299             : void InstructionSelector::VisitTryTruncateFloat32ToInt64(Node* node) {
    2300             :   UNIMPLEMENTED();
    2301             : }
    2302             : 
    2303             : void InstructionSelector::VisitTryTruncateFloat64ToInt64(Node* node) {
    2304             :   UNIMPLEMENTED();
    2305             : }
    2306             : 
    2307             : void InstructionSelector::VisitTryTruncateFloat32ToUint64(Node* node) {
    2308             :   UNIMPLEMENTED();
    2309             : }
    2310             : 
    2311             : void InstructionSelector::VisitTryTruncateFloat64ToUint64(Node* node) {
    2312             :   UNIMPLEMENTED();
    2313             : }
    2314             : 
    2315             : void InstructionSelector::VisitTruncateInt64ToInt32(Node* node) {
    2316             :   UNIMPLEMENTED();
    2317             : }
    2318             : 
    2319             : void InstructionSelector::VisitRoundInt64ToFloat32(Node* node) {
    2320             :   UNIMPLEMENTED();
    2321             : }
    2322             : 
    2323             : void InstructionSelector::VisitRoundInt64ToFloat64(Node* node) {
    2324             :   UNIMPLEMENTED();
    2325             : }
    2326             : 
    2327             : void InstructionSelector::VisitRoundUint64ToFloat32(Node* node) {
    2328             :   UNIMPLEMENTED();
    2329             : }
    2330             : 
    2331             : void InstructionSelector::VisitRoundUint64ToFloat64(Node* node) {
    2332             :   UNIMPLEMENTED();
    2333             : }
    2334             : 
    2335             : void InstructionSelector::VisitBitcastFloat64ToInt64(Node* node) {
    2336             :   UNIMPLEMENTED();
    2337             : }
    2338             : 
    2339             : void InstructionSelector::VisitBitcastInt64ToFloat64(Node* node) {
    2340             :   UNIMPLEMENTED();
    2341             : }
    2342             : 
    2343             : void InstructionSelector::VisitSignExtendWord8ToInt64(Node* node) {
    2344             :   UNIMPLEMENTED();
    2345             : }
    2346             : 
    2347             : void InstructionSelector::VisitSignExtendWord16ToInt64(Node* node) {
    2348             :   UNIMPLEMENTED();
    2349             : }
    2350             : 
    2351             : void InstructionSelector::VisitSignExtendWord32ToInt64(Node* node) {
    2352             :   UNIMPLEMENTED();
    2353             : }
    2354             : #endif  // V8_TARGET_ARCH_32_BIT
    2355             : 
    2356             : // 64 bit targets do not implement the following instructions.
    2357             : #if V8_TARGET_ARCH_64_BIT
    2358           0 : void InstructionSelector::VisitInt32PairAdd(Node* node) { UNIMPLEMENTED(); }
    2359             : 
    2360           0 : void InstructionSelector::VisitInt32PairSub(Node* node) { UNIMPLEMENTED(); }
    2361             : 
    2362           0 : void InstructionSelector::VisitInt32PairMul(Node* node) { UNIMPLEMENTED(); }
    2363             : 
    2364           0 : void InstructionSelector::VisitWord32PairShl(Node* node) { UNIMPLEMENTED(); }
    2365             : 
    2366           0 : void InstructionSelector::VisitWord32PairShr(Node* node) { UNIMPLEMENTED(); }
    2367             : 
    2368           0 : void InstructionSelector::VisitWord32PairSar(Node* node) { UNIMPLEMENTED(); }
    2369             : #endif  // V8_TARGET_ARCH_64_BIT
    2370             : 
    2371             : #if !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_MIPS
    2372           0 : void InstructionSelector::VisitWord32AtomicPairLoad(Node* node) {
    2373           0 :   UNIMPLEMENTED();
    2374             : }
    2375             : 
    2376           0 : void InstructionSelector::VisitWord32AtomicPairStore(Node* node) {
    2377           0 :   UNIMPLEMENTED();
    2378             : }
    2379             : 
    2380           0 : void InstructionSelector::VisitWord32AtomicPairAdd(Node* node) {
    2381           0 :   UNIMPLEMENTED();
    2382             : }
    2383             : 
    2384           0 : void InstructionSelector::VisitWord32AtomicPairSub(Node* node) {
    2385           0 :   UNIMPLEMENTED();
    2386             : }
    2387             : 
    2388           0 : void InstructionSelector::VisitWord32AtomicPairAnd(Node* node) {
    2389           0 :   UNIMPLEMENTED();
    2390             : }
    2391             : 
    2392           0 : void InstructionSelector::VisitWord32AtomicPairOr(Node* node) {
    2393           0 :   UNIMPLEMENTED();
    2394             : }
    2395             : 
    2396           0 : void InstructionSelector::VisitWord32AtomicPairXor(Node* node) {
    2397           0 :   UNIMPLEMENTED();
    2398             : }
    2399             : 
    2400           0 : void InstructionSelector::VisitWord32AtomicPairExchange(Node* node) {
    2401           0 :   UNIMPLEMENTED();
    2402             : }
    2403             : 
    2404           0 : void InstructionSelector::VisitWord32AtomicPairCompareExchange(Node* node) {
    2405           0 :   UNIMPLEMENTED();
    2406             : }
    2407             : #endif  // !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_MIPS
    2408             : 
    2409             : #if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_MIPS64 && \
    2410             :     !V8_TARGET_ARCH_S390 && !V8_TARGET_ARCH_PPC
    2411             : void InstructionSelector::VisitWord64AtomicLoad(Node* node) { UNIMPLEMENTED(); }
    2412             : 
    2413             : void InstructionSelector::VisitWord64AtomicStore(Node* node) {
    2414             :   UNIMPLEMENTED();
    2415             : }
    2416             : 
    2417             : void InstructionSelector::VisitWord64AtomicAdd(Node* node) { UNIMPLEMENTED(); }
    2418             : 
    2419             : void InstructionSelector::VisitWord64AtomicSub(Node* node) { UNIMPLEMENTED(); }
    2420             : 
    2421             : void InstructionSelector::VisitWord64AtomicAnd(Node* node) { UNIMPLEMENTED(); }
    2422             : 
    2423             : void InstructionSelector::VisitWord64AtomicOr(Node* node) { UNIMPLEMENTED(); }
    2424             : 
    2425             : void InstructionSelector::VisitWord64AtomicXor(Node* node) { UNIMPLEMENTED(); }
    2426             : 
    2427             : void InstructionSelector::VisitWord64AtomicExchange(Node* node) {
    2428             :   UNIMPLEMENTED();
    2429             : }
    2430             : 
    2431             : void InstructionSelector::VisitWord64AtomicCompareExchange(Node* node) {
    2432             :   UNIMPLEMENTED();
    2433             : }
    2434             : #endif  // !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_PPC
    2435             :         // !V8_TARGET_ARCH_MIPS64 && !V8_TARGET_ARCH_S390
    2436             : 
    2437           1 : void InstructionSelector::VisitFinishRegion(Node* node) { EmitIdentity(node); }
    2438             : 
    2439    12740480 : void InstructionSelector::VisitParameter(Node* node) {
    2440             :   OperandGenerator g(this);
    2441     3166788 :   int index = ParameterIndexOf(node->op());
    2442             :   InstructionOperand op =
    2443     3166871 :       linkage()->ParameterHasSecondaryLocation(index)
    2444             :           ? g.DefineAsDualLocation(
    2445             :                 node, linkage()->GetParameterLocation(index),
    2446      146208 :                 linkage()->GetParameterSecondaryLocation(index))
    2447     6333862 :           : g.DefineAsLocation(node, linkage()->GetParameterLocation(index));
    2448             : 
    2449     3166938 :   Emit(kArchNop, op);
    2450     3166869 : }
    2451             : 
    2452             : namespace {
    2453             : LinkageLocation ExceptionLocation() {
    2454             :   return LinkageLocation::ForRegister(kReturnRegister0.code(),
    2455             :                                       MachineType::IntPtr());
    2456             : }
    2457             : }  // namespace
    2458             : 
    2459      197251 : void InstructionSelector::VisitIfException(Node* node) {
    2460             :   OperandGenerator g(this);
    2461             :   DCHECK_EQ(IrOpcode::kCall, node->InputAt(1)->opcode());
    2462      197251 :   Emit(kArchNop, g.DefineAsLocation(node, ExceptionLocation()));
    2463      197251 : }
    2464             : 
    2465       68955 : void InstructionSelector::VisitOsrValue(Node* node) {
    2466             :   OperandGenerator g(this);
    2467       22985 :   int index = OsrValueIndexOf(node->op());
    2468             :   Emit(kArchNop,
    2469       22985 :        g.DefineAsLocation(node, linkage()->GetOsrValueLocation(index)));
    2470       22985 : }
    2471             : 
    2472     4197614 : void InstructionSelector::VisitPhi(Node* node) {
    2473     2098806 :   const int input_count = node->op()->ValueInputCount();
    2474             :   DCHECK_EQ(input_count, current_block_->PredecessorCount());
    2475             :   PhiInstruction* phi = new (instruction_zone())
    2476             :       PhiInstruction(instruction_zone(), GetVirtualRegister(node),
    2477     4197625 :                      static_cast<size_t>(input_count));
    2478             :   sequence()
    2479             :       ->InstructionBlockAt(RpoNumber::FromInt(current_block_->rpo_number()))
    2480     4197616 :       ->AddPhi(phi);
    2481     7179356 :   for (int i = 0; i < input_count; ++i) {
    2482             :     Node* const input = node->InputAt(i);
    2483             :     MarkAsUsed(input);
    2484     5080535 :     phi->SetInput(static_cast<size_t>(i), GetVirtualRegister(input));
    2485             :   }
    2486     2098821 : }
    2487             : 
    2488      570174 : void InstructionSelector::VisitProjection(Node* node) {
    2489             :   OperandGenerator g(this);
    2490      292325 :   Node* value = node->InputAt(0);
    2491      292325 :   switch (value->opcode()) {
    2492             :     case IrOpcode::kInt32AddWithOverflow:
    2493             :     case IrOpcode::kInt32SubWithOverflow:
    2494             :     case IrOpcode::kInt32MulWithOverflow:
    2495             :     case IrOpcode::kInt64AddWithOverflow:
    2496             :     case IrOpcode::kInt64SubWithOverflow:
    2497             :     case IrOpcode::kTryTruncateFloat32ToInt64:
    2498             :     case IrOpcode::kTryTruncateFloat64ToInt64:
    2499             :     case IrOpcode::kTryTruncateFloat32ToUint64:
    2500             :     case IrOpcode::kTryTruncateFloat64ToUint64:
    2501             :     case IrOpcode::kInt32PairAdd:
    2502             :     case IrOpcode::kInt32PairSub:
    2503             :     case IrOpcode::kInt32PairMul:
    2504             :     case IrOpcode::kWord32PairShl:
    2505             :     case IrOpcode::kWord32PairShr:
    2506             :     case IrOpcode::kWord32PairSar:
    2507             :     case IrOpcode::kInt32AbsWithOverflow:
    2508             :     case IrOpcode::kInt64AbsWithOverflow:
    2509      277849 :       if (ProjectionIndexOf(node->op()) == 0u) {
    2510      181523 :         Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(value));
    2511             :       } else {
    2512             :         DCHECK_EQ(1u, ProjectionIndexOf(node->op()));
    2513             :         MarkAsUsed(value);
    2514             :       }
    2515             :       break;
    2516             :     default:
    2517             :       break;
    2518             :   }
    2519      292327 : }
    2520             : 
    2521    12527783 : void InstructionSelector::VisitConstant(Node* node) {
    2522             :   // We must emit a NOP here because every live range needs a defining
    2523             :   // instruction in the register allocator.
    2524             :   OperandGenerator g(this);
    2525    12527783 :   Emit(kArchNop, g.DefineAsConstant(node));
    2526    12527901 : }
    2527             : 
    2528    22882717 : void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) {
    2529             :   OperandGenerator g(this);
    2530    14657747 :   auto call_descriptor = CallDescriptorOf(node->op());
    2531             : 
    2532             :   FrameStateDescriptor* frame_state_descriptor = nullptr;
    2533     5720677 :   if (call_descriptor->NeedsFrameState()) {
    2534             :     frame_state_descriptor = GetFrameStateDescriptor(
    2535     6380386 :         node->InputAt(static_cast<int>(call_descriptor->InputCount())));
    2536             :   }
    2537             : 
    2538     5720673 :   CallBuffer buffer(zone(), call_descriptor, frame_state_descriptor);
    2539             :   CallDescriptor::Flags flags = call_descriptor->flags();
    2540             : 
    2541             :   // Compute InstructionOperands for inputs and outputs.
    2542             :   // TODO(turbofan): on some architectures it's probably better to use
    2543             :   // the code object in a register if there are multiple uses of it.
    2544             :   // Improve constant pool and the heuristics in the register allocator
    2545             :   // for where to emit constants.
    2546             :   CallBufferFlags call_buffer_flags(kCallCodeImmediate | kCallAddressImmediate);
    2547     5720691 :   if (flags & CallDescriptor::kAllowCallThroughSlot) {
    2548             :     // TODO(v8:6666): Remove kAllowCallThroughSlot and use a pc-relative call
    2549             :     // instead once builtins are embedded in every build configuration.
    2550             :     call_buffer_flags |= kAllowCallThroughSlot;
    2551             : #ifndef V8_TARGET_ARCH_32_BIT
    2552             :     // kAllowCallThroughSlot is only supported on ia32.
    2553           0 :     UNREACHABLE();
    2554             : #endif
    2555             :   }
    2556     5720691 :   InitializeCallBuffer(node, &buffer, call_buffer_flags, false);
    2557             : 
    2558     5720689 :   EmitPrepareArguments(&(buffer.pushed_nodes), call_descriptor, node);
    2559             : 
    2560             :   // Pass label of exception handler block.
    2561     5720677 :   if (handler) {
    2562             :     DCHECK_EQ(IrOpcode::kIfException, handler->front()->opcode());
    2563             :     flags |= CallDescriptor::kHasExceptionHandler;
    2564      436707 :     buffer.instruction_args.push_back(g.Label(handler));
    2565             :   }
    2566             : 
    2567             :   // Select the appropriate opcode based on the call type.
    2568             :   InstructionCode opcode = kArchNop;
    2569     5720678 :   switch (call_descriptor->kind()) {
    2570             :     case CallDescriptor::kCallAddress:
    2571       26201 :       opcode = kArchCallCFunction | MiscField::encode(static_cast<int>(
    2572       26201 :                                         call_descriptor->ParameterCount()));
    2573       26201 :       break;
    2574             :     case CallDescriptor::kCallCodeObject:
    2575     4711989 :       opcode = kArchCallCodeObject | MiscField::encode(flags);
    2576     4711989 :       break;
    2577             :     case CallDescriptor::kCallJSFunction:
    2578       23794 :       opcode = kArchCallJSFunction | MiscField::encode(flags);
    2579       23794 :       break;
    2580             :     case CallDescriptor::kCallWasmFunction:
    2581             :     case CallDescriptor::kCallWasmImportWrapper:
    2582      956197 :       opcode = kArchCallWasmFunction | MiscField::encode(flags);
    2583      956197 :       break;
    2584             :     case CallDescriptor::kCallBuiltinPointer:
    2585        2488 :       opcode = kArchCallBuiltinPointer | MiscField::encode(flags);
    2586        2488 :       break;
    2587             :   }
    2588             : 
    2589             :   // Emit the call instruction.
    2590     5720678 :   size_t const output_count = buffer.outputs.size();
    2591     5720678 :   auto* outputs = output_count ? &buffer.outputs.front() : nullptr;
    2592             :   Instruction* call_instr =
    2593             :       Emit(opcode, output_count, outputs, buffer.instruction_args.size(),
    2594    11441356 :            &buffer.instruction_args.front());
    2595    11441366 :   if (instruction_selection_failed()) return;
    2596             :   call_instr->MarkAsCall();
    2597             : 
    2598     5720693 :   EmitPrepareResults(&(buffer.output_nodes), call_descriptor, node);
    2599             : }
    2600             : 
    2601         676 : void InstructionSelector::VisitCallWithCallerSavedRegisters(
    2602         676 :     Node* node, BasicBlock* handler) {
    2603             :   OperandGenerator g(this);
    2604         676 :   const auto fp_mode = CallDescriptorOf(node->op())->get_save_fp_mode();
    2605         676 :   Emit(kArchSaveCallerRegisters | MiscField::encode(static_cast<int>(fp_mode)),
    2606         676 :        g.NoOutput());
    2607         676 :   VisitCall(node, handler);
    2608         676 :   Emit(kArchRestoreCallerRegisters |
    2609             :            MiscField::encode(static_cast<int>(fp_mode)),
    2610         676 :        g.NoOutput());
    2611         676 : }
    2612             : 
    2613      834904 : void InstructionSelector::VisitTailCall(Node* node) {
    2614             :   OperandGenerator g(this);
    2615      238544 :   auto call_descriptor = CallDescriptorOf(node->op());
    2616             : 
    2617             :   CallDescriptor* caller = linkage()->GetIncomingDescriptor();
    2618             :   DCHECK(caller->CanTailCall(node));
    2619      119272 :   const CallDescriptor* callee = CallDescriptorOf(node->op());
    2620      119272 :   int stack_param_delta = callee->GetStackParameterDelta(caller);
    2621      119272 :   CallBuffer buffer(zone(), call_descriptor, nullptr);
    2622             : 
    2623             :   // Compute InstructionOperands for inputs and outputs.
    2624             :   CallBufferFlags flags(kCallCodeImmediate | kCallTail);
    2625      119272 :   if (IsTailCallAddressImmediate()) {
    2626             :     flags |= kCallAddressImmediate;
    2627             :   }
    2628      119272 :   if (callee->flags() & CallDescriptor::kFixedTargetRegister) {
    2629             :     flags |= kCallFixedTargetRegister;
    2630             :   }
    2631             :   DCHECK_EQ(callee->flags() & CallDescriptor::kAllowCallThroughSlot, 0);
    2632      119272 :   InitializeCallBuffer(node, &buffer, flags, true, stack_param_delta);
    2633             : 
    2634             :   // Select the appropriate opcode based on the call type.
    2635             :   InstructionCode opcode;
    2636             :   InstructionOperandVector temps(zone());
    2637      119272 :   if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) {
    2638        1344 :     switch (call_descriptor->kind()) {
    2639             :       case CallDescriptor::kCallCodeObject:
    2640             :         opcode = kArchTailCallCodeObjectFromJSFunction;
    2641             :         break;
    2642             :       default:
    2643           0 :         UNREACHABLE();
    2644             :         return;
    2645             :     }
    2646        1344 :     int temps_count = GetTempsCountForTailCallFromJSFunction();
    2647        5376 :     for (int i = 0; i < temps_count; i++) {
    2648        8064 :       temps.push_back(g.TempRegister());
    2649             :     }
    2650             :   } else {
    2651      117928 :     switch (call_descriptor->kind()) {
    2652             :       case CallDescriptor::kCallCodeObject:
    2653             :         opcode = kArchTailCallCodeObject;
    2654             :         break;
    2655             :       case CallDescriptor::kCallAddress:
    2656             :         opcode = kArchTailCallAddress;
    2657       84728 :         break;
    2658             :       case CallDescriptor::kCallWasmFunction:
    2659             :         opcode = kArchTailCallWasm;
    2660           0 :         break;
    2661             :       default:
    2662           0 :         UNREACHABLE();
    2663             :         return;
    2664             :     }
    2665             :   }
    2666      119272 :   opcode |= MiscField::encode(call_descriptor->flags());
    2667             : 
    2668      119272 :   Emit(kArchPrepareTailCall, g.NoOutput());
    2669             : 
    2670             :   // Add an immediate operand that represents the first slot that is unused
    2671             :   // with respect to the stack pointer that has been updated for the tail call
    2672             :   // instruction. This is used by backends that need to pad arguments for stack
    2673             :   // alignment, in order to store an optional slot of padding above the
    2674             :   // arguments.
    2675      119272 :   int optional_padding_slot = callee->GetFirstUnusedStackSlot();
    2676      238544 :   buffer.instruction_args.push_back(g.TempImmediate(optional_padding_slot));
    2677             : 
    2678             :   int first_unused_stack_slot =
    2679             :       (V8_TARGET_ARCH_STORES_RETURN_ADDRESS_ON_STACK ? true : false) +
    2680      119272 :       stack_param_delta;
    2681      238544 :   buffer.instruction_args.push_back(g.TempImmediate(first_unused_stack_slot));
    2682             : 
    2683             :   // Emit the tailcall instruction.
    2684             :   Emit(opcode, 0, nullptr, buffer.instruction_args.size(),
    2685             :        &buffer.instruction_args.front(), temps.size(),
    2686      357816 :        temps.empty() ? nullptr : &temps.front());
    2687      119272 : }
    2688             : 
    2689     9082048 : void InstructionSelector::VisitGoto(BasicBlock* target) {
    2690             :   // jump to the next block.
    2691             :   OperandGenerator g(this);
    2692     9082048 :   Emit(kArchJmp, g.NoOutput(), g.Label(target));
    2693     9082059 : }
    2694             : 
    2695    12091572 : void InstructionSelector::VisitReturn(Node* ret) {
    2696             :   OperandGenerator g(this);
    2697     2426724 :   const int input_count = linkage()->GetIncomingDescriptor()->ReturnCount() == 0
    2698             :                               ? 1
    2699     4824585 :                               : ret->op()->ValueInputCount();
    2700             :   DCHECK_GE(input_count, 1);
    2701     2426724 :   auto value_locations = zone()->NewArray<InstructionOperand>(input_count);
    2702     2426915 :   Node* pop_count = ret->InputAt(0);
    2703       52104 :   value_locations[0] = (pop_count->opcode() == IrOpcode::kInt32Constant ||
    2704             :                         pop_count->opcode() == IrOpcode::kInt64Constant)
    2705             :                            ? g.UseImmediate(pop_count)
    2706     4801746 :                            : g.UseRegister(pop_count);
    2707     2413549 :   for (int i = 1; i < input_count; ++i) {
    2708             :     value_locations[i] =
    2709     4827078 :         g.UseLocation(ret->InputAt(i), linkage()->GetReturnLocation(i - 1));
    2710             :   }
    2711     2426780 :   Emit(kArchRet, 0, nullptr, input_count, value_locations);
    2712     2426795 : }
    2713             : 
    2714     5358546 : void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch,
    2715             :                                       BasicBlock* fbranch) {
    2716     5358546 :   if (NeedsPoisoning(IsSafetyCheckOf(branch->op()))) {
    2717             :     FlagsContinuation cont =
    2718             :         FlagsContinuation::ForBranchAndPoison(kNotEqual, tbranch, fbranch);
    2719           0 :     VisitWordCompareZero(branch, branch->InputAt(0), &cont);
    2720             :   } else {
    2721             :     FlagsContinuation cont =
    2722             :         FlagsContinuation::ForBranch(kNotEqual, tbranch, fbranch);
    2723     5358536 :     VisitWordCompareZero(branch, branch->InputAt(0), &cont);
    2724             :   }
    2725     5358514 : }
    2726             : 
    2727      113160 : void InstructionSelector::VisitDeoptimizeIf(Node* node) {
    2728      113160 :   DeoptimizeParameters p = DeoptimizeParametersOf(node->op());
    2729      113160 :   if (NeedsPoisoning(p.is_safety_check())) {
    2730             :     FlagsContinuation cont = FlagsContinuation::ForDeoptimizeAndPoison(
    2731             :         kNotEqual, p.kind(), p.reason(), p.feedback(), node->InputAt(1));
    2732           0 :     VisitWordCompareZero(node, node->InputAt(0), &cont);
    2733             :   } else {
    2734             :     FlagsContinuation cont = FlagsContinuation::ForDeoptimize(
    2735             :         kNotEqual, p.kind(), p.reason(), p.feedback(), node->InputAt(1));
    2736      113159 :     VisitWordCompareZero(node, node->InputAt(0), &cont);
    2737             :   }
    2738      113162 : }
    2739             : 
    2740      220087 : void InstructionSelector::VisitDeoptimizeUnless(Node* node) {
    2741      220087 :   DeoptimizeParameters p = DeoptimizeParametersOf(node->op());
    2742      220087 :   if (NeedsPoisoning(p.is_safety_check())) {
    2743             :     FlagsContinuation cont = FlagsContinuation::ForDeoptimizeAndPoison(
    2744             :         kEqual, p.kind(), p.reason(), p.feedback(), node->InputAt(1));
    2745           0 :     VisitWordCompareZero(node, node->InputAt(0), &cont);
    2746             :   } else {
    2747             :     FlagsContinuation cont = FlagsContinuation::ForDeoptimize(
    2748             :         kEqual, p.kind(), p.reason(), p.feedback(), node->InputAt(1));
    2749      220087 :     VisitWordCompareZero(node, node->InputAt(0), &cont);
    2750             :   }
    2751      220087 : }
    2752             : 
    2753        5281 : void InstructionSelector::VisitTrapIf(Node* node, TrapId trap_id) {
    2754             :   FlagsContinuation cont =
    2755             :       FlagsContinuation::ForTrap(kNotEqual, trap_id, node->InputAt(1));
    2756        5283 :   VisitWordCompareZero(node, node->InputAt(0), &cont);
    2757        5288 : }
    2758             : 
    2759       28159 : void InstructionSelector::VisitTrapUnless(Node* node, TrapId trap_id) {
    2760             :   FlagsContinuation cont =
    2761             :       FlagsContinuation::ForTrap(kEqual, trap_id, node->InputAt(1));
    2762       28160 :   VisitWordCompareZero(node, node->InputAt(0), &cont);
    2763       28157 : }
    2764             : 
    2765     2493655 : void InstructionSelector::EmitIdentity(Node* node) {
    2766             :   OperandGenerator g(this);
    2767             :   MarkAsUsed(node->InputAt(0));
    2768     2493655 :   SetRename(node, node->InputAt(0));
    2769     2493666 : }
    2770             : 
    2771           0 : void InstructionSelector::VisitDeoptimize(DeoptimizeKind kind,
    2772             :                                           DeoptimizeReason reason,
    2773             :                                           VectorSlotPair const& feedback,
    2774             :                                           Node* value) {
    2775             :   EmitDeoptimize(kArchDeoptimize, 0, nullptr, 0, nullptr, kind, reason,
    2776       45611 :                  feedback, value);
    2777           0 : }
    2778             : 
    2779           0 : void InstructionSelector::VisitThrow(Node* node) {
    2780             :   OperandGenerator g(this);
    2781      233920 :   Emit(kArchThrowTerminator, g.NoOutput());
    2782           0 : }
    2783             : 
    2784           0 : void InstructionSelector::VisitDebugBreak(Node* node) {
    2785             :   OperandGenerator g(this);
    2786      357521 :   Emit(kArchDebugBreak, g.NoOutput());
    2787           0 : }
    2788             : 
    2789           0 : void InstructionSelector::VisitUnreachable(Node* node) {
    2790             :   OperandGenerator g(this);
    2791        1313 :   Emit(kArchDebugBreak, g.NoOutput());
    2792           0 : }
    2793             : 
    2794           0 : void InstructionSelector::VisitDeadValue(Node* node) {
    2795             :   OperandGenerator g(this);
    2796           0 :   MarkAsRepresentation(DeadValueRepresentationOf(node->op()), node);
    2797           0 :   Emit(kArchDebugBreak, g.DefineAsConstant(node));
    2798           0 : }
    2799             : 
    2800           4 : void InstructionSelector::VisitComment(Node* node) {
    2801             :   OperandGenerator g(this);
    2802           4 :   InstructionOperand operand(g.UseImmediate(node));
    2803           4 :   Emit(kArchComment, 0, nullptr, 1, &operand);
    2804           4 : }
    2805             : 
    2806           0 : void InstructionSelector::VisitUnsafePointerAdd(Node* node) {
    2807             : #if V8_TARGET_ARCH_64_BIT
    2808        6699 :   VisitInt64Add(node);
    2809             : #else   // V8_TARGET_ARCH_64_BIT
    2810             :   VisitInt32Add(node);
    2811             : #endif  // V8_TARGET_ARCH_64_BIT
    2812           0 : }
    2813             : 
    2814        9156 : void InstructionSelector::VisitRetain(Node* node) {
    2815             :   OperandGenerator g(this);
    2816        9156 :   Emit(kArchNop, g.NoOutput(), g.UseAny(node->InputAt(0)));
    2817        9156 : }
    2818             : 
    2819        6103 : bool InstructionSelector::CanProduceSignalingNaN(Node* node) {
    2820             :   // TODO(jarin) Improve the heuristic here.
    2821       12027 :   if (node->opcode() == IrOpcode::kFloat64Add ||
    2822       12027 :       node->opcode() == IrOpcode::kFloat64Sub ||
    2823             :       node->opcode() == IrOpcode::kFloat64Mul) {
    2824             :     return false;
    2825             :   }
    2826           0 :   return true;
    2827             : }
    2828             : 
    2829     3946962 : FrameStateDescriptor* InstructionSelector::GetFrameStateDescriptor(
    2830     3946962 :     Node* state) {
    2831             :   DCHECK_EQ(IrOpcode::kFrameState, state->opcode());
    2832             :   DCHECK_EQ(kFrameStateInputCount, state->InputCount());
    2833     3946962 :   FrameStateInfo state_info = FrameStateInfoOf(state->op());
    2834             : 
    2835             :   int parameters = static_cast<int>(
    2836     3946969 :       StateValuesAccess(state->InputAt(kFrameStateParametersInput)).size());
    2837             :   int locals = static_cast<int>(
    2838     3946973 :       StateValuesAccess(state->InputAt(kFrameStateLocalsInput)).size());
    2839             :   int stack = static_cast<int>(
    2840     3946968 :       StateValuesAccess(state->InputAt(kFrameStateStackInput)).size());
    2841             : 
    2842             :   DCHECK_EQ(parameters, state_info.parameter_count());
    2843             :   DCHECK_EQ(locals, state_info.local_count());
    2844             : 
    2845             :   FrameStateDescriptor* outer_state = nullptr;
    2846     3946984 :   Node* outer_node = state->InputAt(kFrameStateOuterStateInput);
    2847     3946984 :   if (outer_node->opcode() == IrOpcode::kFrameState) {
    2848      377925 :     outer_state = GetFrameStateDescriptor(outer_node);
    2849             :   }
    2850             : 
    2851             :   return new (instruction_zone()) FrameStateDescriptor(
    2852             :       instruction_zone(), state_info.type(), state_info.bailout_id(),
    2853             :       state_info.state_combine(), parameters, locals, stack,
    2854    11840961 :       state_info.shared_info(), outer_state);
    2855             : }
    2856             : 
    2857             : // static
    2858        5152 : void InstructionSelector::CanonicalizeShuffle(bool inputs_equal,
    2859             :                                               uint8_t* shuffle,
    2860             :                                               bool* needs_swap,
    2861             :                                               bool* is_swizzle) {
    2862        5152 :   *needs_swap = false;
    2863             :   // Inputs equal, then it's a swizzle.
    2864        5152 :   if (inputs_equal) {
    2865           4 :     *is_swizzle = true;
    2866             :   } else {
    2867             :     // Inputs are distinct; check that both are required.
    2868             :     bool src0_is_used = false;
    2869             :     bool src1_is_used = false;
    2870       82368 :     for (int i = 0; i < kSimd128Size; ++i) {
    2871       82368 :       if (shuffle[i] < kSimd128Size) {
    2872             :         src0_is_used = true;
    2873             :       } else {
    2874             :         src1_is_used = true;
    2875             :       }
    2876             :     }
    2877        5148 :     if (src0_is_used && !src1_is_used) {
    2878        1305 :       *is_swizzle = true;
    2879        3843 :     } else if (src1_is_used && !src0_is_used) {
    2880        1113 :       *needs_swap = true;
    2881        1113 :       *is_swizzle = true;
    2882             :     } else {
    2883        2730 :       *is_swizzle = false;
    2884             :       // Canonicalize general 2 input shuffles so that the first input lanes are
    2885             :       // encountered first. This makes architectural shuffle pattern matching
    2886             :       // easier, since we only need to consider 1 input ordering instead of 2.
    2887        2730 :       if (shuffle[0] >= kSimd128Size) {
    2888             :         // The second operand is used first. Swap inputs and adjust the shuffle.
    2889         493 :         *needs_swap = true;
    2890        8381 :         for (int i = 0; i < kSimd128Size; ++i) {
    2891        7888 :           shuffle[i] ^= kSimd128Size;
    2892             :         }
    2893             :       }
    2894             :     }
    2895             :   }
    2896        5152 :   if (*is_swizzle) {
    2897       38752 :     for (int i = 0; i < kSimd128Size; ++i) shuffle[i] &= kSimd128Size - 1;
    2898             :   }
    2899        5152 : }
    2900             : 
    2901        5144 : void InstructionSelector::CanonicalizeShuffle(Node* node, uint8_t* shuffle,
    2902             :                                               bool* is_swizzle) {
    2903             :   // Get raw shuffle indices.
    2904        5144 :   memcpy(shuffle, OpParameter<uint8_t*>(node->op()), kSimd128Size);
    2905             :   bool needs_swap;
    2906        5144 :   bool inputs_equal = GetVirtualRegister(node->InputAt(0)) ==
    2907        5144 :                       GetVirtualRegister(node->InputAt(1));
    2908        5144 :   CanonicalizeShuffle(inputs_equal, shuffle, &needs_swap, is_swizzle);
    2909        5144 :   if (needs_swap) {
    2910        1604 :     SwapShuffleInputs(node);
    2911             :   }
    2912             :   // Duplicate the first input; for some shuffles on some architectures, it's
    2913             :   // easiest to implement a swizzle as a shuffle so it might be used.
    2914        5144 :   if (*is_swizzle) {
    2915        2416 :     node->ReplaceInput(1, node->InputAt(0));
    2916             :   }
    2917        5144 : }
    2918             : 
    2919             : // static
    2920        1844 : void InstructionSelector::SwapShuffleInputs(Node* node) {
    2921             :   Node* input0 = node->InputAt(0);
    2922             :   Node* input1 = node->InputAt(1);
    2923        1844 :   node->ReplaceInput(0, input1);
    2924        1844 :   node->ReplaceInput(1, input0);
    2925        1844 : }
    2926             : 
    2927             : // static
    2928         535 : bool InstructionSelector::TryMatchIdentity(const uint8_t* shuffle) {
    2929        4854 :   for (int i = 0; i < kSimd128Size; ++i) {
    2930        4625 :     if (shuffle[i] != i) return false;
    2931             :   }
    2932             :   return true;
    2933             : }
    2934             : 
    2935             : // static
    2936        3355 : bool InstructionSelector::TryMatch32x4Shuffle(const uint8_t* shuffle,
    2937             :                                               uint8_t* shuffle32x4) {
    2938        7703 :   for (int i = 0; i < 4; ++i) {
    2939        6678 :     if (shuffle[i * 4] % 4 != 0) return false;
    2940       13546 :     for (int j = 1; j < 4; ++j) {
    2941       14479 :       if (shuffle[i * 4 + j] - shuffle[i * 4 + j - 1] != 1) return false;
    2942             :     }
    2943        4348 :     shuffle32x4[i] = shuffle[i * 4] / 4;
    2944             :   }
    2945             :   return true;
    2946             : }
    2947             : 
    2948             : // static
    2949        2331 : bool InstructionSelector::TryMatch16x8Shuffle(const uint8_t* shuffle,
    2950             :                                               uint8_t* shuffle16x8) {
    2951       10133 :   for (int i = 0; i < 8; ++i) {
    2952        9236 :     if (shuffle[i * 2] % 2 != 0) return false;
    2953        7802 :     for (int j = 1; j < 2; ++j) {
    2954        8443 :       if (shuffle[i * 2 + j] - shuffle[i * 2 + j - 1] != 1) return false;
    2955             :     }
    2956        7802 :     shuffle16x8[i] = shuffle[i * 2] / 2;
    2957             :   }
    2958             :   return true;
    2959             : }
    2960             : 
    2961             : // static
    2962        5148 : bool InstructionSelector::TryMatchConcat(const uint8_t* shuffle,
    2963             :                                          uint8_t* offset) {
    2964             :   // Don't match the identity shuffle (e.g. [0 1 2 ... 15]).
    2965        5148 :   uint8_t start = shuffle[0];
    2966        5148 :   if (start == 0) return false;
    2967             :   DCHECK_GT(kSimd128Size, start);  // The shuffle should be canonicalized.
    2968             :   // A concatenation is a series of consecutive indices, with at most one jump
    2969             :   // in the middle from the last lane to the first.
    2970        5738 :   for (int i = 1; i < kSimd128Size; ++i) {
    2971        8579 :     if ((shuffle[i]) != ((shuffle[i - 1] + 1))) {
    2972        2962 :       if (shuffle[i - 1] != 15) return false;
    2973         121 :       if (shuffle[i] % kSimd128Size != 0) return false;
    2974             :     }
    2975             :   }
    2976         242 :   *offset = start;
    2977         242 :   return true;
    2978             : }
    2979             : 
    2980             : // static
    2981        1391 : bool InstructionSelector::TryMatchBlend(const uint8_t* shuffle) {
    2982        4263 :   for (int i = 0; i < 16; ++i) {
    2983        4205 :     if ((shuffle[i] & 0xF) != i) return false;
    2984             :   }
    2985             :   return true;
    2986             : }
    2987             : 
    2988             : // static
    2989        6176 : int32_t InstructionSelector::Pack4Lanes(const uint8_t* shuffle) {
    2990             :   int32_t result = 0;
    2991       30880 :   for (int i = 3; i >= 0; --i) {
    2992       24704 :     result <<= 8;
    2993       24704 :     result |= shuffle[i];
    2994             :   }
    2995        6176 :   return result;
    2996             : }
    2997             : 
    2998     5691784 : bool InstructionSelector::NeedsPoisoning(IsSafetyCheck safety_check) const {
    2999     5691784 :   switch (poisoning_level_) {
    3000             :     case PoisoningMitigationLevel::kDontPoison:
    3001             :       return false;
    3002             :     case PoisoningMitigationLevel::kPoisonAll:
    3003          24 :       return safety_check != IsSafetyCheck::kNoSafetyCheck;
    3004             :     case PoisoningMitigationLevel::kPoisonCriticalOnly:
    3005           0 :       return safety_check == IsSafetyCheck::kCriticalSafetyCheck;
    3006             :   }
    3007           0 :   UNREACHABLE();
    3008             : }
    3009             : 
    3010             : }  // namespace compiler
    3011             : }  // namespace internal
    3012      178779 : }  // namespace v8

Generated by: LCOV version 1.10