blob: 0e8dac69a65fc1a3486f18680470458c008705bd [file] [log] [blame]
/* 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;
}