blob: 53fb09e324286eb7fd500ffd64a21de3e4f1b07f [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 Carruth0adda1e2014-10-03 21:38:49 +0000441; SSE2-LABEL: shuffle_v4f32_4zzz:
442; SSE2: # BB#0:
443; SSE2-NEXT: xorps %xmm1, %xmm1
444; SSE2-NEXT: movss %xmm0, %xmm1
445; SSE2-NEXT: movaps %xmm1, %xmm0
446; SSE2-NEXT: retq
447;
448; SSE3-LABEL: shuffle_v4f32_4zzz:
449; SSE3: # BB#0:
450; SSE3-NEXT: xorps %xmm1, %xmm1
451; SSE3-NEXT: movss %xmm0, %xmm1
452; SSE3-NEXT: movaps %xmm1, %xmm0
453; SSE3-NEXT: retq
454;
455; SSSE3-LABEL: shuffle_v4f32_4zzz:
456; SSSE3: # BB#0:
457; SSSE3-NEXT: xorps %xmm1, %xmm1
458; SSSE3-NEXT: movss %xmm0, %xmm1
459; SSSE3-NEXT: movaps %xmm1, %xmm0
460; SSSE3-NEXT: retq
461;
462; SSE41-LABEL: shuffle_v4f32_4zzz:
463; SSE41: # BB#0:
464; SSE41-NEXT: xorps %xmm1, %xmm1
Craig Topper12f0d9e2014-11-05 06:43:02 +0000465; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
Chandler Carruth0adda1e2014-10-03 21:38:49 +0000466; SSE41-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000467;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000468; AVX-LABEL: shuffle_v4f32_4zzz:
469; AVX: # BB#0:
470; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
Chandler Carruth0adda1e2014-10-03 21:38:49 +0000471; 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
Craig Topper12f0d9e2014-11-05 06:43:02 +0000613; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000614; SSE41-NEXT: retq
615;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000616; AVX-LABEL: shuffle_v4f32_zzz7:
617; AVX: # BB#0:
618; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
619; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000620; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000621 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
622 ret <4 x float> %shuffle
623}
624
625define <4 x float> @shuffle_v4f32_z6zz(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000626; SSE2-LABEL: shuffle_v4f32_z6zz:
627; SSE2: # BB#0:
628; SSE2-NEXT: xorps %xmm1, %xmm1
629; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
630; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000631; SSE2-NEXT: retq
632;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000633; SSE3-LABEL: shuffle_v4f32_z6zz:
634; SSE3: # BB#0:
635; SSE3-NEXT: xorps %xmm1, %xmm1
636; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
637; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000638; SSE3-NEXT: retq
639;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000640; SSSE3-LABEL: shuffle_v4f32_z6zz:
641; SSSE3: # BB#0:
642; SSSE3-NEXT: xorps %xmm1, %xmm1
643; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
644; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000645; SSSE3-NEXT: retq
646;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000647; SSE41-LABEL: shuffle_v4f32_z6zz:
648; SSE41: # BB#0:
649; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
Chandler Carruthfc0db222014-09-04 01:13:48 +0000650; SSE41-NEXT: retq
651;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000652; AVX-LABEL: shuffle_v4f32_z6zz:
653; AVX: # BB#0:
654; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
Chandler Carruth78a761c2014-09-20 18:36:39 +0000655; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000656 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
657 ret <4 x float> %shuffle
658}
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000659
Chandler Carruth080cab92014-10-03 11:16:45 +0000660define <4 x i32> @shuffle_v4i32_4zzz(<4 x i32> %a) {
Chandler Carruth0adda1e2014-10-03 21:38:49 +0000661; SSE2-LABEL: shuffle_v4i32_4zzz:
662; SSE2: # BB#0:
663; SSE2-NEXT: xorps %xmm1, %xmm1
664; SSE2-NEXT: movss %xmm0, %xmm1
665; SSE2-NEXT: movaps %xmm1, %xmm0
666; SSE2-NEXT: retq
667;
668; SSE3-LABEL: shuffle_v4i32_4zzz:
669; SSE3: # BB#0:
670; SSE3-NEXT: xorps %xmm1, %xmm1
671; SSE3-NEXT: movss %xmm0, %xmm1
672; SSE3-NEXT: movaps %xmm1, %xmm0
673; SSE3-NEXT: retq
674;
675; SSSE3-LABEL: shuffle_v4i32_4zzz:
676; SSSE3: # BB#0:
677; SSSE3-NEXT: xorps %xmm1, %xmm1
678; SSSE3-NEXT: movss %xmm0, %xmm1
679; SSSE3-NEXT: movaps %xmm1, %xmm0
680; SSSE3-NEXT: retq
681;
682; SSE41-LABEL: shuffle_v4i32_4zzz:
683; SSE41: # BB#0:
Simon Pilgrim6b988ad2014-12-02 22:31:23 +0000684; SSE41-NEXT: pxor %xmm1, %xmm1
685; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
Chandler Carruth0adda1e2014-10-03 21:38:49 +0000686; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000687;
Chandler Carruth971a5602014-10-03 11:25:58 +0000688; AVX-LABEL: shuffle_v4i32_4zzz:
689; AVX: # BB#0:
Simon Pilgrim6b988ad2014-12-02 22:31:23 +0000690; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
691; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
Chandler Carruth971a5602014-10-03 11:25:58 +0000692; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000693 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
694 ret <4 x i32> %shuffle
695}
696
Chandler Carruth080cab92014-10-03 11:16:45 +0000697define <4 x i32> @shuffle_v4i32_z4zz(<4 x i32> %a) {
Chandler Carruth0adda1e2014-10-03 21:38:49 +0000698; SSE2-LABEL: shuffle_v4i32_z4zz:
699; SSE2: # BB#0:
700; SSE2-NEXT: xorps %xmm1, %xmm1
701; SSE2-NEXT: movss %xmm0, %xmm1
702; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
703; SSE2-NEXT: retq
704;
705; SSE3-LABEL: shuffle_v4i32_z4zz:
706; SSE3: # BB#0:
707; SSE3-NEXT: xorps %xmm1, %xmm1
708; SSE3-NEXT: movss %xmm0, %xmm1
709; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
710; SSE3-NEXT: retq
711;
712; SSSE3-LABEL: shuffle_v4i32_z4zz:
713; SSSE3: # BB#0:
714; SSSE3-NEXT: xorps %xmm1, %xmm1
715; SSSE3-NEXT: movss %xmm0, %xmm1
716; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
717; SSSE3-NEXT: retq
718;
719; SSE41-LABEL: shuffle_v4i32_z4zz:
720; SSE41: # BB#0:
Simon Pilgrim6b988ad2014-12-02 22:31:23 +0000721; SSE41-NEXT: pxor %xmm1, %xmm1
722; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
Chandler Carruth0adda1e2014-10-03 21:38:49 +0000723; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
724; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000725;
726; AVX-LABEL: shuffle_v4i32_z4zz:
727; AVX: # BB#0:
Simon Pilgrim6b988ad2014-12-02 22:31:23 +0000728; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
729; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
Chandler Carruth971a5602014-10-03 11:25:58 +0000730; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000731; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000732 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 2, i32 4, i32 3, i32 0>
733 ret <4 x i32> %shuffle
734}
735
Chandler Carruth080cab92014-10-03 11:16:45 +0000736define <4 x i32> @shuffle_v4i32_zz4z(<4 x i32> %a) {
Chandler Carruth0adda1e2014-10-03 21:38:49 +0000737; SSE2-LABEL: shuffle_v4i32_zz4z:
738; SSE2: # BB#0:
739; SSE2-NEXT: xorps %xmm1, %xmm1
740; SSE2-NEXT: movss %xmm0, %xmm1
741; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
742; SSE2-NEXT: retq
743;
744; SSE3-LABEL: shuffle_v4i32_zz4z:
745; SSE3: # BB#0:
746; SSE3-NEXT: xorps %xmm1, %xmm1
747; SSE3-NEXT: movss %xmm0, %xmm1
748; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
749; SSE3-NEXT: retq
750;
751; SSSE3-LABEL: shuffle_v4i32_zz4z:
752; SSSE3: # BB#0:
753; SSSE3-NEXT: xorps %xmm1, %xmm1
754; SSSE3-NEXT: movss %xmm0, %xmm1
755; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
756; SSSE3-NEXT: retq
757;
758; SSE41-LABEL: shuffle_v4i32_zz4z:
759; SSE41: # BB#0:
Simon Pilgrim6b988ad2014-12-02 22:31:23 +0000760; SSE41-NEXT: pxor %xmm1, %xmm1
761; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
Chandler Carruth0adda1e2014-10-03 21:38:49 +0000762; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
763; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000764;
765; AVX-LABEL: shuffle_v4i32_zz4z:
766; AVX: # BB#0:
Simon Pilgrim6b988ad2014-12-02 22:31:23 +0000767; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
768; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
Chandler Carruth971a5602014-10-03 11:25:58 +0000769; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,0,1]
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000770; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000771 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 0, i32 4, i32 0>
772 ret <4 x i32> %shuffle
773}
774
Chandler Carruth080cab92014-10-03 11:16:45 +0000775define <4 x i32> @shuffle_v4i32_zuu4(<4 x i32> %a) {
Chandler Carruth1d7d7aa2014-12-07 17:15:53 +0000776; SSE-LABEL: shuffle_v4i32_zuu4:
777; SSE: # BB#0:
778; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3]
779; SSE-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000780;
781; AVX-LABEL: shuffle_v4i32_zuu4:
782; AVX: # BB#0:
Simon Pilgrim371417d2014-11-25 22:34:59 +0000783; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3]
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000784; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000785 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 4>
786 ret <4 x i32> %shuffle
787}
788
Chandler Carruth080cab92014-10-03 11:16:45 +0000789define <4 x i32> @shuffle_v4i32_z6zz(<4 x i32> %a) {
790; SSE2-LABEL: shuffle_v4i32_z6zz:
791; SSE2: # BB#0:
792; SSE2-NEXT: xorps %xmm1, %xmm1
793; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
794; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
795; SSE2-NEXT: retq
796;
797; SSE3-LABEL: shuffle_v4i32_z6zz:
798; SSE3: # BB#0:
799; SSE3-NEXT: xorps %xmm1, %xmm1
800; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
801; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
802; SSE3-NEXT: retq
803;
804; SSSE3-LABEL: shuffle_v4i32_z6zz:
805; SSSE3: # BB#0:
806; SSSE3-NEXT: xorps %xmm1, %xmm1
807; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
808; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
809; SSSE3-NEXT: retq
810;
811; SSE41-LABEL: shuffle_v4i32_z6zz:
812; SSE41: # BB#0:
813; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
814; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000815;
816; AVX-LABEL: shuffle_v4i32_z6zz:
817; AVX: # BB#0:
Chandler Carruth080cab92014-10-03 11:16:45 +0000818; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000819; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000820 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
821 ret <4 x i32> %shuffle
822}
Chandler Carruth9057fca2014-09-18 09:00:25 +0000823
824define <4 x i32> @shuffle_v4i32_7012(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000825; SSE2-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000826; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000827; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
828; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000829; SSE2-NEXT: movaps %xmm1, %xmm0
830; SSE2-NEXT: retq
831;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000832; SSE3-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000833; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000834; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
835; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000836; SSE3-NEXT: movaps %xmm1, %xmm0
837; SSE3-NEXT: retq
838;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000839; SSSE3-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000840; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000841; 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 +0000842; SSSE3-NEXT: retq
843;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000844; SSE41-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000845; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000846; 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 +0000847; SSE41-NEXT: retq
848;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000849; AVX-LABEL: shuffle_v4i32_7012:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000850; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000851; 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 +0000852; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000853 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
854 ret <4 x i32> %shuffle
855}
856
857define <4 x i32> @shuffle_v4i32_6701(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000858; SSE2-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000859; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000860; SSE2-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000861; SSE2-NEXT: movapd %xmm1, %xmm0
862; SSE2-NEXT: retq
863;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000864; SSE3-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000865; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000866; SSE3-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000867; SSE3-NEXT: movapd %xmm1, %xmm0
868; SSE3-NEXT: retq
869;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000870; SSSE3-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000871; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000872; 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 +0000873; SSSE3-NEXT: retq
874;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000875; SSE41-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000876; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000877; 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 +0000878; SSE41-NEXT: retq
879;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000880; AVX-LABEL: shuffle_v4i32_6701:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000881; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000882; 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 +0000883; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000884 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
885 ret <4 x i32> %shuffle
886}
887
888define <4 x i32> @shuffle_v4i32_5670(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000889; SSE2-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000890; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000891; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
892; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000893; SSE2-NEXT: movaps %xmm1, %xmm0
894; SSE2-NEXT: retq
895;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000896; SSE3-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000897; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000898; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
899; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000900; SSE3-NEXT: movaps %xmm1, %xmm0
901; SSE3-NEXT: retq
902;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000903; SSSE3-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000904; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000905; 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 +0000906; SSSE3-NEXT: retq
907;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000908; SSE41-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000909; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000910; 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 +0000911; SSE41-NEXT: retq
912;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000913; AVX-LABEL: shuffle_v4i32_5670:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000914; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000915; 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 +0000916; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000917 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
918 ret <4 x i32> %shuffle
919}
920
921define <4 x i32> @shuffle_v4i32_1234(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000922; SSE2-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000923; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000924; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
925; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000926; SSE2-NEXT: retq
927;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000928; SSE3-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000929; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000930; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
931; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000932; SSE3-NEXT: retq
933;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000934; SSSE3-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000935; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000936; 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 +0000937; SSSE3-NEXT: movdqa %xmm1, %xmm0
938; SSSE3-NEXT: retq
939;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000940; SSE41-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000941; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000942; 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 +0000943; SSE41-NEXT: movdqa %xmm1, %xmm0
944; SSE41-NEXT: retq
945;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000946; AVX-LABEL: shuffle_v4i32_1234:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000947; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000948; 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 +0000949; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000950 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
951 ret <4 x i32> %shuffle
952}
953
954define <4 x i32> @shuffle_v4i32_2345(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000955; SSE2-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000956; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000957; SSE2-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000958; SSE2-NEXT: retq
959;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000960; SSE3-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000961; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000962; SSE3-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000963; SSE3-NEXT: retq
964;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000965; SSSE3-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000966; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000967; 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 +0000968; SSSE3-NEXT: movdqa %xmm1, %xmm0
969; SSSE3-NEXT: retq
970;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000971; SSE41-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000972; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000973; 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 +0000974; SSE41-NEXT: movdqa %xmm1, %xmm0
975; SSE41-NEXT: retq
976;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000977; AVX-LABEL: shuffle_v4i32_2345:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000978; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000979; 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 +0000980; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000981 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
982 ret <4 x i32> %shuffle
983}
984
985define <4 x i32> @shuffle_v4i32_3456(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000986; SSE2-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000987; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000988; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
989; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000990; SSE2-NEXT: retq
991;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000992; SSE3-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000993; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000994; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
995; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000996; SSE3-NEXT: retq
997;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000998; SSSE3-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000999; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001000; 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 +00001001; SSSE3-NEXT: movdqa %xmm1, %xmm0
1002; SSSE3-NEXT: retq
1003;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001004; SSE41-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +00001005; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001006; 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 +00001007; SSE41-NEXT: movdqa %xmm1, %xmm0
1008; SSE41-NEXT: retq
1009;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001010; AVX-LABEL: shuffle_v4i32_3456:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001011; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001012; 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 +00001013; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +00001014 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
1015 ret <4 x i32> %shuffle
1016}
Chandler Carruth2e275142014-09-19 08:37:44 +00001017
1018define <4 x i32> @shuffle_v4i32_0u1u(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth846baf22014-10-01 02:25:54 +00001019; SSE2-LABEL: shuffle_v4i32_0u1u:
1020; SSE2: # BB#0:
1021; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1022; SSE2-NEXT: retq
1023;
1024; SSE3-LABEL: shuffle_v4i32_0u1u:
1025; SSE3: # BB#0:
1026; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1027; SSE3-NEXT: retq
1028;
1029; SSSE3-LABEL: shuffle_v4i32_0u1u:
1030; SSSE3: # BB#0:
1031; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
1032; SSSE3-NEXT: retq
1033;
1034; SSE41-LABEL: shuffle_v4i32_0u1u:
1035; SSE41: # BB#0:
1036; SSE41-NEXT: pmovzxdq %xmm0, %xmm0
1037; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001038;
1039; AVX-LABEL: shuffle_v4i32_0u1u:
1040; AVX: # BB#0:
Chandler Carruth846baf22014-10-01 02:25:54 +00001041; AVX-NEXT: vpmovzxdq %xmm0, %xmm0
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001042; AVX-NEXT: retq
Chandler Carruth2e275142014-09-19 08:37:44 +00001043 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 undef, i32 1, i32 undef>
1044 ret <4 x i32> %shuffle
1045}
1046
1047define <4 x i32> @shuffle_v4i32_0z1z(<4 x i32> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001048; SSE2-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +00001049; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001050; SSE2-NEXT: pxor %xmm1, %xmm1
1051; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Chandler Carruth2e275142014-09-19 08:37:44 +00001052; SSE2-NEXT: retq
1053;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001054; SSE3-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +00001055; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001056; SSE3-NEXT: pxor %xmm1, %xmm1
1057; SSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Chandler Carruth2e275142014-09-19 08:37:44 +00001058; SSE3-NEXT: retq
1059;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001060; SSSE3-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +00001061; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001062; SSSE3-NEXT: pxor %xmm1, %xmm1
1063; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Chandler Carruth2e275142014-09-19 08:37:44 +00001064; SSSE3-NEXT: retq
1065;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001066; SSE41-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +00001067; SSE41: # BB#0:
1068; SSE41-NEXT: pmovzxdq %xmm0, %xmm0
1069; SSE41-NEXT: retq
1070;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001071; AVX-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001072; AVX: # BB#0:
1073; AVX-NEXT: vpmovzxdq %xmm0, %xmm0
1074; AVX-NEXT: retq
Chandler Carruth2e275142014-09-19 08:37:44 +00001075 %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
1076 ret <4 x i32> %shuffle
1077}
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001078
1079define <4 x i32> @insert_reg_and_zero_v4i32(i32 %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001080; SSE-LABEL: insert_reg_and_zero_v4i32:
1081; SSE: # BB#0:
1082; SSE-NEXT: movd %edi, %xmm0
1083; SSE-NEXT: retq
1084;
1085; AVX-LABEL: insert_reg_and_zero_v4i32:
1086; AVX: # BB#0:
1087; AVX-NEXT: vmovd %edi, %xmm0
1088; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001089 %v = insertelement <4 x i32> undef, i32 %a, i32 0
1090 %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1091 ret <4 x i32> %shuffle
1092}
1093
1094define <4 x i32> @insert_mem_and_zero_v4i32(i32* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001095; SSE-LABEL: insert_mem_and_zero_v4i32:
1096; SSE: # BB#0:
1097; SSE-NEXT: movd (%rdi), %xmm0
1098; SSE-NEXT: retq
1099;
1100; AVX-LABEL: insert_mem_and_zero_v4i32:
1101; AVX: # BB#0:
1102; AVX-NEXT: vmovd (%rdi), %xmm0
1103; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001104 %a = load i32* %ptr
1105 %v = insertelement <4 x i32> undef, i32 %a, i32 0
1106 %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1107 ret <4 x i32> %shuffle
1108}
1109
1110define <4 x float> @insert_reg_and_zero_v4f32(float %a) {
Chandler Carruth0adda1e2014-10-03 21:38:49 +00001111; SSE2-LABEL: insert_reg_and_zero_v4f32:
1112; SSE2: # BB#0:
1113; SSE2-NEXT: xorps %xmm1, %xmm1
1114; SSE2-NEXT: movss %xmm0, %xmm1
1115; SSE2-NEXT: movaps %xmm1, %xmm0
1116; SSE2-NEXT: retq
1117;
1118; SSE3-LABEL: insert_reg_and_zero_v4f32:
1119; SSE3: # BB#0:
1120; SSE3-NEXT: xorps %xmm1, %xmm1
1121; SSE3-NEXT: movss %xmm0, %xmm1
1122; SSE3-NEXT: movaps %xmm1, %xmm0
1123; SSE3-NEXT: retq
1124;
1125; SSSE3-LABEL: insert_reg_and_zero_v4f32:
1126; SSSE3: # BB#0:
1127; SSSE3-NEXT: xorps %xmm1, %xmm1
1128; SSSE3-NEXT: movss %xmm0, %xmm1
1129; SSSE3-NEXT: movaps %xmm1, %xmm0
1130; SSSE3-NEXT: retq
1131;
1132; SSE41-LABEL: insert_reg_and_zero_v4f32:
1133; SSE41: # BB#0:
1134; SSE41-NEXT: xorps %xmm1, %xmm1
Craig Topper12f0d9e2014-11-05 06:43:02 +00001135; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
Chandler Carruth0adda1e2014-10-03 21:38:49 +00001136; SSE41-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001137;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001138; AVX-LABEL: insert_reg_and_zero_v4f32:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001139; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001140; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
1141; AVX-NEXT: vmovss %xmm0, %xmm1, %xmm0
Chandler Carruth78a761c2014-09-20 18:36:39 +00001142; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001143 %v = insertelement <4 x float> undef, float %a, i32 0
1144 %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1145 ret <4 x float> %shuffle
1146}
1147
1148define <4 x float> @insert_mem_and_zero_v4f32(float* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001149; SSE-LABEL: insert_mem_and_zero_v4f32:
1150; SSE: # BB#0:
1151; SSE-NEXT: movss (%rdi), %xmm0
1152; SSE-NEXT: retq
1153;
1154; AVX-LABEL: insert_mem_and_zero_v4f32:
1155; AVX: # BB#0:
1156; AVX-NEXT: vmovss (%rdi), %xmm0
1157; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001158 %a = load float* %ptr
1159 %v = insertelement <4 x float> undef, float %a, i32 0
1160 %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1161 ret <4 x float> %shuffle
1162}
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001163
Chandler Carruth75e182b2014-10-02 21:37:14 +00001164define <4 x i32> @insert_reg_lo_v4i32(i64 %a, <4 x i32> %b) {
1165; SSE2-LABEL: insert_reg_lo_v4i32:
1166; SSE2: # BB#0:
1167; SSE2-NEXT: movd %rdi, %xmm1
1168; SSE2-NEXT: movsd %xmm1, %xmm0
1169; SSE2-NEXT: retq
1170;
1171; SSE3-LABEL: insert_reg_lo_v4i32:
1172; SSE3: # BB#0:
1173; SSE3-NEXT: movd %rdi, %xmm1
1174; SSE3-NEXT: movsd %xmm1, %xmm0
1175; SSE3-NEXT: retq
1176;
1177; SSSE3-LABEL: insert_reg_lo_v4i32:
1178; SSSE3: # BB#0:
1179; SSSE3-NEXT: movd %rdi, %xmm1
1180; SSSE3-NEXT: movsd %xmm1, %xmm0
1181; SSSE3-NEXT: retq
1182;
1183; SSE41-LABEL: insert_reg_lo_v4i32:
1184; SSE41: # BB#0:
1185; SSE41-NEXT: movd %rdi, %xmm1
Craig Topper12f0d9e2014-11-05 06:43:02 +00001186; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
Chandler Carruth75e182b2014-10-02 21:37:14 +00001187; SSE41-NEXT: retq
1188;
1189; AVX1-LABEL: insert_reg_lo_v4i32:
1190; AVX1: # BB#0:
1191; AVX1-NEXT: vmovq %rdi, %xmm1
1192; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1193; AVX1-NEXT: retq
1194;
1195; AVX2-LABEL: insert_reg_lo_v4i32:
1196; AVX2: # BB#0:
1197; AVX2-NEXT: vmovq %rdi, %xmm1
1198; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1199; AVX2-NEXT: retq
1200 %a.cast = bitcast i64 %a to <2 x i32>
1201 %v = shufflevector <2 x i32> %a.cast, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1202 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1203 ret <4 x i32> %shuffle
1204}
1205
1206define <4 x i32> @insert_mem_lo_v4i32(<2 x i32>* %ptr, <4 x i32> %b) {
1207; SSE2-LABEL: insert_mem_lo_v4i32:
1208; SSE2: # BB#0:
1209; SSE2-NEXT: movlpd (%rdi), %xmm0
1210; SSE2-NEXT: retq
1211;
1212; SSE3-LABEL: insert_mem_lo_v4i32:
1213; SSE3: # BB#0:
1214; SSE3-NEXT: movlpd (%rdi), %xmm0
1215; SSE3-NEXT: retq
1216;
1217; SSSE3-LABEL: insert_mem_lo_v4i32:
1218; SSSE3: # BB#0:
1219; SSSE3-NEXT: movlpd (%rdi), %xmm0
1220; SSSE3-NEXT: retq
1221;
1222; SSE41-LABEL: insert_mem_lo_v4i32:
1223; SSE41: # BB#0:
1224; SSE41-NEXT: movq (%rdi), %xmm1
Craig Topper12f0d9e2014-11-05 06:43:02 +00001225; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
Chandler Carruth75e182b2014-10-02 21:37:14 +00001226; SSE41-NEXT: retq
1227;
1228; AVX1-LABEL: insert_mem_lo_v4i32:
1229; AVX1: # BB#0:
1230; AVX1-NEXT: vmovq (%rdi), %xmm1
1231; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1232; AVX1-NEXT: retq
1233;
1234; AVX2-LABEL: insert_mem_lo_v4i32:
1235; AVX2: # BB#0:
1236; AVX2-NEXT: vmovq (%rdi), %xmm1
1237; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1238; AVX2-NEXT: retq
1239 %a = load <2 x i32>* %ptr
1240 %v = shufflevector <2 x i32> %a, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1241 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1242 ret <4 x i32> %shuffle
1243}
1244
1245define <4 x i32> @insert_reg_hi_v4i32(i64 %a, <4 x i32> %b) {
1246; SSE-LABEL: insert_reg_hi_v4i32:
1247; SSE: # BB#0:
1248; SSE-NEXT: movd %rdi, %xmm1
1249; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1250; SSE-NEXT: retq
1251;
1252; AVX-LABEL: insert_reg_hi_v4i32:
1253; AVX: # BB#0:
1254; AVX-NEXT: vmovq %rdi, %xmm1
1255; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1256; AVX-NEXT: retq
1257 %a.cast = bitcast i64 %a to <2 x i32>
1258 %v = shufflevector <2 x i32> %a.cast, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1259 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1260 ret <4 x i32> %shuffle
1261}
1262
1263define <4 x i32> @insert_mem_hi_v4i32(<2 x i32>* %ptr, <4 x i32> %b) {
1264; SSE-LABEL: insert_mem_hi_v4i32:
1265; SSE: # BB#0:
1266; SSE-NEXT: movq (%rdi), %xmm1
1267; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1268; SSE-NEXT: retq
1269;
1270; AVX-LABEL: insert_mem_hi_v4i32:
1271; AVX: # BB#0:
1272; AVX-NEXT: vmovq (%rdi), %xmm1
1273; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1274; AVX-NEXT: retq
1275 %a = load <2 x i32>* %ptr
1276 %v = shufflevector <2 x i32> %a, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1277 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1278 ret <4 x i32> %shuffle
1279}
1280
1281define <4 x float> @insert_reg_lo_v4f32(double %a, <4 x float> %b) {
1282; SSE-LABEL: insert_reg_lo_v4f32:
1283; SSE: # BB#0:
1284; SSE-NEXT: movsd %xmm0, %xmm1
1285; SSE-NEXT: movaps %xmm1, %xmm0
1286; SSE-NEXT: retq
1287;
1288; AVX-LABEL: insert_reg_lo_v4f32:
1289; AVX: # BB#0:
1290; AVX-NEXT: vmovsd %xmm0, %xmm1, %xmm0
1291; AVX-NEXT: retq
1292 %a.cast = bitcast double %a to <2 x float>
1293 %v = shufflevector <2 x float> %a.cast, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1294 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1295 ret <4 x float> %shuffle
1296}
1297
1298define <4 x float> @insert_mem_lo_v4f32(<2 x float>* %ptr, <4 x float> %b) {
1299; SSE-LABEL: insert_mem_lo_v4f32:
1300; SSE: # BB#0:
1301; SSE-NEXT: movlpd (%rdi), %xmm0
1302; SSE-NEXT: retq
1303;
1304; AVX-LABEL: insert_mem_lo_v4f32:
1305; AVX: # BB#0:
1306; AVX-NEXT: vmovlpd (%rdi), %xmm0, %xmm0
1307; AVX-NEXT: retq
1308 %a = load <2 x float>* %ptr
1309 %v = shufflevector <2 x float> %a, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1310 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1311 ret <4 x float> %shuffle
1312}
1313
1314define <4 x float> @insert_reg_hi_v4f32(double %a, <4 x float> %b) {
1315; SSE-LABEL: insert_reg_hi_v4f32:
1316; SSE: # BB#0:
1317; SSE-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1318; SSE-NEXT: movapd %xmm1, %xmm0
1319; SSE-NEXT: retq
1320;
1321; AVX-LABEL: insert_reg_hi_v4f32:
1322; AVX: # BB#0:
1323; AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1324; AVX-NEXT: retq
1325 %a.cast = bitcast double %a to <2 x float>
1326 %v = shufflevector <2 x float> %a.cast, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1327 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1328 ret <4 x float> %shuffle
1329}
1330
1331define <4 x float> @insert_mem_hi_v4f32(<2 x float>* %ptr, <4 x float> %b) {
1332; SSE-LABEL: insert_mem_hi_v4f32:
1333; SSE: # BB#0:
1334; SSE-NEXT: movhpd (%rdi), %xmm0
1335; SSE-NEXT: retq
1336;
1337; AVX-LABEL: insert_mem_hi_v4f32:
1338; AVX: # BB#0:
1339; AVX-NEXT: vmovhpd (%rdi), %xmm0, %xmm0
1340; AVX-NEXT: retq
1341 %a = load <2 x float>* %ptr
1342 %v = shufflevector <2 x float> %a, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1343 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1344 ret <4 x float> %shuffle
1345}
1346
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001347define <4 x float> @shuffle_mem_v4f32_3210(<4 x float>* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001348; SSE-LABEL: shuffle_mem_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001349; SSE: # BB#0:
1350; SSE-NEXT: movaps (%rdi), %xmm0
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001351; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001352; SSE-NEXT: retq
1353;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001354; AVX-LABEL: shuffle_mem_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001355; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001356; AVX-NEXT: vpermilps {{.*#+}} xmm0 = mem[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001357; AVX-NEXT: retq
1358 %a = load <4 x float>* %ptr
1359 %shuffle = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
1360 ret <4 x float> %shuffle
1361}