Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-fp-arith.ll
blobc436dea8ff1b2ed37c298e35607b8e5375d44649
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve -force-streaming-compatible-sve  < %s | FileCheck %s
3 ; RUN: llc -mattr=+sme -force-streaming-compatible-sve  < %s | FileCheck %s
5 target triple = "aarch64-unknown-linux-gnu"
8 ; FADD
11 define <2 x half> @fadd_v2f16(<2 x half> %op1, <2 x half> %op2) {
12 ; CHECK-LABEL: fadd_v2f16:
13 ; CHECK:       // %bb.0:
14 ; CHECK-NEXT:    ptrue p0.h, vl4
15 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
16 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
17 ; CHECK-NEXT:    fadd z0.h, p0/m, z0.h, z1.h
18 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
19 ; CHECK-NEXT:    ret
20   %res = fadd <2 x half> %op1, %op2
21   ret <2 x half> %res
24 define <4 x half> @fadd_v4f16(<4 x half> %op1, <4 x half> %op2) {
25 ; CHECK-LABEL: fadd_v4f16:
26 ; CHECK:       // %bb.0:
27 ; CHECK-NEXT:    ptrue p0.h, vl4
28 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
29 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
30 ; CHECK-NEXT:    fadd z0.h, p0/m, z0.h, z1.h
31 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
32 ; CHECK-NEXT:    ret
33   %res = fadd <4 x half> %op1, %op2
34   ret <4 x half> %res
37 define <8 x half> @fadd_v8f16(<8 x half> %op1, <8 x half> %op2) {
38 ; CHECK-LABEL: fadd_v8f16:
39 ; CHECK:       // %bb.0:
40 ; CHECK-NEXT:    ptrue p0.h, vl8
41 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
42 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
43 ; CHECK-NEXT:    fadd z0.h, p0/m, z0.h, z1.h
44 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
45 ; CHECK-NEXT:    ret
46   %res = fadd <8 x half> %op1, %op2
47   ret <8 x half> %res
50 define void @fadd_v16f16(ptr %a, ptr %b) {
51 ; CHECK-LABEL: fadd_v16f16:
52 ; CHECK:       // %bb.0:
53 ; CHECK-NEXT:    ptrue p0.h, vl8
54 ; CHECK-NEXT:    ldp q0, q3, [x1]
55 ; CHECK-NEXT:    ldp q1, q2, [x0]
56 ; CHECK-NEXT:    fadd z0.h, p0/m, z0.h, z1.h
57 ; CHECK-NEXT:    movprfx z1, z2
58 ; CHECK-NEXT:    fadd z1.h, p0/m, z1.h, z3.h
59 ; CHECK-NEXT:    stp q0, q1, [x0]
60 ; CHECK-NEXT:    ret
61   %op1 = load <16 x half>, ptr %a
62   %op2 = load <16 x half>, ptr %b
63   %res = fadd <16 x half> %op1, %op2
64   store <16 x half> %res, ptr %a
65   ret void
68 define <2 x float> @fadd_v2f32(<2 x float> %op1, <2 x float> %op2) {
69 ; CHECK-LABEL: fadd_v2f32:
70 ; CHECK:       // %bb.0:
71 ; CHECK-NEXT:    ptrue p0.s, vl2
72 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
73 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
74 ; CHECK-NEXT:    fadd z0.s, p0/m, z0.s, z1.s
75 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
76 ; CHECK-NEXT:    ret
77   %res = fadd <2 x float> %op1, %op2
78   ret <2 x float> %res
81 define <4 x float> @fadd_v4f32(<4 x float> %op1, <4 x float> %op2) {
82 ; CHECK-LABEL: fadd_v4f32:
83 ; CHECK:       // %bb.0:
84 ; CHECK-NEXT:    ptrue p0.s, vl4
85 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
86 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
87 ; CHECK-NEXT:    fadd z0.s, p0/m, z0.s, z1.s
88 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
89 ; CHECK-NEXT:    ret
90   %res = fadd <4 x float> %op1, %op2
91   ret <4 x float> %res
94 define void @fadd_v8f32(ptr %a, ptr %b) {
95 ; CHECK-LABEL: fadd_v8f32:
96 ; CHECK:       // %bb.0:
97 ; CHECK-NEXT:    ptrue p0.s, vl4
98 ; CHECK-NEXT:    ldp q0, q3, [x1]
99 ; CHECK-NEXT:    ldp q1, q2, [x0]
100 ; CHECK-NEXT:    fadd z0.s, p0/m, z0.s, z1.s
101 ; CHECK-NEXT:    movprfx z1, z2
102 ; CHECK-NEXT:    fadd z1.s, p0/m, z1.s, z3.s
103 ; CHECK-NEXT:    stp q0, q1, [x0]
104 ; CHECK-NEXT:    ret
105   %op1 = load <8 x float>, ptr %a
106   %op2 = load <8 x float>, ptr %b
107   %res = fadd <8 x float> %op1, %op2
108   store <8 x float> %res, ptr %a
109   ret void
112 define <2 x double> @fadd_v2f64(<2 x double> %op1, <2 x double> %op2) {
113 ; CHECK-LABEL: fadd_v2f64:
114 ; CHECK:       // %bb.0:
115 ; CHECK-NEXT:    ptrue p0.d, vl2
116 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
117 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
118 ; CHECK-NEXT:    fadd z0.d, p0/m, z0.d, z1.d
119 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
120 ; CHECK-NEXT:    ret
121   %res = fadd <2 x double> %op1, %op2
122   ret <2 x double> %res
125 define void @fadd_v4f64(ptr %a, ptr %b) {
126 ; CHECK-LABEL: fadd_v4f64:
127 ; CHECK:       // %bb.0:
128 ; CHECK-NEXT:    ptrue p0.d, vl2
129 ; CHECK-NEXT:    ldp q0, q3, [x1]
130 ; CHECK-NEXT:    ldp q1, q2, [x0]
131 ; CHECK-NEXT:    fadd z0.d, p0/m, z0.d, z1.d
132 ; CHECK-NEXT:    movprfx z1, z2
133 ; CHECK-NEXT:    fadd z1.d, p0/m, z1.d, z3.d
134 ; CHECK-NEXT:    stp q0, q1, [x0]
135 ; CHECK-NEXT:    ret
136   %op1 = load <4 x double>, ptr %a
137   %op2 = load <4 x double>, ptr %b
138   %res = fadd <4 x double> %op1, %op2
139   store <4 x double> %res, ptr %a
140   ret void
144 ; FDIV
147 define <2 x half> @fdiv_v2f16(<2 x half> %op1, <2 x half> %op2) {
148 ; CHECK-LABEL: fdiv_v2f16:
149 ; CHECK:       // %bb.0:
150 ; CHECK-NEXT:    ptrue p0.h, vl4
151 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
152 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
153 ; CHECK-NEXT:    fdiv z0.h, p0/m, z0.h, z1.h
154 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
155 ; CHECK-NEXT:    ret
156   %res = fdiv <2 x half> %op1, %op2
157   ret <2 x half> %res
160 define <4 x half> @fdiv_v4f16(<4 x half> %op1, <4 x half> %op2) {
161 ; CHECK-LABEL: fdiv_v4f16:
162 ; CHECK:       // %bb.0:
163 ; CHECK-NEXT:    ptrue p0.h, vl4
164 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
165 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
166 ; CHECK-NEXT:    fdiv z0.h, p0/m, z0.h, z1.h
167 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
168 ; CHECK-NEXT:    ret
169   %res = fdiv <4 x half> %op1, %op2
170   ret <4 x half> %res
173 define <8 x half> @fdiv_v8f16(<8 x half> %op1, <8 x half> %op2) {
174 ; CHECK-LABEL: fdiv_v8f16:
175 ; CHECK:       // %bb.0:
176 ; CHECK-NEXT:    ptrue p0.h, vl8
177 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
178 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
179 ; CHECK-NEXT:    fdiv z0.h, p0/m, z0.h, z1.h
180 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
181 ; CHECK-NEXT:    ret
182   %res = fdiv <8 x half> %op1, %op2
183   ret <8 x half> %res
186 define void @fdiv_v16f16(ptr %a, ptr %b) {
187 ; CHECK-LABEL: fdiv_v16f16:
188 ; CHECK:       // %bb.0:
189 ; CHECK-NEXT:    ptrue p0.h, vl8
190 ; CHECK-NEXT:    ldp q0, q3, [x1]
191 ; CHECK-NEXT:    ldp q1, q2, [x0]
192 ; CHECK-NEXT:    fdivr z0.h, p0/m, z0.h, z1.h
193 ; CHECK-NEXT:    movprfx z1, z2
194 ; CHECK-NEXT:    fdiv z1.h, p0/m, z1.h, z3.h
195 ; CHECK-NEXT:    stp q0, q1, [x0]
196 ; CHECK-NEXT:    ret
197   %op1 = load <16 x half>, ptr %a
198   %op2 = load <16 x half>, ptr %b
199   %res = fdiv <16 x half> %op1, %op2
200   store <16 x half> %res, ptr %a
201   ret void
204 define <2 x float> @fdiv_v2f32(<2 x float> %op1, <2 x float> %op2) {
205 ; CHECK-LABEL: fdiv_v2f32:
206 ; CHECK:       // %bb.0:
207 ; CHECK-NEXT:    ptrue p0.s, vl2
208 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
209 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
210 ; CHECK-NEXT:    fdiv z0.s, p0/m, z0.s, z1.s
211 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
212 ; CHECK-NEXT:    ret
213   %res = fdiv <2 x float> %op1, %op2
214   ret <2 x float> %res
217 define <4 x float> @fdiv_v4f32(<4 x float> %op1, <4 x float> %op2) {
218 ; CHECK-LABEL: fdiv_v4f32:
219 ; CHECK:       // %bb.0:
220 ; CHECK-NEXT:    ptrue p0.s, vl4
221 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
222 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
223 ; CHECK-NEXT:    fdiv z0.s, p0/m, z0.s, z1.s
224 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
225 ; CHECK-NEXT:    ret
226   %res = fdiv <4 x float> %op1, %op2
227   ret <4 x float> %res
230 define void @fdiv_v8f32(ptr %a, ptr %b) {
231 ; CHECK-LABEL: fdiv_v8f32:
232 ; CHECK:       // %bb.0:
233 ; CHECK-NEXT:    ptrue p0.s, vl4
234 ; CHECK-NEXT:    ldp q0, q3, [x1]
235 ; CHECK-NEXT:    ldp q1, q2, [x0]
236 ; CHECK-NEXT:    fdivr z0.s, p0/m, z0.s, z1.s
237 ; CHECK-NEXT:    movprfx z1, z2
238 ; CHECK-NEXT:    fdiv z1.s, p0/m, z1.s, z3.s
239 ; CHECK-NEXT:    stp q0, q1, [x0]
240 ; CHECK-NEXT:    ret
241   %op1 = load <8 x float>, ptr %a
242   %op2 = load <8 x float>, ptr %b
243   %res = fdiv <8 x float> %op1, %op2
244   store <8 x float> %res, ptr %a
245   ret void
248 define <2 x double> @fdiv_v2f64(<2 x double> %op1, <2 x double> %op2) {
249 ; CHECK-LABEL: fdiv_v2f64:
250 ; CHECK:       // %bb.0:
251 ; CHECK-NEXT:    ptrue p0.d, vl2
252 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
253 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
254 ; CHECK-NEXT:    fdiv z0.d, p0/m, z0.d, z1.d
255 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
256 ; CHECK-NEXT:    ret
257   %res = fdiv <2 x double> %op1, %op2
258   ret <2 x double> %res
261 define void @fdiv_v4f64(ptr %a, ptr %b) {
262 ; CHECK-LABEL: fdiv_v4f64:
263 ; CHECK:       // %bb.0:
264 ; CHECK-NEXT:    ptrue p0.d, vl2
265 ; CHECK-NEXT:    ldp q0, q3, [x1]
266 ; CHECK-NEXT:    ldp q1, q2, [x0]
267 ; CHECK-NEXT:    fdivr z0.d, p0/m, z0.d, z1.d
268 ; CHECK-NEXT:    movprfx z1, z2
269 ; CHECK-NEXT:    fdiv z1.d, p0/m, z1.d, z3.d
270 ; CHECK-NEXT:    stp q0, q1, [x0]
271 ; CHECK-NEXT:    ret
272   %op1 = load <4 x double>, ptr %a
273   %op2 = load <4 x double>, ptr %b
274   %res = fdiv <4 x double> %op1, %op2
275   store <4 x double> %res, ptr %a
276   ret void
280 ; FMA
283 define <2 x half> @fma_v2f16(<2 x half> %op1, <2 x half> %op2, <2 x half> %op3) {
284 ; CHECK-LABEL: fma_v2f16:
285 ; CHECK:       // %bb.0:
286 ; CHECK-NEXT:    ptrue p0.h, vl4
287 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
288 ; CHECK-NEXT:    // kill: def $d2 killed $d2 def $z2
289 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
290 ; CHECK-NEXT:    fmad z0.h, p0/m, z1.h, z2.h
291 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
292 ; CHECK-NEXT:    ret
293   %res = call <2 x half> @llvm.fma.v2f16(<2 x half> %op1, <2 x half> %op2, <2 x half> %op3)
294   ret <2 x half> %res
297 define <4 x half> @fma_v4f16(<4 x half> %op1, <4 x half> %op2, <4 x half> %op3) {
298 ; CHECK-LABEL: fma_v4f16:
299 ; CHECK:       // %bb.0:
300 ; CHECK-NEXT:    ptrue p0.h, vl4
301 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
302 ; CHECK-NEXT:    // kill: def $d2 killed $d2 def $z2
303 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
304 ; CHECK-NEXT:    fmad z0.h, p0/m, z1.h, z2.h
305 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
306 ; CHECK-NEXT:    ret
307   %res = call <4 x half> @llvm.fma.v4f16(<4 x half> %op1, <4 x half> %op2, <4 x half> %op3)
308   ret <4 x half> %res
311 define <8 x half> @fma_v8f16(<8 x half> %op1, <8 x half> %op2, <8 x half> %op3) {
312 ; CHECK-LABEL: fma_v8f16:
313 ; CHECK:       // %bb.0:
314 ; CHECK-NEXT:    ptrue p0.h, vl8
315 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
316 ; CHECK-NEXT:    // kill: def $q2 killed $q2 def $z2
317 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
318 ; CHECK-NEXT:    fmad z0.h, p0/m, z1.h, z2.h
319 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
320 ; CHECK-NEXT:    ret
321   %res = call <8 x half> @llvm.fma.v8f16(<8 x half> %op1, <8 x half> %op2, <8 x half> %op3)
322   ret <8 x half> %res
325 define void @fma_v16f16(ptr %a, ptr %b, ptr %c) {
326 ; CHECK-LABEL: fma_v16f16:
327 ; CHECK:       // %bb.0:
328 ; CHECK-NEXT:    ptrue p0.h, vl8
329 ; CHECK-NEXT:    ldp q0, q4, [x1]
330 ; CHECK-NEXT:    ldp q1, q5, [x2]
331 ; CHECK-NEXT:    ldp q2, q3, [x0]
332 ; CHECK-NEXT:    fmad z0.h, p0/m, z2.h, z1.h
333 ; CHECK-NEXT:    movprfx z1, z5
334 ; CHECK-NEXT:    fmla z1.h, p0/m, z3.h, z4.h
335 ; CHECK-NEXT:    stp q0, q1, [x0]
336 ; CHECK-NEXT:    ret
337   %op1 = load <16 x half>, ptr %a
338   %op2 = load <16 x half>, ptr %b
339   %op3 = load <16 x half>, ptr %c
340   %res = call <16 x half> @llvm.fma.v16f16(<16 x half> %op1, <16 x half> %op2, <16 x half> %op3)
341   store <16 x half> %res, ptr %a
342   ret void
345 define <2 x float> @fma_v2f32(<2 x float> %op1, <2 x float> %op2, <2 x float> %op3) {
346 ; CHECK-LABEL: fma_v2f32:
347 ; CHECK:       // %bb.0:
348 ; CHECK-NEXT:    ptrue p0.s, vl2
349 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
350 ; CHECK-NEXT:    // kill: def $d2 killed $d2 def $z2
351 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
352 ; CHECK-NEXT:    fmad z0.s, p0/m, z1.s, z2.s
353 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
354 ; CHECK-NEXT:    ret
355   %res = call <2 x float> @llvm.fma.v2f32(<2 x float> %op1, <2 x float> %op2, <2 x float> %op3)
356   ret <2 x float> %res
359 define <4 x float> @fma_v4f32(<4 x float> %op1, <4 x float> %op2, <4 x float> %op3) {
360 ; CHECK-LABEL: fma_v4f32:
361 ; CHECK:       // %bb.0:
362 ; CHECK-NEXT:    ptrue p0.s, vl4
363 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
364 ; CHECK-NEXT:    // kill: def $q2 killed $q2 def $z2
365 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
366 ; CHECK-NEXT:    fmad z0.s, p0/m, z1.s, z2.s
367 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
368 ; CHECK-NEXT:    ret
369   %res = call <4 x float> @llvm.fma.v4f32(<4 x float> %op1, <4 x float> %op2, <4 x float> %op3)
370   ret <4 x float> %res
373 define void @fma_v8f32(ptr %a, ptr %b, ptr %c) {
374 ; CHECK-LABEL: fma_v8f32:
375 ; CHECK:       // %bb.0:
376 ; CHECK-NEXT:    ptrue p0.s, vl4
377 ; CHECK-NEXT:    ldp q0, q4, [x1]
378 ; CHECK-NEXT:    ldp q1, q5, [x2]
379 ; CHECK-NEXT:    ldp q2, q3, [x0]
380 ; CHECK-NEXT:    fmad z0.s, p0/m, z2.s, z1.s
381 ; CHECK-NEXT:    movprfx z1, z5
382 ; CHECK-NEXT:    fmla z1.s, p0/m, z3.s, z4.s
383 ; CHECK-NEXT:    stp q0, q1, [x0]
384 ; CHECK-NEXT:    ret
385   %op1 = load <8 x float>, ptr %a
386   %op2 = load <8 x float>, ptr %b
387   %op3 = load <8 x float>, ptr %c
388   %res = call <8 x float> @llvm.fma.v8f32(<8 x float> %op1, <8 x float> %op2, <8 x float> %op3)
389   store <8 x float> %res, ptr %a
390   ret void
393 define <2 x double> @fma_v2f64(<2 x double> %op1, <2 x double> %op2, <2 x double> %op3) {
394 ; CHECK-LABEL: fma_v2f64:
395 ; CHECK:       // %bb.0:
396 ; CHECK-NEXT:    ptrue p0.d, vl2
397 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
398 ; CHECK-NEXT:    // kill: def $q2 killed $q2 def $z2
399 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
400 ; CHECK-NEXT:    fmad z0.d, p0/m, z1.d, z2.d
401 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
402 ; CHECK-NEXT:    ret
403   %res = call <2 x double> @llvm.fma.v2f64(<2 x double> %op1, <2 x double> %op2, <2 x double> %op3)
404   ret <2 x double> %res
407 define void @fma_v4f64(ptr %a, ptr %b, ptr %c) {
408 ; CHECK-LABEL: fma_v4f64:
409 ; CHECK:       // %bb.0:
410 ; CHECK-NEXT:    ptrue p0.d, vl2
411 ; CHECK-NEXT:    ldp q0, q4, [x1]
412 ; CHECK-NEXT:    ldp q1, q5, [x2]
413 ; CHECK-NEXT:    ldp q2, q3, [x0]
414 ; CHECK-NEXT:    fmad z0.d, p0/m, z2.d, z1.d
415 ; CHECK-NEXT:    movprfx z1, z5
416 ; CHECK-NEXT:    fmla z1.d, p0/m, z3.d, z4.d
417 ; CHECK-NEXT:    stp q0, q1, [x0]
418 ; CHECK-NEXT:    ret
419   %op1 = load <4 x double>, ptr %a
420   %op2 = load <4 x double>, ptr %b
421   %op3 = load <4 x double>, ptr %c
422   %res = call <4 x double> @llvm.fma.v4f64(<4 x double> %op1, <4 x double> %op2, <4 x double> %op3)
423   store <4 x double> %res, ptr %a
424   ret void
428 ; FMUL
431 define <2 x half> @fmul_v2f16(<2 x half> %op1, <2 x half> %op2) {
432 ; CHECK-LABEL: fmul_v2f16:
433 ; CHECK:       // %bb.0:
434 ; CHECK-NEXT:    ptrue p0.h, vl4
435 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
436 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
437 ; CHECK-NEXT:    fmul z0.h, p0/m, z0.h, z1.h
438 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
439 ; CHECK-NEXT:    ret
440   %res = fmul <2 x half> %op1, %op2
441   ret <2 x half> %res
444 define <4 x half> @fmul_v4f16(<4 x half> %op1, <4 x half> %op2) {
445 ; CHECK-LABEL: fmul_v4f16:
446 ; CHECK:       // %bb.0:
447 ; CHECK-NEXT:    ptrue p0.h, vl4
448 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
449 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
450 ; CHECK-NEXT:    fmul z0.h, p0/m, z0.h, z1.h
451 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
452 ; CHECK-NEXT:    ret
453   %res = fmul <4 x half> %op1, %op2
454   ret <4 x half> %res
457 define <8 x half> @fmul_v8f16(<8 x half> %op1, <8 x half> %op2) {
458 ; CHECK-LABEL: fmul_v8f16:
459 ; CHECK:       // %bb.0:
460 ; CHECK-NEXT:    ptrue p0.h, vl8
461 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
462 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
463 ; CHECK-NEXT:    fmul z0.h, p0/m, z0.h, z1.h
464 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
465 ; CHECK-NEXT:    ret
466   %res = fmul <8 x half> %op1, %op2
467   ret <8 x half> %res
470 define void @fmul_v16f16(ptr %a, ptr %b) {
471 ; CHECK-LABEL: fmul_v16f16:
472 ; CHECK:       // %bb.0:
473 ; CHECK-NEXT:    ptrue p0.h, vl8
474 ; CHECK-NEXT:    ldp q0, q3, [x1]
475 ; CHECK-NEXT:    ldp q1, q2, [x0]
476 ; CHECK-NEXT:    fmul z0.h, p0/m, z0.h, z1.h
477 ; CHECK-NEXT:    movprfx z1, z2
478 ; CHECK-NEXT:    fmul z1.h, p0/m, z1.h, z3.h
479 ; CHECK-NEXT:    stp q0, q1, [x0]
480 ; CHECK-NEXT:    ret
481   %op1 = load <16 x half>, ptr %a
482   %op2 = load <16 x half>, ptr %b
483   %res = fmul <16 x half> %op1, %op2
484   store <16 x half> %res, ptr %a
485   ret void
488 define <2 x float> @fmul_v2f32(<2 x float> %op1, <2 x float> %op2) {
489 ; CHECK-LABEL: fmul_v2f32:
490 ; CHECK:       // %bb.0:
491 ; CHECK-NEXT:    ptrue p0.s, vl2
492 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
493 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
494 ; CHECK-NEXT:    fmul z0.s, p0/m, z0.s, z1.s
495 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
496 ; CHECK-NEXT:    ret
497   %res = fmul <2 x float> %op1, %op2
498   ret <2 x float> %res
501 define <4 x float> @fmul_v4f32(<4 x float> %op1, <4 x float> %op2) {
502 ; CHECK-LABEL: fmul_v4f32:
503 ; CHECK:       // %bb.0:
504 ; CHECK-NEXT:    ptrue p0.s, vl4
505 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
506 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
507 ; CHECK-NEXT:    fmul z0.s, p0/m, z0.s, z1.s
508 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
509 ; CHECK-NEXT:    ret
510   %res = fmul <4 x float> %op1, %op2
511   ret <4 x float> %res
514 define void @fmul_v8f32(ptr %a, ptr %b) {
515 ; CHECK-LABEL: fmul_v8f32:
516 ; CHECK:       // %bb.0:
517 ; CHECK-NEXT:    ptrue p0.s, vl4
518 ; CHECK-NEXT:    ldp q0, q3, [x1]
519 ; CHECK-NEXT:    ldp q1, q2, [x0]
520 ; CHECK-NEXT:    fmul z0.s, p0/m, z0.s, z1.s
521 ; CHECK-NEXT:    movprfx z1, z2
522 ; CHECK-NEXT:    fmul z1.s, p0/m, z1.s, z3.s
523 ; CHECK-NEXT:    stp q0, q1, [x0]
524 ; CHECK-NEXT:    ret
525   %op1 = load <8 x float>, ptr %a
526   %op2 = load <8 x float>, ptr %b
527   %res = fmul <8 x float> %op1, %op2
528   store <8 x float> %res, ptr %a
529   ret void
532 define <2 x double> @fmul_v2f64(<2 x double> %op1, <2 x double> %op2) {
533 ; CHECK-LABEL: fmul_v2f64:
534 ; CHECK:       // %bb.0:
535 ; CHECK-NEXT:    ptrue p0.d, vl2
536 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
537 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
538 ; CHECK-NEXT:    fmul z0.d, p0/m, z0.d, z1.d
539 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
540 ; CHECK-NEXT:    ret
541   %res = fmul <2 x double> %op1, %op2
542   ret <2 x double> %res
545 define void @fmul_v4f64(ptr %a, ptr %b) {
546 ; CHECK-LABEL: fmul_v4f64:
547 ; CHECK:       // %bb.0:
548 ; CHECK-NEXT:    ptrue p0.d, vl2
549 ; CHECK-NEXT:    ldp q0, q3, [x1]
550 ; CHECK-NEXT:    ldp q1, q2, [x0]
551 ; CHECK-NEXT:    fmul z0.d, p0/m, z0.d, z1.d
552 ; CHECK-NEXT:    movprfx z1, z2
553 ; CHECK-NEXT:    fmul z1.d, p0/m, z1.d, z3.d
554 ; CHECK-NEXT:    stp q0, q1, [x0]
555 ; CHECK-NEXT:    ret
556   %op1 = load <4 x double>, ptr %a
557   %op2 = load <4 x double>, ptr %b
558   %res = fmul <4 x double> %op1, %op2
559   store <4 x double> %res, ptr %a
560   ret void
564 ; FNEG
567 define <2 x half> @fneg_v2f16(<2 x half> %op) {
568 ; CHECK-LABEL: fneg_v2f16:
569 ; CHECK:       // %bb.0:
570 ; CHECK-NEXT:    ptrue p0.h, vl4
571 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
572 ; CHECK-NEXT:    fneg z0.h, p0/m, z0.h
573 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
574 ; CHECK-NEXT:    ret
575   %res = fneg <2 x half> %op
576   ret <2 x half> %res
579 define <4 x half> @fneg_v4f16(<4 x half> %op) {
580 ; CHECK-LABEL: fneg_v4f16:
581 ; CHECK:       // %bb.0:
582 ; CHECK-NEXT:    ptrue p0.h, vl4
583 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
584 ; CHECK-NEXT:    fneg z0.h, p0/m, z0.h
585 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
586 ; CHECK-NEXT:    ret
587   %res = fneg <4 x half> %op
588   ret <4 x half> %res
591 define <8 x half> @fneg_v8f16(<8 x half> %op) {
592 ; CHECK-LABEL: fneg_v8f16:
593 ; CHECK:       // %bb.0:
594 ; CHECK-NEXT:    ptrue p0.h, vl8
595 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
596 ; CHECK-NEXT:    fneg z0.h, p0/m, z0.h
597 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
598 ; CHECK-NEXT:    ret
599   %res = fneg <8 x half> %op
600   ret <8 x half> %res
603 define void @fneg_v16f16(ptr %a, ptr %b) {
604 ; CHECK-LABEL: fneg_v16f16:
605 ; CHECK:       // %bb.0:
606 ; CHECK-NEXT:    ptrue p0.h, vl8
607 ; CHECK-NEXT:    ldp q0, q1, [x0]
608 ; CHECK-NEXT:    fneg z0.h, p0/m, z0.h
609 ; CHECK-NEXT:    fneg z1.h, p0/m, z1.h
610 ; CHECK-NEXT:    stp q0, q1, [x0]
611 ; CHECK-NEXT:    ret
612   %op = load <16 x half>, ptr %a
613   %res = fneg <16 x half> %op
614   store <16 x half> %res, ptr %a
615   ret void
618 define <2 x float> @fneg_v2f32(<2 x float> %op) {
619 ; CHECK-LABEL: fneg_v2f32:
620 ; CHECK:       // %bb.0:
621 ; CHECK-NEXT:    ptrue p0.s, vl2
622 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
623 ; CHECK-NEXT:    fneg z0.s, p0/m, z0.s
624 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
625 ; CHECK-NEXT:    ret
626   %res = fneg <2 x float> %op
627   ret <2 x float> %res
630 define <4 x float> @fneg_v4f32(<4 x float> %op) {
631 ; CHECK-LABEL: fneg_v4f32:
632 ; CHECK:       // %bb.0:
633 ; CHECK-NEXT:    ptrue p0.s, vl4
634 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
635 ; CHECK-NEXT:    fneg z0.s, p0/m, z0.s
636 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
637 ; CHECK-NEXT:    ret
638   %res = fneg <4 x float> %op
639   ret <4 x float> %res
642 define void @fneg_v8f32(ptr %a) {
643 ; CHECK-LABEL: fneg_v8f32:
644 ; CHECK:       // %bb.0:
645 ; CHECK-NEXT:    ptrue p0.s, vl4
646 ; CHECK-NEXT:    ldp q0, q1, [x0]
647 ; CHECK-NEXT:    fneg z0.s, p0/m, z0.s
648 ; CHECK-NEXT:    fneg z1.s, p0/m, z1.s
649 ; CHECK-NEXT:    stp q0, q1, [x0]
650 ; CHECK-NEXT:    ret
651   %op = load <8 x float>, ptr %a
652   %res = fneg <8 x float> %op
653   store <8 x float> %res, ptr %a
654   ret void
657 define <2 x double> @fneg_v2f64(<2 x double> %op) {
658 ; CHECK-LABEL: fneg_v2f64:
659 ; CHECK:       // %bb.0:
660 ; CHECK-NEXT:    ptrue p0.d, vl2
661 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
662 ; CHECK-NEXT:    fneg z0.d, p0/m, z0.d
663 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
664 ; CHECK-NEXT:    ret
665   %res = fneg <2 x double> %op
666   ret <2 x double> %res
669 define void @fneg_v4f64(ptr %a) {
670 ; CHECK-LABEL: fneg_v4f64:
671 ; CHECK:       // %bb.0:
672 ; CHECK-NEXT:    ptrue p0.d, vl2
673 ; CHECK-NEXT:    ldp q0, q1, [x0]
674 ; CHECK-NEXT:    fneg z0.d, p0/m, z0.d
675 ; CHECK-NEXT:    fneg z1.d, p0/m, z1.d
676 ; CHECK-NEXT:    stp q0, q1, [x0]
677 ; CHECK-NEXT:    ret
678   %op = load <4 x double>, ptr %a
679   %res = fneg <4 x double> %op
680   store <4 x double> %res, ptr %a
681   ret void
685 ; FSQRT
688 define <2 x half> @fsqrt_v2f16(<2 x half> %op) {
689 ; CHECK-LABEL: fsqrt_v2f16:
690 ; CHECK:       // %bb.0:
691 ; CHECK-NEXT:    ptrue p0.h, vl4
692 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
693 ; CHECK-NEXT:    fsqrt z0.h, p0/m, z0.h
694 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
695 ; CHECK-NEXT:    ret
696   %res = call <2 x half> @llvm.sqrt.v2f16(<2 x half> %op)
697   ret <2 x half> %res
700 define <4 x half> @fsqrt_v4f16(<4 x half> %op) {
701 ; CHECK-LABEL: fsqrt_v4f16:
702 ; CHECK:       // %bb.0:
703 ; CHECK-NEXT:    ptrue p0.h, vl4
704 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
705 ; CHECK-NEXT:    fsqrt z0.h, p0/m, z0.h
706 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
707 ; CHECK-NEXT:    ret
708   %res = call <4 x half> @llvm.sqrt.v4f16(<4 x half> %op)
709   ret <4 x half> %res
712 define <8 x half> @fsqrt_v8f16(<8 x half> %op) {
713 ; CHECK-LABEL: fsqrt_v8f16:
714 ; CHECK:       // %bb.0:
715 ; CHECK-NEXT:    ptrue p0.h, vl8
716 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
717 ; CHECK-NEXT:    fsqrt z0.h, p0/m, z0.h
718 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
719 ; CHECK-NEXT:    ret
720   %res = call <8 x half> @llvm.sqrt.v8f16(<8 x half> %op)
721   ret <8 x half> %res
724 define void @fsqrt_v16f16(ptr %a, ptr %b) {
725 ; CHECK-LABEL: fsqrt_v16f16:
726 ; CHECK:       // %bb.0:
727 ; CHECK-NEXT:    ptrue p0.h, vl8
728 ; CHECK-NEXT:    ldp q0, q1, [x0]
729 ; CHECK-NEXT:    fsqrt z0.h, p0/m, z0.h
730 ; CHECK-NEXT:    fsqrt z1.h, p0/m, z1.h
731 ; CHECK-NEXT:    stp q0, q1, [x0]
732 ; CHECK-NEXT:    ret
733   %op = load <16 x half>, ptr %a
734   %res = call <16 x half> @llvm.sqrt.v16f16(<16 x half> %op)
735   store <16 x half> %res, ptr %a
736   ret void
739 define <2 x float> @fsqrt_v2f32(<2 x float> %op) {
740 ; CHECK-LABEL: fsqrt_v2f32:
741 ; CHECK:       // %bb.0:
742 ; CHECK-NEXT:    ptrue p0.s, vl2
743 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
744 ; CHECK-NEXT:    fsqrt z0.s, p0/m, z0.s
745 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
746 ; CHECK-NEXT:    ret
747   %res = call <2 x float> @llvm.sqrt.v2f32(<2 x float> %op)
748   ret <2 x float> %res
751 define <4 x float> @fsqrt_v4f32(<4 x float> %op) {
752 ; CHECK-LABEL: fsqrt_v4f32:
753 ; CHECK:       // %bb.0:
754 ; CHECK-NEXT:    ptrue p0.s, vl4
755 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
756 ; CHECK-NEXT:    fsqrt z0.s, p0/m, z0.s
757 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
758 ; CHECK-NEXT:    ret
759   %res = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %op)
760   ret <4 x float> %res
763 define void @fsqrt_v8f32(ptr %a) {
764 ; CHECK-LABEL: fsqrt_v8f32:
765 ; CHECK:       // %bb.0:
766 ; CHECK-NEXT:    ptrue p0.s, vl4
767 ; CHECK-NEXT:    ldp q0, q1, [x0]
768 ; CHECK-NEXT:    fsqrt z0.s, p0/m, z0.s
769 ; CHECK-NEXT:    fsqrt z1.s, p0/m, z1.s
770 ; CHECK-NEXT:    stp q0, q1, [x0]
771 ; CHECK-NEXT:    ret
772   %op = load <8 x float>, ptr %a
773   %res = call <8 x float> @llvm.sqrt.v8f32(<8 x float> %op)
774   store <8 x float> %res, ptr %a
775   ret void
778 define <2 x double> @fsqrt_v2f64(<2 x double> %op) {
779 ; CHECK-LABEL: fsqrt_v2f64:
780 ; CHECK:       // %bb.0:
781 ; CHECK-NEXT:    ptrue p0.d, vl2
782 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
783 ; CHECK-NEXT:    fsqrt z0.d, p0/m, z0.d
784 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
785 ; CHECK-NEXT:    ret
786   %res = call <2 x double> @llvm.sqrt.v2f64(<2 x double> %op)
787   ret <2 x double> %res
790 define void @fsqrt_v4f64(ptr %a) {
791 ; CHECK-LABEL: fsqrt_v4f64:
792 ; CHECK:       // %bb.0:
793 ; CHECK-NEXT:    ptrue p0.d, vl2
794 ; CHECK-NEXT:    ldp q0, q1, [x0]
795 ; CHECK-NEXT:    fsqrt z0.d, p0/m, z0.d
796 ; CHECK-NEXT:    fsqrt z1.d, p0/m, z1.d
797 ; CHECK-NEXT:    stp q0, q1, [x0]
798 ; CHECK-NEXT:    ret
799   %op = load <4 x double>, ptr %a
800   %res = call <4 x double> @llvm.sqrt.v4f64(<4 x double> %op)
801   store <4 x double> %res, ptr %a
802   ret void
806 ; FSUB
809 define <2 x half> @fsub_v2f16(<2 x half> %op1, <2 x half> %op2) {
810 ; CHECK-LABEL: fsub_v2f16:
811 ; CHECK:       // %bb.0:
812 ; CHECK-NEXT:    ptrue p0.h, vl4
813 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
814 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
815 ; CHECK-NEXT:    fsub z0.h, p0/m, z0.h, z1.h
816 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
817 ; CHECK-NEXT:    ret
818   %res = fsub <2 x half> %op1, %op2
819   ret <2 x half> %res
822 define <4 x half> @fsub_v4f16(<4 x half> %op1, <4 x half> %op2) {
823 ; CHECK-LABEL: fsub_v4f16:
824 ; CHECK:       // %bb.0:
825 ; CHECK-NEXT:    ptrue p0.h, vl4
826 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
827 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
828 ; CHECK-NEXT:    fsub z0.h, p0/m, z0.h, z1.h
829 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
830 ; CHECK-NEXT:    ret
831   %res = fsub <4 x half> %op1, %op2
832   ret <4 x half> %res
835 define <8 x half> @fsub_v8f16(<8 x half> %op1, <8 x half> %op2) {
836 ; CHECK-LABEL: fsub_v8f16:
837 ; CHECK:       // %bb.0:
838 ; CHECK-NEXT:    ptrue p0.h, vl8
839 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
840 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
841 ; CHECK-NEXT:    fsub z0.h, p0/m, z0.h, z1.h
842 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
843 ; CHECK-NEXT:    ret
844   %res = fsub <8 x half> %op1, %op2
845   ret <8 x half> %res
848 define void @fsub_v16f16(ptr %a, ptr %b) {
849 ; CHECK-LABEL: fsub_v16f16:
850 ; CHECK:       // %bb.0:
851 ; CHECK-NEXT:    ptrue p0.h, vl8
852 ; CHECK-NEXT:    ldp q0, q3, [x1]
853 ; CHECK-NEXT:    ldp q1, q2, [x0]
854 ; CHECK-NEXT:    fsubr z0.h, p0/m, z0.h, z1.h
855 ; CHECK-NEXT:    movprfx z1, z2
856 ; CHECK-NEXT:    fsub z1.h, p0/m, z1.h, z3.h
857 ; CHECK-NEXT:    stp q0, q1, [x0]
858 ; CHECK-NEXT:    ret
859   %op1 = load <16 x half>, ptr %a
860   %op2 = load <16 x half>, ptr %b
861   %res = fsub <16 x half> %op1, %op2
862   store <16 x half> %res, ptr %a
863   ret void
866 define <2 x float> @fsub_v2f32(<2 x float> %op1, <2 x float> %op2) {
867 ; CHECK-LABEL: fsub_v2f32:
868 ; CHECK:       // %bb.0:
869 ; CHECK-NEXT:    ptrue p0.s, vl2
870 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
871 ; CHECK-NEXT:    // kill: def $d1 killed $d1 def $z1
872 ; CHECK-NEXT:    fsub z0.s, p0/m, z0.s, z1.s
873 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
874 ; CHECK-NEXT:    ret
875   %res = fsub <2 x float> %op1, %op2
876   ret <2 x float> %res
879 define <4 x float> @fsub_v4f32(<4 x float> %op1, <4 x float> %op2) {
880 ; CHECK-LABEL: fsub_v4f32:
881 ; CHECK:       // %bb.0:
882 ; CHECK-NEXT:    ptrue p0.s, vl4
883 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
884 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
885 ; CHECK-NEXT:    fsub z0.s, p0/m, z0.s, z1.s
886 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
887 ; CHECK-NEXT:    ret
888   %res = fsub <4 x float> %op1, %op2
889   ret <4 x float> %res
892 define void @fsub_v8f32(ptr %a, ptr %b) {
893 ; CHECK-LABEL: fsub_v8f32:
894 ; CHECK:       // %bb.0:
895 ; CHECK-NEXT:    ptrue p0.s, vl4
896 ; CHECK-NEXT:    ldp q0, q3, [x1]
897 ; CHECK-NEXT:    ldp q1, q2, [x0]
898 ; CHECK-NEXT:    fsubr z0.s, p0/m, z0.s, z1.s
899 ; CHECK-NEXT:    movprfx z1, z2
900 ; CHECK-NEXT:    fsub z1.s, p0/m, z1.s, z3.s
901 ; CHECK-NEXT:    stp q0, q1, [x0]
902 ; CHECK-NEXT:    ret
903   %op1 = load <8 x float>, ptr %a
904   %op2 = load <8 x float>, ptr %b
905   %res = fsub <8 x float> %op1, %op2
906   store <8 x float> %res, ptr %a
907   ret void
910 define <2 x double> @fsub_v2f64(<2 x double> %op1, <2 x double> %op2) {
911 ; CHECK-LABEL: fsub_v2f64:
912 ; CHECK:       // %bb.0:
913 ; CHECK-NEXT:    ptrue p0.d, vl2
914 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
915 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
916 ; CHECK-NEXT:    fsub z0.d, p0/m, z0.d, z1.d
917 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
918 ; CHECK-NEXT:    ret
919   %res = fsub <2 x double> %op1, %op2
920   ret <2 x double> %res
923 define void @fsub_v4f64(ptr %a, ptr %b) {
924 ; CHECK-LABEL: fsub_v4f64:
925 ; CHECK:       // %bb.0:
926 ; CHECK-NEXT:    ptrue p0.d, vl2
927 ; CHECK-NEXT:    ldp q0, q3, [x1]
928 ; CHECK-NEXT:    ldp q1, q2, [x0]
929 ; CHECK-NEXT:    fsubr z0.d, p0/m, z0.d, z1.d
930 ; CHECK-NEXT:    movprfx z1, z2
931 ; CHECK-NEXT:    fsub z1.d, p0/m, z1.d, z3.d
932 ; CHECK-NEXT:    stp q0, q1, [x0]
933 ; CHECK-NEXT:    ret
934   %op1 = load <4 x double>, ptr %a
935   %op2 = load <4 x double>, ptr %b
936   %res = fsub <4 x double> %op1, %op2
937   store <4 x double> %res, ptr %a
938   ret void
942 ; FABS
945 define <2 x half> @fabs_v2f16(<2 x half> %op) {
946 ; CHECK-LABEL: fabs_v2f16:
947 ; CHECK:       // %bb.0:
948 ; CHECK-NEXT:    ptrue p0.h, vl4
949 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
950 ; CHECK-NEXT:    fabs z0.h, p0/m, z0.h
951 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
952 ; CHECK-NEXT:    ret
953   %res = call <2 x half> @llvm.fabs.v2f16(<2 x half> %op)
954   ret <2 x half> %res
957 define <4 x half> @fabs_v4f16(<4 x half> %op) {
958 ; CHECK-LABEL: fabs_v4f16:
959 ; CHECK:       // %bb.0:
960 ; CHECK-NEXT:    ptrue p0.h, vl4
961 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
962 ; CHECK-NEXT:    fabs z0.h, p0/m, z0.h
963 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
964 ; CHECK-NEXT:    ret
965   %res = call <4 x half> @llvm.fabs.v4f16(<4 x half> %op)
966   ret <4 x half> %res
969 define <8 x half> @fabs_v8f16(<8 x half> %op) {
970 ; CHECK-LABEL: fabs_v8f16:
971 ; CHECK:       // %bb.0:
972 ; CHECK-NEXT:    ptrue p0.h, vl8
973 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
974 ; CHECK-NEXT:    fabs z0.h, p0/m, z0.h
975 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
976 ; CHECK-NEXT:    ret
977   %res = call <8 x half> @llvm.fabs.v8f16(<8 x half> %op)
978   ret <8 x half> %res
981 define void @fabs_v16f16(ptr %a) {
982 ; CHECK-LABEL: fabs_v16f16:
983 ; CHECK:       // %bb.0:
984 ; CHECK-NEXT:    ptrue p0.h, vl8
985 ; CHECK-NEXT:    ldp q0, q1, [x0]
986 ; CHECK-NEXT:    fabs z0.h, p0/m, z0.h
987 ; CHECK-NEXT:    fabs z1.h, p0/m, z1.h
988 ; CHECK-NEXT:    stp q0, q1, [x0]
989 ; CHECK-NEXT:    ret
990   %op = load <16 x half>, ptr %a
991   %res = call <16 x half> @llvm.fabs.v16f16(<16 x half> %op)
992   store <16 x half> %res, ptr %a
993   ret void
996 define <2 x float> @fabs_v2f32(<2 x float> %op) {
997 ; CHECK-LABEL: fabs_v2f32:
998 ; CHECK:       // %bb.0:
999 ; CHECK-NEXT:    ptrue p0.s, vl2
1000 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1001 ; CHECK-NEXT:    fabs z0.s, p0/m, z0.s
1002 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1003 ; CHECK-NEXT:    ret
1004   %res = call <2 x float> @llvm.fabs.v2f32(<2 x float> %op)
1005   ret <2 x float> %res
1008 define <4 x float> @fabs_v4f32(<4 x float> %op) {
1009 ; CHECK-LABEL: fabs_v4f32:
1010 ; CHECK:       // %bb.0:
1011 ; CHECK-NEXT:    ptrue p0.s, vl4
1012 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1013 ; CHECK-NEXT:    fabs z0.s, p0/m, z0.s
1014 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1015 ; CHECK-NEXT:    ret
1016   %res = call <4 x float> @llvm.fabs.v4f32(<4 x float> %op)
1017   ret <4 x float> %res
1020 define void @fabs_v8f32(ptr %a) {
1021 ; CHECK-LABEL: fabs_v8f32:
1022 ; CHECK:       // %bb.0:
1023 ; CHECK-NEXT:    ptrue p0.s, vl4
1024 ; CHECK-NEXT:    ldp q0, q1, [x0]
1025 ; CHECK-NEXT:    fabs z0.s, p0/m, z0.s
1026 ; CHECK-NEXT:    fabs z1.s, p0/m, z1.s
1027 ; CHECK-NEXT:    stp q0, q1, [x0]
1028 ; CHECK-NEXT:    ret
1029   %op = load <8 x float>, ptr %a
1030   %res = call <8 x float> @llvm.fabs.v8f32(<8 x float> %op)
1031   store <8 x float> %res, ptr %a
1032   ret void
1035 define <2 x double> @fabs_v2f64(<2 x double> %op) {
1036 ; CHECK-LABEL: fabs_v2f64:
1037 ; CHECK:       // %bb.0:
1038 ; CHECK-NEXT:    ptrue p0.d, vl2
1039 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1040 ; CHECK-NEXT:    fabs z0.d, p0/m, z0.d
1041 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1042 ; CHECK-NEXT:    ret
1043   %res = call <2 x double> @llvm.fabs.v2f64(<2 x double> %op)
1044   ret <2 x double> %res
1047 define void @fabs_v4f64(ptr %a) {
1048 ; CHECK-LABEL: fabs_v4f64:
1049 ; CHECK:       // %bb.0:
1050 ; CHECK-NEXT:    ptrue p0.d, vl2
1051 ; CHECK-NEXT:    ldp q0, q1, [x0]
1052 ; CHECK-NEXT:    fabs z0.d, p0/m, z0.d
1053 ; CHECK-NEXT:    fabs z1.d, p0/m, z1.d
1054 ; CHECK-NEXT:    stp q0, q1, [x0]
1055 ; CHECK-NEXT:    ret
1056   %op = load <4 x double>, ptr %a
1057   %res = call <4 x double> @llvm.fabs.v4f64(<4 x double> %op)
1058   store <4 x double> %res, ptr %a
1059   ret void
1062 declare <2 x half> @llvm.fma.v2f16(<2 x half>, <2 x half>, <2 x half>)
1063 declare <4 x half> @llvm.fma.v4f16(<4 x half>, <4 x half>, <4 x half>)
1064 declare <8 x half> @llvm.fma.v8f16(<8 x half>, <8 x half>, <8 x half>)
1065 declare <16 x half> @llvm.fma.v16f16(<16 x half>, <16 x half>, <16 x half>)
1066 declare <2 x float> @llvm.fma.v2f32(<2 x float>, <2 x float>, <2 x float>)
1067 declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>)
1068 declare <8 x float> @llvm.fma.v8f32(<8 x float>, <8 x float>, <8 x float>)
1069 declare <2 x double> @llvm.fma.v2f64(<2 x double>, <2 x double>, <2 x double>)
1070 declare <4 x double> @llvm.fma.v4f64(<4 x double>, <4 x double>, <4 x double>)
1072 declare <2 x half> @llvm.sqrt.v2f16(<2 x half>)
1073 declare <4 x half> @llvm.sqrt.v4f16(<4 x half>)
1074 declare <8 x half> @llvm.sqrt.v8f16(<8 x half>)
1075 declare <16 x half> @llvm.sqrt.v16f16(<16 x half>)
1076 declare <2 x float> @llvm.sqrt.v2f32(<2 x float>)
1077 declare <4 x float> @llvm.sqrt.v4f32(<4 x float>)
1078 declare <8 x float> @llvm.sqrt.v8f32(<8 x float>)
1079 declare <2 x double> @llvm.sqrt.v2f64(<2 x double>)
1080 declare <4 x double> @llvm.sqrt.v4f64(<4 x double>)
1082 declare <2 x half> @llvm.fabs.v2f16(<2 x half>)
1083 declare <4 x half> @llvm.fabs.v4f16(<4 x half>)
1084 declare <8 x half> @llvm.fabs.v8f16(<8 x half>)
1085 declare <16 x half> @llvm.fabs.v16f16(<16 x half>)
1086 declare <2 x float> @llvm.fabs.v2f32(<2 x float>)
1087 declare <4 x float> @llvm.fabs.v4f32(<4 x float>)
1088 declare <8 x float> @llvm.fabs.v8f32(<8 x float>)
1089 declare <2 x double> @llvm.fabs.v2f64(<2 x double>)
1090 declare <4 x double> @llvm.fabs.v4f64(<4 x double>)