1 /* Machine description pattern tests. */
2
3 /*
4 { dg-options "-mzarch -save-temps" }
5
6 Note that dejagnu-1.5.1 has a bug so that the action from the second dg-do
7 always wins, even if the condition is false. If this test is run on hardware
8 older than z10 with a buggy dejagnu release, the execution part will fail.
9
10 { dg-do assemble }
11 { dg-do run { target { s390_useable_hw } } }
12
13 Skip test if -O0, -march=z900, -march=z9-109 or -march=z9-ec is present on
14 the command line:
15
16 { dg-skip-if "" { *-*-* } { "-march=z9*" "-O0" } { "" } }
17
18 Skip test if the -O or the -march= option is missing from the command line
19 because it's difficult to detect the default:
20
21 { dg-skip-if "" { *-*-* } { "*" } { "-O*" } }
22 { dg-skip-if "" { *-*-* } { "*" } { "-march=*" } }
23 */
24
25 __attribute__ ((noinline)) unsigned int
si_sll(unsigned int x)26 si_sll (unsigned int x)
27 {
28 return (x << 1);
29 }
30
31 __attribute__ ((noinline)) unsigned int
si_srl(unsigned int x)32 si_srl (unsigned int x)
33 {
34 return (x >> 2);
35 }
36
37 __attribute__ ((noinline)) unsigned int
rosbg_si_sll(unsigned int a,unsigned int b)38 rosbg_si_sll (unsigned int a, unsigned int b)
39 {
40 return a | (b << 1);
41 }
42 /* { dg-final { scan-assembler-times "rosbg\t%r.,%r.,32,62,1" 1 } } */
43
44 __attribute__ ((noinline)) unsigned int
rosbg_si_srl(unsigned int a,unsigned int b)45 rosbg_si_srl (unsigned int a, unsigned int b)
46 {
47 return a | (b >> 2);
48 }
49 /* { dg-final { scan-assembler-times "rosbg\t%r.,%r.,32,63,62" 1 } } */
50
51 __attribute__ ((noinline)) unsigned int
rxsbg_si_sll(unsigned int a,unsigned int b)52 rxsbg_si_sll (unsigned int a, unsigned int b)
53 {
54 return a ^ (b << 1);
55 }
56 /* { dg-final { scan-assembler-times "rxsbg\t%r.,%r.,32,62,1" 1 } } */
57
58 __attribute__ ((noinline)) unsigned int
rxsbg_si_srl(unsigned int a,unsigned int b)59 rxsbg_si_srl (unsigned int a, unsigned int b)
60 {
61 return a ^ (b >> 2);
62 }
63 /* { dg-final { scan-assembler-times "rxsbg\t%r.,%r.,32,63,62" 1 } } */
64
65 __attribute__ ((noinline)) unsigned long long
di_sll(unsigned long long x)66 di_sll (unsigned long long x)
67 {
68 return (x << 1);
69 }
70
71 __attribute__ ((noinline)) unsigned long long
di_srl(unsigned long long x)72 di_srl (unsigned long long x)
73 {
74 return (x >> 2);
75 }
76
77 __attribute__ ((noinline)) unsigned long long
rosbg_di_sll(unsigned long long a,unsigned long long b)78 rosbg_di_sll (unsigned long long a, unsigned long long b)
79 {
80 return a | (b << 1);
81 }
82 /* { dg-final { scan-assembler-times "rosbg\t%r.,%r.,0,62,1" 1 } } */
83
84 __attribute__ ((noinline)) unsigned long long
rosbg_di_srl(unsigned long long a,unsigned long long b)85 rosbg_di_srl (unsigned long long a, unsigned long long b)
86 {
87 return a | (b >> 2);
88 }
89 /* { dg-final { scan-assembler-times "rosbg\t%r.,%r.,2,63,62" 1 } } */
90
91 __attribute__ ((noinline)) unsigned long long
rxsbg_di_sll(unsigned long long a,unsigned long long b)92 rxsbg_di_sll (unsigned long long a, unsigned long long b)
93 {
94 return a ^ (b << 1);
95 }
96 /* { dg-final { scan-assembler-times "rxsbg\t%r.,%r.,0,62,1" 1 } } */
97
98 __attribute__ ((noinline)) unsigned long long
rxsbg_di_srl(unsigned long long a,unsigned long long b)99 rxsbg_di_srl (unsigned long long a, unsigned long long b)
100 {
101 return a ^ (b >> 2);
102 }
103 /* { dg-final { scan-assembler-times "rxsbg\t%r.,%r.,2,63,62" 1 } } */
104
105 int
main(void)106 main (void)
107 {
108 /* SIMode */
109 {
110 unsigned int r;
111 unsigned int a = 0x12488421u;
112 unsigned int b = 0x88881111u;
113 unsigned int csll = si_sll (b);
114 unsigned int csrl = si_srl (b);
115
116 r = rosbg_si_sll (a, b);
117 if (r != (a | csll))
118 __builtin_abort ();
119 r = rosbg_si_srl (a, b);
120 if (r != (a | csrl))
121 __builtin_abort ();
122 r = rxsbg_si_sll (a, b);
123 if (r != (a ^ csll))
124 __builtin_abort ();
125 r = rxsbg_si_srl (a, b);
126 if (r != (a ^ csrl))
127 __builtin_abort ();
128 }
129 /* DIMode */
130 {
131 unsigned long long r;
132 unsigned long long a = 0x1248357997538421lu;
133 unsigned long long b = 0x8888444422221111lu;
134 unsigned long long csll = di_sll (b);
135 unsigned long long csrl = di_srl (b);
136
137 r = rosbg_di_sll (a, b);
138 if (r != (a | csll))
139 __builtin_abort ();
140 r = rosbg_di_srl (a, b);
141 if (r != (a | csrl))
142 __builtin_abort ();
143 r = rxsbg_di_sll (a, b);
144 if (r != (a ^ csll))
145 __builtin_abort ();
146 r = rxsbg_di_srl (a, b);
147 if (r != (a ^ csrl))
148 __builtin_abort ();
149 }
150 return 0;
151 }
152