1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+d \
3 ; RUN: -verify-machineinstrs -target-abi=ilp32d \
4 ; RUN: | FileCheck -check-prefixes=CHECKIFD,RV32IFD %s
5 ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+d \
6 ; RUN: -verify-machineinstrs -target-abi=lp64d \
7 ; RUN: | FileCheck -check-prefixes=CHECKIFD,RV64IFD %s
8 ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zdinx \
9 ; RUN: -verify-machineinstrs -target-abi=ilp32 \
10 ; RUN: | FileCheck -check-prefix=RV32IZFINXZDINX %s
11 ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zdinx \
12 ; RUN: -verify-machineinstrs -target-abi=lp64 \
13 ; RUN: | FileCheck -check-prefix=RV64IZFINXZDINX %s
15 declare double @llvm.minimum.f64(double, double)
17 define double @fminimum_f64(double %a, double %b) nounwind {
18 ; CHECKIFD-LABEL: fminimum_f64:
20 ; CHECKIFD-NEXT: feq.d a0, fa0, fa0
21 ; CHECKIFD-NEXT: fmv.d fa5, fa1
22 ; CHECKIFD-NEXT: beqz a0, .LBB0_3
23 ; CHECKIFD-NEXT: # %bb.1:
24 ; CHECKIFD-NEXT: feq.d a0, fa1, fa1
25 ; CHECKIFD-NEXT: beqz a0, .LBB0_4
26 ; CHECKIFD-NEXT: .LBB0_2:
27 ; CHECKIFD-NEXT: fmin.d fa0, fa0, fa5
29 ; CHECKIFD-NEXT: .LBB0_3:
30 ; CHECKIFD-NEXT: fmv.d fa5, fa0
31 ; CHECKIFD-NEXT: feq.d a0, fa1, fa1
32 ; CHECKIFD-NEXT: bnez a0, .LBB0_2
33 ; CHECKIFD-NEXT: .LBB0_4:
34 ; CHECKIFD-NEXT: fmin.d fa0, fa1, fa5
37 ; RV32IZFINXZDINX-LABEL: fminimum_f64:
38 ; RV32IZFINXZDINX: # %bb.0:
39 ; RV32IZFINXZDINX-NEXT: addi sp, sp, -16
40 ; RV32IZFINXZDINX-NEXT: sw a2, 8(sp)
41 ; RV32IZFINXZDINX-NEXT: sw a3, 12(sp)
42 ; RV32IZFINXZDINX-NEXT: lw a2, 8(sp)
43 ; RV32IZFINXZDINX-NEXT: lw a3, 12(sp)
44 ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
45 ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
46 ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
47 ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
48 ; RV32IZFINXZDINX-NEXT: feq.d a6, a0, a0
49 ; RV32IZFINXZDINX-NEXT: mv a4, a2
50 ; RV32IZFINXZDINX-NEXT: mv a5, a3
51 ; RV32IZFINXZDINX-NEXT: bnez a6, .LBB0_2
52 ; RV32IZFINXZDINX-NEXT: # %bb.1:
53 ; RV32IZFINXZDINX-NEXT: mv a4, a0
54 ; RV32IZFINXZDINX-NEXT: mv a5, a1
55 ; RV32IZFINXZDINX-NEXT: .LBB0_2:
56 ; RV32IZFINXZDINX-NEXT: feq.d a6, a2, a2
57 ; RV32IZFINXZDINX-NEXT: bnez a6, .LBB0_4
58 ; RV32IZFINXZDINX-NEXT: # %bb.3:
59 ; RV32IZFINXZDINX-NEXT: mv a0, a2
60 ; RV32IZFINXZDINX-NEXT: mv a1, a3
61 ; RV32IZFINXZDINX-NEXT: .LBB0_4:
62 ; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a4
63 ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
64 ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
65 ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
66 ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
67 ; RV32IZFINXZDINX-NEXT: addi sp, sp, 16
68 ; RV32IZFINXZDINX-NEXT: ret
70 ; RV64IZFINXZDINX-LABEL: fminimum_f64:
71 ; RV64IZFINXZDINX: # %bb.0:
72 ; RV64IZFINXZDINX-NEXT: feq.d a3, a0, a0
73 ; RV64IZFINXZDINX-NEXT: mv a2, a1
74 ; RV64IZFINXZDINX-NEXT: beqz a3, .LBB0_3
75 ; RV64IZFINXZDINX-NEXT: # %bb.1:
76 ; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1
77 ; RV64IZFINXZDINX-NEXT: beqz a3, .LBB0_4
78 ; RV64IZFINXZDINX-NEXT: .LBB0_2:
79 ; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a2
80 ; RV64IZFINXZDINX-NEXT: ret
81 ; RV64IZFINXZDINX-NEXT: .LBB0_3:
82 ; RV64IZFINXZDINX-NEXT: mv a2, a0
83 ; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1
84 ; RV64IZFINXZDINX-NEXT: bnez a3, .LBB0_2
85 ; RV64IZFINXZDINX-NEXT: .LBB0_4:
86 ; RV64IZFINXZDINX-NEXT: fmin.d a0, a1, a2
87 ; RV64IZFINXZDINX-NEXT: ret
88 %1 = call double @llvm.minimum.f64(double %a, double %b)
92 declare double @llvm.maximum.f64(double, double)
94 define double @fmaximum_f64(double %a, double %b) nounwind {
95 ; CHECKIFD-LABEL: fmaximum_f64:
97 ; CHECKIFD-NEXT: feq.d a0, fa0, fa0
98 ; CHECKIFD-NEXT: fmv.d fa5, fa1
99 ; CHECKIFD-NEXT: beqz a0, .LBB1_3
100 ; CHECKIFD-NEXT: # %bb.1:
101 ; CHECKIFD-NEXT: feq.d a0, fa1, fa1
102 ; CHECKIFD-NEXT: beqz a0, .LBB1_4
103 ; CHECKIFD-NEXT: .LBB1_2:
104 ; CHECKIFD-NEXT: fmax.d fa0, fa0, fa5
106 ; CHECKIFD-NEXT: .LBB1_3:
107 ; CHECKIFD-NEXT: fmv.d fa5, fa0
108 ; CHECKIFD-NEXT: feq.d a0, fa1, fa1
109 ; CHECKIFD-NEXT: bnez a0, .LBB1_2
110 ; CHECKIFD-NEXT: .LBB1_4:
111 ; CHECKIFD-NEXT: fmax.d fa0, fa1, fa5
114 ; RV32IZFINXZDINX-LABEL: fmaximum_f64:
115 ; RV32IZFINXZDINX: # %bb.0:
116 ; RV32IZFINXZDINX-NEXT: addi sp, sp, -16
117 ; RV32IZFINXZDINX-NEXT: sw a2, 8(sp)
118 ; RV32IZFINXZDINX-NEXT: sw a3, 12(sp)
119 ; RV32IZFINXZDINX-NEXT: lw a2, 8(sp)
120 ; RV32IZFINXZDINX-NEXT: lw a3, 12(sp)
121 ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
122 ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
123 ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
124 ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
125 ; RV32IZFINXZDINX-NEXT: feq.d a6, a0, a0
126 ; RV32IZFINXZDINX-NEXT: mv a4, a2
127 ; RV32IZFINXZDINX-NEXT: mv a5, a3
128 ; RV32IZFINXZDINX-NEXT: bnez a6, .LBB1_2
129 ; RV32IZFINXZDINX-NEXT: # %bb.1:
130 ; RV32IZFINXZDINX-NEXT: mv a4, a0
131 ; RV32IZFINXZDINX-NEXT: mv a5, a1
132 ; RV32IZFINXZDINX-NEXT: .LBB1_2:
133 ; RV32IZFINXZDINX-NEXT: feq.d a6, a2, a2
134 ; RV32IZFINXZDINX-NEXT: bnez a6, .LBB1_4
135 ; RV32IZFINXZDINX-NEXT: # %bb.3:
136 ; RV32IZFINXZDINX-NEXT: mv a0, a2
137 ; RV32IZFINXZDINX-NEXT: mv a1, a3
138 ; RV32IZFINXZDINX-NEXT: .LBB1_4:
139 ; RV32IZFINXZDINX-NEXT: fmax.d a0, a0, a4
140 ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
141 ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
142 ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
143 ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
144 ; RV32IZFINXZDINX-NEXT: addi sp, sp, 16
145 ; RV32IZFINXZDINX-NEXT: ret
147 ; RV64IZFINXZDINX-LABEL: fmaximum_f64:
148 ; RV64IZFINXZDINX: # %bb.0:
149 ; RV64IZFINXZDINX-NEXT: feq.d a3, a0, a0
150 ; RV64IZFINXZDINX-NEXT: mv a2, a1
151 ; RV64IZFINXZDINX-NEXT: beqz a3, .LBB1_3
152 ; RV64IZFINXZDINX-NEXT: # %bb.1:
153 ; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1
154 ; RV64IZFINXZDINX-NEXT: beqz a3, .LBB1_4
155 ; RV64IZFINXZDINX-NEXT: .LBB1_2:
156 ; RV64IZFINXZDINX-NEXT: fmax.d a0, a0, a2
157 ; RV64IZFINXZDINX-NEXT: ret
158 ; RV64IZFINXZDINX-NEXT: .LBB1_3:
159 ; RV64IZFINXZDINX-NEXT: mv a2, a0
160 ; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1
161 ; RV64IZFINXZDINX-NEXT: bnez a3, .LBB1_2
162 ; RV64IZFINXZDINX-NEXT: .LBB1_4:
163 ; RV64IZFINXZDINX-NEXT: fmax.d a0, a1, a2
164 ; RV64IZFINXZDINX-NEXT: ret
165 %1 = call double @llvm.maximum.f64(double %a, double %b)
169 define double @fminimum_nnan_f64(double %a, double %b) nounwind {
170 ; CHECKIFD-LABEL: fminimum_nnan_f64:
172 ; CHECKIFD-NEXT: fmin.d fa0, fa0, fa1
175 ; RV32IZFINXZDINX-LABEL: fminimum_nnan_f64:
176 ; RV32IZFINXZDINX: # %bb.0:
177 ; RV32IZFINXZDINX-NEXT: addi sp, sp, -16
178 ; RV32IZFINXZDINX-NEXT: sw a2, 8(sp)
179 ; RV32IZFINXZDINX-NEXT: sw a3, 12(sp)
180 ; RV32IZFINXZDINX-NEXT: lw a2, 8(sp)
181 ; RV32IZFINXZDINX-NEXT: lw a3, 12(sp)
182 ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
183 ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
184 ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
185 ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
186 ; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a2
187 ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
188 ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
189 ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
190 ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
191 ; RV32IZFINXZDINX-NEXT: addi sp, sp, 16
192 ; RV32IZFINXZDINX-NEXT: ret
194 ; RV64IZFINXZDINX-LABEL: fminimum_nnan_f64:
195 ; RV64IZFINXZDINX: # %bb.0:
196 ; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a1
197 ; RV64IZFINXZDINX-NEXT: ret
198 %1 = call nnan double @llvm.minimum.f64(double %a, double %b)
202 define double @fmaximum_nnan_f64(double %a, double %b) nounwind {
203 ; CHECKIFD-LABEL: fmaximum_nnan_f64:
205 ; CHECKIFD-NEXT: feq.d a0, fa0, fa0
206 ; CHECKIFD-NEXT: fmv.d fa5, fa1
207 ; CHECKIFD-NEXT: beqz a0, .LBB3_3
208 ; CHECKIFD-NEXT: # %bb.1:
209 ; CHECKIFD-NEXT: feq.d a0, fa1, fa1
210 ; CHECKIFD-NEXT: beqz a0, .LBB3_4
211 ; CHECKIFD-NEXT: .LBB3_2:
212 ; CHECKIFD-NEXT: fmin.d fa0, fa0, fa5
214 ; CHECKIFD-NEXT: .LBB3_3:
215 ; CHECKIFD-NEXT: fmv.d fa5, fa0
216 ; CHECKIFD-NEXT: feq.d a0, fa1, fa1
217 ; CHECKIFD-NEXT: bnez a0, .LBB3_2
218 ; CHECKIFD-NEXT: .LBB3_4:
219 ; CHECKIFD-NEXT: fmin.d fa0, fa1, fa5
222 ; RV32IZFINXZDINX-LABEL: fmaximum_nnan_f64:
223 ; RV32IZFINXZDINX: # %bb.0:
224 ; RV32IZFINXZDINX-NEXT: addi sp, sp, -16
225 ; RV32IZFINXZDINX-NEXT: sw a2, 8(sp)
226 ; RV32IZFINXZDINX-NEXT: sw a3, 12(sp)
227 ; RV32IZFINXZDINX-NEXT: lw a2, 8(sp)
228 ; RV32IZFINXZDINX-NEXT: lw a3, 12(sp)
229 ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
230 ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
231 ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
232 ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
233 ; RV32IZFINXZDINX-NEXT: feq.d a6, a0, a0
234 ; RV32IZFINXZDINX-NEXT: mv a4, a2
235 ; RV32IZFINXZDINX-NEXT: mv a5, a3
236 ; RV32IZFINXZDINX-NEXT: bnez a6, .LBB3_2
237 ; RV32IZFINXZDINX-NEXT: # %bb.1:
238 ; RV32IZFINXZDINX-NEXT: mv a4, a0
239 ; RV32IZFINXZDINX-NEXT: mv a5, a1
240 ; RV32IZFINXZDINX-NEXT: .LBB3_2:
241 ; RV32IZFINXZDINX-NEXT: feq.d a6, a2, a2
242 ; RV32IZFINXZDINX-NEXT: bnez a6, .LBB3_4
243 ; RV32IZFINXZDINX-NEXT: # %bb.3:
244 ; RV32IZFINXZDINX-NEXT: mv a0, a2
245 ; RV32IZFINXZDINX-NEXT: mv a1, a3
246 ; RV32IZFINXZDINX-NEXT: .LBB3_4:
247 ; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a4
248 ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
249 ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
250 ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
251 ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
252 ; RV32IZFINXZDINX-NEXT: addi sp, sp, 16
253 ; RV32IZFINXZDINX-NEXT: ret
255 ; RV64IZFINXZDINX-LABEL: fmaximum_nnan_f64:
256 ; RV64IZFINXZDINX: # %bb.0:
257 ; RV64IZFINXZDINX-NEXT: feq.d a3, a0, a0
258 ; RV64IZFINXZDINX-NEXT: mv a2, a1
259 ; RV64IZFINXZDINX-NEXT: beqz a3, .LBB3_3
260 ; RV64IZFINXZDINX-NEXT: # %bb.1:
261 ; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1
262 ; RV64IZFINXZDINX-NEXT: beqz a3, .LBB3_4
263 ; RV64IZFINXZDINX-NEXT: .LBB3_2:
264 ; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a2
265 ; RV64IZFINXZDINX-NEXT: ret
266 ; RV64IZFINXZDINX-NEXT: .LBB3_3:
267 ; RV64IZFINXZDINX-NEXT: mv a2, a0
268 ; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1
269 ; RV64IZFINXZDINX-NEXT: bnez a3, .LBB3_2
270 ; RV64IZFINXZDINX-NEXT: .LBB3_4:
271 ; RV64IZFINXZDINX-NEXT: fmin.d a0, a1, a2
272 ; RV64IZFINXZDINX-NEXT: ret
273 %1 = call double @llvm.minimum.f64(double %a, double %b)
277 define double @fminimum_nnan_op_f64(double %a, double %b) nounwind {
278 ; CHECKIFD-LABEL: fminimum_nnan_op_f64:
280 ; CHECKIFD-NEXT: feq.d a0, fa1, fa1
281 ; CHECKIFD-NEXT: bnez a0, .LBB4_2
282 ; CHECKIFD-NEXT: # %bb.1:
283 ; CHECKIFD-NEXT: fmin.d fa0, fa1, fa1
285 ; CHECKIFD-NEXT: .LBB4_2:
286 ; CHECKIFD-NEXT: fadd.d fa5, fa0, fa0
287 ; CHECKIFD-NEXT: fmin.d fa0, fa5, fa1
290 ; RV32IZFINXZDINX-LABEL: fminimum_nnan_op_f64:
291 ; RV32IZFINXZDINX: # %bb.0:
292 ; RV32IZFINXZDINX-NEXT: addi sp, sp, -16
293 ; RV32IZFINXZDINX-NEXT: sw a2, 8(sp)
294 ; RV32IZFINXZDINX-NEXT: sw a3, 12(sp)
295 ; RV32IZFINXZDINX-NEXT: lw a2, 8(sp)
296 ; RV32IZFINXZDINX-NEXT: lw a3, 12(sp)
297 ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
298 ; RV32IZFINXZDINX-NEXT: feq.d a0, a2, a2
299 ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
300 ; RV32IZFINXZDINX-NEXT: bnez a0, .LBB4_2
301 ; RV32IZFINXZDINX-NEXT: # %bb.1:
302 ; RV32IZFINXZDINX-NEXT: mv a0, a2
303 ; RV32IZFINXZDINX-NEXT: mv a1, a3
304 ; RV32IZFINXZDINX-NEXT: j .LBB4_3
305 ; RV32IZFINXZDINX-NEXT: .LBB4_2:
306 ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
307 ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
308 ; RV32IZFINXZDINX-NEXT: fadd.d a0, a0, a0
309 ; RV32IZFINXZDINX-NEXT: .LBB4_3:
310 ; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a2
311 ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
312 ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
313 ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
314 ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
315 ; RV32IZFINXZDINX-NEXT: addi sp, sp, 16
316 ; RV32IZFINXZDINX-NEXT: ret
318 ; RV64IZFINXZDINX-LABEL: fminimum_nnan_op_f64:
319 ; RV64IZFINXZDINX: # %bb.0:
320 ; RV64IZFINXZDINX-NEXT: feq.d a2, a1, a1
321 ; RV64IZFINXZDINX-NEXT: bnez a2, .LBB4_2
322 ; RV64IZFINXZDINX-NEXT: # %bb.1:
323 ; RV64IZFINXZDINX-NEXT: fmin.d a0, a1, a1
324 ; RV64IZFINXZDINX-NEXT: ret
325 ; RV64IZFINXZDINX-NEXT: .LBB4_2:
326 ; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, a0
327 ; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a1
328 ; RV64IZFINXZDINX-NEXT: ret
329 %c = fadd nnan double %a, %a
330 %1 = call double @llvm.minimum.f64(double %c, double %b)
334 define double @fmaximum_nnan_op_f64(double %a, double %b) nounwind {
335 ; CHECKIFD-LABEL: fmaximum_nnan_op_f64:
337 ; CHECKIFD-NEXT: fadd.d fa5, fa0, fa1
338 ; CHECKIFD-NEXT: fsub.d fa4, fa0, fa1
339 ; CHECKIFD-NEXT: fmax.d fa0, fa5, fa4
342 ; RV32IZFINXZDINX-LABEL: fmaximum_nnan_op_f64:
343 ; RV32IZFINXZDINX: # %bb.0:
344 ; RV32IZFINXZDINX-NEXT: addi sp, sp, -16
345 ; RV32IZFINXZDINX-NEXT: sw a2, 8(sp)
346 ; RV32IZFINXZDINX-NEXT: sw a3, 12(sp)
347 ; RV32IZFINXZDINX-NEXT: lw a2, 8(sp)
348 ; RV32IZFINXZDINX-NEXT: lw a3, 12(sp)
349 ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
350 ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
351 ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
352 ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
353 ; RV32IZFINXZDINX-NEXT: fadd.d a4, a0, a2
354 ; RV32IZFINXZDINX-NEXT: fsub.d a0, a0, a2
355 ; RV32IZFINXZDINX-NEXT: fmax.d a0, a4, a0
356 ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
357 ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
358 ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
359 ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
360 ; RV32IZFINXZDINX-NEXT: addi sp, sp, 16
361 ; RV32IZFINXZDINX-NEXT: ret
363 ; RV64IZFINXZDINX-LABEL: fmaximum_nnan_op_f64:
364 ; RV64IZFINXZDINX: # %bb.0:
365 ; RV64IZFINXZDINX-NEXT: fadd.d a2, a0, a1
366 ; RV64IZFINXZDINX-NEXT: fsub.d a0, a0, a1
367 ; RV64IZFINXZDINX-NEXT: fmax.d a0, a2, a0
368 ; RV64IZFINXZDINX-NEXT: ret
369 %c = fadd nnan double %a, %b
370 %d = fsub nnan double %a, %b
371 %1 = call double @llvm.maximum.f64(double %c, double %d)
375 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: