[Beignet] [PATCH] backend: add convert_float_rtz(double)

rander rander.wang at intel.com
Mon Mar 20 05:56:28 UTC 2017


	 do the convert with IEEE754 spec with bit operations

Signed-off-by: rander <rander.wang at intel.com>
---
 backend/src/libocl/script/ocl_convert.sh | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/backend/src/libocl/script/ocl_convert.sh b/backend/src/libocl/script/ocl_convert.sh
index f063f09..aa36a67 100755
--- a/backend/src/libocl/script/ocl_convert.sh
+++ b/backend/src/libocl/script/ocl_convert.sh
@@ -688,6 +688,35 @@ OVERLOADABLE float  convert_float_rtn(double x)
 	return ftemp;
 }
 
+OVERLOADABLE float  convert_float_rtz(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;
+	long ma = (lval &DF_MAN_MASK);
+
+	int fval = ((exp + 127) << 23) |convert_int(ma >> 29);
+	ret = fval;
+
+	ma |= DF_IMPLICITE_ONE;
+	tmp = ma >> (-exp - 97);
+	ret = (exp < -126) ? tmp:ret;
+	ret = (exp < -149) ? 0:ret;
+
+	tmp = 0x7F7FFFFF;
+	ret = (exp > 127) ? tmp:ret;
+
+	tmp = (lval &DF_MAN_MASK) ? 0x7FFFFFFF:0x7F800000;
+	ret = (exp == 1024) ? tmp:ret;
+
+	ret = ((lval & DF_ABS_MASK) == 0) ? 0:ret;
+
+	ret |= (sign << 31);
+	float ftemp = as_float(ret);
+	return ftemp;
+}
+
 OVERLOADABLE long convert_long_rte(double x)
 {
 	long lval = as_long(x);
-- 
2.7.4



More information about the Beignet mailing list