From bd689bc328de78e04a296fd7259161311c19b099 Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Thu, 14 Aug 2025 14:28:35 -0700 Subject: [PATCH] [flang][cuda] Add interfaces for __float2int_rX and __float2unit_rX --- flang/module/cudadevice.f90 | 56 ++++++++++++++++++++++++ flang/test/Lower/CUDA/cuda-libdevice.cuf | 30 ++++++++++++- 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/flang/module/cudadevice.f90 b/flang/module/cudadevice.f90 index b5a92c63f19ed..98034bb5f4466 100644 --- a/flang/module/cudadevice.f90 +++ b/flang/module/cudadevice.f90 @@ -471,6 +471,62 @@ attributes(device) real(8) function sinpi(x) bind(c,name='__nv_sinpi') end function end interface + interface __float2int_rd + attributes(device) integer function __float2int_rd(r) bind(c, name='__nv_float2int_rd') + !dir$ ignore_tkr (d) r + real, value :: r + end function + end interface + + interface __float2int_rn + attributes(device) integer function __float2int_rn(r) bind(c, name='__nv_float2int_rn') + !dir$ ignore_tkr (d) r + real, value :: r + end function + end interface + + interface __float2int_ru + attributes(device) integer function __float2int_ru(r) bind(c, name='__nv_float2int_ru') + !dir$ ignore_tkr (d) r + real, value :: r + end function + end interface + + interface __float2int_rz + attributes(device) integer function __float2int_rz(r) bind(c, name='__nv_float2int_rz') + !dir$ ignore_tkr (d) r + real, value :: r + end function + end interface + + interface __float2uint_rd + attributes(device) integer function __float2uint_rd(r) bind(c, name='__nv_float2uint_rd') + !dir$ ignore_tkr (d) r + real, value :: r + end function + end interface + + interface __float2uint_rn + attributes(device) integer function __float2uint_rn(r) bind(c, name='__nv_float2uint_rn') + !dir$ ignore_tkr (d) r + real, value :: r + end function + end interface + + interface __float2uint_ru + attributes(device) integer function __float2uint_ru(r) bind(c, name='__nv_float2uint_ru') + !dir$ ignore_tkr (d) r + real, value :: r + end function + end interface + + interface __float2uint_rz + attributes(device) integer function __float2uint_rz(r) bind(c, name='__nv_float2uint_rz') + !dir$ ignore_tkr (d) r + real, value :: r + end function + end interface + interface __float2ll_rd attributes(device) integer(8) function __float2ll_rd(r) bind(c, name='__nv_float2ll_rd') !dir$ ignore_tkr (d) r diff --git a/flang/test/Lower/CUDA/cuda-libdevice.cuf b/flang/test/Lower/CUDA/cuda-libdevice.cuf index 68fd443d39f57..bbf868348aed9 100644 --- a/flang/test/Lower/CUDA/cuda-libdevice.cuf +++ b/flang/test/Lower/CUDA/cuda-libdevice.cuf @@ -131,7 +131,6 @@ end subroutine ! CHECK: %{{.*}} = fir.call @__nv_double2ll_ru(%{{.*}}) proc_attrs fastmath : (f64) -> i64 ! CHECK: %{{.*}} = fir.call @__nv_double2ll_rz(%{{.*}}) proc_attrs fastmath : (f64) -> i64 - attributes(global) subroutine test_drcp_rX() double precision :: res double precision :: r @@ -191,3 +190,32 @@ end subroutine ! CHECK: %{{.*}} = fir.call @__nv_ll2float_rn(%{{.*}}) proc_attrs fastmath : (i64) -> f32 ! CHECK: %{{.*}} = fir.call @__nv_ll2float_ru(%{{.*}}) proc_attrs fastmath : (i64) -> f32 ! CHECK: %{{.*}} = fir.call @__nv_ll2float_rz(%{{.*}}) proc_attrs fastmath : (i64) -> f32 +attributes(global) subroutine test_float2int_rX() + integer :: res + real :: r + res = __float2int_rd(r) + res = __float2int_rn(r) + res = __float2int_ru(r) + res = __float2int_rz(r) +end subroutine + +! CHECK-LABEL: _QPtest_float2int_rx +! CHECK: %{{.*}} = fir.call @__nv_float2int_rd(%{{.*}}) proc_attrs fastmath : (f32) -> i32 +! CHECK: %{{.*}} = fir.call @__nv_float2int_rn(%{{.*}}) proc_attrs fastmath : (f32) -> i32 +! CHECK: %{{.*}} = fir.call @__nv_float2int_ru(%{{.*}}) proc_attrs fastmath : (f32) -> i32 +! CHECK: %{{.*}} = fir.call @__nv_float2int_rz(%{{.*}}) proc_attrs fastmath : (f32) -> i32 + +attributes(global) subroutine test_float2uint_rX() + integer :: res + real :: r + res = __float2uint_rd(r) + res = __float2uint_rn(r) + res = __float2uint_ru(r) + res = __float2uint_rz(r) +end subroutine + +! CHECK-LABEL: _QPtest_float2uint_rx +! CHECK: %{{.*}} = fir.call @__nv_float2uint_rd(%{{.*}}) proc_attrs fastmath : (f32) -> i32 +! CHECK: %{{.*}} = fir.call @__nv_float2uint_rn(%{{.*}}) proc_attrs fastmath : (f32) -> i32 +! CHECK: %{{.*}} = fir.call @__nv_float2uint_ru(%{{.*}}) proc_attrs fastmath : (f32) -> i32 +! CHECK: %{{.*}} = fir.call @__nv_float2uint_rz(%{{.*}}) proc_attrs fastmath : (f32) -> i32