[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / Transforms / InstSimplify / const-fold-nvvm-fmin-fmax.ll
blob4ab6b3cf295bfe2e70cede3ceebb69ae189ce867
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2 ; RUN: opt < %s -passes=instsimplify -march=nvptx64 --mcpu=sm_86 --mattr=+ptx72 -S | FileCheck %s
4 ; Check constant-folding for NVVM fmin fmax intrinsics
6 ;###############################################################
7 ;#                    FMax(1.25, -2.0)                         #
8 ;###############################################################
10 define double @test_fmax_1_25_neg_2_d() {
11 ; CHECK-LABEL: define double @test_fmax_1_25_neg_2_d() {
12 ; CHECK-NEXT:    ret double 1.250000e+00
14   %res = call double @llvm.nvvm.fmax.d(double 1.25, double -2.0)
15   ret double %res
18 define float @test_fmax_1_25_neg_2_f() {
19 ; CHECK-LABEL: define float @test_fmax_1_25_neg_2_f() {
20 ; CHECK-NEXT:    ret float 1.250000e+00
22   %res = call float @llvm.nvvm.fmax.f(float 1.25, float -2.0)
23   ret float %res
26 define float @test_fmax_1_25_neg_2_ftz_f() {
27 ; CHECK-LABEL: define float @test_fmax_1_25_neg_2_ftz_f() {
28 ; CHECK-NEXT:    ret float 1.250000e+00
30   %res = call float @llvm.nvvm.fmax.ftz.f(float 1.25, float -2.0)
31   ret float %res
34 define float @test_fmax_1_25_neg_2_ftz_nan_f() {
35 ; CHECK-LABEL: define float @test_fmax_1_25_neg_2_ftz_nan_f() {
36 ; CHECK-NEXT:    ret float 1.250000e+00
38   %res = call float @llvm.nvvm.fmax.ftz.nan.f(float 1.25, float -2.0)
39   ret float %res
42 define float @test_fmax_1_25_neg_2_ftz_nan_xorsign_abs_f() {
43 ; CHECK-LABEL: define float @test_fmax_1_25_neg_2_ftz_nan_xorsign_abs_f() {
44 ; CHECK-NEXT:    ret float -2.000000e+00
46   %res = call float @llvm.nvvm.fmax.ftz.nan.xorsign.abs.f(float 1.25, float -2.0)
47   ret float %res
50 define float @test_fmax_1_25_neg_2_ftz_xorsign_abs_f() {
51 ; CHECK-LABEL: define float @test_fmax_1_25_neg_2_ftz_xorsign_abs_f() {
52 ; CHECK-NEXT:    ret float -2.000000e+00
54   %res = call float @llvm.nvvm.fmax.ftz.xorsign.abs.f(float 1.25, float -2.0)
55   ret float %res
58 define float @test_fmax_1_25_neg_2_nan_f() {
59 ; CHECK-LABEL: define float @test_fmax_1_25_neg_2_nan_f() {
60 ; CHECK-NEXT:    ret float 1.250000e+00
62   %res = call float @llvm.nvvm.fmax.nan.f(float 1.25, float -2.0)
63   ret float %res
66 define float @test_fmax_1_25_neg_2_nan_xorsign_abs_f() {
67 ; CHECK-LABEL: define float @test_fmax_1_25_neg_2_nan_xorsign_abs_f() {
68 ; CHECK-NEXT:    ret float -2.000000e+00
70   %res = call float @llvm.nvvm.fmax.nan.xorsign.abs.f(float 1.25, float -2.0)
71   ret float %res
74 define float @test_fmax_1_25_neg_2_xorsign_abs_f() {
75 ; CHECK-LABEL: define float @test_fmax_1_25_neg_2_xorsign_abs_f() {
76 ; CHECK-NEXT:    ret float -2.000000e+00
78   %res = call float @llvm.nvvm.fmax.xorsign.abs.f(float 1.25, float -2.0)
79   ret float %res
82 ;###############################################################
83 ;#                   FMax(+Subnormal, 0.0)                     #
84 ;###############################################################
86 define double @test_fmax_pos_subnorm_zero_d() {
87 ; CHECK-LABEL: define double @test_fmax_pos_subnorm_zero_d() {
88 ; CHECK-NEXT:    ret double 0x380FFFFFC0000000
90   %res = call double @llvm.nvvm.fmax.d(double 0x380FFFFFC0000000, double 0.0)
91   ret double %res
94 define float @test_fmax_pos_subnorm_zero_f() {
95 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_zero_f() {
96 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
98   %res = call float @llvm.nvvm.fmax.f(float 0x380FFFFFC0000000, float 0.0)
99   ret float %res
102 define float @test_fmax_pos_subnorm_zero_ftz_f() {
103 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_zero_ftz_f() {
104 ; CHECK-NEXT:    ret float 0.000000e+00
106   %res = call float @llvm.nvvm.fmax.ftz.f(float 0x380FFFFFC0000000, float 0.0)
107   ret float %res
110 define float @test_fmax_pos_subnorm_zero_ftz_nan_f() {
111 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_zero_ftz_nan_f() {
112 ; CHECK-NEXT:    ret float 0.000000e+00
114   %res = call float @llvm.nvvm.fmax.ftz.nan.f(float 0x380FFFFFC0000000, float 0.0)
115   ret float %res
118 define float @test_fmax_pos_subnorm_zero_ftz_nan_xorsign_abs_f() {
119 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_zero_ftz_nan_xorsign_abs_f() {
120 ; CHECK-NEXT:    ret float 0.000000e+00
122   %res = call float @llvm.nvvm.fmax.ftz.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float 0.0)
123   ret float %res
126 define float @test_fmax_pos_subnorm_zero_ftz_xorsign_abs_f() {
127 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_zero_ftz_xorsign_abs_f() {
128 ; CHECK-NEXT:    ret float 0.000000e+00
130   %res = call float @llvm.nvvm.fmax.ftz.xorsign.abs.f(float 0x380FFFFFC0000000, float 0.0)
131   ret float %res
134 define float @test_fmax_pos_subnorm_zero_nan_f() {
135 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_zero_nan_f() {
136 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
138   %res = call float @llvm.nvvm.fmax.nan.f(float 0x380FFFFFC0000000, float 0.0)
139   ret float %res
142 define float @test_fmax_pos_subnorm_zero_nan_xorsign_abs_f() {
143 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_zero_nan_xorsign_abs_f() {
144 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
146   %res = call float @llvm.nvvm.fmax.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float 0.0)
147   ret float %res
150 define float @test_fmax_pos_subnorm_zero_xorsign_abs_f() {
151 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_zero_xorsign_abs_f() {
152 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
154   %res = call float @llvm.nvvm.fmax.xorsign.abs.f(float 0x380FFFFFC0000000, float 0.0)
155   ret float %res
158 ;###############################################################
159 ;#                   FMax(+Subnormal, -Subnormal)              #
160 ;###############################################################
162 define double @test_fmax_pos_subnorm_neg_subnorm_d() {
163 ; CHECK-LABEL: define double @test_fmax_pos_subnorm_neg_subnorm_d() {
164 ; CHECK-NEXT:    ret double 0x380FFFFFC0000000
166   %res = call double @llvm.nvvm.fmax.d(double 0x380FFFFFC0000000, double 0xB80FFFFFC0000000)
167   ret double %res
170 define float @test_fmax_pos_subnorm_neg_subnorm_f() {
171 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_neg_subnorm_f() {
172 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
174   %res = call float @llvm.nvvm.fmax.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
175   ret float %res
178 define float @test_fmax_pos_subnorm_neg_subnorm_ftz_f() {
179 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_neg_subnorm_ftz_f() {
180 ; CHECK-NEXT:    ret float 0.000000e+00
182   %res = call float @llvm.nvvm.fmax.ftz.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
183   ret float %res
186 define float @test_fmax_pos_subnorm_neg_subnorm_ftz_nan_f() {
187 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_neg_subnorm_ftz_nan_f() {
188 ; CHECK-NEXT:    ret float 0.000000e+00
190   %res = call float @llvm.nvvm.fmax.ftz.nan.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
191   ret float %res
194 define float @test_fmax_pos_subnorm_neg_subnorm_ftz_nan_xorsign_abs_f() {
195 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_neg_subnorm_ftz_nan_xorsign_abs_f() {
196 ; CHECK-NEXT:    ret float -0.000000e+00
198   %res = call float @llvm.nvvm.fmax.ftz.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
199   ret float %res
202 define float @test_fmax_pos_subnorm_neg_subnorm_ftz_xorsign_abs_f() {
203 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_neg_subnorm_ftz_xorsign_abs_f() {
204 ; CHECK-NEXT:    ret float -0.000000e+00
206   %res = call float @llvm.nvvm.fmax.ftz.xorsign.abs.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
207   ret float %res
210 define float @test_fmax_pos_subnorm_neg_subnorm_nan_f() {
211 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_neg_subnorm_nan_f() {
212 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
214   %res = call float @llvm.nvvm.fmax.nan.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
215   ret float %res
218 define float @test_fmax_pos_subnorm_neg_subnorm_nan_xorsign_abs_f() {
219 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_neg_subnorm_nan_xorsign_abs_f() {
220 ; CHECK-NEXT:    ret float 0xB80FFFFFC0000000
222   %res = call float @llvm.nvvm.fmax.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
223   ret float %res
226 define float @test_fmax_pos_subnorm_neg_subnorm_xorsign_abs_f() {
227 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_neg_subnorm_xorsign_abs_f() {
228 ; CHECK-NEXT:    ret float 0xB80FFFFFC0000000
230   %res = call float @llvm.nvvm.fmax.xorsign.abs.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
231   ret float %res
234 ;###############################################################
235 ;#                   FMax(+Subnormal, NaN)                     #
236 ;###############################################################
238 define double @test_fmax_pos_subnorm_nan_d() {
239 ; CHECK-LABEL: define double @test_fmax_pos_subnorm_nan_d() {
240 ; CHECK-NEXT:    ret double 0x380FFFFFC0000000
242   %res = call double @llvm.nvvm.fmax.d(double 0x380FFFFFC0000000, double 0x7fff444400000000)
243   ret double %res
246 define float @test_fmax_pos_subnorm_nan_f() {
247 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_nan_f() {
248 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
250   %res = call float @llvm.nvvm.fmax.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
251   ret float %res
254 define float @test_fmax_pos_subnorm_nan_ftz_f() {
255 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_nan_ftz_f() {
256 ; CHECK-NEXT:    ret float 0.000000e+00
258   %res = call float @llvm.nvvm.fmax.ftz.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
259   ret float %res
262 define float @test_fmax_pos_subnorm_nan_ftz_nan_f() {
263 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_nan_ftz_nan_f() {
264 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
266   %res = call float @llvm.nvvm.fmax.ftz.nan.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
267   ret float %res
270 define float @test_fmax_pos_subnorm_nan_ftz_nan_xorsign_abs_f() {
271 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_nan_ftz_nan_xorsign_abs_f() {
272 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
274   %res = call float @llvm.nvvm.fmax.ftz.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
275   ret float %res
278 define float @test_fmax_pos_subnorm_nan_ftz_xorsign_abs_f() {
279 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_nan_ftz_xorsign_abs_f() {
280 ; CHECK-NEXT:    ret float 0.000000e+00
282   %res = call float @llvm.nvvm.fmax.ftz.xorsign.abs.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
283   ret float %res
286 define float @test_fmax_pos_subnorm_nan_nan_f() {
287 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_nan_nan_f() {
288 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
290   %res = call float @llvm.nvvm.fmax.nan.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
291   ret float %res
294 define float @test_fmax_pos_subnorm_nan_nan_xorsign_abs_f() {
295 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_nan_nan_xorsign_abs_f() {
296 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
298   %res = call float @llvm.nvvm.fmax.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
299   ret float %res
302 define float @test_fmax_pos_subnorm_nan_xorsign_abs_f() {
303 ; CHECK-LABEL: define float @test_fmax_pos_subnorm_nan_xorsign_abs_f() {
304 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
306   %res = call float @llvm.nvvm.fmax.xorsign.abs.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
307   ret float %res
310 ;###############################################################
311 ;#                   FMax(+Subnormal, undef)                   #
312 ;###############################################################
314 define double @test_fmax_subnorm_undef_d() {
315 ; CHECK-LABEL: define double @test_fmax_subnorm_undef_d() {
316 ; CHECK-NEXT:    ret double 0x380FFFFFC0000000
318   %res = call double @llvm.nvvm.fmax.d(double 0x380FFFFFC0000000, double undef)
319   ret double %res
322 define float @test_fmax_subnorm_undef_f() {
323 ; CHECK-LABEL: define float @test_fmax_subnorm_undef_f() {
324 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
326   %res = call float @llvm.nvvm.fmax.f(float 0x380FFFFFC0000000, float undef)
327   ret float %res
330 define float @test_fmax_subnorm_undef_ftz_f() {
331 ; CHECK-LABEL: define float @test_fmax_subnorm_undef_ftz_f() {
332 ; CHECK-NEXT:    ret float 0.000000e+00
334   %res = call float @llvm.nvvm.fmax.ftz.f(float 0x380FFFFFC0000000, float undef)
335   ret float %res
338 define float @test_fmax_subnorm_undef_ftz_nan_f() {
339 ; CHECK-LABEL: define float @test_fmax_subnorm_undef_ftz_nan_f() {
340 ; CHECK-NEXT:    ret float 0.000000e+00
342   %res = call float @llvm.nvvm.fmax.ftz.nan.f(float 0x380FFFFFC0000000, float undef)
343   ret float %res
346 define float @test_fmax_subnorm_undef_ftz_nan_xorsign_abs_f() {
347 ; CHECK-LABEL: define float @test_fmax_subnorm_undef_ftz_nan_xorsign_abs_f() {
348 ; CHECK-NEXT:    ret float 0.000000e+00
350   %res = call float @llvm.nvvm.fmax.ftz.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float undef)
351   ret float %res
354 define float @test_fmax_subnorm_undef_ftz_xorsign_abs_f() {
355 ; CHECK-LABEL: define float @test_fmax_subnorm_undef_ftz_xorsign_abs_f() {
356 ; CHECK-NEXT:    ret float 0.000000e+00
358   %res = call float @llvm.nvvm.fmax.ftz.xorsign.abs.f(float 0x380FFFFFC0000000, float undef)
359   ret float %res
362 define float @test_fmax_subnorm_undef_nan_f() {
363 ; CHECK-LABEL: define float @test_fmax_subnorm_undef_nan_f() {
364 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
366   %res = call float @llvm.nvvm.fmax.nan.f(float 0x380FFFFFC0000000, float undef)
367   ret float %res
370 define float @test_fmax_subnorm_undef_nan_xorsign_abs_f() {
371 ; CHECK-LABEL: define float @test_fmax_subnorm_undef_nan_xorsign_abs_f() {
372 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
374   %res = call float @llvm.nvvm.fmax.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float undef)
375   ret float %res
378 define float @test_fmax_subnorm_undef_xorsign_abs_f() {
379 ; CHECK-LABEL: define float @test_fmax_subnorm_undef_xorsign_abs_f() {
380 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
382   %res = call float @llvm.nvvm.fmax.xorsign.abs.f(float 0x380FFFFFC0000000, float undef)
383   ret float %res
386 ;###############################################################
387 ;#                      FMax(NaN, undef)                       #
388 ;###############################################################
389 ; Ensure we canonicalize the NaNs for f32
391 define double @test_fmax_nan_undef_d() {
392 ; CHECK-LABEL: define double @test_fmax_nan_undef_d() {
393 ; CHECK-NEXT:    ret double 0x7FF4444400000000
395   %res = call double @llvm.nvvm.fmax.d(double 0x7ff4444400000000, double undef)
396   ret double %res
399 define float @test_fmax_nan_undef_f() {
400 ; CHECK-LABEL: define float @test_fmax_nan_undef_f() {
401 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
403   %res = call float @llvm.nvvm.fmax.f(float 0x7fff444400000000, float undef)
404   ret float %res
407 define float @test_fmax_nan_undef_ftz_f() {
408 ; CHECK-LABEL: define float @test_fmax_nan_undef_ftz_f() {
409 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
411   %res = call float @llvm.nvvm.fmax.ftz.f(float 0x7fff444400000000, float undef)
412   ret float %res
415 define float @test_fmax_nan_undef_ftz_nan_f() {
416 ; CHECK-LABEL: define float @test_fmax_nan_undef_ftz_nan_f() {
417 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
419   %res = call float @llvm.nvvm.fmax.ftz.nan.f(float 0x7fff444400000000, float undef)
420   ret float %res
423 define float @test_fmax_nan_undef_ftz_nan_xorsign_abs_f() {
424 ; CHECK-LABEL: define float @test_fmax_nan_undef_ftz_nan_xorsign_abs_f() {
425 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
427   %res = call float @llvm.nvvm.fmax.ftz.nan.xorsign.abs.f(float 0x7fff444400000000, float undef)
428   ret float %res
431 define float @test_fmax_nan_undef_ftz_xorsign_abs_f() {
432 ; CHECK-LABEL: define float @test_fmax_nan_undef_ftz_xorsign_abs_f() {
433 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
435   %res = call float @llvm.nvvm.fmax.ftz.xorsign.abs.f(float 0x7ffff4ff00000000, float undef)
436   ret float %res
439 define float @test_fmax_nan_undef_nan_f() {
440 ; CHECK-LABEL: define float @test_fmax_nan_undef_nan_f() {
441 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
443   %res = call float @llvm.nvvm.fmax.nan.f(float 0x7fff444400000000, float undef)
444   ret float %res
447 define float @test_fmax_nan_undef_nan_xorsign_abs_f() {
448 ; CHECK-LABEL: define float @test_fmax_nan_undef_nan_xorsign_abs_f() {
449 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
451   %res = call float @llvm.nvvm.fmax.nan.xorsign.abs.f(float 0x7fff444400000000, float undef)
452   ret float %res
455 define float @test_fmax_nan_undef_xorsign_abs_f() {
456 ; CHECK-LABEL: define float @test_fmax_nan_undef_xorsign_abs_f() {
457 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
459   %res = call float @llvm.nvvm.fmax.xorsign.abs.f(float 0x7fff444400000000, float undef)
460   ret float %res
463 ;###############################################################
464 ;#                    FMin(1.25, -2.0)                         #
465 ;###############################################################
467 define double @test_fmin_1_25_neg_2_d() {
468 ; CHECK-LABEL: define double @test_fmin_1_25_neg_2_d() {
469 ; CHECK-NEXT:    ret double -2.000000e+00
471   %res = call double @llvm.nvvm.fmin.d(double 1.25, double -2.0)
472   ret double %res
475 define float @test_fmin_1_25_neg_2_f() {
476 ; CHECK-LABEL: define float @test_fmin_1_25_neg_2_f() {
477 ; CHECK-NEXT:    ret float -2.000000e+00
479   %res = call float @llvm.nvvm.fmin.f(float 1.25, float -2.0)
480   ret float %res
483 define float @test_fmin_1_25_neg_2_ftz_f() {
484 ; CHECK-LABEL: define float @test_fmin_1_25_neg_2_ftz_f() {
485 ; CHECK-NEXT:    ret float -2.000000e+00
487   %res = call float @llvm.nvvm.fmin.ftz.f(float 1.25, float -2.0)
488   ret float %res
491 define float @test_fmin_1_25_neg_2_ftz_nan_f() {
492 ; CHECK-LABEL: define float @test_fmin_1_25_neg_2_ftz_nan_f() {
493 ; CHECK-NEXT:    ret float -2.000000e+00
495   %res = call float @llvm.nvvm.fmin.ftz.nan.f(float 1.25, float -2.0)
496   ret float %res
499 define float @test_fmin_1_25_neg_2_ftz_nan_xorsign_abs_f() {
500 ; CHECK-LABEL: define float @test_fmin_1_25_neg_2_ftz_nan_xorsign_abs_f() {
501 ; CHECK-NEXT:    ret float -1.250000e+00
503   %res = call float @llvm.nvvm.fmin.ftz.nan.xorsign.abs.f(float 1.25, float -2.0)
504   ret float %res
507 define float @test_fmin_1_25_neg_2_ftz_xorsign_abs_f() {
508 ; CHECK-LABEL: define float @test_fmin_1_25_neg_2_ftz_xorsign_abs_f() {
509 ; CHECK-NEXT:    ret float -1.250000e+00
511   %res = call float @llvm.nvvm.fmin.ftz.xorsign.abs.f(float 1.25, float -2.0)
512   ret float %res
515 define float @test_fmin_1_25_neg_2_nan_f() {
516 ; CHECK-LABEL: define float @test_fmin_1_25_neg_2_nan_f() {
517 ; CHECK-NEXT:    ret float -2.000000e+00
519   %res = call float @llvm.nvvm.fmin.nan.f(float 1.25, float -2.0)
520   ret float %res
523 define float @test_fmin_1_25_neg_2_nan_xorsign_abs_f() {
524 ; CHECK-LABEL: define float @test_fmin_1_25_neg_2_nan_xorsign_abs_f() {
525 ; CHECK-NEXT:    ret float -1.250000e+00
527   %res = call float @llvm.nvvm.fmin.nan.xorsign.abs.f(float 1.25, float -2.0)
528   ret float %res
531 define float @test_fmin_1_25_neg_2_xorsign_abs_f() {
532 ; CHECK-LABEL: define float @test_fmin_1_25_neg_2_xorsign_abs_f() {
533 ; CHECK-NEXT:    ret float -1.250000e+00
535   %res = call float @llvm.nvvm.fmin.xorsign.abs.f(float 1.25, float -2.0)
536   ret float %res
539 ;###############################################################
540 ;#                   FMin(-Subnormal, 0.0)                     #
541 ;###############################################################
543 define double @test_fmin_neg_subnorm_zero_d() {
544 ; CHECK-LABEL: define double @test_fmin_neg_subnorm_zero_d() {
545 ; CHECK-NEXT:    ret double 0xB80FFFFFC0000000
547   %res = call double @llvm.nvvm.fmin.d(double 0xB80FFFFFC0000000, double 0.0)
548   ret double %res
551 define float @test_fmin_neg_subnorm_zero_f() {
552 ; CHECK-LABEL: define float @test_fmin_neg_subnorm_zero_f() {
553 ; CHECK-NEXT:    ret float 0xB80FFFFFC0000000
555   %res = call float @llvm.nvvm.fmin.f(float 0xB80FFFFFC0000000, float 0.0)
556   ret float %res
559 define float @test_fmin_neg_subnorm_zero_ftz_f() {
560 ; CHECK-LABEL: define float @test_fmin_neg_subnorm_zero_ftz_f() {
561 ; CHECK-NEXT:    ret float -0.000000e+00
563   %res = call float @llvm.nvvm.fmin.ftz.f(float 0xB80FFFFFC0000000, float 0.0)
564   ret float %res
567 define float @test_fmin_neg_subnorm_zero_ftz_nan_f() {
568 ; CHECK-LABEL: define float @test_fmin_neg_subnorm_zero_ftz_nan_f() {
569 ; CHECK-NEXT:    ret float -0.000000e+00
571   %res = call float @llvm.nvvm.fmin.ftz.nan.f(float 0xB80FFFFFC0000000, float 0.0)
572   ret float %res
575 define float @test_fmin_neg_subnorm_zero_ftz_nan_xorsign_abs_f() {
576 ; CHECK-LABEL: define float @test_fmin_neg_subnorm_zero_ftz_nan_xorsign_abs_f() {
577 ; CHECK-NEXT:    ret float -0.000000e+00
579   %res = call float @llvm.nvvm.fmin.ftz.nan.xorsign.abs.f(float 0xB80FFFFFC0000000, float 0.0)
580   ret float %res
583 define float @test_fmin_neg_subnorm_zero_ftz_xorsign_abs_f() {
584 ; CHECK-LABEL: define float @test_fmin_neg_subnorm_zero_ftz_xorsign_abs_f() {
585 ; CHECK-NEXT:    ret float -0.000000e+00
587   %res = call float @llvm.nvvm.fmin.ftz.xorsign.abs.f(float 0xB80FFFFFC0000000, float 0.0)
588   ret float %res
591 define float @test_fmin_neg_subnorm_zero_nan_f() {
592 ; CHECK-LABEL: define float @test_fmin_neg_subnorm_zero_nan_f() {
593 ; CHECK-NEXT:    ret float 0xB80FFFFFC0000000
595   %res = call float @llvm.nvvm.fmin.nan.f(float 0xB80FFFFFC0000000, float 0.0)
596   ret float %res
599 define float @test_fmin_neg_subnorm_zero_nan_xorsign_abs_f() {
600 ; CHECK-LABEL: define float @test_fmin_neg_subnorm_zero_nan_xorsign_abs_f() {
601 ; CHECK-NEXT:    ret float -0.000000e+00
603   %res = call float @llvm.nvvm.fmin.nan.xorsign.abs.f(float 0xB80FFFFFC0000000, float 0.0)
604   ret float %res
607 define float @test_fmin_neg_subnorm_zero_xorsign_abs_f() {
608 ; CHECK-LABEL: define float @test_fmin_neg_subnorm_zero_xorsign_abs_f() {
609 ; CHECK-NEXT:    ret float -0.000000e+00
611   %res = call float @llvm.nvvm.fmin.xorsign.abs.f(float 0xB80FFFFFC0000000, float 0.0)
612   ret float %res
615 ;###############################################################
616 ;#                   FMin(+Subnormal, -Subnormal)              #
617 ;###############################################################
619 define double @test_fmin_pos_subnorm_neg_subnorm_d() {
620 ; CHECK-LABEL: define double @test_fmin_pos_subnorm_neg_subnorm_d() {
621 ; CHECK-NEXT:    ret double 0xB80FFFFFC0000000
623   %res = call double @llvm.nvvm.fmin.d(double 0x380FFFFFC0000000, double 0xB80FFFFFC0000000)
624   ret double %res
627 define float @test_fmin_pos_subnorm_neg_subnorm_f() {
628 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_neg_subnorm_f() {
629 ; CHECK-NEXT:    ret float 0xB80FFFFFC0000000
631   %res = call float @llvm.nvvm.fmin.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
632   ret float %res
635 define float @test_fmin_pos_subnorm_neg_subnorm_ftz_f() {
636 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_neg_subnorm_ftz_f() {
637 ; CHECK-NEXT:    ret float -0.000000e+00
639   %res = call float @llvm.nvvm.fmin.ftz.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
640   ret float %res
643 define float @test_fmin_pos_subnorm_neg_subnorm_ftz_nan_f() {
644 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_neg_subnorm_ftz_nan_f() {
645 ; CHECK-NEXT:    ret float -0.000000e+00
647   %res = call float @llvm.nvvm.fmin.ftz.nan.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
648   ret float %res
651 define float @test_fmin_pos_subnorm_neg_subnorm_ftz_nan_xorsign_abs_f() {
652 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_neg_subnorm_ftz_nan_xorsign_abs_f() {
653 ; CHECK-NEXT:    ret float -0.000000e+00
655   %res = call float @llvm.nvvm.fmin.ftz.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
656   ret float %res
659 define float @test_fmin_pos_subnorm_neg_subnorm_ftz_xorsign_abs_f() {
660 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_neg_subnorm_ftz_xorsign_abs_f() {
661 ; CHECK-NEXT:    ret float -0.000000e+00
663   %res = call float @llvm.nvvm.fmin.ftz.xorsign.abs.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
664   ret float %res
667 define float @test_fmin_pos_subnorm_neg_subnorm_nan_f() {
668 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_neg_subnorm_nan_f() {
669 ; CHECK-NEXT:    ret float 0xB80FFFFFC0000000
671   %res = call float @llvm.nvvm.fmin.nan.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
672   ret float %res
675 define float @test_fmin_pos_subnorm_neg_subnorm_nan_xorsign_abs_f() {
676 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_neg_subnorm_nan_xorsign_abs_f() {
677 ; CHECK-NEXT:    ret float 0xB80FFFFFC0000000
679   %res = call float @llvm.nvvm.fmin.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
680   ret float %res
683 define float @test_fmin_pos_subnorm_neg_subnorm_xorsign_abs_f() {
684 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_neg_subnorm_xorsign_abs_f() {
685 ; CHECK-NEXT:    ret float 0xB80FFFFFC0000000
687   %res = call float @llvm.nvvm.fmin.xorsign.abs.f(float 0x380FFFFFC0000000, float 0xB80FFFFFC0000000)
688   ret float %res
691 ;###############################################################
692 ;#                   FMin(+Subnormal, NaN)                     #
693 ;###############################################################
695 define double @test_fmin_pos_subnorm_nan_d() {
696 ; CHECK-LABEL: define double @test_fmin_pos_subnorm_nan_d() {
697 ; CHECK-NEXT:    ret double 0x380FFFFFC0000000
699   %res = call double @llvm.nvvm.fmin.d(double 0x380FFFFFC0000000, double 0x7fff444400000000)
700   ret double %res
703 define float @test_fmin_pos_subnorm_nan_f() {
704 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_nan_f() {
705 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
707   %res = call float @llvm.nvvm.fmin.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
708   ret float %res
711 define float @test_fmin_pos_subnorm_nan_ftz_f() {
712 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_nan_ftz_f() {
713 ; CHECK-NEXT:    ret float 0.000000e+00
715   %res = call float @llvm.nvvm.fmin.ftz.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
716   ret float %res
719 define float @test_fmin_pos_subnorm_nan_ftz_nan_f() {
720 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_nan_ftz_nan_f() {
721 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
723   %res = call float @llvm.nvvm.fmin.ftz.nan.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
724   ret float %res
727 define float @test_fmin_pos_subnorm_nan_ftz_nan_xorsign_abs_f() {
728 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_nan_ftz_nan_xorsign_abs_f() {
729 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
731   %res = call float @llvm.nvvm.fmin.ftz.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
732   ret float %res
735 define float @test_fmin_pos_subnorm_nan_ftz_xorsign_abs_f() {
736 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_nan_ftz_xorsign_abs_f() {
737 ; CHECK-NEXT:    ret float 0.000000e+00
739   %res = call float @llvm.nvvm.fmin.ftz.xorsign.abs.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
740   ret float %res
743 define float @test_fmin_pos_subnorm_nan_nan_f() {
744 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_nan_nan_f() {
745 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
747   %res = call float @llvm.nvvm.fmin.nan.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
748   ret float %res
751 define float @test_fmin_pos_subnorm_nan_nan_xorsign_abs_f() {
752 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_nan_nan_xorsign_abs_f() {
753 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
755   %res = call float @llvm.nvvm.fmin.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
756   ret float %res
759 define float @test_fmin_pos_subnorm_nan_xorsign_abs_f() {
760 ; CHECK-LABEL: define float @test_fmin_pos_subnorm_nan_xorsign_abs_f() {
761 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
763   %res = call float @llvm.nvvm.fmin.xorsign.abs.f(float 0x380FFFFFC0000000, float 0x7fff444400000000)
764   ret float %res
767 ;###############################################################
768 ;#                   FMin(+Subnormal, undef)                   #
769 ;###############################################################
771 define double @test_fmin_subnorm_undef_d() {
772 ; CHECK-LABEL: define double @test_fmin_subnorm_undef_d() {
773 ; CHECK-NEXT:    ret double 0x380FFFFFC0000000
775   %res = call double @llvm.nvvm.fmin.d(double 0x380FFFFFC0000000, double undef)
776   ret double %res
779 define float @test_fmin_subnorm_undef_f() {
780 ; CHECK-LABEL: define float @test_fmin_subnorm_undef_f() {
781 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
783   %res = call float @llvm.nvvm.fmin.f(float 0x380FFFFFC0000000, float undef)
784   ret float %res
787 define float @test_fmin_subnorm_undef_ftz_f() {
788 ; CHECK-LABEL: define float @test_fmin_subnorm_undef_ftz_f() {
789 ; CHECK-NEXT:    ret float 0.000000e+00
791   %res = call float @llvm.nvvm.fmin.ftz.f(float 0x380FFFFFC0000000, float undef)
792   ret float %res
795 define float @test_fmin_subnorm_undef_ftz_nan_f() {
796 ; CHECK-LABEL: define float @test_fmin_subnorm_undef_ftz_nan_f() {
797 ; CHECK-NEXT:    ret float 0.000000e+00
799   %res = call float @llvm.nvvm.fmin.ftz.nan.f(float 0x380FFFFFC0000000, float undef)
800   ret float %res
803 define float @test_fmin_subnorm_undef_ftz_nan_xorsign_abs_f() {
804 ; CHECK-LABEL: define float @test_fmin_subnorm_undef_ftz_nan_xorsign_abs_f() {
805 ; CHECK-NEXT:    ret float 0.000000e+00
807   %res = call float @llvm.nvvm.fmin.ftz.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float undef)
808   ret float %res
811 define float @test_fmin_subnorm_undef_ftz_xorsign_abs_f() {
812 ; CHECK-LABEL: define float @test_fmin_subnorm_undef_ftz_xorsign_abs_f() {
813 ; CHECK-NEXT:    ret float 0.000000e+00
815   %res = call float @llvm.nvvm.fmin.ftz.xorsign.abs.f(float 0x380FFFFFC0000000, float undef)
816   ret float %res
819 define float @test_fmin_subnorm_undef_nan_f() {
820 ; CHECK-LABEL: define float @test_fmin_subnorm_undef_nan_f() {
821 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
823   %res = call float @llvm.nvvm.fmin.nan.f(float 0x380FFFFFC0000000, float undef)
824   ret float %res
827 define float @test_fmin_subnorm_undef_nan_xorsign_abs_f() {
828 ; CHECK-LABEL: define float @test_fmin_subnorm_undef_nan_xorsign_abs_f() {
829 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
831   %res = call float @llvm.nvvm.fmin.nan.xorsign.abs.f(float 0x380FFFFFC0000000, float undef)
832   ret float %res
835 define float @test_fmin_subnorm_undef_xorsign_abs_f() {
836 ; CHECK-LABEL: define float @test_fmin_subnorm_undef_xorsign_abs_f() {
837 ; CHECK-NEXT:    ret float 0x380FFFFFC0000000
839   %res = call float @llvm.nvvm.fmin.xorsign.abs.f(float 0x380FFFFFC0000000, float undef)
840   ret float %res
843 ;###############################################################
844 ;#                      FMin(NaN, undef)                       #
845 ;###############################################################
846 ; Ensure we canonicalize the NaNs for f32
848 define double @test_fmin_nan_undef_d() {
849 ; CHECK-LABEL: define double @test_fmin_nan_undef_d() {
850 ; CHECK-NEXT:    ret double 0x7FF4444400000000
852   %res = call double @llvm.nvvm.fmin.d(double 0x7ff4444400000000, double undef)
853   ret double %res
856 define float @test_fmin_nan_undef_f() {
857 ; CHECK-LABEL: define float @test_fmin_nan_undef_f() {
858 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
860   %res = call float @llvm.nvvm.fmin.f(float 0x7fff444400000000, float undef)
861   ret float %res
864 define float @test_fmin_nan_undef_ftz_f() {
865 ; CHECK-LABEL: define float @test_fmin_nan_undef_ftz_f() {
866 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
868   %res = call float @llvm.nvvm.fmin.ftz.f(float 0x7fff444400000000, float undef)
869   ret float %res
872 define float @test_fmin_nan_undef_ftz_nan_f() {
873 ; CHECK-LABEL: define float @test_fmin_nan_undef_ftz_nan_f() {
874 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
876   %res = call float @llvm.nvvm.fmin.ftz.nan.f(float 0x7fff444400000000, float undef)
877   ret float %res
880 define float @test_fmin_nan_undef_ftz_nan_xorsign_abs_f() {
881 ; CHECK-LABEL: define float @test_fmin_nan_undef_ftz_nan_xorsign_abs_f() {
882 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
884   %res = call float @llvm.nvvm.fmin.ftz.nan.xorsign.abs.f(float 0x7fff444400000000, float undef)
885   ret float %res
888 define float @test_fmin_nan_undef_ftz_xorsign_abs_f() {
889 ; CHECK-LABEL: define float @test_fmin_nan_undef_ftz_xorsign_abs_f() {
890 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
892   %res = call float @llvm.nvvm.fmin.ftz.xorsign.abs.f(float 0x7ffff4ff00000000, float undef)
893   ret float %res
896 define float @test_fmin_nan_undef_nan_f() {
897 ; CHECK-LABEL: define float @test_fmin_nan_undef_nan_f() {
898 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
900   %res = call float @llvm.nvvm.fmin.nan.f(float 0x7fff444400000000, float undef)
901   ret float %res
904 define float @test_fmin_nan_undef_nan_xorsign_abs_f() {
905 ; CHECK-LABEL: define float @test_fmin_nan_undef_nan_xorsign_abs_f() {
906 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
908   %res = call float @llvm.nvvm.fmin.nan.xorsign.abs.f(float 0x7fff444400000000, float undef)
909   ret float %res
912 define float @test_fmin_nan_undef_xorsign_abs_f() {
913 ; CHECK-LABEL: define float @test_fmin_nan_undef_xorsign_abs_f() {
914 ; CHECK-NEXT:    ret float 0x7FFFFFFFE0000000
916   %res = call float @llvm.nvvm.fmin.xorsign.abs.f(float 0x7fff444400000000, float undef)
917   ret float %res