[Beignet] [PATCH] backend: add convert_double_rtp(ulong)

rander rander.wang at intel.com
Tue Mar 21 01:37:51 UTC 2017


	 do bit operations according to IEEE754 spec. Also include
	 convert_double_rtp(2,4,8,16) support

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

diff --git a/backend/src/libocl/script/ocl_convert.sh b/backend/src/libocl/script/ocl_convert.sh
index 1a3f1f3..c9144c2 100755
--- a/backend/src/libocl/script/ocl_convert.sh
+++ b/backend/src/libocl/script/ocl_convert.sh
@@ -1245,6 +1245,105 @@ for vector_length in $VECTOR_LENGTHS; do
     done
 done
 
+if [ $1"a" != "-pa" ]; then
+echo '
+OVERLOADABLE double convert_double_rtp(ulong x)
+{
+	long exp;
+	long ret, ma, tmp;
+	int msbOne = 64 -clz(x);
+
+	exp = msbOne + DF_EXP_BIAS - 1;
+	ret = (exp << 52);
+	int shift = abs(53 - msbOne);
+	tmp = ret | ((x << shift) &DF_MAN_MASK);
+
+	ma = (x & ((0x1 << shift) - 1));
+	ret |= (x >> shift) &DF_MAN_MASK;
+	if(ma) ret += 1;
+
+	ret = (msbOne < 54) ? tmp:ret;
+	ret = (msbOne == 0) ? 0:ret;
+
+	return as_double(ret);
+}
+
+OVERLOADABLE double convert_double_rtz(ulong x)
+{
+	return 0;
+}
+
+OVERLOADABLE double convert_double_rtn(ulong x)
+{
+	return 0;
+}
+
+OVERLOADABLE double convert_double_rte(ulong x)
+{
+	return 0;
+}
+'
+fi
+
+TTYPES=" ulong:8"
+for vector_length in $VECTOR_LENGTHS; do
+    for ftype in $TTYPES; do
+	fbasetype=`IFS=:; set -- dummy $ftype; echo $2`
+
+	    if test $vector_length -eq 1; then
+		if [ $1"a" = "-pa" ]; then
+		    echo "OVERLOADABLE double convert_double_rte($fbasetype x);"
+		    echo "OVERLOADABLE double convert_double_rtz($fbasetype x);"
+		    echo "OVERLOADABLE double convert_double_rtp($fbasetype x);"
+		    echo "OVERLOADABLE double convert_double_rtn($fbasetype x);"
+		fi
+		continue
+	    fi
+
+	    for rounding in $ROUNDING_MODES; do
+		fvectortype=$fbasetype$vector_length
+		tvectortype=double$vector_length
+		conv="convert_double_${rounding}"
+
+		construct="$conv(v.s0)"
+		if test $vector_length -gt 1; then
+		    construct="$construct, $conv(v.s1)"
+		fi
+		if test $vector_length -gt 2; then
+		    construct="$construct, $conv(v.s2)"
+		fi
+		if test $vector_length -gt 3; then
+		    construct="$construct, $conv(v.s3)"
+		fi
+		if test $vector_length -gt 4; then
+		    construct="$construct, $conv(v.s4)"
+		    construct="$construct, $conv(v.s5)"
+		    construct="$construct, $conv(v.s6)"
+		    construct="$construct, $conv(v.s7)"
+		fi
+		if test $vector_length -gt 8; then
+		    construct="$construct, $conv(v.s8)"
+		    construct="$construct, $conv(v.s9)"
+		    construct="$construct, $conv(v.sA)"
+		    construct="$construct, $conv(v.sB)"
+		    construct="$construct, $conv(v.sC)"
+		    construct="$construct, $conv(v.sD)"
+		    construct="$construct, $conv(v.sE)"
+		    construct="$construct, $conv(v.sF)"
+		fi
+
+		if [ $1"a" = "-pa" ]; then
+		    echo "OVERLOADABLE $tvectortype convert_${tvectortype}_${rounding}($fvectortype v);"
+		else
+		    echo "OVERLOADABLE $tvectortype convert_${tvectortype}_${rounding}($fvectortype v) {"
+		    echo "  return ($tvectortype)($construct);"
+		    echo "}"
+		    echo
+		fi
+	done
+    done
+done
+
 if [ $1"a" = "-pa" ]; then
     echo "#endif /* __OCL_CONVERT_H__ */"
 fi
-- 
2.7.4



More information about the Beignet mailing list