a3e78e3ab97c2c329cc77b683f4ef33452100238
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-128-v2.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=CHECK-SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse3 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=CHECK-SSE3
3
4 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5 target triple = "x86_64-unknown-unknown"
6
7 define <2 x i64> @shuffle_v2i64_00(<2 x i64> %a, <2 x i64> %b) {
8 ; CHECK-SSE2-LABEL: @shuffle_v2i64_00
9 ; CHECK-SSE2:         pshufd {{.*}} # xmm0 = xmm0[0,1,0,1]
10 ; CHECK-SSE2-NEXT:    retq
11   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 0>
12   ret <2 x i64> %shuffle
13 }
14 define <2 x i64> @shuffle_v2i64_10(<2 x i64> %a, <2 x i64> %b) {
15 ; CHECK-SSE2-LABEL: @shuffle_v2i64_10
16 ; CHECK-SSE2:         pshufd {{.*}} # xmm0 = xmm0[2,3,0,1]
17 ; CHECK-SSE2-NEXT:    retq
18   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 0>
19   ret <2 x i64> %shuffle
20 }
21 define <2 x i64> @shuffle_v2i64_11(<2 x i64> %a, <2 x i64> %b) {
22 ; CHECK-SSE2-LABEL: @shuffle_v2i64_11
23 ; CHECK-SSE2:         pshufd {{.*}} # xmm0 = xmm0[2,3,2,3]
24 ; CHECK-SSE2-NEXT:    retq
25   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 1>
26   ret <2 x i64> %shuffle
27 }
28 define <2 x i64> @shuffle_v2i64_22(<2 x i64> %a, <2 x i64> %b) {
29 ; CHECK-SSE2-LABEL: @shuffle_v2i64_22
30 ; CHECK-SSE2:         pshufd {{.*}} # xmm0 = xmm1[0,1,0,1]
31 ; CHECK-SSE2-NEXT:    retq
32   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 2>
33   ret <2 x i64> %shuffle
34 }
35 define <2 x i64> @shuffle_v2i64_32(<2 x i64> %a, <2 x i64> %b) {
36 ; CHECK-SSE2-LABEL: @shuffle_v2i64_32
37 ; CHECK-SSE2:         pshufd {{.*}} # xmm0 = xmm1[2,3,0,1]
38 ; CHECK-SSE2-NEXT:    retq
39   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 2>
40   ret <2 x i64> %shuffle
41 }
42 define <2 x i64> @shuffle_v2i64_33(<2 x i64> %a, <2 x i64> %b) {
43 ; CHECK-SSE2-LABEL: @shuffle_v2i64_33
44 ; CHECK-SSE2:         pshufd {{.*}} # xmm0 = xmm1[2,3,2,3]
45 ; CHECK-SSE2-NEXT:    retq
46   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 3>
47   ret <2 x i64> %shuffle
48 }
49
50 define <2 x double> @shuffle_v2f64_00(<2 x double> %a, <2 x double> %b) {
51 ; CHECK-SSE2-LABEL: @shuffle_v2f64_00
52 ; CHECK-SSE2:         movlhps {{.*}} # xmm0 = xmm0[0,0]
53 ; CHECK-SSE2-NEXT:    retq
54   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 0>
55   ret <2 x double> %shuffle
56 }
57 define <2 x double> @shuffle_v2f64_10(<2 x double> %a, <2 x double> %b) {
58 ; CHECK-SSE2-LABEL: @shuffle_v2f64_10
59 ; CHECK-SSE2:         shufpd {{.*}} # xmm0 = xmm0[1,0]
60 ; CHECK-SSE2-NEXT:    retq
61   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 0>
62   ret <2 x double> %shuffle
63 }
64 define <2 x double> @shuffle_v2f64_11(<2 x double> %a, <2 x double> %b) {
65 ; CHECK-SSE2-LABEL: @shuffle_v2f64_11
66 ; CHECK-SSE2:         movhlps {{.*}} # xmm0 = xmm0[1,1]
67 ; CHECK-SSE2-NEXT:    retq
68   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 1>
69   ret <2 x double> %shuffle
70 }
71 define <2 x double> @shuffle_v2f64_22(<2 x double> %a, <2 x double> %b) {
72 ; CHECK-SSE2-LABEL: @shuffle_v2f64_22
73 ; CHECK-SSE2:         movlhps {{.*}} # xmm1 = xmm1[0,0]
74 ; CHECK-SSE2-NEXT:    movaps %xmm1, %xmm0
75 ; CHECK-SSE2-NEXT:    retq
76   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 2>
77   ret <2 x double> %shuffle
78 }
79 define <2 x double> @shuffle_v2f64_32(<2 x double> %a, <2 x double> %b) {
80 ; CHECK-SSE2-LABEL: @shuffle_v2f64_32
81 ; CHECK-SSE2:         pshufd {{.*}} # xmm0 = xmm1[2,3,0,1]
82 ; CHECK-SSE2-NEXT:    retq
83   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 2>
84   ret <2 x double> %shuffle
85 }
86 define <2 x double> @shuffle_v2f64_33(<2 x double> %a, <2 x double> %b) {
87 ; CHECK-SSE2-LABEL: @shuffle_v2f64_33
88 ; CHECK-SSE2:         movhlps {{.*}} # xmm1 = xmm1[1,1]
89 ; CHECK-SSE2-NEXT:    movaps %xmm1, %xmm0
90 ; CHECK-SSE2-NEXT:    retq
91   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 3>
92   ret <2 x double> %shuffle
93 }
94 define <2 x double> @shuffle_v2f64_03(<2 x double> %a, <2 x double> %b) {
95 ; CHECK-SSE2-LABEL: @shuffle_v2f64_03
96 ; CHECK-SSE2:         shufpd {{.*}} # xmm0 = xmm0[0],xmm1[1]
97 ; CHECK-SSE2-NEXT:    retq
98   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 3>
99   ret <2 x double> %shuffle
100 }
101 define <2 x double> @shuffle_v2f64_21(<2 x double> %a, <2 x double> %b) {
102 ; CHECK-SSE2-LABEL: @shuffle_v2f64_21
103 ; CHECK-SSE2:         shufpd {{.*}} # xmm1 = xmm1[0],xmm0[1]
104 ; CHECK-SSE2-NEXT:    movapd %xmm1, %xmm0
105 ; CHECK-SSE2-NEXT:    retq
106   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 1>
107   ret <2 x double> %shuffle
108 }
109
110
111 define <2 x i64> @shuffle_v2i64_02(<2 x i64> %a, <2 x i64> %b) {
112 ; CHECK-SSE2-LABEL: @shuffle_v2i64_02
113 ; CHECK-SSE2:         punpcklqdq {{.*}} # xmm0 = xmm0[0],xmm1[0]
114 ; CHECK-SSE2-NEXT:    retq
115   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
116   ret <2 x i64> %shuffle
117 }
118 define <2 x i64> @shuffle_v2i64_02_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
119 ; CHECK-SSE2-LABEL: @shuffle_v2i64_02_copy
120 ; CHECK-SSE2:         punpcklqdq {{.*}} # xmm1 = xmm1[0],xmm2[0]
121 ; CHECK-SSE2-NEXT:    movdqa %xmm1, %xmm0
122 ; CHECK-SSE2-NEXT:    retq
123   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
124   ret <2 x i64> %shuffle
125 }
126 define <2 x i64> @shuffle_v2i64_03(<2 x i64> %a, <2 x i64> %b) {
127 ; CHECK-SSE2-LABEL: @shuffle_v2i64_03
128 ; CHECK-SSE2:         shufpd {{.*}} # xmm0 = xmm0[0],xmm1[1]
129 ; CHECK-SSE2-NEXT:    retq
130   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
131   ret <2 x i64> %shuffle
132 }
133 define <2 x i64> @shuffle_v2i64_03_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
134 ; CHECK-SSE2-LABEL: @shuffle_v2i64_03_copy
135 ; CHECK-SSE2:         shufpd {{.*}} # xmm1 = xmm1[0],xmm2[1]
136 ; CHECK-SSE2-NEXT:    movapd %xmm1, %xmm0
137 ; CHECK-SSE2-NEXT:    retq
138   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
139   ret <2 x i64> %shuffle
140 }
141 define <2 x i64> @shuffle_v2i64_12(<2 x i64> %a, <2 x i64> %b) {
142 ; CHECK-SSE2-LABEL: @shuffle_v2i64_12
143 ; CHECK-SSE2:         shufpd {{.*}} # xmm0 = xmm0[1],xmm1[0]
144 ; CHECK-SSE2-NEXT:    retq
145   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>
146   ret <2 x i64> %shuffle
147 }
148 define <2 x i64> @shuffle_v2i64_12_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
149 ; CHECK-SSE2-LABEL: @shuffle_v2i64_12_copy
150 ; CHECK-SSE2:         shufpd {{.*}} # xmm1 = xmm1[1],xmm2[0]
151 ; CHECK-SSE2-NEXT:    movapd %xmm1, %xmm0
152 ; CHECK-SSE2-NEXT:    retq
153   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>
154   ret <2 x i64> %shuffle
155 }
156 define <2 x i64> @shuffle_v2i64_13(<2 x i64> %a, <2 x i64> %b) {
157 ; CHECK-SSE2-LABEL: @shuffle_v2i64_13
158 ; CHECK-SSE2:         punpckhqdq {{.*}} # xmm0 = xmm0[1],xmm1[1]
159 ; CHECK-SSE2-NEXT:    retq
160   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
161   ret <2 x i64> %shuffle
162 }
163 define <2 x i64> @shuffle_v2i64_13_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
164 ; CHECK-SSE2-LABEL: @shuffle_v2i64_13_copy
165 ; CHECK-SSE2:         punpckhqdq {{.*}} # xmm1 = xmm1[1],xmm2[1]
166 ; CHECK-SSE2-NEXT:    movdqa %xmm1, %xmm0
167 ; CHECK-SSE2-NEXT:    retq
168   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
169   ret <2 x i64> %shuffle
170 }
171 define <2 x i64> @shuffle_v2i64_20(<2 x i64> %a, <2 x i64> %b) {
172 ; CHECK-SSE2-LABEL: @shuffle_v2i64_20
173 ; CHECK-SSE2:         punpcklqdq {{.*}} # xmm1 = xmm1[0],xmm0[0]
174 ; CHECK-SSE2-NEXT:    movdqa %xmm1, %xmm0
175 ; CHECK-SSE2-NEXT:    retq
176   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
177   ret <2 x i64> %shuffle
178 }
179 define <2 x i64> @shuffle_v2i64_20_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
180 ; CHECK-SSE2-LABEL: @shuffle_v2i64_20_copy
181 ; CHECK-SSE2:         punpcklqdq {{.*}} # xmm2 = xmm2[0],xmm1[0]
182 ; CHECK-SSE2-NEXT:    movdqa %xmm2, %xmm0
183 ; CHECK-SSE2-NEXT:    retq
184   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
185   ret <2 x i64> %shuffle
186 }
187 define <2 x i64> @shuffle_v2i64_21(<2 x i64> %a, <2 x i64> %b) {
188 ; CHECK-SSE2-LABEL: @shuffle_v2i64_21
189 ; CHECK-SSE2:         shufpd {{.*}} # xmm1 = xmm1[0],xmm0[1]
190 ; CHECK-SSE2-NEXT:    movapd %xmm1, %xmm0
191 ; CHECK-SSE2-NEXT:    retq
192   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1>
193   ret <2 x i64> %shuffle
194 }
195 define <2 x i64> @shuffle_v2i64_21_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
196 ; CHECK-SSE2-LABEL: @shuffle_v2i64_21_copy
197 ; CHECK-SSE2:         shufpd {{.*}} # xmm2 = xmm2[0],xmm1[1]
198 ; CHECK-SSE2-NEXT:    movapd %xmm2, %xmm0
199 ; CHECK-SSE2-NEXT:    retq
200   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1>
201   ret <2 x i64> %shuffle
202 }
203 define <2 x i64> @shuffle_v2i64_30(<2 x i64> %a, <2 x i64> %b) {
204 ; CHECK-SSE2-LABEL: @shuffle_v2i64_30
205 ; CHECK-SSE2:         shufpd {{.*}} # xmm1 = xmm1[1],xmm0[0]
206 ; CHECK-SSE2-NEXT:    movapd %xmm1, %xmm0
207 ; CHECK-SSE2-NEXT:    retq
208   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0>
209   ret <2 x i64> %shuffle
210 }
211 define <2 x i64> @shuffle_v2i64_30_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
212 ; CHECK-SSE2-LABEL: @shuffle_v2i64_30_copy
213 ; CHECK-SSE2:         shufpd {{.*}} # xmm2 = xmm2[1],xmm1[0]
214 ; CHECK-SSE2-NEXT:    movapd %xmm2, %xmm0
215 ; CHECK-SSE2-NEXT:    retq
216   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0>
217   ret <2 x i64> %shuffle
218 }
219 define <2 x i64> @shuffle_v2i64_31(<2 x i64> %a, <2 x i64> %b) {
220 ; CHECK-SSE2-LABEL: @shuffle_v2i64_31
221 ; CHECK-SSE2:         punpckhqdq {{.*}} # xmm1 = xmm1[1],xmm0[1]
222 ; CHECK-SSE2-NEXT:    movdqa %xmm1, %xmm0
223 ; CHECK-SSE2-NEXT:    retq
224   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
225   ret <2 x i64> %shuffle
226 }
227 define <2 x i64> @shuffle_v2i64_31_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
228 ; CHECK-SSE2-LABEL: @shuffle_v2i64_31_copy
229 ; CHECK-SSE2:         punpckhqdq {{.*}} # xmm2 = xmm2[1],xmm1[1]
230 ; CHECK-SSE2-NEXT:    movdqa %xmm2, %xmm0
231 ; CHECK-SSE2-NEXT:    retq
232   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
233   ret <2 x i64> %shuffle
234 }
235
236
237 define <2 x double> @insert_dup_reg_v2f64(double %a) {
238 ; CHECK-SSE2-LABEL: @insert_dup_reg_v2f64
239 ; CHECK-SSE2:         movlhps {{.*}} # xmm0 = xmm0[0,0]
240 ; CHECK-SSE2-NEXT:    retq
241 ;
242 ; FIXME: This should match movddup as well!
243 ; CHECK-SSE3-LABEL: @insert_dup_reg_v2f64
244 ; CHECK-SSE3:         unpcklpd {{.*}} # xmm0 = xmm0[0,0]
245 ; CHECK-SSE3-NEXT:    retq
246   %v = insertelement <2 x double> undef, double %a, i32 0
247   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
248   ret <2 x double> %shuffle
249 }
250 define <2 x double> @insert_dup_mem_v2f64(double* %ptr) {
251 ; CHECK-SSE2-LABEL: @insert_dup_mem_v2f64
252 ; CHECK-SSE2:         movsd {{.*}}, %xmm0
253 ; CHECK-SSE2-NEXT:    movlhps {{.*}} # xmm0 = xmm0[0,0]
254 ; CHECK-SSE2-NEXT:    retq
255 ;
256 ; CHECK-SSE3-LABEL: @insert_dup_mem_v2f64
257 ; CHECK-SSE3:         movddup {{.*}}, %xmm0
258 ; CHECK-SSE3-NEXT:    retq
259   %a = load double* %ptr
260   %v = insertelement <2 x double> undef, double %a, i32 0
261   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
262   ret <2 x double> %shuffle
263 }