X86: when we are auto-detecting the subtarget features, make sure we turn on
[oota-llvm.git] / test / CodeGen / X86 / avx-blend.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx  -mattr=+avx | FileCheck %s
2
3 ; AVX128 tests:
4
5 ;CHECK: vsel_float
6 ;CHECK: vblendvps
7 ;CHECK: ret
8 define <4 x float> @vsel_float(<4 x float> %v1, <4 x float> %v2) {
9   %vsel = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x float> %v1, <4 x float> %v2
10   ret <4 x float> %vsel
11 }
12
13
14 ;CHECK: vsel_i32
15 ;CHECK: vblendvps
16 ;CHECK: ret
17 define <4 x i32> @vsel_i32(<4 x i32> %v1, <4 x i32> %v2) {
18   %vsel = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x i32> %v1, <4 x i32> %v2
19   ret <4 x i32> %vsel
20 }
21
22
23 ;CHECK: vsel_double
24 ;CHECK: vblendvpd
25 ;CHECK: ret
26 define <2 x double> @vsel_double(<2 x double> %v1, <2 x double> %v2) {
27   %vsel = select <2 x i1> <i1 true, i1 false>, <2 x double> %v1, <2 x double> %v2
28   ret <2 x double> %vsel
29 }
30
31
32 ;CHECK: vsel_i64
33 ;CHECK: vblendvpd
34 ;CHECK: ret
35 define <2 x i64> @vsel_i64(<2 x i64> %v1, <2 x i64> %v2) {
36   %vsel = select <2 x i1> <i1 true, i1 false>, <2 x i64> %v1, <2 x i64> %v2
37   ret <2 x i64> %vsel
38 }
39
40
41 ;CHECK: vsel_i8
42 ;CHECK: vpblendvb
43 ;CHECK: ret
44 define <16 x i8> @vsel_i8(<16 x i8> %v1, <16 x i8> %v2) {
45   %vsel = select <16 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <16 x i8> %v1, <16 x i8> %v2
46   ret <16 x i8> %vsel
47 }
48
49
50 ; AVX256 tests:
51
52
53 ;CHECK: vsel_float
54 ;CHECK: vblendvps
55 ;CHECK: ret
56 define <8 x float> @vsel_float8(<8 x float> %v1, <8 x float> %v2) {
57   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x float> %v1, <8 x float> %v2
58   ret <8 x float> %vsel
59 }
60
61 ;CHECK: vsel_i32
62 ;CHECK: vblendvps
63 ;CHECK: ret
64 define <8 x i32> @vsel_i328(<8 x i32> %v1, <8 x i32> %v2) {
65   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x i32> %v1, <8 x i32> %v2
66   ret <8 x i32> %vsel
67 }
68
69 ;CHECK: vsel_double
70 ;CHECK: vblendvpd
71 ;CHECK: ret
72 define <8 x double> @vsel_double8(<8 x double> %v1, <8 x double> %v2) {
73   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x double> %v1, <8 x double> %v2
74   ret <8 x double> %vsel
75 }
76
77 ;CHECK: vsel_i64
78 ;CHECK: vblendvpd
79 ;CHECK: ret
80 define <8 x i64> @vsel_i648(<8 x i64> %v1, <8 x i64> %v2) {
81   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x i64> %v1, <8 x i64> %v2
82   ret <8 x i64> %vsel
83 }
84
85 ;; TEST blend + compares
86 ; CHECK: A
87 define <2 x double> @A(<2 x double> %x, <2 x double> %y) {
88   ; CHECK: vcmplepd
89   ; CHECK: vblendvpd
90   %max_is_x = fcmp oge <2 x double> %x, %y
91   %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
92   ret <2 x double> %max
93 }
94
95 ; CHECK: B
96 define <2 x double> @B(<2 x double> %x, <2 x double> %y) {
97   ; CHECK: vcmpnlepd
98   ; CHECK: vblendvpd
99   %min_is_x = fcmp ult <2 x double> %x, %y
100   %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
101   ret <2 x double> %min
102 }
103
104