/* Machine description pattern tests.  */

/*
    { dg-options "-mzarch -save-temps" }

   Note that dejagnu-1.5.1 has a bug so that the action from the second dg-do
   always wins, even if the condition is false.  If this test is run on hardware
   older than z10 with a buggy dejagnu release, the execution part will fail.

    { dg-do assemble }
    { dg-do run { target { s390_useable_hw } } }

   Skip test if -O0, -march=z900, -march=z9-109 or -march=z9-ec is present on
   the command line:

    { dg-skip-if "" { *-*-* } { "-march=z9*" "-O0" } { "" } }

   Skip test if the -O or the -march= option is missing from the command line
   because it's difficult to detect the default:

    { dg-skip-if "" { *-*-* } { "*" } { "-O*" } }
    { dg-skip-if "" { *-*-* } { "*" } { "-march=*" } }
*/

__attribute__ ((noinline)) unsigned int
si_sll (unsigned int x)
{
  return (x << 1);
}

__attribute__ ((noinline)) unsigned int
si_srl (unsigned int x)
{
  return (x >> 2);
}

__attribute__ ((noinline)) unsigned int
rosbg_si_sll (unsigned int a, unsigned int b)
{
  return a | (b << 1);
}
/* { dg-final { scan-assembler-times "rosbg\t%r.,%r.,32,62,1" 1 } } */

__attribute__ ((noinline)) unsigned int
rosbg_si_srl (unsigned int a, unsigned int b)
{
  return a | (b >> 2);
}
/* { dg-final { scan-assembler-times "rosbg\t%r.,%r.,32,63,62" 1 } } */

__attribute__ ((noinline)) unsigned int
rxsbg_si_sll (unsigned int a, unsigned int b)
{
  return a ^ (b << 1);
}
/* { dg-final { scan-assembler-times "rxsbg\t%r.,%r.,32,62,1" 1 } } */

__attribute__ ((noinline)) unsigned int
rxsbg_si_srl (unsigned int a, unsigned int b)
{
  return a ^ (b >> 2);
}
/* { dg-final { scan-assembler-times "rxsbg\t%r.,%r.,32,63,62" 1 } } */

__attribute__ ((noinline)) unsigned long long
di_sll (unsigned long long x)
{
  return (x << 1);
}

__attribute__ ((noinline)) unsigned long long
di_srl (unsigned long long x)
{
  return (x >> 2);
}

__attribute__ ((noinline)) unsigned long long
rosbg_di_sll (unsigned long long a, unsigned long long b)
{
  return a | (b << 1);
}
/* { dg-final { scan-assembler-times "rosbg\t%r.,%r.,0,62,1" 1 } } */

__attribute__ ((noinline)) unsigned long long
rosbg_di_srl (unsigned long long a, unsigned long long b)
{
  return a | (b >> 2);
}
/* { dg-final { scan-assembler-times "rosbg\t%r.,%r.,2,63,62" 1 } } */

__attribute__ ((noinline)) unsigned long long
rxsbg_di_sll (unsigned long long a, unsigned long long b)
{
  return a ^ (b << 1);
}
/* { dg-final { scan-assembler-times "rxsbg\t%r.,%r.,0,62,1" 1 } } */

__attribute__ ((noinline)) unsigned long long
rxsbg_di_srl (unsigned long long a, unsigned long long b)
{
  return a ^ (b >> 2);
}
/* { dg-final { scan-assembler-times "rxsbg\t%r.,%r.,2,63,62" 1 } } */

int
main (void)
{
  /* SIMode */
  {
    unsigned int r;
    unsigned int a = 0x12488421u;
    unsigned int b = 0x88881111u;
    unsigned int csll = si_sll (b);
    unsigned int csrl = si_srl (b);

    r = rosbg_si_sll (a, b);
    if (r != (a | csll))
      __builtin_abort ();
    r = rosbg_si_srl (a, b);
    if (r != (a | csrl))
      __builtin_abort ();
    r = rxsbg_si_sll (a, b);
    if (r != (a ^ csll))
      __builtin_abort ();
    r = rxsbg_si_srl (a, b);
    if (r != (a ^ csrl))
      __builtin_abort ();
  }
  /* DIMode */
  {
    unsigned long long r;
    unsigned long long a = 0x1248357997538421lu;
    unsigned long long b = 0x8888444422221111lu;
    unsigned long long csll = di_sll (b);
    unsigned long long csrl = di_srl (b);

    r = rosbg_di_sll (a, b);
    if (r != (a | csll))
      __builtin_abort ();
    r = rosbg_di_srl (a, b);
    if (r != (a | csrl))
      __builtin_abort ();
    r = rxsbg_di_sll (a, b);
    if (r != (a ^ csll))
      __builtin_abort ();
    r = rxsbg_di_srl (a, b);
    if (r != (a ^ csrl))
      __builtin_abort ();
  }
  return 0;
}
