ARM: partially handle 32-bit relocations for WoA
[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: 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 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: 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 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: vblendvps
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: vblendvps
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: vblendvpd
73 ;CHECK: ret
74 define <8 x double> @vsel_double8(<8 x double> %v1, <8 x double> %v2) {
75   %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
76   ret <8 x double> %vsel
77 }
78
79 ;CHECK-LABEL: vsel_i648:
80 ;CHECK: vblendvpd
81 ;CHECK: ret
82 define <8 x i64> @vsel_i648(<8 x i64> %v1, <8 x i64> %v2) {
83   %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
84   ret <8 x i64> %vsel
85 }
86
87 ;CHECK-LABEL: vsel_double4:
88 ;CHECK-NOT: vinsertf128
89 ;CHECK: vblendvpd
90 ;CHECK-NEXT: ret
91 define <4 x double> @vsel_double4(<4 x double> %v1, <4 x double> %v2) {
92   %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x double> %v1, <4 x double> %v2
93   ret <4 x double> %vsel
94 }
95
96 ;; TEST blend + compares
97 ; CHECK: testa
98 define <2 x double> @testa(<2 x double> %x, <2 x double> %y) {
99   ; CHECK: vcmplepd
100   ; CHECK: vblendvpd
101   %max_is_x = fcmp oge <2 x double> %x, %y
102   %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
103   ret <2 x double> %max
104 }
105
106 ; CHECK: testb
107 define <2 x double> @testb(<2 x double> %x, <2 x double> %y) {
108   ; CHECK: vcmpnlepd
109   ; CHECK: vblendvpd
110   %min_is_x = fcmp ult <2 x double> %x, %y
111   %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
112   ret <2 x double> %min
113 }
114
115