1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=AVX1
3 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4 target triple = "x86_64-unknown-unknown"
6 define <4 x i64> @shuffle_v4i64_0001(<4 x i64> %a, <4 x i64> %b) {
7 ; AVX1-LABEL: @shuffle_v4i64_0001
9 ; AVX1-NEXT: vpunpcklqdq {{.*}} # xmm1 = xmm0[0,0]
10 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
12 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
13 ret <4 x i64> %shuffle
16 define <4 x i64> @shuffle_v4i64_0020(<4 x i64> %a, <4 x i64> %b) {
17 ; AVX1-LABEL: @shuffle_v4i64_0020
19 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
20 ; AVX1-NEXT: vshufpd {{.*}} # xmm1 = xmm1[0],xmm0[0]
21 ; AVX1-NEXT: vpunpcklqdq {{.*}} # xmm0 = xmm0[0,0]
22 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
24 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
25 ret <4 x i64> %shuffle
28 define <4 x i64> @shuffle_v4i64_0112(<4 x i64> %a, <4 x i64> %b) {
29 ; AVX1-LABEL: @shuffle_v4i64_0112
31 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
32 ; AVX1-NEXT: vshufpd {{.*}} # xmm1 = xmm0[1],xmm1[0]
33 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
35 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 1, i32 2>
36 ret <4 x i64> %shuffle
39 define <4 x i64> @shuffle_v4i64_0300(<4 x i64> %a, <4 x i64> %b) {
40 ; AVX1-LABEL: @shuffle_v4i64_0300
42 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
43 ; AVX1-NEXT: vshufpd {{.*}} # xmm1 = xmm0[0],xmm1[1]
44 ; AVX1-NEXT: vpunpcklqdq {{.*}} # xmm0 = xmm0[0,0]
45 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
47 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
48 ret <4 x i64> %shuffle
51 define <4 x i64> @shuffle_v4i64_1000(<4 x i64> %a, <4 x i64> %b) {
52 ; AVX1-LABEL: @shuffle_v4i64_1000
54 ; AVX1-NEXT: vpshufd {{.*}} # xmm1 = xmm0[2,3,0,1]
55 ; AVX1-NEXT: vpunpcklqdq {{.*}} # xmm0 = xmm0[0,0]
56 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
58 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
59 ret <4 x i64> %shuffle
62 define <4 x i64> @shuffle_v4i64_2200(<4 x i64> %a, <4 x i64> %b) {
63 ; AVX1-LABEL: @shuffle_v4i64_2200
65 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
66 ; AVX1-NEXT: vpunpcklqdq {{.*}} # xmm1 = xmm1[0,0]
67 ; AVX1-NEXT: vpunpcklqdq {{.*}} # xmm0 = xmm0[0,0]
68 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
70 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
71 ret <4 x i64> %shuffle
74 define <4 x i64> @shuffle_v4i64_3330(<4 x i64> %a, <4 x i64> %b) {
75 ; AVX1-LABEL: @shuffle_v4i64_3330
77 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
78 ; AVX1-NEXT: vshufpd {{.*}} # xmm0 = xmm1[1],xmm0[0]
79 ; AVX1-NEXT: vpunpckhqdq {{.*}} # xmm1 = xmm1[1,1]
80 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
82 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
83 ret <4 x i64> %shuffle
86 define <4 x i64> @shuffle_v4i64_3210(<4 x i64> %a, <4 x i64> %b) {
87 ; AVX1-LABEL: @shuffle_v4i64_3210
89 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
90 ; AVX1-NEXT: vpshufd {{.*}} # xmm1 = xmm1[2,3,0,1]
91 ; AVX1-NEXT: vpshufd {{.*}} # xmm0 = xmm0[2,3,0,1]
92 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
94 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
95 ret <4 x i64> %shuffle
98 define <4 x double> @shuffle_v4f64_0001(<4 x double> %a, <4 x double> %b) {
99 ; AVX1-LABEL: @shuffle_v4f64_0001
101 ; AVX1-NEXT: vmovlhps {{.*}} # xmm1 = xmm0[0,0]
102 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
104 %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
105 ret <4 x double> %shuffle
107 define <4 x double> @shuffle_v4f64_0020(<4 x double> %a, <4 x double> %b) {
108 ; AVX1-LABEL: @shuffle_v4f64_0020
110 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
111 ; AVX1-NEXT: vshufpd {{.*}} # xmm1 = xmm1[0],xmm0[0]
112 ; AVX1-NEXT: vmovlhps {{.*}} # xmm0 = xmm0[0,0]
113 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
115 %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
116 ret <4 x double> %shuffle
118 define <4 x double> @shuffle_v4f64_0300(<4 x double> %a, <4 x double> %b) {
119 ; AVX1-LABEL: @shuffle_v4f64_0300
121 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
122 ; AVX1-NEXT: vshufpd {{.*}} # xmm1 = xmm0[0],xmm1[1]
123 ; AVX1-NEXT: vmovlhps {{.*}} # xmm0 = xmm0[0,0]
124 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
126 %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
127 ret <4 x double> %shuffle
129 define <4 x double> @shuffle_v4f64_1000(<4 x double> %a, <4 x double> %b) {
130 ; AVX1-LABEL: @shuffle_v4f64_1000
132 ; AVX1-NEXT: vshufpd {{.*}} # xmm1 = xmm0[1,0]
133 ; AVX1-NEXT: vmovlhps {{.*}} # xmm0 = xmm0[0,0]
134 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
136 %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
137 ret <4 x double> %shuffle
139 define <4 x double> @shuffle_v4f64_2200(<4 x double> %a, <4 x double> %b) {
140 ; AVX1-LABEL: @shuffle_v4f64_2200
142 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
143 ; AVX1-NEXT: vmovlhps {{.*}} # xmm1 = xmm1[0,0]
144 ; AVX1-NEXT: vmovlhps {{.*}} # xmm0 = xmm0[0,0]
145 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
147 %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
148 ret <4 x double> %shuffle
150 define <4 x double> @shuffle_v4f64_3330(<4 x double> %a, <4 x double> %b) {
151 ; AVX1-LABEL: @shuffle_v4f64_3330
153 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
154 ; AVX1-NEXT: vshufpd {{.*}} # xmm0 = xmm1[1],xmm0[0]
155 ; AVX1-NEXT: vmovhlps {{.*}} # xmm1 = xmm1[1,1]
156 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
158 %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
159 ret <4 x double> %shuffle
161 define <4 x double> @shuffle_v4f64_3210(<4 x double> %a, <4 x double> %b) {
162 ; AVX1-LABEL: @shuffle_v4f64_3210
164 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
165 ; AVX1-NEXT: vshufpd {{.*}} # xmm1 = xmm1[1,0]
166 ; AVX1-NEXT: vshufpd {{.*}} # xmm0 = xmm0[1,0]
167 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
169 %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
170 ret <4 x double> %shuffle
173 define <4 x i64> @shuffle_v4i64_0124(<4 x i64> %a, <4 x i64> %b) {
174 ; AVX1-LABEL: @shuffle_v4i64_0124
176 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
177 ; AVX1-NEXT: vpunpcklqdq {{.*}} # xmm1 = xmm1[0,0]
178 ; AVX1-NEXT: vshufpd {{.*}} # xmm1 = xmm2[0],xmm1[1]
179 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
181 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 4>
182 ret <4 x i64> %shuffle
184 define <4 x i64> @shuffle_v4i64_0142(<4 x i64> %a, <4 x i64> %b) {
185 ; AVX1-LABEL: @shuffle_v4i64_0142
187 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
188 ; AVX1-NEXT: vpunpcklqdq {{.*}} # xmm2 = xmm2[0,0]
189 ; AVX1-NEXT: vshufpd {{.*}} # xmm1 = xmm1[0],xmm2[1]
190 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
192 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 2>
193 ret <4 x i64> %shuffle
195 define <4 x i64> @shuffle_v4i64_0412(<4 x i64> %a, <4 x i64> %b) {
196 ; AVX1-LABEL: @shuffle_v4i64_0412
198 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
199 ; AVX1-NEXT: vshufpd {{.*}} # xmm2 = xmm0[1],xmm2[0]
200 ; AVX1-NEXT: vpunpcklqdq {{.*}} # xmm1 = xmm1[0,0]
201 ; AVX1-NEXT: vshufpd {{.*}} # xmm0 = xmm0[0],xmm1[1]
202 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
204 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 2>
205 ret <4 x i64> %shuffle
207 define <4 x i64> @shuffle_v4i64_4012(<4 x i64> %a, <4 x i64> %b) {
208 ; AVX1-LABEL: @shuffle_v4i64_4012
210 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
211 ; AVX1-NEXT: vshufpd {{.*}} # xmm2 = xmm0[1],xmm2[0]
212 ; AVX1-NEXT: vpunpcklqdq {{.*}} # xmm0 = xmm0[0,0]
213 ; AVX1-NEXT: vshufpd {{.*}} # xmm0 = xmm1[0],xmm0[1]
214 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
216 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
217 ret <4 x i64> %shuffle
219 define <4 x i64> @shuffle_v4i64_0145(<4 x i64> %a, <4 x i64> %b) {
220 ; AVX1-LABEL: @shuffle_v4i64_0145
222 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
224 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
225 ret <4 x i64> %shuffle
227 define <4 x i64> @shuffle_v4i64_0451(<4 x i64> %a, <4 x i64> %b) {
228 ; AVX1-LABEL: @shuffle_v4i64_0451
230 ; AVX1-NEXT: vpshufd {{.*}} # xmm2 = xmm1[2,3,0,1]
231 ; AVX1-NEXT: vshufpd {{.*}} # xmm2 = xmm2[0],xmm0[1]
232 ; AVX1-NEXT: vpunpcklqdq {{.*}} # xmm1 = xmm1[0,0]
233 ; AVX1-NEXT: vshufpd {{.*}} # xmm0 = xmm0[0],xmm1[1]
234 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
236 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 5, i32 1>
237 ret <4 x i64> %shuffle
239 define <4 x i64> @shuffle_v4i64_4501(<4 x i64> %a, <4 x i64> %b) {
240 ; AVX1-LABEL: @shuffle_v4i64_4501
242 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
244 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
245 ret <4 x i64> %shuffle
247 define <4 x i64> @shuffle_v4i64_4015(<4 x i64> %a, <4 x i64> %b) {
248 ; AVX1-LABEL: @shuffle_v4i64_4015
250 ; AVX1-NEXT: vpshufd {{.*}} # xmm2 = xmm0[2,3,0,1]
251 ; AVX1-NEXT: vshufpd {{.*}} # xmm2 = xmm2[0],xmm1[1]
252 ; AVX1-NEXT: vpunpcklqdq {{.*}} # xmm0 = xmm0[0,0]
253 ; AVX1-NEXT: vshufpd {{.*}} # xmm0 = xmm1[0],xmm0[1]
254 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
256 %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 5>
257 ret <4 x i64> %shuffle