do bit operations according to IEEE754 spec

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

diff --git a/backend/src/libocl/script/ocl_convert.sh 
b/backend/src/libocl/script/ocl_convert.sh
index 6374946..1a3f1f3 100755
--- a/backend/src/libocl/script/ocl_convert.sh
+++ b/backend/src/libocl/script/ocl_convert.sh
@@ -753,6 +753,49 @@ OVERLOADABLE float  convert_float_rtp(double x)
        return ftemp;
 }
 
+OVERLOADABLE float  convert_float_rte(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);
+       int lastBit = (ma & 0x20000000);
+       int roundBits32 = (ma & 0x1FFFFFFF);
+       if(roundBits32 > 0x10000000) fval += 1;
+       else if((roundBits32 == 0x10000000) && lastBit) fval += 1;
+       ret = fval;
+
+       ma |= DF_IMPLICITE_ONE;
+       int rshift = -exp -97;
+       tmp = ma >> rshift;
+       long shift = (1UL << rshift) -1UL;
+       long roundBits = (ma & shift);
+       lastBit = tmp & 0x1;
+       if(roundBits > (1L << (rshift - 1))) tmp += 1;
+       if(roundBits == (1L << (rshift - 1)) && lastBit) tmp += 1;
+       ret = (exp < -126) ? tmp:ret;
+       ret = (exp < -149) ? 0:ret;
+
+       tmp = 0x7F800000;
+       if(!sign) tmp = 0x7F800000;
+       ret = (exp > 127) ? tmp:ret;
+
+       tmp = (lval & DF_MAN_MASK) ? 0x7FFFFFFF:0x7F800000;
+       ret = (exp == 1024) ? tmp:ret;
+
+       tmp = 0x7F800000;
+       ret = ((exp == 1023) && (ma == DF_MAN_MASK)) ? 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

_______________________________________________
Beignet mailing list
Beignet@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/beignet

Reply via email to