Home | History | Annotate | Download | only in CodeGen
      1 // RUN: %clang_cc1 -triple x86_64-apple-darwin9 -target-cpu corei7-avx -emit-llvm %s -o - | FileCheck %s
      2 // RUN: %clang_cc1 -triple x86_64-apple-darwin9 -target-cpu corei7-avx -emit-llvm -x c++ %s -o - | FileCheck %s
      3 
      4 typedef double vector8double __attribute__((__vector_size__(64)));
      5 typedef float  vector8float  __attribute__((__vector_size__(32)));
      6 typedef long   vector8long   __attribute__((__vector_size__(64)));
      7 typedef short  vector8short  __attribute__((__vector_size__(16)));
      8 typedef unsigned long   vector8ulong   __attribute__((__vector_size__(64)));
      9 typedef unsigned short  vector8ushort  __attribute__((__vector_size__(16)));
     10 
     11 #ifdef __cplusplus
     12 #define BOOL bool
     13 #else
     14 #define BOOL _Bool
     15 #endif
     16 
     17 typedef BOOL vector8bool __attribute__((__ext_vector_type__(8)));
     18 
     19 #ifdef __cplusplus
     20 extern "C" {
     21 #endif
     22 
     23 vector8float flt_trunc(vector8double x) {
     24   return __builtin_convertvector(x, vector8float);
     25   // CHECK-LABEL: @flt_trunc
     26   // CHECK: fptrunc <8 x double> %{{[^ ]}} to <8 x float>
     27 }
     28 
     29 vector8double flt_ext(vector8float x) {
     30   return __builtin_convertvector(x, vector8double);
     31   // CHECK-LABEL: @flt_ext
     32   // CHECK: fpext <8 x float> %{{[^ ]}} to <8 x double>
     33 }
     34 
     35 vector8bool flt_tobool(vector8float x) {
     36   return __builtin_convertvector(x, vector8bool);
     37   // CHECK-LABEL: @flt_tobool
     38   // CHECK-NOT: fptoui <8 x float> %{{[^ ]}} to <8 x i1>
     39   // CHECK: fcmp une <8 x float> %{{[^ ]}}, zeroinitializer
     40 }
     41 
     42 vector8long flt_tosi(vector8float x) {
     43   return __builtin_convertvector(x, vector8long);
     44   // CHECK-LABEL: @flt_tosi
     45   // CHECK: fptosi <8 x float> %{{[^ ]}} to <8 x i64>
     46 }
     47 
     48 vector8ulong flt_toui(vector8float x) {
     49   return __builtin_convertvector(x, vector8ulong);
     50   // CHECK-LABEL: @flt_toui
     51   // CHECK: fptoui <8 x float> %{{[^ ]}} to <8 x i64>
     52 }
     53 
     54 vector8ulong fltd_toui(vector8double x) {
     55   return __builtin_convertvector(x, vector8ulong);
     56   // CHECK-LABEL: @fltd_toui
     57   // CHECK: fptoui <8 x double> %{{[^ ]}} to <8 x i64>
     58 }
     59 
     60 vector8ulong int_zext(vector8ushort x) {
     61   return __builtin_convertvector(x, vector8ulong);
     62   // CHECK-LABEL: @int_zext
     63   // CHECK: zext <8 x i16> %{{[^ ]}} to <8 x i64>
     64 }
     65 
     66 vector8long int_sext(vector8short x) {
     67   return __builtin_convertvector(x, vector8long);
     68   // CHECK-LABEL: @int_sext
     69   // CHECK: sext <8 x i16> %{{[^ ]}} to <8 x i64>
     70 }
     71 
     72 vector8bool int_tobool(vector8short x) {
     73   return __builtin_convertvector(x, vector8bool);
     74   // CHECK-LABEL: @int_tobool
     75   // CHECK-NOT: trunc <8 x i16> %{{[^ ]}} to <8 x i1>
     76   // CHECK: icmp ne <8 x i16> %{{[^ ]}}, zeroinitializer
     77 }
     78 
     79 vector8float int_tofp(vector8short x) {
     80   return __builtin_convertvector(x, vector8float);
     81   // CHECK-LABEL: @int_tofp
     82   // CHECK: sitofp <8 x i16> %{{[^ ]}} to <8 x float>
     83 }
     84 
     85 vector8float uint_tofp(vector8ushort x) {
     86   return __builtin_convertvector(x, vector8float);
     87   // CHECK-LABEL: @uint_tofp
     88   // CHECK: uitofp <8 x i16> %{{[^ ]}} to <8 x float>
     89 }
     90 
     91 #ifdef __cplusplus
     92 }
     93 #endif
     94 
     95 
     96 #ifdef __cplusplus
     97 template<typename T>
     98 T int_toT(vector8long x) {
     99   return __builtin_convertvector(x, T);
    100 }
    101 
    102 extern "C" {
    103   vector8double int_toT_fp(vector8long x) {
    104     // CHECK-LABEL: @int_toT_fp
    105     // CHECK: sitofp <8 x i64> %{{[^ ]}} to <8 x double>
    106     return int_toT<vector8double>(x);
    107   }
    108 }
    109 #else
    110 vector8double int_toT_fp(vector8long x) {
    111   return __builtin_convertvector(x, vector8double);
    112 }
    113 #endif
    114 
    115