1// Copyright 2014 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "src/compiler/select-lowering.h" 6 7#include "src/compiler/common-operator.h" 8#include "src/compiler/diamond.h" 9#include "src/compiler/graph-assembler.h" 10#include "src/compiler/graph.h" 11#include "src/compiler/node-properties.h" 12#include "src/compiler/node.h" 13 14namespace v8 { 15namespace internal { 16namespace compiler { 17 18SelectLowering::SelectLowering(JSGraphAssembler* graph_assembler, Graph* graph) 19 : graph_assembler_(graph_assembler), start_(graph->start()) {} 20 21SelectLowering::~SelectLowering() = default; 22 23Reduction SelectLowering::Reduce(Node* node) { 24 if (node->opcode() != IrOpcode::kSelect) return NoChange(); 25 return LowerSelect(node); 26} 27 28#define __ gasm()-> 29 30Reduction SelectLowering::LowerSelect(Node* node) { 31 SelectParameters const p = SelectParametersOf(node->op()); 32 33 Node* condition = node->InputAt(0); 34 Node* vtrue = node->InputAt(1); 35 Node* vfalse = node->InputAt(2); 36 37 bool reset_gasm = false; 38 if (gasm()->control() == nullptr) { 39 gasm()->InitializeEffectControl(start(), start()); 40 reset_gasm = true; 41 } 42 43 auto done = __ MakeLabel(p.representation()); 44 45 __ GotoIf(condition, &done, vtrue); 46 __ Goto(&done, vfalse); 47 __ Bind(&done); 48 49 if (reset_gasm) { 50 gasm()->Reset(); 51 } 52 53 return Changed(done.PhiAt(0)); 54} 55 56#undef __ 57 58} // namespace compiler 59} // namespace internal 60} // namespace v8 61