Index: src/IceTypes.h |
diff --git a/src/IceTypes.h b/src/IceTypes.h |
index a87cf8b9f46470d1cc58a1d6a0c6ffddc873fadc..1ef3df7f0b3c1b8973aef6cecae092b186bcdee8 100644 |
--- a/src/IceTypes.h |
+++ b/src/IceTypes.h |
@@ -22,12 +22,30 @@ |
namespace Ice { |
enum Type { |
-#define X(tag, sizeLog2, align, elts, elty, str) IceType_##tag, |
+#define X(tag, sizeLog2, align, elts, elty, str, rcstr) IceType_##tag, |
ICETYPE_TABLE |
#undef X |
IceType_NUM |
}; |
+/// RegClass indicates the physical register class that a Variable may be |
+/// register-allocated from. By default, a variable's register class is |
+/// directly associated with its type. However, the target lowering may define |
+/// additional target-specific register classes by extending the set of enum |
+/// values. |
+enum RegClass : uint8_t { |
+// Define RC_void, RC_i1, RC_i8, etc. |
+#define X(tag, sizeLog2, align, elts, elty, str, rcstr) \ |
+ RC_##tag = IceType_##tag, |
+ ICETYPE_TABLE |
+#undef X |
+ RC_Target, |
+ // Leave plenty of space for target-specific values. |
+ RC_Max = std::numeric_limits<uint8_t>::max() |
+}; |
+static_assert(RC_Target == static_cast<RegClass>(IceType_NUM), |
+ "Expected RC_Target and IceType_NUM to be the same"); |
+ |
enum TargetArch { |
#define X(tag, str, is_elf64, e_machine, e_flags) tag, |
TARGETARCH_TABLE |
@@ -64,6 +82,7 @@ size_t typeAlignInBytes(Type Ty); |
size_t typeNumElements(Type Ty); |
Type typeElementType(Type Ty); |
const char *typeString(Type Ty); |
+const char *regClassString(RegClass C); |
inline Type getPointerType() { return IceType_i32; } |