[Beignet] [Patch V2] LibOcl: Fix float convert to long/ulong bug.

Song, Ruiling ruiling.song at intel.com
Wed Oct 21 00:36:32 PDT 2015


LGTM

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> xionghu.luo at intel.com
> Sent: Wednesday, October 21, 2015 3:27 PM
> To: beignet at lists.freedesktop.org
> Cc: Luo, Xionghu; Yang, Rong R
> Subject: [Beignet] [Patch V2] LibOcl: Fix float convert to long/ulong bug.
> 
> From: Yang Rong <rong.r.yang at intel.com>
> 
> If the float overflow, convert to long/ulong is undef. So must use long/ulong's
> max and min value
> as return value.
> Also refine long to other integer type sat convert. Use to statement to avoid
> generate if/else/endif.
> 
> Signed-off-by: Yang Rong <rong.r.yang at intel.com>
> ---
>  backend/src/libocl/script/ocl_convert.sh | 25 ++++++++++++++++++++++---
>  1 file changed, 22 insertions(+), 3 deletions(-)
> 
> diff --git a/backend/src/libocl/script/ocl_convert.sh
> b/backend/src/libocl/script/ocl_convert.sh
> index 4f720fe..c7accfc 100755
> --- a/backend/src/libocl/script/ocl_convert.sh
> +++ b/backend/src/libocl/script/ocl_convert.sh
> @@ -161,7 +161,8 @@ else
>      echo '
>  #define DEF(DSTTYPE, SRCTYPE, MIN, MAX) \
>  OVERLOADABLE DSTTYPE convert_ ## DSTTYPE ## _sat(SRCTYPE x) { \
> -  return x >= MAX ? (DSTTYPE)MAX : x <= MIN ? (DSTTYPE)MIN : x; \
> +  x = x >= MAX ? MAX : x; \
> +  return x <= MIN ? (DSTTYPE)MIN : (DSTTYPE)x; \
>  }
>  '
>  fi
> @@ -173,8 +174,26 @@ DEF(short, long, -32768, 32767);
>  DEF(ushort, long, 0, 65535);
>  DEF(int, long, -0x7fffffff-1, 0x7fffffff);
>  DEF(uint, long, 0, 0xffffffffu);
> -DEF(long, float, -9.223372036854776e+18f, 9.223372036854776e+18f);
> -DEF(ulong, float, 0, 1.8446744073709552e+19f);
> +#undef DEF
> +'
> +
> +if [ $1"a" = "-pa" ]; then
> +    echo "
> +#define DEF(DSTTYPE, SRCTYPE, SRC_MIN, SRC_MAX, DST_MIN, DST_MAX) \
> +OVERLOADABLE DSTTYPE convert_ ## DSTTYPE ## _sat(SRCTYPE x);"
> +else
> +    echo '
> +#define DEF(DSTTYPE, SRCTYPE, SRC_MIN, SRC_MAX, DST_MIN, DST_MAX) \
> +OVERLOADABLE DSTTYPE convert_ ## DSTTYPE ## _sat(SRCTYPE x) { \
> +  DSTTYPE y = x >= SRC_MAX ? DST_MAX : (DSTTYPE)x; \
> +  return x <= SRC_MIN ? DST_MIN : y; \
> +}
> +'
> +fi
> +
> +echo '
> +DEF(long, float, -0x1.0p63, 0x1.0p63, 0x8000000000000000, 0x7fffffffffffffff);
> +DEF(ulong, float, 0, 0x1.0p64, 0, 0xffffffffffffffff);
>  #undef DEF
>  '
> 
> --
> 1.9.1
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list