Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AArch64 / neon-extadd-extract.ll
blobb3692f8f46fbc92c92427d29211d5af4bdc734c7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc < %s -mtriple=aarch64 -o - | FileCheck %s
4 define <4 x i16> @addls_v8i8_0(<8 x i8> %s0, <8 x i8> %s1) {
5 ; CHECK-LABEL: addls_v8i8_0:
6 ; CHECK:       // %bb.0: // %entry
7 ; CHECK-NEXT:    saddl v0.8h, v0.8b, v1.8b
8 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
9 ; CHECK-NEXT:    ret
10 entry:
11   %s0s = sext <8 x i8> %s0 to <8 x i16>
12   %s1s = sext <8 x i8> %s1 to <8 x i16>
13   %t0 = shufflevector <8 x i16> %s0s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
14   %t1 = shufflevector <8 x i16> %s1s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
15   %m = add <4 x i16> %t0, %t1
16   ret <4 x i16> %m
19 define <4 x i16> @addws_v8i8_0(<4 x i16> %s0, <8 x i8> %s1) {
20 ; CHECK-LABEL: addws_v8i8_0:
21 ; CHECK:       // %bb.0: // %entry
22 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
23 ; CHECK-NEXT:    saddw v0.8h, v0.8h, v1.8b
24 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
25 ; CHECK-NEXT:    ret
26 entry:
27   %s1s = sext <8 x i8> %s1 to <8 x i16>
28   %t1 = shufflevector <8 x i16> %s1s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
29   %m = add <4 x i16> %s0, %t1
30   ret <4 x i16> %m
33 define <4 x i16> @addlu_v8i8_0(<8 x i8> %s0, <8 x i8> %s1) {
34 ; CHECK-LABEL: addlu_v8i8_0:
35 ; CHECK:       // %bb.0: // %entry
36 ; CHECK-NEXT:    uaddl v0.8h, v0.8b, v1.8b
37 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
38 ; CHECK-NEXT:    ret
39 entry:
40   %s0s = zext <8 x i8> %s0 to <8 x i16>
41   %s1s = zext <8 x i8> %s1 to <8 x i16>
42   %t0 = shufflevector <8 x i16> %s0s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
43   %t1 = shufflevector <8 x i16> %s1s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
44   %m = add <4 x i16> %t0, %t1
45   ret <4 x i16> %m
48 define <4 x i16> @addwu_v8i8_0(<4 x i16> %s0, <8 x i8> %s1) {
49 ; CHECK-LABEL: addwu_v8i8_0:
50 ; CHECK:       // %bb.0: // %entry
51 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
52 ; CHECK-NEXT:    uaddw v0.8h, v0.8h, v1.8b
53 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
54 ; CHECK-NEXT:    ret
55 entry:
56   %s1s = zext <8 x i8> %s1 to <8 x i16>
57   %t1 = shufflevector <8 x i16> %s1s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
58   %m = add <4 x i16> %s0, %t1
59   ret <4 x i16> %m
62 define <4 x i16> @subls_v8i8_0(<8 x i8> %s0, <8 x i8> %s1) {
63 ; CHECK-LABEL: subls_v8i8_0:
64 ; CHECK:       // %bb.0: // %entry
65 ; CHECK-NEXT:    ssubl v0.8h, v0.8b, v1.8b
66 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
67 ; CHECK-NEXT:    ret
68 entry:
69   %s0s = sext <8 x i8> %s0 to <8 x i16>
70   %s1s = sext <8 x i8> %s1 to <8 x i16>
71   %t0 = shufflevector <8 x i16> %s0s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
72   %t1 = shufflevector <8 x i16> %s1s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
73   %m = sub <4 x i16> %t0, %t1
74   ret <4 x i16> %m
77 define <4 x i16> @subws_v8i8_0(<4 x i16> %s0, <8 x i8> %s1) {
78 ; CHECK-LABEL: subws_v8i8_0:
79 ; CHECK:       // %bb.0: // %entry
80 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
81 ; CHECK-NEXT:    ssubw v0.8h, v0.8h, v1.8b
82 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
83 ; CHECK-NEXT:    ret
84 entry:
85   %s1s = sext <8 x i8> %s1 to <8 x i16>
86   %t1 = shufflevector <8 x i16> %s1s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
87   %m = sub <4 x i16> %s0, %t1
88   ret <4 x i16> %m
91 define <4 x i16> @sublu_v8i8_0(<8 x i8> %s0, <8 x i8> %s1) {
92 ; CHECK-LABEL: sublu_v8i8_0:
93 ; CHECK:       // %bb.0: // %entry
94 ; CHECK-NEXT:    usubl v0.8h, v0.8b, v1.8b
95 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
96 ; CHECK-NEXT:    ret
97 entry:
98   %s0s = zext <8 x i8> %s0 to <8 x i16>
99   %s1s = zext <8 x i8> %s1 to <8 x i16>
100   %t0 = shufflevector <8 x i16> %s0s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
101   %t1 = shufflevector <8 x i16> %s1s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
102   %m = sub <4 x i16> %t0, %t1
103   ret <4 x i16> %m
106 define <4 x i16> @subwu_v8i8_0(<4 x i16> %s0, <8 x i8> %s1) {
107 ; CHECK-LABEL: subwu_v8i8_0:
108 ; CHECK:       // %bb.0: // %entry
109 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
110 ; CHECK-NEXT:    usubw v0.8h, v0.8h, v1.8b
111 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
112 ; CHECK-NEXT:    ret
113 entry:
114   %s1s = zext <8 x i8> %s1 to <8 x i16>
115   %t1 = shufflevector <8 x i16> %s1s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
116   %m = sub <4 x i16> %s0, %t1
117   ret <4 x i16> %m
120 define <4 x i16> @mulls_v8i8_0(<8 x i8> %s0, <8 x i8> %s1) {
121 ; CHECK-LABEL: mulls_v8i8_0:
122 ; CHECK:       // %bb.0: // %entry
123 ; CHECK-NEXT:    smull v0.8h, v0.8b, v1.8b
124 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
125 ; CHECK-NEXT:    ret
126 entry:
127   %s0s = sext <8 x i8> %s0 to <8 x i16>
128   %s1s = sext <8 x i8> %s1 to <8 x i16>
129   %t0 = shufflevector <8 x i16> %s0s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
130   %t1 = shufflevector <8 x i16> %s1s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
131   %m = mul <4 x i16> %t0, %t1
132   ret <4 x i16> %m
135 define <4 x i16> @mulws_v8i8_0(<4 x i16> %s0, <8 x i8> %s1) {
136 ; CHECK-LABEL: mulws_v8i8_0:
137 ; CHECK:       // %bb.0: // %entry
138 ; CHECK-NEXT:    sshll v1.8h, v1.8b, #0
139 ; CHECK-NEXT:    mul v0.4h, v0.4h, v1.4h
140 ; CHECK-NEXT:    ret
141 entry:
142   %s1s = sext <8 x i8> %s1 to <8 x i16>
143   %t1 = shufflevector <8 x i16> %s1s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
144   %m = mul <4 x i16> %s0, %t1
145   ret <4 x i16> %m
148 define <4 x i16> @mullu_v8i8_0(<8 x i8> %s0, <8 x i8> %s1) {
149 ; CHECK-LABEL: mullu_v8i8_0:
150 ; CHECK:       // %bb.0: // %entry
151 ; CHECK-NEXT:    umull v0.8h, v0.8b, v1.8b
152 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
153 ; CHECK-NEXT:    ret
154 entry:
155   %s0s = zext <8 x i8> %s0 to <8 x i16>
156   %s1s = zext <8 x i8> %s1 to <8 x i16>
157   %t0 = shufflevector <8 x i16> %s0s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
158   %t1 = shufflevector <8 x i16> %s1s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
159   %m = mul <4 x i16> %t0, %t1
160   ret <4 x i16> %m
163 define <4 x i16> @mulwu_v8i8_0(<4 x i16> %s0, <8 x i8> %s1) {
164 ; CHECK-LABEL: mulwu_v8i8_0:
165 ; CHECK:       // %bb.0: // %entry
166 ; CHECK-NEXT:    ushll v1.8h, v1.8b, #0
167 ; CHECK-NEXT:    mul v0.4h, v0.4h, v1.4h
168 ; CHECK-NEXT:    ret
169 entry:
170   %s1s = zext <8 x i8> %s1 to <8 x i16>
171   %t1 = shufflevector <8 x i16> %s1s, <8 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
172   %m = mul <4 x i16> %s0, %t1
173   ret <4 x i16> %m
176 define <2 x i32> @addls_v4i16_0(<4 x i16> %s0, <4 x i16> %s1) {
177 ; CHECK-LABEL: addls_v4i16_0:
178 ; CHECK:       // %bb.0: // %entry
179 ; CHECK-NEXT:    saddl v0.4s, v0.4h, v1.4h
180 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
181 ; CHECK-NEXT:    ret
182 entry:
183   %s0s = sext <4 x i16> %s0 to <4 x i32>
184   %s1s = sext <4 x i16> %s1 to <4 x i32>
185   %t0 = shufflevector <4 x i32> %s0s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
186   %t1 = shufflevector <4 x i32> %s1s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
187   %m = add <2 x i32> %t0, %t1
188   ret <2 x i32> %m
191 define <2 x i32> @addws_v4i16_0(<2 x i32> %s0, <4 x i16> %s1) {
192 ; CHECK-LABEL: addws_v4i16_0:
193 ; CHECK:       // %bb.0: // %entry
194 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
195 ; CHECK-NEXT:    saddw v0.4s, v0.4s, v1.4h
196 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
197 ; CHECK-NEXT:    ret
198 entry:
199   %s1s = sext <4 x i16> %s1 to <4 x i32>
200   %t1 = shufflevector <4 x i32> %s1s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
201   %m = add <2 x i32> %s0, %t1
202   ret <2 x i32> %m
205 define <2 x i32> @addlu_v4i16_0(<4 x i16> %s0, <4 x i16> %s1) {
206 ; CHECK-LABEL: addlu_v4i16_0:
207 ; CHECK:       // %bb.0: // %entry
208 ; CHECK-NEXT:    uaddl v0.4s, v0.4h, v1.4h
209 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
210 ; CHECK-NEXT:    ret
211 entry:
212   %s0s = zext <4 x i16> %s0 to <4 x i32>
213   %s1s = zext <4 x i16> %s1 to <4 x i32>
214   %t0 = shufflevector <4 x i32> %s0s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
215   %t1 = shufflevector <4 x i32> %s1s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
216   %m = add <2 x i32> %t0, %t1
217   ret <2 x i32> %m
220 define <2 x i32> @addwu_v4i16_0(<2 x i32> %s0, <4 x i16> %s1) {
221 ; CHECK-LABEL: addwu_v4i16_0:
222 ; CHECK:       // %bb.0: // %entry
223 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
224 ; CHECK-NEXT:    uaddw v0.4s, v0.4s, v1.4h
225 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
226 ; CHECK-NEXT:    ret
227 entry:
228   %s1s = zext <4 x i16> %s1 to <4 x i32>
229   %t1 = shufflevector <4 x i32> %s1s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
230   %m = add <2 x i32> %s0, %t1
231   ret <2 x i32> %m
234 define <2 x i32> @subls_v4i16_0(<4 x i16> %s0, <4 x i16> %s1) {
235 ; CHECK-LABEL: subls_v4i16_0:
236 ; CHECK:       // %bb.0: // %entry
237 ; CHECK-NEXT:    ssubl v0.4s, v0.4h, v1.4h
238 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
239 ; CHECK-NEXT:    ret
240 entry:
241   %s0s = sext <4 x i16> %s0 to <4 x i32>
242   %s1s = sext <4 x i16> %s1 to <4 x i32>
243   %t0 = shufflevector <4 x i32> %s0s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
244   %t1 = shufflevector <4 x i32> %s1s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
245   %m = sub <2 x i32> %t0, %t1
246   ret <2 x i32> %m
249 define <2 x i32> @subws_v4i16_0(<2 x i32> %s0, <4 x i16> %s1) {
250 ; CHECK-LABEL: subws_v4i16_0:
251 ; CHECK:       // %bb.0: // %entry
252 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
253 ; CHECK-NEXT:    ssubw v0.4s, v0.4s, v1.4h
254 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
255 ; CHECK-NEXT:    ret
256 entry:
257   %s1s = sext <4 x i16> %s1 to <4 x i32>
258   %t1 = shufflevector <4 x i32> %s1s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
259   %m = sub <2 x i32> %s0, %t1
260   ret <2 x i32> %m
263 define <2 x i32> @sublu_v4i16_0(<4 x i16> %s0, <4 x i16> %s1) {
264 ; CHECK-LABEL: sublu_v4i16_0:
265 ; CHECK:       // %bb.0: // %entry
266 ; CHECK-NEXT:    usubl v0.4s, v0.4h, v1.4h
267 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
268 ; CHECK-NEXT:    ret
269 entry:
270   %s0s = zext <4 x i16> %s0 to <4 x i32>
271   %s1s = zext <4 x i16> %s1 to <4 x i32>
272   %t0 = shufflevector <4 x i32> %s0s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
273   %t1 = shufflevector <4 x i32> %s1s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
274   %m = sub <2 x i32> %t0, %t1
275   ret <2 x i32> %m
278 define <2 x i32> @subwu_v4i16_0(<2 x i32> %s0, <4 x i16> %s1) {
279 ; CHECK-LABEL: subwu_v4i16_0:
280 ; CHECK:       // %bb.0: // %entry
281 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
282 ; CHECK-NEXT:    usubw v0.4s, v0.4s, v1.4h
283 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
284 ; CHECK-NEXT:    ret
285 entry:
286   %s1s = zext <4 x i16> %s1 to <4 x i32>
287   %t1 = shufflevector <4 x i32> %s1s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
288   %m = sub <2 x i32> %s0, %t1
289   ret <2 x i32> %m
292 define <2 x i32> @mulls_v4i16_0(<4 x i16> %s0, <4 x i16> %s1) {
293 ; CHECK-LABEL: mulls_v4i16_0:
294 ; CHECK:       // %bb.0: // %entry
295 ; CHECK-NEXT:    smull v0.4s, v0.4h, v1.4h
296 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
297 ; CHECK-NEXT:    ret
298 entry:
299   %s0s = sext <4 x i16> %s0 to <4 x i32>
300   %s1s = sext <4 x i16> %s1 to <4 x i32>
301   %t0 = shufflevector <4 x i32> %s0s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
302   %t1 = shufflevector <4 x i32> %s1s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
303   %m = mul <2 x i32> %t0, %t1
304   ret <2 x i32> %m
307 define <2 x i32> @mulws_v4i16_0(<2 x i32> %s0, <4 x i16> %s1) {
308 ; CHECK-LABEL: mulws_v4i16_0:
309 ; CHECK:       // %bb.0: // %entry
310 ; CHECK-NEXT:    sshll v1.4s, v1.4h, #0
311 ; CHECK-NEXT:    mul v0.2s, v0.2s, v1.2s
312 ; CHECK-NEXT:    ret
313 entry:
314   %s1s = sext <4 x i16> %s1 to <4 x i32>
315   %t1 = shufflevector <4 x i32> %s1s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
316   %m = mul <2 x i32> %s0, %t1
317   ret <2 x i32> %m
320 define <2 x i32> @mullu_v4i16_0(<4 x i16> %s0, <4 x i16> %s1) {
321 ; CHECK-LABEL: mullu_v4i16_0:
322 ; CHECK:       // %bb.0: // %entry
323 ; CHECK-NEXT:    umull v0.4s, v0.4h, v1.4h
324 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
325 ; CHECK-NEXT:    ret
326 entry:
327   %s0s = zext <4 x i16> %s0 to <4 x i32>
328   %s1s = zext <4 x i16> %s1 to <4 x i32>
329   %t0 = shufflevector <4 x i32> %s0s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
330   %t1 = shufflevector <4 x i32> %s1s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
331   %m = mul <2 x i32> %t0, %t1
332   ret <2 x i32> %m
335 define <2 x i32> @mulwu_v4i16_0(<2 x i32> %s0, <4 x i16> %s1) {
336 ; CHECK-LABEL: mulwu_v4i16_0:
337 ; CHECK:       // %bb.0: // %entry
338 ; CHECK-NEXT:    ushll v1.4s, v1.4h, #0
339 ; CHECK-NEXT:    mul v0.2s, v0.2s, v1.2s
340 ; CHECK-NEXT:    ret
341 entry:
342   %s1s = zext <4 x i16> %s1 to <4 x i32>
343   %t1 = shufflevector <4 x i32> %s1s, <4 x i32> poison, <2 x i32> <i32 0, i32 1>
344   %m = mul <2 x i32> %s0, %t1
345   ret <2 x i32> %m
348 define <1 x i64> @addls_v2i32_0(<2 x i32> %s0, <2 x i32> %s1) {
349 ; CHECK-LABEL: addls_v2i32_0:
350 ; CHECK:       // %bb.0: // %entry
351 ; CHECK-NEXT:    saddl v0.2d, v0.2s, v1.2s
352 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
353 ; CHECK-NEXT:    ret
354 entry:
355   %s0s = sext <2 x i32> %s0 to <2 x i64>
356   %s1s = sext <2 x i32> %s1 to <2 x i64>
357   %t0 = shufflevector <2 x i64> %s0s, <2 x i64> poison, <1 x i32> <i32 0>
358   %t1 = shufflevector <2 x i64> %s1s, <2 x i64> poison, <1 x i32> <i32 0>
359   %m = add <1 x i64> %t0, %t1
360   ret <1 x i64> %m
363 define <1 x i64> @addws_v2i32_0(<1 x i64> %s0, <2 x i32> %s1) {
364 ; CHECK-LABEL: addws_v2i32_0:
365 ; CHECK:       // %bb.0: // %entry
366 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
367 ; CHECK-NEXT:    saddw v0.2d, v0.2d, v1.2s
368 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
369 ; CHECK-NEXT:    ret
370 entry:
371   %s1s = sext <2 x i32> %s1 to <2 x i64>
372   %t1 = shufflevector <2 x i64> %s1s, <2 x i64> poison, <1 x i32> <i32 0>
373   %m = add <1 x i64> %s0, %t1
374   ret <1 x i64> %m
377 define <1 x i64> @addlu_v2i32_0(<2 x i32> %s0, <2 x i32> %s1) {
378 ; CHECK-LABEL: addlu_v2i32_0:
379 ; CHECK:       // %bb.0: // %entry
380 ; CHECK-NEXT:    uaddl v0.2d, v0.2s, v1.2s
381 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
382 ; CHECK-NEXT:    ret
383 entry:
384   %s0s = zext <2 x i32> %s0 to <2 x i64>
385   %s1s = zext <2 x i32> %s1 to <2 x i64>
386   %t0 = shufflevector <2 x i64> %s0s, <2 x i64> poison, <1 x i32> <i32 0>
387   %t1 = shufflevector <2 x i64> %s1s, <2 x i64> poison, <1 x i32> <i32 0>
388   %m = add <1 x i64> %t0, %t1
389   ret <1 x i64> %m
392 define <1 x i64> @addwu_v2i32_0(<1 x i64> %s0, <2 x i32> %s1) {
393 ; CHECK-LABEL: addwu_v2i32_0:
394 ; CHECK:       // %bb.0: // %entry
395 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
396 ; CHECK-NEXT:    uaddw v0.2d, v0.2d, v1.2s
397 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
398 ; CHECK-NEXT:    ret
399 entry:
400   %s1s = zext <2 x i32> %s1 to <2 x i64>
401   %t1 = shufflevector <2 x i64> %s1s, <2 x i64> poison, <1 x i32> <i32 0>
402   %m = add <1 x i64> %s0, %t1
403   ret <1 x i64> %m
406 define <1 x i64> @subls_v2i32_0(<2 x i32> %s0, <2 x i32> %s1) {
407 ; CHECK-LABEL: subls_v2i32_0:
408 ; CHECK:       // %bb.0: // %entry
409 ; CHECK-NEXT:    ssubl v0.2d, v0.2s, v1.2s
410 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
411 ; CHECK-NEXT:    ret
412 entry:
413   %s0s = sext <2 x i32> %s0 to <2 x i64>
414   %s1s = sext <2 x i32> %s1 to <2 x i64>
415   %t0 = shufflevector <2 x i64> %s0s, <2 x i64> poison, <1 x i32> <i32 0>
416   %t1 = shufflevector <2 x i64> %s1s, <2 x i64> poison, <1 x i32> <i32 0>
417   %m = sub <1 x i64> %t0, %t1
418   ret <1 x i64> %m
421 define <1 x i64> @subws_v2i32_0(<1 x i64> %s0, <2 x i32> %s1) {
422 ; CHECK-LABEL: subws_v2i32_0:
423 ; CHECK:       // %bb.0: // %entry
424 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
425 ; CHECK-NEXT:    ssubw v0.2d, v0.2d, v1.2s
426 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
427 ; CHECK-NEXT:    ret
428 entry:
429   %s1s = sext <2 x i32> %s1 to <2 x i64>
430   %t1 = shufflevector <2 x i64> %s1s, <2 x i64> poison, <1 x i32> <i32 0>
431   %m = sub <1 x i64> %s0, %t1
432   ret <1 x i64> %m
435 define <1 x i64> @sublu_v2i32_0(<2 x i32> %s0, <2 x i32> %s1) {
436 ; CHECK-LABEL: sublu_v2i32_0:
437 ; CHECK:       // %bb.0: // %entry
438 ; CHECK-NEXT:    usubl v0.2d, v0.2s, v1.2s
439 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
440 ; CHECK-NEXT:    ret
441 entry:
442   %s0s = zext <2 x i32> %s0 to <2 x i64>
443   %s1s = zext <2 x i32> %s1 to <2 x i64>
444   %t0 = shufflevector <2 x i64> %s0s, <2 x i64> poison, <1 x i32> <i32 0>
445   %t1 = shufflevector <2 x i64> %s1s, <2 x i64> poison, <1 x i32> <i32 0>
446   %m = sub <1 x i64> %t0, %t1
447   ret <1 x i64> %m
450 define <1 x i64> @subwu_v2i32_0(<1 x i64> %s0, <2 x i32> %s1) {
451 ; CHECK-LABEL: subwu_v2i32_0:
452 ; CHECK:       // %bb.0: // %entry
453 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
454 ; CHECK-NEXT:    usubw v0.2d, v0.2d, v1.2s
455 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
456 ; CHECK-NEXT:    ret
457 entry:
458   %s1s = zext <2 x i32> %s1 to <2 x i64>
459   %t1 = shufflevector <2 x i64> %s1s, <2 x i64> poison, <1 x i32> <i32 0>
460   %m = sub <1 x i64> %s0, %t1
461   ret <1 x i64> %m
464 define <1 x i64> @mulls_v2i32_0(<2 x i32> %s0, <2 x i32> %s1) {
465 ; CHECK-LABEL: mulls_v2i32_0:
466 ; CHECK:       // %bb.0: // %entry
467 ; CHECK-NEXT:    smull v0.2d, v0.2s, v1.2s
468 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
469 ; CHECK-NEXT:    ret
470 entry:
471   %s0s = sext <2 x i32> %s0 to <2 x i64>
472   %s1s = sext <2 x i32> %s1 to <2 x i64>
473   %t0 = shufflevector <2 x i64> %s0s, <2 x i64> poison, <1 x i32> <i32 0>
474   %t1 = shufflevector <2 x i64> %s1s, <2 x i64> poison, <1 x i32> <i32 0>
475   %m = mul <1 x i64> %t0, %t1
476   ret <1 x i64> %m
479 define <1 x i64> @mulws_v2i32_0(<1 x i64> %s0, <2 x i32> %s1) {
480 ; CHECK-LABEL: mulws_v2i32_0:
481 ; CHECK:       // %bb.0: // %entry
482 ; CHECK-NEXT:    sshll v1.2d, v1.2s, #0
483 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
484 ; CHECK-NEXT:    fmov x8, d0
485 ; CHECK-NEXT:    fmov x9, d1
486 ; CHECK-NEXT:    mul x8, x8, x9
487 ; CHECK-NEXT:    fmov d0, x8
488 ; CHECK-NEXT:    ret
489 entry:
490   %s1s = sext <2 x i32> %s1 to <2 x i64>
491   %t1 = shufflevector <2 x i64> %s1s, <2 x i64> poison, <1 x i32> <i32 0>
492   %m = mul <1 x i64> %s0, %t1
493   ret <1 x i64> %m
496 define <1 x i64> @mullu_v2i32_0(<2 x i32> %s0, <2 x i32> %s1) {
497 ; CHECK-LABEL: mullu_v2i32_0:
498 ; CHECK:       // %bb.0: // %entry
499 ; CHECK-NEXT:    umull v0.2d, v0.2s, v1.2s
500 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
501 ; CHECK-NEXT:    ret
502 entry:
503   %s0s = zext <2 x i32> %s0 to <2 x i64>
504   %s1s = zext <2 x i32> %s1 to <2 x i64>
505   %t0 = shufflevector <2 x i64> %s0s, <2 x i64> poison, <1 x i32> <i32 0>
506   %t1 = shufflevector <2 x i64> %s1s, <2 x i64> poison, <1 x i32> <i32 0>
507   %m = mul <1 x i64> %t0, %t1
508   ret <1 x i64> %m
511 define <1 x i64> @mulwu_v2i32_0(<1 x i64> %s0, <2 x i32> %s1) {
512 ; CHECK-LABEL: mulwu_v2i32_0:
513 ; CHECK:       // %bb.0: // %entry
514 ; CHECK-NEXT:    ushll v1.2d, v1.2s, #0
515 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
516 ; CHECK-NEXT:    fmov x8, d0
517 ; CHECK-NEXT:    fmov x9, d1
518 ; CHECK-NEXT:    mul x8, x8, x9
519 ; CHECK-NEXT:    fmov d0, x8
520 ; CHECK-NEXT:    ret
521 entry:
522   %s1s = zext <2 x i32> %s1 to <2 x i64>
523   %t1 = shufflevector <2 x i64> %s1s, <2 x i64> poison, <1 x i32> <i32 0>
524   %m = mul <1 x i64> %s0, %t1
525   ret <1 x i64> %m