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)9foo (u32 high, u32 low) 10 { 11 return ((u64)high << 32) | low; 12 } 13 14 u32 __attribute__((noinline)) right(u64 t)15right (u64 t) 16 { 17 return (u32)(t >> 32); 18 } 19 20 u64 __attribute__((noinline)) left(u32 t)21left (u32 t) 22 { 23 return (u64)t << 32; 24 } 25 26 u32 __attribute__((noinline)) right2(u64 t)27right2 (u64 t) 28 { 29 return (u32)(t >> 40); 30 } 31 32 u64 __attribute__((noinline)) left2(u32 t)33left2 (u32 t) 34 { 35 return (u64)t << 40; 36 } 37 38 u64 __attribute__((noinline)) zeroextend(u32 t)39zeroextend (u32 t) 40 { 41 return (u64)t; 42 } 43 44 extern void abort (); 45 46 int main()47main () 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