1 /* { dg-do compile } */
2 /* { dg-options "-O1 -fno-tree-dominator-opts" } */
3
4 typedef unsigned long int st;
5 typedef unsigned long long dt;
6 typedef union
7 {
8 dt d;
9 struct
10 {
11 st h, l;
12 }
13 s;
14 } t_be;
15
16 typedef union
17 {
18 dt d;
19 struct
20 {
21 st l, h;
22 }
23 s;
24 } t_le;
25
26 #define df(f, t) \
27 int \
28 f (t afh, t bfh) \
29 { \
30 t hh; \
31 t hp, lp, dp, m; \
32 st ad, bd; \
33 int s; \
34 s = 0; \
35 ad = afh.s.h - afh.s.l; \
36 bd = bfh.s.l - bfh.s.h; \
37 if (bd > bfh.s.l) \
38 { \
39 bd = -bd; \
40 s = ~s; \
41 } \
42 lp.d = (dt) afh.s.l * bfh.s.l; \
43 hp.d = (dt) afh.s.h * bfh.s.h; \
44 dp.d = (dt) ad *bd; \
45 dp.d ^= s; \
46 hh.d = hp.d + hp.s.h + lp.s.h + dp.s.h; \
47 m.d = (dt) lp.s.h + hp.s.l + lp.s.l + dp.s.l; \
48 return hh.s.l + m.s.l; \
49 }
50
51 df(f_le, t_le)
52 df(f_be, t_be)
53
54 void abort (void);
55 void exit (int);
56 int
main()57 main ()
58 {
59 t_be x;
60 x.s.h = 0x10000000U;
61 x.s.l = 0xe0000000U;
62 if (x.d == 0x10000000e0000000ULL
63 && f_be ((t_be) 0x100000000ULL, (t_be) 0x100000000ULL) != -1)
64 abort ();
65 if (x.d == 0xe000000010000000ULL
66 && f_le ((t_le) 0x100000000ULL, (t_le) 0x100000000ULL) != -1)
67 abort ();
68 exit (0);
69 }
70