Viewing file: rXsbg_mode_sXl.c (3.73 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* 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; }
|