From 7659157f1b926321530a44ce8fc7a39a0360a08e Mon Sep 17 00:00:00 2001 From: Aaron Watry Date: Thu, 15 Aug 2013 19:21:07 +0000 Subject: [PATCH] Add hadd builtin (x + y) >> 1 gets changed to: (x>>1) + (y>>1) + (x&y&1) Saves us having to do any llvm assembly and overflow checking in the addition. Reviewed-by: Tom Stellard llvm-svn: 188476 --- libclc/generic/include/clc/clc.h | 1 + libclc/generic/include/clc/integer/hadd.h | 2 ++ libclc/generic/include/clc/integer/hadd.inc | 1 + libclc/generic/lib/SOURCES | 1 + libclc/generic/lib/integer/hadd.cl | 4 ++++ libclc/generic/lib/integer/hadd.inc | 6 ++++++ 6 files changed, 15 insertions(+) create mode 100644 libclc/generic/include/clc/integer/hadd.h create mode 100644 libclc/generic/include/clc/integer/hadd.inc create mode 100644 libclc/generic/lib/integer/hadd.cl create mode 100644 libclc/generic/lib/integer/hadd.inc diff --git a/libclc/generic/include/clc/clc.h b/libclc/generic/include/clc/clc.h index b9062455c41f..38f71dbdee0c 100644 --- a/libclc/generic/include/clc/clc.h +++ b/libclc/generic/include/clc/clc.h @@ -65,6 +65,7 @@ #include #include #include +#include #include #include #include diff --git a/libclc/generic/include/clc/integer/hadd.h b/libclc/generic/include/clc/integer/hadd.h new file mode 100644 index 000000000000..37304e26cc2d --- /dev/null +++ b/libclc/generic/include/clc/integer/hadd.h @@ -0,0 +1,2 @@ +#define __CLC_BODY +#include diff --git a/libclc/generic/include/clc/integer/hadd.inc b/libclc/generic/include/clc/integer/hadd.inc new file mode 100644 index 000000000000..f698989cef20 --- /dev/null +++ b/libclc/generic/include/clc/integer/hadd.inc @@ -0,0 +1 @@ +_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE hadd(__CLC_GENTYPE x, __CLC_GENTYPE y); diff --git a/libclc/generic/lib/SOURCES b/libclc/generic/lib/SOURCES index 9ac08bd9d241..e936fbc6d94b 100644 --- a/libclc/generic/lib/SOURCES +++ b/libclc/generic/lib/SOURCES @@ -11,6 +11,7 @@ integer/add_sat_impl.ll integer/clz.cl integer/clz_if.ll integer/clz_impl.ll +integer/hadd.cl integer/mad24.cl integer/mul24.cl integer/rotate.cl diff --git a/libclc/generic/lib/integer/hadd.cl b/libclc/generic/lib/integer/hadd.cl new file mode 100644 index 000000000000..749026e5a8ad --- /dev/null +++ b/libclc/generic/lib/integer/hadd.cl @@ -0,0 +1,4 @@ +#include + +#define __CLC_BODY +#include diff --git a/libclc/generic/lib/integer/hadd.inc b/libclc/generic/lib/integer/hadd.inc new file mode 100644 index 000000000000..ea59d9bd7db5 --- /dev/null +++ b/libclc/generic/lib/integer/hadd.inc @@ -0,0 +1,6 @@ +//hadd = (x+y)>>1 +//This can be simplified to x>>1 + y>>1 + (1 if both x and y have the 1s bit set) +//This saves us having to do any checks for overflow in the addition sum +_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE hadd(__CLC_GENTYPE x, __CLC_GENTYPE y) { + return (x>>(__CLC_GENTYPE)1)+(y>>(__CLC_GENTYPE)1)+(x&y&(__CLC_GENTYPE)1); +} -- GitLab