| /* { dg-do run } */ |
| /* { dg-options "-O2 --save-temps" } */ |
| |
| extern void abort (void); |
| |
| unsigned long long |
| combine_zero_extended_int (unsigned int a, unsigned int b) |
| { |
| /* { dg-final { scan-assembler-not "uxtw\\t" } } */ |
| return (a & 0xffff0000ll) | (b & 0x0000ffffll); |
| } |
| |
| unsigned long long |
| combine_balanced (unsigned long long a, unsigned long long b) |
| { |
| return (a & 0xffffffff00000000ll) | (b & 0x00000000ffffffffll); |
| } |
| |
| unsigned long long |
| combine_minimal (unsigned long long a, unsigned long long b) |
| { |
| return (a & 0xfffffffffffffffell) | (b & 0x0000000000000001ll); |
| } |
| |
| unsigned long long |
| combine_unbalanced (unsigned long long a, unsigned long long b) |
| { |
| return (a & 0xffffffffff000000ll) | (b & 0x0000000000ffffffll); |
| } |
| |
| unsigned int |
| combine_balanced_int (unsigned int a, unsigned int b) |
| { |
| return (a & 0xffff0000ll) | (b & 0x0000ffffll); |
| } |
| |
| unsigned int |
| combine_unbalanced_int (unsigned int a, unsigned int b) |
| { |
| return (a & 0xffffff00ll) | (b & 0x000000ffll); |
| } |
| |
| unsigned long long c, d; |
| |
| __attribute__ ((noinline)) void |
| foo (unsigned long long a, unsigned long long b) |
| { |
| c = combine_minimal (a, b); |
| d = combine_minimal (b, a); |
| } |
| |
| __attribute__ ((noinline)) void |
| foo2 (unsigned long long a, unsigned long long b) |
| { |
| c = combine_balanced (a, b); |
| d = combine_balanced (b, a); |
| } |
| |
| __attribute__ ((noinline)) void |
| foo3 (unsigned long long a, unsigned long long b) |
| { |
| c = combine_unbalanced (a, b); |
| d = combine_unbalanced (b, a); |
| } |
| |
| unsigned int ic, id; |
| |
| void |
| foo4 (unsigned int a, unsigned int b) |
| { |
| ic = combine_balanced_int (a, b); |
| id = combine_balanced_int (b, a); |
| } |
| |
| void |
| foo5 (unsigned int a, unsigned int b) |
| { |
| ic = combine_unbalanced_int (a, b); |
| id = combine_unbalanced_int (b, a); |
| } |
| |
| void |
| foo6 (unsigned int a, unsigned int b) |
| { |
| c = combine_zero_extended_int(a, b); |
| d = combine_zero_extended_int(b, a); |
| } |
| |
| int |
| main (void) |
| { |
| unsigned long long a = 0x0123456789ABCDEF, b = 0xFEDCBA9876543210; |
| foo3 (a, b); |
| if (c != 0x0123456789543210) abort (); |
| if (d != 0xfedcba9876abcdef) abort (); |
| foo2 (a, b); |
| if (c != 0x0123456776543210) abort (); |
| if (d != 0xfedcba9889abcdef) abort (); |
| foo (a, b); |
| if (c != 0x0123456789abcdee) abort (); |
| if (d != 0xfedcba9876543211) abort (); |
| |
| unsigned int a2 = 0x01234567, b2 = 0xFEDCBA98; |
| foo4 (a2, b2); |
| if (ic != 0x0123ba98) abort (); |
| if (id != 0xfedc4567) abort (); |
| foo5 (a2, b2); |
| if (ic != 0x01234598) abort (); |
| if (id != 0xfedcba67) abort (); |
| |
| foo6 (a2, b2); |
| if (c != 0x0123ba98) abort (); |
| if (d != 0xfedc4567) abort (); |
| return 0; |
| } |
| |
| /* { dg-final { scan-assembler-times "bfxil\\t" 3 } } */ |
| /* { dg-final { scan-assembler-times "bfi\\t" 15 } } */ |