Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu %s -emit-llvm -o - | FileCheck %s
      2 
      3 template <class T>
      4 void 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 
     18 template <class T>
     19 void 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 
     39 template <class T>
     40 void 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 
     55 template <class T>
     56 void CheckInstantiationWithModedType() {
     57   T x1;
     58 }
     59 
     60 typedef enum { A1, B1 }                       EnumTy;
     61 typedef int __attribute__((mode(DI)))         Int64Ty1;
     62 typedef enum __attribute__((mode(DI))) { A2 } Int64Ty2;
     63 typedef int __attribute__((mode(V8HI)))       IntVecTy1;
     64 
     65 void 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