| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 |
| ; RUN: opt < %s -passes=instsimplify -march=nvptx64 -S | FileCheck %s |
| |
| ; Test constant-folding for various NVVM unary arithmetic intrinsics. |
| |
| ;############################################################### |
| ;# Ceil # |
| ;############################################################### |
| |
| define double @test_ceil_d_1_25() { |
| ; CHECK-LABEL: define double @test_ceil_d_1_25() { |
| ; CHECK-NEXT: ret double 2.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.ceil.d(double 1.25) |
| ret double %res |
| } |
| |
| define float @test_ceil_f_1_25() { |
| ; CHECK-LABEL: define float @test_ceil_f_1_25() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.ceil.f(float 1.25) |
| ret float %res |
| } |
| |
| define float @test_ceil_ftz_f_1_25() { |
| ; CHECK-LABEL: define float @test_ceil_ftz_f_1_25() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.ceil.ftz.f(float 1.25) |
| ret float %res |
| } |
| |
| define double @test_ceil_d_pos_subnorm() { |
| ; CHECK-LABEL: define double @test_ceil_d_pos_subnorm() { |
| ; CHECK-NEXT: ret double 1.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.ceil.d(double 0x380FFFFFC0000000) |
| ret double %res |
| } |
| |
| define float @test_ceil_f_pos_subnorm() { |
| ; CHECK-LABEL: define float @test_ceil_f_pos_subnorm() { |
| ; CHECK-NEXT: ret float 1.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.ceil.f(float 0x380FFFFFC0000000) |
| ret float %res |
| } |
| |
| define float @test_ceil_ftz_f_pos_subnorm() { |
| ; CHECK-LABEL: define float @test_ceil_ftz_f_pos_subnorm() { |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.ceil.ftz.f(float 0x380FFFFFC0000000) |
| ret float %res |
| } |
| |
| ;############################################################### |
| ;# FAbs # |
| ;############################################################### |
| |
| define float @test_fabs_neg_1_5() { |
| ; CHECK-LABEL: define float @test_fabs_neg_1_5() { |
| ; CHECK-NEXT: ret float 1.500000e+00 |
| ; |
| %res = call float @llvm.nvvm.fabs(float -1.5) |
| ret float %res |
| } |
| |
| define float @test_fabs_ftz_neg_1_5() { |
| ; CHECK-LABEL: define float @test_fabs_ftz_neg_1_5() { |
| ; CHECK-NEXT: ret float 1.500000e+00 |
| ; |
| %res = call float @llvm.nvvm.fabs.ftz(float -1.5) |
| ret float %res |
| } |
| |
| define float @test_fabs_1_25() { |
| ; CHECK-LABEL: define float @test_fabs_1_25() { |
| ; CHECK-NEXT: ret float 1.250000e+00 |
| ; |
| %res = call float @llvm.nvvm.fabs(float 1.25) |
| ret float %res |
| } |
| |
| define float @test_fabs_ftz_1_25() { |
| ; CHECK-LABEL: define float @test_fabs_ftz_1_25() { |
| ; CHECK-NEXT: ret float 1.250000e+00 |
| ; |
| %res = call float @llvm.nvvm.fabs.ftz(float 1.25) |
| ret float %res |
| } |
| |
| define float @test_fabs_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_fabs_neg_subnorm() { |
| ; CHECK-NEXT: ret float 0x380FFFFFC0000000 |
| ; |
| %res = call float @llvm.nvvm.fabs(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| define float @test_fabs_ftz_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_fabs_ftz_neg_subnorm() { |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.fabs.ftz(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| define float @test_fabs_pos_subnorm() { |
| ; CHECK-LABEL: define float @test_fabs_pos_subnorm() { |
| ; CHECK-NEXT: ret float 0x380FFFFFC0000000 |
| ; |
| %res = call float @llvm.nvvm.fabs(float 0x380FFFFFC0000000) |
| ret float %res |
| } |
| |
| define float @test_fabs_ftz_pos_subnorm() { |
| ; CHECK-LABEL: define float @test_fabs_ftz_pos_subnorm() { |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.fabs.ftz(float 0x380FFFFFC0000000) |
| ret float %res |
| } |
| |
| |
| ;############################################################### |
| ;# Floor # |
| ;############################################################### |
| |
| define double @test_floor_d_1_25() { |
| ; CHECK-LABEL: define double @test_floor_d_1_25() { |
| ; CHECK-NEXT: ret double 1.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.floor.d(double 1.25) |
| ret double %res |
| } |
| |
| define float @test_floor_f_1_25() { |
| ; CHECK-LABEL: define float @test_floor_f_1_25() { |
| ; CHECK-NEXT: ret float 1.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.floor.f(float 1.25) |
| ret float %res |
| } |
| |
| define float @test_floor_ftz_f_1_25() { |
| ; CHECK-LABEL: define float @test_floor_ftz_f_1_25() { |
| ; CHECK-NEXT: ret float 1.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.floor.ftz.f(float 1.25) |
| ret float %res |
| } |
| |
| define double @test_floor_d_neg_subnorm() { |
| ; CHECK-LABEL: define double @test_floor_d_neg_subnorm() { |
| ; CHECK-NEXT: ret double -1.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.floor.d(double 0xB80FFFFFC0000000) |
| ret double %res |
| } |
| |
| define float @test_floor_f_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_floor_f_neg_subnorm() { |
| ; CHECK-NEXT: ret float -1.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.floor.f(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| define float @test_floor_ftz_f_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_floor_ftz_f_neg_subnorm() { |
| ; CHECK-NEXT: ret float -0.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.floor.ftz.f(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| ;############################################################### |
| ;# Rcp # |
| ;############################################################### |
| |
| ;+-------------------------------------------------------------+ |
| ;| rcp_rm | |
| ;+-------------------------------------------------------------+ |
| define double @test_rcp_rm_d_0_5() { |
| ; CHECK-LABEL: define double @test_rcp_rm_d_0_5() { |
| ; CHECK-NEXT: ret double 2.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.rcp.rm.d(double 0.5) |
| ret double %res |
| } |
| |
| define float @test_rcp_rm_f_0_5() { |
| ; CHECK-LABEL: define float @test_rcp_rm_f_0_5() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.rcp.rm.f(float 0.5) |
| ret float %res |
| } |
| |
| define float @test_rcp_rm_ftz_f_0_5() { |
| ; CHECK-LABEL: define float @test_rcp_rm_ftz_f_0_5() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.rcp.rm.ftz.f(float 0.5) |
| ret float %res |
| } |
| |
| define double @test_rcp_rm_d_neg_subnorm() { |
| ; CHECK-LABEL: define double @test_rcp_rm_d_neg_subnorm() { |
| ; CHECK-NEXT: ret double 0xC7D0000020000041 |
| ; |
| %res = call double @llvm.nvvm.rcp.rm.d(double 0xB80FFFFFC0000000) |
| ret double %res |
| } |
| |
| define float @test_rcp_rm_f_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_rcp_rm_f_neg_subnorm() { |
| ; CHECK-NEXT: ret float 0xC7D0000040000000 |
| ; |
| %res = call float @llvm.nvvm.rcp.rm.f(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| define float @test_rcp_rm_ftz_f_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_rcp_rm_ftz_f_neg_subnorm() { |
| ; CHECK-NEXT: [[RES:%.*]] = call float @llvm.nvvm.rcp.rm.ftz.f(float 0xB80FFFFFC0000000) |
| ; CHECK-NEXT: ret float [[RES]] |
| ; |
| %res = call float @llvm.nvvm.rcp.rm.ftz.f(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| ;+-------------------------------------------------------------+ |
| ;| rcp_rn | |
| ;+-------------------------------------------------------------+ |
| define double @test_rcp_rn_d_0_5() { |
| ; CHECK-LABEL: define double @test_rcp_rn_d_0_5() { |
| ; CHECK-NEXT: ret double 2.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.rcp.rn.d(double 0.5) |
| ret double %res |
| } |
| |
| define float @test_rcp_rn_f_0_5() { |
| ; CHECK-LABEL: define float @test_rcp_rn_f_0_5() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.rcp.rn.f(float 0.5) |
| ret float %res |
| } |
| |
| define float @test_rcp_rn_ftz_f_0_5() { |
| ; CHECK-LABEL: define float @test_rcp_rn_ftz_f_0_5() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.rcp.rn.ftz.f(float 0.5) |
| ret float %res |
| } |
| |
| define double @test_rcp_rn_d_neg_subnorm() { |
| ; CHECK-LABEL: define double @test_rcp_rn_d_neg_subnorm() { |
| ; CHECK-NEXT: ret double 0xC7D0000020000040 |
| ; |
| %res = call double @llvm.nvvm.rcp.rn.d(double 0xB80FFFFFC0000000) |
| ret double %res |
| } |
| |
| define float @test_rcp_rn_f_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_rcp_rn_f_neg_subnorm() { |
| ; CHECK-NEXT: ret float 0xC7D0000020000000 |
| ; |
| %res = call float @llvm.nvvm.rcp.rn.f(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| define float @test_rcp_rn_ftz_f_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_rcp_rn_ftz_f_neg_subnorm() { |
| ; CHECK-NEXT: [[RES:%.*]] = call float @llvm.nvvm.rcp.rn.ftz.f(float 0xB80FFFFFC0000000) |
| ; CHECK-NEXT: ret float [[RES]] |
| ; |
| %res = call float @llvm.nvvm.rcp.rn.ftz.f(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| ;+-------------------------------------------------------------+ |
| ;| rcp_rp | |
| ;+-------------------------------------------------------------+ |
| define double @test_rcp_rp_d_0_5() { |
| ; CHECK-LABEL: define double @test_rcp_rp_d_0_5() { |
| ; CHECK-NEXT: ret double 2.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.rcp.rp.d(double 0.5) |
| ret double %res |
| } |
| |
| define float @test_rcp_rp_f_0_5() { |
| ; CHECK-LABEL: define float @test_rcp_rp_f_0_5() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.rcp.rp.f(float 0.5) |
| ret float %res |
| } |
| |
| define float @test_rcp_rp_ftz_f_0_5() { |
| ; CHECK-LABEL: define float @test_rcp_rp_ftz_f_0_5() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.rcp.rp.ftz.f(float 0.5) |
| ret float %res |
| } |
| |
| define double @test_rcp_rp_d_neg_subnorm() { |
| ; CHECK-LABEL: define double @test_rcp_rp_d_neg_subnorm() { |
| ; CHECK-NEXT: ret double 0xC7D0000020000040 |
| ; |
| %res = call double @llvm.nvvm.rcp.rp.d(double 0xB80FFFFFC0000000) |
| ret double %res |
| } |
| |
| define float @test_rcp_rp_f_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_rcp_rp_f_neg_subnorm() { |
| ; CHECK-NEXT: ret float 0xC7D0000020000000 |
| ; |
| %res = call float @llvm.nvvm.rcp.rp.f(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| define float @test_rcp_rp_ftz_f_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_rcp_rp_ftz_f_neg_subnorm() { |
| ; CHECK-NEXT: [[RES:%.*]] = call float @llvm.nvvm.rcp.rp.ftz.f(float 0xB80FFFFFC0000000) |
| ; CHECK-NEXT: ret float [[RES]] |
| ; |
| %res = call float @llvm.nvvm.rcp.rp.ftz.f(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| ;+-------------------------------------------------------------+ |
| ;| rcp_rz | |
| ;+-------------------------------------------------------------+ |
| define double @test_rcp_rz_d_0_5() { |
| ; CHECK-LABEL: define double @test_rcp_rz_d_0_5() { |
| ; CHECK-NEXT: ret double 2.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.rcp.rz.d(double 0.5) |
| ret double %res |
| } |
| |
| define float @test_rcp_rz_f_0_5() { |
| ; CHECK-LABEL: define float @test_rcp_rz_f_0_5() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.rcp.rz.f(float 0.5) |
| ret float %res |
| } |
| |
| define float @test_rcp_rz_ftz_f_0_5() { |
| ; CHECK-LABEL: define float @test_rcp_rz_ftz_f_0_5() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.rcp.rz.ftz.f(float 0.5) |
| ret float %res |
| } |
| |
| define double @test_rcp_rz_d_neg_subnorm() { |
| ; CHECK-LABEL: define double @test_rcp_rz_d_neg_subnorm() { |
| ; CHECK-NEXT: ret double 0xC7D0000020000040 |
| ; |
| %res = call double @llvm.nvvm.rcp.rz.d(double 0xB80FFFFFC0000000) |
| ret double %res |
| } |
| |
| define float @test_rcp_rz_f_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_rcp_rz_f_neg_subnorm() { |
| ; CHECK-NEXT: ret float 0xC7D0000020000000 |
| ; |
| %res = call float @llvm.nvvm.rcp.rz.f(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| define float @test_rcp_rz_ftz_f_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_rcp_rz_ftz_f_neg_subnorm() { |
| ; CHECK-NEXT: [[RES:%.*]] = call float @llvm.nvvm.rcp.rz.ftz.f(float 0xB80FFFFFC0000000) |
| ; CHECK-NEXT: ret float [[RES]] |
| ; |
| %res = call float @llvm.nvvm.rcp.rz.ftz.f(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| ;############################################################### |
| ;# Round # |
| ;############################################################### |
| |
| define double @test_round_d_neg_1_5() { |
| ; CHECK-LABEL: define double @test_round_d_neg_1_5() { |
| ; CHECK-NEXT: ret double -2.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.round.d(double -1.5) |
| ret double %res |
| } |
| |
| define float @test_round_f_neg_1_5() { |
| ; CHECK-LABEL: define float @test_round_f_neg_1_5() { |
| ; CHECK-NEXT: ret float -2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.round.f(float -1.5) |
| ret float %res |
| } |
| |
| define float @test_round_ftz_f_neg_1_5() { |
| ; CHECK-LABEL: define float @test_round_ftz_f_neg_1_5() { |
| ; CHECK-NEXT: ret float -2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.round.ftz.f(float -1.5) |
| ret float %res |
| } |
| |
| define double @test_round_d_2_5() { |
| ; CHECK-LABEL: define double @test_round_d_2_5() { |
| ; CHECK-NEXT: ret double 2.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.round.d(double 2.5) |
| ret double %res |
| } |
| |
| define float @test_round_f_2_5() { |
| ; CHECK-LABEL: define float @test_round_f_2_5() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.round.f(float 2.5) |
| ret float %res |
| } |
| |
| define float @test_round_ftz_f_2_5() { |
| ; CHECK-LABEL: define float @test_round_ftz_f_2_5() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.round.ftz.f(float 2.5) |
| ret float %res |
| } |
| |
| define double @test_round_d_neg_2_5() { |
| ; CHECK-LABEL: define double @test_round_d_neg_2_5() { |
| ; CHECK-NEXT: ret double -2.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.round.d(double -2.5) |
| ret double %res |
| } |
| |
| define float @test_round_f_neg_2_5() { |
| ; CHECK-LABEL: define float @test_round_f_neg_2_5() { |
| ; CHECK-NEXT: ret float -2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.round.f(float -2.5) |
| ret float %res |
| } |
| |
| define float @test_round_ftz_f_neg_2_5() { |
| ; CHECK-LABEL: define float @test_round_ftz_f_neg_2_5() { |
| ; CHECK-NEXT: ret float -2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.round.ftz.f(float -2.5) |
| ret float %res |
| } |
| |
| define double @test_round_d_neg_subnorm() { |
| ; CHECK-LABEL: define double @test_round_d_neg_subnorm() { |
| ; CHECK-NEXT: ret double -0.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.round.d(double 0xB80FFFFFC0000000) |
| ret double %res |
| } |
| |
| define float @test_round_f_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_round_f_neg_subnorm() { |
| ; CHECK-NEXT: ret float -0.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.round.f(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| define float @test_round_ftz_f_neg_subnorm() { |
| ; CHECK-LABEL: define float @test_round_ftz_f_neg_subnorm() { |
| ; CHECK-NEXT: ret float -0.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.round.ftz.f(float 0xB80FFFFFC0000000) |
| ret float %res |
| } |
| |
| ;############################################################### |
| ;# Saturate # |
| ;############################################################### |
| |
| define double @test_saturate_d_1_25() { |
| ; CHECK-LABEL: define double @test_saturate_d_1_25() { |
| ; CHECK-NEXT: ret double 1.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.saturate.d(double 1.25) |
| ret double %res |
| } |
| |
| define float @test_saturate_f_1_25() { |
| ; CHECK-LABEL: define float @test_saturate_f_1_25() { |
| ; CHECK-NEXT: ret float 1.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.saturate.f(float 1.25) |
| ret float %res |
| } |
| |
| define float @test_saturate_ftz_f_1_25() { |
| ; CHECK-LABEL: define float @test_saturate_ftz_f_1_25() { |
| ; CHECK-NEXT: ret float 1.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.saturate.ftz.f(float 1.25) |
| ret float %res |
| } |
| |
| define double @test_saturate_d_neg_1_25() { |
| ; CHECK-LABEL: define double @test_saturate_d_neg_1_25() { |
| ; CHECK-NEXT: ret double 0.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.saturate.d(double -1.25) |
| ret double %res |
| } |
| |
| define float @test_saturate_f_neg_1_25() { |
| ; CHECK-LABEL: define float @test_saturate_f_neg_1_25() { |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.saturate.f(float -1.25) |
| ret float %res |
| } |
| |
| define float @test_saturate_ftz_f_neg_1_25() { |
| ; CHECK-LABEL: define float @test_saturate_ftz_f_neg_1_25() { |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.saturate.ftz.f(float -1.25) |
| ret float %res |
| } |
| |
| define double @test_saturate_d_0_5() { |
| ; CHECK-LABEL: define double @test_saturate_d_0_5() { |
| ; CHECK-NEXT: ret double 5.000000e-01 |
| ; |
| %res = call double @llvm.nvvm.saturate.d(double 0.5) |
| ret double %res |
| } |
| |
| define float @test_saturate_f_0_5() { |
| ; CHECK-LABEL: define float @test_saturate_f_0_5() { |
| ; CHECK-NEXT: ret float 5.000000e-01 |
| ; |
| %res = call float @llvm.nvvm.saturate.f(float 0.5) |
| ret float %res |
| } |
| |
| define float @test_saturate_ftz_f_0_5() { |
| ; CHECK-LABEL: define float @test_saturate_ftz_f_0_5() { |
| ; CHECK-NEXT: ret float 5.000000e-01 |
| ; |
| %res = call float @llvm.nvvm.saturate.ftz.f(float 0.5) |
| ret float %res |
| } |
| |
| define double @test_saturate_d_pos_subnorm() { |
| ; CHECK-LABEL: define double @test_saturate_d_pos_subnorm() { |
| ; CHECK-NEXT: ret double 0x380FFFFFC0000000 |
| ; |
| %res = call double @llvm.nvvm.saturate.d(double 0x380FFFFFC0000000) |
| ret double %res |
| } |
| |
| define float @test_saturate_f_pos_subnorm() { |
| ; CHECK-LABEL: define float @test_saturate_f_pos_subnorm() { |
| ; CHECK-NEXT: ret float 0x380FFFFFC0000000 |
| ; |
| %res = call float @llvm.nvvm.saturate.f(float 0x380FFFFFC0000000) |
| ret float %res |
| } |
| |
| define float @test_saturate_ftz_f_pos_subnorm() { |
| ; CHECK-LABEL: define float @test_saturate_ftz_f_pos_subnorm() { |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.saturate.ftz.f(float 0x380FFFFFC0000000) |
| ret float %res |
| } |
| |
| ;############################################################### |
| ;# Sqrt # |
| ;############################################################### |
| |
| define float @test_sqrt_f_4() { |
| ; CHECK-LABEL: define float @test_sqrt_f_4() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.sqrt.f(float 4.0) |
| ret float %res |
| } |
| |
| define float @test_sqrt_rn_f_4() { |
| ; CHECK-LABEL: define float @test_sqrt_rn_f_4() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.sqrt.rn.f(float 4.0) |
| ret float %res |
| } |
| |
| define double @test_sqrt_rn_d_4() { |
| ; CHECK-LABEL: define double @test_sqrt_rn_d_4() { |
| ; CHECK-NEXT: ret double 2.000000e+00 |
| ; |
| %res = call double @llvm.nvvm.sqrt.rn.d(double 4.0) |
| ret double %res |
| } |
| |
| define float @test_sqrt_rn_ftz_f_4() { |
| ; CHECK-LABEL: define float @test_sqrt_rn_ftz_f_4() { |
| ; CHECK-NEXT: ret float 2.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.sqrt.rn.ftz.f(float 4.0) |
| ret float %res |
| } |
| |
| define float @test_sqrt_f_pos_subnorm() { |
| ; CHECK-LABEL: define float @test_sqrt_f_pos_subnorm() { |
| ; CHECK-NEXT: ret float 0x3BFFFFFFE0000000 |
| ; |
| %res = call float @llvm.nvvm.sqrt.f(float 0x380FFFFFC0000000) |
| ret float %res |
| } |
| |
| define float @test_sqrt_rn_f_pos_subnorm() { |
| ; CHECK-LABEL: define float @test_sqrt_rn_f_pos_subnorm() { |
| ; CHECK-NEXT: ret float 0x3BFFFFFFE0000000 |
| ; |
| %res = call float @llvm.nvvm.sqrt.rn.f(float 0x380FFFFFC0000000) |
| ret float %res |
| } |
| |
| define double @test_sqrt_rn_d_pos_subnorm() { |
| ; CHECK-LABEL: define double @test_sqrt_rn_d_pos_subnorm() { |
| ; CHECK-NEXT: ret double 0x3BFFFFFFDFFFFFF0 |
| ; |
| %res = call double @llvm.nvvm.sqrt.rn.d(double 0x380FFFFFC0000000) |
| ret double %res |
| } |
| |
| define float @test_sqrt_rn_ftz_f_pos_subnorm() { |
| ; CHECK-LABEL: define float @test_sqrt_rn_ftz_f_pos_subnorm() { |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %res = call float @llvm.nvvm.sqrt.rn.ftz.f(float 0x380FFFFFC0000000) |
| ret float %res |
| } |
| |
| declare double @llvm.nvvm.ceil.d(double) |
| declare float @llvm.nvvm.ceil.f(float) |
| declare float @llvm.nvvm.ceil.ftz.f(float) |
| |
| declare float @llvm.nvvm.fabs(float) |
| declare float @llvm.nvvm.fabs.ftz(float) |
| |
| declare double @llvm.nvvm.floor.d(double) |
| declare float @llvm.nvvm.floor.f(float) |
| declare float @llvm.nvvm.floor.ftz.f(float) |
| |
| declare double @llvm.nvvm.rcp.rm.d(double) |
| declare float @llvm.nvvm.rcp.rm.f(float) |
| declare float @llvm.nvvm.rcp.rm.ftz.f(float) |
| declare double @llvm.nvvm.rcp.rn.d(double) |
| declare float @llvm.nvvm.rcp.rn.f(float) |
| declare float @llvm.nvvm.rcp.rn.ftz.f(float) |
| declare double @llvm.nvvm.rcp.rp.d(double) |
| declare float @llvm.nvvm.rcp.rp.f(float) |
| declare float @llvm.nvvm.rcp.rp.ftz.f(float) |
| declare double @llvm.nvvm.rcp.rz.d(double) |
| declare float @llvm.nvvm.rcp.rz.f(float) |
| declare float @llvm.nvvm.rcp.rz.ftz.f(float) |
| |
| declare double @llvm.nvvm.round.d(double) |
| declare float @llvm.nvvm.round.f(float) |
| declare float @llvm.nvvm.round.ftz.f(float) |
| |
| declare double @llvm.nvvm.saturate.d(double) |
| declare float @llvm.nvvm.saturate.f(float) |
| declare float @llvm.nvvm.saturate.ftz.f(float) |
| |
| declare float @llvm.nvvm.sqrt.f(float) |
| declare double @llvm.nvvm.sqrt.rn.d(double) |
| declare float @llvm.nvvm.sqrt.rn.f(float) |
| declare float @llvm.nvvm.sqrt.rn.ftz.f(float) |