1  /* { dg-options "-O2 --save-temps" } */
       2  /* { dg-do assemble } */
       3  
       4  
       5  #define ROR(X,Y) ((X >> Y) | (X << (64 - Y)))
       6  
       7  unsigned long
       8  ror1 (unsigned long x)
       9  {
      10    /* { dg-final { scan-assembler "ror\tx\[0-9\]+, x\[0-9\]+, 3\n" } } */
      11    return ROR (x, 3);
      12  }
      13  
      14  unsigned long
      15  ror2 (unsigned long x)
      16  {
      17    /* { dg-final { scan-assembler "ror\tx\[0-9\]+, x\[0-9\]+, 37\n" } } */
      18    return ROR (x, 37);
      19  }
      20  
      21  unsigned long
      22  and1 (unsigned long x, unsigned long y)
      23  {
      24    /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 13\n" } } */
      25    return x & ROR (y, 13);
      26  }
      27  
      28  unsigned long
      29  and2 (unsigned long x, unsigned long y)
      30  {
      31    /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 33\n" } } */
      32    return x & ROR (y, 33);
      33  }
      34  
      35  unsigned long
      36  bic1 (unsigned long x, unsigned long y)
      37  {
      38    /* { dg-final { scan-assembler "bic\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 11\n" } } */
      39    return x & ~ROR (y, 11);
      40  }
      41  
      42  unsigned long
      43  bic2 (unsigned long x, unsigned long y)
      44  {
      45    /* { dg-final { scan-assembler "bic\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 47\n" } } */
      46    return x & ~ROR (y, 47);
      47  }
      48  
      49  unsigned long
      50  orr1 (unsigned long x, unsigned long y)
      51  {
      52    /* { dg-final { scan-assembler "orr\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 5\n" } } */
      53    return x | ROR (y, 5);
      54  }
      55  
      56  unsigned long
      57  orr2 (unsigned long x, unsigned long y)
      58  {
      59    /* { dg-final { scan-assembler "orr\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 35\n" } } */
      60    return x | ROR (y, 35);
      61  }
      62  
      63  unsigned long
      64  orn1 (unsigned long x, unsigned long y)
      65  {
      66    /* { dg-final { scan-assembler "orn\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 3\n" } } */
      67    return x | ~ROR (y, 3);
      68  }
      69  
      70  unsigned long
      71  orn2 (unsigned long x, unsigned long y)
      72  {
      73    /* { dg-final { scan-assembler "orn\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 39\n" } } */
      74    return x | ~ROR (y, 39);
      75  }
      76  
      77  unsigned long
      78  eor1 (unsigned long x, unsigned long y)
      79  {
      80    /* { dg-final { scan-assembler "eor\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 9\n" } } */
      81    return x ^ ROR (y, 9);
      82  }
      83  
      84  unsigned long
      85  eor2 (unsigned long x, unsigned long y)
      86  {
      87    /* { dg-final { scan-assembler "eor\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 41\n" } } */
      88    return x ^ ROR (y, 41);
      89  }
      90  
      91  unsigned long
      92  eon1 (unsigned long x, unsigned long y)
      93  {
      94    /* { dg-final { scan-assembler "eon\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 1\n" } } */
      95    return x ^ ~ROR (y, 1);
      96  }
      97  
      98  unsigned long
      99  eon2 (unsigned long x, unsigned long y)
     100  {
     101    /* { dg-final { scan-assembler "eon\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 38\n" } } */
     102    return x ^ ~ROR (y, 38);
     103  }
     104  
     105  unsigned long
     106  tst1 (unsigned long x, unsigned long y)
     107  {
     108    /* { dg-final { scan-assembler "tst\tx\[0-9\]+, x\[0-9\]+, ror 8\n" } } */
     109    return (x & ROR (y, 8)) == 0;
     110  }
     111  
     112  unsigned long
     113  tst2 (unsigned long x, unsigned long y)
     114  {
     115    /* { dg-final { scan-assembler "tst\tx\[0-9\]+, x\[0-9\]+, ror 50\n" } } */
     116    return (x & ROR (y, 50)) == 0;
     117  }
     118  
     119  unsigned long
     120  bics1 (unsigned long x, unsigned long y)
     121  {
     122    /* { dg-final { scan-assembler "bics\txzr, x\[0-9\]+, x\[0-9\]+, ror 10\n" } } */
     123    return (x & ~ROR (y, 10)) == 0;
     124  }
     125  
     126  unsigned long
     127  bics2 (unsigned long x, unsigned long y)
     128  {
     129    /* { dg-final { scan-assembler "bics\txzr, x\[0-9\]+, x\[0-9\]+, ror 62\n" } } */
     130    return (x & ~ROR (y, 62)) == 0;
     131  }