blob: c4c97f6b73e053c40d44035109051ce15a2d9ec2 [file] [log] [blame]
Chandler Carruth78a761c2014-09-20 18:36:39 +00001; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse3 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE3
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
Chandler Carruth83860cf2014-06-27 11:23:44 +00006
7target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
8target triple = "x86_64-unknown-unknown"
9
10define <4 x i32> @shuffle_v4i32_0001(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000011; SSE-LABEL: shuffle_v4i32_0001:
12; SSE: # BB#0:
13; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,1]
14; SSE-NEXT: retq
15;
16; AVX-LABEL: shuffle_v4i32_0001:
17; AVX: # BB#0:
18; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,1]
19; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +000020 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
21 ret <4 x i32> %shuffle
22}
23define <4 x i32> @shuffle_v4i32_0020(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000024; SSE-LABEL: shuffle_v4i32_0020:
25; SSE: # BB#0:
26; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,2,0]
27; SSE-NEXT: retq
28;
29; AVX-LABEL: shuffle_v4i32_0020:
30; AVX: # BB#0:
31; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,2,0]
32; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +000033 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
34 ret <4 x i32> %shuffle
35}
Chandler Carruth27046752014-08-07 08:11:31 +000036define <4 x i32> @shuffle_v4i32_0112(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000037; SSE-LABEL: shuffle_v4i32_0112:
38; SSE: # BB#0:
39; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,2]
40; SSE-NEXT: retq
41;
42; AVX-LABEL: shuffle_v4i32_0112:
43; AVX: # BB#0:
44; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,2]
45; AVX-NEXT: retq
Chandler Carruth27046752014-08-07 08:11:31 +000046 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 1, i32 2>
47 ret <4 x i32> %shuffle
48}
Chandler Carruth83860cf2014-06-27 11:23:44 +000049define <4 x i32> @shuffle_v4i32_0300(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000050; SSE-LABEL: shuffle_v4i32_0300:
51; SSE: # BB#0:
52; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,3,0,0]
53; SSE-NEXT: retq
54;
55; AVX-LABEL: shuffle_v4i32_0300:
56; AVX: # BB#0:
57; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,3,0,0]
58; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +000059 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
60 ret <4 x i32> %shuffle
61}
62define <4 x i32> @shuffle_v4i32_1000(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000063; SSE-LABEL: shuffle_v4i32_1000:
64; SSE: # BB#0:
65; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,0,0]
66; SSE-NEXT: retq
67;
68; AVX-LABEL: shuffle_v4i32_1000:
69; AVX: # BB#0:
70; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,0,0,0]
71; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +000072 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
73 ret <4 x i32> %shuffle
74}
75define <4 x i32> @shuffle_v4i32_2200(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000076; SSE-LABEL: shuffle_v4i32_2200:
77; SSE: # BB#0:
78; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,2,0,0]
79; SSE-NEXT: retq
80;
81; AVX-LABEL: shuffle_v4i32_2200:
82; AVX: # BB#0:
83; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,2,0,0]
84; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +000085 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
86 ret <4 x i32> %shuffle
87}
88define <4 x i32> @shuffle_v4i32_3330(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000089; SSE-LABEL: shuffle_v4i32_3330:
90; SSE: # BB#0:
91; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,0]
92; SSE-NEXT: retq
93;
94; AVX-LABEL: shuffle_v4i32_3330:
95; AVX: # BB#0:
96; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,0]
97; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +000098 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
99 ret <4 x i32> %shuffle
100}
101define <4 x i32> @shuffle_v4i32_3210(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000102; SSE-LABEL: shuffle_v4i32_3210:
103; SSE: # BB#0:
104; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
105; SSE-NEXT: retq
106;
107; AVX-LABEL: shuffle_v4i32_3210:
108; AVX: # BB#0:
109; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
110; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000111 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
112 ret <4 x i32> %shuffle
113}
114
Chandler Carruth17fd8482014-08-15 03:54:49 +0000115define <4 x i32> @shuffle_v4i32_2121(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000116; SSE-LABEL: shuffle_v4i32_2121:
117; SSE: # BB#0:
118; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,1,2,1]
119; SSE-NEXT: retq
120;
121; AVX-LABEL: shuffle_v4i32_2121:
122; AVX: # BB#0:
123; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,1,2,1]
124; AVX-NEXT: retq
Chandler Carruth17fd8482014-08-15 03:54:49 +0000125 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 1, i32 2, i32 1>
126 ret <4 x i32> %shuffle
127}
128
Chandler Carruth83860cf2014-06-27 11:23:44 +0000129define <4 x float> @shuffle_v4f32_0001(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000130; SSE-LABEL: shuffle_v4f32_0001:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000131; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000132; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0,0,1]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000133; SSE-NEXT: retq
134;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000135; AVX-LABEL: shuffle_v4f32_0001:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000136; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000137; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,0,0,1]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000138; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000139 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
140 ret <4 x float> %shuffle
141}
142define <4 x float> @shuffle_v4f32_0020(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000143; SSE-LABEL: shuffle_v4f32_0020:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000144; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000145; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0,2,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000146; SSE-NEXT: retq
147;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000148; AVX-LABEL: shuffle_v4f32_0020:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000149; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000150; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,0,2,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000151; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000152 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
153 ret <4 x float> %shuffle
154}
155define <4 x float> @shuffle_v4f32_0300(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000156; SSE-LABEL: shuffle_v4f32_0300:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000157; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000158; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3,0,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000159; SSE-NEXT: retq
160;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000161; AVX-LABEL: shuffle_v4f32_0300:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000162; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000163; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,3,0,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000164; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000165 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
166 ret <4 x float> %shuffle
167}
168define <4 x float> @shuffle_v4f32_1000(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000169; SSE-LABEL: shuffle_v4f32_1000:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000170; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000171; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0,0,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000172; SSE-NEXT: retq
173;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000174; AVX-LABEL: shuffle_v4f32_1000:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000175; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000176; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[1,0,0,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000177; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000178 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
179 ret <4 x float> %shuffle
180}
181define <4 x float> @shuffle_v4f32_2200(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000182; SSE-LABEL: shuffle_v4f32_2200:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000183; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000184; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,2,0,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000185; SSE-NEXT: retq
186;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000187; AVX-LABEL: shuffle_v4f32_2200:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000188; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000189; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[2,2,0,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000190; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000191 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
192 ret <4 x float> %shuffle
193}
194define <4 x float> @shuffle_v4f32_3330(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000195; SSE-LABEL: shuffle_v4f32_3330:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000196; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000197; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000198; SSE-NEXT: retq
199;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000200; AVX-LABEL: shuffle_v4f32_3330:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000201; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000202; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,3,3,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000203; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000204 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
205 ret <4 x float> %shuffle
206}
207define <4 x float> @shuffle_v4f32_3210(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000208; SSE-LABEL: shuffle_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000209; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000210; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000211; SSE-NEXT: retq
212;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000213; AVX-LABEL: shuffle_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000214; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000215; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000216; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000217 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
218 ret <4 x float> %shuffle
219}
Chandler Carruth12d4a702014-09-15 11:26:25 +0000220define <4 x float> @shuffle_v4f32_0011(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000221; SSE-LABEL: shuffle_v4f32_0011:
222; SSE: # BB#0:
223; SSE-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0,0,1,1]
224; SSE-NEXT: retq
225;
226; AVX-LABEL: shuffle_v4f32_0011:
227; AVX: # BB#0:
228; AVX-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0,0,1,1]
229; AVX-NEXT: retq
Chandler Carruth12d4a702014-09-15 11:26:25 +0000230 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 1, i32 1>
231 ret <4 x float> %shuffle
232}
233define <4 x float> @shuffle_v4f32_2233(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000234; SSE-LABEL: shuffle_v4f32_2233:
235; SSE: # BB#0:
236; SSE-NEXT: unpckhps {{.*#+}} xmm0 = xmm0[2,2,3,3]
237; SSE-NEXT: retq
238;
239; AVX-LABEL: shuffle_v4f32_2233:
240; AVX: # BB#0:
241; AVX-NEXT: vunpckhps {{.*#+}} xmm0 = xmm0[2,2,3,3]
242; AVX-NEXT: retq
Chandler Carruth12d4a702014-09-15 11:26:25 +0000243 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 2, i32 3, i32 3>
244 ret <4 x float> %shuffle
245}
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000246define <4 x float> @shuffle_v4f32_0022(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000247; SSE2-LABEL: shuffle_v4f32_0022:
248; SSE2: # BB#0:
249; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0,2,2]
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000250; SSE2-NEXT: retq
251;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000252; SSE3-LABEL: shuffle_v4f32_0022:
253; SSE3: # BB#0:
254; SSE3-NEXT: movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000255; SSE3-NEXT: retq
256;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000257; SSSE3-LABEL: shuffle_v4f32_0022:
258; SSSE3: # BB#0:
259; SSSE3-NEXT: movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000260; SSSE3-NEXT: retq
261;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000262; SSE41-LABEL: shuffle_v4f32_0022:
263; SSE41: # BB#0:
264; SSE41-NEXT: movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000265; SSE41-NEXT: retq
266;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000267; AVX-LABEL: shuffle_v4f32_0022:
268; AVX: # BB#0:
269; AVX-NEXT: vmovsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000270; AVX-NEXT: retq
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000271 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 2>
272 ret <4 x float> %shuffle
273}
274define <4 x float> @shuffle_v4f32_1133(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000275; SSE2-LABEL: shuffle_v4f32_1133:
276; SSE2: # BB#0:
277; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,3,3]
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000278; SSE2-NEXT: retq
279;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000280; SSE3-LABEL: shuffle_v4f32_1133:
281; SSE3: # BB#0:
282; SSE3-NEXT: movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000283; SSE3-NEXT: retq
284;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000285; SSSE3-LABEL: shuffle_v4f32_1133:
286; SSSE3: # BB#0:
287; SSSE3-NEXT: movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000288; SSSE3-NEXT: retq
289;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000290; SSE41-LABEL: shuffle_v4f32_1133:
291; SSE41: # BB#0:
292; SSE41-NEXT: movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000293; SSE41-NEXT: retq
294;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000295; AVX-LABEL: shuffle_v4f32_1133:
296; AVX: # BB#0:
297; AVX-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000298; AVX-NEXT: retq
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000299 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 1, i32 3, i32 3>
300 ret <4 x float> %shuffle
301}
Chandler Carruth83860cf2014-06-27 11:23:44 +0000302
303define <4 x i32> @shuffle_v4i32_0124(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000304; SSE2-LABEL: shuffle_v4i32_0124:
305; SSE2: # BB#0:
306; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
307; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
Chandler Carruthdad54002014-09-03 22:48:34 +0000308; SSE2-NEXT: retq
309;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000310; SSE3-LABEL: shuffle_v4i32_0124:
311; SSE3: # BB#0:
312; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
313; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000314; SSE3-NEXT: retq
315;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000316; SSSE3-LABEL: shuffle_v4i32_0124:
317; SSSE3: # BB#0:
318; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
319; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000320; SSSE3-NEXT: retq
321;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000322; SSE41-LABEL: shuffle_v4i32_0124:
323; SSE41: # BB#0:
324; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
Chandler Carruthdad54002014-09-03 22:48:34 +0000325; SSE41-NEXT: retq
326;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000327; AVX-LABEL: shuffle_v4i32_0124:
328; AVX: # BB#0:
329; AVX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000330; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000331 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 4>
332 ret <4 x i32> %shuffle
333}
334define <4 x i32> @shuffle_v4i32_0142(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000335; SSE-LABEL: shuffle_v4i32_0142:
336; SSE: # BB#0:
337; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
338; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
339; SSE-NEXT: retq
340;
341; AVX-LABEL: shuffle_v4i32_0142:
342; AVX: # BB#0:
343; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
344; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
345; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000346 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 2>
347 ret <4 x i32> %shuffle
348}
349define <4 x i32> @shuffle_v4i32_0412(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000350; SSE-LABEL: shuffle_v4i32_0412:
351; SSE: # BB#0:
352; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
353; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[1,2]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000354; SSE-NEXT: movaps %xmm1, %xmm0
355; SSE-NEXT: retq
Chandler Carruthbfc6b952014-09-03 19:39:10 +0000356;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000357; AVX-LABEL: shuffle_v4i32_0412:
358; AVX: # BB#0:
359; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
360; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm1[2,0],xmm0[1,2]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000361; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000362 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 2>
363 ret <4 x i32> %shuffle
364}
365define <4 x i32> @shuffle_v4i32_4012(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000366; SSE-LABEL: shuffle_v4i32_4012:
367; SSE: # BB#0:
368; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
369; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000370; SSE-NEXT: movaps %xmm1, %xmm0
371; SSE-NEXT: retq
Chandler Carruthbfc6b952014-09-03 19:39:10 +0000372;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000373; AVX-LABEL: shuffle_v4i32_4012:
374; AVX: # BB#0:
375; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
376; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm1[0,2],xmm0[1,2]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000377; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000378 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
379 ret <4 x i32> %shuffle
380}
381define <4 x i32> @shuffle_v4i32_0145(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000382; SSE-LABEL: shuffle_v4i32_0145:
383; SSE: # BB#0:
384; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
385; SSE-NEXT: retq
386;
387; AVX-LABEL: shuffle_v4i32_0145:
388; AVX: # BB#0:
389; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
390; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000391 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
392 ret <4 x i32> %shuffle
393}
394define <4 x i32> @shuffle_v4i32_0451(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000395; SSE-LABEL: shuffle_v4i32_0451:
396; SSE: # BB#0:
397; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
398; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
399; SSE-NEXT: retq
400;
401; AVX-LABEL: shuffle_v4i32_0451:
402; AVX: # BB#0:
403; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
404; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
405; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000406 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 5, i32 1>
407 ret <4 x i32> %shuffle
408}
409define <4 x i32> @shuffle_v4i32_4501(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000410; SSE-LABEL: shuffle_v4i32_4501:
411; SSE: # BB#0:
412; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000413; SSE-NEXT: movdqa %xmm1, %xmm0
414; SSE-NEXT: retq
Chandler Carruthbfc6b952014-09-03 19:39:10 +0000415;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000416; AVX-LABEL: shuffle_v4i32_4501:
417; AVX: # BB#0:
418; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000419; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000420 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
421 ret <4 x i32> %shuffle
422}
423define <4 x i32> @shuffle_v4i32_4015(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000424; SSE-LABEL: shuffle_v4i32_4015:
425; SSE: # BB#0:
426; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
427; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0,1,3]
428; SSE-NEXT: retq
429;
430; AVX-LABEL: shuffle_v4i32_4015:
431; AVX: # BB#0:
432; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
433; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[2,0,1,3]
434; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000435 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 5>
436 ret <4 x i32> %shuffle
437}
Chandler Carruthfc0db222014-09-04 01:13:48 +0000438
439define <4 x float> @shuffle_v4f32_4zzz(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000440; SSE2-LABEL: shuffle_v4f32_4zzz:
441; SSE2: # BB#0:
442; SSE2-NEXT: xorps %xmm1, %xmm1
443; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,0]
444; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000445; SSE2-NEXT: retq
446;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000447; SSE3-LABEL: shuffle_v4f32_4zzz:
448; SSE3: # BB#0:
449; SSE3-NEXT: xorps %xmm1, %xmm1
450; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,0]
451; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000452; SSE3-NEXT: retq
453;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000454; SSSE3-LABEL: shuffle_v4f32_4zzz:
455; SSSE3: # BB#0:
456; SSSE3-NEXT: xorps %xmm1, %xmm1
457; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,0]
458; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000459; SSSE3-NEXT: retq
460;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000461; SSE41-LABEL: shuffle_v4f32_4zzz:
462; SSE41: # BB#0:
463; SSE41-NEXT: xorps %xmm1, %xmm1
464; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
465; SSE41-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000466; SSE41-NEXT: retq
467;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000468; AVX-LABEL: shuffle_v4f32_4zzz:
469; AVX: # BB#0:
470; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
471; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000472; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000473 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
474 ret <4 x float> %shuffle
475}
476
477define <4 x float> @shuffle_v4f32_z4zz(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000478; SSE2-LABEL: shuffle_v4f32_z4zz:
479; SSE2: # BB#0:
480; SSE2-NEXT: xorps %xmm1, %xmm1
481; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
482; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000483; SSE2-NEXT: retq
484;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000485; SSE3-LABEL: shuffle_v4f32_z4zz:
486; SSE3: # BB#0:
487; SSE3-NEXT: xorps %xmm1, %xmm1
488; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
489; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000490; SSE3-NEXT: retq
491;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000492; SSSE3-LABEL: shuffle_v4f32_z4zz:
493; SSSE3: # BB#0:
494; SSSE3-NEXT: xorps %xmm1, %xmm1
495; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
496; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000497; SSSE3-NEXT: retq
498;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000499; SSE41-LABEL: shuffle_v4f32_z4zz:
500; SSE41: # BB#0:
501; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,xmm0[0],zero,zero
Chandler Carruthfc0db222014-09-04 01:13:48 +0000502; SSE41-NEXT: retq
503;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000504; AVX-LABEL: shuffle_v4f32_z4zz:
505; AVX: # BB#0:
506; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,xmm0[0],zero,zero
Chandler Carruth78a761c2014-09-20 18:36:39 +0000507; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000508 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 2, i32 4, i32 3, i32 0>
509 ret <4 x float> %shuffle
510}
511
512define <4 x float> @shuffle_v4f32_zz4z(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000513; SSE2-LABEL: shuffle_v4f32_zz4z:
514; SSE2: # BB#0:
515; SSE2-NEXT: xorps %xmm1, %xmm1
516; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
517; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
518; SSE2-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000519; SSE2-NEXT: retq
520;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000521; SSE3-LABEL: shuffle_v4f32_zz4z:
522; SSE3: # BB#0:
523; SSE3-NEXT: xorps %xmm1, %xmm1
524; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
525; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
526; SSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000527; SSE3-NEXT: retq
528;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000529; SSSE3-LABEL: shuffle_v4f32_zz4z:
530; SSSE3: # BB#0:
531; SSSE3-NEXT: xorps %xmm1, %xmm1
532; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
533; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
534; SSSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000535; SSSE3-NEXT: retq
536;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000537; SSE41-LABEL: shuffle_v4f32_zz4z:
538; SSE41: # BB#0:
539; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,zero,xmm0[0],zero
Chandler Carruthfc0db222014-09-04 01:13:48 +0000540; SSE41-NEXT: retq
541;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000542; AVX-LABEL: shuffle_v4f32_zz4z:
543; AVX: # BB#0:
544; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,zero,xmm0[0],zero
Chandler Carruth78a761c2014-09-20 18:36:39 +0000545; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000546 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 0, i32 4, i32 0>
547 ret <4 x float> %shuffle
548}
549
550define <4 x float> @shuffle_v4f32_zuu4(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000551; SSE2-LABEL: shuffle_v4f32_zuu4:
552; SSE2: # BB#0:
553; SSE2-NEXT: xorps %xmm1, %xmm1
554; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
555; SSE2-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000556; SSE2-NEXT: retq
557;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000558; SSE3-LABEL: shuffle_v4f32_zuu4:
559; SSE3: # BB#0:
560; SSE3-NEXT: xorps %xmm1, %xmm1
561; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
562; SSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000563; SSE3-NEXT: retq
564;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000565; SSSE3-LABEL: shuffle_v4f32_zuu4:
566; SSSE3: # BB#0:
567; SSSE3-NEXT: xorps %xmm1, %xmm1
568; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
569; SSSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000570; SSSE3-NEXT: retq
571;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000572; SSE41-LABEL: shuffle_v4f32_zuu4:
573; SSE41: # BB#0:
574; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,zero,zero,xmm0[0]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000575; SSE41-NEXT: retq
576;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000577; AVX-LABEL: shuffle_v4f32_zuu4:
578; AVX: # BB#0:
579; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,zero,zero,xmm0[0]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000580; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000581 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 4>
582 ret <4 x float> %shuffle
583}
584
585define <4 x float> @shuffle_v4f32_zzz7(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000586; SSE2-LABEL: shuffle_v4f32_zzz7:
587; SSE2: # BB#0:
588; SSE2-NEXT: xorps %xmm1, %xmm1
589; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
590; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
591; SSE2-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000592; SSE2-NEXT: retq
593;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000594; SSE3-LABEL: shuffle_v4f32_zzz7:
595; SSE3: # BB#0:
596; SSE3-NEXT: xorps %xmm1, %xmm1
597; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
598; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
599; SSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000600; SSE3-NEXT: retq
601;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000602; SSSE3-LABEL: shuffle_v4f32_zzz7:
603; SSSE3: # BB#0:
604; SSSE3-NEXT: xorps %xmm1, %xmm1
605; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
606; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
607; SSSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000608; SSSE3-NEXT: retq
609;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000610; SSE41-LABEL: shuffle_v4f32_zzz7:
611; SSE41: # BB#0:
612; SSE41-NEXT: xorps %xmm1, %xmm1
613; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm1[0,1,2],xmm0[3]
614; SSE41-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000615; SSE41-NEXT: retq
616;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000617; AVX-LABEL: shuffle_v4f32_zzz7:
618; AVX: # BB#0:
619; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
620; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000621; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000622 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
623 ret <4 x float> %shuffle
624}
625
626define <4 x float> @shuffle_v4f32_z6zz(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000627; SSE2-LABEL: shuffle_v4f32_z6zz:
628; SSE2: # BB#0:
629; SSE2-NEXT: xorps %xmm1, %xmm1
630; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
631; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000632; SSE2-NEXT: retq
633;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000634; SSE3-LABEL: shuffle_v4f32_z6zz:
635; SSE3: # BB#0:
636; SSE3-NEXT: xorps %xmm1, %xmm1
637; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
638; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000639; SSE3-NEXT: retq
640;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000641; SSSE3-LABEL: shuffle_v4f32_z6zz:
642; SSSE3: # BB#0:
643; SSSE3-NEXT: xorps %xmm1, %xmm1
644; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
645; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000646; SSSE3-NEXT: retq
647;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000648; SSE41-LABEL: shuffle_v4f32_z6zz:
649; SSE41: # BB#0:
650; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
Chandler Carruthfc0db222014-09-04 01:13:48 +0000651; SSE41-NEXT: retq
652;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000653; AVX-LABEL: shuffle_v4f32_z6zz:
654; AVX: # BB#0:
655; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
Chandler Carruth78a761c2014-09-20 18:36:39 +0000656; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000657 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
658 ret <4 x float> %shuffle
659}
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000660
661define <4 x i32> @shuffle_v4i32_4zzz(i32 %i) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000662; SSE-LABEL: shuffle_v4i32_4zzz:
663; SSE: # BB#0:
664; SSE-NEXT: movd %edi, %xmm0
665; SSE-NEXT: retq
666;
667; AVX-LABEL: shuffle_v4i32_4zzz:
668; AVX: # BB#0:
669; AVX-NEXT: vmovd %edi, %xmm0
670; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000671 %a = insertelement <4 x i32> undef, i32 %i, i32 0
672 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
673 ret <4 x i32> %shuffle
674}
675
676define <4 x i32> @shuffle_v4i32_z4zz(i32 %i) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000677; SSE-LABEL: shuffle_v4i32_z4zz:
678; SSE: # BB#0:
679; SSE-NEXT: movd %edi, %xmm0
680; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
681; SSE-NEXT: retq
682;
683; AVX-LABEL: shuffle_v4i32_z4zz:
684; AVX: # BB#0:
685; AVX-NEXT: vmovd %edi, %xmm0
686; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
687; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000688 %a = insertelement <4 x i32> undef, i32 %i, i32 0
689 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 2, i32 4, i32 3, i32 0>
690 ret <4 x i32> %shuffle
691}
692
693define <4 x i32> @shuffle_v4i32_zz4z(i32 %i) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000694; SSE-LABEL: shuffle_v4i32_zz4z:
695; SSE: # BB#0:
696; SSE-NEXT: movd %edi, %xmm0
697; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,0,1]
698; SSE-NEXT: retq
699;
700; AVX-LABEL: shuffle_v4i32_zz4z:
701; AVX: # BB#0:
702; AVX-NEXT: vmovd %edi, %xmm0
703; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,0,1]
704; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000705 %a = insertelement <4 x i32> undef, i32 %i, i32 0
706 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 0, i32 4, i32 0>
707 ret <4 x i32> %shuffle
708}
709
710define <4 x i32> @shuffle_v4i32_zuu4(i32 %i) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000711; SSE-LABEL: shuffle_v4i32_zuu4:
712; SSE: # BB#0:
713; SSE-NEXT: movd %edi, %xmm0
714; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,0]
715; SSE-NEXT: retq
716;
717; AVX-LABEL: shuffle_v4i32_zuu4:
718; AVX: # BB#0:
719; AVX-NEXT: vmovd %edi, %xmm0
720; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,0]
721; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000722 %a = insertelement <4 x i32> undef, i32 %i, i32 0
723 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 4>
724 ret <4 x i32> %shuffle
725}
726
727define <4 x i32> @shuffle_v4i32_z6zz(i32 %i) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000728; SSE-LABEL: shuffle_v4i32_z6zz:
729; SSE: # BB#0:
730; SSE-NEXT: movd %edi, %xmm0
731; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
732; SSE-NEXT: retq
733;
734; AVX-LABEL: shuffle_v4i32_z6zz:
735; AVX: # BB#0:
736; AVX-NEXT: vmovd %edi, %xmm0
737; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
738; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000739 %a = insertelement <4 x i32> undef, i32 %i, i32 2
740 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
741 ret <4 x i32> %shuffle
742}
Chandler Carruth9057fca2014-09-18 09:00:25 +0000743
744define <4 x i32> @shuffle_v4i32_7012(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000745; SSE2-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000746; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000747; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
748; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000749; SSE2-NEXT: movaps %xmm1, %xmm0
750; SSE2-NEXT: retq
751;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000752; SSE3-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000753; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000754; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
755; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000756; SSE3-NEXT: movaps %xmm1, %xmm0
757; SSE3-NEXT: retq
758;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000759; SSSE3-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000760; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000761; SSSE3-NEXT: palignr {{.*#+}} xmm0 = xmm1[12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000762; SSSE3-NEXT: retq
763;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000764; SSE41-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000765; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000766; SSE41-NEXT: palignr {{.*#+}} xmm0 = xmm1[12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000767; SSE41-NEXT: retq
768;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000769; AVX-LABEL: shuffle_v4i32_7012:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000770; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000771; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm1[12,13,14,15],xmm0[0,1,2,3,4,5,6,7,8,9,10,11]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000772; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000773 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
774 ret <4 x i32> %shuffle
775}
776
777define <4 x i32> @shuffle_v4i32_6701(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000778; SSE2-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000779; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000780; SSE2-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000781; SSE2-NEXT: movapd %xmm1, %xmm0
782; SSE2-NEXT: retq
783;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000784; SSE3-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000785; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000786; SSE3-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000787; SSE3-NEXT: movapd %xmm1, %xmm0
788; SSE3-NEXT: retq
789;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000790; SSSE3-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000791; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000792; SSSE3-NEXT: palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000793; SSSE3-NEXT: retq
794;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000795; SSE41-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000796; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000797; SSE41-NEXT: palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000798; SSE41-NEXT: retq
799;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000800; AVX-LABEL: shuffle_v4i32_6701:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000801; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000802; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000803; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000804 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
805 ret <4 x i32> %shuffle
806}
807
808define <4 x i32> @shuffle_v4i32_5670(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000809; SSE2-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000810; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000811; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
812; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000813; SSE2-NEXT: movaps %xmm1, %xmm0
814; SSE2-NEXT: retq
815;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000816; SSE3-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000817; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000818; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
819; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000820; SSE3-NEXT: movaps %xmm1, %xmm0
821; SSE3-NEXT: retq
822;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000823; SSSE3-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000824; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000825; SSSE3-NEXT: palignr {{.*#+}} xmm0 = xmm1[4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000826; SSSE3-NEXT: retq
827;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000828; SSE41-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000829; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000830; SSE41-NEXT: palignr {{.*#+}} xmm0 = xmm1[4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000831; SSE41-NEXT: retq
832;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000833; AVX-LABEL: shuffle_v4i32_5670:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000834; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000835; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm1[4,5,6,7,8,9,10,11,12,13,14,15],xmm0[0,1,2,3]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000836; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000837 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
838 ret <4 x i32> %shuffle
839}
840
841define <4 x i32> @shuffle_v4i32_1234(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000842; SSE2-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000843; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000844; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
845; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000846; SSE2-NEXT: retq
847;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000848; SSE3-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000849; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000850; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
851; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000852; SSE3-NEXT: retq
853;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000854; SSSE3-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000855; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000856; SSSE3-NEXT: palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000857; SSSE3-NEXT: movdqa %xmm1, %xmm0
858; SSSE3-NEXT: retq
859;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000860; SSE41-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000861; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000862; SSE41-NEXT: palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000863; SSE41-NEXT: movdqa %xmm1, %xmm0
864; SSE41-NEXT: retq
865;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000866; AVX-LABEL: shuffle_v4i32_1234:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000867; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000868; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000869; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000870 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
871 ret <4 x i32> %shuffle
872}
873
874define <4 x i32> @shuffle_v4i32_2345(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000875; SSE2-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000876; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000877; SSE2-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000878; SSE2-NEXT: retq
879;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000880; SSE3-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000881; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000882; SSE3-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000883; SSE3-NEXT: retq
884;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000885; SSSE3-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000886; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000887; SSSE3-NEXT: palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000888; SSSE3-NEXT: movdqa %xmm1, %xmm0
889; SSSE3-NEXT: retq
890;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000891; SSE41-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000892; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000893; SSE41-NEXT: palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000894; SSE41-NEXT: movdqa %xmm1, %xmm0
895; SSE41-NEXT: retq
896;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000897; AVX-LABEL: shuffle_v4i32_2345:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000898; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000899; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000900; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000901 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
902 ret <4 x i32> %shuffle
903}
904
905define <4 x i32> @shuffle_v4i32_3456(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000906; SSE2-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000907; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000908; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
909; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000910; SSE2-NEXT: retq
911;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000912; SSE3-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000913; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000914; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
915; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000916; SSE3-NEXT: retq
917;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000918; SSSE3-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000919; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000920; SSSE3-NEXT: palignr {{.*#+}} xmm1 = xmm0[12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000921; SSSE3-NEXT: movdqa %xmm1, %xmm0
922; SSSE3-NEXT: retq
923;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000924; SSE41-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000925; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000926; SSE41-NEXT: palignr {{.*#+}} xmm1 = xmm0[12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000927; SSE41-NEXT: movdqa %xmm1, %xmm0
928; SSE41-NEXT: retq
929;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000930; AVX-LABEL: shuffle_v4i32_3456:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000931; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000932; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm0[12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9,10,11]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000933; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000934 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
935 ret <4 x i32> %shuffle
936}
Chandler Carruth2e275142014-09-19 08:37:44 +0000937
938define <4 x i32> @shuffle_v4i32_0u1u(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000939; SSE-LABEL: shuffle_v4i32_0u1u:
940; SSE: # BB#0:
941; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
942; SSE-NEXT: retq
943;
944; AVX-LABEL: shuffle_v4i32_0u1u:
945; AVX: # BB#0:
946; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
947; AVX-NEXT: retq
Chandler Carruth2e275142014-09-19 08:37:44 +0000948 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 undef, i32 1, i32 undef>
949 ret <4 x i32> %shuffle
950}
951
952define <4 x i32> @shuffle_v4i32_0z1z(<4 x i32> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000953; SSE2-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +0000954; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000955; SSE2-NEXT: pxor %xmm1, %xmm1
956; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Chandler Carruth2e275142014-09-19 08:37:44 +0000957; SSE2-NEXT: retq
958;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000959; SSE3-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +0000960; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000961; SSE3-NEXT: pxor %xmm1, %xmm1
962; SSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Chandler Carruth2e275142014-09-19 08:37:44 +0000963; SSE3-NEXT: retq
964;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000965; SSSE3-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +0000966; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000967; SSSE3-NEXT: pxor %xmm1, %xmm1
968; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Chandler Carruth2e275142014-09-19 08:37:44 +0000969; SSSE3-NEXT: retq
970;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000971; SSE41-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +0000972; SSE41: # BB#0:
973; SSE41-NEXT: pmovzxdq %xmm0, %xmm0
974; SSE41-NEXT: retq
975;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000976; AVX-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000977; AVX: # BB#0:
978; AVX-NEXT: vpmovzxdq %xmm0, %xmm0
979; AVX-NEXT: retq
Chandler Carruth2e275142014-09-19 08:37:44 +0000980 %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
981 ret <4 x i32> %shuffle
982}
Chandler Carruth8c4cccd2014-09-20 04:15:22 +0000983
984define <4 x i32> @insert_reg_and_zero_v4i32(i32 %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000985; SSE-LABEL: insert_reg_and_zero_v4i32:
986; SSE: # BB#0:
987; SSE-NEXT: movd %edi, %xmm0
988; SSE-NEXT: retq
989;
990; AVX-LABEL: insert_reg_and_zero_v4i32:
991; AVX: # BB#0:
992; AVX-NEXT: vmovd %edi, %xmm0
993; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +0000994 %v = insertelement <4 x i32> undef, i32 %a, i32 0
995 %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
996 ret <4 x i32> %shuffle
997}
998
999define <4 x i32> @insert_mem_and_zero_v4i32(i32* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001000; SSE-LABEL: insert_mem_and_zero_v4i32:
1001; SSE: # BB#0:
1002; SSE-NEXT: movd (%rdi), %xmm0
1003; SSE-NEXT: retq
1004;
1005; AVX-LABEL: insert_mem_and_zero_v4i32:
1006; AVX: # BB#0:
1007; AVX-NEXT: vmovd (%rdi), %xmm0
1008; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001009 %a = load i32* %ptr
1010 %v = insertelement <4 x i32> undef, i32 %a, i32 0
1011 %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1012 ret <4 x i32> %shuffle
1013}
1014
1015define <4 x float> @insert_reg_and_zero_v4f32(float %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001016; SSE-LABEL: insert_reg_and_zero_v4f32:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001017; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001018; SSE-NEXT: xorps %xmm1, %xmm1
1019; SSE-NEXT: movss %xmm0, %xmm1
1020; SSE-NEXT: movaps %xmm1, %xmm0
Chandler Carruth78a761c2014-09-20 18:36:39 +00001021; SSE-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001022;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001023; AVX-LABEL: insert_reg_and_zero_v4f32:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001024; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001025; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
1026; AVX-NEXT: vmovss %xmm0, %xmm1, %xmm0
Chandler Carruth78a761c2014-09-20 18:36:39 +00001027; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001028 %v = insertelement <4 x float> undef, float %a, i32 0
1029 %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1030 ret <4 x float> %shuffle
1031}
1032
1033define <4 x float> @insert_mem_and_zero_v4f32(float* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001034; SSE-LABEL: insert_mem_and_zero_v4f32:
1035; SSE: # BB#0:
1036; SSE-NEXT: movss (%rdi), %xmm0
1037; SSE-NEXT: retq
1038;
1039; AVX-LABEL: insert_mem_and_zero_v4f32:
1040; AVX: # BB#0:
1041; AVX-NEXT: vmovss (%rdi), %xmm0
1042; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001043 %a = load float* %ptr
1044 %v = insertelement <4 x float> undef, float %a, i32 0
1045 %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1046 ret <4 x float> %shuffle
1047}
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001048
1049define <4 x float> @shuffle_mem_v4f32_3210(<4 x float>* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001050; SSE-LABEL: shuffle_mem_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001051; SSE: # BB#0:
1052; SSE-NEXT: movaps (%rdi), %xmm0
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001053; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001054; SSE-NEXT: retq
1055;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001056; AVX-LABEL: shuffle_mem_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001057; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001058; AVX-NEXT: vpermilps {{.*#+}} xmm0 = mem[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001059; AVX-NEXT: retq
1060 %a = load <4 x float>* %ptr
1061 %shuffle = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
1062 ret <4 x float> %shuffle
1063}