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/machine-operator-reducer.h" 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h" 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/generic-node-inl.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/graph.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/js-graph.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/node-matchers.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler { 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMachineOperatorReducer::MachineOperatorReducer(JSGraph* jsgraph) 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : jsgraph_(jsgraph) {} 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMachineOperatorReducer::~MachineOperatorReducer() {} 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* MachineOperatorReducer::Float32Constant(volatile float value) { 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return graph()->NewNode(common()->Float32Constant(value)); 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* MachineOperatorReducer::Float64Constant(volatile double value) { 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return jsgraph()->Float64Constant(value); 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* MachineOperatorReducer::Int32Constant(int32_t value) { 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return jsgraph()->Int32Constant(value); 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* MachineOperatorReducer::Int64Constant(int64_t value) { 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return graph()->NewNode(common()->Int64Constant(value)); 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Perform constant folding and strength reduction on machine operators. 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReduction MachineOperatorReducer::Reduce(Node* node) { 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (node->opcode()) { 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kProjection: 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReduceProjection(OpParameter<size_t>(node), node->InputAt(0)); 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32And: { 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) return Replace(m.right().node()); // x & 0 => 0 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(-1)) return Replace(m.left().node()); // x & -1 => x 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K & K => K 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(m.left().Value() & m.right().Value()); 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.LeftEqualsRight()) return Replace(m.left().node()); // x & x => x 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Or: { 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) return Replace(m.left().node()); // x | 0 => x 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(-1)) return Replace(m.right().node()); // x | -1 => -1 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K | K => K 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(m.left().Value() | m.right().Value()); 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.LeftEqualsRight()) return Replace(m.left().node()); // x | x => x 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.left().IsWord32Shl() && m.right().IsWord32Shr()) { 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher mleft(m.left().node()); 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher mright(m.right().node()); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mleft.left().node() == mright.left().node()) { 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (x << y) | (x >> (32 - y)) => x ror y 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mright.right().IsInt32Sub()) { 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher mrightright(mright.right().node()); 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mrightright.left().Is(32) && 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch mrightright.right().node() == mleft.right().node()) { 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->set_op(machine()->Word32Ror()); 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(0, mleft.left().node()); 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, mleft.right().node()); 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (x << K) | (x >> (32 - K)) => x ror K 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mleft.right().IsInRange(0, 31) && 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch mright.right().Is(32 - mleft.right().Value())) { 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->set_op(machine()->Word32Ror()); 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(0, mleft.left().node()); 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, mleft.right().node()); 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.left().IsWord32Shr() && m.right().IsWord32Shl()) { 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (x >> (32 - y)) | (x << y) => x ror y 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher mleft(m.left().node()); 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher mright(m.right().node()); 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mleft.left().node() == mright.left().node()) { 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mleft.right().IsInt32Sub()) { 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher mleftright(mleft.right().node()); 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mleftright.left().Is(32) && 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch mleftright.right().node() == mright.right().node()) { 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->set_op(machine()->Word32Ror()); 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(0, mright.left().node()); 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, mright.right().node()); 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (x >> (32 - K)) | (x << K) => x ror K 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mright.right().IsInRange(0, 31) && 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch mleft.right().Is(32 - mright.right().Value())) { 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->set_op(machine()->Word32Ror()); 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(0, mright.left().node()); 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, mright.right().node()); 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Xor: { 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) return Replace(m.left().node()); // x ^ 0 => x 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K ^ K => K 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(m.left().Value() ^ m.right().Value()); 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.LeftEqualsRight()) return ReplaceInt32(0); // x ^ x => 0 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shl: { 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) return Replace(m.left().node()); // x << 0 => x 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K << K => K 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(m.left().Value() << m.right().Value()); 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Shr: { 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopMatcher m(node); 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) return Replace(m.left().node()); // x >>> 0 => x 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K >>> K => K 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(m.left().Value() >> m.right().Value()); 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Sar: { 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) return Replace(m.left().node()); // x >> 0 => x 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K >> K => K 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(m.left().Value() >> m.right().Value()); 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Ror: { 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) return Replace(m.left().node()); // x ror 0 => x 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K ror K => K 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32( 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::bits::RotateRight32(m.left().Value(), m.right().Value())); 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kWord32Equal: { 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K == K => K 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceBool(m.left().Value() == m.right().Value()); 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.left().IsInt32Sub() && m.right().Is(0)) { // x - y == 0 => x == y 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher msub(m.left().node()); 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(0, msub.left().node()); 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, msub.right().node()); 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): fold HeapConstant, ExternalReference, pointer compares 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.LeftEqualsRight()) return ReplaceBool(true); // x == x => true 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt32Add: { 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) return Replace(m.left().node()); // x + 0 => x 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K + K => K 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(static_cast<uint32_t>(m.left().Value()) + 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<uint32_t>(m.right().Value())); 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt32Sub: { 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) return Replace(m.left().node()); // x - 0 => x 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K - K => K 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(static_cast<uint32_t>(m.left().Value()) - 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<uint32_t>(m.right().Value())); 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.LeftEqualsRight()) return ReplaceInt32(0); // x - x => 0 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt32Mul: { 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) return Replace(m.right().node()); // x * 0 => 0 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(1)) return Replace(m.left().node()); // x * 1 => x 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K * K => K 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(m.left().Value() * m.right().Value()); 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(-1)) { // x * -1 => 0 - x 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->set_op(machine()->Int32Sub()); 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(0, Int32Constant(0)); 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, m.left().node()); 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().IsPowerOf2()) { // x * 2^n => x << n 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->set_op(machine()->Word32Shl()); 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, Int32Constant(WhichPowerOf2(m.right().Value()))); 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt32Div: { 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(1)) return Replace(m.left().node()); // x / 1 => x 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.left().Is(0)) 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.right().IsPowerOf2()) 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.right().Is(0)) 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.LeftEqualsRight()) 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable() && !m.right().Is(0)) { // K / K => K 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(-1)) return ReplaceInt32(-m.left().Value()); 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(m.left().Value() / m.right().Value()); 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(-1)) { // x / -1 => 0 - x 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->set_op(machine()->Int32Sub()); 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(0, Int32Constant(0)); 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, m.left().node()); 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt32UDiv: { 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopMatcher m(node); 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(1)) return Replace(m.left().node()); // x / 1 => x 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.left().Is(0)) 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.right().Is(0)) 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.LeftEqualsRight()) 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable() && !m.right().Is(0)) { // K / K => K 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(m.left().Value() / m.right().Value()); 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().IsPowerOf2()) { // x / 2^n => x >> n 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->set_op(machine()->Word32Shr()); 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, Int32Constant(WhichPowerOf2(m.right().Value()))); 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt32Mod: { 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(1)) return ReplaceInt32(0); // x % 1 => 0 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(-1)) return ReplaceInt32(0); // x % -1 => 0 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.left().Is(0)) 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.right().IsPowerOf2()) 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.right().Is(0)) 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.LeftEqualsRight()) 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable() && !m.right().Is(0)) { // K % K => K 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(m.left().Value() % m.right().Value()); 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt32UMod: { 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopMatcher m(node); 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(1)) return ReplaceInt32(0); // x % 1 => 0 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.left().Is(0)) 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.right().Is(0)) 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(turbofan): if (m.LeftEqualsRight()) 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable() && !m.right().Is(0)) { // K % K => K 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32(m.left().Value() % m.right().Value()); 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().IsPowerOf2()) { // x % 2^n => x & 2^n-1 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->set_op(machine()->Word32And()); 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, Int32Constant(m.right().Value() - 1)); 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt32LessThan: { 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K < K => K 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceBool(m.left().Value() < m.right().Value()); 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.left().IsInt32Sub() && m.right().Is(0)) { // x - y < 0 => x < y 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher msub(m.left().node()); 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(0, msub.left().node()); 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, msub.right().node()); 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.left().Is(0) && m.right().IsInt32Sub()) { // 0 < x - y => y < x 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher msub(m.right().node()); 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(0, msub.right().node()); 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, msub.left().node()); 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.LeftEqualsRight()) return ReplaceBool(false); // x < x => false 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt32LessThanOrEqual: { 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K <= K => K 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceBool(m.left().Value() <= m.right().Value()); 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.left().IsInt32Sub() && m.right().Is(0)) { // x - y <= 0 => x <= y 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher msub(m.left().node()); 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(0, msub.left().node()); 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, msub.right().node()); 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.left().Is(0) && m.right().IsInt32Sub()) { // 0 <= x - y => y <= x 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher msub(m.right().node()); 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(0, msub.right().node()); 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch node->ReplaceInput(1, msub.left().node()); 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Changed(node); 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.LeftEqualsRight()) return ReplaceBool(true); // x <= x => true 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kUint32LessThan: { 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopMatcher m(node); 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.left().Is(kMaxUInt32)) return ReplaceBool(false); // M < x => false 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) return ReplaceBool(false); // x < 0 => false 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K < K => K 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceBool(m.left().Value() < m.right().Value()); 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.LeftEqualsRight()) return ReplaceBool(false); // x < x => false 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kUint32LessThanOrEqual: { 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32BinopMatcher m(node); 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.left().Is(0)) return ReplaceBool(true); // 0 <= x => true 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(kMaxUInt32)) return ReplaceBool(true); // x <= M => true 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K <= K => K 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceBool(m.left().Value() <= m.right().Value()); 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.LeftEqualsRight()) return ReplaceBool(true); // x <= x => true 337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kFloat64Add: { 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float64BinopMatcher m(node); 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K + K => K 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceFloat64(m.left().Value() + m.right().Value()); 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kFloat64Sub: { 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float64BinopMatcher m(node); 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K - K => K 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceFloat64(m.left().Value() - m.right().Value()); 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kFloat64Mul: { 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float64BinopMatcher m(node); 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(1)) return Replace(m.left().node()); // x * 1.0 => x 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().IsNaN()) { // x * NaN => NaN 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Replace(m.right().node()); 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K * K => K 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceFloat64(m.left().Value() * m.right().Value()); 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kFloat64Div: { 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float64BinopMatcher m(node); 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(1)) return Replace(m.left().node()); // x / 1.0 => x 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().IsNaN()) { // x / NaN => NaN 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Replace(m.right().node()); 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.left().IsNaN()) { // NaN / x => NaN 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Replace(m.left().node()); 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K / K => K 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceFloat64(m.left().Value() / m.right().Value()); 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kFloat64Mod: { 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float64BinopMatcher m(node); 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().IsNaN()) { // x % NaN => NaN 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Replace(m.right().node()); 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.left().IsNaN()) { // NaN % x => NaN 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Replace(m.left().node()); 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { // K % K => K 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceFloat64(modulo(m.left().Value(), m.right().Value())); 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kChangeFloat32ToFloat64: { 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float32Matcher m(node->InputAt(0)); 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.HasValue()) return ReplaceFloat64(m.Value()); 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kChangeFloat64ToInt32: { 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float64Matcher m(node->InputAt(0)); 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.HasValue()) return ReplaceInt32(FastD2I(m.Value())); 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kChangeFloat64ToUint32: { 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float64Matcher m(node->InputAt(0)); 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.HasValue()) return ReplaceInt32(FastD2UI(m.Value())); 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsChangeUint32ToFloat64()) return Replace(m.node()->InputAt(0)); 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kChangeInt32ToFloat64: { 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32Matcher m(node->InputAt(0)); 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.HasValue()) return ReplaceFloat64(FastI2D(m.Value())); 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kChangeInt32ToInt64: { 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32Matcher m(node->InputAt(0)); 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.HasValue()) return ReplaceInt64(m.Value()); 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kChangeUint32ToFloat64: { 419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32Matcher m(node->InputAt(0)); 420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.HasValue()) return ReplaceFloat64(FastUI2D(m.Value())); 421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kChangeUint32ToUint64: { 424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32Matcher m(node->InputAt(0)); 425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.HasValue()) return ReplaceInt64(static_cast<uint64_t>(m.Value())); 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kTruncateFloat64ToInt32: { 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float64Matcher m(node->InputAt(0)); 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.HasValue()) return ReplaceInt32(DoubleToInt32(m.Value())); 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsChangeInt32ToFloat64()) return Replace(m.node()->InputAt(0)); 432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kTruncateInt64ToInt32: { 435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int64Matcher m(node->InputAt(0)); 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.HasValue()) return ReplaceInt32(static_cast<int32_t>(m.Value())); 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsChangeInt32ToInt64()) return Replace(m.node()->InputAt(0)); 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kTruncateFloat64ToFloat32: { 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float64Matcher m(node->InputAt(0)); 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.HasValue()) return ReplaceFloat32(DoubleToFloat32(m.Value())); 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsChangeFloat32ToFloat64()) return Replace(m.node()->InputAt(0)); 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NoChange(); 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReduction MachineOperatorReducer::ReduceProjection(size_t index, Node* node) { 454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (node->opcode()) { 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt32AddWithOverflow: { 456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(index == 0 || index == 1); 457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { 459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t val; 460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ovf = base::bits::SignedAddOverflow32(m.left().Value(), 461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.right().Value(), &val); 462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32((index == 0) ? val : ovf); 463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) { 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (index == 0) ? Replace(m.left().node()) : ReplaceInt32(0); 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IrOpcode::kInt32SubWithOverflow: { 470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(index == 0 || index == 1); 471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32BinopMatcher m(node); 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.IsFoldable()) { 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t val; 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ovf = base::bits::SignedSubOverflow32(m.left().Value(), 475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch m.right().Value(), &val); 476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReplaceInt32((index == 0) ? val : ovf); 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (m.right().Is(0)) { 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (index == 0) ? Replace(m.left().node()) : ReplaceInt32(0); 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NoChange(); 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCommonOperatorBuilder* MachineOperatorReducer::common() const { 491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return jsgraph()->common(); 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMachineOperatorBuilder* MachineOperatorReducer::machine() const { 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return jsgraph()->machine(); 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochGraph* MachineOperatorReducer::graph() const { return jsgraph()->graph(); } 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace compiler 503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace internal 504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace v8 505