blob: ede813818ff1e187147e355e21ebbbea1a718277 [file] [log] [blame]
/* 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;
}