blob: 3e278d23f8af0e6b65104ea4c923694bafd75d58 [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 Carruthbebedba2014-09-30 22:16:23 +00006; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx2 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
Chandler Carruth83860cf2014-06-27 11:23:44 +00007
8target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
9target triple = "x86_64-unknown-unknown"
10
11define <4 x i32> @shuffle_v4i32_0001(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000012; SSE-LABEL: shuffle_v4i32_0001:
13; SSE: # BB#0:
14; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,1]
15; SSE-NEXT: retq
16;
17; AVX-LABEL: shuffle_v4i32_0001:
18; AVX: # BB#0:
19; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,1]
20; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +000021 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
22 ret <4 x i32> %shuffle
23}
24define <4 x i32> @shuffle_v4i32_0020(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000025; SSE-LABEL: shuffle_v4i32_0020:
26; SSE: # BB#0:
27; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,2,0]
28; SSE-NEXT: retq
29;
30; AVX-LABEL: shuffle_v4i32_0020:
31; AVX: # BB#0:
32; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,2,0]
33; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +000034 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
35 ret <4 x i32> %shuffle
36}
Chandler Carruth27046752014-08-07 08:11:31 +000037define <4 x i32> @shuffle_v4i32_0112(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000038; SSE-LABEL: shuffle_v4i32_0112:
39; SSE: # BB#0:
40; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,2]
41; SSE-NEXT: retq
42;
43; AVX-LABEL: shuffle_v4i32_0112:
44; AVX: # BB#0:
45; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,2]
46; AVX-NEXT: retq
Chandler Carruth27046752014-08-07 08:11:31 +000047 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 1, i32 2>
48 ret <4 x i32> %shuffle
49}
Chandler Carruth83860cf2014-06-27 11:23:44 +000050define <4 x i32> @shuffle_v4i32_0300(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000051; SSE-LABEL: shuffle_v4i32_0300:
52; SSE: # BB#0:
53; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,3,0,0]
54; SSE-NEXT: retq
55;
56; AVX-LABEL: shuffle_v4i32_0300:
57; AVX: # BB#0:
58; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,3,0,0]
59; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +000060 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
61 ret <4 x i32> %shuffle
62}
63define <4 x i32> @shuffle_v4i32_1000(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000064; SSE-LABEL: shuffle_v4i32_1000:
65; SSE: # BB#0:
66; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,0,0]
67; SSE-NEXT: retq
68;
69; AVX-LABEL: shuffle_v4i32_1000:
70; AVX: # BB#0:
71; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,0,0,0]
72; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +000073 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
74 ret <4 x i32> %shuffle
75}
76define <4 x i32> @shuffle_v4i32_2200(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000077; SSE-LABEL: shuffle_v4i32_2200:
78; SSE: # BB#0:
79; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,2,0,0]
80; SSE-NEXT: retq
81;
82; AVX-LABEL: shuffle_v4i32_2200:
83; AVX: # BB#0:
84; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,2,0,0]
85; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +000086 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
87 ret <4 x i32> %shuffle
88}
89define <4 x i32> @shuffle_v4i32_3330(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +000090; SSE-LABEL: shuffle_v4i32_3330:
91; SSE: # BB#0:
92; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,0]
93; SSE-NEXT: retq
94;
95; AVX-LABEL: shuffle_v4i32_3330:
96; AVX: # BB#0:
97; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,0]
98; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +000099 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
100 ret <4 x i32> %shuffle
101}
102define <4 x i32> @shuffle_v4i32_3210(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000103; SSE-LABEL: shuffle_v4i32_3210:
104; SSE: # BB#0:
105; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
106; SSE-NEXT: retq
107;
108; AVX-LABEL: shuffle_v4i32_3210:
109; AVX: # BB#0:
110; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
111; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000112 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
113 ret <4 x i32> %shuffle
114}
115
Chandler Carruth17fd8482014-08-15 03:54:49 +0000116define <4 x i32> @shuffle_v4i32_2121(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000117; SSE-LABEL: shuffle_v4i32_2121:
118; SSE: # BB#0:
119; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,1,2,1]
120; SSE-NEXT: retq
121;
122; AVX-LABEL: shuffle_v4i32_2121:
123; AVX: # BB#0:
124; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,1,2,1]
125; AVX-NEXT: retq
Chandler Carruth17fd8482014-08-15 03:54:49 +0000126 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 1, i32 2, i32 1>
127 ret <4 x i32> %shuffle
128}
129
Chandler Carruth83860cf2014-06-27 11:23:44 +0000130define <4 x float> @shuffle_v4f32_0001(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000131; SSE-LABEL: shuffle_v4f32_0001:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000132; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000133; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0,0,1]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000134; SSE-NEXT: retq
135;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000136; AVX-LABEL: shuffle_v4f32_0001:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000137; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000138; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,0,0,1]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000139; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000140 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
141 ret <4 x float> %shuffle
142}
143define <4 x float> @shuffle_v4f32_0020(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000144; SSE-LABEL: shuffle_v4f32_0020:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000145; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000146; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0,2,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000147; SSE-NEXT: retq
148;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000149; AVX-LABEL: shuffle_v4f32_0020:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000150; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000151; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,0,2,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000152; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000153 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
154 ret <4 x float> %shuffle
155}
156define <4 x float> @shuffle_v4f32_0300(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000157; SSE-LABEL: shuffle_v4f32_0300:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000158; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000159; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3,0,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000160; SSE-NEXT: retq
161;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000162; AVX-LABEL: shuffle_v4f32_0300:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000163; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000164; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,3,0,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000165; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000166 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
167 ret <4 x float> %shuffle
168}
169define <4 x float> @shuffle_v4f32_1000(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000170; SSE-LABEL: shuffle_v4f32_1000:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000171; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000172; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0,0,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000173; SSE-NEXT: retq
174;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000175; AVX-LABEL: shuffle_v4f32_1000:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000176; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000177; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[1,0,0,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000178; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000179 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
180 ret <4 x float> %shuffle
181}
182define <4 x float> @shuffle_v4f32_2200(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000183; SSE-LABEL: shuffle_v4f32_2200:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000184; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000185; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,2,0,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000186; SSE-NEXT: retq
187;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000188; AVX-LABEL: shuffle_v4f32_2200:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000189; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000190; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[2,2,0,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000191; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000192 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
193 ret <4 x float> %shuffle
194}
195define <4 x float> @shuffle_v4f32_3330(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000196; SSE-LABEL: shuffle_v4f32_3330:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000197; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000198; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000199; SSE-NEXT: retq
200;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000201; AVX-LABEL: shuffle_v4f32_3330:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000202; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000203; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,3,3,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000204; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000205 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
206 ret <4 x float> %shuffle
207}
208define <4 x float> @shuffle_v4f32_3210(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000209; SSE-LABEL: shuffle_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000210; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000211; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000212; SSE-NEXT: retq
213;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000214; AVX-LABEL: shuffle_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000215; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000216; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +0000217; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000218 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
219 ret <4 x float> %shuffle
220}
Chandler Carruth12d4a702014-09-15 11:26:25 +0000221define <4 x float> @shuffle_v4f32_0011(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000222; SSE-LABEL: shuffle_v4f32_0011:
223; SSE: # BB#0:
224; SSE-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0,0,1,1]
225; SSE-NEXT: retq
226;
227; AVX-LABEL: shuffle_v4f32_0011:
228; AVX: # BB#0:
229; AVX-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0,0,1,1]
230; AVX-NEXT: retq
Chandler Carruth12d4a702014-09-15 11:26:25 +0000231 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 1, i32 1>
232 ret <4 x float> %shuffle
233}
234define <4 x float> @shuffle_v4f32_2233(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000235; SSE-LABEL: shuffle_v4f32_2233:
236; SSE: # BB#0:
237; SSE-NEXT: unpckhps {{.*#+}} xmm0 = xmm0[2,2,3,3]
238; SSE-NEXT: retq
239;
240; AVX-LABEL: shuffle_v4f32_2233:
241; AVX: # BB#0:
242; AVX-NEXT: vunpckhps {{.*#+}} xmm0 = xmm0[2,2,3,3]
243; AVX-NEXT: retq
Chandler Carruth12d4a702014-09-15 11:26:25 +0000244 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 2, i32 3, i32 3>
245 ret <4 x float> %shuffle
246}
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000247define <4 x float> @shuffle_v4f32_0022(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000248; SSE2-LABEL: shuffle_v4f32_0022:
249; SSE2: # BB#0:
250; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0,2,2]
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000251; SSE2-NEXT: retq
252;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000253; SSE3-LABEL: shuffle_v4f32_0022:
254; SSE3: # BB#0:
255; SSE3-NEXT: movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000256; SSE3-NEXT: retq
257;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000258; SSSE3-LABEL: shuffle_v4f32_0022:
259; SSSE3: # BB#0:
260; SSSE3-NEXT: movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000261; SSSE3-NEXT: retq
262;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000263; SSE41-LABEL: shuffle_v4f32_0022:
264; SSE41: # BB#0:
265; SSE41-NEXT: movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000266; SSE41-NEXT: retq
267;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000268; AVX-LABEL: shuffle_v4f32_0022:
269; AVX: # BB#0:
270; AVX-NEXT: vmovsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000271; AVX-NEXT: retq
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000272 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 2>
273 ret <4 x float> %shuffle
274}
275define <4 x float> @shuffle_v4f32_1133(<4 x float> %a, <4 x float> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000276; SSE2-LABEL: shuffle_v4f32_1133:
277; SSE2: # BB#0:
278; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,3,3]
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000279; SSE2-NEXT: retq
280;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000281; SSE3-LABEL: shuffle_v4f32_1133:
282; SSE3: # BB#0:
283; SSE3-NEXT: movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000284; SSE3-NEXT: retq
285;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000286; SSSE3-LABEL: shuffle_v4f32_1133:
287; SSSE3: # BB#0:
288; SSSE3-NEXT: movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000289; SSSE3-NEXT: retq
290;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000291; SSE41-LABEL: shuffle_v4f32_1133:
292; SSE41: # BB#0:
293; SSE41-NEXT: movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000294; SSE41-NEXT: retq
295;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000296; AVX-LABEL: shuffle_v4f32_1133:
297; AVX: # BB#0:
298; AVX-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000299; AVX-NEXT: retq
Chandler Carruth41a25dd2014-09-15 11:15:23 +0000300 %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 1, i32 3, i32 3>
301 ret <4 x float> %shuffle
302}
Chandler Carruth83860cf2014-06-27 11:23:44 +0000303
304define <4 x i32> @shuffle_v4i32_0124(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000305; SSE2-LABEL: shuffle_v4i32_0124:
306; SSE2: # BB#0:
307; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
308; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
Chandler Carruthdad54002014-09-03 22:48:34 +0000309; SSE2-NEXT: retq
310;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000311; SSE3-LABEL: shuffle_v4i32_0124:
312; SSE3: # BB#0:
313; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
314; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000315; SSE3-NEXT: retq
316;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000317; SSSE3-LABEL: shuffle_v4i32_0124:
318; SSSE3: # BB#0:
319; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
320; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000321; SSSE3-NEXT: retq
322;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000323; SSE41-LABEL: shuffle_v4i32_0124:
324; SSE41: # BB#0:
325; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
Chandler Carruthdad54002014-09-03 22:48:34 +0000326; SSE41-NEXT: retq
327;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000328; AVX-LABEL: shuffle_v4i32_0124:
329; AVX: # BB#0:
330; AVX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000331; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000332 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 4>
333 ret <4 x i32> %shuffle
334}
335define <4 x i32> @shuffle_v4i32_0142(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000336; SSE-LABEL: shuffle_v4i32_0142:
337; SSE: # BB#0:
338; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
339; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
340; SSE-NEXT: retq
341;
342; AVX-LABEL: shuffle_v4i32_0142:
343; AVX: # BB#0:
344; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
345; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
346; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000347 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 2>
348 ret <4 x i32> %shuffle
349}
350define <4 x i32> @shuffle_v4i32_0412(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000351; SSE-LABEL: shuffle_v4i32_0412:
352; SSE: # BB#0:
353; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
354; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[1,2]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000355; SSE-NEXT: movaps %xmm1, %xmm0
356; SSE-NEXT: retq
Chandler Carruthbfc6b952014-09-03 19:39:10 +0000357;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000358; AVX-LABEL: shuffle_v4i32_0412:
359; AVX: # BB#0:
360; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
361; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm1[2,0],xmm0[1,2]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000362; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000363 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 2>
364 ret <4 x i32> %shuffle
365}
366define <4 x i32> @shuffle_v4i32_4012(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000367; SSE-LABEL: shuffle_v4i32_4012:
368; SSE: # BB#0:
369; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
370; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000371; SSE-NEXT: movaps %xmm1, %xmm0
372; SSE-NEXT: retq
Chandler Carruthbfc6b952014-09-03 19:39:10 +0000373;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000374; AVX-LABEL: shuffle_v4i32_4012:
375; AVX: # BB#0:
376; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
377; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm1[0,2],xmm0[1,2]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000378; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000379 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
380 ret <4 x i32> %shuffle
381}
382define <4 x i32> @shuffle_v4i32_0145(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000383; SSE-LABEL: shuffle_v4i32_0145:
384; SSE: # BB#0:
385; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
386; SSE-NEXT: retq
387;
388; AVX-LABEL: shuffle_v4i32_0145:
389; AVX: # BB#0:
390; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
391; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000392 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
393 ret <4 x i32> %shuffle
394}
395define <4 x i32> @shuffle_v4i32_0451(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000396; SSE-LABEL: shuffle_v4i32_0451:
397; SSE: # BB#0:
398; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
399; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
400; SSE-NEXT: retq
401;
402; AVX-LABEL: shuffle_v4i32_0451:
403; AVX: # BB#0:
404; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
405; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
406; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000407 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 4, i32 5, i32 1>
408 ret <4 x i32> %shuffle
409}
410define <4 x i32> @shuffle_v4i32_4501(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000411; SSE-LABEL: shuffle_v4i32_4501:
412; SSE: # BB#0:
413; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000414; SSE-NEXT: movdqa %xmm1, %xmm0
415; SSE-NEXT: retq
Chandler Carruthbfc6b952014-09-03 19:39:10 +0000416;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000417; AVX-LABEL: shuffle_v4i32_4501:
418; AVX: # BB#0:
419; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000420; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000421 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
422 ret <4 x i32> %shuffle
423}
424define <4 x i32> @shuffle_v4i32_4015(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000425; SSE-LABEL: shuffle_v4i32_4015:
426; SSE: # BB#0:
427; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
428; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0,1,3]
429; SSE-NEXT: retq
430;
431; AVX-LABEL: shuffle_v4i32_4015:
432; AVX: # BB#0:
433; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1]
434; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[2,0,1,3]
435; AVX-NEXT: retq
Chandler Carruth83860cf2014-06-27 11:23:44 +0000436 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 5>
437 ret <4 x i32> %shuffle
438}
Chandler Carruthfc0db222014-09-04 01:13:48 +0000439
440define <4 x float> @shuffle_v4f32_4zzz(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000441; SSE2-LABEL: shuffle_v4f32_4zzz:
442; SSE2: # BB#0:
443; SSE2-NEXT: xorps %xmm1, %xmm1
444; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,0]
445; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000446; SSE2-NEXT: retq
447;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000448; SSE3-LABEL: shuffle_v4f32_4zzz:
449; SSE3: # BB#0:
450; SSE3-NEXT: xorps %xmm1, %xmm1
451; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,0]
452; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000453; SSE3-NEXT: retq
454;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000455; SSSE3-LABEL: shuffle_v4f32_4zzz:
456; SSSE3: # BB#0:
457; SSSE3-NEXT: xorps %xmm1, %xmm1
458; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,0]
459; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000460; SSSE3-NEXT: retq
461;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000462; SSE41-LABEL: shuffle_v4f32_4zzz:
463; SSE41: # BB#0:
464; SSE41-NEXT: xorps %xmm1, %xmm1
465; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
466; SSE41-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000467; SSE41-NEXT: retq
468;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000469; AVX-LABEL: shuffle_v4f32_4zzz:
470; AVX: # BB#0:
471; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
472; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000473; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000474 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
475 ret <4 x float> %shuffle
476}
477
478define <4 x float> @shuffle_v4f32_z4zz(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000479; SSE2-LABEL: shuffle_v4f32_z4zz:
480; SSE2: # BB#0:
481; SSE2-NEXT: xorps %xmm1, %xmm1
482; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
483; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000484; SSE2-NEXT: retq
485;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000486; SSE3-LABEL: shuffle_v4f32_z4zz:
487; SSE3: # BB#0:
488; SSE3-NEXT: xorps %xmm1, %xmm1
489; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
490; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000491; SSE3-NEXT: retq
492;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000493; SSSE3-LABEL: shuffle_v4f32_z4zz:
494; SSSE3: # BB#0:
495; SSSE3-NEXT: xorps %xmm1, %xmm1
496; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
497; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000498; SSSE3-NEXT: retq
499;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000500; SSE41-LABEL: shuffle_v4f32_z4zz:
501; SSE41: # BB#0:
502; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,xmm0[0],zero,zero
Chandler Carruthfc0db222014-09-04 01:13:48 +0000503; SSE41-NEXT: retq
504;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000505; AVX-LABEL: shuffle_v4f32_z4zz:
506; AVX: # BB#0:
507; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,xmm0[0],zero,zero
Chandler Carruth78a761c2014-09-20 18:36:39 +0000508; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000509 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 2, i32 4, i32 3, i32 0>
510 ret <4 x float> %shuffle
511}
512
513define <4 x float> @shuffle_v4f32_zz4z(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000514; SSE2-LABEL: shuffle_v4f32_zz4z:
515; SSE2: # BB#0:
516; SSE2-NEXT: xorps %xmm1, %xmm1
517; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
518; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
519; SSE2-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000520; SSE2-NEXT: retq
521;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000522; SSE3-LABEL: shuffle_v4f32_zz4z:
523; SSE3: # BB#0:
524; SSE3-NEXT: xorps %xmm1, %xmm1
525; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
526; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
527; SSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000528; SSE3-NEXT: retq
529;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000530; SSSE3-LABEL: shuffle_v4f32_zz4z:
531; SSSE3: # BB#0:
532; SSSE3-NEXT: xorps %xmm1, %xmm1
533; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
534; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
535; SSSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000536; SSSE3-NEXT: retq
537;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000538; SSE41-LABEL: shuffle_v4f32_zz4z:
539; SSE41: # BB#0:
540; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,zero,xmm0[0],zero
Chandler Carruthfc0db222014-09-04 01:13:48 +0000541; SSE41-NEXT: retq
542;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000543; AVX-LABEL: shuffle_v4f32_zz4z:
544; AVX: # BB#0:
545; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,zero,xmm0[0],zero
Chandler Carruth78a761c2014-09-20 18:36:39 +0000546; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000547 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 0, i32 4, i32 0>
548 ret <4 x float> %shuffle
549}
550
551define <4 x float> @shuffle_v4f32_zuu4(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000552; SSE2-LABEL: shuffle_v4f32_zuu4:
553; SSE2: # BB#0:
554; SSE2-NEXT: xorps %xmm1, %xmm1
555; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
556; SSE2-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000557; SSE2-NEXT: retq
558;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000559; SSE3-LABEL: shuffle_v4f32_zuu4:
560; SSE3: # BB#0:
561; SSE3-NEXT: xorps %xmm1, %xmm1
562; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
563; SSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000564; SSE3-NEXT: retq
565;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000566; SSSE3-LABEL: shuffle_v4f32_zuu4:
567; SSSE3: # BB#0:
568; SSSE3-NEXT: xorps %xmm1, %xmm1
569; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
570; SSSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000571; SSSE3-NEXT: retq
572;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000573; SSE41-LABEL: shuffle_v4f32_zuu4:
574; SSE41: # BB#0:
575; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,zero,zero,xmm0[0]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000576; SSE41-NEXT: retq
577;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000578; AVX-LABEL: shuffle_v4f32_zuu4:
579; AVX: # BB#0:
580; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,zero,zero,xmm0[0]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000581; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000582 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 4>
583 ret <4 x float> %shuffle
584}
585
586define <4 x float> @shuffle_v4f32_zzz7(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000587; SSE2-LABEL: shuffle_v4f32_zzz7:
588; SSE2: # BB#0:
589; SSE2-NEXT: xorps %xmm1, %xmm1
590; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
591; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
592; SSE2-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000593; SSE2-NEXT: retq
594;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000595; SSE3-LABEL: shuffle_v4f32_zzz7:
596; SSE3: # BB#0:
597; SSE3-NEXT: xorps %xmm1, %xmm1
598; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
599; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
600; SSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000601; SSE3-NEXT: retq
602;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000603; SSSE3-LABEL: shuffle_v4f32_zzz7:
604; SSSE3: # BB#0:
605; SSSE3-NEXT: xorps %xmm1, %xmm1
606; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
607; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
608; SSSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000609; SSSE3-NEXT: retq
610;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000611; SSE41-LABEL: shuffle_v4f32_zzz7:
612; SSE41: # BB#0:
613; SSE41-NEXT: xorps %xmm1, %xmm1
614; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm1[0,1,2],xmm0[3]
615; SSE41-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000616; SSE41-NEXT: retq
617;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000618; AVX-LABEL: shuffle_v4f32_zzz7:
619; AVX: # BB#0:
620; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
621; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000622; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000623 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
624 ret <4 x float> %shuffle
625}
626
627define <4 x float> @shuffle_v4f32_z6zz(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000628; SSE2-LABEL: shuffle_v4f32_z6zz:
629; SSE2: # BB#0:
630; SSE2-NEXT: xorps %xmm1, %xmm1
631; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
632; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000633; SSE2-NEXT: retq
634;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000635; SSE3-LABEL: shuffle_v4f32_z6zz:
636; SSE3: # BB#0:
637; SSE3-NEXT: xorps %xmm1, %xmm1
638; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
639; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000640; SSE3-NEXT: retq
641;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000642; SSSE3-LABEL: shuffle_v4f32_z6zz:
643; SSSE3: # BB#0:
644; SSSE3-NEXT: xorps %xmm1, %xmm1
645; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
646; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000647; SSSE3-NEXT: retq
648;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000649; SSE41-LABEL: shuffle_v4f32_z6zz:
650; SSE41: # BB#0:
651; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
Chandler Carruthfc0db222014-09-04 01:13:48 +0000652; SSE41-NEXT: retq
653;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000654; AVX-LABEL: shuffle_v4f32_z6zz:
655; AVX: # BB#0:
656; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
Chandler Carruth78a761c2014-09-20 18:36:39 +0000657; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000658 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
659 ret <4 x float> %shuffle
660}
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000661
Chandler Carruth080cab92014-10-03 11:16:45 +0000662define <4 x i32> @shuffle_v4i32_4zzz(<4 x i32> %a) {
663; SSE2-LABEL: shuffle_v4i32_4zzz:
664; SSE2: # BB#0:
665; SSE2-NEXT: xorps %xmm1, %xmm1
666; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,0]
667; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
668; SSE2-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000669;
Chandler Carruth080cab92014-10-03 11:16:45 +0000670; SSE3-LABEL: shuffle_v4i32_4zzz:
671; SSE3: # BB#0:
672; SSE3-NEXT: xorps %xmm1, %xmm1
673; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,0]
674; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
675; SSE3-NEXT: retq
676;
677; SSSE3-LABEL: shuffle_v4i32_4zzz:
678; SSSE3: # BB#0:
679; SSSE3-NEXT: xorps %xmm1, %xmm1
680; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[1,0]
681; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
682; SSSE3-NEXT: retq
683;
684; SSE41-LABEL: shuffle_v4i32_4zzz:
685; SSE41: # BB#0:
686; SSE41-NEXT: pxor %xmm1, %xmm1
687; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
688; SSE41-NEXT: movdqa %xmm1, %xmm0
689; SSE41-NEXT: retq
690;
691; AVX1-LABEL: shuffle_v4i32_4zzz:
692; AVX1: # BB#0:
693; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
694; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
695; AVX1-NEXT: retq
696;
697; AVX2-LABEL: shuffle_v4i32_4zzz:
698; AVX2: # BB#0:
699; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
700; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
701; AVX2-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000702 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
703 ret <4 x i32> %shuffle
704}
705
Chandler Carruth080cab92014-10-03 11:16:45 +0000706define <4 x i32> @shuffle_v4i32_z4zz(<4 x i32> %a) {
707; SSE2-LABEL: shuffle_v4i32_z4zz:
708; SSE2: # BB#0:
709; SSE2-NEXT: xorps %xmm1, %xmm1
710; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
711; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
712; SSE2-NEXT: retq
713;
714; SSE3-LABEL: shuffle_v4i32_z4zz:
715; SSE3: # BB#0:
716; SSE3-NEXT: xorps %xmm1, %xmm1
717; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
718; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
719; SSE3-NEXT: retq
720;
721; SSSE3-LABEL: shuffle_v4i32_z4zz:
722; SSSE3: # BB#0:
723; SSSE3-NEXT: xorps %xmm1, %xmm1
724; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
725; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
726; SSSE3-NEXT: retq
727;
728; SSE41-LABEL: shuffle_v4i32_z4zz:
729; SSE41: # BB#0:
730; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,xmm0[0],zero,zero
731; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000732;
733; AVX-LABEL: shuffle_v4i32_z4zz:
734; AVX: # BB#0:
Chandler Carruth080cab92014-10-03 11:16:45 +0000735; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,xmm0[0],zero,zero
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000736; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000737 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 2, i32 4, i32 3, i32 0>
738 ret <4 x i32> %shuffle
739}
740
Chandler Carruth080cab92014-10-03 11:16:45 +0000741define <4 x i32> @shuffle_v4i32_zz4z(<4 x i32> %a) {
742; SSE2-LABEL: shuffle_v4i32_zz4z:
743; SSE2: # BB#0:
744; SSE2-NEXT: xorps %xmm1, %xmm1
745; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
746; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
747; SSE2-NEXT: movaps %xmm1, %xmm0
748; SSE2-NEXT: retq
749;
750; SSE3-LABEL: shuffle_v4i32_zz4z:
751; SSE3: # BB#0:
752; SSE3-NEXT: xorps %xmm1, %xmm1
753; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
754; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
755; SSE3-NEXT: movaps %xmm1, %xmm0
756; SSE3-NEXT: retq
757;
758; SSSE3-LABEL: shuffle_v4i32_zz4z:
759; SSSE3: # BB#0:
760; SSSE3-NEXT: xorps %xmm1, %xmm1
761; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
762; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
763; SSSE3-NEXT: movaps %xmm1, %xmm0
764; SSSE3-NEXT: retq
765;
766; SSE41-LABEL: shuffle_v4i32_zz4z:
767; SSE41: # BB#0:
768; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,zero,xmm0[0],zero
769; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000770;
771; AVX-LABEL: shuffle_v4i32_zz4z:
772; AVX: # BB#0:
Chandler Carruth080cab92014-10-03 11:16:45 +0000773; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,zero,xmm0[0],zero
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000774; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000775 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 0, i32 4, i32 0>
776 ret <4 x i32> %shuffle
777}
778
Chandler Carruth080cab92014-10-03 11:16:45 +0000779define <4 x i32> @shuffle_v4i32_zuu4(<4 x i32> %a) {
780; SSE2-LABEL: shuffle_v4i32_zuu4:
781; SSE2: # BB#0:
782; SSE2-NEXT: xorps %xmm1, %xmm1
783; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
784; SSE2-NEXT: movaps %xmm1, %xmm0
785; SSE2-NEXT: retq
786;
787; SSE3-LABEL: shuffle_v4i32_zuu4:
788; SSE3: # BB#0:
789; SSE3-NEXT: xorps %xmm1, %xmm1
790; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
791; SSE3-NEXT: movaps %xmm1, %xmm0
792; SSE3-NEXT: retq
793;
794; SSSE3-LABEL: shuffle_v4i32_zuu4:
795; SSSE3: # BB#0:
796; SSSE3-NEXT: xorps %xmm1, %xmm1
797; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
798; SSSE3-NEXT: movaps %xmm1, %xmm0
799; SSSE3-NEXT: retq
800;
801; SSE41-LABEL: shuffle_v4i32_zuu4:
802; SSE41: # BB#0:
803; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,zero,zero,xmm0[0]
804; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000805;
806; AVX-LABEL: shuffle_v4i32_zuu4:
807; AVX: # BB#0:
Chandler Carruth080cab92014-10-03 11:16:45 +0000808; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,zero,zero,xmm0[0]
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000809; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000810 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 4>
811 ret <4 x i32> %shuffle
812}
813
Chandler Carruth080cab92014-10-03 11:16:45 +0000814define <4 x i32> @shuffle_v4i32_z6zz(<4 x i32> %a) {
815; SSE2-LABEL: shuffle_v4i32_z6zz:
816; SSE2: # BB#0:
817; SSE2-NEXT: xorps %xmm1, %xmm1
818; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
819; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
820; SSE2-NEXT: retq
821;
822; SSE3-LABEL: shuffle_v4i32_z6zz:
823; SSE3: # BB#0:
824; SSE3-NEXT: xorps %xmm1, %xmm1
825; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
826; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
827; SSE3-NEXT: retq
828;
829; SSSE3-LABEL: shuffle_v4i32_z6zz:
830; SSSE3: # BB#0:
831; SSSE3-NEXT: xorps %xmm1, %xmm1
832; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
833; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
834; SSSE3-NEXT: retq
835;
836; SSE41-LABEL: shuffle_v4i32_z6zz:
837; SSE41: # BB#0:
838; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
839; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000840;
841; AVX-LABEL: shuffle_v4i32_z6zz:
842; AVX: # BB#0:
Chandler Carruth080cab92014-10-03 11:16:45 +0000843; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000844; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000845 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
846 ret <4 x i32> %shuffle
847}
Chandler Carruth9057fca2014-09-18 09:00:25 +0000848
849define <4 x i32> @shuffle_v4i32_7012(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000850; SSE2-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000851; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000852; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
853; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000854; SSE2-NEXT: movaps %xmm1, %xmm0
855; SSE2-NEXT: retq
856;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000857; SSE3-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000858; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000859; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
860; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000861; SSE3-NEXT: movaps %xmm1, %xmm0
862; SSE3-NEXT: retq
863;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000864; SSSE3-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000865; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000866; 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 +0000867; SSSE3-NEXT: retq
868;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000869; SSE41-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000870; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000871; 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 +0000872; SSE41-NEXT: retq
873;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000874; AVX-LABEL: shuffle_v4i32_7012:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000875; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000876; 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 +0000877; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000878 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
879 ret <4 x i32> %shuffle
880}
881
882define <4 x i32> @shuffle_v4i32_6701(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000883; SSE2-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000884; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000885; SSE2-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000886; SSE2-NEXT: movapd %xmm1, %xmm0
887; SSE2-NEXT: retq
888;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000889; SSE3-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000890; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000891; SSE3-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000892; SSE3-NEXT: movapd %xmm1, %xmm0
893; SSE3-NEXT: retq
894;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000895; SSSE3-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000896; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000897; 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 +0000898; SSSE3-NEXT: retq
899;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000900; SSE41-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000901; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000902; 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 +0000903; SSE41-NEXT: retq
904;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000905; AVX-LABEL: shuffle_v4i32_6701:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000906; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000907; 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 +0000908; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000909 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
910 ret <4 x i32> %shuffle
911}
912
913define <4 x i32> @shuffle_v4i32_5670(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000914; SSE2-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000915; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000916; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
917; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000918; SSE2-NEXT: movaps %xmm1, %xmm0
919; SSE2-NEXT: retq
920;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000921; SSE3-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000922; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000923; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
924; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000925; SSE3-NEXT: movaps %xmm1, %xmm0
926; SSE3-NEXT: retq
927;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000928; SSSE3-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000929; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000930; 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 +0000931; SSSE3-NEXT: retq
932;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000933; SSE41-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000934; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000935; 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 +0000936; SSE41-NEXT: retq
937;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000938; AVX-LABEL: shuffle_v4i32_5670:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000939; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000940; 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 +0000941; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000942 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
943 ret <4 x i32> %shuffle
944}
945
946define <4 x i32> @shuffle_v4i32_1234(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000947; SSE2-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000948; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000949; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
950; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000951; SSE2-NEXT: retq
952;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000953; SSE3-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000954; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000955; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
956; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000957; SSE3-NEXT: retq
958;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000959; SSSE3-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000960; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000961; 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 +0000962; SSSE3-NEXT: movdqa %xmm1, %xmm0
963; SSSE3-NEXT: retq
964;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000965; SSE41-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000966; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000967; 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 +0000968; SSE41-NEXT: movdqa %xmm1, %xmm0
969; SSE41-NEXT: retq
970;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000971; AVX-LABEL: shuffle_v4i32_1234:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000972; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000973; 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 +0000974; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000975 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
976 ret <4 x i32> %shuffle
977}
978
979define <4 x i32> @shuffle_v4i32_2345(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000980; SSE2-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000981; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000982; SSE2-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000983; SSE2-NEXT: retq
984;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000985; SSE3-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000986; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000987; SSE3-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000988; SSE3-NEXT: retq
989;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000990; SSSE3-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000991; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000992; 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 +0000993; SSSE3-NEXT: movdqa %xmm1, %xmm0
994; SSSE3-NEXT: retq
995;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000996; SSE41-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000997; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000998; 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 +0000999; SSE41-NEXT: movdqa %xmm1, %xmm0
1000; SSE41-NEXT: retq
1001;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001002; AVX-LABEL: shuffle_v4i32_2345:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001003; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001004; 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 +00001005; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +00001006 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
1007 ret <4 x i32> %shuffle
1008}
1009
1010define <4 x i32> @shuffle_v4i32_3456(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001011; SSE2-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +00001012; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001013; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
1014; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +00001015; SSE2-NEXT: retq
1016;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001017; SSE3-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +00001018; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001019; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
1020; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +00001021; SSE3-NEXT: retq
1022;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001023; SSSE3-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +00001024; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001025; 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 +00001026; SSSE3-NEXT: movdqa %xmm1, %xmm0
1027; SSSE3-NEXT: retq
1028;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001029; SSE41-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +00001030; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001031; 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 +00001032; SSE41-NEXT: movdqa %xmm1, %xmm0
1033; SSE41-NEXT: retq
1034;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001035; AVX-LABEL: shuffle_v4i32_3456:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001036; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001037; 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 +00001038; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +00001039 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
1040 ret <4 x i32> %shuffle
1041}
Chandler Carruth2e275142014-09-19 08:37:44 +00001042
1043define <4 x i32> @shuffle_v4i32_0u1u(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth846baf22014-10-01 02:25:54 +00001044; SSE2-LABEL: shuffle_v4i32_0u1u:
1045; SSE2: # BB#0:
1046; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1047; SSE2-NEXT: retq
1048;
1049; SSE3-LABEL: shuffle_v4i32_0u1u:
1050; SSE3: # BB#0:
1051; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1052; SSE3-NEXT: retq
1053;
1054; SSSE3-LABEL: shuffle_v4i32_0u1u:
1055; SSSE3: # BB#0:
1056; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1057; SSSE3-NEXT: retq
1058;
1059; SSE41-LABEL: shuffle_v4i32_0u1u:
1060; SSE41: # BB#0:
1061; SSE41-NEXT: pmovzxdq %xmm0, %xmm0
1062; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001063;
1064; AVX-LABEL: shuffle_v4i32_0u1u:
1065; AVX: # BB#0:
Chandler Carruth846baf22014-10-01 02:25:54 +00001066; AVX-NEXT: vpmovzxdq %xmm0, %xmm0
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001067; AVX-NEXT: retq
Chandler Carruth2e275142014-09-19 08:37:44 +00001068 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 undef, i32 1, i32 undef>
1069 ret <4 x i32> %shuffle
1070}
1071
1072define <4 x i32> @shuffle_v4i32_0z1z(<4 x i32> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001073; SSE2-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +00001074; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001075; SSE2-NEXT: pxor %xmm1, %xmm1
1076; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Chandler Carruth2e275142014-09-19 08:37:44 +00001077; SSE2-NEXT: retq
1078;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001079; SSE3-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +00001080; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001081; SSE3-NEXT: pxor %xmm1, %xmm1
1082; SSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Chandler Carruth2e275142014-09-19 08:37:44 +00001083; SSE3-NEXT: retq
1084;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001085; SSSE3-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +00001086; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001087; SSSE3-NEXT: pxor %xmm1, %xmm1
1088; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Chandler Carruth2e275142014-09-19 08:37:44 +00001089; SSSE3-NEXT: retq
1090;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001091; SSE41-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +00001092; SSE41: # BB#0:
1093; SSE41-NEXT: pmovzxdq %xmm0, %xmm0
1094; SSE41-NEXT: retq
1095;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001096; AVX-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001097; AVX: # BB#0:
1098; AVX-NEXT: vpmovzxdq %xmm0, %xmm0
1099; AVX-NEXT: retq
Chandler Carruth2e275142014-09-19 08:37:44 +00001100 %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
1101 ret <4 x i32> %shuffle
1102}
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001103
1104define <4 x i32> @insert_reg_and_zero_v4i32(i32 %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001105; SSE-LABEL: insert_reg_and_zero_v4i32:
1106; SSE: # BB#0:
1107; SSE-NEXT: movd %edi, %xmm0
1108; SSE-NEXT: retq
1109;
1110; AVX-LABEL: insert_reg_and_zero_v4i32:
1111; AVX: # BB#0:
1112; AVX-NEXT: vmovd %edi, %xmm0
1113; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001114 %v = insertelement <4 x i32> undef, i32 %a, i32 0
1115 %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1116 ret <4 x i32> %shuffle
1117}
1118
1119define <4 x i32> @insert_mem_and_zero_v4i32(i32* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001120; SSE-LABEL: insert_mem_and_zero_v4i32:
1121; SSE: # BB#0:
1122; SSE-NEXT: movd (%rdi), %xmm0
1123; SSE-NEXT: retq
1124;
1125; AVX-LABEL: insert_mem_and_zero_v4i32:
1126; AVX: # BB#0:
1127; AVX-NEXT: vmovd (%rdi), %xmm0
1128; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001129 %a = load i32* %ptr
1130 %v = insertelement <4 x i32> undef, i32 %a, i32 0
1131 %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1132 ret <4 x i32> %shuffle
1133}
1134
1135define <4 x float> @insert_reg_and_zero_v4f32(float %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001136; SSE-LABEL: insert_reg_and_zero_v4f32:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001137; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001138; SSE-NEXT: xorps %xmm1, %xmm1
1139; SSE-NEXT: movss %xmm0, %xmm1
1140; SSE-NEXT: movaps %xmm1, %xmm0
Chandler Carruth78a761c2014-09-20 18:36:39 +00001141; SSE-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001142;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001143; AVX-LABEL: insert_reg_and_zero_v4f32:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001144; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001145; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
1146; AVX-NEXT: vmovss %xmm0, %xmm1, %xmm0
Chandler Carruth78a761c2014-09-20 18:36:39 +00001147; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001148 %v = insertelement <4 x float> undef, float %a, i32 0
1149 %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1150 ret <4 x float> %shuffle
1151}
1152
1153define <4 x float> @insert_mem_and_zero_v4f32(float* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001154; SSE-LABEL: insert_mem_and_zero_v4f32:
1155; SSE: # BB#0:
1156; SSE-NEXT: movss (%rdi), %xmm0
1157; SSE-NEXT: retq
1158;
1159; AVX-LABEL: insert_mem_and_zero_v4f32:
1160; AVX: # BB#0:
1161; AVX-NEXT: vmovss (%rdi), %xmm0
1162; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001163 %a = load float* %ptr
1164 %v = insertelement <4 x float> undef, float %a, i32 0
1165 %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1166 ret <4 x float> %shuffle
1167}
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001168
Chandler Carruth75e182b2014-10-02 21:37:14 +00001169define <4 x i32> @insert_reg_lo_v4i32(i64 %a, <4 x i32> %b) {
1170; SSE2-LABEL: insert_reg_lo_v4i32:
1171; SSE2: # BB#0:
1172; SSE2-NEXT: movd %rdi, %xmm1
1173; SSE2-NEXT: movsd %xmm1, %xmm0
1174; SSE2-NEXT: retq
1175;
1176; SSE3-LABEL: insert_reg_lo_v4i32:
1177; SSE3: # BB#0:
1178; SSE3-NEXT: movd %rdi, %xmm1
1179; SSE3-NEXT: movsd %xmm1, %xmm0
1180; SSE3-NEXT: retq
1181;
1182; SSSE3-LABEL: insert_reg_lo_v4i32:
1183; SSSE3: # BB#0:
1184; SSSE3-NEXT: movd %rdi, %xmm1
1185; SSSE3-NEXT: movsd %xmm1, %xmm0
1186; SSSE3-NEXT: retq
1187;
1188; SSE41-LABEL: insert_reg_lo_v4i32:
1189; SSE41: # BB#0:
1190; SSE41-NEXT: movd %rdi, %xmm1
1191; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1192; SSE41-NEXT: movdqa %xmm1, %xmm0
1193; SSE41-NEXT: retq
1194;
1195; AVX1-LABEL: insert_reg_lo_v4i32:
1196; AVX1: # BB#0:
1197; AVX1-NEXT: vmovq %rdi, %xmm1
1198; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1199; AVX1-NEXT: retq
1200;
1201; AVX2-LABEL: insert_reg_lo_v4i32:
1202; AVX2: # BB#0:
1203; AVX2-NEXT: vmovq %rdi, %xmm1
1204; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1205; AVX2-NEXT: retq
1206 %a.cast = bitcast i64 %a to <2 x i32>
1207 %v = shufflevector <2 x i32> %a.cast, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1208 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1209 ret <4 x i32> %shuffle
1210}
1211
1212define <4 x i32> @insert_mem_lo_v4i32(<2 x i32>* %ptr, <4 x i32> %b) {
1213; SSE2-LABEL: insert_mem_lo_v4i32:
1214; SSE2: # BB#0:
1215; SSE2-NEXT: movlpd (%rdi), %xmm0
1216; SSE2-NEXT: retq
1217;
1218; SSE3-LABEL: insert_mem_lo_v4i32:
1219; SSE3: # BB#0:
1220; SSE3-NEXT: movlpd (%rdi), %xmm0
1221; SSE3-NEXT: retq
1222;
1223; SSSE3-LABEL: insert_mem_lo_v4i32:
1224; SSSE3: # BB#0:
1225; SSSE3-NEXT: movlpd (%rdi), %xmm0
1226; SSSE3-NEXT: retq
1227;
1228; SSE41-LABEL: insert_mem_lo_v4i32:
1229; SSE41: # BB#0:
1230; SSE41-NEXT: movq (%rdi), %xmm1
1231; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1232; SSE41-NEXT: movdqa %xmm1, %xmm0
1233; SSE41-NEXT: retq
1234;
1235; AVX1-LABEL: insert_mem_lo_v4i32:
1236; AVX1: # BB#0:
1237; AVX1-NEXT: vmovq (%rdi), %xmm1
1238; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1239; AVX1-NEXT: retq
1240;
1241; AVX2-LABEL: insert_mem_lo_v4i32:
1242; AVX2: # BB#0:
1243; AVX2-NEXT: vmovq (%rdi), %xmm1
1244; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1245; AVX2-NEXT: retq
1246 %a = load <2 x i32>* %ptr
1247 %v = shufflevector <2 x i32> %a, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1248 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1249 ret <4 x i32> %shuffle
1250}
1251
1252define <4 x i32> @insert_reg_hi_v4i32(i64 %a, <4 x i32> %b) {
1253; SSE-LABEL: insert_reg_hi_v4i32:
1254; SSE: # BB#0:
1255; SSE-NEXT: movd %rdi, %xmm1
1256; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1257; SSE-NEXT: retq
1258;
1259; AVX-LABEL: insert_reg_hi_v4i32:
1260; AVX: # BB#0:
1261; AVX-NEXT: vmovq %rdi, %xmm1
1262; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1263; AVX-NEXT: retq
1264 %a.cast = bitcast i64 %a to <2 x i32>
1265 %v = shufflevector <2 x i32> %a.cast, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1266 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1267 ret <4 x i32> %shuffle
1268}
1269
1270define <4 x i32> @insert_mem_hi_v4i32(<2 x i32>* %ptr, <4 x i32> %b) {
1271; SSE-LABEL: insert_mem_hi_v4i32:
1272; SSE: # BB#0:
1273; SSE-NEXT: movq (%rdi), %xmm1
1274; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1275; SSE-NEXT: retq
1276;
1277; AVX-LABEL: insert_mem_hi_v4i32:
1278; AVX: # BB#0:
1279; AVX-NEXT: vmovq (%rdi), %xmm1
1280; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1281; AVX-NEXT: retq
1282 %a = load <2 x i32>* %ptr
1283 %v = shufflevector <2 x i32> %a, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1284 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1285 ret <4 x i32> %shuffle
1286}
1287
1288define <4 x float> @insert_reg_lo_v4f32(double %a, <4 x float> %b) {
1289; SSE-LABEL: insert_reg_lo_v4f32:
1290; SSE: # BB#0:
1291; SSE-NEXT: movsd %xmm0, %xmm1
1292; SSE-NEXT: movaps %xmm1, %xmm0
1293; SSE-NEXT: retq
1294;
1295; AVX-LABEL: insert_reg_lo_v4f32:
1296; AVX: # BB#0:
1297; AVX-NEXT: vmovsd %xmm0, %xmm1, %xmm0
1298; AVX-NEXT: retq
1299 %a.cast = bitcast double %a to <2 x float>
1300 %v = shufflevector <2 x float> %a.cast, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1301 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1302 ret <4 x float> %shuffle
1303}
1304
1305define <4 x float> @insert_mem_lo_v4f32(<2 x float>* %ptr, <4 x float> %b) {
1306; SSE-LABEL: insert_mem_lo_v4f32:
1307; SSE: # BB#0:
1308; SSE-NEXT: movlpd (%rdi), %xmm0
1309; SSE-NEXT: retq
1310;
1311; AVX-LABEL: insert_mem_lo_v4f32:
1312; AVX: # BB#0:
1313; AVX-NEXT: vmovlpd (%rdi), %xmm0, %xmm0
1314; AVX-NEXT: retq
1315 %a = load <2 x float>* %ptr
1316 %v = shufflevector <2 x float> %a, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1317 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1318 ret <4 x float> %shuffle
1319}
1320
1321define <4 x float> @insert_reg_hi_v4f32(double %a, <4 x float> %b) {
1322; SSE-LABEL: insert_reg_hi_v4f32:
1323; SSE: # BB#0:
1324; SSE-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1325; SSE-NEXT: movapd %xmm1, %xmm0
1326; SSE-NEXT: retq
1327;
1328; AVX-LABEL: insert_reg_hi_v4f32:
1329; AVX: # BB#0:
1330; AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1331; AVX-NEXT: retq
1332 %a.cast = bitcast double %a to <2 x float>
1333 %v = shufflevector <2 x float> %a.cast, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1334 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1335 ret <4 x float> %shuffle
1336}
1337
1338define <4 x float> @insert_mem_hi_v4f32(<2 x float>* %ptr, <4 x float> %b) {
1339; SSE-LABEL: insert_mem_hi_v4f32:
1340; SSE: # BB#0:
1341; SSE-NEXT: movhpd (%rdi), %xmm0
1342; SSE-NEXT: retq
1343;
1344; AVX-LABEL: insert_mem_hi_v4f32:
1345; AVX: # BB#0:
1346; AVX-NEXT: vmovhpd (%rdi), %xmm0, %xmm0
1347; AVX-NEXT: retq
1348 %a = load <2 x float>* %ptr
1349 %v = shufflevector <2 x float> %a, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1350 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1351 ret <4 x float> %shuffle
1352}
1353
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001354define <4 x float> @shuffle_mem_v4f32_3210(<4 x float>* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001355; SSE-LABEL: shuffle_mem_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001356; SSE: # BB#0:
1357; SSE-NEXT: movaps (%rdi), %xmm0
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001358; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001359; SSE-NEXT: retq
1360;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001361; AVX-LABEL: shuffle_mem_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001362; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001363; AVX-NEXT: vpermilps {{.*#+}} xmm0 = mem[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001364; AVX-NEXT: retq
1365 %a = load <4 x float>* %ptr
1366 %shuffle = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
1367 ret <4 x float> %shuffle
1368}