
The `nvvm_round` intrinsic should round to the nearest even number in the case of ties. It lowers to PTX `cvt.rni`, which will "round to nearest integer, choosing even integer if source is equidistant between two integers", so it matches the semantics of `rint` (and not `round` as the name suggests).
695 lines
20 KiB
LLVM
695 lines
20 KiB
LLVM
; 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)
|