1// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu %s -emit-llvm -o - | FileCheck %s 2 3template <class T> 4void CheckIntScalarTypes() { 5 // T will be substituted with 'int' and 'enum' types. 6 7 typedef T __attribute__((mode(QI))) T1; 8 typedef T __attribute__((mode(HI))) T2; 9 typedef T __attribute__((mode(SI))) T3; 10 typedef T __attribute__((mode(DI))) T4; 11 12 T1 a1; 13 T2 a2; 14 T3 a3; 15 T4 a4; 16} 17 18template <class T> 19void CheckIntVectorTypes() { 20 // T will be substituted with 'int'. 21 22 typedef int __attribute__((mode(QI))) __attribute__((vector_size(8))) VT_11; 23 typedef T __attribute__((mode(V8QI))) VT_12; 24 typedef int __attribute__((mode(SI))) __attribute__((vector_size(16))) VT_21; 25 typedef T __attribute__((mode(V4SI))) VT_22; 26 typedef int __attribute__((mode(DI))) __attribute__((vector_size(64))) VT_31; 27 typedef T __attribute__((mode(V8DI))) VT_32; 28 29 VT_11 v11; 30 VT_12 v12; 31 32 VT_21 v21; 33 VT_22 v22; 34 35 VT_31 v31; 36 VT_32 v32; 37} 38 39template <class T> 40void CheckFloatVectorTypes() { 41 // T will be substituted with 'float'. 42 43 typedef float __attribute__((mode(SF))) __attribute__((vector_size(128))) VT_41; 44 typedef T __attribute__((mode(V32SF))) VT_42; 45 typedef float __attribute__((mode(DF))) __attribute__((vector_size(256))) VT_51; 46 typedef T __attribute__((mode(V32DF))) VT_52; 47 48 VT_41 v41; 49 VT_42 v42; 50 51 VT_51 v51; 52 VT_52 v52; 53} 54 55template <class T> 56void CheckInstantiationWithModedType() { 57 T x1; 58} 59 60typedef enum { A1, B1 } EnumTy; 61typedef int __attribute__((mode(DI))) Int64Ty1; 62typedef enum __attribute__((mode(DI))) { A2 } Int64Ty2; 63typedef int __attribute__((mode(V8HI))) IntVecTy1; 64 65void test() { 66 67 // CHECK: define {{.*}} void @_Z19CheckIntScalarTypesIiEvv() 68 // CHECK: %{{.+}} = alloca i8 69 // CHECK: %{{.+}} = alloca i16 70 // CHECK: %{{.+}} = alloca i32 71 // CHECK: %{{.+}} = alloca i64 72 CheckIntScalarTypes<int>(); 73 74 // CHECK: define {{.*}} void @_Z19CheckIntScalarTypesI6EnumTyEvv() 75 // CHECK: %{{.+}} = alloca i8 76 // CHECK: %{{.+}} = alloca i16 77 // CHECK: %{{.+}} = alloca i32 78 // CHECK: %{{.+}} = alloca i64 79 CheckIntScalarTypes<EnumTy>(); 80 81 // CHECK: define {{.*}} void @_Z19CheckIntVectorTypesIiEvv() 82 // CHECK: %{{.+}} = alloca <8 x i8> 83 // CHECK: %{{.+}} = alloca <8 x i8> 84 // CHECK: %{{.+}} = alloca <4 x i32> 85 // CHECK: %{{.+}} = alloca <4 x i32> 86 // CHECK: %{{.+}} = alloca <8 x i64> 87 // CHECK: %{{.+}} = alloca <8 x i64> 88 CheckIntVectorTypes<int>(); 89 90 // CHECK: define {{.*}} void @_Z21CheckFloatVectorTypesIfEvv() 91 // CHECK: %{{.+}} = alloca <32 x float> 92 // CHECK: %{{.+}} = alloca <32 x float> 93 // CHECK: %{{.+}} = alloca <32 x double> 94 // CHECK: %{{.+}} = alloca <32 x double> 95 CheckFloatVectorTypes<float>(); 96 97 // CHECK: define {{.*}} void @_Z31CheckInstantiationWithModedTypeIlEvv() 98 // CHECK: [[X1:%.+]] = alloca i64 99 CheckInstantiationWithModedType<Int64Ty1>(); 100 101 // CHECK: define {{.*}} void @_Z31CheckInstantiationWithModedTypeI8Int64Ty2Evv() 102 // CHECK: [[X1]] = alloca i64 103 CheckInstantiationWithModedType<Int64Ty2>(); 104 105 // CHECK: define {{.*}} void @_Z31CheckInstantiationWithModedTypeIDv8_sEvv() 106 // CHECK: [[X1]] = alloca <8 x i16> 107 CheckInstantiationWithModedType<IntVecTy1>(); 108} 109