namespace llvm {
class Type;
+ class LLVMContext;
struct MVT { // MVT = Machine Value Type
public:
v2i8 = 14, // 2 x i8
v4i8 = 15, // 4 x i8
- v2i16 = 16, // 2 x i16
- v8i8 = 17, // 8 x i8
- v4i16 = 18, // 4 x i16
- v2i32 = 19, // 2 x i32
- v1i64 = 20, // 1 x i64
- v16i8 = 21, // 16 x i8
- v8i16 = 22, // 8 x i16
- v3i32 = 23, // 3 x i32
+ v8i8 = 16, // 8 x i8
+ v16i8 = 17, // 16 x i8
+ v32i8 = 18, // 32 x i8
+ v2i16 = 19, // 2 x i16
+ v4i16 = 20, // 4 x i16
+ v8i16 = 21, // 8 x i16
+ v16i16 = 22, // 16 x i16
+ v2i32 = 23, // 2 x i32
v4i32 = 24, // 4 x i32
- v2i64 = 25, // 2 x i64
+ v8i32 = 25, // 8 x i32
+ v1i64 = 26, // 1 x i64
+ v2i64 = 27, // 2 x i64
+ v4i64 = 28, // 4 x i64
- v2f32 = 26, // 2 x f32
- v3f32 = 27, // 3 x f32
- v4f32 = 28, // 4 x f32
- v2f64 = 29, // 2 x f64
+ v2f32 = 29, // 2 x f32
+ v4f32 = 30, // 4 x f32
+ v8f32 = 31, // 8 x f32
+ v2f64 = 32, // 2 x f64
+ v4f64 = 33, // 4 x f64
FIRST_VECTOR_VALUETYPE = v2i8,
- LAST_VECTOR_VALUETYPE = v2f64,
+ LAST_VECTOR_VALUETYPE = v4f64,
- LAST_VALUETYPE = 30, // This always remains at the end of the list.
+ LAST_VALUETYPE = 34, // This always remains at the end of the list.
+
+ // This is the current maximum for LAST_VALUETYPE.
+ // MVT::MAX_ALLOWED_VALUETYPE is used for asserts and to size bit vectors
+ // This value must be a multiple of 32.
+ MAX_ALLOWED_VALUETYPE = 64,
+
+ // Metadata - This is MDNode or MDString.
+ Metadata = 251,
// iPTRAny - An int value the size of the pointer of the current
// target to any address space. This must only be used internal to
///
union {
uintptr_t V;
- SimpleValueType SimpleTy;
const Type *LLVMTy;
};
if (NumElements == 4) return v4i8;
if (NumElements == 8) return v8i8;
if (NumElements == 16) return v16i8;
+ if (NumElements == 32) return v32i8;
break;
case i16:
if (NumElements == 2) return v2i16;
if (NumElements == 4) return v4i16;
if (NumElements == 8) return v8i16;
+ if (NumElements == 16) return v16i16;
break;
case i32:
if (NumElements == 2) return v2i32;
- if (NumElements == 3) return v3i32;
if (NumElements == 4) return v4i32;
+ if (NumElements == 8) return v8i32;
break;
case i64:
if (NumElements == 1) return v1i64;
if (NumElements == 2) return v2i64;
+ if (NumElements == 4) return v4i64;
break;
case f32:
if (NumElements == 2) return v2f32;
- if (NumElements == 3) return v3f32;
if (NumElements == 4) return v4f32;
+ if (NumElements == 8) return v8f32;
break;
case f64:
if (NumElements == 2) return v2f64;
+ if (NumElements == 4) return v4f64;
break;
}
return getExtendedVectorVT(VT, NumElements);
default: return getVectorVT(i8, NumElts);
case 1: return v1i64;
case 2: return v2i32;
- case 3: return v3i32;
case 4: return v4i16;
case 8: return v8i8;
case 16: return v16i8;
/// isFloatingPoint - Return true if this is a FP, or a vector FP type.
bool isFloatingPoint() const {
return isSimple() ?
- ((SimpleTy >= f32 && SimpleTy <= ppcf128) ||
- (SimpleTy >= v2f32 && SimpleTy <= v2f64)) :
- isExtendedFloatingPoint();
+ ((V >= f32 && V <= ppcf128) ||
+ (V >= v2f32 && V <= v4f64)) : isExtendedFloatingPoint();
}
/// isInteger - Return true if this is an integer, or a vector integer type.
bool isInteger() const {
return isSimple() ?
- ((SimpleTy >= FIRST_INTEGER_VALUETYPE &&
- SimpleTy <= LAST_INTEGER_VALUETYPE) ||
- (SimpleTy >= v2i8 && SimpleTy <= v2i64)) :
- isExtendedInteger();
+ ((V >= FIRST_INTEGER_VALUETYPE && V <= LAST_INTEGER_VALUETYPE) ||
+ (V >= v2i8 && V <= v4i64)) : isExtendedInteger();
}
/// isVector - Return true if this is a vector value type.
bool isVector() const {
return isSimple() ?
- (SimpleTy >= FIRST_VECTOR_VALUETYPE &&
- SimpleTy <= LAST_VECTOR_VALUETYPE) :
+ (V >= FIRST_VECTOR_VALUETYPE && V <= LAST_VECTOR_VALUETYPE) :
isExtendedVector();
}
/// is64BitVector - Return true if this is a 64-bit vector type.
bool is64BitVector() const {
return isSimple() ?
- (SimpleTy==v8i8 || SimpleTy==v4i16 || SimpleTy==v2i32 ||
- SimpleTy==v1i64 || SimpleTy==v2f32) :
+ (V==v8i8 || V==v4i16 || V==v2i32 || V==v1i64 || V==v2f32) :
isExtended64BitVector();
}
/// is128BitVector - Return true if this is a 128-bit vector type.
bool is128BitVector() const {
return isSimple() ?
- (SimpleTy==v16i8 || SimpleTy==v8i16 || SimpleTy==v4i32 ||
- SimpleTy==v2i64 || SimpleTy==v4f32 || SimpleTy==v2f64) :
+ (V==v16i8 || V==v8i16 || V==v4i32 ||
+ V==v2i64 || V==v4f32 || V==v2f64) :
isExtended128BitVector();
}
+ /// is256BitVector - Return true if this is a 256-bit vector type.
+ inline bool is256BitVector() const {
+ return isSimple() ?
+ (V==v8f32 || V==v4f64 || V==v32i8 || V==v16i16 || V==v8i32 ||
+ V==v4i64) : isExtended256BitVector();
+ }
+
/// isByteSized - Return true if the bit size is a multiple of 8.
bool isByteSized() const {
return (getSizeInBits() & 7) == 0;
/// simple MVT.
SimpleValueType getSimpleVT() const {
assert(isSimple() && "Expected a SimpleValueType!");
- return SimpleTy;
+ return SimpleValueType(V);
}
/// getVectorElementType - Given a vector type, return the type of
case v2i8 :
case v4i8 :
case v8i8 :
- case v16i8: return i8;
+ case v16i8:
+ case v32i8: return i8;
case v2i16:
case v4i16:
- case v8i16: return i16;
+ case v8i16:
+ case v16i16: return i16;
case v2i32:
- case v3i32:
- case v4i32: return i32;
+ case v4i32:
+ case v8i32: return i32;
case v1i64:
- case v2i64: return i64;
+ case v2i64:
+ case v4i64: return i64;
case v2f32:
- case v3f32:
- case v4f32: return f32;
- case v2f64: return f64;
+ case v4f32:
+ case v8f32: return f32;
+ case v2f64:
+ case v4f64: return f64;
}
}
switch (V) {
default:
return getExtendedVectorNumElements();
- case v16i8: return 16;
+ case v32i8: return 32;
+ case v16i8:
+ case v16i16: return 16;
case v8i8 :
- case v8i16: return 8;
+ case v8i16:
+ case v8i32:
+ case v8f32: return 8;
case v4i8:
case v4i16:
case v4i32:
- case v4f32: return 4;
- case v3i32:
- case v3f32: return 3;
+ case v4i64:
+ case v4f32:
+ case v4f64: return 4;
case v2i8:
case v2i16:
case v2i32:
case v1i64:
case v2f32: return 64;
case f80 : return 80;
- case v3i32:
- case v3f32: return 96;
case f128:
case ppcf128:
case i128:
case v2i64:
case v4f32:
case v2f64: return 128;
+ case v32i8:
+ case v16i16:
+ case v8i32:
+ case v4i64:
+ case v8f32:
+ case v4f64: return 256;
}
}
/// getTypeForMVT - This method returns an LLVM type corresponding to the
/// specified MVT. For integer types, this returns an unsigned type. Note
/// that this will abort for types that cannot be represented.
- const Type *getTypeForMVT() const;
+ const Type *getTypeForMVT(LLVMContext &Context) const;
/// getMVT - Return the value type corresponding to the specified type.
/// This returns all pointers as iPTR. If HandleUnknown is true, unknown
bool isExtendedVector() const;
bool isExtended64BitVector() const;
bool isExtended128BitVector() const;
+ bool isExtended256BitVector() const;
MVT getExtendedVectorElementType() const;
unsigned getExtendedVectorNumElements() const;
unsigned getExtendedSizeInBits() const;