Fix a convert float to long bug.
authorYang Rong <rong.r.yang@intel.com>
Mon, 3 Mar 2014 03:25:19 +0000 (11:25 +0800)
committerZhigang Gong <zhigang.gong@intel.com>
Mon, 10 Mar 2014 06:53:10 +0000 (14:53 +0800)
When convert some special float values, slight large than LONG_MAX, to long with sat,
will error. Simply using LONG_MAX when float value equal to LONG_MAX.

Signed-off-by: Yang Rong <rong.r.yang@intel.com>
Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
backend/src/gen_convert.sh
backend/src/ocl_convert.h

index f0562a7..b940222 100755 (executable)
@@ -99,7 +99,7 @@ DEF(uint, float);
 
 #define DEF(DSTTYPE, SRCTYPE, MIN, MAX) \
   INLINE_OVERLOADABLE DSTTYPE convert_ ## DSTTYPE ## _sat(SRCTYPE x) { \
-    return x > MAX ? (DSTTYPE)MAX : x < MIN ? (DSTTYPE)MIN : x; \
+    return x >= MAX ? (DSTTYPE)MAX : x <= MIN ? (DSTTYPE)MIN : x; \
   }
 DEF(char, long, -128, 127);
 DEF(uchar, long, 0, 255);
@@ -113,7 +113,7 @@ DEF(ulong, float, 0, 1.8446744073709552e+19f);
 
 #define DEF(DSTTYPE, SRCTYPE, MAX) \
   INLINE_OVERLOADABLE DSTTYPE convert_ ## DSTTYPE ## _sat(SRCTYPE x) { \
-    return x > MAX ? (DSTTYPE)MAX : x; \
+    return x >= MAX ? (DSTTYPE)MAX : x; \
   }
 DEF(char, ulong, 127);
 DEF(uchar, ulong, 255);
@@ -125,12 +125,12 @@ DEF(uint, ulong, 0xffffffffu);
 
 INLINE_OVERLOADABLE long convert_long_sat(ulong x) {
   ulong MAX = 0x7ffffffffffffffful;
-  return x > MAX ? MAX : x;
+  return x >= MAX ? MAX : x;
 }
 
 #define DEF(DSTTYPE, SRCTYPE) \
   INLINE_OVERLOADABLE DSTTYPE convert_ ## DSTTYPE ## _sat(SRCTYPE x) { \
-    return x < 0 ? 0 : x; \
+    return x <= 0 ? 0 : x; \
   }
 DEF(ushort, char);
 DEF(uint, char);
index 7ec2aec..8326768 100644 (file)
@@ -2281,7 +2281,7 @@ DEF(uint, float);
 
 #define DEF(DSTTYPE, SRCTYPE, MIN, MAX) \
   INLINE_OVERLOADABLE DSTTYPE convert_ ## DSTTYPE ## _sat(SRCTYPE x) { \
-    return x > MAX ? (DSTTYPE)MAX : x < MIN ? (DSTTYPE)MIN : x; \
+    return x >= MAX ? (DSTTYPE)MAX : x <= MIN ? (DSTTYPE)MIN : x; \
   }
 DEF(char, long, -128, 127);
 DEF(uchar, long, 0, 255);
@@ -2295,7 +2295,7 @@ DEF(ulong, float, 0, 1.8446744073709552e+19f);
 
 #define DEF(DSTTYPE, SRCTYPE, MAX) \
   INLINE_OVERLOADABLE DSTTYPE convert_ ## DSTTYPE ## _sat(SRCTYPE x) { \
-    return x > MAX ? (DSTTYPE)MAX : x; \
+    return x >= MAX ? (DSTTYPE)MAX : x; \
   }
 DEF(char, ulong, 127);
 DEF(uchar, ulong, 255);
@@ -2307,12 +2307,12 @@ DEF(uint, ulong, 0xffffffffu);
 
 INLINE_OVERLOADABLE long convert_long_sat(ulong x) {
   ulong MAX = 0x7ffffffffffffffful;
-  return x > MAX ? MAX : x;
+  return x >= MAX ? MAX : x;
 }
 
 #define DEF(DSTTYPE, SRCTYPE) \
   INLINE_OVERLOADABLE DSTTYPE convert_ ## DSTTYPE ## _sat(SRCTYPE x) { \
-    return x < 0 ? 0 : x; \
+    return x <= 0 ? 0 : x; \
   }
 DEF(ushort, char);
 DEF(uint, char);