AArch64/ARM64: remove AArch64 from tree prior to renaming ARM64.
[oota-llvm.git] / test / CodeGen / ARM64 / vsub.ll
1 ; RUN: llc < %s -march=arm64 -arm64-neon-syntax=apple | FileCheck %s
2
3 define <8 x i8> @subhn8b(<8 x i16>* %A, <8 x i16>* %B) nounwind {
4 ;CHECK-LABEL: subhn8b:
5 ;CHECK: subhn.8b
6         %tmp1 = load <8 x i16>* %A
7         %tmp2 = load <8 x i16>* %B
8         %tmp3 = call <8 x i8> @llvm.arm64.neon.subhn.v8i8(<8 x i16> %tmp1, <8 x i16> %tmp2)
9         ret <8 x i8> %tmp3
10 }
11
12 define <4 x i16> @subhn4h(<4 x i32>* %A, <4 x i32>* %B) nounwind {
13 ;CHECK-LABEL: subhn4h:
14 ;CHECK: subhn.4h
15         %tmp1 = load <4 x i32>* %A
16         %tmp2 = load <4 x i32>* %B
17         %tmp3 = call <4 x i16> @llvm.arm64.neon.subhn.v4i16(<4 x i32> %tmp1, <4 x i32> %tmp2)
18         ret <4 x i16> %tmp3
19 }
20
21 define <2 x i32> @subhn2s(<2 x i64>* %A, <2 x i64>* %B) nounwind {
22 ;CHECK-LABEL: subhn2s:
23 ;CHECK: subhn.2s
24         %tmp1 = load <2 x i64>* %A
25         %tmp2 = load <2 x i64>* %B
26         %tmp3 = call <2 x i32> @llvm.arm64.neon.subhn.v2i32(<2 x i64> %tmp1, <2 x i64> %tmp2)
27         ret <2 x i32> %tmp3
28 }
29
30 define <16 x i8> @subhn2_16b(<8 x i16> %a, <8 x i16> %b) nounwind  {
31 ;CHECK-LABEL: subhn2_16b:
32 ;CHECK: subhn.8b
33 ;CHECK-NEXT: subhn2.16b
34   %vsubhn2.i = tail call <8 x i8> @llvm.arm64.neon.subhn.v8i8(<8 x i16> %a, <8 x i16> %b) nounwind
35   %vsubhn_high2.i = tail call <8 x i8> @llvm.arm64.neon.subhn.v8i8(<8 x i16> %a, <8 x i16> %b) nounwind
36   %res = shufflevector <8 x i8> %vsubhn2.i, <8 x i8> %vsubhn_high2.i, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
37   ret <16 x i8> %res
38 }
39
40 define <8 x i16> @subhn2_8h(<4 x i32> %a, <4 x i32> %b) nounwind  {
41 ;CHECK-LABEL: subhn2_8h:
42 ;CHECK: subhn.4h
43 ;CHECK-NEXT: subhn2.8h
44   %vsubhn2.i = tail call <4 x i16> @llvm.arm64.neon.subhn.v4i16(<4 x i32> %a, <4 x i32> %b) nounwind
45   %vsubhn_high3.i = tail call <4 x i16> @llvm.arm64.neon.subhn.v4i16(<4 x i32> %a, <4 x i32> %b) nounwind
46   %res = shufflevector <4 x i16> %vsubhn2.i, <4 x i16> %vsubhn_high3.i, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
47   ret <8 x i16> %res
48 }
49
50 define <4 x i32> @subhn2_4s(<2 x i64> %a, <2 x i64> %b) nounwind  {
51 ;CHECK-LABEL: subhn2_4s:
52 ;CHECK: subhn.2s
53 ;CHECK-NEXT: subhn2.4s
54   %vsubhn2.i = tail call <2 x i32> @llvm.arm64.neon.subhn.v2i32(<2 x i64> %a, <2 x i64> %b) nounwind
55   %vsubhn_high3.i = tail call <2 x i32> @llvm.arm64.neon.subhn.v2i32(<2 x i64> %a, <2 x i64> %b) nounwind
56   %res = shufflevector <2 x i32> %vsubhn2.i, <2 x i32> %vsubhn_high3.i, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
57   ret <4 x i32> %res
58 }
59
60 declare <2 x i32> @llvm.arm64.neon.subhn.v2i32(<2 x i64>, <2 x i64>) nounwind readnone
61 declare <4 x i16> @llvm.arm64.neon.subhn.v4i16(<4 x i32>, <4 x i32>) nounwind readnone
62 declare <8 x i8> @llvm.arm64.neon.subhn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone
63
64 define <8 x i8> @rsubhn8b(<8 x i16>* %A, <8 x i16>* %B) nounwind {
65 ;CHECK-LABEL: rsubhn8b:
66 ;CHECK: rsubhn.8b
67         %tmp1 = load <8 x i16>* %A
68         %tmp2 = load <8 x i16>* %B
69         %tmp3 = call <8 x i8> @llvm.arm64.neon.rsubhn.v8i8(<8 x i16> %tmp1, <8 x i16> %tmp2)
70         ret <8 x i8> %tmp3
71 }
72
73 define <4 x i16> @rsubhn4h(<4 x i32>* %A, <4 x i32>* %B) nounwind {
74 ;CHECK-LABEL: rsubhn4h:
75 ;CHECK: rsubhn.4h
76         %tmp1 = load <4 x i32>* %A
77         %tmp2 = load <4 x i32>* %B
78         %tmp3 = call <4 x i16> @llvm.arm64.neon.rsubhn.v4i16(<4 x i32> %tmp1, <4 x i32> %tmp2)
79         ret <4 x i16> %tmp3
80 }
81
82 define <2 x i32> @rsubhn2s(<2 x i64>* %A, <2 x i64>* %B) nounwind {
83 ;CHECK-LABEL: rsubhn2s:
84 ;CHECK: rsubhn.2s
85         %tmp1 = load <2 x i64>* %A
86         %tmp2 = load <2 x i64>* %B
87         %tmp3 = call <2 x i32> @llvm.arm64.neon.rsubhn.v2i32(<2 x i64> %tmp1, <2 x i64> %tmp2)
88         ret <2 x i32> %tmp3
89 }
90
91 define <16 x i8> @rsubhn2_16b(<8 x i16> %a, <8 x i16> %b) nounwind  {
92 ;CHECK-LABEL: rsubhn2_16b:
93 ;CHECK: rsubhn.8b
94 ;CHECK-NEXT: rsubhn2.16b
95   %vrsubhn2.i = tail call <8 x i8> @llvm.arm64.neon.rsubhn.v8i8(<8 x i16> %a, <8 x i16> %b) nounwind
96   %vrsubhn_high2.i = tail call <8 x i8> @llvm.arm64.neon.rsubhn.v8i8(<8 x i16> %a, <8 x i16> %b) nounwind
97   %res = shufflevector <8 x i8> %vrsubhn2.i, <8 x i8> %vrsubhn_high2.i, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
98   ret <16 x i8> %res
99 }
100
101 define <8 x i16> @rsubhn2_8h(<4 x i32> %a, <4 x i32> %b) nounwind  {
102 ;CHECK-LABEL: rsubhn2_8h:
103 ;CHECK: rsubhn.4h
104 ;CHECK-NEXT: rsubhn2.8h
105   %vrsubhn2.i = tail call <4 x i16> @llvm.arm64.neon.rsubhn.v4i16(<4 x i32> %a, <4 x i32> %b) nounwind
106   %vrsubhn_high3.i = tail call <4 x i16> @llvm.arm64.neon.rsubhn.v4i16(<4 x i32> %a, <4 x i32> %b) nounwind
107   %res = shufflevector <4 x i16> %vrsubhn2.i, <4 x i16> %vrsubhn_high3.i, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
108   ret <8 x i16> %res
109 }
110
111 define <4 x i32> @rsubhn2_4s(<2 x i64> %a, <2 x i64> %b) nounwind  {
112 ;CHECK-LABEL: rsubhn2_4s:
113 ;CHECK: rsubhn.2s
114 ;CHECK-NEXT: rsubhn2.4s
115   %vrsubhn2.i = tail call <2 x i32> @llvm.arm64.neon.rsubhn.v2i32(<2 x i64> %a, <2 x i64> %b) nounwind
116   %vrsubhn_high3.i = tail call <2 x i32> @llvm.arm64.neon.rsubhn.v2i32(<2 x i64> %a, <2 x i64> %b) nounwind
117   %res = shufflevector <2 x i32> %vrsubhn2.i, <2 x i32> %vrsubhn_high3.i, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
118   ret <4 x i32> %res
119 }
120
121 declare <2 x i32> @llvm.arm64.neon.rsubhn.v2i32(<2 x i64>, <2 x i64>) nounwind readnone
122 declare <4 x i16> @llvm.arm64.neon.rsubhn.v4i16(<4 x i32>, <4 x i32>) nounwind readnone
123 declare <8 x i8> @llvm.arm64.neon.rsubhn.v8i8(<8 x i16>, <8 x i16>) nounwind readnone
124
125 define <8 x i16> @ssubl8h(<8 x i8>* %A, <8 x i8>* %B) nounwind {
126 ;CHECK-LABEL: ssubl8h:
127 ;CHECK: ssubl.8h
128         %tmp1 = load <8 x i8>* %A
129         %tmp2 = load <8 x i8>* %B
130   %tmp3 = sext <8 x i8> %tmp1 to <8 x i16>
131   %tmp4 = sext <8 x i8> %tmp2 to <8 x i16>
132   %tmp5 = sub <8 x i16> %tmp3, %tmp4
133         ret <8 x i16> %tmp5
134 }
135
136 define <4 x i32> @ssubl4s(<4 x i16>* %A, <4 x i16>* %B) nounwind {
137 ;CHECK-LABEL: ssubl4s:
138 ;CHECK: ssubl.4s
139         %tmp1 = load <4 x i16>* %A
140         %tmp2 = load <4 x i16>* %B
141   %tmp3 = sext <4 x i16> %tmp1 to <4 x i32>
142   %tmp4 = sext <4 x i16> %tmp2 to <4 x i32>
143   %tmp5 = sub <4 x i32> %tmp3, %tmp4
144         ret <4 x i32> %tmp5
145 }
146
147 define <2 x i64> @ssubl2d(<2 x i32>* %A, <2 x i32>* %B) nounwind {
148 ;CHECK-LABEL: ssubl2d:
149 ;CHECK: ssubl.2d
150         %tmp1 = load <2 x i32>* %A
151         %tmp2 = load <2 x i32>* %B
152   %tmp3 = sext <2 x i32> %tmp1 to <2 x i64>
153   %tmp4 = sext <2 x i32> %tmp2 to <2 x i64>
154   %tmp5 = sub <2 x i64> %tmp3, %tmp4
155         ret <2 x i64> %tmp5
156 }
157
158 define <8 x i16> @ssubl2_8h(<16 x i8>* %A, <16 x i8>* %B) nounwind {
159 ;CHECK-LABEL: ssubl2_8h:
160 ;CHECK: ssubl2.8h
161         %tmp1 = load <16 x i8>* %A
162         %high1 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
163         %ext1 = sext <8 x i8> %high1 to <8 x i16>
164
165         %tmp2 = load <16 x i8>* %B
166         %high2 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
167         %ext2 = sext <8 x i8> %high2 to <8 x i16>
168
169         %res = sub <8 x i16> %ext1, %ext2
170         ret <8 x i16> %res
171 }
172
173 define <4 x i32> @ssubl2_4s(<8 x i16>* %A, <8 x i16>* %B) nounwind {
174 ;CHECK-LABEL: ssubl2_4s:
175 ;CHECK: ssubl2.4s
176         %tmp1 = load <8 x i16>* %A
177         %high1 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
178         %ext1 = sext <4 x i16> %high1 to <4 x i32>
179
180         %tmp2 = load <8 x i16>* %B
181         %high2 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
182         %ext2 = sext <4 x i16> %high2 to <4 x i32>
183
184         %res = sub <4 x i32> %ext1, %ext2
185         ret <4 x i32> %res
186 }
187
188 define <2 x i64> @ssubl2_2d(<4 x i32>* %A, <4 x i32>* %B) nounwind {
189 ;CHECK-LABEL: ssubl2_2d:
190 ;CHECK: ssubl2.2d
191         %tmp1 = load <4 x i32>* %A
192         %high1 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
193         %ext1 = sext <2 x i32> %high1 to <2 x i64>
194
195         %tmp2 = load <4 x i32>* %B
196         %high2 = shufflevector <4 x i32> %tmp2, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
197         %ext2 = sext <2 x i32> %high2 to <2 x i64>
198
199         %res = sub <2 x i64> %ext1, %ext2
200         ret <2 x i64> %res
201 }
202
203 define <8 x i16> @usubl8h(<8 x i8>* %A, <8 x i8>* %B) nounwind {
204 ;CHECK-LABEL: usubl8h:
205 ;CHECK: usubl.8h
206   %tmp1 = load <8 x i8>* %A
207   %tmp2 = load <8 x i8>* %B
208   %tmp3 = zext <8 x i8> %tmp1 to <8 x i16>
209   %tmp4 = zext <8 x i8> %tmp2 to <8 x i16>
210   %tmp5 = sub <8 x i16> %tmp3, %tmp4
211   ret <8 x i16> %tmp5
212 }
213
214 define <4 x i32> @usubl4s(<4 x i16>* %A, <4 x i16>* %B) nounwind {
215 ;CHECK-LABEL: usubl4s:
216 ;CHECK: usubl.4s
217   %tmp1 = load <4 x i16>* %A
218   %tmp2 = load <4 x i16>* %B
219   %tmp3 = zext <4 x i16> %tmp1 to <4 x i32>
220   %tmp4 = zext <4 x i16> %tmp2 to <4 x i32>
221   %tmp5 = sub <4 x i32> %tmp3, %tmp4
222   ret <4 x i32> %tmp5
223 }
224
225 define <2 x i64> @usubl2d(<2 x i32>* %A, <2 x i32>* %B) nounwind {
226 ;CHECK-LABEL: usubl2d:
227 ;CHECK: usubl.2d
228   %tmp1 = load <2 x i32>* %A
229   %tmp2 = load <2 x i32>* %B
230   %tmp3 = zext <2 x i32> %tmp1 to <2 x i64>
231   %tmp4 = zext <2 x i32> %tmp2 to <2 x i64>
232   %tmp5 = sub <2 x i64> %tmp3, %tmp4
233   ret <2 x i64> %tmp5
234 }
235
236 define <8 x i16> @usubl2_8h(<16 x i8>* %A, <16 x i8>* %B) nounwind {
237 ;CHECK-LABEL: usubl2_8h:
238 ;CHECK: usubl2.8h
239   %tmp1 = load <16 x i8>* %A
240   %high1 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
241   %ext1 = zext <8 x i8> %high1 to <8 x i16>
242
243   %tmp2 = load <16 x i8>* %B
244   %high2 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
245   %ext2 = zext <8 x i8> %high2 to <8 x i16>
246
247   %res = sub <8 x i16> %ext1, %ext2
248   ret <8 x i16> %res
249 }
250
251 define <4 x i32> @usubl2_4s(<8 x i16>* %A, <8 x i16>* %B) nounwind {
252 ;CHECK-LABEL: usubl2_4s:
253 ;CHECK: usubl2.4s
254   %tmp1 = load <8 x i16>* %A
255   %high1 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
256   %ext1 = zext <4 x i16> %high1 to <4 x i32>
257
258   %tmp2 = load <8 x i16>* %B
259   %high2 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
260   %ext2 = zext <4 x i16> %high2 to <4 x i32>
261
262   %res = sub <4 x i32> %ext1, %ext2
263   ret <4 x i32> %res
264 }
265
266 define <2 x i64> @usubl2_2d(<4 x i32>* %A, <4 x i32>* %B) nounwind {
267 ;CHECK-LABEL: usubl2_2d:
268 ;CHECK: usubl2.2d
269   %tmp1 = load <4 x i32>* %A
270   %high1 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
271   %ext1 = zext <2 x i32> %high1 to <2 x i64>
272
273   %tmp2 = load <4 x i32>* %B
274   %high2 = shufflevector <4 x i32> %tmp2, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
275   %ext2 = zext <2 x i32> %high2 to <2 x i64>
276
277   %res = sub <2 x i64> %ext1, %ext2
278   ret <2 x i64> %res
279 }
280
281 define <8 x i16> @ssubw8h(<8 x i16>* %A, <8 x i8>* %B) nounwind {
282 ;CHECK-LABEL: ssubw8h:
283 ;CHECK: ssubw.8h
284         %tmp1 = load <8 x i16>* %A
285         %tmp2 = load <8 x i8>* %B
286   %tmp3 = sext <8 x i8> %tmp2 to <8 x i16>
287   %tmp4 = sub <8 x i16> %tmp1, %tmp3
288         ret <8 x i16> %tmp4
289 }
290
291 define <4 x i32> @ssubw4s(<4 x i32>* %A, <4 x i16>* %B) nounwind {
292 ;CHECK-LABEL: ssubw4s:
293 ;CHECK: ssubw.4s
294         %tmp1 = load <4 x i32>* %A
295         %tmp2 = load <4 x i16>* %B
296   %tmp3 = sext <4 x i16> %tmp2 to <4 x i32>
297   %tmp4 = sub <4 x i32> %tmp1, %tmp3
298         ret <4 x i32> %tmp4
299 }
300
301 define <2 x i64> @ssubw2d(<2 x i64>* %A, <2 x i32>* %B) nounwind {
302 ;CHECK-LABEL: ssubw2d:
303 ;CHECK: ssubw.2d
304         %tmp1 = load <2 x i64>* %A
305         %tmp2 = load <2 x i32>* %B
306   %tmp3 = sext <2 x i32> %tmp2 to <2 x i64>
307   %tmp4 = sub <2 x i64> %tmp1, %tmp3
308         ret <2 x i64> %tmp4
309 }
310
311 define <8 x i16> @ssubw2_8h(<8 x i16>* %A, <16 x i8>* %B) nounwind {
312 ;CHECK-LABEL: ssubw2_8h:
313 ;CHECK: ssubw2.8h
314         %tmp1 = load <8 x i16>* %A
315
316         %tmp2 = load <16 x i8>* %B
317         %high2 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
318         %ext2 = sext <8 x i8> %high2 to <8 x i16>
319
320         %res = sub <8 x i16> %tmp1, %ext2
321         ret <8 x i16> %res
322 }
323
324 define <4 x i32> @ssubw2_4s(<4 x i32>* %A, <8 x i16>* %B) nounwind {
325 ;CHECK-LABEL: ssubw2_4s:
326 ;CHECK: ssubw2.4s
327         %tmp1 = load <4 x i32>* %A
328
329         %tmp2 = load <8 x i16>* %B
330         %high2 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
331         %ext2 = sext <4 x i16> %high2 to <4 x i32>
332
333         %res = sub <4 x i32> %tmp1, %ext2
334         ret <4 x i32> %res
335 }
336
337 define <2 x i64> @ssubw2_2d(<2 x i64>* %A, <4 x i32>* %B) nounwind {
338 ;CHECK-LABEL: ssubw2_2d:
339 ;CHECK: ssubw2.2d
340         %tmp1 = load <2 x i64>* %A
341
342         %tmp2 = load <4 x i32>* %B
343         %high2 = shufflevector <4 x i32> %tmp2, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
344         %ext2 = sext <2 x i32> %high2 to <2 x i64>
345
346         %res = sub <2 x i64> %tmp1, %ext2
347         ret <2 x i64> %res
348 }
349
350 define <8 x i16> @usubw8h(<8 x i16>* %A, <8 x i8>* %B) nounwind {
351 ;CHECK-LABEL: usubw8h:
352 ;CHECK: usubw.8h
353         %tmp1 = load <8 x i16>* %A
354         %tmp2 = load <8 x i8>* %B
355   %tmp3 = zext <8 x i8> %tmp2 to <8 x i16>
356   %tmp4 = sub <8 x i16> %tmp1, %tmp3
357         ret <8 x i16> %tmp4
358 }
359
360 define <4 x i32> @usubw4s(<4 x i32>* %A, <4 x i16>* %B) nounwind {
361 ;CHECK-LABEL: usubw4s:
362 ;CHECK: usubw.4s
363         %tmp1 = load <4 x i32>* %A
364         %tmp2 = load <4 x i16>* %B
365   %tmp3 = zext <4 x i16> %tmp2 to <4 x i32>
366   %tmp4 = sub <4 x i32> %tmp1, %tmp3
367         ret <4 x i32> %tmp4
368 }
369
370 define <2 x i64> @usubw2d(<2 x i64>* %A, <2 x i32>* %B) nounwind {
371 ;CHECK-LABEL: usubw2d:
372 ;CHECK: usubw.2d
373         %tmp1 = load <2 x i64>* %A
374         %tmp2 = load <2 x i32>* %B
375   %tmp3 = zext <2 x i32> %tmp2 to <2 x i64>
376   %tmp4 = sub <2 x i64> %tmp1, %tmp3
377         ret <2 x i64> %tmp4
378 }
379
380 define <8 x i16> @usubw2_8h(<8 x i16>* %A, <16 x i8>* %B) nounwind {
381 ;CHECK-LABEL: usubw2_8h:
382 ;CHECK: usubw2.8h
383         %tmp1 = load <8 x i16>* %A
384
385         %tmp2 = load <16 x i8>* %B
386         %high2 = shufflevector <16 x i8> %tmp2, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
387         %ext2 = zext <8 x i8> %high2 to <8 x i16>
388
389         %res = sub <8 x i16> %tmp1, %ext2
390         ret <8 x i16> %res
391 }
392
393 define <4 x i32> @usubw2_4s(<4 x i32>* %A, <8 x i16>* %B) nounwind {
394 ;CHECK-LABEL: usubw2_4s:
395 ;CHECK: usubw2.4s
396         %tmp1 = load <4 x i32>* %A
397
398         %tmp2 = load <8 x i16>* %B
399         %high2 = shufflevector <8 x i16> %tmp2, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
400         %ext2 = zext <4 x i16> %high2 to <4 x i32>
401
402         %res = sub <4 x i32> %tmp1, %ext2
403         ret <4 x i32> %res
404 }
405
406 define <2 x i64> @usubw2_2d(<2 x i64>* %A, <4 x i32>* %B) nounwind {
407 ;CHECK-LABEL: usubw2_2d:
408 ;CHECK: usubw2.2d
409         %tmp1 = load <2 x i64>* %A
410
411         %tmp2 = load <4 x i32>* %B
412         %high2 = shufflevector <4 x i32> %tmp2, <4 x i32> undef, <2 x i32> <i32 2, i32 3>
413         %ext2 = zext <2 x i32> %high2 to <2 x i64>
414
415         %res = sub <2 x i64> %tmp1, %ext2
416         ret <2 x i64> %res
417 }