53 lines
758 B
C
53 lines
758 B
C
/* PR target/20322 */
|
|
|
|
extern void abort (void);
|
|
|
|
typedef unsigned long T;
|
|
typedef struct
|
|
{
|
|
T a, b;
|
|
unsigned char c, d;
|
|
} S;
|
|
|
|
#define M (sizeof (T) * 4)
|
|
|
|
S __attribute__((noinline))
|
|
foo (T x, T y)
|
|
{
|
|
S e;
|
|
T f[2], g;
|
|
|
|
e.b = (x & (~(T) 0 >> M)) * (y & (~(T) 0 >> M));
|
|
e.a = (x >> M) * (y >> M);
|
|
|
|
f[0] = (x & (~(T) 0 >> M)) * (y >> M);
|
|
f[1] = (x >> M) * (y & (~(T) 0 >> M));
|
|
|
|
g = e.b;
|
|
e.b += (f[0] & (~(T) 0 >> M)) << M;
|
|
if (e.b < g)
|
|
e.a++;
|
|
|
|
g = e.b;
|
|
e.b += (f[1] & (~(T) 0 >> M)) << M;
|
|
if (e.b < g)
|
|
e.a++;
|
|
|
|
e.a += (f[0] >> M);
|
|
e.a += (f[1] >> M);
|
|
e.c = 1;
|
|
e.d = 0;
|
|
|
|
return e;
|
|
}
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
T x = 1UL << (M * 2 - 1);
|
|
S y = foo (1, x);
|
|
if (y.a || y.b != x || y.c != 1 || y.d)
|
|
abort ();
|
|
return 0;
|
|
}
|