From e27e4f3a99911675215ca79eb95290a3ab77fe74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Clement=20=28=E3=83=90=E3=83=AC=E3=83=B3?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=B3=20=E3=82=AF=E3=83=AC=E3=83=A1?= =?UTF-8?q?=E3=83=B3=29?= Date: Thu, 14 Aug 2025 11:05:37 -0700 Subject: [PATCH] [flang][cuda] Add interfaces for __uint2float_rX functions (#153620) Also add bind name for __uint2double_rn --- flang/module/cudadevice.f90 | 30 +++++++++++++++++++++++- flang/test/Lower/CUDA/cuda-libdevice.cuf | 24 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/flang/module/cudadevice.f90 b/flang/module/cudadevice.f90 index 28577ee49536..a7f7652f5e52 100644 --- a/flang/module/cudadevice.f90 +++ b/flang/module/cudadevice.f90 @@ -590,8 +590,36 @@ implicit none end function end interface + interface __uint2float_rd + attributes(device) real function __uint2float_rd(i) bind(c, name='__nv_uint2float_rd') + !dir$ ignore_tkr (d) i + integer, value :: i + end function + end interface + + interface __uint2float_rn + attributes(device) real function __uint2float_rn(i) bind(c, name='__nv_uint2float_rn') + !dir$ ignore_tkr (d) i + integer, value :: i + end function + end interface + + interface __uint2float_ru + attributes(device) real function __uint2float_ru(i) bind(c, name='__nv_uint2float_ru') + !dir$ ignore_tkr (d) i + integer, value :: i + end function + end interface + + interface __uint2float_rz + attributes(device) real function __uint2float_rz(i) bind(c, name='__nv_uint2float_rz') + !dir$ ignore_tkr (d) i + integer, value :: i + end function + end interface + interface __uint2double_rn - attributes(device) double precision function __uint2double_rn(i) bind(c) + attributes(device) double precision function __uint2double_rn(i) bind(c, name='__nv_uint2double_rn') !dir$ ignore_tkr (d) i integer, value :: i end function diff --git a/flang/test/Lower/CUDA/cuda-libdevice.cuf b/flang/test/Lower/CUDA/cuda-libdevice.cuf index 06515b1c5f6d..d2cbadf9c05d 100644 --- a/flang/test/Lower/CUDA/cuda-libdevice.cuf +++ b/flang/test/Lower/CUDA/cuda-libdevice.cuf @@ -20,6 +20,30 @@ end subroutine ! CHECK-LABEL: _QPtest_usad ! CHECK: %{{.*}} = fir.call @__nv_usad(%{{.*}}, %{{.*}}, %{{.*}}) proc_attrs fastmath : (i32, i32, i32) -> i32 +attributes(global) subroutine test_uint2float_rX() + real :: res + integer :: i + res = __uint2float_rd(i) + res = __uint2float_rn(i) + res = __uint2float_ru(i) + res = __uint2float_rz(i) +end subroutine + +! CHECK-LABEL: _QPtest_uint2float_rx +! CHECK: %{{.*}} = fir.call @__nv_uint2float_rd(%{{.*}}) proc_attrs fastmath : (i32) -> f32 +! CHECK: %{{.*}} = fir.call @__nv_uint2float_rn(%{{.*}}) proc_attrs fastmath : (i32) -> f32 +! CHECK: %{{.*}} = fir.call @__nv_uint2float_ru(%{{.*}}) proc_attrs fastmath : (i32) -> f32 +! CHECK: %{{.*}} = fir.call @__nv_uint2float_rz(%{{.*}}) proc_attrs fastmath : (i32) -> f32 + +attributes(global) subroutine test_uint2double_rn() + double precision :: res + integer :: i + res = __uint2double_rn(i) +end subroutine + +! CHECK-LABEL: _QPtest_uint2double_rn +! CHECK: %{{.*}} = fir.call @__nv_uint2double_rn(%{{.*}}) proc_attrs fastmath : (i32) -> f64 + attributes(global) subroutine test_ull2dloat_rX() real :: res integer(8) :: i