Signed-off-by: rander <rander.w...@intel.com> --- backend/src/libocl/include/ocl_float.h | 6 +++- backend/src/libocl/script/ocl_convert.sh | 54 +++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/backend/src/libocl/include/ocl_float.h b/backend/src/libocl/include/ocl_float.h index 39fd453..9058692 100644 --- a/backend/src/libocl/include/ocl_float.h +++ b/backend/src/libocl/include/ocl_float.h @@ -102,6 +102,10 @@ INLINE_OVERLOADABLE int __ocl_finitef (float x){ #define DF_MIN_NORMAL 0x10000000000000UL #define DF_ABS_MASK 0x7FFFFFFFFFFFFFFFUL #define DF_POSITIVE_INF 0x7FF0000000000000UL - +#define DF_SIGN_MASK 0x8000000000000000UL +#define DF_IMPLICITE_ONE 0x10000000000000UL +#define DF_EXP_OFFSET 52 +#define DF_SIGN_OFFSET 63 +#define DF_EXP_BIAS 1023 #endif /* __OCL_FLOAT_H__ */ diff --git a/backend/src/libocl/script/ocl_convert.sh b/backend/src/libocl/script/ocl_convert.sh index adac9b1..460aefe 100755 --- a/backend/src/libocl/script/ocl_convert.sh +++ b/backend/src/libocl/script/ocl_convert.sh @@ -27,6 +27,9 @@ if [ $1"a" = "-pa" ]; then echo else echo "#include \"ocl_convert.h\"" + echo "#include \"ocl_float.h\"" + echo "#include \"ocl_as.h\"" + echo "#include \"ocl_integer.h\"" echo fi @@ -546,6 +549,53 @@ OVERLOADABLE float __convert_float_rtn(uint x) { return __convert_float_rtz(x); } + +OVERLOADABLE long convert_long_rtn(double x) +{ + int iexp; + long ret; + ulong lval = as_ulong(x); + uint sign = (lval & DF_SIGN_MASK) >> DF_SIGN_OFFSET; + int exp = ((lval & DF_EXP_MASK) >> DF_EXP_OFFSET) - DF_EXP_BIAS; + ulong ma = (lval &DF_MAN_MASK); + + ulong ldata = ma |DF_IMPLICITE_ONE; + uint shift = abs(exp -DF_EXP_OFFSET); + ulong ldataL = ldata << shift; + ulong ldataR = ldata >> shift; + ret = (exp > DF_EXP_OFFSET) ? ldataL:ldataR; + ret = (exp >= 0) ? ret:0; + iexp = (exp >= 0) ? exp:0; + + ret = sign ? -ret:ret; + shift = convert_uint_sat(DF_EXP_OFFSET - iexp); + long mask = (1L << shift) - 1; + ret = ((ma & mask) || (exp < 0)) ? ret -sign:ret; + ret = (lval & DF_ABS_MASK) ? ret:0; + + return ret; +} + +OVERLOADABLE ulong convert_ulong_rtn(double x) +{ + int iexp; + long ret; + long lval = as_long(x); + int exp = ((lval & DF_EXP_MASK) >> DF_EXP_OFFSET) - DF_EXP_BIAS; + long ma = (lval &DF_MAN_MASK); + + ulong ldata = ma |DF_IMPLICITE_ONE; + int shift = abs(exp -DF_EXP_OFFSET); + ulong ldataL = ldata << shift; + ulong ldataR = ldata >> shift; + ret = (exp > DF_EXP_OFFSET) ? ldataL:ldataR; + ret = (exp >= 0) ? ret:0; + iexp = (exp >= 0) ? exp:0; + ret = (lval & DF_ABS_MASK) ? ret:0; + + return ret; +} + ' fi @@ -553,7 +603,7 @@ fi for vector_length in $VECTOR_LENGTHS; do for ftype in $TYPES; do fbasetype=`IFS=:; set -- dummy $ftype; echo $2` - if test $fbasetype = "double"; then continue; fi + #if test $fbasetype = "double"; then continue; fi for ttype in $TYPES; do tbasetype=`IFS=:; set -- dummy $ttype; echo $2` @@ -596,6 +646,8 @@ for vector_length in $VECTOR_LENGTHS; do echo "{ return __gen_ocl_rndd(x); }" elif [ "$fbasetype" = "int" -o "$fbasetype" = "uint" -o "$fbasetype" = "long" -o "$fbasetype" = "ulong" ] && [ "$tbasetype" = "float" ]; then echo "{ return __convert_${tbasetype}_rtn(x); }" + elif [ "$fbasetype" = "double" ]; then + echo ";" else echo "{ return x; }" fi -- 2.7.4 _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/beignet