(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
combine_bfxil.c
       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 } } */