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