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
1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochenum class MachineRepresentation {
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,
3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  kSimd1x4,  // SIMD boolean vector types.
3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  kSimd1x8,
3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  kSimd1x16,
35c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  kFirstFPRepresentation = kFloat32,
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  kLastRepresentation = kSimd1x16
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
39c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstatic_assert(static_cast<int>(MachineRepresentation::kLastRepresentation) <
40c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                  kIntSize * kBitsPerByte,
41c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch              "Bit masks of MachineRepresentation should fit in an int");
42c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst char* MachineReprToString(MachineRepresentation);
44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochenum class MachineSemantic {
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kNone,
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kBool,
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kInt32,
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kUint32,
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kInt64,
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kUint64,
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kNumber,
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kAny
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass MachineType {
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MachineType()
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : representation_(MachineRepresentation::kNone),
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        semantic_(MachineSemantic::kNone) {}
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MachineType(MachineRepresentation representation, MachineSemantic semantic)
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : representation_(representation), semantic_(semantic) {}
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool operator==(MachineType other) const {
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return representation() == other.representation() &&
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           semantic() == other.semantic();
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool operator!=(MachineType other) const { return !(*this == other); }
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MachineRepresentation representation() const { return representation_; }
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MachineSemantic semantic() const { return semantic_; }
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
75f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  bool IsNone() { return representation() == MachineRepresentation::kNone; }
76f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsSigned() {
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return semantic() == MachineSemantic::kInt32 ||
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           semantic() == MachineSemantic::kInt64;
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsUnsigned() {
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return semantic() == MachineSemantic::kUint32 ||
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           semantic() == MachineSemantic::kUint64;
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineRepresentation PointerRepresentation() {
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return (kPointerSize == 4) ? MachineRepresentation::kWord32
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               : MachineRepresentation::kWord64;
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
8962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static MachineType UintPtr() {
9062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return (kPointerSize == 4) ? Uint32() : Uint64();
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType IntPtr() {
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return (kPointerSize == 4) ? Int32() : Int64();
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Int8() {
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord8, MachineSemantic::kInt32);
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Uint8() {
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord8, MachineSemantic::kUint32);
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Int16() {
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord16, MachineSemantic::kInt32);
103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Uint16() {
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord16,
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       MachineSemantic::kUint32);
107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Int32() {
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord32, MachineSemantic::kInt32);
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Uint32() {
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord32,
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       MachineSemantic::kUint32);
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Int64() {
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord64, MachineSemantic::kInt64);
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Uint64() {
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord64,
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       MachineSemantic::kUint64);
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
12262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static MachineType Float32() {
12362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return MachineType(MachineRepresentation::kFloat32,
12462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                       MachineSemantic::kNumber);
12562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
12662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static MachineType Float64() {
12762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return MachineType(MachineRepresentation::kFloat64,
12862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                       MachineSemantic::kNumber);
12962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
13062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static MachineType Simd128() {
13162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return MachineType(MachineRepresentation::kSimd128, MachineSemantic::kNone);
13262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
13362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static MachineType Simd1x4() {
13462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return MachineType(MachineRepresentation::kSimd1x4, MachineSemantic::kNone);
13562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
13662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static MachineType Simd1x8() {
13762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return MachineType(MachineRepresentation::kSimd1x8, MachineSemantic::kNone);
13862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
13962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static MachineType Simd1x16() {
14062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return MachineType(MachineRepresentation::kSimd1x16,
14162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                       MachineSemantic::kNone);
14262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
14362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static MachineType Pointer() {
14462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return MachineType(PointerRepresentation(), MachineSemantic::kNone);
14562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
146f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static MachineType TaggedPointer() {
147f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return MachineType(MachineRepresentation::kTaggedPointer,
148f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                       MachineSemantic::kAny);
149f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
150f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static MachineType TaggedSigned() {
151f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return MachineType(MachineRepresentation::kTaggedSigned,
152f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                       MachineSemantic::kInt32);
153f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType AnyTagged() {
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kTagged, MachineSemantic::kAny);
156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType Bool() {
158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kBit, MachineSemantic::kBool);
159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType TaggedBool() {
161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kTagged, MachineSemantic::kBool);
162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType None() {
164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kNone, MachineSemantic::kNone);
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // These naked representations should eventually go away.
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepWord8() {
169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord8, MachineSemantic::kNone);
170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepWord16() {
172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord16, MachineSemantic::kNone);
173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepWord32() {
175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord32, MachineSemantic::kNone);
176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepWord64() {
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kWord64, MachineSemantic::kNone);
179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepFloat32() {
181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kFloat32, MachineSemantic::kNone);
182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepFloat64() {
184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kFloat64, MachineSemantic::kNone);
185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
186109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static MachineType RepSimd128() {
187109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return MachineType(MachineRepresentation::kSimd128, MachineSemantic::kNone);
188109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
18962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static MachineType RepSimd1x4() {
19062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return MachineType(MachineRepresentation::kSimd1x4, MachineSemantic::kNone);
19162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
19262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static MachineType RepSimd1x8() {
19362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return MachineType(MachineRepresentation::kSimd1x8, MachineSemantic::kNone);
19462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
19562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static MachineType RepSimd1x16() {
19662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return MachineType(MachineRepresentation::kSimd1x16,
19762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                       MachineSemantic::kNone);
19862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepTagged() {
200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kTagged, MachineSemantic::kNone);
201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static MachineType RepBit() {
203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return MachineType(MachineRepresentation::kBit, MachineSemantic::kNone);
204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
206f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static MachineType TypeForRepresentation(const MachineRepresentation& rep,
207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                           bool isSigned = true) {
208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    switch (rep) {
209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kNone:
210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::None();
211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kBit:
212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::Bool();
213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kWord8:
214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return isSigned ? MachineType::Int8() : MachineType::Uint8();
215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kWord16:
216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return isSigned ? MachineType::Int16() : MachineType::Uint16();
217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kWord32:
218f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return isSigned ? MachineType::Int32() : MachineType::Uint32();
219f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kWord64:
220f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return isSigned ? MachineType::Int64() : MachineType::Uint64();
221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kFloat32:
222f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::Float32();
223f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kFloat64:
224f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::Float64();
225f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kSimd128:
226f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::Simd128();
22762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kSimd1x4:
22862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        return MachineType::Simd1x4();
22962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kSimd1x8:
23062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        return MachineType::Simd1x8();
23162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kSimd1x16:
23262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        return MachineType::Simd1x16();
233f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case MachineRepresentation::kTagged:
234f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::AnyTagged();
235f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTaggedSigned:
236f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return MachineType::TaggedSigned();
237f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTaggedPointer:
238f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return MachineType::TaggedPointer();
239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      default:
240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        UNREACHABLE();
241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return MachineType::None();
242f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
243f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
244f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MachineRepresentation representation_;
247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MachineSemantic semantic_;
248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE size_t hash_value(MachineRepresentation rep) {
251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return static_cast<size_t>(rep);
252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE size_t hash_value(MachineType type) {
255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return static_cast<size_t>(type.representation()) +
256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         static_cast<size_t>(type.semantic()) * 16;
257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
259f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochV8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
260f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                           MachineRepresentation rep);
261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, MachineSemantic type);
262c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochV8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, MachineType type);
263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline bool IsFloatingPoint(MachineRepresentation rep) {
265f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return rep >= MachineRepresentation::kFirstFPRepresentation;
266f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
267f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
268f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochinline bool CanBeTaggedPointer(MachineRepresentation rep) {
269f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return rep == MachineRepresentation::kTagged ||
270f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch         rep == MachineRepresentation::kTaggedPointer;
271f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
272f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
273c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochinline bool CanBeTaggedSigned(MachineRepresentation rep) {
274c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return rep == MachineRepresentation::kTagged ||
275c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch         rep == MachineRepresentation::kTaggedSigned;
276c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
277c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
278f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochinline bool IsAnyTagged(MachineRepresentation rep) {
279f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return CanBeTaggedPointer(rep) || rep == MachineRepresentation::kTaggedSigned;
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Gets the log2 of the element size in bytes of the machine type.
283c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochV8_EXPORT_PRIVATE inline int ElementSizeLog2Of(MachineRepresentation rep) {
284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (rep) {
285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kBit:
286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kWord8:
287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return 0;
288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kWord16:
289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return 1;
290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kWord32:
291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kFloat32:
292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return 2;
293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kWord64:
294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kFloat64:
295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return 3;
296109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    case MachineRepresentation::kSimd128:
297109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      return 4;
298f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case MachineRepresentation::kTaggedSigned:
299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case MachineRepresentation::kTaggedPointer:
300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MachineRepresentation::kTagged:
301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return kPointerSizeLog2;
302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNREACHABLE();
306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return -1;
307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtypedef Signature<MachineType> MachineSignature;
310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_MACHINE_TYPE_H_
315