Implemented special cases for PerformVSELECTCombine.
[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-LABEL: vsel_float:
6 ;CHECK: vblendps    $5
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 true, i1 false>, <4 x float> %v1, <4 x float> %v2
10   ret <4 x float> %vsel
11 }
12
13
14 ;CHECK-LABEL: vsel_i32:
15 ;CHECK: vblendps   $5
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 true, i1 false>, <4 x i32> %v1, <4 x i32> %v2
19   ret <4 x i32> %vsel
20 }
21
22
23 ;CHECK-LABEL: vsel_double:
24 ;CHECK: vmovsd
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-LABEL: vsel_i64:
33 ;CHECK: vmovsd
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-LABEL: 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-LABEL: vsel_float8:
54 ;CHECK-NOT: vinsertf128
55 ;CHECK: vblendps    $17
56 ;CHECK: ret
57 define <8 x float> @vsel_float8(<8 x float> %v1, <8 x float> %v2) {
58   %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
59   ret <8 x float> %vsel
60 }
61
62 ;CHECK-LABEL: vsel_i328:
63 ;CHECK-NOT: vinsertf128
64 ;CHECK: vblendps    $17
65 ;CHECK-NEXT: ret
66 define <8 x i32> @vsel_i328(<8 x i32> %v1, <8 x i32> %v2) {
67   %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
68   ret <8 x i32> %vsel
69 }
70
71 ;CHECK-LABEL: vsel_double8:
72 ;CHECK: vblendpd    $1
73 ;CHECK: vblendpd    $1
74 ;CHECK: ret
75 define <8 x double> @vsel_double8(<8 x double> %v1, <8 x double> %v2) {
76   %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
77   ret <8 x double> %vsel
78 }
79
80 ;CHECK-LABEL: vsel_i648:
81 ;CHECK: vblendpd    $1
82 ;CHECK: vblendpd    $1
83 ;CHECK: ret
84 define <8 x i64> @vsel_i648(<8 x i64> %v1, <8 x i64> %v2) {
85   %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
86   ret <8 x i64> %vsel
87 }
88
89 ;CHECK-LABEL: vsel_double4:
90 ;CHECK-NOT: vinsertf128
91 ;CHECK: vshufpd $10
92 ;CHECK-NEXT: ret
93 define <4 x double> @vsel_double4(<4 x double> %v1, <4 x double> %v2) {
94   %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x double> %v1, <4 x double> %v2
95   ret <4 x double> %vsel
96 }
97
98 ;; TEST blend + compares
99 ; CHECK: testa
100 define <2 x double> @testa(<2 x double> %x, <2 x double> %y) {
101   ; CHECK: vcmplepd
102   ; CHECK: vblendvpd
103   %max_is_x = fcmp oge <2 x double> %x, %y
104   %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
105   ret <2 x double> %max
106 }
107
108 ; CHECK: testb
109 define <2 x double> @testb(<2 x double> %x, <2 x double> %y) {
110   ; CHECK: vcmpnlepd
111   ; CHECK: vblendvpd
112   %min_is_x = fcmp ult <2 x double> %x, %y
113   %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
114   ret <2 x double> %min
115 }