@@ -159,6 +159,209 @@ define double @fmaximum_f64(double %a, double %b) nounwind {
159
159
%1 = call double @llvm.maximum.f64 (double %a , double %b )
160
160
ret double %1
161
161
}
162
+
163
+ define double @fminimum_nnan_f64 (double %a , double %b ) nounwind {
164
+ ; CHECKIFD-LABEL: fminimum_nnan_f64:
165
+ ; CHECKIFD: # %bb.0:
166
+ ; CHECKIFD-NEXT: fmin.d fa0, fa0, fa1
167
+ ; CHECKIFD-NEXT: ret
168
+ ;
169
+ ; RV32IZFINXZDINX-LABEL: fminimum_nnan_f64:
170
+ ; RV32IZFINXZDINX: # %bb.0:
171
+ ; RV32IZFINXZDINX-NEXT: addi sp, sp, -16
172
+ ; RV32IZFINXZDINX-NEXT: sw a2, 8(sp)
173
+ ; RV32IZFINXZDINX-NEXT: sw a3, 12(sp)
174
+ ; RV32IZFINXZDINX-NEXT: lw a2, 8(sp)
175
+ ; RV32IZFINXZDINX-NEXT: lw a3, 12(sp)
176
+ ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
177
+ ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
178
+ ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
179
+ ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
180
+ ; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a2
181
+ ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
182
+ ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
183
+ ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
184
+ ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
185
+ ; RV32IZFINXZDINX-NEXT: addi sp, sp, 16
186
+ ; RV32IZFINXZDINX-NEXT: ret
187
+ ;
188
+ ; RV64IZFINXZDINX-LABEL: fminimum_nnan_f64:
189
+ ; RV64IZFINXZDINX: # %bb.0:
190
+ ; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a1
191
+ ; RV64IZFINXZDINX-NEXT: ret
192
+ %1 = call nnan double @llvm.minimum.f64 (double %a , double %b )
193
+ ret double %1
194
+ }
195
+
196
+ define double @fmaximum_nnan_f64 (double %a , double %b ) nounwind {
197
+ ; CHECKIFD-LABEL: fmaximum_nnan_f64:
198
+ ; CHECKIFD: # %bb.0:
199
+ ; CHECKIFD-NEXT: feq.d a0, fa0, fa0
200
+ ; CHECKIFD-NEXT: fmv.d fa5, fa1
201
+ ; CHECKIFD-NEXT: beqz a0, .LBB3_3
202
+ ; CHECKIFD-NEXT: # %bb.1:
203
+ ; CHECKIFD-NEXT: feq.d a0, fa1, fa1
204
+ ; CHECKIFD-NEXT: beqz a0, .LBB3_4
205
+ ; CHECKIFD-NEXT: .LBB3_2:
206
+ ; CHECKIFD-NEXT: fmin.d fa0, fa0, fa5
207
+ ; CHECKIFD-NEXT: ret
208
+ ; CHECKIFD-NEXT: .LBB3_3:
209
+ ; CHECKIFD-NEXT: fmv.d fa5, fa0
210
+ ; CHECKIFD-NEXT: feq.d a0, fa1, fa1
211
+ ; CHECKIFD-NEXT: bnez a0, .LBB3_2
212
+ ; CHECKIFD-NEXT: .LBB3_4:
213
+ ; CHECKIFD-NEXT: fmin.d fa0, fa1, fa5
214
+ ; CHECKIFD-NEXT: ret
215
+ ;
216
+ ; RV32IZFINXZDINX-LABEL: fmaximum_nnan_f64:
217
+ ; RV32IZFINXZDINX: # %bb.0:
218
+ ; RV32IZFINXZDINX-NEXT: addi sp, sp, -16
219
+ ; RV32IZFINXZDINX-NEXT: sw a2, 8(sp)
220
+ ; RV32IZFINXZDINX-NEXT: sw a3, 12(sp)
221
+ ; RV32IZFINXZDINX-NEXT: lw a2, 8(sp)
222
+ ; RV32IZFINXZDINX-NEXT: lw a3, 12(sp)
223
+ ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
224
+ ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
225
+ ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
226
+ ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
227
+ ; RV32IZFINXZDINX-NEXT: feq.d a6, a0, a0
228
+ ; RV32IZFINXZDINX-NEXT: mv a4, a2
229
+ ; RV32IZFINXZDINX-NEXT: bnez a6, .LBB3_2
230
+ ; RV32IZFINXZDINX-NEXT: # %bb.1:
231
+ ; RV32IZFINXZDINX-NEXT: mv a4, a0
232
+ ; RV32IZFINXZDINX-NEXT: .LBB3_2:
233
+ ; RV32IZFINXZDINX-NEXT: feq.d a6, a2, a2
234
+ ; RV32IZFINXZDINX-NEXT: bnez a6, .LBB3_4
235
+ ; RV32IZFINXZDINX-NEXT: # %bb.3:
236
+ ; RV32IZFINXZDINX-NEXT: mv a0, a2
237
+ ; RV32IZFINXZDINX-NEXT: .LBB3_4:
238
+ ; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a4
239
+ ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
240
+ ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
241
+ ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
242
+ ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
243
+ ; RV32IZFINXZDINX-NEXT: addi sp, sp, 16
244
+ ; RV32IZFINXZDINX-NEXT: ret
245
+ ;
246
+ ; RV64IZFINXZDINX-LABEL: fmaximum_nnan_f64:
247
+ ; RV64IZFINXZDINX: # %bb.0:
248
+ ; RV64IZFINXZDINX-NEXT: feq.d a3, a0, a0
249
+ ; RV64IZFINXZDINX-NEXT: mv a2, a1
250
+ ; RV64IZFINXZDINX-NEXT: beqz a3, .LBB3_3
251
+ ; RV64IZFINXZDINX-NEXT: # %bb.1:
252
+ ; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1
253
+ ; RV64IZFINXZDINX-NEXT: beqz a3, .LBB3_4
254
+ ; RV64IZFINXZDINX-NEXT: .LBB3_2:
255
+ ; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a2
256
+ ; RV64IZFINXZDINX-NEXT: ret
257
+ ; RV64IZFINXZDINX-NEXT: .LBB3_3:
258
+ ; RV64IZFINXZDINX-NEXT: mv a2, a0
259
+ ; RV64IZFINXZDINX-NEXT: feq.d a3, a1, a1
260
+ ; RV64IZFINXZDINX-NEXT: bnez a3, .LBB3_2
261
+ ; RV64IZFINXZDINX-NEXT: .LBB3_4:
262
+ ; RV64IZFINXZDINX-NEXT: fmin.d a0, a1, a2
263
+ ; RV64IZFINXZDINX-NEXT: ret
264
+ %1 = call double @llvm.minimum.f64 (double %a , double %b )
265
+ ret double %1
266
+ }
267
+
268
+ define double @fminimum_nnan_op_f64 (double %a , double %b ) nounwind {
269
+ ; CHECKIFD-LABEL: fminimum_nnan_op_f64:
270
+ ; CHECKIFD: # %bb.0:
271
+ ; CHECKIFD-NEXT: feq.d a0, fa1, fa1
272
+ ; CHECKIFD-NEXT: bnez a0, .LBB4_2
273
+ ; CHECKIFD-NEXT: # %bb.1:
274
+ ; CHECKIFD-NEXT: fmin.d fa0, fa1, fa1
275
+ ; CHECKIFD-NEXT: ret
276
+ ; CHECKIFD-NEXT: .LBB4_2:
277
+ ; CHECKIFD-NEXT: fadd.d fa5, fa0, fa0
278
+ ; CHECKIFD-NEXT: fmin.d fa0, fa5, fa1
279
+ ; CHECKIFD-NEXT: ret
280
+ ;
281
+ ; RV32IZFINXZDINX-LABEL: fminimum_nnan_op_f64:
282
+ ; RV32IZFINXZDINX: # %bb.0:
283
+ ; RV32IZFINXZDINX-NEXT: addi sp, sp, -16
284
+ ; RV32IZFINXZDINX-NEXT: sw a2, 8(sp)
285
+ ; RV32IZFINXZDINX-NEXT: sw a3, 12(sp)
286
+ ; RV32IZFINXZDINX-NEXT: lw a2, 8(sp)
287
+ ; RV32IZFINXZDINX-NEXT: lw a3, 12(sp)
288
+ ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
289
+ ; RV32IZFINXZDINX-NEXT: feq.d a0, a2, a2
290
+ ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
291
+ ; RV32IZFINXZDINX-NEXT: bnez a0, .LBB4_2
292
+ ; RV32IZFINXZDINX-NEXT: # %bb.1:
293
+ ; RV32IZFINXZDINX-NEXT: mv a0, a2
294
+ ; RV32IZFINXZDINX-NEXT: j .LBB4_3
295
+ ; RV32IZFINXZDINX-NEXT: .LBB4_2:
296
+ ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
297
+ ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
298
+ ; RV32IZFINXZDINX-NEXT: fadd.d a0, a0, a0
299
+ ; RV32IZFINXZDINX-NEXT: .LBB4_3:
300
+ ; RV32IZFINXZDINX-NEXT: fmin.d a0, a0, a2
301
+ ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
302
+ ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
303
+ ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
304
+ ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
305
+ ; RV32IZFINXZDINX-NEXT: addi sp, sp, 16
306
+ ; RV32IZFINXZDINX-NEXT: ret
307
+ ;
308
+ ; RV64IZFINXZDINX-LABEL: fminimum_nnan_op_f64:
309
+ ; RV64IZFINXZDINX: # %bb.0:
310
+ ; RV64IZFINXZDINX-NEXT: feq.d a2, a1, a1
311
+ ; RV64IZFINXZDINX-NEXT: bnez a2, .LBB4_2
312
+ ; RV64IZFINXZDINX-NEXT: # %bb.1:
313
+ ; RV64IZFINXZDINX-NEXT: fmin.d a0, a1, a1
314
+ ; RV64IZFINXZDINX-NEXT: ret
315
+ ; RV64IZFINXZDINX-NEXT: .LBB4_2:
316
+ ; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, a0
317
+ ; RV64IZFINXZDINX-NEXT: fmin.d a0, a0, a1
318
+ ; RV64IZFINXZDINX-NEXT: ret
319
+ %c = fadd nnan double %a , %a
320
+ %1 = call double @llvm.minimum.f64 (double %c , double %b )
321
+ ret double %1
322
+ }
323
+
324
+ define double @fmaximum_nnan_op_f64 (double %a , double %b ) nounwind {
325
+ ; CHECKIFD-LABEL: fmaximum_nnan_op_f64:
326
+ ; CHECKIFD: # %bb.0:
327
+ ; CHECKIFD-NEXT: fadd.d fa5, fa0, fa1
328
+ ; CHECKIFD-NEXT: fsub.d fa4, fa0, fa1
329
+ ; CHECKIFD-NEXT: fmax.d fa0, fa5, fa4
330
+ ; CHECKIFD-NEXT: ret
331
+ ;
332
+ ; RV32IZFINXZDINX-LABEL: fmaximum_nnan_op_f64:
333
+ ; RV32IZFINXZDINX: # %bb.0:
334
+ ; RV32IZFINXZDINX-NEXT: addi sp, sp, -16
335
+ ; RV32IZFINXZDINX-NEXT: sw a2, 8(sp)
336
+ ; RV32IZFINXZDINX-NEXT: sw a3, 12(sp)
337
+ ; RV32IZFINXZDINX-NEXT: lw a2, 8(sp)
338
+ ; RV32IZFINXZDINX-NEXT: lw a3, 12(sp)
339
+ ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
340
+ ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
341
+ ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
342
+ ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
343
+ ; RV32IZFINXZDINX-NEXT: fadd.d a4, a0, a2
344
+ ; RV32IZFINXZDINX-NEXT: fsub.d a0, a0, a2
345
+ ; RV32IZFINXZDINX-NEXT: fmax.d a0, a4, a0
346
+ ; RV32IZFINXZDINX-NEXT: sw a0, 8(sp)
347
+ ; RV32IZFINXZDINX-NEXT: sw a1, 12(sp)
348
+ ; RV32IZFINXZDINX-NEXT: lw a0, 8(sp)
349
+ ; RV32IZFINXZDINX-NEXT: lw a1, 12(sp)
350
+ ; RV32IZFINXZDINX-NEXT: addi sp, sp, 16
351
+ ; RV32IZFINXZDINX-NEXT: ret
352
+ ;
353
+ ; RV64IZFINXZDINX-LABEL: fmaximum_nnan_op_f64:
354
+ ; RV64IZFINXZDINX: # %bb.0:
355
+ ; RV64IZFINXZDINX-NEXT: fadd.d a2, a0, a1
356
+ ; RV64IZFINXZDINX-NEXT: fsub.d a0, a0, a1
357
+ ; RV64IZFINXZDINX-NEXT: fmax.d a0, a2, a0
358
+ ; RV64IZFINXZDINX-NEXT: ret
359
+ %c = fadd nnan double %a , %b
360
+ %d = fsub nnan double %a , %b
361
+ %1 = call double @llvm.maximum.f64 (double %c , double %d )
362
+ ret double %1
363
+ }
364
+
162
365
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
163
366
; RV32IFD: {{.*}}
164
367
; RV64IFD: {{.*}}
0 commit comments