1 /* { dg-do run } */
2 /* { dg-options "-O2 --save-temps" } */
3
4 extern void abort (void);
5
6 unsigned long long
7 combine_zero_extended_int (unsigned int a, unsigned int b)
8 {
9 /* { dg-final { scan-assembler-not "uxtw\\t" } } */
10 return (a & 0xffff0000ll) | (b & 0x0000ffffll);
11 }
12
13 unsigned long long
14 combine_balanced (unsigned long long a, unsigned long long b)
15 {
16 return (a & 0xffffffff00000000ll) | (b & 0x00000000ffffffffll);
17 }
18
19 unsigned long long
20 combine_minimal (unsigned long long a, unsigned long long b)
21 {
22 return (a & 0xfffffffffffffffell) | (b & 0x0000000000000001ll);
23 }
24
25 unsigned long long
26 combine_unbalanced (unsigned long long a, unsigned long long b)
27 {
28 return (a & 0xffffffffff000000ll) | (b & 0x0000000000ffffffll);
29 }
30
31 unsigned int
32 combine_balanced_int (unsigned int a, unsigned int b)
33 {
34 return (a & 0xffff0000ll) | (b & 0x0000ffffll);
35 }
36
37 unsigned int
38 combine_unbalanced_int (unsigned int a, unsigned int b)
39 {
40 return (a & 0xffffff00ll) | (b & 0x000000ffll);
41 }
42
43 unsigned long long c, d;
44
45 __attribute__ ((noinline)) void
46 foo (unsigned long long a, unsigned long long b)
47 {
48 c = combine_minimal (a, b);
49 d = combine_minimal (b, a);
50 }
51
52 __attribute__ ((noinline)) void
53 foo2 (unsigned long long a, unsigned long long b)
54 {
55 c = combine_balanced (a, b);
56 d = combine_balanced (b, a);
57 }
58
59 __attribute__ ((noinline)) void
60 foo3 (unsigned long long a, unsigned long long b)
61 {
62 c = combine_unbalanced (a, b);
63 d = combine_unbalanced (b, a);
64 }
65
66 unsigned int ic, id;
67
68 void
69 foo4 (unsigned int a, unsigned int b)
70 {
71 ic = combine_balanced_int (a, b);
72 id = combine_balanced_int (b, a);
73 }
74
75 void
76 foo5 (unsigned int a, unsigned int b)
77 {
78 ic = combine_unbalanced_int (a, b);
79 id = combine_unbalanced_int (b, a);
80 }
81
82 void
83 foo6 (unsigned int a, unsigned int b)
84 {
85 c = combine_zero_extended_int(a, b);
86 d = combine_zero_extended_int(b, a);
87 }
88
89 int
90 main (void)
91 {
92 unsigned long long a = 0x0123456789ABCDEF, b = 0xFEDCBA9876543210;
93 foo3 (a, b);
94 if (c != 0x0123456789543210) abort ();
95 if (d != 0xfedcba9876abcdef) abort ();
96 foo2 (a, b);
97 if (c != 0x0123456776543210) abort ();
98 if (d != 0xfedcba9889abcdef) abort ();
99 foo (a, b);
100 if (c != 0x0123456789abcdee) abort ();
101 if (d != 0xfedcba9876543211) abort ();
102
103 unsigned int a2 = 0x01234567, b2 = 0xFEDCBA98;
104 foo4 (a2, b2);
105 if (ic != 0x0123ba98) abort ();
106 if (id != 0xfedc4567) abort ();
107 foo5 (a2, b2);
108 if (ic != 0x01234598) abort ();
109 if (id != 0xfedcba67) abort ();
110
111 foo6 (a2, b2);
112 if (c != 0x0123ba98) abort ();
113 if (d != 0xfedc4567) abort ();
114 return 0;
115 }
116
117 /* { dg-final { scan-assembler-times "bfxil\\t" 3 } } */
118 /* { dg-final { scan-assembler-times "bfi\\t" 15 } } */