/* Check that the rotcr instruction is generated.  */
/* { dg-do compile }  */
/* { dg-options "-O2" } */
/* { dg-final { scan-assembler-times "rotcr" 25 } } */
/* { dg-final { scan-assembler-times "sett" 1 } } */
/* { dg-final { scan-assembler-times "shll\t" 1 } } */
/* { dg-final { scan-assembler-not "and\t#1" } }  */
/* { dg-final { scan-assembler-not "cmp/pl" } }  */

typedef char bool;

long long
test_00 (long long a)
{
  return a >> 1;
}

unsigned int
test_01 (unsigned int a, int b, int c)
{
  bool r = b == c;
  return ((a >> 1) | (r << 31));
}

unsigned int
test_02 (unsigned int a, int b, int c)
{
  bool r = b == c;
  return ((a >> 2) | (r << 31));
}

unsigned int
test_03 (unsigned int a, int b, int c)
{
  bool r = b == c;
  return ((a >> 3) | (r << 31));
}

unsigned int
test_04 (unsigned int a, int b, int c)
{
  bool r = b == c;
  return ((a >> 4) | (r << 31));
}

unsigned int
test_05 (unsigned int a, int b, int c)
{
  bool r = b == c;
  return ((a >> 5) | (r << 31));
}

unsigned int
test_06 (unsigned int a, int b, int c)
{
  bool r = b == c;
  return ((a >> 6) | (r << 31));
}

unsigned int
test_07 (unsigned int a, int b, int c)
{
  bool r = b == c;
  return ((a >> 7) | (r << 31));
}

unsigned int
test_08 (unsigned int a, int b, int c)
{
  bool r = b == c;
  return ((a >> 8) | (r << 31));
}

unsigned int
test_09 (unsigned int a, int b, int c)
{
  bool r = b == c;
  return ((a >> 31) | (r << 31));
}

int
test_10 (int a, int b)
{
  bool r = a == b;
  return r << 31;
}

unsigned int
test_11 (unsigned int a, int b)
{
  /* 1x shlr, 1x rotcr  */
  return (a >> 1) | (b << 31);
}

unsigned int
test_12 (unsigned int a, int b)
{
  return (a >> 2) | (b << 31);
}

unsigned int
test_13 (unsigned int a, int b)
{
  return (a >> 3) | (b << 31);
}

unsigned int
test_14 (unsigned int a, int b)
{
  /* 1x shll, 1x rotcr  */
  bool r = b < 0;
  return ((a >> 1) | (r << 31));
}

unsigned int
test_15 (unsigned int a, int b, int c)
{
  bool r = b != c;
  return ((a >> 1) | (r << 31));
}

unsigned int
test_16 (unsigned int a, int b, int c)
{
  bool r = b != c;
  return ((a >> 2) | (r << 31));
}

unsigned int
test_17 (unsigned int a, int b, int c)
{
  bool r = b != c;
  return ((a >> 3) | (r << 31));
}

unsigned int
test_18 (unsigned int a, int b, int c)
{
  bool r = b != c;
  return ((a >> 4) | (r << 31));
}

unsigned int
test_19 (unsigned int a, int b, int c)
{
  bool r = b != c;
  return ((a >> 5) | (r << 31));
}

unsigned int
test_20 (unsigned int a, int b, int c)
{
  bool r = b != c;
  return ((a >> 6) | (r << 31));
}

unsigned int
test_21 (unsigned int a, int b, int c)
{
  bool r = b != c;
  return ((a >> 7) | (r << 31));
}

unsigned int
test_22 (unsigned int a, int b, int c)
{
  bool r = b != c;
  return ((a >> 8) | (r << 31));
}

unsigned int
test_23 (unsigned int a, int b, int c)
{
  bool r = b != c;
  return ((a >> 31) | (r << 31));
}

unsigned int
test_24 (unsigned int a)
{
  return (a >> 1) | (1 << 31);
}
