; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 ; ## FP16 abs is not supported by PTX version (PTX < 65). ; RUN: llc < %s -mcpu=sm_53 -mattr=+ptx60 \ ; RUN: -O0 -disable-post-ra -verify-machineinstrs \ ; RUN: | FileCheck -check-prefix CHECK-NOF16 %s ; RUN: %if ptxas-sm_53 %{ \ ; RUN: llc < %s -mcpu=sm_53 -mattr=+ptx60 \ ; RUN: -O0 -disable-post-ra -verify-machineinstrs \ ; RUN: | %ptxas-verify -arch=sm_53 \ ; RUN: %} ; ## FP16 support explicitly disabled (--nvptx-no-f16-math). ; RUN: llc < %s -mcpu=sm_53 -mattr=+ptx65 --nvptx-no-f16-math \ ; RUN: -O0 -disable-post-ra -verify-machineinstrs \ ; RUN: | FileCheck -check-prefix CHECK-NOF16 %s ; RUN: %if ptxas-sm_53 %{ \ ; RUN: llc < %s -mcpu=sm_53 -mattr=+ptx65 --nvptx-no-f16-math \ ; RUN: -O0 -disable-post-ra -verify-machineinstrs \ ; RUN: | %ptxas-verify -arch=sm_53 \ ; RUN: %} ; ## FP16 is not supported by hardware (SM < 53). ; RUN: llc < %s -mcpu=sm_52 -mattr=+ptx65 \ ; RUN: -O0 -disable-post-ra -verify-machineinstrs \ ; RUN: | FileCheck -check-prefix CHECK-NOF16 %s ; RUN: %if ptxas-sm_52 %{ \ ; RUN: llc < %s -mcpu=sm_52 -mattr=+ptx65 \ ; RUN: -O0 -disable-post-ra -verify-machineinstrs \ ; RUN: | %ptxas-verify -arch=sm_52 \ ; RUN: %} ; ## Full FP16 abs support. ; RUN: llc < %s -mcpu=sm_53 -mattr=+ptx65 \ ; RUN: -O0 -disable-post-ra -verify-machineinstrs \ ; RUN: | FileCheck -check-prefix CHECK-F16-ABS %s ; RUN: %if ptxas-sm_53 %{ \ ; RUN: llc < %s -mcpu=sm_53 -mattr=+ptx65 \ ; RUN: -O0 -disable-post-ra -verify-machineinstrs \ ; RUN: | %ptxas-verify -arch=sm_53 \ ; RUN: %} target triple = "nvptx64-nvidia-cuda" declare half @llvm.fabs.f16(half %a) declare <2 x half> @llvm.fabs.v2f16(<2 x half> %a) define half @test_fabs(half %a) { ; CHECK-NOF16-LABEL: test_fabs( ; CHECK-NOF16: { ; CHECK-NOF16-NEXT: .reg .b16 %rs<3>; ; CHECK-NOF16-NEXT: .reg .b32 %r<3>; ; CHECK-NOF16-EMPTY: ; CHECK-NOF16-NEXT: // %bb.0: ; CHECK-NOF16-NEXT: ld.param.b16 %rs1, [test_fabs_param_0]; ; CHECK-NOF16-NEXT: cvt.f32.f16 %r1, %rs1; ; CHECK-NOF16-NEXT: abs.f32 %r2, %r1; ; CHECK-NOF16-NEXT: cvt.rn.f16.f32 %rs2, %r2; ; CHECK-NOF16-NEXT: st.param.b16 [func_retval0], %rs2; ; CHECK-NOF16-NEXT: ret; ; ; CHECK-F16-ABS-LABEL: test_fabs( ; CHECK-F16-ABS: { ; CHECK-F16-ABS-NEXT: .reg .b16 %rs<3>; ; CHECK-F16-ABS-EMPTY: ; CHECK-F16-ABS-NEXT: // %bb.0: ; CHECK-F16-ABS-NEXT: ld.param.b16 %rs1, [test_fabs_param_0]; ; CHECK-F16-ABS-NEXT: abs.f16 %rs2, %rs1; ; CHECK-F16-ABS-NEXT: st.param.b16 [func_retval0], %rs2; ; CHECK-F16-ABS-NEXT: ret; %r = call half @llvm.fabs.f16(half %a) ret half %r } define <2 x half> @test_fabs_2(<2 x half> %a) #0 { ; CHECK-F16-LABEL: test_fabs_2( ; CHECK-F16: { ; CHECK-F16-NEXT: .reg .b32 %r<5>; ; CHECK-F16-EMPTY: ; CHECK-F16-NEXT: // %bb.0: ; CHECK-F16-NEXT: ld.param.b32 %r1, [test_fabs_2_param_0]; ; CHECK-F16-NEXT: and.b32 %r3, %r1, 2147450879; ; CHECK-F16-NEXT: st.param.b32 [func_retval0], %r3; ; CHECK-F16-NEXT: ret; ; ; CHECK-F16-ABS-LABEL: test_fabs_2( ; CHECK-F16-ABS: { ; CHECK-F16-ABS-NEXT: .reg .b32 %r<3>; ; CHECK-F16-ABS-EMPTY: ; CHECK-F16-ABS-NEXT: // %bb.0: ; CHECK-F16-ABS-NEXT: ld.param.b32 %r1, [test_fabs_2_param_0]; ; CHECK-F16-ABS-NEXT: abs.f16x2 %r2, %r1; ; CHECK-F16-ABS-NEXT: st.param.b32 [func_retval0], %r2; ; CHECK-F16-ABS-NEXT: ret; %r = call <2 x half> @llvm.fabs.v2f16(<2 x half> %a) ret <2 x half> %r }