Author: Fraser Cormack Date: 2025-02-27T15:46:58Z New Revision: 1357279df9d255ac60cec0dd755349a12083c8b0
URL: https://github.com/llvm/llvm-project/commit/1357279df9d255ac60cec0dd755349a12083c8b0 DIFF: https://github.com/llvm/llvm-project/commit/1357279df9d255ac60cec0dd755349a12083c8b0.diff LOG: [libclc] Move rsqrt to the CLC library (#129045) This also adds missing half variants to certain targets. It also optimizes some targets' implementations to perform the operation directly in vector types, as opposed to scalarizing. Added: libclc/clc/include/clc/math/clc_rsqrt.h libclc/clc/lib/generic/math/clc_rsqrt.cl libclc/clc/lib/generic/math/clc_rsqrt.inc libclc/clc/lib/r600/SOURCES libclc/clc/lib/r600/math/clc_rsqrt_override.cl Modified: libclc/CMakeLists.txt libclc/clc/lib/generic/SOURCES libclc/generic/lib/math/rsqrt.cl libclc/r600/lib/SOURCES Removed: libclc/r600/lib/math/rsqrt.cl ################################################################################ diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt index 8f076be1599db..cc1abda7d7fce 100644 --- a/libclc/CMakeLists.txt +++ b/libclc/CMakeLists.txt @@ -31,6 +31,7 @@ set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS clc/lib/amdgcn/SOURCES; clc/lib/amdgpu/SOURCES; clc/lib/clspv/SOURCES; + clc/lib/r600/SOURCES; clc/lib/spirv/SOURCES; ) diff --git a/libclc/clc/include/clc/math/clc_rsqrt.h b/libclc/clc/include/clc/math/clc_rsqrt.h new file mode 100644 index 0000000000000..f05ef73074d26 --- /dev/null +++ b/libclc/clc/include/clc/math/clc_rsqrt.h @@ -0,0 +1,12 @@ +#ifndef __CLC_MATH_CLC_RSQRT_H__ +#define __CLC_MATH_CLC_RSQRT_H__ + +#define __CLC_BODY <clc/math/unary_decl.inc> +#define __CLC_FUNCTION __clc_rsqrt + +#include <clc/math/gentype.inc> + +#undef __CLC_BODY +#undef __CLC_FUNCTION + +#endif // __CLC_MATH_CLC_RSQRT_H__ diff --git a/libclc/clc/lib/generic/SOURCES b/libclc/clc/lib/generic/SOURCES index 97c504d21aa88..206c7c18ce1a1 100644 --- a/libclc/clc/lib/generic/SOURCES +++ b/libclc/clc/lib/generic/SOURCES @@ -33,6 +33,7 @@ math/clc_nan.cl math/clc_nextafter.cl math/clc_rint.cl math/clc_round.cl +math/clc_rsqrt.cl math/clc_sqrt.cl math/clc_sw_fma.cl math/clc_trunc.cl diff --git a/libclc/clc/lib/generic/math/clc_rsqrt.cl b/libclc/clc/lib/generic/math/clc_rsqrt.cl new file mode 100644 index 0000000000000..b7a72e90850c9 --- /dev/null +++ b/libclc/clc/lib/generic/math/clc_rsqrt.cl @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2014,2015 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <clc/internal/clc.h> + +#define __CLC_BODY <clc_rsqrt.inc> +#include <clc/math/gentype.inc> diff --git a/libclc/clc/lib/generic/math/clc_rsqrt.inc b/libclc/clc/lib/generic/math/clc_rsqrt.inc new file mode 100644 index 0000000000000..88e1ce3e3b3fb --- /dev/null +++ b/libclc/clc/lib/generic/math/clc_rsqrt.inc @@ -0,0 +1,5 @@ +__attribute__((weak)) _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE +__clc_rsqrt(__CLC_GENTYPE val) { +#pragma clang fp contract(fast) + return __CLC_FP_LIT(1.0) / __builtin_elementwise_sqrt(val); +} diff --git a/libclc/clc/lib/r600/SOURCES b/libclc/clc/lib/r600/SOURCES new file mode 100644 index 0000000000000..8f66107e0454e --- /dev/null +++ b/libclc/clc/lib/r600/SOURCES @@ -0,0 +1 @@ +math/clc_rsqrt_override.cl diff --git a/libclc/clc/lib/r600/math/clc_rsqrt_override.cl b/libclc/clc/lib/r600/math/clc_rsqrt_override.cl new file mode 100644 index 0000000000000..86d8b2e12f53a --- /dev/null +++ b/libclc/clc/lib/r600/math/clc_rsqrt_override.cl @@ -0,0 +1,20 @@ +#include <clc/clcmacro.h> +#include <clc/internal/clc.h> + +_CLC_OVERLOAD _CLC_DEF float __clc_rsqrt(float x) { + return __builtin_r600_recipsqrt_ieeef(x); +} + +_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, __clc_rsqrt, float); + +#ifdef cl_khr_fp64 + +#pragma OPENCL EXTENSION cl_khr_fp64 : enable + +_CLC_OVERLOAD _CLC_DEF double __clc_rsqrt(double x) { + return __builtin_r600_recipsqrt_ieee(x); +} + +_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_rsqrt, double); + +#endif diff --git a/libclc/generic/lib/math/rsqrt.cl b/libclc/generic/lib/math/rsqrt.cl index b38d4a1c3cc82..150d6e0927170 100644 --- a/libclc/generic/lib/math/rsqrt.cl +++ b/libclc/generic/lib/math/rsqrt.cl @@ -1,22 +1,7 @@ #include <clc/clc.h> -#include <clc/clcmacro.h> +#include <clc/math/clc_rsqrt.h> -_CLC_OVERLOAD _CLC_DEF float rsqrt(float x) -{ - return 1.0f / sqrt(x); -} +#define FUNCTION rsqrt +#define __CLC_BODY <clc/shared/unary_def.inc> -_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, rsqrt, float); - -#ifdef cl_khr_fp64 - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -_CLC_OVERLOAD _CLC_DEF double rsqrt(double x) -{ - return 1.0 / sqrt(x); -} - -_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, rsqrt, double); - -#endif +#include <clc/math/gentype.inc> diff --git a/libclc/r600/lib/SOURCES b/libclc/r600/lib/SOURCES index 6e01bbb2b8b99..cad45785dc483 100644 --- a/libclc/r600/lib/SOURCES +++ b/libclc/r600/lib/SOURCES @@ -1,7 +1,6 @@ math/fmax.cl math/fmin.cl math/native_rsqrt.cl -math/rsqrt.cl synchronization/barrier.cl workitem/get_global_offset.cl workitem/get_group_id.cl diff --git a/libclc/r600/lib/math/rsqrt.cl b/libclc/r600/lib/math/rsqrt.cl deleted file mode 100644 index 53f7d4040463f..0000000000000 --- a/libclc/r600/lib/math/rsqrt.cl +++ /dev/null @@ -1,22 +0,0 @@ -#include <clc/clc.h> -#include <clc/clcmacro.h> - -_CLC_OVERLOAD _CLC_DEF float rsqrt(float x) -{ - return __builtin_r600_recipsqrt_ieeef(x); -} - -_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, rsqrt, float); - -#ifdef cl_khr_fp64 - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -_CLC_OVERLOAD _CLC_DEF double rsqrt(double x) -{ - return __builtin_r600_recipsqrt_ieee(x); -} - -_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, rsqrt, double); - -#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits