OLD | NEW |
| (Empty) |
1 // Copyright 2014 the V8 project authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef V8_COMPILER_MACHINE_TYPE_H_ | |
6 #define V8_COMPILER_MACHINE_TYPE_H_ | |
7 | |
8 #include <iosfwd> | |
9 | |
10 #include "src/base/bits.h" | |
11 #include "src/globals.h" | |
12 #include "src/signature.h" | |
13 #include "src/zone.h" | |
14 | |
15 namespace v8 { | |
16 namespace internal { | |
17 namespace compiler { | |
18 | |
19 // Machine-level types and representations. | |
20 // TODO(titzer): Use the real type system instead of MachineType. | |
21 enum MachineType : uint16_t { | |
22 // Representations. | |
23 kRepBit = 1u << 0, | |
24 kRepWord8 = 1u << 1, | |
25 kRepWord16 = 1u << 2, | |
26 kRepWord32 = 1u << 3, | |
27 kRepWord64 = 1u << 4, | |
28 kRepFloat32 = 1u << 5, | |
29 kRepFloat64 = 1u << 6, | |
30 kRepTagged = 1u << 7, | |
31 | |
32 // Types. | |
33 kTypeBool = 1u << 8, | |
34 kTypeInt32 = 1u << 9, | |
35 kTypeUint32 = 1u << 10, | |
36 kTypeInt64 = 1u << 11, | |
37 kTypeUint64 = 1u << 12, | |
38 kTypeNumber = 1u << 13, | |
39 kTypeAny = 1u << 14, | |
40 | |
41 // Machine types. | |
42 kMachNone = 0u, | |
43 kMachBool = kRepBit | kTypeBool, | |
44 kMachFloat32 = kRepFloat32 | kTypeNumber, | |
45 kMachFloat64 = kRepFloat64 | kTypeNumber, | |
46 kMachInt8 = kRepWord8 | kTypeInt32, | |
47 kMachUint8 = kRepWord8 | kTypeUint32, | |
48 kMachInt16 = kRepWord16 | kTypeInt32, | |
49 kMachUint16 = kRepWord16 | kTypeUint32, | |
50 kMachInt32 = kRepWord32 | kTypeInt32, | |
51 kMachUint32 = kRepWord32 | kTypeUint32, | |
52 kMachInt64 = kRepWord64 | kTypeInt64, | |
53 kMachUint64 = kRepWord64 | kTypeUint64, | |
54 kMachIntPtr = (kPointerSize == 4) ? kMachInt32 : kMachInt64, | |
55 kMachUintPtr = (kPointerSize == 4) ? kMachUint32 : kMachUint64, | |
56 kMachPtr = (kPointerSize == 4) ? kRepWord32 : kRepWord64, | |
57 kMachAnyTagged = kRepTagged | kTypeAny | |
58 }; | |
59 | |
60 V8_INLINE size_t hash_value(MachineType type) { | |
61 return static_cast<size_t>(type); | |
62 } | |
63 | |
64 std::ostream& operator<<(std::ostream& os, const MachineType& type); | |
65 | |
66 typedef uint16_t MachineTypeUnion; | |
67 | |
68 // Globally useful machine types and constants. | |
69 const MachineTypeUnion kRepMask = kRepBit | kRepWord8 | kRepWord16 | | |
70 kRepWord32 | kRepWord64 | kRepFloat32 | | |
71 kRepFloat64 | kRepTagged; | |
72 const MachineTypeUnion kTypeMask = kTypeBool | kTypeInt32 | kTypeUint32 | | |
73 kTypeInt64 | kTypeUint64 | kTypeNumber | | |
74 kTypeAny; | |
75 | |
76 // Gets only the type of the given type. | |
77 inline MachineType TypeOf(MachineType machine_type) { | |
78 int result = machine_type & kTypeMask; | |
79 return static_cast<MachineType>(result); | |
80 } | |
81 | |
82 // Gets only the representation of the given type. | |
83 inline MachineType RepresentationOf(MachineType machine_type) { | |
84 int result = machine_type & kRepMask; | |
85 CHECK(base::bits::IsPowerOfTwo32(result)); | |
86 return static_cast<MachineType>(result); | |
87 } | |
88 | |
89 // Gets the log2 of the element size in bytes of the machine type. | |
90 inline int ElementSizeLog2Of(MachineType machine_type) { | |
91 switch (RepresentationOf(machine_type)) { | |
92 case kRepBit: | |
93 case kRepWord8: | |
94 return 0; | |
95 case kRepWord16: | |
96 return 1; | |
97 case kRepWord32: | |
98 case kRepFloat32: | |
99 return 2; | |
100 case kRepWord64: | |
101 case kRepFloat64: | |
102 return 3; | |
103 case kRepTagged: | |
104 return kPointerSizeLog2; | |
105 default: | |
106 break; | |
107 } | |
108 UNREACHABLE(); | |
109 return -1; | |
110 } | |
111 | |
112 // Gets the element size in bytes of the machine type. | |
113 inline int ElementSizeOf(MachineType machine_type) { | |
114 const int shift = ElementSizeLog2Of(machine_type); | |
115 DCHECK_NE(-1, shift); | |
116 return 1 << shift; | |
117 } | |
118 | |
119 inline bool IsFloatingPoint(MachineType type) { | |
120 MachineType rep = RepresentationOf(type); | |
121 return rep == kRepFloat32 || rep == kRepFloat64; | |
122 } | |
123 | |
124 typedef Signature<MachineType> MachineSignature; | |
125 | |
126 } // namespace compiler | |
127 } // namespace internal | |
128 } // namespace v8 | |
129 | |
130 #endif // V8_COMPILER_MACHINE_TYPE_H_ | |
OLD | NEW |