[libclc] 12cdf43 - [libclc] Move (add|sub)_sat to CLC; optimize (#124903)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 29 03:12:43 PST 2025
Author: Fraser Cormack
Date: 2025-01-29T11:12:40Z
New Revision: 12cdf4330d32ce073f88dfaa1ab9a32327b9ef38
URL: https://github.com/llvm/llvm-project/commit/12cdf4330d32ce073f88dfaa1ab9a32327b9ef38
DIFF: https://github.com/llvm/llvm-project/commit/12cdf4330d32ce073f88dfaa1ab9a32327b9ef38.diff
LOG: [libclc] Move (add|sub)_sat to CLC; optimize (#124903)
Using the `__builtin_elementwise_(add|sub)_sat` functions allows us to
directly optimize to the desired intrinsic, and avoid scalarization for
vector types.
Added:
libclc/clc/include/clc/integer/clc_add_sat.h
libclc/clc/include/clc/integer/clc_sub_sat.h
libclc/clc/lib/generic/integer/clc_add_sat.cl
libclc/clc/lib/generic/integer/clc_sub_sat.cl
Modified:
libclc/clc/lib/clspv/SOURCES
libclc/clc/lib/generic/SOURCES
libclc/clc/lib/spirv/SOURCES
libclc/clc/lib/spirv64/SOURCES
libclc/generic/lib/integer/add_sat.cl
libclc/generic/lib/integer/sub_sat.cl
libclc/generic/lib/math/clc_ldexp.cl
Removed:
################################################################################
diff --git a/libclc/clc/include/clc/integer/clc_add_sat.h b/libclc/clc/include/clc/integer/clc_add_sat.h
new file mode 100644
index 00000000000000..8db19627f18e31
--- /dev/null
+++ b/libclc/clc/include/clc/integer/clc_add_sat.h
@@ -0,0 +1,12 @@
+#ifndef __CLC_INTEGER_CLC_ADD_SAT_H__
+#define __CLC_INTEGER_CLC_ADD_SAT_H__
+
+#define __CLC_FUNCTION __clc_add_sat
+#define __CLC_BODY <clc/shared/binary_decl.inc>
+
+#include <clc/integer/gentype.inc>
+
+#undef __CLC_BODY
+#undef __CLC_FUNCTION
+
+#endif // __CLC_INTEGER_CLC_ADD_SAT_H__
diff --git a/libclc/clc/include/clc/integer/clc_sub_sat.h b/libclc/clc/include/clc/integer/clc_sub_sat.h
new file mode 100644
index 00000000000000..95a8fd8873e996
--- /dev/null
+++ b/libclc/clc/include/clc/integer/clc_sub_sat.h
@@ -0,0 +1,12 @@
+#ifndef __CLC_INTEGER_CLC_SUB_SAT_H__
+#define __CLC_INTEGER_CLC_SUB_SAT_H__
+
+#define __CLC_FUNCTION __clc_sub_sat
+#define __CLC_BODY <clc/shared/binary_decl.inc>
+
+#include <clc/integer/gentype.inc>
+
+#undef __CLC_BODY
+#undef __CLC_FUNCTION
+
+#endif // __CLC_INTEGER_CLC_SUB_SAT_H__
diff --git a/libclc/clc/lib/clspv/SOURCES b/libclc/clc/lib/clspv/SOURCES
index 66818590100630..6efa3c59b53e70 100644
--- a/libclc/clc/lib/clspv/SOURCES
+++ b/libclc/clc/lib/clspv/SOURCES
@@ -1,3 +1,5 @@
+../generic/integer/clc_add_sat.cl
+../generic/integer/clc_sub_sat.cl
../generic/math/clc_ceil.cl
../generic/math/clc_copysign.cl
../generic/math/clc_fabs.cl
diff --git a/libclc/clc/lib/generic/SOURCES b/libclc/clc/lib/generic/SOURCES
index 9feda65c45f4bf..1ef6636be90b62 100644
--- a/libclc/clc/lib/generic/SOURCES
+++ b/libclc/clc/lib/generic/SOURCES
@@ -4,6 +4,8 @@ common/clc_smoothstep.cl
geometric/clc_dot.cl
integer/clc_abs.cl
integer/clc_abs_
diff .cl
+integer/clc_add_sat.cl
+integer/clc_sub_sat.cl
math/clc_ceil.cl
math/clc_copysign.cl
math/clc_fabs.cl
diff --git a/libclc/clc/lib/generic/integer/clc_add_sat.cl b/libclc/clc/lib/generic/integer/clc_add_sat.cl
new file mode 100644
index 00000000000000..344c105720e080
--- /dev/null
+++ b/libclc/clc/lib/generic/integer/clc_add_sat.cl
@@ -0,0 +1,7 @@
+#include <clc/internal/clc.h>
+
+#define FUNCTION __clc_add_sat
+#define __CLC_FUNCTION(x) __builtin_elementwise_add_sat
+#define __CLC_BODY <clc/shared/binary_def.inc>
+
+#include <clc/integer/gentype.inc>
diff --git a/libclc/clc/lib/generic/integer/clc_sub_sat.cl b/libclc/clc/lib/generic/integer/clc_sub_sat.cl
new file mode 100644
index 00000000000000..184713531fdbe7
--- /dev/null
+++ b/libclc/clc/lib/generic/integer/clc_sub_sat.cl
@@ -0,0 +1,7 @@
+#include <clc/internal/clc.h>
+
+#define FUNCTION __clc_sub_sat
+#define __CLC_FUNCTION(x) __builtin_elementwise_sub_sat
+#define __CLC_BODY <clc/shared/binary_def.inc>
+
+#include <clc/integer/gentype.inc>
diff --git a/libclc/clc/lib/spirv/SOURCES b/libclc/clc/lib/spirv/SOURCES
index 509236d587cd01..a87223e8c622c5 100644
--- a/libclc/clc/lib/spirv/SOURCES
+++ b/libclc/clc/lib/spirv/SOURCES
@@ -2,6 +2,8 @@
../generic/common/clc_radians.cl
../generic/common/clc_smoothstep.cl
../generic/geometric/clc_dot.cl
+../generic/integer/clc_add_sat.cl
+../generic/integer/clc_sub_sat.cl
../generic/math/clc_ceil.cl
../generic/math/clc_copysign.cl
../generic/math/clc_fabs.cl
diff --git a/libclc/clc/lib/spirv64/SOURCES b/libclc/clc/lib/spirv64/SOURCES
index 509236d587cd01..a87223e8c622c5 100644
--- a/libclc/clc/lib/spirv64/SOURCES
+++ b/libclc/clc/lib/spirv64/SOURCES
@@ -2,6 +2,8 @@
../generic/common/clc_radians.cl
../generic/common/clc_smoothstep.cl
../generic/geometric/clc_dot.cl
+../generic/integer/clc_add_sat.cl
+../generic/integer/clc_sub_sat.cl
../generic/math/clc_ceil.cl
../generic/math/clc_copysign.cl
../generic/math/clc_fabs.cl
diff --git a/libclc/generic/lib/integer/add_sat.cl b/libclc/generic/lib/integer/add_sat.cl
index 11a4a331fbd02a..895eeeba438264 100644
--- a/libclc/generic/lib/integer/add_sat.cl
+++ b/libclc/generic/lib/integer/add_sat.cl
@@ -1,73 +1,7 @@
#include <clc/clc.h>
-#include <clc/clcmacro.h>
+#include <clc/integer/clc_add_sat.h>
-// From add_sat.ll
-_CLC_DECL char __clc_add_sat_s8(char, char);
-_CLC_DECL uchar __clc_add_sat_u8(uchar, uchar);
-_CLC_DECL short __clc_add_sat_s16(short, short);
-_CLC_DECL ushort __clc_add_sat_u16(ushort, ushort);
-_CLC_DECL int __clc_add_sat_s32(int, int);
-_CLC_DECL uint __clc_add_sat_u32(uint, uint);
-_CLC_DECL long __clc_add_sat_s64(long, long);
-_CLC_DECL ulong __clc_add_sat_u64(ulong, ulong);
+#define FUNCTION add_sat
+#define __CLC_BODY <clc/shared/binary_def.inc>
-_CLC_OVERLOAD _CLC_DEF char add_sat(char x, char y) {
- short r = x + y;
- return convert_char_sat(r);
-}
-
-_CLC_OVERLOAD _CLC_DEF uchar add_sat(uchar x, uchar y) {
- ushort r = x + y;
- return convert_uchar_sat(r);
-}
-
-_CLC_OVERLOAD _CLC_DEF short add_sat(short x, short y) {
- int r = x + y;
- return convert_short_sat(r);
-}
-
-_CLC_OVERLOAD _CLC_DEF ushort add_sat(ushort x, ushort y) {
- uint r = x + y;
- return convert_ushort_sat(r);
-}
-
-_CLC_OVERLOAD _CLC_DEF int add_sat(int x, int y) {
- int r;
- if (__builtin_sadd_overflow(x, y, &r))
- // The oveflow can only occur if both are pos or both are neg,
- // thus we only need to check one operand
- return x > 0 ? INT_MAX : INT_MIN;
- return r;
-}
-
-_CLC_OVERLOAD _CLC_DEF uint add_sat(uint x, uint y) {
- uint r;
- if (__builtin_uadd_overflow(x, y, &r))
- return UINT_MAX;
- return r;
-}
-
-_CLC_OVERLOAD _CLC_DEF long add_sat(long x, long y) {
- long r;
- if (__builtin_saddl_overflow(x, y, &r))
- // The oveflow can only occur if both are pos or both are neg,
- // thus we only need to check one operand
- return x > 0 ? LONG_MAX : LONG_MIN;
- return r;
-}
-
-_CLC_OVERLOAD _CLC_DEF ulong add_sat(ulong x, ulong y) {
- ulong r;
- if (__builtin_uaddl_overflow(x, y, &r))
- return ULONG_MAX;
- return r;
-}
-
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, char, add_sat, char, char)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, uchar, add_sat, uchar, uchar)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, short, add_sat, short, short)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, ushort, add_sat, ushort, ushort)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, int, add_sat, int, int)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, uint, add_sat, uint, uint)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, long, add_sat, long, long)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, ulong, add_sat, ulong, ulong)
+#include <clc/integer/gentype.inc>
diff --git a/libclc/generic/lib/integer/sub_sat.cl b/libclc/generic/lib/integer/sub_sat.cl
index e6beef787c0366..e153738169b94c 100644
--- a/libclc/generic/lib/integer/sub_sat.cl
+++ b/libclc/generic/lib/integer/sub_sat.cl
@@ -1,61 +1,7 @@
#include <clc/clc.h>
-#include <clc/clcmacro.h>
+#include <clc/integer/clc_sub_sat.h>
-_CLC_OVERLOAD _CLC_DEF char sub_sat(char x, char y) {
- short r = x - y;
- return convert_char_sat(r);
-}
+#define FUNCTION sub_sat
+#define __CLC_BODY <clc/shared/binary_def.inc>
-_CLC_OVERLOAD _CLC_DEF uchar sub_sat(uchar x, uchar y) {
- short r = x - y;
- return convert_uchar_sat(r);
-}
-
-_CLC_OVERLOAD _CLC_DEF short sub_sat(short x, short y) {
- int r = x - y;
- return convert_short_sat(r);
-}
-
-_CLC_OVERLOAD _CLC_DEF ushort sub_sat(ushort x, ushort y) {
- int r = x - y;
- return convert_ushort_sat(r);
-}
-
-_CLC_OVERLOAD _CLC_DEF int sub_sat(int x, int y) {
- int r;
- if (__builtin_ssub_overflow(x, y, &r))
- // The oveflow can only occur in the direction of the first operand
- return x > 0 ? INT_MAX : INT_MIN;
- return r;
-}
-
-_CLC_OVERLOAD _CLC_DEF uint sub_sat(uint x, uint y) {
- uint r;
- if (__builtin_usub_overflow(x, y, &r))
- return 0;
- return r;
-}
-
-_CLC_OVERLOAD _CLC_DEF long sub_sat(long x, long y) {
- long r;
- if (__builtin_ssubl_overflow(x, y, &r))
- // The oveflow can only occur in the direction of the first operand
- return x > 0 ? LONG_MAX : LONG_MIN;
- return r;
-}
-
-_CLC_OVERLOAD _CLC_DEF ulong sub_sat(ulong x, ulong y) {
- ulong r;
- if (__builtin_usubl_overflow(x, y, &r))
- return 0;
- return r;
-}
-
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, char, sub_sat, char, char)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, uchar, sub_sat, uchar, uchar)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, short, sub_sat, short, short)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, ushort, sub_sat, ushort, ushort)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, int, sub_sat, int, int)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, uint, sub_sat, uint, uint)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, long, sub_sat, long, long)
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, ulong, sub_sat, ulong, ulong)
+#include <clc/integer/gentype.inc>
diff --git a/libclc/generic/lib/math/clc_ldexp.cl b/libclc/generic/lib/math/clc_ldexp.cl
index e052aa812244bf..a03f05d2177561 100644
--- a/libclc/generic/lib/math/clc_ldexp.cl
+++ b/libclc/generic/lib/math/clc_ldexp.cl
@@ -22,6 +22,7 @@
#include <clc/clc.h>
#include <clc/clcmacro.h>
+#include <clc/integer/clc_add_sat.h>
#include <clc/math/clc_subnormal_config.h>
#include <clc/math/math.h>
#include <clc/relational/clc_isinf.h>
@@ -37,7 +38,7 @@ _CLC_DEF _CLC_OVERLOAD float __clc_ldexp(float x, int n) {
int e = (i >> 23) & 0xff;
int m = i & 0x007fffff;
int s = i & 0x80000000;
- int v = add_sat(e, n);
+ int v = __clc_add_sat(e, n);
v = __clc_clamp(v, 0, 0xff);
int mr = e == 0 | v == 0 | v == 0xff ? 0 : m;
int c = e == 0xff;
More information about the cfe-commits
mailing list