1414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -target-cpu corei7-avx -emit-llvm %s -o - | FileCheck %s
2414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -target-cpu corei7-avx -emit-llvm -x c++ %s -o - | FileCheck %s
3414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
4414a1bdbdaf250e0488589f12865c8961831b65dHal Finkeltypedef double vector8double __attribute__((__vector_size__(64)));
5414a1bdbdaf250e0488589f12865c8961831b65dHal Finkeltypedef float  vector8float  __attribute__((__vector_size__(32)));
6414a1bdbdaf250e0488589f12865c8961831b65dHal Finkeltypedef long   vector8long   __attribute__((__vector_size__(64)));
7414a1bdbdaf250e0488589f12865c8961831b65dHal Finkeltypedef short  vector8short  __attribute__((__vector_size__(16)));
8414a1bdbdaf250e0488589f12865c8961831b65dHal Finkeltypedef unsigned long   vector8ulong   __attribute__((__vector_size__(64)));
9414a1bdbdaf250e0488589f12865c8961831b65dHal Finkeltypedef unsigned short  vector8ushort  __attribute__((__vector_size__(16)));
10414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
11414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel#ifdef __cplusplus
12414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel#define BOOL bool
13414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel#else
14414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel#define BOOL _Bool
15414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel#endif
16414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
17414a1bdbdaf250e0488589f12865c8961831b65dHal Finkeltypedef BOOL vector8bool __attribute__((__ext_vector_type__(8)));
18414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
19414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel#ifdef __cplusplus
20414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelextern "C" {
21414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel#endif
22414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
23414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvector8float flt_trunc(vector8double x) {
24414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, vector8float);
25414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-LABEL: @flt_trunc
26414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK: fptrunc <8 x double> %{{[^ ]}} to <8 x float>
27414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
28414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
29414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvector8double flt_ext(vector8float x) {
30414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, vector8double);
31414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-LABEL: @flt_ext
32414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK: fpext <8 x float> %{{[^ ]}} to <8 x double>
33414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
34414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
35414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvector8bool flt_tobool(vector8float x) {
36414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, vector8bool);
37414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-LABEL: @flt_tobool
38414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-NOT: fptoui <8 x float> %{{[^ ]}} to <8 x i1>
39414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK: fcmp une <8 x float> %{{[^ ]}}, zeroinitializer
40414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
41414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
42414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvector8long flt_tosi(vector8float x) {
43414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, vector8long);
44414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-LABEL: @flt_tosi
45414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK: fptosi <8 x float> %{{[^ ]}} to <8 x i64>
46414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
47414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
48414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvector8ulong flt_toui(vector8float x) {
49414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, vector8ulong);
50414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-LABEL: @flt_toui
51414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK: fptoui <8 x float> %{{[^ ]}} to <8 x i64>
52414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
53414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
54414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvector8ulong fltd_toui(vector8double x) {
55414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, vector8ulong);
56414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-LABEL: @fltd_toui
57414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK: fptoui <8 x double> %{{[^ ]}} to <8 x i64>
58414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
59414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
60414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvector8ulong int_zext(vector8ushort x) {
61414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, vector8ulong);
62414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-LABEL: @int_zext
63414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK: zext <8 x i16> %{{[^ ]}} to <8 x i64>
64414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
65414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
66414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvector8long int_sext(vector8short x) {
67414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, vector8long);
68414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-LABEL: @int_sext
69414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK: sext <8 x i16> %{{[^ ]}} to <8 x i64>
70414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
71414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
72414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvector8bool int_tobool(vector8short x) {
73414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, vector8bool);
74414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-LABEL: @int_tobool
75414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-NOT: trunc <8 x i16> %{{[^ ]}} to <8 x i1>
76414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK: icmp ne <8 x i16> %{{[^ ]}}, zeroinitializer
77414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
78414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
79414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvector8float int_tofp(vector8short x) {
80414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, vector8float);
81414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-LABEL: @int_tofp
82414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK: sitofp <8 x i16> %{{[^ ]}} to <8 x float>
83414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
84414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
85414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvector8float uint_tofp(vector8ushort x) {
86414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, vector8float);
87414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK-LABEL: @uint_tofp
88414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  // CHECK: uitofp <8 x i16> %{{[^ ]}} to <8 x float>
89414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
90414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
91414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel#ifdef __cplusplus
92414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
93414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel#endif
94414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
95414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
96414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel#ifdef __cplusplus
97414a1bdbdaf250e0488589f12865c8961831b65dHal Finkeltemplate<typename T>
98414a1bdbdaf250e0488589f12865c8961831b65dHal FinkelT int_toT(vector8long x) {
99414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, T);
100414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
101414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
102414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelextern "C" {
103414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  vector8double int_toT_fp(vector8long x) {
104414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel    // CHECK-LABEL: @int_toT_fp
105414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel    // CHECK: sitofp <8 x i64> %{{[^ ]}} to <8 x double>
106414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel    return int_toT<vector8double>(x);
107414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  }
108414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
109414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel#else
110414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvector8double int_toT_fp(vector8long x) {
111414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  return __builtin_convertvector(x, vector8double);
112414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
113414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel#endif
114414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
115