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 ;###############################################################
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)