instruction-selector-impl.h revision f91f0611dbaf29ca0f1d4aecb357ce243a19d2fa
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#ifndef V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/instruction.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/instruction-selector.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/linkage.h" 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/schedule.h" 12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/macro-assembler.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler { 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Helper struct containing data about a table or lookup switch. 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct SwitchInfo { 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t min_value; // minimum value of {case_values} 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t max_value; // maximum value of {case_values} 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t value_range; // |max_value - min_value| + 1 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t case_count; // number of cases 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t* case_values; // actual case values, unsorted 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BasicBlock** case_branches; // basic blocks corresponding to case values 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BasicBlock* default_branch; // default branch target 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A helper class for the instruction selector that simplifies construction of 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Operands. This class implements a base for architecture-specific helpers. 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass OperandGenerator { 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit OperandGenerator(InstructionSelector* selector) 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : selector_(selector) {} 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand NoOutput() { 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return InstructionOperand(); // Generates an invalid operand. 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand DefineAsRegister(Node* node) { 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Define(node, 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER, 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetVReg(node))); 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand DefineSameAsFirst(Node* node) { 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Define(node, 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand(UnallocatedOperand::SAME_AS_FIRST_INPUT, 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetVReg(node))); 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand DefineAsFixed(Node* node, Register reg) { 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Define(node, UnallocatedOperand(UnallocatedOperand::FIXED_REGISTER, 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch reg.code(), GetVReg(node))); 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch template <typename FPRegType> 5813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch InstructionOperand DefineAsFixed(Node* node, FPRegType reg) { 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Define(node, 6013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch UnallocatedOperand(UnallocatedOperand::FIXED_FP_REGISTER, 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch reg.code(), GetVReg(node))); 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand DefineAsConstant(Node* node) { 65f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return DefineAsConstant(node, ToConstant(node)); 66f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch InstructionOperand DefineAsConstant(Node* node, Constant constant) { 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch selector()->MarkAsDefined(node); 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int virtual_register = GetVReg(node); 71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch sequence()->AddConstant(virtual_register, constant); 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ConstantOperand(virtual_register); 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch InstructionOperand DefineAsLocation(Node* node, LinkageLocation location) { 76f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return Define(node, ToUnallocatedOperand(location, GetVReg(node))); 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand DefineAsDualLocation(Node* node, 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LinkageLocation primary_location, 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LinkageLocation secondary_location) { 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Define(node, 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ToDualLocationUnallocatedOperand( 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch primary_location, secondary_location, GetVReg(node))); 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand Use(Node* node) { 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Use(node, UnallocatedOperand(UnallocatedOperand::NONE, 89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand::USED_AT_START, 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetVReg(node))); 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand UseAny(Node* node) { 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Use(node, UnallocatedOperand(UnallocatedOperand::ANY, 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand::USED_AT_START, 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetVReg(node))); 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand UseRegister(Node* node) { 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Use(node, UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER, 101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand::USED_AT_START, 102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetVReg(node))); 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand UseUniqueSlot(Node* node) { 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Use(node, UnallocatedOperand(UnallocatedOperand::MUST_HAVE_SLOT, 107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetVReg(node))); 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use register or operand for the node. If a register is chosen, it won't 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // alias any temporary or output registers. 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand UseUnique(Node* node) { 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Use(node, 114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand(UnallocatedOperand::NONE, GetVReg(node))); 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use a unique register for the node that does not alias any temporary or 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // output registers. 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand UseUniqueRegister(Node* node) { 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Use(node, UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER, 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetVReg(node))); 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand UseFixed(Node* node, Register reg) { 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Use(node, UnallocatedOperand(UnallocatedOperand::FIXED_REGISTER, 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch reg.code(), GetVReg(node))); 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 12913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch template <typename FPRegType> 13013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch InstructionOperand UseFixed(Node* node, FPRegType reg) { 13113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return Use(node, UnallocatedOperand(UnallocatedOperand::FIXED_FP_REGISTER, 13213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch reg.code(), GetVReg(node))); 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand UseExplicit(LinkageLocation location) { 136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation rep = InstructionSequence::DefaultRepresentation(); 137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (location.IsRegister()) { 138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ExplicitOperand(LocationOperand::REGISTER, rep, 139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch location.AsRegister()); 140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ExplicitOperand(LocationOperand::STACK_SLOT, rep, 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch location.GetLocation()); 143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch InstructionOperand UseImmediate(int immediate) { 147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return sequence()->AddImmediate(Constant(immediate)); 148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand UseImmediate(Node* node) { 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return sequence()->AddImmediate(ToConstant(node)); 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch InstructionOperand UseNegatedImmediate(Node* node) { 155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return sequence()->AddImmediate(ToNegatedConstant(node)); 156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch InstructionOperand UseLocation(Node* node, LinkageLocation location) { 159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return Use(node, ToUnallocatedOperand(location, GetVReg(node))); 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Used to force gap moves from the from_location to the to_location 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // immediately before an instruction. 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand UsePointerLocation(LinkageLocation to_location, 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LinkageLocation from_location) { 166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand casted_from_operand = 167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch UnallocatedOperand::cast(TempLocation(from_location)); 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch selector_->Emit(kArchNop, casted_from_operand); 169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ToUnallocatedOperand(to_location, 170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch casted_from_operand.virtual_register()); 171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand TempRegister() { 174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER, 175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand::USED_AT_START, 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch sequence()->NextVirtualRegister()); 177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand TempDoubleRegister() { 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand op = UnallocatedOperand( 181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand::MUST_HAVE_REGISTER, 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand::USED_AT_START, sequence()->NextVirtualRegister()); 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch sequence()->MarkAsRepresentation(MachineRepresentation::kFloat64, 184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op.virtual_register()); 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return op; 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand TempRegister(Register reg) { 189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return UnallocatedOperand(UnallocatedOperand::FIXED_REGISTER, reg.code(), 190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand::kInvalidVirtualRegister); 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand TempImmediate(int32_t imm) { 194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return sequence()->AddImmediate(Constant(imm)); 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 197f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch InstructionOperand TempLocation(LinkageLocation location) { 198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return ToUnallocatedOperand(location, sequence()->NextVirtualRegister()); 199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch InstructionOperand Label(BasicBlock* block) { 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return sequence()->AddImmediate( 203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Constant(RpoNumber::FromInt(block->rpo_number()))); 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InstructionSelector* selector() const { return selector_; } 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InstructionSequence* sequence() const { return selector()->sequence(); } 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone* zone() const { return selector()->instruction_zone(); } 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int GetVReg(Node* node) const { return selector_->GetVirtualRegister(node); } 213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Constant ToConstant(const Node* node) { 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (node->opcode()) { 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt32Constant: 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Constant(OpParameter<int32_t>(node)); 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt64Constant: 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Constant(OpParameter<int64_t>(node)); 220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case IrOpcode::kFloat32Constant: 221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return Constant(OpParameter<float>(node)); 222bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch case IrOpcode::kRelocatableInt32Constant: 223bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch case IrOpcode::kRelocatableInt64Constant: 224bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return Constant(OpParameter<RelocatablePtrConstantInfo>(node)); 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kFloat64Constant: 226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case IrOpcode::kNumberConstant: 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Constant(OpParameter<double>(node)); 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kExternalConstant: 22913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case IrOpcode::kComment: 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Constant(OpParameter<ExternalReference>(node)); 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kHeapConstant: 232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Constant(OpParameter<Handle<HeapObject>>(node)); 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Constant(static_cast<int32_t>(0)); 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Constant ToNegatedConstant(const Node* node) { 241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch switch (node->opcode()) { 242f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case IrOpcode::kInt32Constant: 243f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return Constant(-OpParameter<int32_t>(node)); 244f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case IrOpcode::kInt64Constant: 245f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return Constant(-OpParameter<int64_t>(node)); 246f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch default: 247f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch break; 248f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 249f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch UNREACHABLE(); 250f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return Constant(static_cast<int32_t>(0)); 251f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 252f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand Define(Node* node, UnallocatedOperand operand) { 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_NOT_NULL(node); 255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(operand.virtual_register(), GetVReg(node)); 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch selector()->MarkAsDefined(node); 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return operand; 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand Use(Node* node, UnallocatedOperand operand) { 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_NOT_NULL(node); 262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(operand.virtual_register(), GetVReg(node)); 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch selector()->MarkAsUsed(node); 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return operand; 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand ToDualLocationUnallocatedOperand( 268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LinkageLocation primary_location, LinkageLocation secondary_location, 269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int virtual_register) { 270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We only support the primary location being a register and the secondary 271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // one a slot. 272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(primary_location.IsRegister() && 273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch secondary_location.IsCalleeFrameSlot()); 274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int reg_id = primary_location.AsRegister(); 275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int slot_id = secondary_location.AsCalleeFrameSlot(); 276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return UnallocatedOperand(reg_id, slot_id, virtual_register); 277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UnallocatedOperand ToUnallocatedOperand(LinkageLocation location, 280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int virtual_register) { 281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (location.IsAnyRegister()) { 282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // any machine register. 283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return UnallocatedOperand(UnallocatedOperand::MUST_HAVE_REGISTER, 284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch virtual_register); 285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (location.IsCallerFrameSlot()) { 287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // a location on the caller frame. 288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return UnallocatedOperand(UnallocatedOperand::FIXED_SLOT, 289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch location.AsCallerFrameSlot(), virtual_register); 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (location.IsCalleeFrameSlot()) { 292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // a spill location on this (callee) frame. 293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return UnallocatedOperand(UnallocatedOperand::FIXED_SLOT, 294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch location.AsCalleeFrameSlot(), virtual_register); 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // a fixed register. 297f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (IsFloatingPoint(location.GetType().representation())) { 29813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return UnallocatedOperand(UnallocatedOperand::FIXED_FP_REGISTER, 299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch location.AsRegister(), virtual_register); 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return UnallocatedOperand(UnallocatedOperand::FIXED_REGISTER, 302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch location.AsRegister(), virtual_register); 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InstructionSelector* selector_; 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The flags continuation is a way to combine a branch or a materialization 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// of a boolean value with an instruction that sets the flags register. 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The whole instruction is treated as a unit by the register allocator, and 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// thus no spills or moves can be introduced between the flags-setting 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// instruction and the branch or set it should be combined with. 314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass FlagsContinuation final { 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FlagsContinuation() : mode_(kFlags_none) {} 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Creates a new flags continuation from the given condition and true/false 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // blocks. 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FlagsContinuation(FlagsCondition condition, BasicBlock* true_block, 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BasicBlock* false_block) 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : mode_(kFlags_branch), 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch condition_(condition), 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch true_block_(true_block), 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch false_block_(false_block) { 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_NOT_NULL(true_block); 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_NOT_NULL(false_block); 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Creates a new flags continuation for an eager deoptimization exit. 3313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static FlagsContinuation ForDeoptimize(FlagsCondition condition, 332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DeoptimizeReason reason, 3333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Node* frame_state) { 334f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return FlagsContinuation(condition, reason, frame_state); 3353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 3363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Creates a new flags continuation for a boolean value. 3383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static FlagsContinuation ForSet(FlagsCondition condition, Node* result) { 339f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return FlagsContinuation(condition, result); 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsNone() const { return mode_ == kFlags_none; } 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsBranch() const { return mode_ == kFlags_branch; } 3443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool IsDeoptimize() const { return mode_ == kFlags_deoptimize; } 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsSet() const { return mode_ == kFlags_set; } 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FlagsCondition condition() const { 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!IsNone()); 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return condition_; 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DeoptimizeReason reason() const { 351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(IsDeoptimize()); 352f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return reason_; 353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 3543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Node* frame_state() const { 3553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(IsDeoptimize()); 3563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return frame_state_or_result_; 3573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* result() const { 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsSet()); 3603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return frame_state_or_result_; 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BasicBlock* true_block() const { 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsBranch()); 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true_block_; 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BasicBlock* false_block() const { 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsBranch()); 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false_block_; 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Negate() { 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!IsNone()); 373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier condition_ = NegateFlagsCondition(condition_); 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Commute() { 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!IsNone()); 378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch condition_ = CommuteFlagsCondition(condition_); 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 381f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void Overwrite(FlagsCondition condition) { condition_ = condition; } 382f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void OverwriteAndNegateIfEqual(FlagsCondition condition) { 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool negate = condition_ == kEqual; 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch condition_ = condition; 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (negate) Negate(); 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 389f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void OverwriteUnsignedIfSigned() { 390f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch switch (condition_) { 391f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case kSignedLessThan: 392f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch condition_ = kUnsignedLessThan; 393f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch break; 394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case kSignedLessThanOrEqual: 395f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch condition_ = kUnsignedLessThanOrEqual; 396f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch break; 397f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case kSignedGreaterThan: 398f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch condition_ = kUnsignedGreaterThan; 399f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch break; 400f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case kSignedGreaterThanOrEqual: 401f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch condition_ = kUnsignedGreaterThanOrEqual; 402f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch break; 403f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch default: 404f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch break; 405f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 406f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 407f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Encodes this flags continuation into the given opcode. 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InstructionCode Encode(InstructionCode opcode) { 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch opcode |= FlagsModeField::encode(mode_); 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mode_ != kFlags_none) { 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch opcode |= FlagsConditionField::encode(condition_); 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return opcode; 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch FlagsContinuation(FlagsCondition condition, DeoptimizeReason reason, 419f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Node* frame_state) 420f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : mode_(kFlags_deoptimize), 421f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch condition_(condition), 422f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch reason_(reason), 423f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch frame_state_or_result_(frame_state) { 424f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK_NOT_NULL(frame_state); 425f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 426f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch FlagsContinuation(FlagsCondition condition, Node* result) 427f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : mode_(kFlags_set), 4283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch condition_(condition), 429f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch frame_state_or_result_(result) { 430f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK_NOT_NULL(result); 4313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 4323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch FlagsMode const mode_; 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FlagsCondition condition_; 435f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DeoptimizeReason reason_; // Only value if mode_ == kFlags_deoptimize 4363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Node* frame_state_or_result_; // Only valid if mode_ == kFlags_deoptimize 4373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // or mode_ == kFlags_set. 4383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch BasicBlock* true_block_; // Only valid if mode_ == kFlags_branch. 4393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch BasicBlock* false_block_; // Only valid if mode_ == kFlags_branch. 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace compiler 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace internal 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace v8 445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // V8_COMPILER_INSTRUCTION_SELECTOR_IMPL_H_ 447