annotate gcc/testsuite/gcc.dg/20050307-1.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* PR target/20322 */
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 extern void abort (void);
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 typedef unsigned long T;
kono
parents:
diff changeset
6 typedef struct
kono
parents:
diff changeset
7 {
kono
parents:
diff changeset
8 T a, b;
kono
parents:
diff changeset
9 unsigned char c, d;
kono
parents:
diff changeset
10 } S;
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 #define M (sizeof (T) * 4)
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 S __attribute__((noinline))
kono
parents:
diff changeset
15 foo (T x, T y)
kono
parents:
diff changeset
16 {
kono
parents:
diff changeset
17 S e;
kono
parents:
diff changeset
18 T f[2], g;
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 e.b = (x & (~(T) 0 >> M)) * (y & (~(T) 0 >> M));
kono
parents:
diff changeset
21 e.a = (x >> M) * (y >> M);
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 f[0] = (x & (~(T) 0 >> M)) * (y >> M);
kono
parents:
diff changeset
24 f[1] = (x >> M) * (y & (~(T) 0 >> M));
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 g = e.b;
kono
parents:
diff changeset
27 e.b += (f[0] & (~(T) 0 >> M)) << M;
kono
parents:
diff changeset
28 if (e.b < g)
kono
parents:
diff changeset
29 e.a++;
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 g = e.b;
kono
parents:
diff changeset
32 e.b += (f[1] & (~(T) 0 >> M)) << M;
kono
parents:
diff changeset
33 if (e.b < g)
kono
parents:
diff changeset
34 e.a++;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 e.a += (f[0] >> M);
kono
parents:
diff changeset
37 e.a += (f[1] >> M);
kono
parents:
diff changeset
38 e.c = 1;
kono
parents:
diff changeset
39 e.d = 0;
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 return e;
kono
parents:
diff changeset
42 }
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 int
kono
parents:
diff changeset
45 main (void)
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 T x = 1UL << (M * 2 - 1);
kono
parents:
diff changeset
48 S y = foo (1, x);
kono
parents:
diff changeset
49 if (y.a || y.b != x || y.c != 1 || y.d)
kono
parents:
diff changeset
50 abort ();
kono
parents:
diff changeset
51 return 0;
kono
parents:
diff changeset
52 }