diff options
author | rander <rander.wang@intel.com> | 2017-03-09 10:04:55 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2017-04-17 16:08:48 +0800 |
commit | e972f42ee7a962f939abe30fdccca45830554642 (patch) | |
tree | ba58b57adf5aa6107cff91689bbc9b78f119df90 /backend/src | |
parent | b0df7caf40b1e210560983028cccb24fc2ee10c3 (diff) |
Backend: add double support to convert_float_rtn(double x)
Signed-off-by: rander <rander.wang@intel.com>
Tested-by: Yang Rong <rong.r.yang@intel.com>
Diffstat (limited to 'backend/src')
-rw-r--r-- | backend/src/libocl/include/ocl_float.h | 5 | ||||
-rwxr-xr-x | backend/src/libocl/script/ocl_convert.sh | 26 |
2 files changed, 31 insertions, 0 deletions
diff --git a/backend/src/libocl/include/ocl_float.h b/backend/src/libocl/include/ocl_float.h index 90586922..e78d38b8 100644 --- a/backend/src/libocl/include/ocl_float.h +++ b/backend/src/libocl/include/ocl_float.h @@ -108,4 +108,9 @@ INLINE_OVERLOADABLE int __ocl_finitef (float x){ #define DF_SIGN_OFFSET 63 #define DF_EXP_BIAS 1023 +#define SF_POSITIVE_INF 0x7F800000 +#define SF_NAN 0x7FFFFFFF + +#define M_PI 3.1415926535897384626 + #endif /* __OCL_FLOAT_H__ */ diff --git a/backend/src/libocl/script/ocl_convert.sh b/backend/src/libocl/script/ocl_convert.sh index fe5c1ec4..add2c564 100755 --- a/backend/src/libocl/script/ocl_convert.sh +++ b/backend/src/libocl/script/ocl_convert.sh @@ -651,6 +651,32 @@ OVERLOADABLE ulong convert_ulong_rtn(double x) return ret; } +OVERLOADABLE float convert_float_rtn(double x) +{ + int ret, tmp; + long lval = as_long(x); + int exp = ((lval & DF_EXP_MASK) >> DF_EXP_OFFSET) - DF_EXP_BIAS; + int sign = (lval & DF_SIGN_MASK)?1:0; + + ret = sign; + ret = (lval & DF_ABS_MASK) ? ret:0; + tmp = 0x1000000 >> (23 - (exp + 149)); + ret = (exp < -126) ? tmp:ret; + long ma = (lval &DF_MAN_MASK); + tmp = (lval & DF_MAN_MASK) ? SF_NAN:SF_POSITIVE_INF; + ret = (exp == 1024) ? tmp:ret; + tmp = SF_POSITIVE_INF; + ret = (exp > 127) ? tmp:ret; + ret = (lval & DF_ABS_MASK) ? ret:0; + tmp = ((exp + 127) << 23) |convert_int(ma >> 29); + if((ma & 0x1FFFFFFF) && sign) tmp += 1; + ret = ((exp >= -126) && (exp <= 127)) ? tmp:ret; + ret |= (sign << 31); + float ftemp = as_float(ret); + + return ftemp; +} + ' fi |