| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 | |
| ; RUN: llc < %s -mtriple=nvptx64 | FileCheck %s | |
| ; RUN: %if ptxas %{ llc < %s -mtriple=nvptx64 | %ptxas-verify %} | |
| define float @div_full(float %a, float %b) { | |
| ; CHECK-LABEL: div_full( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<7>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [div_full_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [div_full_param_1]; | |
| ; CHECK-NEXT: div.full.f32 %r3, %r1, %r2; | |
| ; CHECK-NEXT: div.full.f32 %r4, %r3, 0f40400000; | |
| ; CHECK-NEXT: div.full.ftz.f32 %r5, %r4, %r2; | |
| ; CHECK-NEXT: div.full.ftz.f32 %r6, %r5, 0f40800000; | |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r6; | |
| ; CHECK-NEXT: ret; | |
| %1 = call float @llvm.nvvm.div.full(float %a, float %b) | |
| %2 = call float @llvm.nvvm.div.full(float %1, float 3.0) | |
| %3 = call float @llvm.nvvm.div.full.ftz(float %2, float %b) | |
| %4 = call float @llvm.nvvm.div.full.ftz(float %3, float 4.0) | |
| ret float %4 | |
| } | |
| define float @div_fast_rr(float %a, float %b) { | |
| ; CHECK-LABEL: div_fast_rr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [div_fast_rr_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [div_fast_rr_param_1]; | |
| ; CHECK-NEXT: div.approx.f32 %r3, %r1, %r2; | |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r3; | |
| ; CHECK-NEXT: ret; | |
| %t1 = fdiv afn float %a, %b | |
| ret float %t1 | |
| } | |
| define float @div_fast_rr_ftz(float %a, float %b) #0 { | |
| ; CHECK-LABEL: div_fast_rr_ftz( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [div_fast_rr_ftz_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [div_fast_rr_ftz_param_1]; | |
| ; CHECK-NEXT: div.approx.ftz.f32 %r3, %r1, %r2; | |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r3; | |
| ; CHECK-NEXT: ret; | |
| %t1 = fdiv afn float %a, %b | |
| ret float %t1 | |
| } | |
| define float @div_fast_ri(float %a, float %b) { | |
| ; CHECK-LABEL: div_fast_ri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [div_fast_ri_param_0]; | |
| ; CHECK-NEXT: mul.rn.f32 %r2, %r1, 0f3F000000; | |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r2; | |
| ; CHECK-NEXT: ret; | |
| %t1 = fdiv afn float %a, 2.0 | |
| ret float %t1 | |
| } | |
| define float @div_fast_ri_ftz(float %a, float %b) #0 { | |
| ; CHECK-LABEL: div_fast_ri_ftz( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [div_fast_ri_ftz_param_0]; | |
| ; CHECK-NEXT: mul.rn.ftz.f32 %r2, %r1, 0f3F000000; | |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r2; | |
| ; CHECK-NEXT: ret; | |
| %t1 = fdiv afn float %a, 2.0 | |
| ret float %t1 | |
| } | |
| define float @rcp_fast(float %a) { | |
| ; CHECK-LABEL: rcp_fast( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [rcp_fast_param_0]; | |
| ; CHECK-NEXT: rcp.approx.f32 %r2, %r1; | |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r2; | |
| ; CHECK-NEXT: ret; | |
| %t1 = fdiv afn float 1.0, %a | |
| ret float %t1 | |
| } | |
| define float @rcp_fast_ftz(float %a) #0 { | |
| ; CHECK-LABEL: rcp_fast_ftz( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [rcp_fast_ftz_param_0]; | |
| ; CHECK-NEXT: rcp.approx.ftz.f32 %r2, %r1; | |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r2; | |
| ; CHECK-NEXT: ret; | |
| %t1 = fdiv afn float 1.0, %a | |
| ret float %t1 | |
| } | |
| define float @div_fast_vec(float %a, float %b, float %c, float %d) { | |
| ; CHECK-LABEL: div_fast_vec( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<8>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [div_fast_vec_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [div_fast_vec_param_1]; | |
| ; CHECK-NEXT: ld.param.b32 %r3, [div_fast_vec_param_2]; | |
| ; CHECK-NEXT: ld.param.b32 %r4, [div_fast_vec_param_3]; | |
| ; CHECK-NEXT: div.approx.f32 %r5, %r2, %r4; | |
| ; CHECK-NEXT: div.approx.f32 %r6, %r1, %r3; | |
| ; CHECK-NEXT: add.rn.f32 %r7, %r6, %r5; | |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r7; | |
| ; CHECK-NEXT: ret; | |
| %ins_a0 = insertelement <2 x float> poison, float %a, i32 0 | |
| %ins_a1 = insertelement <2 x float> %ins_a0, float %b, i32 1 | |
| %ins_b0 = insertelement <2 x float> poison, float %c, i32 0 | |
| %ins_b1 = insertelement <2 x float> %ins_b0, float %d, i32 1 | |
| %fdiv = fdiv fast <2 x float> %ins_a1, %ins_b1 | |
| %ext0 = extractelement <2 x float> %fdiv, i32 0 | |
| %ext1 = extractelement <2 x float> %fdiv, i32 1 | |
| %fadd = fadd float %ext0, %ext1 | |
| ret float %fadd | |
| } | |
| define float @div_fast_vec_ftz(float %a, float %b, float %c, float %d) #0 { | |
| ; CHECK-LABEL: div_fast_vec_ftz( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<8>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [div_fast_vec_ftz_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [div_fast_vec_ftz_param_1]; | |
| ; CHECK-NEXT: ld.param.b32 %r3, [div_fast_vec_ftz_param_2]; | |
| ; CHECK-NEXT: ld.param.b32 %r4, [div_fast_vec_ftz_param_3]; | |
| ; CHECK-NEXT: div.approx.ftz.f32 %r5, %r2, %r4; | |
| ; CHECK-NEXT: div.approx.ftz.f32 %r6, %r1, %r3; | |
| ; CHECK-NEXT: add.rn.ftz.f32 %r7, %r6, %r5; | |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r7; | |
| ; CHECK-NEXT: ret; | |
| %ins_a0 = insertelement <2 x float> poison, float %a, i32 0 | |
| %ins_a1 = insertelement <2 x float> %ins_a0, float %b, i32 1 | |
| %ins_b0 = insertelement <2 x float> poison, float %c, i32 0 | |
| %ins_b1 = insertelement <2 x float> %ins_b0, float %d, i32 1 | |
| %fdiv = fdiv fast <2 x float> %ins_a1, %ins_b1 | |
| %ext0 = extractelement <2 x float> %fdiv, i32 0 | |
| %ext1 = extractelement <2 x float> %fdiv, i32 1 | |
| %fadd = fadd float %ext0, %ext1 | |
| ret float %fadd | |
| } | |
| attributes #0 = { denormal_fpenv(float: preservesign) } |