Commit ee3ae4f7 by Jakub Jelinek Committed by Jakub Jelinek

re PR libgcc/55451 (FAIL: gcc.dg/fixed-point/unary.c)

	PR libgcc/55451
	* fixed-bit.c (FIXED_SSADD, FIXED_SSSUB, FIXED_SSNEG): Avoid
	undefined signed overflows.

From-SVN: r194439
parent 4c052539
2012-12-12 Jakub Jelinek <jakub@redhat.com>
PR libgcc/55451
* fixed-bit.c (FIXED_SSADD, FIXED_SSSUB, FIXED_SSNEG): Avoid
undefined signed overflows.
2012-12-09 Uros Bizjak <ubizjak@gmail.com> 2012-12-09 Uros Bizjak <ubizjak@gmail.com>
PR target/55344 PR target/55344
......
/* This is a software fixed-point library. /* This is a software fixed-point library.
Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. Copyright (C) 2007, 2009, 2011, 2012 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -80,15 +80,14 @@ FIXED_SSADD (FIXED_C_TYPE a, FIXED_C_TYPE b) ...@@ -80,15 +80,14 @@ FIXED_SSADD (FIXED_C_TYPE a, FIXED_C_TYPE b)
INT_C_TYPE x, y, z; INT_C_TYPE x, y, z;
memcpy (&x, &a, FIXED_SIZE); memcpy (&x, &a, FIXED_SIZE);
memcpy (&y, &b, FIXED_SIZE); memcpy (&y, &b, FIXED_SIZE);
z = x + y; z = x + (UINT_C_TYPE) y;
if ((((x ^ y) >> I_F_BITS) & 1) == 0) if ((((x ^ y) >> I_F_BITS) & 1) == 0)
{ {
if (((z ^ x) >> I_F_BITS) & 1) if (((z ^ x) >> I_F_BITS) & 1)
{ {
z = 1; z = ((UINT_C_TYPE) 1) << I_F_BITS;
z = z << I_F_BITS;
if (x >= 0) if (x >= 0)
z--; z -= (UINT_C_TYPE) 1;
} }
} }
#if HAVE_PADDING_BITS #if HAVE_PADDING_BITS
...@@ -152,15 +151,14 @@ FIXED_SSSUB (FIXED_C_TYPE a, FIXED_C_TYPE b) ...@@ -152,15 +151,14 @@ FIXED_SSSUB (FIXED_C_TYPE a, FIXED_C_TYPE b)
INT_C_TYPE x, y, z; INT_C_TYPE x, y, z;
memcpy (&x, &a, FIXED_SIZE); memcpy (&x, &a, FIXED_SIZE);
memcpy (&y, &b, FIXED_SIZE); memcpy (&y, &b, FIXED_SIZE);
z = x - y; z = x - (UINT_C_TYPE) y;
if (((x ^ y) >> I_F_BITS) & 1) if (((x ^ y) >> I_F_BITS) & 1)
{ {
if (((z ^ x) >> I_F_BITS) & 1) if (((z ^ x) >> I_F_BITS) & 1)
{ {
z = 1; z = ((UINT_C_TYPE) 1) << I_F_BITS;
z = z << I_F_BITS;
if (x >= 0) if (x >= 0)
z--; z -= (UINT_C_TYPE) 1;
} }
} }
#if HAVE_PADDING_BITS #if HAVE_PADDING_BITS
...@@ -569,16 +567,11 @@ FIXED_SSNEG (FIXED_C_TYPE a) ...@@ -569,16 +567,11 @@ FIXED_SSNEG (FIXED_C_TYPE a)
INT_C_TYPE x, y, z; INT_C_TYPE x, y, z;
memcpy (&y, &a, FIXED_SIZE); memcpy (&y, &a, FIXED_SIZE);
x = 0; x = 0;
z = x - y; z = x - (UINT_C_TYPE) y;
if (((x ^ y) >> I_F_BITS) & 1) if (((x ^ y) >> I_F_BITS) & 1)
{ {
if (((z ^ x) >> I_F_BITS) & 1) if (((z ^ x) >> I_F_BITS) & 1)
{ z = (((UINT_C_TYPE) 1) << I_F_BITS) - 1;
z = 1;
z = z << I_F_BITS;
if (x >= 0)
z--;
}
} }
#if HAVE_PADDING_BITS #if HAVE_PADDING_BITS
z = z << PADDING_BITS; z = z << PADDING_BITS;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment