/* { dg-do run } */
/* { dg-options "-O2 --save-temps -fno-inline" } */

extern void abort (void);

int
tst_si_test1 (int a, int b, int c)
{
  int d = a & b;

  /* { dg-final { scan-assembler-not "tst\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" } } */
  /* { dg-final { scan-assembler-times "and\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+" 2 } } */
  if (d <= 0)
    return 12;
  else
    return 18;
}

int
tst_si_test2 (int a, int b, int c)
{
  int d = a & 0x99999999;

  /* { dg-final { scan-assembler-not "tst\tw\[0-9\]+, w\[0-9\]+, -1717986919" } } */
  /* { dg-final { scan-assembler "and\tw\[0-9\]+, w\[0-9\]+, -1717986919" } } */
  if (d <= 0)
    return 12;
  else
    return 18;
}

int
tst_si_test3 (int a, int b, int c)
{
  int d = a & (b << 3);

  /* { dg-final { scan-assembler-not "tst\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
  /* { dg-final { scan-assembler "and\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, lsl 3" } } */
  if (d <= 0)
    return 12;
  else
    return 18;
}

typedef long long s64;

s64
tst_di_test1 (s64 a, s64 b, s64 c)
{
  s64 d = a & b;

  /* { dg-final { scan-assembler-not "tst\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" } } */
  /* { dg-final { scan-assembler-times "and\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+" 2 } } */
  if (d <= 0)
    return 12;
  else
    return 18;
}

s64
tst_di_test2 (s64 a, s64 b, s64 c)
{
  s64 d = a & 0xaaaaaaaaaaaaaaaall;

  /* { dg-final { scan-assembler-not "tst\tx\[0-9\]+, x\[0-9\]+, -6148914691236517206" } } */
  /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, -6148914691236517206" } } */
  if (d <= 0)
    return 12;
  else
    return 18;
}

s64
tst_di_test3 (s64 a, s64 b, s64 c)
{
  s64 d = a & (b << 3);

  /* { dg-final { scan-assembler-not "tst\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
  /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, lsl 3" } } */
  if (d <= 0)
    return 12;
  else
    return 18;
}

int
main ()
{
  int x;
  s64 y;

  x = tst_si_test1 (29, 4, 5);
  if (x != 18)
    abort ();

  x = tst_si_test1 (5, 2, 20);
  if (x != 12)
    abort ();

  x = tst_si_test2 (29, 4, 5);
  if (x != 18)
    abort ();

  x = tst_si_test2 (1024, 2, 20);
  if (x != 12)
    abort ();

  x = tst_si_test3 (35, 4, 5);
  if (x != 18)
    abort ();

  x = tst_si_test3 (5, 2, 20);
  if (x != 12)
    abort ();

  y = tst_di_test1 (0x130000029ll,
                     0x320000004ll,
                     0x505050505ll);

  if (y != 18)
    abort ();

  y = tst_di_test1 (0x5000500050005ll,
                     0x2111211121112ll,
                     0x0000000002020ll);
  if (y != 12)
    abort ();

  y = tst_di_test2 (0x130000029ll,
                     0x320000004ll,
                     0x505050505ll);
  if (y != 18)
    abort ();

  y = tst_di_test2 (0x540004100ll,
                     0x320000004ll,
                     0x805050205ll);
  if (y != 12)
    abort ();

  y = tst_di_test3 (0x130000029ll,
                     0x064000008ll,
                     0x505050505ll);
  if (y != 18)
    abort ();

  y = tst_di_test3 (0x130002900ll,
                     0x088000008ll,
                     0x505050505ll);
  if (y != 12)
    abort ();

  return 0;
}

