summaryrefslogtreecommitdiff
path: root/backend/src
diff options
context:
space:
mode:
authorrander <rander.wang@intel.com>2017-03-09 10:04:55 +0800
committerYang Rong <rong.r.yang@intel.com>2017-04-17 16:08:48 +0800
commite972f42ee7a962f939abe30fdccca45830554642 (patch)
treeba58b57adf5aa6107cff91689bbc9b78f119df90 /backend/src
parentb0df7caf40b1e210560983028cccb24fc2ee10c3 (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.h5
-rwxr-xr-xbackend/src/libocl/script/ocl_convert.sh26
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