machine-type.h revision c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7a
1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2014 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#ifndef V8_MACHINE_TYPE_H_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_MACHINE_TYPE_H_
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <iosfwd>
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/bits.h"
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/globals.h"
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/signature.h"
13f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone.h"
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class MachineRepresentation : uint8_t {
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kNone,
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kBit,
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kWord8,
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kWord16,
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kWord32,
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kWord64,
25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  kTaggedSigned,
26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  kTaggedPointer,
27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kTagged,
28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // FP representations must be last, and in order of increasing size.
29f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kFloat32,
30f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kFloat64,
31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kSimd128,
32c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  kFirstFPRepresentation = kFloat32,
33c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  kLastRepresentation = kSimd128
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
36c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstatic_assert(static_cast<int>(MachineRepresentation::kLastRepresentation) <
37c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                  kIntSize * kBitsPerByte,
38c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch              "Bit masks of MachineRepresentation should fit in an int");
39c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst char* MachineReprToString(MachineRepresentation);
41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class MachineSemantic : uint8_t {
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kNone,
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kBool,
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kInt32,
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kUint32,
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kInt64,
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kUint64,
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kNumber,
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kAny
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass MachineType {
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MachineType()
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : representation_(MachineRepresentation::kNone),
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        semantic_(MachineSemantic::kNone) {}
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MachineType(MachineRepresentation representation, MachineSemantic semantic)
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : representation_(representation), semantic_(semantic) {}
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool operator==(MachineType other) const {
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return representation() == other.representation() &&
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           semantic() == other.semantic();
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool operator!=(MachineType other) const { return !(*this == other); }
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MachineRepresentation representation() const { return representation_; }
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MachineSemantic semantic() const { return semantic_; }
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
72f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  bool IsNone() { return representation() == MachineRepresentation::kNone; }
73f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsSigned() {
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return semantic() == MachineSemantic::kInt32 ||
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           semantic() == MachineSemantic::kInt64;
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsUnsigned() {
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return semantic() == MachineSemantic::kUint32 ||
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           semantic() == MachineSemantic::kUint64;
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineRepresentation PointerRepresentation() {
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return (kPointerSize == 4) ? MachineRepresentation::kWord32
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               : MachineRepresentation::kWord64;
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Pointer() {
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(PointerRepresentation(), MachineSemantic::kNone);
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType IntPtr() {
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return (kPointerSize == 4) ? Int32() : Int64();
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Float32() {
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kFloat32,
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       MachineSemantic::kNumber);
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Float64() {
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kFloat64,
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       MachineSemantic::kNumber);
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
101109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static MachineType Simd128() {
102109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return MachineType(MachineRepresentation::kSimd128, MachineSemantic::kNone);
103109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Int8() {
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord8, MachineSemantic::kInt32);
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Uint8() {
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord8, MachineSemantic::kUint32);
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Int16() {
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord16, MachineSemantic::kInt32);
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Uint16() {
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord16,
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       MachineSemantic::kUint32);
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Int32() {
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord32, MachineSemantic::kInt32);
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Uint32() {
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord32,
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       MachineSemantic::kUint32);
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Int64() {
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord64, MachineSemantic::kInt64);
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Uint64() {
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord64,
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       MachineSemantic::kUint64);
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
131f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static MachineType TaggedPointer() {
132f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return MachineType(MachineRepresentation::kTaggedPointer,
133f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                       MachineSemantic::kAny);
134f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
135f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static MachineType TaggedSigned() {
136f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return MachineType(MachineRepresentation::kTaggedSigned,
137f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                       MachineSemantic::kInt32);
138f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType AnyTagged() {
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kTagged, MachineSemantic::kAny);
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Bool() {
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kBit, MachineSemantic::kBool);
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType TaggedBool() {
146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kTagged, MachineSemantic::kBool);
147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType None() {
149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kNone, MachineSemantic::kNone);
150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // These naked representations should eventually go away.
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepWord8() {
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord8, MachineSemantic::kNone);
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepWord16() {
157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord16, MachineSemantic::kNone);
158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepWord32() {
160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord32, MachineSemantic::kNone);
161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepWord64() {
163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord64, MachineSemantic::kNone);
164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepFloat32() {
166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kFloat32, MachineSemantic::kNone);
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepFloat64() {
169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kFloat64, MachineSemantic::kNone);
170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
171109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static MachineType RepSimd128() {
172109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return MachineType(MachineRepresentation::kSimd128, MachineSemantic::kNone);
173109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepTagged() {
175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kTagged, MachineSemantic::kNone);
176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepBit() {
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kBit, MachineSemantic::kNone);
179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
181f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static MachineType TypeForRepresentation(const MachineRepresentation& rep,
182f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                           bool isSigned = true) {
183f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    switch (rep) {
184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kNone:
185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::None();
186f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kBit:
187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::Bool();
188f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kWord8:
189f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return isSigned ? MachineType::Int8() : MachineType::Uint8();
190f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kWord16:
191f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return isSigned ? MachineType::Int16() : MachineType::Uint16();
192f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kWord32:
193f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return isSigned ? MachineType::Int32() : MachineType::Uint32();
194f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kWord64:
195f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return isSigned ? MachineType::Int64() : MachineType::Uint64();
196f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kFloat32:
197f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::Float32();
198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kFloat64:
199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::Float64();
200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kSimd128:
201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::Simd128();
202f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kTagged:
203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::AnyTagged();
204f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTaggedSigned:
205f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return MachineType::TaggedSigned();
206f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTaggedPointer:
207f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return MachineType::TaggedPointer();
208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      default:
209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        UNREACHABLE();
210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::None();
211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MachineRepresentation representation_;
216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MachineSemantic semantic_;
217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE size_t hash_value(MachineRepresentation rep) {
220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return static_cast<size_t>(rep);
221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE size_t hash_value(MachineType type) {
224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return static_cast<size_t>(type.representation()) +
225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         static_cast<size_t>(type.semantic()) * 16;
226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
228f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochV8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
229f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                           MachineRepresentation rep);
230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, MachineSemantic type);
231c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochV8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, MachineType type);
232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline bool IsFloatingPoint(MachineRepresentation rep) {
234f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return rep >= MachineRepresentation::kFirstFPRepresentation;
235f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
236f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
237f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochinline bool CanBeTaggedPointer(MachineRepresentation rep) {
238f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return rep == MachineRepresentation::kTagged ||
239f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch         rep == MachineRepresentation::kTaggedPointer;
240f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
241f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
242c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochinline bool CanBeTaggedSigned(MachineRepresentation rep) {
243c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return rep == MachineRepresentation::kTagged ||
244c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch         rep == MachineRepresentation::kTaggedSigned;
245c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
246c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
247f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochinline bool IsAnyTagged(MachineRepresentation rep) {
248f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return CanBeTaggedPointer(rep) || rep == MachineRepresentation::kTaggedSigned;
249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Gets the log2 of the element size in bytes of the machine type.
252c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochV8_EXPORT_PRIVATE inline int ElementSizeLog2Of(MachineRepresentation rep) {
253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (rep) {
254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kBit:
255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kWord8:
256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return 0;
257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kWord16:
258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return 1;
259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kWord32:
260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kFloat32:
261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return 2;
262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kWord64:
263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kFloat64:
264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return 3;
265109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    case MachineRepresentation::kSimd128:
266109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      return 4;
267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case MachineRepresentation::kTaggedSigned:
268f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case MachineRepresentation::kTaggedPointer:
269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kTagged:
270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return kPointerSizeLog2;
271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNREACHABLE();
275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return -1;
276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtypedef Signature<MachineType> MachineSignature;
279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_MACHINE_TYPE_H_
284