Index: src/IceTypes.cpp |
diff --git a/src/IceTypes.cpp b/src/IceTypes.cpp |
index 0724e5146d116225e9351cf8074dc3c455d88446..21157d09dbc8b9676b42ca846c8816fc60ce7251 100644 |
--- a/src/IceTypes.cpp |
+++ b/src/IceTypes.cpp |
@@ -18,74 +18,203 @@ namespace Ice { |
namespace { |
-const struct { |
+// Dummy function to make sure the two type tables have the same |
+// enumerated types. |
+void __attribute__((unused)) xIceTypeMacroIntegrityCheck() { |
+ |
+ // Show tags match between ICETYPE_TABLE and ICETYPE_PROPS_TABLE. |
+ |
+ // Define a temporary set of enum values based on ICETYPE_TABLE |
+ enum { |
+#define X(tag, size, align, elts, elty, str) _table_tag_##tag, |
+ ICETYPE_TABLE |
+#undef X |
+ _enum_table_tag_Names |
+ }; |
+ // Define a temporary set of enum values based on ICETYPE_PROPS_TABLE |
+ enum { |
+#define X(tag, IsVec, IsInt, IsFloat, IsIntArith) _props_table_tag_##tag, |
+ ICETYPE_PROPS_TABLE |
+#undef X |
+ _enum_props_table_tag_Names |
+ }; |
+// Assert that tags in ICETYPE_TABLE are also in ICETYPE_PROPS_TABLE. |
+#define X(tag, size, align, elts, elty, str) \ |
+ STATIC_ASSERT((unsigned)_table_tag_##tag == (unsigned)_props_table_tag_##tag); |
+ ICETYPE_TABLE; |
+#undef X |
+// Assert that tags in ICETYPE_PROPS_TABLE is in ICETYPE_TABLE. |
+#define X(tag, IsVec, IsInt, IsFloat, IsIntArith) \ |
+ STATIC_ASSERT((unsigned)_table_tag_##tag == (unsigned)_props_table_tag_##tag); |
+ ICETYPE_PROPS_TABLE; |
+#undef X |
+ |
+ // Show vector definitions match in ICETYPE_TABLE and |
+ // ICETYPE_PROPS_TABLE. |
+ |
+ // Define constants for each element size in ICETYPE_TABLE. |
+ enum { |
+#define X(tag, size, align, elts, elty, str) _table_elts_##tag = elts, |
+ ICETYPE_TABLE |
+#undef X |
+ _enum_table_elts_Elements = 0 |
+ }; |
+ // Define constants for boolean flag if vector in ICETYPE_PROPS_TABLE. |
+ enum { |
+#define X(tag, IsVec, IsInt, IsFloat, IsIntArith) \ |
+ _props_table_IsVec_##tag = IsVec, |
+ ICETYPE_PROPS_TABLE |
+#undef X |
+ }; |
+// Verify that the number of vector elements is consistent with IsVec. |
+#define X(tag, IsVec, IsInt, IsFloat, IsIntArith) \ |
+ STATIC_ASSERT((_table_elts_##tag > 1) == _props_table_IsVec_##tag); |
+ ICETYPE_PROPS_TABLE; |
+#undef X |
+} |
+ |
+struct TypeAttributeFields { |
size_t TypeWidthInBytes; |
size_t TypeAlignInBytes; |
size_t TypeNumElements; |
Type TypeElementType; |
const char *DisplayString; |
-} TypeAttributes[] = { |
+}; |
+ |
+const struct TypeAttributeFields TypeAttributes[] = { |
#define X(tag, size, align, elts, elty, str) \ |
{ size, align, elts, elty, str } \ |
, |
ICETYPE_TABLE |
#undef X |
- }; |
+}; |
-const size_t TypeAttributesSize = |
- sizeof(TypeAttributes) / sizeof(*TypeAttributes); |
+struct TypePropertyFields { |
+ bool TypeIsVectorType; |
+ bool TypeIsIntegerType; |
+ bool TypeIsScalarIntegerType; |
+ bool TypeIsVectorIntegerType; |
+ bool TypeIsIntegerArithmeticType; |
+ bool TypeIsFloatingType; |
+ bool TypeIsScalarFloatingType; |
+ bool TypeIsVectorFloatingType; |
+}; |
+ |
+const TypePropertyFields TypePropertiesTable[] = { |
+#define X(tag, IsVec, IsInt, IsFloat, IsIntArith) \ |
+ { \ |
+ IsVec, IsInt, IsInt && !IsVec, IsInt && IsVec, IsIntArith, IsFloat, \ |
+ IsFloat && !IsVec, IsFloat && IsVec \ |
+ } \ |
+ , |
+ ICETYPE_PROPS_TABLE |
+#undef X |
+}; |
} // end anonymous namespace |
size_t typeWidthInBytes(Type Ty) { |
- size_t Width = 0; |
size_t Index = static_cast<size_t>(Ty); |
- if (Index < TypeAttributesSize) { |
- Width = TypeAttributes[Index].TypeWidthInBytes; |
- } else { |
- llvm_unreachable("Invalid type for typeWidthInBytes()"); |
- } |
- return Width; |
+ if (Index < IceType_NUM) |
+ return TypeAttributes[Index].TypeWidthInBytes; |
+ llvm_unreachable("Invalid type for typeWidthInBytes()"); |
+ return 0; |
} |
size_t typeAlignInBytes(Type Ty) { |
- size_t Align = 0; |
size_t Index = static_cast<size_t>(Ty); |
- if (Index < TypeAttributesSize) { |
- Align = TypeAttributes[Index].TypeAlignInBytes; |
- } else { |
- llvm_unreachable("Invalid type for typeAlignInBytes()"); |
- } |
- return Align; |
+ if (Index < IceType_NUM) |
+ return TypeAttributes[Index].TypeAlignInBytes; |
+ llvm_unreachable("Invalid type for typeAlignInBytes()"); |
+ return 1; |
} |
size_t typeNumElements(Type Ty) { |
- size_t NumElements = 0; |
size_t Index = static_cast<size_t>(Ty); |
- if (Index < TypeAttributesSize) { |
- NumElements = TypeAttributes[Index].TypeNumElements; |
- } else { |
- llvm_unreachable("Invalid type for typeNumElements()"); |
- } |
- return NumElements; |
+ if (Index < IceType_NUM) |
+ return TypeAttributes[Index].TypeNumElements; |
+ llvm_unreachable("Invalid type for typeNumElements()"); |
+ return 1; |
} |
Type typeElementType(Type Ty) { |
- Type ElementType = IceType_void; |
size_t Index = static_cast<size_t>(Ty); |
- if (Index < TypeAttributesSize) { |
- ElementType = TypeAttributes[Index].TypeElementType; |
- } else { |
- llvm_unreachable("Invalid type for typeElementType()"); |
- } |
- return ElementType; |
+ if (Index < IceType_NUM) |
+ return TypeAttributes[Index].TypeElementType; |
+ llvm_unreachable("Invalid type for typeElementType()"); |
+ return IceType_void; |
} |
+bool isVectorType(Type Ty) { |
+ size_t Index = static_cast<size_t>(Ty); |
+ if (Index < IceType_NUM) |
+ return TypePropertiesTable[Index].TypeIsVectorType; |
+ llvm_unreachable("Invalid type for isVectorType()"); |
+ return false; |
+} |
+ |
+bool isIntegerType(Type Ty) { |
+ size_t Index = static_cast<size_t>(Ty); |
+ if (Index < IceType_NUM) |
+ return TypePropertiesTable[Index].TypeIsIntegerType; |
+ llvm_unreachable("Invalid type for isIntegerType()"); |
+ return false; |
+} |
+ |
+bool isScalarIntegerType(Type Ty) { |
+ size_t Index = static_cast<size_t>(Ty); |
+ if (Index < IceType_NUM) |
+ return TypePropertiesTable[Index].TypeIsScalarIntegerType; |
+ llvm_unreachable("Invalid type for isScalIntegerType()"); |
+ return false; |
+} |
+ |
+bool isVectorIntegerType(Type Ty) { |
+ size_t Index = static_cast<size_t>(Ty); |
+ if (Index < IceType_NUM) |
+ return TypePropertiesTable[Index].TypeIsVectorIntegerType; |
+ llvm_unreachable("Invalid type for isVectorIntegerType()"); |
+ return false; |
+} |
+ |
+bool isIntegerArithmeticType(Type Ty) { |
+ size_t Index = static_cast<size_t>(Ty); |
+ if (Index < IceType_NUM) |
+ return TypePropertiesTable[Index].TypeIsIntegerArithmeticType; |
+ llvm_unreachable("Invalid type for isIntegerArithmeticType()"); |
+ return false; |
+} |
+ |
+bool isFloatingType(Type Ty) { |
+ size_t Index = static_cast<size_t>(Ty); |
+ if (Index < IceType_NUM) |
+ return TypePropertiesTable[Index].TypeIsFloatingType; |
+ llvm_unreachable("Invalid type for isFloatingType()"); |
+ return false; |
+} |
+ |
+bool isScalarFloatingType(Type Ty) { |
+ size_t Index = static_cast<size_t>(Ty); |
+ if (Index < IceType_NUM) |
+ return TypePropertiesTable[Index].TypeIsScalarFloatingType; |
+ llvm_unreachable("Invalid type for isScalarFloatingType()"); |
+ return false; |
+} |
+ |
+bool isVectorFloatingType(Type Ty) { |
+ size_t Index = static_cast<size_t>(Ty); |
+ if (Index < IceType_NUM) |
+ return TypePropertiesTable[Index].TypeIsVectorFloatingType; |
+ llvm_unreachable("Invalid type for isVectorFloatingType()"); |
+ return false; |
+} |
+ |
+// ======================== Dump routines ======================== // |
+ |
const char *typeString(Type Ty) { |
size_t Index = static_cast<size_t>(Ty); |
- if (Index < TypeAttributesSize) { |
+ if (Index < IceType_NUM) |
return TypeAttributes[Index].DisplayString; |
- } |
llvm_unreachable("Invalid type for typeString"); |
return "???"; |
} |