From 94a4989cdbb07e310d3e9486fa3e81a8b2e68bf9 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Thu, 12 Apr 2012 16:35:19 -0400 Subject: [PATCH] Makes silk_ADD_SAT32() conform to the C standard This changes the saturation test to ensure that it relies on the unsigned overflow behaviour (which is allowed) rather than the signed overflow behaviour (which is undefined). --- silk/MacroDebug.h | 4 ++-- silk/macros.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/silk/MacroDebug.h b/silk/MacroDebug.h index f804902c..e1f4defc 100644 --- a/silk/MacroDebug.h +++ b/silk/MacroDebug.h @@ -98,7 +98,7 @@ static inline opus_int16 silk_ADD_SAT16( opus_int16 a16, opus_int16 b16 ) { #undef silk_ADD_SAT32 static inline opus_int32 silk_ADD_SAT32(opus_int32 a32, opus_int32 b32){ opus_int32 res; - res = ((((a32) + (b32)) & 0x80000000) == 0 ? \ + res = ((((opus_uint32)(a32) + (opus_uint32)(b32)) & 0x80000000) == 0 ? \ ((((a32) & (b32)) & 0x80000000) != 0 ? silk_int32_MIN : (a32)+(b32)) : \ ((((a32) | (b32)) & 0x80000000) == 0 ? silk_int32_MAX : (a32)+(b32)) ); silk_assert( res == silk_SAT32( (opus_int64)a32 + (opus_int64)b32 ) ); @@ -133,7 +133,7 @@ static inline opus_int16 silk_SUB_SAT16( opus_int16 a16, opus_int16 b16 ) { #undef silk_SUB_SAT32 static inline opus_int32 silk_SUB_SAT32( opus_int32 a32, opus_int32 b32 ) { opus_int32 res; - res = ((((a32)-(b32)) & 0x80000000) == 0 ? \ + res = ((((opus_uint32)(a32)-(opus_uint32)(b32)) & 0x80000000) == 0 ? \ (( (a32) & ((b32)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a32)-(b32)) : \ ((((a32)^0x80000000) & (b32) & 0x80000000) ? silk_int32_MAX : (a32)-(b32)) ); silk_assert( res == silk_SAT32( (opus_int64)a32 - (opus_int64)b32 ) ); diff --git a/silk/macros.h b/silk/macros.h index c2c2a8b8..51470977 100644 --- a/silk/macros.h +++ b/silk/macros.h @@ -68,11 +68,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define silk_SMLAWW(a32, b32, c32) silk_MLA(silk_SMLAWB((a32), (b32), (c32)), (b32), silk_RSHIFT_ROUND((c32), 16)) /* add/subtract with output saturated */ -#define silk_ADD_SAT32(a, b) ((((a) + (b)) & 0x80000000) == 0 ? \ +#define silk_ADD_SAT32(a, b) ((((opus_uint32)(a) + (opus_uint32)(b)) & 0x80000000) == 0 ? \ ((((a) & (b)) & 0x80000000) != 0 ? silk_int32_MIN : (a)+(b)) : \ ((((a) | (b)) & 0x80000000) == 0 ? silk_int32_MAX : (a)+(b)) ) -#define silk_SUB_SAT32(a, b) ((((a)-(b)) & 0x80000000) == 0 ? \ +#define silk_SUB_SAT32(a, b) ((((opus_uint32)(a)-(opus_uint32)(b)) & 0x80000000) == 0 ? \ (( (a) & ((b)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a)-(b)) : \ ((((a)^0x80000000) & (b) & 0x80000000) ? silk_int32_MAX : (a)-(b)) )