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