1 /* { dg-do run } */
2 /* { dg-options "-O3" } */
3 /* { dg-require-effective-target ilp32 } */
4 
5 typedef unsigned int u32;
6 typedef unsigned long long u64;
7 
8 u64 __attribute__((noinline))
foo(u32 high,u32 low)9 foo (u32 high, u32 low)
10 {
11   return ((u64)high << 32) | low;
12 }
13 
14 u32 __attribute__((noinline))
right(u64 t)15 right (u64 t)
16 {
17   return (u32)(t >> 32);
18 }
19 
20 u64 __attribute__((noinline))
left(u32 t)21 left (u32 t)
22 {
23   return (u64)t << 32;
24 }
25 
26 u32 __attribute__((noinline))
right2(u64 t)27 right2 (u64 t)
28 {
29   return (u32)(t >> 40);
30 }
31 
32 u64 __attribute__((noinline))
left2(u32 t)33 left2 (u32 t)
34 {
35   return (u64)t << 40;
36 }
37 
38 u64 __attribute__((noinline))
zeroextend(u32 t)39 zeroextend (u32 t)
40 {
41   return (u64)t;
42 }
43 
44 extern void abort ();
45 
46 int
main()47 main ()
48 {
49   if (foo (13000, 12000) != 55834574860000ULL)
50     abort ();
51 
52   if (right (55834574860000ULL) != 13000)
53     abort ();
54 
55   if (left (13000) != 55834574848000ULL)
56     abort ();
57 
58   if (right2 (55834574860000ULL) != 50)
59     abort ();
60 
61   if (left2 (13000) != 14293651161088000ULL)
62     abort ();
63 
64   if (zeroextend (13000) != 13000ULL)
65     abort ();
66 
67   return 0;
68 }
69