1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/representation-change.h" 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <sstream> 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/bits.h" 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/code-factory.h" 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/machine-operator.h" 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal { 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace compiler { 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst char* Truncation::description() const { 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (kind()) { 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kNone: 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "no-value-use"; 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kBool: 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "truncate-to-bool"; 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kWord32: 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "truncate-to-word32"; 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kWord64: 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "truncate-to-word64"; 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kFloat32: 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "truncate-to-float32"; 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kFloat64: 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "truncate-to-float64"; 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kAny: 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return "no-truncation"; 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return nullptr; 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Partial order for truncations: 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// kWord64 kAny 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ^ ^ 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// \ | 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// \ kFloat64 <--+ 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// \ ^ ^ | 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// \ / | | 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// kWord32 kFloat32 kBool 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ^ ^ ^ 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// \ | / 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// \ | / 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// \ | / 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// \ | / 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// \ | / 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// kNone 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTruncation::TruncationKind Truncation::Generalize(TruncationKind rep1, 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch TruncationKind rep2) { 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (LessGeneral(rep1, rep2)) return rep2; 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (LessGeneral(rep2, rep1)) return rep1; 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Handle the generalization of float64-representable values. 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (LessGeneral(rep1, TruncationKind::kFloat64) && 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LessGeneral(rep2, TruncationKind::kFloat64)) { 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return TruncationKind::kFloat64; 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // All other combinations are illegal. 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FATAL("Tried to combine incompatible truncations"); 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return TruncationKind::kNone; 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Truncation::LessGeneral(TruncationKind rep1, TruncationKind rep2) { 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (rep1) { 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kNone: 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return true; 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kBool: 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return rep2 == TruncationKind::kBool || rep2 == TruncationKind::kAny; 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kWord32: 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return rep2 == TruncationKind::kWord32 || 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch rep2 == TruncationKind::kWord64 || 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch rep2 == TruncationKind::kFloat64 || rep2 == TruncationKind::kAny; 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kWord64: 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return rep2 == TruncationKind::kWord64; 85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kFloat32: 86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return rep2 == TruncationKind::kFloat32 || 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch rep2 == TruncationKind::kFloat64 || rep2 == TruncationKind::kAny; 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kFloat64: 89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return rep2 == TruncationKind::kFloat64 || rep2 == TruncationKind::kAny; 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TruncationKind::kAny: 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return rep2 == TruncationKind::kAny; 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return false; 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace { 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool IsWord(MachineRepresentation rep) { 101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return rep == MachineRepresentation::kWord8 || 102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch rep == MachineRepresentation::kWord16 || 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch rep == MachineRepresentation::kWord32; 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace 107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Changes representation from {output_rep} to {use_rep}. The {truncation} 109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// parameter is only used for sanity checking - if the changer cannot figure 110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// out signedness for the word32->float64 conversion, then we check that the 111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// uses truncate to word32 (so they do not care about signedness). 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* RepresentationChanger::GetRepresentationFor( 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* node, MachineRepresentation output_rep, Type* output_type, 11421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch Node* use_node, UseInfo use_info) { 115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (output_rep == MachineRepresentation::kNone) { 116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The output representation should be set. 11721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return TypeError(node, output_rep, output_type, use_info.representation()); 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 11921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 12021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Handle the no-op shortcuts when no checking is necessary. 12121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (use_info.type_check() == TypeCheckKind::kNone || 12221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch output_rep != MachineRepresentation::kWord32) { 12321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (use_info.representation() == output_rep) { 12421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Representations are the same. That's a no-op. 12521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return node; 12621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 12721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (IsWord(use_info.representation()) && IsWord(output_rep)) { 12821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Both are words less than or equal to 32-bits. 12921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Since loads of integers from memory implicitly sign or zero extend the 13021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // value to the full machine word size and stores implicitly truncate, 13121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // no representation change is necessary. 13221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return node; 13321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 13521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 13621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch switch (use_info.representation()) { 137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kTagged: 13821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch DCHECK(use_info.type_check() == TypeCheckKind::kNone); 139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return GetTaggedRepresentationFor(node, output_rep, output_type); 140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kFloat32: 14121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch DCHECK(use_info.type_check() == TypeCheckKind::kNone); 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return GetFloat32RepresentationFor(node, output_rep, output_type, 14321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch use_info.truncation()); 144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kFloat64: 145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return GetFloat64RepresentationFor(node, output_rep, output_type, 14621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch use_node, use_info); 147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kBit: 14821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch DCHECK(use_info.type_check() == TypeCheckKind::kNone); 149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return GetBitRepresentationFor(node, output_rep, output_type); 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kWord8: 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kWord16: 152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kWord32: 15321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return GetWord32RepresentationFor(node, output_rep, output_type, use_node, 15421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch use_info); 155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kWord64: 15621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch DCHECK(use_info.type_check() == TypeCheckKind::kNone); 157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return GetWord64RepresentationFor(node, output_rep, output_type); 158342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch case MachineRepresentation::kSimd128: // Fall through. 159342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch // TODO(bbudge) Handle conversions between tagged and untagged. 160342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch break; 161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MachineRepresentation::kNone: 162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return node; 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return nullptr; 166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* RepresentationChanger::GetTaggedRepresentationFor( 169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* node, MachineRepresentation output_rep, Type* output_type) { 170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Eagerly fold representation changes for constants. 171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (node->opcode()) { 172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberConstant: 173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kHeapConstant: 174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return node; // No change necessary. 175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kInt32Constant: 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (output_type->Is(Type::Signed32())) { 177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t value = OpParameter<int32_t>(node); 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->Constant(value); 179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (output_type->Is(Type::Unsigned32())) { 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t value = static_cast<uint32_t>(OpParameter<int32_t>(node)); 181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->Constant(static_cast<double>(value)); 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (output_rep == MachineRepresentation::kBit) { 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return OpParameter<int32_t>(node) == 0 ? jsgraph()->FalseConstant() 184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : jsgraph()->TrueConstant(); 185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return TypeError(node, output_rep, output_type, 187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation::kTagged); 188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kFloat64Constant: 190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->Constant(OpParameter<double>(node)); 191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kFloat32Constant: 192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->Constant(OpParameter<float>(node)); 193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Select the correct X -> Tagged operator. 197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const Operator* op; 198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (output_rep == MachineRepresentation::kBit) { 199537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = simplified()->ChangeBitToTagged(); 200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (IsWord(output_rep)) { 201537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch if (output_type->Is(Type::Signed31())) { 202537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = simplified()->ChangeInt31ToTaggedSigned(); 203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (output_type->Is(Type::Signed32())) { 204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = simplified()->ChangeInt32ToTagged(); 205537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch } else if (output_type->Is(Type::Unsigned32())) { 206537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = simplified()->ChangeUint32ToTagged(); 207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return TypeError(node, output_rep, output_type, 209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation::kTagged); 210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (output_rep == 212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation::kFloat32) { // float32 -> float64 -> tagged 213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch node = InsertChangeFloat32ToFloat64(node); 214537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // TODO(bmeurer): Pass -0 hint to ChangeFloat64ToTagged. 215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = simplified()->ChangeFloat64ToTagged(); 216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (output_rep == MachineRepresentation::kFloat64) { 217537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch if (output_type->Is(Type::Signed31())) { // float64 -> int32 -> tagged 218537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch node = InsertChangeFloat64ToInt32(node); 219537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = simplified()->ChangeInt31ToTaggedSigned(); 220537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch } else if (output_type->Is( 221537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch Type::Signed32())) { // float64 -> int32 -> tagged 222537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch node = InsertChangeFloat64ToInt32(node); 223537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = simplified()->ChangeInt32ToTagged(); 224537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch } else if (output_type->Is( 225537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch Type::Unsigned32())) { // float64 -> uint32 -> tagged 226537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch node = InsertChangeFloat64ToUint32(node); 227537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = simplified()->ChangeUint32ToTagged(); 228537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch } else { 229537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch // TODO(bmeurer): Pass -0 hint to ChangeFloat64ToTagged. 230537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = simplified()->ChangeFloat64ToTagged(); 231537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch } 232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return TypeError(node, output_rep, output_type, 234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation::kTagged); 235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->graph()->NewNode(op, node); 237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* RepresentationChanger::GetFloat32RepresentationFor( 241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* node, MachineRepresentation output_rep, Type* output_type, 242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Truncation truncation) { 243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Eagerly fold representation changes for constants. 244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (node->opcode()) { 245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kFloat64Constant: 246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberConstant: 247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->Float32Constant( 248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DoubleToFloat32(OpParameter<double>(node))); 249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kInt32Constant: 250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (output_type->Is(Type::Unsigned32())) { 251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t value = static_cast<uint32_t>(OpParameter<int32_t>(node)); 252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->Float32Constant(static_cast<float>(value)); 253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t value = OpParameter<int32_t>(node); 255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->Float32Constant(static_cast<float>(value)); 256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kFloat32Constant: 258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return node; // No change necessary. 259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Select the correct X -> Float32 operator. 2631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch const Operator* op = nullptr; 2641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (IsWord(output_rep)) { 265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (output_type->Is(Type::Signed32())) { 2661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // int32 -> float64 -> float32 267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = machine()->ChangeInt32ToFloat64(); 2681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = jsgraph()->graph()->NewNode(op, node); 2691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch op = machine()->TruncateFloat64ToFloat32(); 2701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (output_type->Is(Type::Unsigned32()) || 2711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch truncation.TruncatesToWord32()) { 2721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Either the output is uint32 or the uses only care about the 2731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // low 32 bits (so we can pick uint32 safely). 2741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 2751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // uint32 -> float64 -> float32 276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = machine()->ChangeUint32ToFloat64(); 2771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = jsgraph()->graph()->NewNode(op, node); 2781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch op = machine()->TruncateFloat64ToFloat32(); 279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (output_rep == MachineRepresentation::kTagged) { 281537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch if (output_type->Is(Type::NumberOrUndefined())) { 28221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // tagged -> float64 -> float32 28321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (output_type->Is(Type::Number())) { 28421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->ChangeTaggedToFloat64(); 28521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else { 28621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->TruncateTaggedToFloat64(); 28721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 2881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch node = jsgraph()->graph()->NewNode(op, node); 2891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch op = machine()->TruncateFloat64ToFloat32(); 2901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (output_rep == MachineRepresentation::kFloat64) { 292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = machine()->TruncateFloat64ToFloat32(); 2931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 2941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (op == nullptr) { 295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return TypeError(node, output_rep, output_type, 296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation::kFloat32); 297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->graph()->NewNode(op, node); 299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* RepresentationChanger::GetFloat64RepresentationFor( 302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* node, MachineRepresentation output_rep, Type* output_type, 30321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch Node* use_node, UseInfo use_info) { 304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Eagerly fold representation changes for constants. 30521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if ((use_info.type_check() == TypeCheckKind::kNone)) { 30621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // TODO(jarin) Handle checked constant conversions. 30721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch switch (node->opcode()) { 30821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberConstant: 30921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return jsgraph()->Float64Constant(OpParameter<double>(node)); 31021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kInt32Constant: 31121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (output_type->Is(Type::Signed32())) { 31221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch int32_t value = OpParameter<int32_t>(node); 31321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return jsgraph()->Float64Constant(value); 31421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else { 31521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch DCHECK(output_type->Is(Type::Unsigned32())); 31621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch uint32_t value = static_cast<uint32_t>(OpParameter<int32_t>(node)); 31721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return jsgraph()->Float64Constant(static_cast<double>(value)); 31821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 31921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kFloat64Constant: 32021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return node; // No change necessary. 32121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kFloat32Constant: 32221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return jsgraph()->Float64Constant(OpParameter<float>(node)); 32321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch default: 32421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch break; 32521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Select the correct X -> Float64 operator. 3281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch const Operator* op = nullptr; 3291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (IsWord(output_rep)) { 330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (output_type->Is(Type::Signed32())) { 331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = machine()->ChangeInt32ToFloat64(); 3321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (output_type->Is(Type::Unsigned32()) || 33321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch use_info.truncation().TruncatesToWord32()) { 3341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // Either the output is uint32 or the uses only care about the 3351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch // low 32 bits (so we can pick uint32 safely). 336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = machine()->ChangeUint32ToFloat64(); 337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (output_rep == MachineRepresentation::kTagged) { 339537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch if (output_type->Is(Type::Undefined())) { 340537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch return jsgraph()->Float64Constant( 341537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch std::numeric_limits<double>::quiet_NaN()); 342537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch } else if (output_type->Is(Type::TaggedSigned())) { 343537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch node = InsertChangeTaggedSignedToInt32(node); 344537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = machine()->ChangeInt32ToFloat64(); 34521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_type->Is(Type::Number())) { 3461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch op = simplified()->ChangeTaggedToFloat64(); 34721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_type->Is(Type::NumberOrUndefined())) { 34821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // TODO(jarin) Here we should check that truncation is Number. 34921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->TruncateTaggedToFloat64(); 35021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (use_info.type_check() == TypeCheckKind::kNumberOrUndefined) { 35121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->CheckedTaggedToFloat64(); 3521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (output_rep == MachineRepresentation::kFloat32) { 354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = machine()->ChangeFloat32ToFloat64(); 3551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 3561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (op == nullptr) { 357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return TypeError(node, output_rep, output_type, 358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation::kFloat64); 359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 36021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return InsertConversion(node, op, use_node); 361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* RepresentationChanger::MakeTruncatedInt32Constant(double value) { 364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->Int32Constant(DoubleToInt32(value)); 365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* RepresentationChanger::GetWord32RepresentationFor( 3681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Node* node, MachineRepresentation output_rep, Type* output_type, 36921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch Node* use_node, UseInfo use_info) { 370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Eagerly fold representation changes for constants. 371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (node->opcode()) { 372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kInt32Constant: 373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return node; // No change necessary. 37421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kFloat32Constant: { 37521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch float const fv = OpParameter<float>(node); 37621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (use_info.type_check() == TypeCheckKind::kNone || 37721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch (use_info.type_check() == TypeCheckKind::kSigned32 && 37821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch IsInt32Double(fv))) { 37921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return MakeTruncatedInt32Constant(fv); 38021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 38121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch break; 38221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberConstant: 38421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kFloat64Constant: { 38521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch double const fv = OpParameter<double>(node); 38621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (use_info.type_check() == TypeCheckKind::kNone || 38721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch (use_info.type_check() == TypeCheckKind::kSigned32 && 38821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch IsInt32Double(fv))) { 38921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return MakeTruncatedInt32Constant(fv); 39021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 39121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch break; 39221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 39621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Select the correct X -> Word32 operator. 3981b268ca467c924004286c97bac133db489cf43d0Ben Murdoch const Operator* op = nullptr; 399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (output_rep == MachineRepresentation::kBit) { 400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return node; // Sloppy comparison -> word32 401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (output_rep == MachineRepresentation::kFloat64) { 4021b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (output_type->Is(Type::Unsigned32())) { 403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = machine()->ChangeFloat64ToUint32(); 4041b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (output_type->Is(Type::Signed32())) { 405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = machine()->ChangeFloat64ToInt32(); 40621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (use_info.truncation().TruncatesToWord32()) { 407537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = machine()->TruncateFloat64ToWord32(); 40821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (use_info.type_check() == TypeCheckKind::kSigned32) { 40921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->CheckedFloat64ToInt32(); 410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (output_rep == MachineRepresentation::kFloat32) { 412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch node = InsertChangeFloat32ToFloat64(node); // float32 -> float64 -> int32 4131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (output_type->Is(Type::Unsigned32())) { 414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = machine()->ChangeFloat64ToUint32(); 4151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (output_type->Is(Type::Signed32())) { 416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = machine()->ChangeFloat64ToInt32(); 41721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (use_info.truncation().TruncatesToWord32()) { 418537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = machine()->TruncateFloat64ToWord32(); 41921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (use_info.type_check() == TypeCheckKind::kSigned32) { 42021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->CheckedFloat64ToInt32(); 421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (output_rep == MachineRepresentation::kTagged) { 423537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch if (output_type->Is(Type::TaggedSigned())) { 424537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = simplified()->ChangeTaggedSignedToInt32(); 425537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch } else if (output_type->Is(Type::Unsigned32())) { 426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = simplified()->ChangeTaggedToUint32(); 4271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } else if (output_type->Is(Type::Signed32())) { 428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = simplified()->ChangeTaggedToInt32(); 42921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (use_info.truncation().TruncatesToWord32()) { 430537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = simplified()->TruncateTaggedToWord32(); 43121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (use_info.type_check() == TypeCheckKind::kSigned32) { 43221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->CheckedTaggedToInt32(); 433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 43421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_rep == MachineRepresentation::kWord32) { 43521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Only the checked case should get here, the non-checked case is 43621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // handled in GetRepresentationFor. 43721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch DCHECK(use_info.type_check() == TypeCheckKind::kSigned32); 43821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (output_type->Is(Type::Signed32())) { 43921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return node; 44021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_type->Is(Type::Unsigned32())) { 44121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->CheckedUint32ToInt32(); 44221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 44321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_rep == MachineRepresentation::kWord8 || 44421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch output_rep == MachineRepresentation::kWord16) { 44521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch DCHECK(use_info.representation() == MachineRepresentation::kWord32); 44621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch DCHECK(use_info.type_check() == TypeCheckKind::kSigned32); 44721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return node; 4481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 44921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 4501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch if (op == nullptr) { 451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return TypeError(node, output_rep, output_type, 452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation::kWord32); 453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 45421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return InsertConversion(node, op, use_node); 45521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch} 45621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 45721efce637eb329c94f1323b6a2334a1c977e1a9dBen MurdochNode* RepresentationChanger::InsertConversion(Node* node, const Operator* op, 45821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch Node* use_node) { 45921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (op->ControlInputCount() > 0) { 46021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // If the operator can deoptimize (which means it has control 46121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // input), we need to connect it to the effect and control chains. 46221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch Node* effect = NodeProperties::GetEffectInput(use_node); 46321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch Node* control = NodeProperties::GetControlInput(use_node); 46421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch Node* conversion = jsgraph()->graph()->NewNode(op, node, effect, control); 46521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch NodeProperties::ReplaceEffectInput(use_node, conversion); 46621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return conversion; 46721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->graph()->NewNode(op, node); 469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* RepresentationChanger::GetBitRepresentationFor( 473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* node, MachineRepresentation output_rep, Type* output_type) { 474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Eagerly fold representation changes for constants. 475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (node->opcode()) { 476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kHeapConstant: { 477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapObject> value = OpParameter<Handle<HeapObject>>(node); 478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(value.is_identical_to(factory()->true_value()) || 479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch value.is_identical_to(factory()->false_value())); 480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->Int32Constant( 481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch value.is_identical_to(factory()->true_value()) ? 1 : 0); 482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Select the correct X -> Bit operator. 487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const Operator* op; 488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (output_rep == MachineRepresentation::kTagged) { 489537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch op = simplified()->ChangeTaggedToBit(); 490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return TypeError(node, output_rep, output_type, 492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation::kBit); 493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->graph()->NewNode(op, node); 495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* RepresentationChanger::GetWord64RepresentationFor( 498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Node* node, MachineRepresentation output_rep, Type* output_type) { 499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (output_rep == MachineRepresentation::kBit) { 500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return node; // Sloppy comparison -> word64 501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Can't really convert Word64 to anything else. Purported to be internal. 503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return TypeError(node, output_rep, output_type, 504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation::kWord64); 505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 50721efce637eb329c94f1323b6a2334a1c977e1a9dBen MurdochNode* RepresentationChanger::GetCheckedWord32RepresentationFor( 50821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch Node* node, MachineRepresentation output_rep, Type* output_type, 50921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch Node* use_node, Truncation truncation, TypeCheckKind check) { 51021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // TODO(jarin) Eagerly fold constants (or insert hard deopt if the constant 51121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // does not pass the check). 51221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 51321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // If the input is already Signed32 in Word32 representation, we do not 51421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // have to do anything. (We could fold this into the big if below, but 51521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // it feels nicer to have the shortcut return first). 51621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (output_rep == MachineRepresentation::kWord32 || 51721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch output_type->Is(Type::Signed32())) { 51821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return node; 51921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 52021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch 52121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // Select the correct X -> Word32 operator. 52221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch const Operator* op = nullptr; 52321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (output_rep == MachineRepresentation::kWord32) { 52421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (output_type->Is(Type::Unsigned32())) { 52521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->CheckedUint32ToInt32(); 52621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 52721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_rep == MachineRepresentation::kBit) { 52821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return node; // Sloppy comparison -> word32 52921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_rep == MachineRepresentation::kFloat64) { 53021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (output_type->Is(Type::Unsigned32())) { 53121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = machine()->ChangeFloat64ToUint32(); 53221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_type->Is(Type::Signed32())) { 53321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = machine()->ChangeFloat64ToInt32(); 53421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (truncation.TruncatesToWord32()) { 53521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = machine()->TruncateFloat64ToWord32(); 53621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (check == TypeCheckKind::kSigned32) { 53721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->CheckedFloat64ToInt32(); 53821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 53921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_rep == MachineRepresentation::kFloat32) { 54021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch node = InsertChangeFloat32ToFloat64(node); // float32 -> float64 -> int32 54121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (output_type->Is(Type::Unsigned32())) { 54221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = machine()->ChangeFloat64ToUint32(); 54321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_type->Is(Type::Signed32())) { 54421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = machine()->ChangeFloat64ToInt32(); 54521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (truncation.TruncatesToWord32()) { 54621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = machine()->TruncateFloat64ToWord32(); 54721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (check == TypeCheckKind::kSigned32) { 54821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->CheckedFloat64ToInt32(); 54921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 55021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_rep == MachineRepresentation::kTagged) { 55121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (output_type->Is(Type::TaggedSigned())) { 55221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->ChangeTaggedSignedToInt32(); 55321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_type->Is(Type::Unsigned32())) { 55421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->ChangeTaggedToUint32(); 55521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (output_type->Is(Type::Signed32())) { 55621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->ChangeTaggedToInt32(); 55721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (truncation.TruncatesToWord32()) { 55821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->TruncateTaggedToWord32(); 55921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } else if (check == TypeCheckKind::kSigned32) { 56021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch op = simplified()->CheckedTaggedToInt32(); 56121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 56221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 56321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (op == nullptr) { 56421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return TypeError(node, output_rep, output_type, 56521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch MachineRepresentation::kWord32); 56621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 56721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch if (op->ControlInputCount() > 0) { 56821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // If the operator can deoptimize (which means it has control 56921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch // input), we need to connect it to the effect and control chains. 57021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch UNIMPLEMENTED(); 57121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 57221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return jsgraph()->graph()->NewNode(op, node); 57321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch} 574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* RepresentationChanger::Int32OperatorFor( 576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IrOpcode::Value opcode) { 577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (opcode) { 57821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberAdd: // Fall through. 579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberAdd: 580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Int32Add(); 58121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberSubtract: // Fall through. 582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberSubtract: 583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Int32Sub(); 58421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberMultiply: 585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberMultiply: 586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Int32Mul(); 58721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberDivide: 588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberDivide: 589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Int32Div(); 59021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberModulus: 591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberModulus: 592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Int32Mod(); 593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberBitwiseOr: 594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Word32Or(); 595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberBitwiseXor: 596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Word32Xor(); 597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberBitwiseAnd: 598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Word32And(); 599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberEqual: 60021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberEqual: 601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Word32Equal(); 602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberLessThan: 60321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberLessThan: 604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Int32LessThan(); 605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberLessThanOrEqual: 60621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberLessThanOrEqual: 607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Int32LessThanOrEqual(); 608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return nullptr; 611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 61421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdochconst Operator* RepresentationChanger::Int32OverflowOperatorFor( 61521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch IrOpcode::Value opcode) { 61621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch switch (opcode) { 61721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberAdd: // Fall through. 61821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return simplified()->CheckedInt32Add(); 61921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberSubtract: // Fall through. 62021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return simplified()->CheckedInt32Sub(); 62121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch default: 62221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch UNREACHABLE(); 62321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return nullptr; 62421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch } 62521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch} 626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* RepresentationChanger::Uint32OperatorFor( 628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IrOpcode::Value opcode) { 629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (opcode) { 630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberAdd: 631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Int32Add(); 632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberSubtract: 633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Int32Sub(); 63421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberMultiply: 635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberMultiply: 636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Int32Mul(); 63721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberDivide: 638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberDivide: 639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Uint32Div(); 64021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberModulus: 641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberModulus: 642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Uint32Mod(); 643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberEqual: 64421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberEqual: 645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Word32Equal(); 646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberLessThan: 64721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberLessThan: 648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Uint32LessThan(); 649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberLessThanOrEqual: 65021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberLessThanOrEqual: 651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Uint32LessThanOrEqual(); 6521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case IrOpcode::kNumberClz32: 6531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return machine()->Word32Clz(); 6541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch case IrOpcode::kNumberImul: 6551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return machine()->Int32Mul(); 656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return nullptr; 659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* RepresentationChanger::Float64OperatorFor( 664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IrOpcode::Value opcode) { 665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (opcode) { 66621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberAdd: 667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberAdd: 668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Float64Add(); 66921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberSubtract: 670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberSubtract: 671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Float64Sub(); 67221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberMultiply: 673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberMultiply: 674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Float64Mul(); 67521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberDivide: 676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberDivide: 677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Float64Div(); 67821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberModulus: 679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberModulus: 680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Float64Mod(); 681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberEqual: 68221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberEqual: 683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Float64Equal(); 684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberLessThan: 68521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberLessThan: 686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Float64LessThan(); 687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case IrOpcode::kNumberLessThanOrEqual: 68821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kSpeculativeNumberLessThanOrEqual: 689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return machine()->Float64LessThanOrEqual(); 69021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberAbs: 69121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Abs(); 69221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberAtan: 69321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Atan(); 69421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberAtan2: 69521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Atan2(); 69621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberCos: 69721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Cos(); 69821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberExp: 69921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Exp(); 70021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberFround: 70121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->TruncateFloat64ToFloat32(); 70221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberAtanh: 70321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Atanh(); 70421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberLog: 70521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Log(); 70621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberLog1p: 70721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Log1p(); 70821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberLog2: 70921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Log2(); 71021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberLog10: 71121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Log10(); 71221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberSin: 71321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Sin(); 71421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberTan: 71521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Tan(); 71621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberSqrt: 71721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Sqrt(); 71821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberCbrt: 71921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Cbrt(); 72021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberExpm1: 72121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64Expm1(); 72221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch case IrOpcode::kNumberSilenceNaN: 72321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch return machine()->Float64SilenceNaN(); 724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return nullptr; 727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* RepresentationChanger::TypeError(Node* node, 732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation output_rep, 733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Type* output_type, 734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MachineRepresentation use) { 735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch type_error_ = true; 736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!testing_type_errors_) { 737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch std::ostringstream out_str; 738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch out_str << output_rep << " ("; 739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch output_type->PrintTo(out_str, Type::SEMANTIC_DIM); 740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch out_str << ")"; 741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch std::ostringstream use_str; 743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch use_str << use; 744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_Fatal(__FILE__, __LINE__, 746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "RepresentationChangerError: node #%d:%s of " 747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "%s cannot be changed to %s", 748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch node->id(), node->op()->mnemonic(), out_str.str().c_str(), 749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch use_str.str().c_str()); 750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return node; 752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* RepresentationChanger::InsertChangeFloat32ToFloat64(Node* node) { 756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->graph()->NewNode(machine()->ChangeFloat32ToFloat64(), node); 757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 759537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben MurdochNode* RepresentationChanger::InsertChangeFloat64ToUint32(Node* node) { 760537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch return jsgraph()->graph()->NewNode(machine()->ChangeFloat64ToUint32(), node); 761537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch} 762537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 763537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben MurdochNode* RepresentationChanger::InsertChangeFloat64ToInt32(Node* node) { 764537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch return jsgraph()->graph()->NewNode(machine()->ChangeFloat64ToInt32(), node); 765537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch} 766537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch 767537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben MurdochNode* RepresentationChanger::InsertChangeTaggedSignedToInt32(Node* node) { 768537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch return jsgraph()->graph()->NewNode(simplified()->ChangeTaggedSignedToInt32(), 769537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch node); 770537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch} 771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNode* RepresentationChanger::InsertChangeTaggedToFloat64(Node* node) { 773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return jsgraph()->graph()->NewNode(simplified()->ChangeTaggedToFloat64(), 774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch node); 775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace compiler 778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 780