1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s
3 ; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s
4 ; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
6 target triple = "aarch64-unknown-linux-gnu"
12 define <4 x half> @fmaxnm_v4f16(<4 x half> %op1, <4 x half> %op2) {
13 ; CHECK-LABEL: fmaxnm_v4f16:
15 ; CHECK-NEXT: ptrue p0.h, vl4
16 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
17 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
18 ; CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h
19 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
22 ; NONEON-NOSVE-LABEL: fmaxnm_v4f16:
23 ; NONEON-NOSVE: // %bb.0:
24 ; NONEON-NOSVE-NEXT: sub sp, sp, #32
25 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32
26 ; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]
27 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]
28 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]
29 ; NONEON-NOSVE-NEXT: fcvt s0, h0
30 ; NONEON-NOSVE-NEXT: fcvt s1, h1
31 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
32 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]
33 ; NONEON-NOSVE-NEXT: fcvt s1, h1
34 ; NONEON-NOSVE-NEXT: fcvt h0, s0
35 ; NONEON-NOSVE-NEXT: str h0, [sp, #30]
36 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]
37 ; NONEON-NOSVE-NEXT: fcvt s0, h0
38 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
39 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]
40 ; NONEON-NOSVE-NEXT: fcvt s1, h1
41 ; NONEON-NOSVE-NEXT: fcvt h0, s0
42 ; NONEON-NOSVE-NEXT: str h0, [sp, #28]
43 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]
44 ; NONEON-NOSVE-NEXT: fcvt s0, h0
45 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
46 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]
47 ; NONEON-NOSVE-NEXT: fcvt s1, h1
48 ; NONEON-NOSVE-NEXT: fcvt h0, s0
49 ; NONEON-NOSVE-NEXT: str h0, [sp, #26]
50 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]
51 ; NONEON-NOSVE-NEXT: fcvt s0, h0
52 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
53 ; NONEON-NOSVE-NEXT: fcvt h0, s0
54 ; NONEON-NOSVE-NEXT: str h0, [sp, #24]
55 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
56 ; NONEON-NOSVE-NEXT: add sp, sp, #32
57 ; NONEON-NOSVE-NEXT: ret
58 %res = call <4 x half> @llvm.maxnum.v4f16(<4 x half> %op1, <4 x half> %op2)
62 define <8 x half> @fmaxnm_v8f16(<8 x half> %op1, <8 x half> %op2) {
63 ; CHECK-LABEL: fmaxnm_v8f16:
65 ; CHECK-NEXT: ptrue p0.h, vl8
66 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
67 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
68 ; CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h
69 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
72 ; NONEON-NOSVE-LABEL: fmaxnm_v8f16:
73 ; NONEON-NOSVE: // %bb.0:
74 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!
75 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48
76 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]
77 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]
78 ; NONEON-NOSVE-NEXT: fcvt s0, h0
79 ; NONEON-NOSVE-NEXT: fcvt s1, h1
80 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
81 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]
82 ; NONEON-NOSVE-NEXT: fcvt s1, h1
83 ; NONEON-NOSVE-NEXT: fcvt h0, s0
84 ; NONEON-NOSVE-NEXT: str h0, [sp, #46]
85 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]
86 ; NONEON-NOSVE-NEXT: fcvt s0, h0
87 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
88 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]
89 ; NONEON-NOSVE-NEXT: fcvt s1, h1
90 ; NONEON-NOSVE-NEXT: fcvt h0, s0
91 ; NONEON-NOSVE-NEXT: str h0, [sp, #44]
92 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]
93 ; NONEON-NOSVE-NEXT: fcvt s0, h0
94 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
95 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]
96 ; NONEON-NOSVE-NEXT: fcvt s1, h1
97 ; NONEON-NOSVE-NEXT: fcvt h0, s0
98 ; NONEON-NOSVE-NEXT: str h0, [sp, #42]
99 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]
100 ; NONEON-NOSVE-NEXT: fcvt s0, h0
101 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
102 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]
103 ; NONEON-NOSVE-NEXT: fcvt s1, h1
104 ; NONEON-NOSVE-NEXT: fcvt h0, s0
105 ; NONEON-NOSVE-NEXT: str h0, [sp, #40]
106 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]
107 ; NONEON-NOSVE-NEXT: fcvt s0, h0
108 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
109 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]
110 ; NONEON-NOSVE-NEXT: fcvt s1, h1
111 ; NONEON-NOSVE-NEXT: fcvt h0, s0
112 ; NONEON-NOSVE-NEXT: str h0, [sp, #38]
113 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]
114 ; NONEON-NOSVE-NEXT: fcvt s0, h0
115 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
116 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]
117 ; NONEON-NOSVE-NEXT: fcvt s1, h1
118 ; NONEON-NOSVE-NEXT: fcvt h0, s0
119 ; NONEON-NOSVE-NEXT: str h0, [sp, #36]
120 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]
121 ; NONEON-NOSVE-NEXT: fcvt s0, h0
122 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
123 ; NONEON-NOSVE-NEXT: ldr h1, [sp]
124 ; NONEON-NOSVE-NEXT: fcvt s1, h1
125 ; NONEON-NOSVE-NEXT: fcvt h0, s0
126 ; NONEON-NOSVE-NEXT: str h0, [sp, #34]
127 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]
128 ; NONEON-NOSVE-NEXT: fcvt s0, h0
129 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
130 ; NONEON-NOSVE-NEXT: fcvt h0, s0
131 ; NONEON-NOSVE-NEXT: str h0, [sp, #32]
132 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
133 ; NONEON-NOSVE-NEXT: add sp, sp, #48
134 ; NONEON-NOSVE-NEXT: ret
135 %res = call <8 x half> @llvm.maxnum.v8f16(<8 x half> %op1, <8 x half> %op2)
139 define void @fmaxnm_v16f16(ptr %a, ptr %b) {
140 ; CHECK-LABEL: fmaxnm_v16f16:
142 ; CHECK-NEXT: ldp q0, q3, [x1]
143 ; CHECK-NEXT: ptrue p0.h, vl8
144 ; CHECK-NEXT: ldp q1, q2, [x0]
145 ; CHECK-NEXT: fmaxnm z0.h, p0/m, z0.h, z1.h
146 ; CHECK-NEXT: movprfx z1, z2
147 ; CHECK-NEXT: fmaxnm z1.h, p0/m, z1.h, z3.h
148 ; CHECK-NEXT: stp q0, q1, [x0]
151 ; NONEON-NOSVE-LABEL: fmaxnm_v16f16:
152 ; NONEON-NOSVE: // %bb.0:
153 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
154 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96
155 ; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]
156 ; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]
157 ; NONEON-NOSVE-NEXT: stp q2, q3, [sp]
158 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]
159 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #62]
160 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #46]
161 ; NONEON-NOSVE-NEXT: fcvt s0, h0
162 ; NONEON-NOSVE-NEXT: fcvt s1, h1
163 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
164 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #44]
165 ; NONEON-NOSVE-NEXT: fcvt s1, h1
166 ; NONEON-NOSVE-NEXT: fcvt h0, s0
167 ; NONEON-NOSVE-NEXT: str h0, [sp, #94]
168 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #60]
169 ; NONEON-NOSVE-NEXT: fcvt s0, h0
170 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
171 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #42]
172 ; NONEON-NOSVE-NEXT: fcvt s1, h1
173 ; NONEON-NOSVE-NEXT: fcvt h0, s0
174 ; NONEON-NOSVE-NEXT: str h0, [sp, #92]
175 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #58]
176 ; NONEON-NOSVE-NEXT: fcvt s0, h0
177 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
178 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #40]
179 ; NONEON-NOSVE-NEXT: fcvt s1, h1
180 ; NONEON-NOSVE-NEXT: fcvt h0, s0
181 ; NONEON-NOSVE-NEXT: str h0, [sp, #90]
182 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #56]
183 ; NONEON-NOSVE-NEXT: fcvt s0, h0
184 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
185 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #38]
186 ; NONEON-NOSVE-NEXT: fcvt s1, h1
187 ; NONEON-NOSVE-NEXT: fcvt h0, s0
188 ; NONEON-NOSVE-NEXT: str h0, [sp, #88]
189 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #54]
190 ; NONEON-NOSVE-NEXT: fcvt s0, h0
191 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
192 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #36]
193 ; NONEON-NOSVE-NEXT: fcvt s1, h1
194 ; NONEON-NOSVE-NEXT: fcvt h0, s0
195 ; NONEON-NOSVE-NEXT: str h0, [sp, #86]
196 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #52]
197 ; NONEON-NOSVE-NEXT: fcvt s0, h0
198 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
199 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #34]
200 ; NONEON-NOSVE-NEXT: fcvt s1, h1
201 ; NONEON-NOSVE-NEXT: fcvt h0, s0
202 ; NONEON-NOSVE-NEXT: str h0, [sp, #84]
203 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #50]
204 ; NONEON-NOSVE-NEXT: fcvt s0, h0
205 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
206 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #32]
207 ; NONEON-NOSVE-NEXT: fcvt s1, h1
208 ; NONEON-NOSVE-NEXT: fcvt h0, s0
209 ; NONEON-NOSVE-NEXT: str h0, [sp, #82]
210 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #48]
211 ; NONEON-NOSVE-NEXT: fcvt s0, h0
212 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
213 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]
214 ; NONEON-NOSVE-NEXT: fcvt s1, h1
215 ; NONEON-NOSVE-NEXT: fcvt h0, s0
216 ; NONEON-NOSVE-NEXT: str h0, [sp, #80]
217 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]
218 ; NONEON-NOSVE-NEXT: fcvt s0, h0
219 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
220 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]
221 ; NONEON-NOSVE-NEXT: fcvt s1, h1
222 ; NONEON-NOSVE-NEXT: fcvt h0, s0
223 ; NONEON-NOSVE-NEXT: str h0, [sp, #78]
224 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]
225 ; NONEON-NOSVE-NEXT: fcvt s0, h0
226 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
227 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]
228 ; NONEON-NOSVE-NEXT: fcvt s1, h1
229 ; NONEON-NOSVE-NEXT: fcvt h0, s0
230 ; NONEON-NOSVE-NEXT: str h0, [sp, #76]
231 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]
232 ; NONEON-NOSVE-NEXT: fcvt s0, h0
233 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
234 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]
235 ; NONEON-NOSVE-NEXT: fcvt s1, h1
236 ; NONEON-NOSVE-NEXT: fcvt h0, s0
237 ; NONEON-NOSVE-NEXT: str h0, [sp, #74]
238 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]
239 ; NONEON-NOSVE-NEXT: fcvt s0, h0
240 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
241 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]
242 ; NONEON-NOSVE-NEXT: fcvt s1, h1
243 ; NONEON-NOSVE-NEXT: fcvt h0, s0
244 ; NONEON-NOSVE-NEXT: str h0, [sp, #72]
245 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]
246 ; NONEON-NOSVE-NEXT: fcvt s0, h0
247 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
248 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]
249 ; NONEON-NOSVE-NEXT: fcvt s1, h1
250 ; NONEON-NOSVE-NEXT: fcvt h0, s0
251 ; NONEON-NOSVE-NEXT: str h0, [sp, #70]
252 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]
253 ; NONEON-NOSVE-NEXT: fcvt s0, h0
254 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
255 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]
256 ; NONEON-NOSVE-NEXT: fcvt s1, h1
257 ; NONEON-NOSVE-NEXT: fcvt h0, s0
258 ; NONEON-NOSVE-NEXT: str h0, [sp, #68]
259 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]
260 ; NONEON-NOSVE-NEXT: fcvt s0, h0
261 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
262 ; NONEON-NOSVE-NEXT: ldr h1, [sp]
263 ; NONEON-NOSVE-NEXT: fcvt s1, h1
264 ; NONEON-NOSVE-NEXT: fcvt h0, s0
265 ; NONEON-NOSVE-NEXT: str h0, [sp, #66]
266 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]
267 ; NONEON-NOSVE-NEXT: fcvt s0, h0
268 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
269 ; NONEON-NOSVE-NEXT: fcvt h0, s0
270 ; NONEON-NOSVE-NEXT: str h0, [sp, #64]
271 ; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]
272 ; NONEON-NOSVE-NEXT: stp q0, q1, [x0]
273 ; NONEON-NOSVE-NEXT: add sp, sp, #96
274 ; NONEON-NOSVE-NEXT: ret
275 %op1 = load <16 x half>, ptr %a
276 %op2 = load <16 x half>, ptr %b
277 %res = call <16 x half> @llvm.maxnum.v16f16(<16 x half> %op1, <16 x half> %op2)
278 store <16 x half> %res, ptr %a
282 define <2 x float> @fmaxnm_v2f32(<2 x float> %op1, <2 x float> %op2) {
283 ; CHECK-LABEL: fmaxnm_v2f32:
285 ; CHECK-NEXT: ptrue p0.s, vl2
286 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
287 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
288 ; CHECK-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s
289 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
292 ; NONEON-NOSVE-LABEL: fmaxnm_v2f32:
293 ; NONEON-NOSVE: // %bb.0:
294 ; NONEON-NOSVE-NEXT: sub sp, sp, #32
295 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32
296 ; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]
297 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]
298 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]
299 ; NONEON-NOSVE-NEXT: fmaxnm s3, s2, s0
300 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]
301 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
302 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #24]
303 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
304 ; NONEON-NOSVE-NEXT: add sp, sp, #32
305 ; NONEON-NOSVE-NEXT: ret
306 %res = call <2 x float> @llvm.maxnum.v2f32(<2 x float> %op1, <2 x float> %op2)
310 define <4 x float> @fmaxnm_v4f32(<4 x float> %op1, <4 x float> %op2) {
311 ; CHECK-LABEL: fmaxnm_v4f32:
313 ; CHECK-NEXT: ptrue p0.s, vl4
314 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
315 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
316 ; CHECK-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s
317 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
320 ; NONEON-NOSVE-LABEL: fmaxnm_v4f32:
321 ; NONEON-NOSVE: // %bb.0:
322 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!
323 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48
324 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]
325 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]
326 ; NONEON-NOSVE-NEXT: fmaxnm s3, s2, s0
327 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]
328 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
329 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]
330 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #40]
331 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]
332 ; NONEON-NOSVE-NEXT: fmaxnm s3, s2, s0
333 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]
334 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
335 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #32]
336 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
337 ; NONEON-NOSVE-NEXT: add sp, sp, #48
338 ; NONEON-NOSVE-NEXT: ret
339 %res = call <4 x float> @llvm.maxnum.v4f32(<4 x float> %op1, <4 x float> %op2)
343 define void @fmaxnm_v8f32(ptr %a, ptr %b) {
344 ; CHECK-LABEL: fmaxnm_v8f32:
346 ; CHECK-NEXT: ldp q0, q3, [x1]
347 ; CHECK-NEXT: ptrue p0.s, vl4
348 ; CHECK-NEXT: ldp q1, q2, [x0]
349 ; CHECK-NEXT: fmaxnm z0.s, p0/m, z0.s, z1.s
350 ; CHECK-NEXT: movprfx z1, z2
351 ; CHECK-NEXT: fmaxnm z1.s, p0/m, z1.s, z3.s
352 ; CHECK-NEXT: stp q0, q1, [x0]
355 ; NONEON-NOSVE-LABEL: fmaxnm_v8f32:
356 ; NONEON-NOSVE: // %bb.0:
357 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
358 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96
359 ; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]
360 ; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]
361 ; NONEON-NOSVE-NEXT: stp q2, q3, [sp]
362 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]
363 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #40]
364 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #60]
365 ; NONEON-NOSVE-NEXT: fmaxnm s3, s2, s0
366 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #56]
367 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
368 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #32]
369 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #88]
370 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #52]
371 ; NONEON-NOSVE-NEXT: fmaxnm s3, s2, s0
372 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]
373 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
374 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]
375 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #80]
376 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]
377 ; NONEON-NOSVE-NEXT: fmaxnm s3, s2, s0
378 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]
379 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
380 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]
381 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #72]
382 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]
383 ; NONEON-NOSVE-NEXT: fmaxnm s3, s2, s0
384 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]
385 ; NONEON-NOSVE-NEXT: fmaxnm s0, s1, s0
386 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #64]
387 ; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]
388 ; NONEON-NOSVE-NEXT: stp q0, q1, [x0]
389 ; NONEON-NOSVE-NEXT: add sp, sp, #96
390 ; NONEON-NOSVE-NEXT: ret
391 %op1 = load <8 x float>, ptr %a
392 %op2 = load <8 x float>, ptr %b
393 %res = call <8 x float> @llvm.maxnum.v8f32(<8 x float> %op1, <8 x float> %op2)
394 store <8 x float> %res, ptr %a
398 define <1 x double> @fmaxnm_v1f64(<1 x double> %op1, <1 x double> %op2) {
399 ; CHECK-LABEL: fmaxnm_v1f64:
401 ; CHECK-NEXT: fmaxnm d0, d0, d1
404 ; NONEON-NOSVE-LABEL: fmaxnm_v1f64:
405 ; NONEON-NOSVE: // %bb.0:
406 ; NONEON-NOSVE-NEXT: sub sp, sp, #16
407 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
408 ; NONEON-NOSVE-NEXT: fmaxnm d0, d0, d1
409 ; NONEON-NOSVE-NEXT: str d0, [sp, #8]
410 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
411 ; NONEON-NOSVE-NEXT: add sp, sp, #16
412 ; NONEON-NOSVE-NEXT: ret
413 %res = call <1 x double> @llvm.maxnum.v1f64(<1 x double> %op1, <1 x double> %op2)
414 ret <1 x double> %res
417 define <2 x double> @fmaxnm_v2f64(<2 x double> %op1, <2 x double> %op2) {
418 ; CHECK-LABEL: fmaxnm_v2f64:
420 ; CHECK-NEXT: ptrue p0.d, vl2
421 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
422 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
423 ; CHECK-NEXT: fmaxnm z0.d, p0/m, z0.d, z1.d
424 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
427 ; NONEON-NOSVE-LABEL: fmaxnm_v2f64:
428 ; NONEON-NOSVE: // %bb.0:
429 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!
430 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48
431 ; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]
432 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
433 ; NONEON-NOSVE-NEXT: fmaxnm d3, d2, d0
434 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]
435 ; NONEON-NOSVE-NEXT: fmaxnm d0, d1, d0
436 ; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #32]
437 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
438 ; NONEON-NOSVE-NEXT: add sp, sp, #48
439 ; NONEON-NOSVE-NEXT: ret
440 %res = call <2 x double> @llvm.maxnum.v2f64(<2 x double> %op1, <2 x double> %op2)
441 ret <2 x double> %res
444 define void @fmaxnm_v4f64(ptr %a, ptr %b) {
445 ; CHECK-LABEL: fmaxnm_v4f64:
447 ; CHECK-NEXT: ldp q0, q3, [x1]
448 ; CHECK-NEXT: ptrue p0.d, vl2
449 ; CHECK-NEXT: ldp q1, q2, [x0]
450 ; CHECK-NEXT: fmaxnm z0.d, p0/m, z0.d, z1.d
451 ; CHECK-NEXT: movprfx z1, z2
452 ; CHECK-NEXT: fmaxnm z1.d, p0/m, z1.d, z3.d
453 ; CHECK-NEXT: stp q0, q1, [x0]
456 ; NONEON-NOSVE-LABEL: fmaxnm_v4f64:
457 ; NONEON-NOSVE: // %bb.0:
458 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
459 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96
460 ; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]
461 ; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]
462 ; NONEON-NOSVE-NEXT: stp q2, q3, [sp]
463 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]
464 ; NONEON-NOSVE-NEXT: ldp d1, d2, [sp, #32]
465 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #56]
466 ; NONEON-NOSVE-NEXT: fmaxnm d3, d2, d0
467 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #48]
468 ; NONEON-NOSVE-NEXT: fmaxnm d0, d1, d0
469 ; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]
470 ; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #80]
471 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
472 ; NONEON-NOSVE-NEXT: fmaxnm d3, d2, d0
473 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]
474 ; NONEON-NOSVE-NEXT: fmaxnm d0, d1, d0
475 ; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #64]
476 ; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]
477 ; NONEON-NOSVE-NEXT: stp q0, q1, [x0]
478 ; NONEON-NOSVE-NEXT: add sp, sp, #96
479 ; NONEON-NOSVE-NEXT: ret
480 %op1 = load <4 x double>, ptr %a
481 %op2 = load <4 x double>, ptr %b
482 %res = call <4 x double> @llvm.maxnum.v4f64(<4 x double> %op1, <4 x double> %op2)
483 store <4 x double> %res, ptr %a
491 define <4 x half> @fminnm_v4f16(<4 x half> %op1, <4 x half> %op2) {
492 ; CHECK-LABEL: fminnm_v4f16:
494 ; CHECK-NEXT: ptrue p0.h, vl4
495 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
496 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
497 ; CHECK-NEXT: fminnm z0.h, p0/m, z0.h, z1.h
498 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
501 ; NONEON-NOSVE-LABEL: fminnm_v4f16:
502 ; NONEON-NOSVE: // %bb.0:
503 ; NONEON-NOSVE-NEXT: sub sp, sp, #32
504 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32
505 ; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]
506 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]
507 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]
508 ; NONEON-NOSVE-NEXT: fcvt s0, h0
509 ; NONEON-NOSVE-NEXT: fcvt s1, h1
510 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
511 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]
512 ; NONEON-NOSVE-NEXT: fcvt s1, h1
513 ; NONEON-NOSVE-NEXT: fcvt h0, s0
514 ; NONEON-NOSVE-NEXT: str h0, [sp, #30]
515 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]
516 ; NONEON-NOSVE-NEXT: fcvt s0, h0
517 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
518 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]
519 ; NONEON-NOSVE-NEXT: fcvt s1, h1
520 ; NONEON-NOSVE-NEXT: fcvt h0, s0
521 ; NONEON-NOSVE-NEXT: str h0, [sp, #28]
522 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]
523 ; NONEON-NOSVE-NEXT: fcvt s0, h0
524 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
525 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]
526 ; NONEON-NOSVE-NEXT: fcvt s1, h1
527 ; NONEON-NOSVE-NEXT: fcvt h0, s0
528 ; NONEON-NOSVE-NEXT: str h0, [sp, #26]
529 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]
530 ; NONEON-NOSVE-NEXT: fcvt s0, h0
531 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
532 ; NONEON-NOSVE-NEXT: fcvt h0, s0
533 ; NONEON-NOSVE-NEXT: str h0, [sp, #24]
534 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
535 ; NONEON-NOSVE-NEXT: add sp, sp, #32
536 ; NONEON-NOSVE-NEXT: ret
537 %res = call <4 x half> @llvm.minnum.v4f16(<4 x half> %op1, <4 x half> %op2)
541 define <8 x half> @fminnm_v8f16(<8 x half> %op1, <8 x half> %op2) {
542 ; CHECK-LABEL: fminnm_v8f16:
544 ; CHECK-NEXT: ptrue p0.h, vl8
545 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
546 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
547 ; CHECK-NEXT: fminnm z0.h, p0/m, z0.h, z1.h
548 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
551 ; NONEON-NOSVE-LABEL: fminnm_v8f16:
552 ; NONEON-NOSVE: // %bb.0:
553 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!
554 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48
555 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]
556 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]
557 ; NONEON-NOSVE-NEXT: fcvt s0, h0
558 ; NONEON-NOSVE-NEXT: fcvt s1, h1
559 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
560 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]
561 ; NONEON-NOSVE-NEXT: fcvt s1, h1
562 ; NONEON-NOSVE-NEXT: fcvt h0, s0
563 ; NONEON-NOSVE-NEXT: str h0, [sp, #46]
564 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]
565 ; NONEON-NOSVE-NEXT: fcvt s0, h0
566 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
567 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]
568 ; NONEON-NOSVE-NEXT: fcvt s1, h1
569 ; NONEON-NOSVE-NEXT: fcvt h0, s0
570 ; NONEON-NOSVE-NEXT: str h0, [sp, #44]
571 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]
572 ; NONEON-NOSVE-NEXT: fcvt s0, h0
573 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
574 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]
575 ; NONEON-NOSVE-NEXT: fcvt s1, h1
576 ; NONEON-NOSVE-NEXT: fcvt h0, s0
577 ; NONEON-NOSVE-NEXT: str h0, [sp, #42]
578 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]
579 ; NONEON-NOSVE-NEXT: fcvt s0, h0
580 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
581 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]
582 ; NONEON-NOSVE-NEXT: fcvt s1, h1
583 ; NONEON-NOSVE-NEXT: fcvt h0, s0
584 ; NONEON-NOSVE-NEXT: str h0, [sp, #40]
585 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]
586 ; NONEON-NOSVE-NEXT: fcvt s0, h0
587 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
588 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]
589 ; NONEON-NOSVE-NEXT: fcvt s1, h1
590 ; NONEON-NOSVE-NEXT: fcvt h0, s0
591 ; NONEON-NOSVE-NEXT: str h0, [sp, #38]
592 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]
593 ; NONEON-NOSVE-NEXT: fcvt s0, h0
594 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
595 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]
596 ; NONEON-NOSVE-NEXT: fcvt s1, h1
597 ; NONEON-NOSVE-NEXT: fcvt h0, s0
598 ; NONEON-NOSVE-NEXT: str h0, [sp, #36]
599 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]
600 ; NONEON-NOSVE-NEXT: fcvt s0, h0
601 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
602 ; NONEON-NOSVE-NEXT: ldr h1, [sp]
603 ; NONEON-NOSVE-NEXT: fcvt s1, h1
604 ; NONEON-NOSVE-NEXT: fcvt h0, s0
605 ; NONEON-NOSVE-NEXT: str h0, [sp, #34]
606 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]
607 ; NONEON-NOSVE-NEXT: fcvt s0, h0
608 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
609 ; NONEON-NOSVE-NEXT: fcvt h0, s0
610 ; NONEON-NOSVE-NEXT: str h0, [sp, #32]
611 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
612 ; NONEON-NOSVE-NEXT: add sp, sp, #48
613 ; NONEON-NOSVE-NEXT: ret
614 %res = call <8 x half> @llvm.minnum.v8f16(<8 x half> %op1, <8 x half> %op2)
618 define void @fminnm_v16f16(ptr %a, ptr %b) {
619 ; CHECK-LABEL: fminnm_v16f16:
621 ; CHECK-NEXT: ldp q0, q3, [x1]
622 ; CHECK-NEXT: ptrue p0.h, vl8
623 ; CHECK-NEXT: ldp q1, q2, [x0]
624 ; CHECK-NEXT: fminnm z0.h, p0/m, z0.h, z1.h
625 ; CHECK-NEXT: movprfx z1, z2
626 ; CHECK-NEXT: fminnm z1.h, p0/m, z1.h, z3.h
627 ; CHECK-NEXT: stp q0, q1, [x0]
630 ; NONEON-NOSVE-LABEL: fminnm_v16f16:
631 ; NONEON-NOSVE: // %bb.0:
632 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
633 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96
634 ; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]
635 ; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]
636 ; NONEON-NOSVE-NEXT: stp q2, q3, [sp]
637 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]
638 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #62]
639 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #46]
640 ; NONEON-NOSVE-NEXT: fcvt s0, h0
641 ; NONEON-NOSVE-NEXT: fcvt s1, h1
642 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
643 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #44]
644 ; NONEON-NOSVE-NEXT: fcvt s1, h1
645 ; NONEON-NOSVE-NEXT: fcvt h0, s0
646 ; NONEON-NOSVE-NEXT: str h0, [sp, #94]
647 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #60]
648 ; NONEON-NOSVE-NEXT: fcvt s0, h0
649 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
650 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #42]
651 ; NONEON-NOSVE-NEXT: fcvt s1, h1
652 ; NONEON-NOSVE-NEXT: fcvt h0, s0
653 ; NONEON-NOSVE-NEXT: str h0, [sp, #92]
654 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #58]
655 ; NONEON-NOSVE-NEXT: fcvt s0, h0
656 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
657 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #40]
658 ; NONEON-NOSVE-NEXT: fcvt s1, h1
659 ; NONEON-NOSVE-NEXT: fcvt h0, s0
660 ; NONEON-NOSVE-NEXT: str h0, [sp, #90]
661 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #56]
662 ; NONEON-NOSVE-NEXT: fcvt s0, h0
663 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
664 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #38]
665 ; NONEON-NOSVE-NEXT: fcvt s1, h1
666 ; NONEON-NOSVE-NEXT: fcvt h0, s0
667 ; NONEON-NOSVE-NEXT: str h0, [sp, #88]
668 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #54]
669 ; NONEON-NOSVE-NEXT: fcvt s0, h0
670 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
671 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #36]
672 ; NONEON-NOSVE-NEXT: fcvt s1, h1
673 ; NONEON-NOSVE-NEXT: fcvt h0, s0
674 ; NONEON-NOSVE-NEXT: str h0, [sp, #86]
675 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #52]
676 ; NONEON-NOSVE-NEXT: fcvt s0, h0
677 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
678 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #34]
679 ; NONEON-NOSVE-NEXT: fcvt s1, h1
680 ; NONEON-NOSVE-NEXT: fcvt h0, s0
681 ; NONEON-NOSVE-NEXT: str h0, [sp, #84]
682 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #50]
683 ; NONEON-NOSVE-NEXT: fcvt s0, h0
684 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
685 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #32]
686 ; NONEON-NOSVE-NEXT: fcvt s1, h1
687 ; NONEON-NOSVE-NEXT: fcvt h0, s0
688 ; NONEON-NOSVE-NEXT: str h0, [sp, #82]
689 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #48]
690 ; NONEON-NOSVE-NEXT: fcvt s0, h0
691 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
692 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]
693 ; NONEON-NOSVE-NEXT: fcvt s1, h1
694 ; NONEON-NOSVE-NEXT: fcvt h0, s0
695 ; NONEON-NOSVE-NEXT: str h0, [sp, #80]
696 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]
697 ; NONEON-NOSVE-NEXT: fcvt s0, h0
698 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
699 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]
700 ; NONEON-NOSVE-NEXT: fcvt s1, h1
701 ; NONEON-NOSVE-NEXT: fcvt h0, s0
702 ; NONEON-NOSVE-NEXT: str h0, [sp, #78]
703 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]
704 ; NONEON-NOSVE-NEXT: fcvt s0, h0
705 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
706 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]
707 ; NONEON-NOSVE-NEXT: fcvt s1, h1
708 ; NONEON-NOSVE-NEXT: fcvt h0, s0
709 ; NONEON-NOSVE-NEXT: str h0, [sp, #76]
710 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]
711 ; NONEON-NOSVE-NEXT: fcvt s0, h0
712 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
713 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]
714 ; NONEON-NOSVE-NEXT: fcvt s1, h1
715 ; NONEON-NOSVE-NEXT: fcvt h0, s0
716 ; NONEON-NOSVE-NEXT: str h0, [sp, #74]
717 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]
718 ; NONEON-NOSVE-NEXT: fcvt s0, h0
719 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
720 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]
721 ; NONEON-NOSVE-NEXT: fcvt s1, h1
722 ; NONEON-NOSVE-NEXT: fcvt h0, s0
723 ; NONEON-NOSVE-NEXT: str h0, [sp, #72]
724 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]
725 ; NONEON-NOSVE-NEXT: fcvt s0, h0
726 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
727 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]
728 ; NONEON-NOSVE-NEXT: fcvt s1, h1
729 ; NONEON-NOSVE-NEXT: fcvt h0, s0
730 ; NONEON-NOSVE-NEXT: str h0, [sp, #70]
731 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]
732 ; NONEON-NOSVE-NEXT: fcvt s0, h0
733 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
734 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]
735 ; NONEON-NOSVE-NEXT: fcvt s1, h1
736 ; NONEON-NOSVE-NEXT: fcvt h0, s0
737 ; NONEON-NOSVE-NEXT: str h0, [sp, #68]
738 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]
739 ; NONEON-NOSVE-NEXT: fcvt s0, h0
740 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
741 ; NONEON-NOSVE-NEXT: ldr h1, [sp]
742 ; NONEON-NOSVE-NEXT: fcvt s1, h1
743 ; NONEON-NOSVE-NEXT: fcvt h0, s0
744 ; NONEON-NOSVE-NEXT: str h0, [sp, #66]
745 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]
746 ; NONEON-NOSVE-NEXT: fcvt s0, h0
747 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
748 ; NONEON-NOSVE-NEXT: fcvt h0, s0
749 ; NONEON-NOSVE-NEXT: str h0, [sp, #64]
750 ; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]
751 ; NONEON-NOSVE-NEXT: stp q0, q1, [x0]
752 ; NONEON-NOSVE-NEXT: add sp, sp, #96
753 ; NONEON-NOSVE-NEXT: ret
754 %op1 = load <16 x half>, ptr %a
755 %op2 = load <16 x half>, ptr %b
756 %res = call <16 x half> @llvm.minnum.v16f16(<16 x half> %op1, <16 x half> %op2)
757 store <16 x half> %res, ptr %a
761 define <2 x float> @fminnm_v2f32(<2 x float> %op1, <2 x float> %op2) {
762 ; CHECK-LABEL: fminnm_v2f32:
764 ; CHECK-NEXT: ptrue p0.s, vl2
765 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
766 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
767 ; CHECK-NEXT: fminnm z0.s, p0/m, z0.s, z1.s
768 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
771 ; NONEON-NOSVE-LABEL: fminnm_v2f32:
772 ; NONEON-NOSVE: // %bb.0:
773 ; NONEON-NOSVE-NEXT: sub sp, sp, #32
774 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32
775 ; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]
776 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]
777 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]
778 ; NONEON-NOSVE-NEXT: fminnm s3, s2, s0
779 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]
780 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
781 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #24]
782 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
783 ; NONEON-NOSVE-NEXT: add sp, sp, #32
784 ; NONEON-NOSVE-NEXT: ret
785 %res = call <2 x float> @llvm.minnum.v2f32(<2 x float> %op1, <2 x float> %op2)
789 define <4 x float> @fminnm_v4f32(<4 x float> %op1, <4 x float> %op2) {
790 ; CHECK-LABEL: fminnm_v4f32:
792 ; CHECK-NEXT: ptrue p0.s, vl4
793 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
794 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
795 ; CHECK-NEXT: fminnm z0.s, p0/m, z0.s, z1.s
796 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
799 ; NONEON-NOSVE-LABEL: fminnm_v4f32:
800 ; NONEON-NOSVE: // %bb.0:
801 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!
802 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48
803 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]
804 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]
805 ; NONEON-NOSVE-NEXT: fminnm s3, s2, s0
806 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]
807 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
808 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]
809 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #40]
810 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]
811 ; NONEON-NOSVE-NEXT: fminnm s3, s2, s0
812 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]
813 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
814 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #32]
815 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
816 ; NONEON-NOSVE-NEXT: add sp, sp, #48
817 ; NONEON-NOSVE-NEXT: ret
818 %res = call <4 x float> @llvm.minnum.v4f32(<4 x float> %op1, <4 x float> %op2)
822 define void @fminnm_v8f32(ptr %a, ptr %b) {
823 ; CHECK-LABEL: fminnm_v8f32:
825 ; CHECK-NEXT: ldp q0, q3, [x1]
826 ; CHECK-NEXT: ptrue p0.s, vl4
827 ; CHECK-NEXT: ldp q1, q2, [x0]
828 ; CHECK-NEXT: fminnm z0.s, p0/m, z0.s, z1.s
829 ; CHECK-NEXT: movprfx z1, z2
830 ; CHECK-NEXT: fminnm z1.s, p0/m, z1.s, z3.s
831 ; CHECK-NEXT: stp q0, q1, [x0]
834 ; NONEON-NOSVE-LABEL: fminnm_v8f32:
835 ; NONEON-NOSVE: // %bb.0:
836 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
837 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96
838 ; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]
839 ; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]
840 ; NONEON-NOSVE-NEXT: stp q2, q3, [sp]
841 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]
842 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #40]
843 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #60]
844 ; NONEON-NOSVE-NEXT: fminnm s3, s2, s0
845 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #56]
846 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
847 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #32]
848 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #88]
849 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #52]
850 ; NONEON-NOSVE-NEXT: fminnm s3, s2, s0
851 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]
852 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
853 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]
854 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #80]
855 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]
856 ; NONEON-NOSVE-NEXT: fminnm s3, s2, s0
857 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]
858 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
859 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]
860 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #72]
861 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]
862 ; NONEON-NOSVE-NEXT: fminnm s3, s2, s0
863 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]
864 ; NONEON-NOSVE-NEXT: fminnm s0, s1, s0
865 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #64]
866 ; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]
867 ; NONEON-NOSVE-NEXT: stp q0, q1, [x0]
868 ; NONEON-NOSVE-NEXT: add sp, sp, #96
869 ; NONEON-NOSVE-NEXT: ret
870 %op1 = load <8 x float>, ptr %a
871 %op2 = load <8 x float>, ptr %b
872 %res = call <8 x float> @llvm.minnum.v8f32(<8 x float> %op1, <8 x float> %op2)
873 store <8 x float> %res, ptr %a
877 define <1 x double> @fminnm_v1f64(<1 x double> %op1, <1 x double> %op2) {
878 ; CHECK-LABEL: fminnm_v1f64:
880 ; CHECK-NEXT: fminnm d0, d0, d1
883 ; NONEON-NOSVE-LABEL: fminnm_v1f64:
884 ; NONEON-NOSVE: // %bb.0:
885 ; NONEON-NOSVE-NEXT: sub sp, sp, #16
886 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
887 ; NONEON-NOSVE-NEXT: fminnm d0, d0, d1
888 ; NONEON-NOSVE-NEXT: str d0, [sp, #8]
889 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
890 ; NONEON-NOSVE-NEXT: add sp, sp, #16
891 ; NONEON-NOSVE-NEXT: ret
892 %res = call <1 x double> @llvm.minnum.v1f64(<1 x double> %op1, <1 x double> %op2)
893 ret <1 x double> %res
896 define <2 x double> @fminnm_v2f64(<2 x double> %op1, <2 x double> %op2) {
897 ; CHECK-LABEL: fminnm_v2f64:
899 ; CHECK-NEXT: ptrue p0.d, vl2
900 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
901 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
902 ; CHECK-NEXT: fminnm z0.d, p0/m, z0.d, z1.d
903 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
906 ; NONEON-NOSVE-LABEL: fminnm_v2f64:
907 ; NONEON-NOSVE: // %bb.0:
908 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!
909 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48
910 ; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]
911 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
912 ; NONEON-NOSVE-NEXT: fminnm d3, d2, d0
913 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]
914 ; NONEON-NOSVE-NEXT: fminnm d0, d1, d0
915 ; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #32]
916 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
917 ; NONEON-NOSVE-NEXT: add sp, sp, #48
918 ; NONEON-NOSVE-NEXT: ret
919 %res = call <2 x double> @llvm.minnum.v2f64(<2 x double> %op1, <2 x double> %op2)
920 ret <2 x double> %res
923 define void @fminnm_v4f64(ptr %a, ptr %b) {
924 ; CHECK-LABEL: fminnm_v4f64:
926 ; CHECK-NEXT: ldp q0, q3, [x1]
927 ; CHECK-NEXT: ptrue p0.d, vl2
928 ; CHECK-NEXT: ldp q1, q2, [x0]
929 ; CHECK-NEXT: fminnm z0.d, p0/m, z0.d, z1.d
930 ; CHECK-NEXT: movprfx z1, z2
931 ; CHECK-NEXT: fminnm z1.d, p0/m, z1.d, z3.d
932 ; CHECK-NEXT: stp q0, q1, [x0]
935 ; NONEON-NOSVE-LABEL: fminnm_v4f64:
936 ; NONEON-NOSVE: // %bb.0:
937 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
938 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96
939 ; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]
940 ; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]
941 ; NONEON-NOSVE-NEXT: stp q2, q3, [sp]
942 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]
943 ; NONEON-NOSVE-NEXT: ldp d1, d2, [sp, #32]
944 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #56]
945 ; NONEON-NOSVE-NEXT: fminnm d3, d2, d0
946 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #48]
947 ; NONEON-NOSVE-NEXT: fminnm d0, d1, d0
948 ; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]
949 ; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #80]
950 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
951 ; NONEON-NOSVE-NEXT: fminnm d3, d2, d0
952 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]
953 ; NONEON-NOSVE-NEXT: fminnm d0, d1, d0
954 ; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #64]
955 ; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]
956 ; NONEON-NOSVE-NEXT: stp q0, q1, [x0]
957 ; NONEON-NOSVE-NEXT: add sp, sp, #96
958 ; NONEON-NOSVE-NEXT: ret
959 %op1 = load <4 x double>, ptr %a
960 %op2 = load <4 x double>, ptr %b
961 %res = call <4 x double> @llvm.minnum.v4f64(<4 x double> %op1, <4 x double> %op2)
962 store <4 x double> %res, ptr %a
970 define <4 x half> @fmax_v4f16(<4 x half> %op1, <4 x half> %op2) {
971 ; CHECK-LABEL: fmax_v4f16:
973 ; CHECK-NEXT: ptrue p0.h, vl4
974 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
975 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
976 ; CHECK-NEXT: fmax z0.h, p0/m, z0.h, z1.h
977 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
980 ; NONEON-NOSVE-LABEL: fmax_v4f16:
981 ; NONEON-NOSVE: // %bb.0:
982 ; NONEON-NOSVE-NEXT: sub sp, sp, #32
983 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32
984 ; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]
985 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]
986 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]
987 ; NONEON-NOSVE-NEXT: fcvt s0, h0
988 ; NONEON-NOSVE-NEXT: fcvt s1, h1
989 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
990 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]
991 ; NONEON-NOSVE-NEXT: fcvt s1, h1
992 ; NONEON-NOSVE-NEXT: fcvt h0, s0
993 ; NONEON-NOSVE-NEXT: str h0, [sp, #30]
994 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]
995 ; NONEON-NOSVE-NEXT: fcvt s0, h0
996 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
997 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]
998 ; NONEON-NOSVE-NEXT: fcvt s1, h1
999 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1000 ; NONEON-NOSVE-NEXT: str h0, [sp, #28]
1001 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]
1002 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1003 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1004 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]
1005 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1006 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1007 ; NONEON-NOSVE-NEXT: str h0, [sp, #26]
1008 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]
1009 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1010 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1011 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1012 ; NONEON-NOSVE-NEXT: str h0, [sp, #24]
1013 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
1014 ; NONEON-NOSVE-NEXT: add sp, sp, #32
1015 ; NONEON-NOSVE-NEXT: ret
1016 %res = call <4 x half> @llvm.maximum.v4f16(<4 x half> %op1, <4 x half> %op2)
1020 define <8 x half> @fmax_v8f16(<8 x half> %op1, <8 x half> %op2) {
1021 ; CHECK-LABEL: fmax_v8f16:
1023 ; CHECK-NEXT: ptrue p0.h, vl8
1024 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
1025 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
1026 ; CHECK-NEXT: fmax z0.h, p0/m, z0.h, z1.h
1027 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
1030 ; NONEON-NOSVE-LABEL: fmax_v8f16:
1031 ; NONEON-NOSVE: // %bb.0:
1032 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!
1033 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48
1034 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]
1035 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]
1036 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1037 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1038 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1039 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]
1040 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1041 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1042 ; NONEON-NOSVE-NEXT: str h0, [sp, #46]
1043 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]
1044 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1045 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1046 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]
1047 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1048 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1049 ; NONEON-NOSVE-NEXT: str h0, [sp, #44]
1050 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]
1051 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1052 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1053 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]
1054 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1055 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1056 ; NONEON-NOSVE-NEXT: str h0, [sp, #42]
1057 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]
1058 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1059 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1060 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]
1061 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1062 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1063 ; NONEON-NOSVE-NEXT: str h0, [sp, #40]
1064 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]
1065 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1066 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1067 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]
1068 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1069 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1070 ; NONEON-NOSVE-NEXT: str h0, [sp, #38]
1071 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]
1072 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1073 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1074 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]
1075 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1076 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1077 ; NONEON-NOSVE-NEXT: str h0, [sp, #36]
1078 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]
1079 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1080 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1081 ; NONEON-NOSVE-NEXT: ldr h1, [sp]
1082 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1083 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1084 ; NONEON-NOSVE-NEXT: str h0, [sp, #34]
1085 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]
1086 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1087 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1088 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1089 ; NONEON-NOSVE-NEXT: str h0, [sp, #32]
1090 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
1091 ; NONEON-NOSVE-NEXT: add sp, sp, #48
1092 ; NONEON-NOSVE-NEXT: ret
1093 %res = call <8 x half> @llvm.maximum.v8f16(<8 x half> %op1, <8 x half> %op2)
1097 define void @fmax_v16f16(ptr %a, ptr %b) {
1098 ; CHECK-LABEL: fmax_v16f16:
1100 ; CHECK-NEXT: ldp q0, q3, [x1]
1101 ; CHECK-NEXT: ptrue p0.h, vl8
1102 ; CHECK-NEXT: ldp q1, q2, [x0]
1103 ; CHECK-NEXT: fmax z0.h, p0/m, z0.h, z1.h
1104 ; CHECK-NEXT: movprfx z1, z2
1105 ; CHECK-NEXT: fmax z1.h, p0/m, z1.h, z3.h
1106 ; CHECK-NEXT: stp q0, q1, [x0]
1109 ; NONEON-NOSVE-LABEL: fmax_v16f16:
1110 ; NONEON-NOSVE: // %bb.0:
1111 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
1112 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96
1113 ; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]
1114 ; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]
1115 ; NONEON-NOSVE-NEXT: stp q2, q3, [sp]
1116 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]
1117 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #62]
1118 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #46]
1119 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1120 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1121 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1122 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #44]
1123 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1124 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1125 ; NONEON-NOSVE-NEXT: str h0, [sp, #94]
1126 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #60]
1127 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1128 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1129 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #42]
1130 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1131 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1132 ; NONEON-NOSVE-NEXT: str h0, [sp, #92]
1133 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #58]
1134 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1135 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1136 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #40]
1137 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1138 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1139 ; NONEON-NOSVE-NEXT: str h0, [sp, #90]
1140 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #56]
1141 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1142 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1143 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #38]
1144 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1145 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1146 ; NONEON-NOSVE-NEXT: str h0, [sp, #88]
1147 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #54]
1148 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1149 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1150 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #36]
1151 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1152 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1153 ; NONEON-NOSVE-NEXT: str h0, [sp, #86]
1154 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #52]
1155 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1156 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1157 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #34]
1158 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1159 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1160 ; NONEON-NOSVE-NEXT: str h0, [sp, #84]
1161 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #50]
1162 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1163 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1164 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #32]
1165 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1166 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1167 ; NONEON-NOSVE-NEXT: str h0, [sp, #82]
1168 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #48]
1169 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1170 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1171 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]
1172 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1173 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1174 ; NONEON-NOSVE-NEXT: str h0, [sp, #80]
1175 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]
1176 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1177 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1178 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]
1179 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1180 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1181 ; NONEON-NOSVE-NEXT: str h0, [sp, #78]
1182 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]
1183 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1184 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1185 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]
1186 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1187 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1188 ; NONEON-NOSVE-NEXT: str h0, [sp, #76]
1189 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]
1190 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1191 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1192 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]
1193 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1194 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1195 ; NONEON-NOSVE-NEXT: str h0, [sp, #74]
1196 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]
1197 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1198 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1199 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]
1200 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1201 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1202 ; NONEON-NOSVE-NEXT: str h0, [sp, #72]
1203 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]
1204 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1205 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1206 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]
1207 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1208 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1209 ; NONEON-NOSVE-NEXT: str h0, [sp, #70]
1210 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]
1211 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1212 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1213 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]
1214 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1215 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1216 ; NONEON-NOSVE-NEXT: str h0, [sp, #68]
1217 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]
1218 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1219 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1220 ; NONEON-NOSVE-NEXT: ldr h1, [sp]
1221 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1222 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1223 ; NONEON-NOSVE-NEXT: str h0, [sp, #66]
1224 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]
1225 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1226 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1227 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1228 ; NONEON-NOSVE-NEXT: str h0, [sp, #64]
1229 ; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]
1230 ; NONEON-NOSVE-NEXT: stp q0, q1, [x0]
1231 ; NONEON-NOSVE-NEXT: add sp, sp, #96
1232 ; NONEON-NOSVE-NEXT: ret
1233 %op1 = load <16 x half>, ptr %a
1234 %op2 = load <16 x half>, ptr %b
1235 %res = call <16 x half> @llvm.maximum.v16f16(<16 x half> %op1, <16 x half> %op2)
1236 store <16 x half> %res, ptr %a
1240 define <2 x float> @fmax_v2f32(<2 x float> %op1, <2 x float> %op2) {
1241 ; CHECK-LABEL: fmax_v2f32:
1243 ; CHECK-NEXT: ptrue p0.s, vl2
1244 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
1245 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
1246 ; CHECK-NEXT: fmax z0.s, p0/m, z0.s, z1.s
1247 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
1250 ; NONEON-NOSVE-LABEL: fmax_v2f32:
1251 ; NONEON-NOSVE: // %bb.0:
1252 ; NONEON-NOSVE-NEXT: sub sp, sp, #32
1253 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32
1254 ; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]
1255 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]
1256 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]
1257 ; NONEON-NOSVE-NEXT: fmax s3, s2, s0
1258 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]
1259 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1260 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #24]
1261 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
1262 ; NONEON-NOSVE-NEXT: add sp, sp, #32
1263 ; NONEON-NOSVE-NEXT: ret
1264 %res = call <2 x float> @llvm.maximum.v2f32(<2 x float> %op1, <2 x float> %op2)
1265 ret <2 x float> %res
1268 define <4 x float> @fmax_v4f32(<4 x float> %op1, <4 x float> %op2) {
1269 ; CHECK-LABEL: fmax_v4f32:
1271 ; CHECK-NEXT: ptrue p0.s, vl4
1272 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
1273 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
1274 ; CHECK-NEXT: fmax z0.s, p0/m, z0.s, z1.s
1275 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
1278 ; NONEON-NOSVE-LABEL: fmax_v4f32:
1279 ; NONEON-NOSVE: // %bb.0:
1280 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!
1281 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48
1282 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]
1283 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]
1284 ; NONEON-NOSVE-NEXT: fmax s3, s2, s0
1285 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]
1286 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1287 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]
1288 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #40]
1289 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]
1290 ; NONEON-NOSVE-NEXT: fmax s3, s2, s0
1291 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]
1292 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1293 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #32]
1294 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
1295 ; NONEON-NOSVE-NEXT: add sp, sp, #48
1296 ; NONEON-NOSVE-NEXT: ret
1297 %res = call <4 x float> @llvm.maximum.v4f32(<4 x float> %op1, <4 x float> %op2)
1298 ret <4 x float> %res
1301 define void @fmax_v8f32(ptr %a, ptr %b) {
1302 ; CHECK-LABEL: fmax_v8f32:
1304 ; CHECK-NEXT: ldp q0, q3, [x1]
1305 ; CHECK-NEXT: ptrue p0.s, vl4
1306 ; CHECK-NEXT: ldp q1, q2, [x0]
1307 ; CHECK-NEXT: fmax z0.s, p0/m, z0.s, z1.s
1308 ; CHECK-NEXT: movprfx z1, z2
1309 ; CHECK-NEXT: fmax z1.s, p0/m, z1.s, z3.s
1310 ; CHECK-NEXT: stp q0, q1, [x0]
1313 ; NONEON-NOSVE-LABEL: fmax_v8f32:
1314 ; NONEON-NOSVE: // %bb.0:
1315 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
1316 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96
1317 ; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]
1318 ; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]
1319 ; NONEON-NOSVE-NEXT: stp q2, q3, [sp]
1320 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]
1321 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #40]
1322 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #60]
1323 ; NONEON-NOSVE-NEXT: fmax s3, s2, s0
1324 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #56]
1325 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1326 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #32]
1327 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #88]
1328 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #52]
1329 ; NONEON-NOSVE-NEXT: fmax s3, s2, s0
1330 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]
1331 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1332 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]
1333 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #80]
1334 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]
1335 ; NONEON-NOSVE-NEXT: fmax s3, s2, s0
1336 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]
1337 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1338 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]
1339 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #72]
1340 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]
1341 ; NONEON-NOSVE-NEXT: fmax s3, s2, s0
1342 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]
1343 ; NONEON-NOSVE-NEXT: fmax s0, s1, s0
1344 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #64]
1345 ; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]
1346 ; NONEON-NOSVE-NEXT: stp q0, q1, [x0]
1347 ; NONEON-NOSVE-NEXT: add sp, sp, #96
1348 ; NONEON-NOSVE-NEXT: ret
1349 %op1 = load <8 x float>, ptr %a
1350 %op2 = load <8 x float>, ptr %b
1351 %res = call <8 x float> @llvm.maximum.v8f32(<8 x float> %op1, <8 x float> %op2)
1352 store <8 x float> %res, ptr %a
1356 define <1 x double> @fmax_v1f64(<1 x double> %op1, <1 x double> %op2) {
1357 ; CHECK-LABEL: fmax_v1f64:
1359 ; CHECK-NEXT: fmax d0, d0, d1
1362 ; NONEON-NOSVE-LABEL: fmax_v1f64:
1363 ; NONEON-NOSVE: // %bb.0:
1364 ; NONEON-NOSVE-NEXT: sub sp, sp, #16
1365 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
1366 ; NONEON-NOSVE-NEXT: fmax d0, d0, d1
1367 ; NONEON-NOSVE-NEXT: str d0, [sp, #8]
1368 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
1369 ; NONEON-NOSVE-NEXT: add sp, sp, #16
1370 ; NONEON-NOSVE-NEXT: ret
1371 %res = call <1 x double> @llvm.maximum.v1f64(<1 x double> %op1, <1 x double> %op2)
1372 ret <1 x double> %res
1375 define <2 x double> @fmax_v2f64(<2 x double> %op1, <2 x double> %op2) {
1376 ; CHECK-LABEL: fmax_v2f64:
1378 ; CHECK-NEXT: ptrue p0.d, vl2
1379 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
1380 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
1381 ; CHECK-NEXT: fmax z0.d, p0/m, z0.d, z1.d
1382 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
1385 ; NONEON-NOSVE-LABEL: fmax_v2f64:
1386 ; NONEON-NOSVE: // %bb.0:
1387 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!
1388 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48
1389 ; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]
1390 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
1391 ; NONEON-NOSVE-NEXT: fmax d3, d2, d0
1392 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]
1393 ; NONEON-NOSVE-NEXT: fmax d0, d1, d0
1394 ; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #32]
1395 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
1396 ; NONEON-NOSVE-NEXT: add sp, sp, #48
1397 ; NONEON-NOSVE-NEXT: ret
1398 %res = call <2 x double> @llvm.maximum.v2f64(<2 x double> %op1, <2 x double> %op2)
1399 ret <2 x double> %res
1402 define void @fmax_v4f64(ptr %a, ptr %b) {
1403 ; CHECK-LABEL: fmax_v4f64:
1405 ; CHECK-NEXT: ldp q0, q3, [x1]
1406 ; CHECK-NEXT: ptrue p0.d, vl2
1407 ; CHECK-NEXT: ldp q1, q2, [x0]
1408 ; CHECK-NEXT: fmax z0.d, p0/m, z0.d, z1.d
1409 ; CHECK-NEXT: movprfx z1, z2
1410 ; CHECK-NEXT: fmax z1.d, p0/m, z1.d, z3.d
1411 ; CHECK-NEXT: stp q0, q1, [x0]
1414 ; NONEON-NOSVE-LABEL: fmax_v4f64:
1415 ; NONEON-NOSVE: // %bb.0:
1416 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
1417 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96
1418 ; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]
1419 ; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]
1420 ; NONEON-NOSVE-NEXT: stp q2, q3, [sp]
1421 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]
1422 ; NONEON-NOSVE-NEXT: ldp d1, d2, [sp, #32]
1423 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #56]
1424 ; NONEON-NOSVE-NEXT: fmax d3, d2, d0
1425 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #48]
1426 ; NONEON-NOSVE-NEXT: fmax d0, d1, d0
1427 ; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]
1428 ; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #80]
1429 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
1430 ; NONEON-NOSVE-NEXT: fmax d3, d2, d0
1431 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]
1432 ; NONEON-NOSVE-NEXT: fmax d0, d1, d0
1433 ; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #64]
1434 ; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]
1435 ; NONEON-NOSVE-NEXT: stp q0, q1, [x0]
1436 ; NONEON-NOSVE-NEXT: add sp, sp, #96
1437 ; NONEON-NOSVE-NEXT: ret
1438 %op1 = load <4 x double>, ptr %a
1439 %op2 = load <4 x double>, ptr %b
1440 %res = call <4 x double> @llvm.maximum.v4f64(<4 x double> %op1, <4 x double> %op2)
1441 store <4 x double> %res, ptr %a
1449 define <4 x half> @fmin_v4f16(<4 x half> %op1, <4 x half> %op2) {
1450 ; CHECK-LABEL: fmin_v4f16:
1452 ; CHECK-NEXT: ptrue p0.h, vl4
1453 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
1454 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
1455 ; CHECK-NEXT: fmin z0.h, p0/m, z0.h, z1.h
1456 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
1459 ; NONEON-NOSVE-LABEL: fmin_v4f16:
1460 ; NONEON-NOSVE: // %bb.0:
1461 ; NONEON-NOSVE-NEXT: sub sp, sp, #32
1462 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32
1463 ; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]
1464 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]
1465 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]
1466 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1467 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1468 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1469 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]
1470 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1471 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1472 ; NONEON-NOSVE-NEXT: str h0, [sp, #30]
1473 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]
1474 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1475 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1476 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]
1477 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1478 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1479 ; NONEON-NOSVE-NEXT: str h0, [sp, #28]
1480 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]
1481 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1482 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1483 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]
1484 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1485 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1486 ; NONEON-NOSVE-NEXT: str h0, [sp, #26]
1487 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]
1488 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1489 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1490 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1491 ; NONEON-NOSVE-NEXT: str h0, [sp, #24]
1492 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
1493 ; NONEON-NOSVE-NEXT: add sp, sp, #32
1494 ; NONEON-NOSVE-NEXT: ret
1495 %res = call <4 x half> @llvm.minimum.v4f16(<4 x half> %op1, <4 x half> %op2)
1499 define <8 x half> @fmin_v8f16(<8 x half> %op1, <8 x half> %op2) {
1500 ; CHECK-LABEL: fmin_v8f16:
1502 ; CHECK-NEXT: ptrue p0.h, vl8
1503 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
1504 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
1505 ; CHECK-NEXT: fmin z0.h, p0/m, z0.h, z1.h
1506 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
1509 ; NONEON-NOSVE-LABEL: fmin_v8f16:
1510 ; NONEON-NOSVE: // %bb.0:
1511 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!
1512 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48
1513 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]
1514 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]
1515 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1516 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1517 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1518 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]
1519 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1520 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1521 ; NONEON-NOSVE-NEXT: str h0, [sp, #46]
1522 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]
1523 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1524 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1525 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]
1526 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1527 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1528 ; NONEON-NOSVE-NEXT: str h0, [sp, #44]
1529 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]
1530 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1531 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1532 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]
1533 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1534 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1535 ; NONEON-NOSVE-NEXT: str h0, [sp, #42]
1536 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]
1537 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1538 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1539 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]
1540 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1541 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1542 ; NONEON-NOSVE-NEXT: str h0, [sp, #40]
1543 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]
1544 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1545 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1546 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]
1547 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1548 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1549 ; NONEON-NOSVE-NEXT: str h0, [sp, #38]
1550 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]
1551 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1552 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1553 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]
1554 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1555 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1556 ; NONEON-NOSVE-NEXT: str h0, [sp, #36]
1557 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]
1558 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1559 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1560 ; NONEON-NOSVE-NEXT: ldr h1, [sp]
1561 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1562 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1563 ; NONEON-NOSVE-NEXT: str h0, [sp, #34]
1564 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]
1565 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1566 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1567 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1568 ; NONEON-NOSVE-NEXT: str h0, [sp, #32]
1569 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
1570 ; NONEON-NOSVE-NEXT: add sp, sp, #48
1571 ; NONEON-NOSVE-NEXT: ret
1572 %res = call <8 x half> @llvm.minimum.v8f16(<8 x half> %op1, <8 x half> %op2)
1576 define void @fmin_v16f16(ptr %a, ptr %b) {
1577 ; CHECK-LABEL: fmin_v16f16:
1579 ; CHECK-NEXT: ldp q0, q3, [x1]
1580 ; CHECK-NEXT: ptrue p0.h, vl8
1581 ; CHECK-NEXT: ldp q1, q2, [x0]
1582 ; CHECK-NEXT: fmin z0.h, p0/m, z0.h, z1.h
1583 ; CHECK-NEXT: movprfx z1, z2
1584 ; CHECK-NEXT: fmin z1.h, p0/m, z1.h, z3.h
1585 ; CHECK-NEXT: stp q0, q1, [x0]
1588 ; NONEON-NOSVE-LABEL: fmin_v16f16:
1589 ; NONEON-NOSVE: // %bb.0:
1590 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
1591 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96
1592 ; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]
1593 ; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]
1594 ; NONEON-NOSVE-NEXT: stp q2, q3, [sp]
1595 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]
1596 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #62]
1597 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #46]
1598 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1599 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1600 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1601 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #44]
1602 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1603 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1604 ; NONEON-NOSVE-NEXT: str h0, [sp, #94]
1605 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #60]
1606 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1607 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1608 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #42]
1609 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1610 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1611 ; NONEON-NOSVE-NEXT: str h0, [sp, #92]
1612 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #58]
1613 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1614 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1615 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #40]
1616 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1617 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1618 ; NONEON-NOSVE-NEXT: str h0, [sp, #90]
1619 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #56]
1620 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1621 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1622 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #38]
1623 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1624 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1625 ; NONEON-NOSVE-NEXT: str h0, [sp, #88]
1626 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #54]
1627 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1628 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1629 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #36]
1630 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1631 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1632 ; NONEON-NOSVE-NEXT: str h0, [sp, #86]
1633 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #52]
1634 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1635 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1636 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #34]
1637 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1638 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1639 ; NONEON-NOSVE-NEXT: str h0, [sp, #84]
1640 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #50]
1641 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1642 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1643 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #32]
1644 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1645 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1646 ; NONEON-NOSVE-NEXT: str h0, [sp, #82]
1647 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #48]
1648 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1649 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1650 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #14]
1651 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1652 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1653 ; NONEON-NOSVE-NEXT: str h0, [sp, #80]
1654 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #30]
1655 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1656 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1657 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #12]
1658 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1659 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1660 ; NONEON-NOSVE-NEXT: str h0, [sp, #78]
1661 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #28]
1662 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1663 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1664 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #10]
1665 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1666 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1667 ; NONEON-NOSVE-NEXT: str h0, [sp, #76]
1668 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #26]
1669 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1670 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1671 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #8]
1672 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1673 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1674 ; NONEON-NOSVE-NEXT: str h0, [sp, #74]
1675 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #24]
1676 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1677 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1678 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #6]
1679 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1680 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1681 ; NONEON-NOSVE-NEXT: str h0, [sp, #72]
1682 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #22]
1683 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1684 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1685 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #4]
1686 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1687 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1688 ; NONEON-NOSVE-NEXT: str h0, [sp, #70]
1689 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #20]
1690 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1691 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1692 ; NONEON-NOSVE-NEXT: ldr h1, [sp, #2]
1693 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1694 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1695 ; NONEON-NOSVE-NEXT: str h0, [sp, #68]
1696 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #18]
1697 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1698 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1699 ; NONEON-NOSVE-NEXT: ldr h1, [sp]
1700 ; NONEON-NOSVE-NEXT: fcvt s1, h1
1701 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1702 ; NONEON-NOSVE-NEXT: str h0, [sp, #66]
1703 ; NONEON-NOSVE-NEXT: ldr h0, [sp, #16]
1704 ; NONEON-NOSVE-NEXT: fcvt s0, h0
1705 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1706 ; NONEON-NOSVE-NEXT: fcvt h0, s0
1707 ; NONEON-NOSVE-NEXT: str h0, [sp, #64]
1708 ; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]
1709 ; NONEON-NOSVE-NEXT: stp q0, q1, [x0]
1710 ; NONEON-NOSVE-NEXT: add sp, sp, #96
1711 ; NONEON-NOSVE-NEXT: ret
1712 %op1 = load <16 x half>, ptr %a
1713 %op2 = load <16 x half>, ptr %b
1714 %res = call <16 x half> @llvm.minimum.v16f16(<16 x half> %op1, <16 x half> %op2)
1715 store <16 x half> %res, ptr %a
1719 define <2 x float> @fmin_v2f32(<2 x float> %op1, <2 x float> %op2) {
1720 ; CHECK-LABEL: fmin_v2f32:
1722 ; CHECK-NEXT: ptrue p0.s, vl2
1723 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
1724 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
1725 ; CHECK-NEXT: fmin z0.s, p0/m, z0.s, z1.s
1726 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
1729 ; NONEON-NOSVE-LABEL: fmin_v2f32:
1730 ; NONEON-NOSVE: // %bb.0:
1731 ; NONEON-NOSVE-NEXT: sub sp, sp, #32
1732 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32
1733 ; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8]
1734 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]
1735 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]
1736 ; NONEON-NOSVE-NEXT: fmin s3, s2, s0
1737 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]
1738 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1739 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #24]
1740 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
1741 ; NONEON-NOSVE-NEXT: add sp, sp, #32
1742 ; NONEON-NOSVE-NEXT: ret
1743 %res = call <2 x float> @llvm.minimum.v2f32(<2 x float> %op1, <2 x float> %op2)
1744 ret <2 x float> %res
1747 define <4 x float> @fmin_v4f32(<4 x float> %op1, <4 x float> %op2) {
1748 ; CHECK-LABEL: fmin_v4f32:
1750 ; CHECK-NEXT: ptrue p0.s, vl4
1751 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
1752 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
1753 ; CHECK-NEXT: fmin z0.s, p0/m, z0.s, z1.s
1754 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
1757 ; NONEON-NOSVE-LABEL: fmin_v4f32:
1758 ; NONEON-NOSVE: // %bb.0:
1759 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!
1760 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48
1761 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]
1762 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]
1763 ; NONEON-NOSVE-NEXT: fmin s3, s2, s0
1764 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]
1765 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1766 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]
1767 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #40]
1768 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]
1769 ; NONEON-NOSVE-NEXT: fmin s3, s2, s0
1770 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]
1771 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1772 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #32]
1773 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
1774 ; NONEON-NOSVE-NEXT: add sp, sp, #48
1775 ; NONEON-NOSVE-NEXT: ret
1776 %res = call <4 x float> @llvm.minimum.v4f32(<4 x float> %op1, <4 x float> %op2)
1777 ret <4 x float> %res
1780 define void @fmin_v8f32(ptr %a, ptr %b) {
1781 ; CHECK-LABEL: fmin_v8f32:
1783 ; CHECK-NEXT: ldp q0, q3, [x1]
1784 ; CHECK-NEXT: ptrue p0.s, vl4
1785 ; CHECK-NEXT: ldp q1, q2, [x0]
1786 ; CHECK-NEXT: fmin z0.s, p0/m, z0.s, z1.s
1787 ; CHECK-NEXT: movprfx z1, z2
1788 ; CHECK-NEXT: fmin z1.s, p0/m, z1.s, z3.s
1789 ; CHECK-NEXT: stp q0, q1, [x0]
1792 ; NONEON-NOSVE-LABEL: fmin_v8f32:
1793 ; NONEON-NOSVE: // %bb.0:
1794 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
1795 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96
1796 ; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]
1797 ; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]
1798 ; NONEON-NOSVE-NEXT: stp q2, q3, [sp]
1799 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]
1800 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #40]
1801 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #60]
1802 ; NONEON-NOSVE-NEXT: fmin s3, s2, s0
1803 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #56]
1804 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1805 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #32]
1806 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #88]
1807 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #52]
1808 ; NONEON-NOSVE-NEXT: fmin s3, s2, s0
1809 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #48]
1810 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1811 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp, #8]
1812 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #80]
1813 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #28]
1814 ; NONEON-NOSVE-NEXT: fmin s3, s2, s0
1815 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #24]
1816 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1817 ; NONEON-NOSVE-NEXT: ldp s1, s2, [sp]
1818 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #72]
1819 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #20]
1820 ; NONEON-NOSVE-NEXT: fmin s3, s2, s0
1821 ; NONEON-NOSVE-NEXT: ldr s0, [sp, #16]
1822 ; NONEON-NOSVE-NEXT: fmin s0, s1, s0
1823 ; NONEON-NOSVE-NEXT: stp s0, s3, [sp, #64]
1824 ; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]
1825 ; NONEON-NOSVE-NEXT: stp q0, q1, [x0]
1826 ; NONEON-NOSVE-NEXT: add sp, sp, #96
1827 ; NONEON-NOSVE-NEXT: ret
1828 %op1 = load <8 x float>, ptr %a
1829 %op2 = load <8 x float>, ptr %b
1830 %res = call <8 x float> @llvm.minimum.v8f32(<8 x float> %op1, <8 x float> %op2)
1831 store <8 x float> %res, ptr %a
1835 define <1 x double> @fmin_v1f64(<1 x double> %op1, <1 x double> %op2) {
1836 ; CHECK-LABEL: fmin_v1f64:
1838 ; CHECK-NEXT: fmin d0, d0, d1
1841 ; NONEON-NOSVE-LABEL: fmin_v1f64:
1842 ; NONEON-NOSVE: // %bb.0:
1843 ; NONEON-NOSVE-NEXT: sub sp, sp, #16
1844 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
1845 ; NONEON-NOSVE-NEXT: fmin d0, d0, d1
1846 ; NONEON-NOSVE-NEXT: str d0, [sp, #8]
1847 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
1848 ; NONEON-NOSVE-NEXT: add sp, sp, #16
1849 ; NONEON-NOSVE-NEXT: ret
1850 %res = call <1 x double> @llvm.minimum.v1f64(<1 x double> %op1, <1 x double> %op2)
1851 ret <1 x double> %res
1854 define <2 x double> @fmin_v2f64(<2 x double> %op1, <2 x double> %op2) {
1855 ; CHECK-LABEL: fmin_v2f64:
1857 ; CHECK-NEXT: ptrue p0.d, vl2
1858 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
1859 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
1860 ; CHECK-NEXT: fmin z0.d, p0/m, z0.d, z1.d
1861 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
1864 ; NONEON-NOSVE-LABEL: fmin_v2f64:
1865 ; NONEON-NOSVE: // %bb.0:
1866 ; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]!
1867 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48
1868 ; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]
1869 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
1870 ; NONEON-NOSVE-NEXT: fmin d3, d2, d0
1871 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]
1872 ; NONEON-NOSVE-NEXT: fmin d0, d1, d0
1873 ; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #32]
1874 ; NONEON-NOSVE-NEXT: ldr q0, [sp, #32]
1875 ; NONEON-NOSVE-NEXT: add sp, sp, #48
1876 ; NONEON-NOSVE-NEXT: ret
1877 %res = call <2 x double> @llvm.minimum.v2f64(<2 x double> %op1, <2 x double> %op2)
1878 ret <2 x double> %res
1881 define void @fmin_v4f64(ptr %a, ptr %b) {
1882 ; CHECK-LABEL: fmin_v4f64:
1884 ; CHECK-NEXT: ldp q0, q3, [x1]
1885 ; CHECK-NEXT: ptrue p0.d, vl2
1886 ; CHECK-NEXT: ldp q1, q2, [x0]
1887 ; CHECK-NEXT: fmin z0.d, p0/m, z0.d, z1.d
1888 ; CHECK-NEXT: movprfx z1, z2
1889 ; CHECK-NEXT: fmin z1.d, p0/m, z1.d, z3.d
1890 ; CHECK-NEXT: stp q0, q1, [x0]
1893 ; NONEON-NOSVE-LABEL: fmin_v4f64:
1894 ; NONEON-NOSVE: // %bb.0:
1895 ; NONEON-NOSVE-NEXT: sub sp, sp, #96
1896 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96
1897 ; NONEON-NOSVE-NEXT: ldp q3, q0, [x1]
1898 ; NONEON-NOSVE-NEXT: ldp q2, q1, [x0]
1899 ; NONEON-NOSVE-NEXT: stp q2, q3, [sp]
1900 ; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32]
1901 ; NONEON-NOSVE-NEXT: ldp d1, d2, [sp, #32]
1902 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #56]
1903 ; NONEON-NOSVE-NEXT: fmin d3, d2, d0
1904 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #48]
1905 ; NONEON-NOSVE-NEXT: fmin d0, d1, d0
1906 ; NONEON-NOSVE-NEXT: ldp d1, d2, [sp]
1907 ; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #80]
1908 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #24]
1909 ; NONEON-NOSVE-NEXT: fmin d3, d2, d0
1910 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #16]
1911 ; NONEON-NOSVE-NEXT: fmin d0, d1, d0
1912 ; NONEON-NOSVE-NEXT: stp d0, d3, [sp, #64]
1913 ; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64]
1914 ; NONEON-NOSVE-NEXT: stp q0, q1, [x0]
1915 ; NONEON-NOSVE-NEXT: add sp, sp, #96
1916 ; NONEON-NOSVE-NEXT: ret
1917 %op1 = load <4 x double>, ptr %a
1918 %op2 = load <4 x double>, ptr %b
1919 %res = call <4 x double> @llvm.minimum.v4f64(<4 x double> %op1, <4 x double> %op2)
1920 store <4 x double> %res, ptr %a
1924 declare <4 x half> @llvm.minnum.v4f16(<4 x half>, <4 x half>)
1925 declare <8 x half> @llvm.minnum.v8f16(<8 x half>, <8 x half>)
1926 declare <16 x half> @llvm.minnum.v16f16(<16 x half>, <16 x half>)
1927 declare <2 x float> @llvm.minnum.v2f32(<2 x float>, <2 x float>)
1928 declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>)
1929 declare <8 x float> @llvm.minnum.v8f32(<8 x float>, <8 x float>)
1930 declare <1 x double> @llvm.minnum.v1f64(<1 x double>, <1 x double>)
1931 declare <2 x double> @llvm.minnum.v2f64(<2 x double>, <2 x double>)
1932 declare <4 x double> @llvm.minnum.v4f64(<4 x double>, <4 x double>)
1934 declare <4 x half> @llvm.maxnum.v4f16(<4 x half>, <4 x half>)
1935 declare <8 x half> @llvm.maxnum.v8f16(<8 x half>, <8 x half>)
1936 declare <16 x half> @llvm.maxnum.v16f16(<16 x half>, <16 x half>)
1937 declare <2 x float> @llvm.maxnum.v2f32(<2 x float>, <2 x float>)
1938 declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>)
1939 declare <8 x float> @llvm.maxnum.v8f32(<8 x float>, <8 x float>)
1940 declare <1 x double> @llvm.maxnum.v1f64(<1 x double>, <1 x double>)
1941 declare <2 x double> @llvm.maxnum.v2f64(<2 x double>, <2 x double>)
1942 declare <4 x double> @llvm.maxnum.v4f64(<4 x double>, <4 x double>)
1944 declare <4 x half> @llvm.minimum.v4f16(<4 x half>, <4 x half>)
1945 declare <8 x half> @llvm.minimum.v8f16(<8 x half>, <8 x half>)
1946 declare <16 x half> @llvm.minimum.v16f16(<16 x half>, <16 x half>)
1947 declare <2 x float> @llvm.minimum.v2f32(<2 x float>, <2 x float>)
1948 declare <4 x float> @llvm.minimum.v4f32(<4 x float>, <4 x float>)
1949 declare <8 x float> @llvm.minimum.v8f32(<8 x float>, <8 x float>)
1950 declare <1 x double> @llvm.minimum.v1f64(<1 x double>, <1 x double>)
1951 declare <2 x double> @llvm.minimum.v2f64(<2 x double>, <2 x double>)
1952 declare <4 x double> @llvm.minimum.v4f64(<4 x double>, <4 x double>)
1954 declare <4 x half> @llvm.maximum.v4f16(<4 x half>, <4 x half>)
1955 declare <8 x half> @llvm.maximum.v8f16(<8 x half>, <8 x half>)
1956 declare <16 x half> @llvm.maximum.v16f16(<16 x half>, <16 x half>)
1957 declare <2 x float> @llvm.maximum.v2f32(<2 x float>, <2 x float>)
1958 declare <4 x float> @llvm.maximum.v4f32(<4 x float>, <4 x float>)
1959 declare <8 x float> @llvm.maximum.v8f32(<8 x float>, <8 x float>)
1960 declare <1 x double> @llvm.maximum.v1f64(<1 x double>, <1 x double>)
1961 declare <2 x double> @llvm.maximum.v2f64(<2 x double>, <2 x double>)
1962 declare <4 x double> @llvm.maximum.v4f64(<4 x double>, <4 x double>)