blob: 833b822570008ed65df831789a03e1bba199490c [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:
684; SSE41-NEXT: xorps %xmm1, %xmm1
Craig Topper12f0d9e2014-11-05 06:43:02 +0000685; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
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:
690; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
Chandler Carruth0adda1e2014-10-03 21:38:49 +0000691; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
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:
721; SSE41-NEXT: xorps %xmm1, %xmm1
722; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
723; 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:
Chandler Carruth971a5602014-10-03 11:25:58 +0000728; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
Chandler Carruth0adda1e2014-10-03 21:38:49 +0000729; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
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:
760; SSE41-NEXT: xorps %xmm1, %xmm1
761; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
762; 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:
Chandler Carruth971a5602014-10-03 11:25:58 +0000767; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
Chandler Carruth0adda1e2014-10-03 21:38:49 +0000768; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
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 Carruth0adda1e2014-10-03 21:38:49 +0000776; SSE2-LABEL: shuffle_v4i32_zuu4:
777; SSE2: # BB#0:
778; SSE2-NEXT: xorps %xmm1, %xmm1
779; SSE2-NEXT: movss %xmm0, %xmm1
780; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,0]
781; SSE2-NEXT: retq
782;
783; SSE3-LABEL: shuffle_v4i32_zuu4:
784; SSE3: # BB#0:
785; SSE3-NEXT: xorps %xmm1, %xmm1
786; SSE3-NEXT: movss %xmm0, %xmm1
787; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,0]
788; SSE3-NEXT: retq
789;
790; SSSE3-LABEL: shuffle_v4i32_zuu4:
791; SSSE3: # BB#0:
792; SSSE3-NEXT: xorps %xmm1, %xmm1
793; SSSE3-NEXT: movss %xmm0, %xmm1
794; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,0]
795; SSSE3-NEXT: retq
796;
797; SSE41-LABEL: shuffle_v4i32_zuu4:
798; SSE41: # BB#0:
799; SSE41-NEXT: xorps %xmm1, %xmm1
800; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
801; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,0]
802; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000803;
804; AVX-LABEL: shuffle_v4i32_zuu4:
805; AVX: # BB#0:
Chandler Carruth971a5602014-10-03 11:25:58 +0000806; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
Chandler Carruth0adda1e2014-10-03 21:38:49 +0000807; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
Chandler Carruth971a5602014-10-03 11:25:58 +0000808; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,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 Carruth0adda1e2014-10-03 21:38:49 +00001136; SSE2-LABEL: insert_reg_and_zero_v4f32:
1137; SSE2: # BB#0:
1138; SSE2-NEXT: xorps %xmm1, %xmm1
1139; SSE2-NEXT: movss %xmm0, %xmm1
1140; SSE2-NEXT: movaps %xmm1, %xmm0
1141; SSE2-NEXT: retq
1142;
1143; SSE3-LABEL: insert_reg_and_zero_v4f32:
1144; SSE3: # BB#0:
1145; SSE3-NEXT: xorps %xmm1, %xmm1
1146; SSE3-NEXT: movss %xmm0, %xmm1
1147; SSE3-NEXT: movaps %xmm1, %xmm0
1148; SSE3-NEXT: retq
1149;
1150; SSSE3-LABEL: insert_reg_and_zero_v4f32:
1151; SSSE3: # BB#0:
1152; SSSE3-NEXT: xorps %xmm1, %xmm1
1153; SSSE3-NEXT: movss %xmm0, %xmm1
1154; SSSE3-NEXT: movaps %xmm1, %xmm0
1155; SSSE3-NEXT: retq
1156;
1157; SSE41-LABEL: insert_reg_and_zero_v4f32:
1158; SSE41: # BB#0:
1159; SSE41-NEXT: xorps %xmm1, %xmm1
Craig Topper12f0d9e2014-11-05 06:43:02 +00001160; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
Chandler Carruth0adda1e2014-10-03 21:38:49 +00001161; SSE41-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001162;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001163; AVX-LABEL: insert_reg_and_zero_v4f32:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001164; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001165; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
1166; AVX-NEXT: vmovss %xmm0, %xmm1, %xmm0
Chandler Carruth78a761c2014-09-20 18:36:39 +00001167; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001168 %v = insertelement <4 x float> undef, float %a, i32 0
1169 %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1170 ret <4 x float> %shuffle
1171}
1172
1173define <4 x float> @insert_mem_and_zero_v4f32(float* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001174; SSE-LABEL: insert_mem_and_zero_v4f32:
1175; SSE: # BB#0:
1176; SSE-NEXT: movss (%rdi), %xmm0
1177; SSE-NEXT: retq
1178;
1179; AVX-LABEL: insert_mem_and_zero_v4f32:
1180; AVX: # BB#0:
1181; AVX-NEXT: vmovss (%rdi), %xmm0
1182; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001183 %a = load float* %ptr
1184 %v = insertelement <4 x float> undef, float %a, i32 0
1185 %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1186 ret <4 x float> %shuffle
1187}
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001188
Chandler Carruth75e182b2014-10-02 21:37:14 +00001189define <4 x i32> @insert_reg_lo_v4i32(i64 %a, <4 x i32> %b) {
1190; SSE2-LABEL: insert_reg_lo_v4i32:
1191; SSE2: # BB#0:
1192; SSE2-NEXT: movd %rdi, %xmm1
1193; SSE2-NEXT: movsd %xmm1, %xmm0
1194; SSE2-NEXT: retq
1195;
1196; SSE3-LABEL: insert_reg_lo_v4i32:
1197; SSE3: # BB#0:
1198; SSE3-NEXT: movd %rdi, %xmm1
1199; SSE3-NEXT: movsd %xmm1, %xmm0
1200; SSE3-NEXT: retq
1201;
1202; SSSE3-LABEL: insert_reg_lo_v4i32:
1203; SSSE3: # BB#0:
1204; SSSE3-NEXT: movd %rdi, %xmm1
1205; SSSE3-NEXT: movsd %xmm1, %xmm0
1206; SSSE3-NEXT: retq
1207;
1208; SSE41-LABEL: insert_reg_lo_v4i32:
1209; SSE41: # BB#0:
1210; SSE41-NEXT: movd %rdi, %xmm1
Craig Topper12f0d9e2014-11-05 06:43:02 +00001211; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
Chandler Carruth75e182b2014-10-02 21:37:14 +00001212; SSE41-NEXT: retq
1213;
1214; AVX1-LABEL: insert_reg_lo_v4i32:
1215; AVX1: # BB#0:
1216; AVX1-NEXT: vmovq %rdi, %xmm1
1217; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1218; AVX1-NEXT: retq
1219;
1220; AVX2-LABEL: insert_reg_lo_v4i32:
1221; AVX2: # BB#0:
1222; AVX2-NEXT: vmovq %rdi, %xmm1
1223; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1224; AVX2-NEXT: retq
1225 %a.cast = bitcast i64 %a to <2 x i32>
1226 %v = shufflevector <2 x i32> %a.cast, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1227 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1228 ret <4 x i32> %shuffle
1229}
1230
1231define <4 x i32> @insert_mem_lo_v4i32(<2 x i32>* %ptr, <4 x i32> %b) {
1232; SSE2-LABEL: insert_mem_lo_v4i32:
1233; SSE2: # BB#0:
1234; SSE2-NEXT: movlpd (%rdi), %xmm0
1235; SSE2-NEXT: retq
1236;
1237; SSE3-LABEL: insert_mem_lo_v4i32:
1238; SSE3: # BB#0:
1239; SSE3-NEXT: movlpd (%rdi), %xmm0
1240; SSE3-NEXT: retq
1241;
1242; SSSE3-LABEL: insert_mem_lo_v4i32:
1243; SSSE3: # BB#0:
1244; SSSE3-NEXT: movlpd (%rdi), %xmm0
1245; SSSE3-NEXT: retq
1246;
1247; SSE41-LABEL: insert_mem_lo_v4i32:
1248; SSE41: # BB#0:
1249; SSE41-NEXT: movq (%rdi), %xmm1
Craig Topper12f0d9e2014-11-05 06:43:02 +00001250; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
Chandler Carruth75e182b2014-10-02 21:37:14 +00001251; SSE41-NEXT: retq
1252;
1253; AVX1-LABEL: insert_mem_lo_v4i32:
1254; AVX1: # BB#0:
1255; AVX1-NEXT: vmovq (%rdi), %xmm1
1256; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1257; AVX1-NEXT: retq
1258;
1259; AVX2-LABEL: insert_mem_lo_v4i32:
1260; AVX2: # BB#0:
1261; AVX2-NEXT: vmovq (%rdi), %xmm1
1262; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1263; AVX2-NEXT: retq
1264 %a = load <2 x i32>* %ptr
1265 %v = shufflevector <2 x i32> %a, <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 0, i32 1, i32 6, i32 7>
1267 ret <4 x i32> %shuffle
1268}
1269
1270define <4 x i32> @insert_reg_hi_v4i32(i64 %a, <4 x i32> %b) {
1271; SSE-LABEL: insert_reg_hi_v4i32:
1272; SSE: # BB#0:
1273; SSE-NEXT: movd %rdi, %xmm1
1274; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1275; SSE-NEXT: retq
1276;
1277; AVX-LABEL: insert_reg_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.cast = bitcast i64 %a to <2 x i32>
1283 %v = shufflevector <2 x i32> %a.cast, <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 i32> @insert_mem_hi_v4i32(<2 x i32>* %ptr, <4 x i32> %b) {
1289; SSE-LABEL: insert_mem_hi_v4i32:
1290; SSE: # BB#0:
1291; SSE-NEXT: movq (%rdi), %xmm1
1292; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1293; SSE-NEXT: retq
1294;
1295; AVX-LABEL: insert_mem_hi_v4i32:
1296; AVX: # BB#0:
1297; AVX-NEXT: vmovq (%rdi), %xmm1
1298; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1299; AVX-NEXT: retq
1300 %a = load <2 x i32>* %ptr
1301 %v = shufflevector <2 x i32> %a, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1302 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1303 ret <4 x i32> %shuffle
1304}
1305
1306define <4 x float> @insert_reg_lo_v4f32(double %a, <4 x float> %b) {
1307; SSE-LABEL: insert_reg_lo_v4f32:
1308; SSE: # BB#0:
1309; SSE-NEXT: movsd %xmm0, %xmm1
1310; SSE-NEXT: movaps %xmm1, %xmm0
1311; SSE-NEXT: retq
1312;
1313; AVX-LABEL: insert_reg_lo_v4f32:
1314; AVX: # BB#0:
1315; AVX-NEXT: vmovsd %xmm0, %xmm1, %xmm0
1316; AVX-NEXT: retq
1317 %a.cast = bitcast double %a to <2 x float>
1318 %v = shufflevector <2 x float> %a.cast, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1319 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1320 ret <4 x float> %shuffle
1321}
1322
1323define <4 x float> @insert_mem_lo_v4f32(<2 x float>* %ptr, <4 x float> %b) {
1324; SSE-LABEL: insert_mem_lo_v4f32:
1325; SSE: # BB#0:
1326; SSE-NEXT: movlpd (%rdi), %xmm0
1327; SSE-NEXT: retq
1328;
1329; AVX-LABEL: insert_mem_lo_v4f32:
1330; AVX: # BB#0:
1331; AVX-NEXT: vmovlpd (%rdi), %xmm0, %xmm0
1332; AVX-NEXT: retq
1333 %a = load <2 x float>* %ptr
1334 %v = shufflevector <2 x float> %a, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1335 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1336 ret <4 x float> %shuffle
1337}
1338
1339define <4 x float> @insert_reg_hi_v4f32(double %a, <4 x float> %b) {
1340; SSE-LABEL: insert_reg_hi_v4f32:
1341; SSE: # BB#0:
1342; SSE-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1343; SSE-NEXT: movapd %xmm1, %xmm0
1344; SSE-NEXT: retq
1345;
1346; AVX-LABEL: insert_reg_hi_v4f32:
1347; AVX: # BB#0:
1348; AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1349; AVX-NEXT: retq
1350 %a.cast = bitcast double %a to <2 x float>
1351 %v = shufflevector <2 x float> %a.cast, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1352 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1353 ret <4 x float> %shuffle
1354}
1355
1356define <4 x float> @insert_mem_hi_v4f32(<2 x float>* %ptr, <4 x float> %b) {
1357; SSE-LABEL: insert_mem_hi_v4f32:
1358; SSE: # BB#0:
1359; SSE-NEXT: movhpd (%rdi), %xmm0
1360; SSE-NEXT: retq
1361;
1362; AVX-LABEL: insert_mem_hi_v4f32:
1363; AVX: # BB#0:
1364; AVX-NEXT: vmovhpd (%rdi), %xmm0, %xmm0
1365; AVX-NEXT: retq
1366 %a = load <2 x float>* %ptr
1367 %v = shufflevector <2 x float> %a, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1368 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1369 ret <4 x float> %shuffle
1370}
1371
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001372define <4 x float> @shuffle_mem_v4f32_3210(<4 x float>* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001373; SSE-LABEL: shuffle_mem_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001374; SSE: # BB#0:
1375; SSE-NEXT: movaps (%rdi), %xmm0
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001376; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001377; SSE-NEXT: retq
1378;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001379; AVX-LABEL: shuffle_mem_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001380; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001381; AVX-NEXT: vpermilps {{.*#+}} xmm0 = mem[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001382; AVX-NEXT: retq
1383 %a = load <4 x float>* %ptr
1384 %shuffle = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
1385 ret <4 x float> %shuffle
1386}