[x86] Move the vperm2f128 test to be vperm2x128 and test both the
[oota-llvm.git] / test / CodeGen / X86 / avx-vperm2x128.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX1
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=core-avx2 -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX2
3
4 define <8 x float> @A(<8 x float> %a, <8 x float> %b) nounwind uwtable readnone ssp {
5 ; ALL-LABEL: A:
6 ; ALL:       ## BB#0: ## %entry
7 ; ALL-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,0,1]
8 ; ALL-NEXT:    retq
9 entry:
10   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3>
11   ret <8 x float> %shuffle
12 }
13
14 define <8 x float> @B(<8 x float> %a, <8 x float> %b) nounwind uwtable readnone ssp {
15 ; ALL-LABEL: B:
16 ; ALL:       ## BB#0: ## %entry
17 ; ALL-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
18 ; ALL-NEXT:    retq
19 entry:
20   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>
21   ret <8 x float> %shuffle
22 }
23
24 define <8 x float> @C(<8 x float> %a, <8 x float> %b) nounwind uwtable readnone ssp {
25 ; ALL-LABEL: C:
26 ; ALL:       ## BB#0: ## %entry
27 ; ALL-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[0,1,0,1]
28 ; ALL-NEXT:    retq
29 entry:
30   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
31   ret <8 x float> %shuffle
32 }
33
34 define <8 x float> @D(<8 x float> %a, <8 x float> %b) nounwind uwtable readnone ssp {
35 ; ALL-LABEL: D:
36 ; ALL:       ## BB#0: ## %entry
37 ; ALL-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,2,3]
38 ; ALL-NEXT:    retq
39 entry:
40   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7>
41   ret <8 x float> %shuffle
42 }
43
44 define <32 x i8> @E(<32 x i8> %a, <32 x i8> %b) nounwind uwtable readnone ssp {
45 ; ALL-LABEL: E:
46 ; ALL:       ## BB#0: ## %entry
47 ; ALL-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,2,3]
48 ; ALL-NEXT:    retq
49 entry:
50   %shuffle = shufflevector <32 x i8> %a, <32 x i8> %b, <32 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
51   ret <32 x i8> %shuffle
52 }
53
54 define <4 x i64> @E2(<4 x i64> %a, <4 x i64> %b) nounwind uwtable readnone ssp {
55 ; ALL-LABEL: E2:
56 ; ALL:       ## BB#0: ## %entry
57 ; ALL-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm1[2,3],ymm0[0,1]
58 ; ALL-NEXT:    retq
59 entry:
60   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
61   ret <4 x i64> %shuffle
62 }
63
64 define <32 x i8> @Ei(<32 x i8> %a, <32 x i8> %b) nounwind uwtable readnone ssp {
65 ; AVX1-LABEL: Ei:
66 ; AVX1:       ## BB#0: ## %entry
67 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
68 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
69 ; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm1
70 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
71 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
72 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,2,3]
73 ; AVX1-NEXT:    retq
74 ;
75 ; AVX2-LABEL: Ei:
76 ; AVX2:       ## BB#0: ## %entry
77 ; AVX2-NEXT:    vpaddb {{.*}}, %ymm0, %ymm0
78 ; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[2,3,2,3]
79 ; AVX2-NEXT:    retq
80 entry:
81   ; add forces execution domain
82   %a2 = add <32 x i8> %a, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
83   %shuffle = shufflevector <32 x i8> %a2, <32 x i8> %b, <32 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
84   ret <32 x i8> %shuffle
85 }
86
87 define <4 x i64> @E2i(<4 x i64> %a, <4 x i64> %b) nounwind uwtable readnone ssp {
88 ; AVX1-LABEL: E2i:
89 ; AVX1:       ## BB#0: ## %entry
90 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
91 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1]
92 ; AVX1-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
93 ; AVX1-NEXT:    vpaddq %xmm3, %xmm0, %xmm0
94 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
95 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm1[2,3],ymm0[0,1]
96 ; AVX1-NEXT:    retq
97 ;
98 ; AVX2-LABEL: E2i:
99 ; AVX2:       ## BB#0: ## %entry
100 ; AVX2-NEXT:    vpbroadcastq {{.*}}, %ymm2
101 ; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
102 ; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm1[2,3],ymm0[0,1]
103 ; AVX2-NEXT:    retq
104 entry:
105   ; add forces execution domain
106   %a2 = add <4 x i64> %a, <i64 1, i64 1, i64 1, i64 1>
107   %shuffle = shufflevector <4 x i64> %a2, <4 x i64> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
108   ret <4 x i64> %shuffle
109 }
110
111 define <8 x i32> @E3i(<8 x i32> %a, <8 x i32> %b) nounwind uwtable readnone ssp {
112 ; AVX1-LABEL: E3i:
113 ; AVX1:       ## BB#0: ## %entry
114 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
115 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1]
116 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
117 ; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm0
118 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
119 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]
120 ; AVX1-NEXT:    retq
121 ;
122 ; AVX2-LABEL: E3i:
123 ; AVX2:       ## BB#0: ## %entry
124 ; AVX2-NEXT:    vpbroadcastd {{.*}}, %ymm2
125 ; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
126 ; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]
127 ; AVX2-NEXT:    retq
128 entry:
129   ; add forces execution domain
130   %a2 = add <8 x i32> %a, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
131   %shuffle = shufflevector <8 x i32> %a2, <8 x i32> %b, <8 x i32> <i32 undef, i32 5, i32 undef, i32 7, i32 12, i32 13, i32 14, i32 15>
132   ret <8 x i32> %shuffle
133 }
134
135 define <16 x i16> @E4i(<16 x i16> %a, <16 x i16> %b) nounwind uwtable readnone ssp {
136 ; AVX1-LABEL: E4i:
137 ; AVX1:       ## BB#0: ## %entry
138 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
139 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1]
140 ; AVX1-NEXT:    vpaddw %xmm3, %xmm2, %xmm2
141 ; AVX1-NEXT:    vpaddw %xmm3, %xmm0, %xmm0
142 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
143 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm1[0,1],ymm0[0,1]
144 ; AVX1-NEXT:    retq
145 ;
146 ; AVX2-LABEL: E4i:
147 ; AVX2:       ## BB#0: ## %entry
148 ; AVX2-NEXT:    vpaddw {{.*}}, %ymm0, %ymm0
149 ; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm1[0,1],ymm0[0,1]
150 ; AVX2-NEXT:    retq
151 entry:
152   ; add forces execution domain
153   %a2 = add <16 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
154   %shuffle = shufflevector <16 x i16> %a2, <16 x i16> %b, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
155   ret <16 x i16> %shuffle
156 }
157
158 define <16 x i16> @E5i(<16 x i16>* %a, <16 x i16>* %b) nounwind uwtable readnone ssp {
159 ; AVX1-LABEL: E5i:
160 ; AVX1:       ## BB#0: ## %entry
161 ; AVX1-NEXT:    vmovaps (%rdi), %ymm0
162 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
163 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,1,1,1,1,1,1,1]
164 ; AVX1-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
165 ; AVX1-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
166 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
167 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = mem[0,1],ymm0[0,1]
168 ; AVX1-NEXT:    retq
169 ;
170 ; AVX2-LABEL: E5i:
171 ; AVX2:       ## BB#0: ## %entry
172 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
173 ; AVX2-NEXT:    vpaddw {{.*}}, %ymm0, %ymm0
174 ; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = mem[0,1],ymm0[0,1]
175 ; AVX2-NEXT:    retq
176 entry:
177   %c = load <16 x i16>* %a
178   %d = load <16 x i16>* %b
179   %c2 = add <16 x i16> %c, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
180   %shuffle = shufflevector <16 x i16> %c2, <16 x i16> %d, <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
181   ret <16 x i16> %shuffle
182 }
183
184 ;;;; Cases with undef indicies mixed in the mask
185
186 define <8 x float> @F(<8 x float> %a, <8 x float> %b) nounwind uwtable readnone ssp {
187 ; ALL-LABEL: F:
188 ; ALL:       ## BB#0: ## %entry
189 ; ALL-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[0,1]
190 ; ALL-NEXT:    retq
191 entry:
192   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 undef, i32 undef, i32 6, i32 7, i32 undef, i32 9, i32 undef, i32 11>
193   ret <8 x float> %shuffle
194 }
195
196 ;;;; Cases we must not select vperm2f128
197
198 define <8 x float> @G(<8 x float> %a, <8 x float> %b) nounwind uwtable readnone ssp {
199 ; AVX1-LABEL: G:
200 ; AVX1:       ## BB#0: ## %entry
201 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
202 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
203 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,3]
204 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
205 ; AVX1-NEXT:    retq
206 ;
207 ; AVX2-LABEL: G:
208 ; AVX2:       ## BB#0: ## %entry
209 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
210 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm1
211 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,3]
212 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
213 ; AVX2-NEXT:    retq
214 entry:
215   %shuffle = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 undef, i32 undef, i32 6, i32 7, i32 undef, i32 12, i32 undef, i32 15>
216   ret <8 x float> %shuffle
217 }