blob: f6ba5db85f33b693f527d2b51c2b89121e65dad1 [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 Carruth971a5602014-10-03 11:25:58 +0000441; SSE-LABEL: shuffle_v4f32_4zzz:
442; SSE: # BB#0:
443; SSE-NEXT: xorps %xmm1, %xmm1
444; SSE-NEXT: movss %xmm0, %xmm1
445; SSE-NEXT: movaps %xmm1, %xmm0
446; SSE-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000447;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000448; AVX-LABEL: shuffle_v4f32_4zzz:
449; AVX: # BB#0:
450; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
Chandler Carruth971a5602014-10-03 11:25:58 +0000451; AVX-NEXT: vmovss %xmm0, %xmm1, %xmm0
Chandler Carruth78a761c2014-09-20 18:36:39 +0000452; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000453 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
454 ret <4 x float> %shuffle
455}
456
457define <4 x float> @shuffle_v4f32_z4zz(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000458; SSE2-LABEL: shuffle_v4f32_z4zz:
459; SSE2: # BB#0:
460; SSE2-NEXT: xorps %xmm1, %xmm1
461; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
462; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000463; SSE2-NEXT: retq
464;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000465; SSE3-LABEL: shuffle_v4f32_z4zz:
466; SSE3: # BB#0:
467; SSE3-NEXT: xorps %xmm1, %xmm1
468; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
469; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000470; SSE3-NEXT: retq
471;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000472; SSSE3-LABEL: shuffle_v4f32_z4zz:
473; SSSE3: # BB#0:
474; SSSE3-NEXT: xorps %xmm1, %xmm1
475; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
476; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[3,0]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000477; SSSE3-NEXT: retq
478;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000479; SSE41-LABEL: shuffle_v4f32_z4zz:
480; SSE41: # BB#0:
481; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,xmm0[0],zero,zero
Chandler Carruthfc0db222014-09-04 01:13:48 +0000482; SSE41-NEXT: retq
483;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000484; AVX-LABEL: shuffle_v4f32_z4zz:
485; AVX: # BB#0:
486; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,xmm0[0],zero,zero
Chandler Carruth78a761c2014-09-20 18:36:39 +0000487; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000488 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 2, i32 4, i32 3, i32 0>
489 ret <4 x float> %shuffle
490}
491
492define <4 x float> @shuffle_v4f32_zz4z(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000493; SSE2-LABEL: shuffle_v4f32_zz4z:
494; SSE2: # BB#0:
495; SSE2-NEXT: xorps %xmm1, %xmm1
496; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
497; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
498; SSE2-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000499; SSE2-NEXT: retq
500;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000501; SSE3-LABEL: shuffle_v4f32_zz4z:
502; SSE3: # BB#0:
503; SSE3-NEXT: xorps %xmm1, %xmm1
504; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
505; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
506; SSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000507; SSE3-NEXT: retq
508;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000509; SSSE3-LABEL: shuffle_v4f32_zz4z:
510; SSSE3: # BB#0:
511; SSSE3-NEXT: xorps %xmm1, %xmm1
512; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
513; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,2]
514; SSSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000515; SSSE3-NEXT: retq
516;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000517; SSE41-LABEL: shuffle_v4f32_zz4z:
518; SSE41: # BB#0:
519; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,zero,xmm0[0],zero
Chandler Carruthfc0db222014-09-04 01:13:48 +0000520; SSE41-NEXT: retq
521;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000522; AVX-LABEL: shuffle_v4f32_zz4z:
523; AVX: # BB#0:
524; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,zero,xmm0[0],zero
Chandler Carruth78a761c2014-09-20 18:36:39 +0000525; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000526 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 0, i32 4, i32 0>
527 ret <4 x float> %shuffle
528}
529
530define <4 x float> @shuffle_v4f32_zuu4(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000531; SSE2-LABEL: shuffle_v4f32_zuu4:
532; SSE2: # BB#0:
533; SSE2-NEXT: xorps %xmm1, %xmm1
534; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
535; SSE2-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000536; SSE2-NEXT: retq
537;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000538; SSE3-LABEL: shuffle_v4f32_zuu4:
539; SSE3: # BB#0:
540; SSE3-NEXT: xorps %xmm1, %xmm1
541; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
542; SSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000543; SSE3-NEXT: retq
544;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000545; SSSE3-LABEL: shuffle_v4f32_zuu4:
546; SSSE3: # BB#0:
547; SSSE3-NEXT: xorps %xmm1, %xmm1
548; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
549; SSSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000550; SSSE3-NEXT: retq
551;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000552; SSE41-LABEL: shuffle_v4f32_zuu4:
553; SSE41: # BB#0:
554; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,zero,zero,xmm0[0]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000555; SSE41-NEXT: retq
556;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000557; AVX-LABEL: shuffle_v4f32_zuu4:
558; AVX: # BB#0:
559; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,zero,zero,xmm0[0]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000560; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000561 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 4>
562 ret <4 x float> %shuffle
563}
564
565define <4 x float> @shuffle_v4f32_zzz7(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000566; SSE2-LABEL: shuffle_v4f32_zzz7:
567; SSE2: # BB#0:
568; SSE2-NEXT: xorps %xmm1, %xmm1
569; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
570; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
571; SSE2-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000572; SSE2-NEXT: retq
573;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000574; SSE3-LABEL: shuffle_v4f32_zzz7:
575; SSE3: # BB#0:
576; SSE3-NEXT: xorps %xmm1, %xmm1
577; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
578; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
579; SSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000580; SSE3-NEXT: retq
581;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000582; SSSE3-LABEL: shuffle_v4f32_zzz7:
583; SSSE3: # BB#0:
584; SSSE3-NEXT: xorps %xmm1, %xmm1
585; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[2,0]
586; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
587; SSSE3-NEXT: movaps %xmm1, %xmm0
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000588; SSSE3-NEXT: retq
589;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000590; SSE41-LABEL: shuffle_v4f32_zzz7:
591; SSE41: # BB#0:
592; SSE41-NEXT: xorps %xmm1, %xmm1
593; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm1[0,1,2],xmm0[3]
594; SSE41-NEXT: movaps %xmm1, %xmm0
Chandler Carruthfc0db222014-09-04 01:13:48 +0000595; SSE41-NEXT: retq
596;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000597; AVX-LABEL: shuffle_v4f32_zzz7:
598; AVX: # BB#0:
599; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
600; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3]
Chandler Carruth78a761c2014-09-20 18:36:39 +0000601; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000602 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
603 ret <4 x float> %shuffle
604}
605
606define <4 x float> @shuffle_v4f32_z6zz(<4 x float> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000607; SSE2-LABEL: shuffle_v4f32_z6zz:
608; SSE2: # BB#0:
609; SSE2-NEXT: xorps %xmm1, %xmm1
610; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
611; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
Chandler Carruthfc0db222014-09-04 01:13:48 +0000612; SSE2-NEXT: retq
613;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000614; SSE3-LABEL: shuffle_v4f32_z6zz:
615; SSE3: # BB#0:
616; SSE3-NEXT: xorps %xmm1, %xmm1
617; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
618; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
Chandler Carruth00b1e0f2014-09-15 11:40:20 +0000619; SSE3-NEXT: retq
620;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000621; SSSE3-LABEL: shuffle_v4f32_z6zz:
622; SSSE3: # BB#0:
623; SSSE3-NEXT: xorps %xmm1, %xmm1
624; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
625; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
Chandler Carruthe0d77ef2014-09-18 04:38:32 +0000626; SSSE3-NEXT: retq
627;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000628; SSE41-LABEL: shuffle_v4f32_z6zz:
629; SSE41: # BB#0:
630; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
Chandler Carruthfc0db222014-09-04 01:13:48 +0000631; SSE41-NEXT: retq
632;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000633; AVX-LABEL: shuffle_v4f32_z6zz:
634; AVX: # BB#0:
635; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
Chandler Carruth78a761c2014-09-20 18:36:39 +0000636; AVX-NEXT: retq
Chandler Carruthfc0db222014-09-04 01:13:48 +0000637 %shuffle = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
638 ret <4 x float> %shuffle
639}
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000640
Chandler Carruth080cab92014-10-03 11:16:45 +0000641define <4 x i32> @shuffle_v4i32_4zzz(<4 x i32> %a) {
Chandler Carruth971a5602014-10-03 11:25:58 +0000642; SSE-LABEL: shuffle_v4i32_4zzz:
643; SSE: # BB#0:
644; SSE-NEXT: xorps %xmm1, %xmm1
645; SSE-NEXT: movss %xmm0, %xmm1
646; SSE-NEXT: movaps %xmm1, %xmm0
647; SSE-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000648;
Chandler Carruth971a5602014-10-03 11:25:58 +0000649; AVX-LABEL: shuffle_v4i32_4zzz:
650; AVX: # BB#0:
651; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
652; AVX-NEXT: vmovss %xmm0, %xmm1, %xmm0
653; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000654 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
655 ret <4 x i32> %shuffle
656}
657
Chandler Carruth080cab92014-10-03 11:16:45 +0000658define <4 x i32> @shuffle_v4i32_z4zz(<4 x i32> %a) {
Chandler Carruth971a5602014-10-03 11:25:58 +0000659; SSE-LABEL: shuffle_v4i32_z4zz:
660; SSE: # BB#0:
661; SSE-NEXT: xorps %xmm1, %xmm1
662; SSE-NEXT: movss %xmm0, %xmm1
663; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,1,1]
664; SSE-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000665;
666; AVX-LABEL: shuffle_v4i32_z4zz:
667; AVX: # BB#0:
Chandler Carruth971a5602014-10-03 11:25:58 +0000668; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
669; AVX-NEXT: vmovss %xmm0, %xmm1, %xmm0
670; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000671; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000672 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 2, i32 4, i32 3, i32 0>
673 ret <4 x i32> %shuffle
674}
675
Chandler Carruth080cab92014-10-03 11:16:45 +0000676define <4 x i32> @shuffle_v4i32_zz4z(<4 x i32> %a) {
Chandler Carruth971a5602014-10-03 11:25:58 +0000677; SSE-LABEL: shuffle_v4i32_zz4z:
678; SSE: # BB#0:
679; SSE-NEXT: xorps %xmm1, %xmm1
680; SSE-NEXT: movss %xmm0, %xmm1
681; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,0,1]
682; SSE-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000683;
684; AVX-LABEL: shuffle_v4i32_zz4z:
685; AVX: # BB#0:
Chandler Carruth971a5602014-10-03 11:25:58 +0000686; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
687; AVX-NEXT: vmovss %xmm0, %xmm1, %xmm0
688; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,0,1]
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000689; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000690 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 0, i32 4, i32 0>
691 ret <4 x i32> %shuffle
692}
693
Chandler Carruth080cab92014-10-03 11:16:45 +0000694define <4 x i32> @shuffle_v4i32_zuu4(<4 x i32> %a) {
Chandler Carruth971a5602014-10-03 11:25:58 +0000695; SSE-LABEL: shuffle_v4i32_zuu4:
696; SSE: # BB#0:
697; SSE-NEXT: xorps %xmm1, %xmm1
698; SSE-NEXT: movss %xmm0, %xmm1
699; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,0]
700; SSE-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000701;
702; AVX-LABEL: shuffle_v4i32_zuu4:
703; AVX: # BB#0:
Chandler Carruth971a5602014-10-03 11:25:58 +0000704; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
705; AVX-NEXT: vmovss %xmm0, %xmm1, %xmm0
706; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,0]
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000707; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000708 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 4>
709 ret <4 x i32> %shuffle
710}
711
Chandler Carruth080cab92014-10-03 11:16:45 +0000712define <4 x i32> @shuffle_v4i32_z6zz(<4 x i32> %a) {
713; SSE2-LABEL: shuffle_v4i32_z6zz:
714; SSE2: # BB#0:
715; SSE2-NEXT: xorps %xmm1, %xmm1
716; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
717; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
718; SSE2-NEXT: retq
719;
720; SSE3-LABEL: shuffle_v4i32_z6zz:
721; SSE3: # BB#0:
722; SSE3-NEXT: xorps %xmm1, %xmm1
723; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
724; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
725; SSE3-NEXT: retq
726;
727; SSSE3-LABEL: shuffle_v4i32_z6zz:
728; SSSE3: # BB#0:
729; SSSE3-NEXT: xorps %xmm1, %xmm1
730; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[0,0]
731; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
732; SSSE3-NEXT: retq
733;
734; SSE41-LABEL: shuffle_v4i32_z6zz:
735; SSE41: # BB#0:
736; SSE41-NEXT: insertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
737; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000738;
739; AVX-LABEL: shuffle_v4i32_z6zz:
740; AVX: # BB#0:
Chandler Carruth080cab92014-10-03 11:16:45 +0000741; AVX-NEXT: vinsertps {{.*#+}} xmm0 = zero,xmm0[2],zero,zero
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000742; AVX-NEXT: retq
Chandler Carruth2e5134f2014-09-04 09:26:30 +0000743 %shuffle = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
744 ret <4 x i32> %shuffle
745}
Chandler Carruth9057fca2014-09-18 09:00:25 +0000746
747define <4 x i32> @shuffle_v4i32_7012(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000748; SSE2-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000749; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000750; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
751; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000752; SSE2-NEXT: movaps %xmm1, %xmm0
753; SSE2-NEXT: retq
754;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000755; SSE3-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000756; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000757; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,0],xmm0[0,0]
758; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000759; SSE3-NEXT: movaps %xmm1, %xmm0
760; SSE3-NEXT: retq
761;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000762; SSSE3-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000763; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000764; 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 +0000765; SSSE3-NEXT: retq
766;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000767; SSE41-LABEL: shuffle_v4i32_7012:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000768; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000769; 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 +0000770; SSE41-NEXT: retq
771;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000772; AVX-LABEL: shuffle_v4i32_7012:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000773; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000774; 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 +0000775; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000776 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
777 ret <4 x i32> %shuffle
778}
779
780define <4 x i32> @shuffle_v4i32_6701(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000781; SSE2-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000782; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000783; SSE2-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000784; SSE2-NEXT: movapd %xmm1, %xmm0
785; SSE2-NEXT: retq
786;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000787; SSE3-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000788; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000789; SSE3-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000790; SSE3-NEXT: movapd %xmm1, %xmm0
791; SSE3-NEXT: retq
792;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000793; SSSE3-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000794; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000795; 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 +0000796; SSSE3-NEXT: retq
797;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000798; SSE41-LABEL: shuffle_v4i32_6701:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000799; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000800; 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 +0000801; SSE41-NEXT: retq
802;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000803; AVX-LABEL: shuffle_v4i32_6701:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000804; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000805; 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 +0000806; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000807 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
808 ret <4 x i32> %shuffle
809}
810
811define <4 x i32> @shuffle_v4i32_5670(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000812; SSE2-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000813; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000814; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
815; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000816; SSE2-NEXT: movaps %xmm1, %xmm0
817; SSE2-NEXT: retq
818;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000819; SSE3-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000820; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000821; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
822; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,2],xmm0[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000823; SSE3-NEXT: movaps %xmm1, %xmm0
824; SSE3-NEXT: retq
825;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000826; SSSE3-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000827; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000828; 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 +0000829; SSSE3-NEXT: retq
830;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000831; SSE41-LABEL: shuffle_v4i32_5670:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000832; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000833; 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 +0000834; SSE41-NEXT: retq
835;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000836; AVX-LABEL: shuffle_v4i32_5670:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000837; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000838; 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 +0000839; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000840 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
841 ret <4 x i32> %shuffle
842}
843
844define <4 x i32> @shuffle_v4i32_1234(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000845; SSE2-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000846; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000847; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
848; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000849; SSE2-NEXT: retq
850;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000851; SSE3-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000852; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000853; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
854; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000855; SSE3-NEXT: retq
856;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000857; SSSE3-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000858; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000859; 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 +0000860; SSSE3-NEXT: movdqa %xmm1, %xmm0
861; SSSE3-NEXT: retq
862;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000863; SSE41-LABEL: shuffle_v4i32_1234:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000864; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000865; 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 +0000866; SSE41-NEXT: movdqa %xmm1, %xmm0
867; SSE41-NEXT: retq
868;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000869; AVX-LABEL: shuffle_v4i32_1234:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000870; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000871; 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 +0000872; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000873 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
874 ret <4 x i32> %shuffle
875}
876
877define <4 x i32> @shuffle_v4i32_2345(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000878; SSE2-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000879; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000880; SSE2-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000881; SSE2-NEXT: retq
882;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000883; SSE3-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000884; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000885; SSE3-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000886; SSE3-NEXT: retq
887;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000888; SSSE3-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000889; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000890; 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 +0000891; SSSE3-NEXT: movdqa %xmm1, %xmm0
892; SSSE3-NEXT: retq
893;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000894; SSE41-LABEL: shuffle_v4i32_2345:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000895; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000896; 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 +0000897; SSE41-NEXT: movdqa %xmm1, %xmm0
898; SSE41-NEXT: retq
899;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000900; AVX-LABEL: shuffle_v4i32_2345:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000901; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000902; 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 +0000903; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000904 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
905 ret <4 x i32> %shuffle
906}
907
908define <4 x i32> @shuffle_v4i32_3456(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000909; SSE2-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000910; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000911; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
912; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000913; SSE2-NEXT: retq
914;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000915; SSE3-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000916; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000917; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[0,0]
918; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,2]
Chandler Carruth9057fca2014-09-18 09:00:25 +0000919; SSE3-NEXT: retq
920;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000921; SSSE3-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000922; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000923; 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 +0000924; SSSE3-NEXT: movdqa %xmm1, %xmm0
925; SSSE3-NEXT: retq
926;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000927; SSE41-LABEL: shuffle_v4i32_3456:
Chandler Carruth9057fca2014-09-18 09:00:25 +0000928; SSE41: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000929; 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 +0000930; SSE41-NEXT: movdqa %xmm1, %xmm0
931; SSE41-NEXT: retq
932;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000933; AVX-LABEL: shuffle_v4i32_3456:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000934; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000935; 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 +0000936; AVX-NEXT: retq
Chandler Carruth9057fca2014-09-18 09:00:25 +0000937 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
938 ret <4 x i32> %shuffle
939}
Chandler Carruth2e275142014-09-19 08:37:44 +0000940
941define <4 x i32> @shuffle_v4i32_0u1u(<4 x i32> %a, <4 x i32> %b) {
Chandler Carruth846baf22014-10-01 02:25:54 +0000942; SSE2-LABEL: shuffle_v4i32_0u1u:
943; SSE2: # BB#0:
944; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
945; SSE2-NEXT: retq
946;
947; SSE3-LABEL: shuffle_v4i32_0u1u:
948; SSE3: # BB#0:
949; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
950; SSE3-NEXT: retq
951;
952; SSSE3-LABEL: shuffle_v4i32_0u1u:
953; SSSE3: # BB#0:
954; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
955; SSSE3-NEXT: retq
956;
957; SSE41-LABEL: shuffle_v4i32_0u1u:
958; SSE41: # BB#0:
959; SSE41-NEXT: pmovzxdq %xmm0, %xmm0
960; SSE41-NEXT: retq
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000961;
962; AVX-LABEL: shuffle_v4i32_0u1u:
963; AVX: # BB#0:
Chandler Carruth846baf22014-10-01 02:25:54 +0000964; AVX-NEXT: vpmovzxdq %xmm0, %xmm0
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000965; AVX-NEXT: retq
Chandler Carruth2e275142014-09-19 08:37:44 +0000966 %shuffle = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 undef, i32 1, i32 undef>
967 ret <4 x i32> %shuffle
968}
969
970define <4 x i32> @shuffle_v4i32_0z1z(<4 x i32> %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000971; SSE2-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +0000972; SSE2: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000973; SSE2-NEXT: pxor %xmm1, %xmm1
974; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Chandler Carruth2e275142014-09-19 08:37:44 +0000975; SSE2-NEXT: retq
976;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000977; SSE3-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +0000978; SSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000979; SSE3-NEXT: pxor %xmm1, %xmm1
980; SSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Chandler Carruth2e275142014-09-19 08:37:44 +0000981; SSE3-NEXT: retq
982;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000983; SSSE3-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +0000984; SSSE3: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000985; SSSE3-NEXT: pxor %xmm1, %xmm1
986; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Chandler Carruth2e275142014-09-19 08:37:44 +0000987; SSSE3-NEXT: retq
988;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000989; SSE41-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth2e275142014-09-19 08:37:44 +0000990; SSE41: # BB#0:
991; SSE41-NEXT: pmovzxdq %xmm0, %xmm0
992; SSE41-NEXT: retq
993;
Chandler Carruth6a62cd32014-09-30 21:44:34 +0000994; AVX-LABEL: shuffle_v4i32_0z1z:
Chandler Carruth78a761c2014-09-20 18:36:39 +0000995; AVX: # BB#0:
996; AVX-NEXT: vpmovzxdq %xmm0, %xmm0
997; AVX-NEXT: retq
Chandler Carruth2e275142014-09-19 08:37:44 +0000998 %shuffle = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
999 ret <4 x i32> %shuffle
1000}
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001001
1002define <4 x i32> @insert_reg_and_zero_v4i32(i32 %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001003; SSE-LABEL: insert_reg_and_zero_v4i32:
1004; SSE: # BB#0:
1005; SSE-NEXT: movd %edi, %xmm0
1006; SSE-NEXT: retq
1007;
1008; AVX-LABEL: insert_reg_and_zero_v4i32:
1009; AVX: # BB#0:
1010; AVX-NEXT: vmovd %edi, %xmm0
1011; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001012 %v = insertelement <4 x i32> undef, i32 %a, i32 0
1013 %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1014 ret <4 x i32> %shuffle
1015}
1016
1017define <4 x i32> @insert_mem_and_zero_v4i32(i32* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001018; SSE-LABEL: insert_mem_and_zero_v4i32:
1019; SSE: # BB#0:
1020; SSE-NEXT: movd (%rdi), %xmm0
1021; SSE-NEXT: retq
1022;
1023; AVX-LABEL: insert_mem_and_zero_v4i32:
1024; AVX: # BB#0:
1025; AVX-NEXT: vmovd (%rdi), %xmm0
1026; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001027 %a = load i32* %ptr
1028 %v = insertelement <4 x i32> undef, i32 %a, i32 0
1029 %shuffle = shufflevector <4 x i32> %v, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1030 ret <4 x i32> %shuffle
1031}
1032
1033define <4 x float> @insert_reg_and_zero_v4f32(float %a) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001034; SSE-LABEL: insert_reg_and_zero_v4f32:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001035; SSE: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001036; SSE-NEXT: xorps %xmm1, %xmm1
1037; SSE-NEXT: movss %xmm0, %xmm1
1038; SSE-NEXT: movaps %xmm1, %xmm0
Chandler Carruth78a761c2014-09-20 18:36:39 +00001039; SSE-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001040;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001041; AVX-LABEL: insert_reg_and_zero_v4f32:
Chandler Carruth78a761c2014-09-20 18:36:39 +00001042; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001043; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
1044; AVX-NEXT: vmovss %xmm0, %xmm1, %xmm0
Chandler Carruth78a761c2014-09-20 18:36:39 +00001045; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001046 %v = insertelement <4 x float> undef, float %a, i32 0
1047 %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1048 ret <4 x float> %shuffle
1049}
1050
1051define <4 x float> @insert_mem_and_zero_v4f32(float* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001052; SSE-LABEL: insert_mem_and_zero_v4f32:
1053; SSE: # BB#0:
1054; SSE-NEXT: movss (%rdi), %xmm0
1055; SSE-NEXT: retq
1056;
1057; AVX-LABEL: insert_mem_and_zero_v4f32:
1058; AVX: # BB#0:
1059; AVX-NEXT: vmovss (%rdi), %xmm0
1060; AVX-NEXT: retq
Chandler Carruth8c4cccd2014-09-20 04:15:22 +00001061 %a = load float* %ptr
1062 %v = insertelement <4 x float> undef, float %a, i32 0
1063 %shuffle = shufflevector <4 x float> %v, <4 x float> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1064 ret <4 x float> %shuffle
1065}
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001066
Chandler Carruth75e182b2014-10-02 21:37:14 +00001067define <4 x i32> @insert_reg_lo_v4i32(i64 %a, <4 x i32> %b) {
1068; SSE2-LABEL: insert_reg_lo_v4i32:
1069; SSE2: # BB#0:
1070; SSE2-NEXT: movd %rdi, %xmm1
1071; SSE2-NEXT: movsd %xmm1, %xmm0
1072; SSE2-NEXT: retq
1073;
1074; SSE3-LABEL: insert_reg_lo_v4i32:
1075; SSE3: # BB#0:
1076; SSE3-NEXT: movd %rdi, %xmm1
1077; SSE3-NEXT: movsd %xmm1, %xmm0
1078; SSE3-NEXT: retq
1079;
1080; SSSE3-LABEL: insert_reg_lo_v4i32:
1081; SSSE3: # BB#0:
1082; SSSE3-NEXT: movd %rdi, %xmm1
1083; SSSE3-NEXT: movsd %xmm1, %xmm0
1084; SSSE3-NEXT: retq
1085;
1086; SSE41-LABEL: insert_reg_lo_v4i32:
1087; SSE41: # BB#0:
1088; SSE41-NEXT: movd %rdi, %xmm1
1089; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1090; SSE41-NEXT: movdqa %xmm1, %xmm0
1091; SSE41-NEXT: retq
1092;
1093; AVX1-LABEL: insert_reg_lo_v4i32:
1094; AVX1: # BB#0:
1095; AVX1-NEXT: vmovq %rdi, %xmm1
1096; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1097; AVX1-NEXT: retq
1098;
1099; AVX2-LABEL: insert_reg_lo_v4i32:
1100; AVX2: # BB#0:
1101; AVX2-NEXT: vmovq %rdi, %xmm1
1102; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1103; AVX2-NEXT: retq
1104 %a.cast = bitcast i64 %a to <2 x i32>
1105 %v = shufflevector <2 x i32> %a.cast, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1106 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1107 ret <4 x i32> %shuffle
1108}
1109
1110define <4 x i32> @insert_mem_lo_v4i32(<2 x i32>* %ptr, <4 x i32> %b) {
1111; SSE2-LABEL: insert_mem_lo_v4i32:
1112; SSE2: # BB#0:
1113; SSE2-NEXT: movlpd (%rdi), %xmm0
1114; SSE2-NEXT: retq
1115;
1116; SSE3-LABEL: insert_mem_lo_v4i32:
1117; SSE3: # BB#0:
1118; SSE3-NEXT: movlpd (%rdi), %xmm0
1119; SSE3-NEXT: retq
1120;
1121; SSSE3-LABEL: insert_mem_lo_v4i32:
1122; SSSE3: # BB#0:
1123; SSSE3-NEXT: movlpd (%rdi), %xmm0
1124; SSSE3-NEXT: retq
1125;
1126; SSE41-LABEL: insert_mem_lo_v4i32:
1127; SSE41: # BB#0:
1128; SSE41-NEXT: movq (%rdi), %xmm1
1129; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1130; SSE41-NEXT: movdqa %xmm1, %xmm0
1131; SSE41-NEXT: retq
1132;
1133; AVX1-LABEL: insert_mem_lo_v4i32:
1134; AVX1: # BB#0:
1135; AVX1-NEXT: vmovq (%rdi), %xmm1
1136; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1137; AVX1-NEXT: retq
1138;
1139; AVX2-LABEL: insert_mem_lo_v4i32:
1140; AVX2: # BB#0:
1141; AVX2-NEXT: vmovq (%rdi), %xmm1
1142; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1143; AVX2-NEXT: retq
1144 %a = load <2 x i32>* %ptr
1145 %v = shufflevector <2 x i32> %a, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1146 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1147 ret <4 x i32> %shuffle
1148}
1149
1150define <4 x i32> @insert_reg_hi_v4i32(i64 %a, <4 x i32> %b) {
1151; SSE-LABEL: insert_reg_hi_v4i32:
1152; SSE: # BB#0:
1153; SSE-NEXT: movd %rdi, %xmm1
1154; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1155; SSE-NEXT: retq
1156;
1157; AVX-LABEL: insert_reg_hi_v4i32:
1158; AVX: # BB#0:
1159; AVX-NEXT: vmovq %rdi, %xmm1
1160; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1161; AVX-NEXT: retq
1162 %a.cast = bitcast i64 %a to <2 x i32>
1163 %v = shufflevector <2 x i32> %a.cast, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1164 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1165 ret <4 x i32> %shuffle
1166}
1167
1168define <4 x i32> @insert_mem_hi_v4i32(<2 x i32>* %ptr, <4 x i32> %b) {
1169; SSE-LABEL: insert_mem_hi_v4i32:
1170; SSE: # BB#0:
1171; SSE-NEXT: movq (%rdi), %xmm1
1172; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1173; SSE-NEXT: retq
1174;
1175; AVX-LABEL: insert_mem_hi_v4i32:
1176; AVX: # BB#0:
1177; AVX-NEXT: vmovq (%rdi), %xmm1
1178; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1179; AVX-NEXT: retq
1180 %a = load <2 x i32>* %ptr
1181 %v = shufflevector <2 x i32> %a, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1182 %shuffle = shufflevector <4 x i32> %v, <4 x i32> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1183 ret <4 x i32> %shuffle
1184}
1185
1186define <4 x float> @insert_reg_lo_v4f32(double %a, <4 x float> %b) {
1187; SSE-LABEL: insert_reg_lo_v4f32:
1188; SSE: # BB#0:
1189; SSE-NEXT: movsd %xmm0, %xmm1
1190; SSE-NEXT: movaps %xmm1, %xmm0
1191; SSE-NEXT: retq
1192;
1193; AVX-LABEL: insert_reg_lo_v4f32:
1194; AVX: # BB#0:
1195; AVX-NEXT: vmovsd %xmm0, %xmm1, %xmm0
1196; AVX-NEXT: retq
1197 %a.cast = bitcast double %a to <2 x float>
1198 %v = shufflevector <2 x float> %a.cast, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1199 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1200 ret <4 x float> %shuffle
1201}
1202
1203define <4 x float> @insert_mem_lo_v4f32(<2 x float>* %ptr, <4 x float> %b) {
1204; SSE-LABEL: insert_mem_lo_v4f32:
1205; SSE: # BB#0:
1206; SSE-NEXT: movlpd (%rdi), %xmm0
1207; SSE-NEXT: retq
1208;
1209; AVX-LABEL: insert_mem_lo_v4f32:
1210; AVX: # BB#0:
1211; AVX-NEXT: vmovlpd (%rdi), %xmm0, %xmm0
1212; AVX-NEXT: retq
1213 %a = load <2 x float>* %ptr
1214 %v = shufflevector <2 x float> %a, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1215 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1216 ret <4 x float> %shuffle
1217}
1218
1219define <4 x float> @insert_reg_hi_v4f32(double %a, <4 x float> %b) {
1220; SSE-LABEL: insert_reg_hi_v4f32:
1221; SSE: # BB#0:
1222; SSE-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1223; SSE-NEXT: movapd %xmm1, %xmm0
1224; SSE-NEXT: retq
1225;
1226; AVX-LABEL: insert_reg_hi_v4f32:
1227; AVX: # BB#0:
1228; AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1229; AVX-NEXT: retq
1230 %a.cast = bitcast double %a to <2 x float>
1231 %v = shufflevector <2 x float> %a.cast, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1232 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1233 ret <4 x float> %shuffle
1234}
1235
1236define <4 x float> @insert_mem_hi_v4f32(<2 x float>* %ptr, <4 x float> %b) {
1237; SSE-LABEL: insert_mem_hi_v4f32:
1238; SSE: # BB#0:
1239; SSE-NEXT: movhpd (%rdi), %xmm0
1240; SSE-NEXT: retq
1241;
1242; AVX-LABEL: insert_mem_hi_v4f32:
1243; AVX: # BB#0:
1244; AVX-NEXT: vmovhpd (%rdi), %xmm0, %xmm0
1245; AVX-NEXT: retq
1246 %a = load <2 x float>* %ptr
1247 %v = shufflevector <2 x float> %a, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1248 %shuffle = shufflevector <4 x float> %v, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
1249 ret <4 x float> %shuffle
1250}
1251
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001252define <4 x float> @shuffle_mem_v4f32_3210(<4 x float>* %ptr) {
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001253; SSE-LABEL: shuffle_mem_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001254; SSE: # BB#0:
1255; SSE-NEXT: movaps (%rdi), %xmm0
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001256; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001257; SSE-NEXT: retq
1258;
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001259; AVX-LABEL: shuffle_mem_v4f32_3210:
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001260; AVX: # BB#0:
Chandler Carruth6a62cd32014-09-30 21:44:34 +00001261; AVX-NEXT: vpermilps {{.*#+}} xmm0 = mem[3,2,1,0]
Chandler Carruth6f80aba2014-09-20 20:52:07 +00001262; AVX-NEXT: retq
1263 %a = load <4 x float>* %ptr
1264 %shuffle = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
1265 ret <4 x float> %shuffle
1266}