TBAA: handle scalar TBAA format and struct-path aware TBAA format.
[oota-llvm.git] / test / CodeGen / SystemZ / rnsbg-01.ll
1 ; Test sequences that can use RNSBG.
2 ;
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5 ; Test a simple mask, which is a wrap-around case.
6 define i32 @f1(i32 %a, i32 %b) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: rnsbg %r2, %r3, 59, 56, 0
9 ; CHECK: br %r14
10   %orb = or i32 %b, 96
11   %and = and i32 %a, %orb
12   ret i32 %and
13 }
14
15 ; ...and again with i64.
16 define i64 @f2(i64 %a, i64 %b) {
17 ; CHECK-LABEL: f2:
18 ; CHECK: rnsbg %r2, %r3, 59, 56, 0
19 ; CHECK: br %r14
20   %orb = or i64 %b, 96
21   %and = and i64 %a, %orb
22   ret i64 %and
23 }
24
25 ; Test a case where no wraparound is needed.
26 define i32 @f3(i32 %a, i32 %b) {
27 ; CHECK-LABEL: f3:
28 ; CHECK: rnsbg %r2, %r3, 58, 61, 0
29 ; CHECK: br %r14
30   %orb = or i32 %b, -61
31   %and = and i32 %a, %orb
32   ret i32 %and
33 }
34
35 ; ...and again with i64.
36 define i64 @f4(i64 %a, i64 %b) {
37 ; CHECK-LABEL: f4:
38 ; CHECK: rnsbg %r2, %r3, 58, 61, 0
39 ; CHECK: br %r14
40   %orb = or i64 %b, -61
41   %and = and i64 %a, %orb
42   ret i64 %and
43 }
44
45 ; Test a case with just a left shift.  This can't use RNSBG.
46 define i32 @f6(i32 %a, i32 %b) {
47 ; CHECK-LABEL: f6:
48 ; CHECK: sll {{%r[0-5]}}
49 ; CHECK: nr {{%r[0-5]}}
50 ; CHECK: br %r14
51   %shrb = shl i32 %b, 20
52   %and = and i32 %a, %shrb
53   ret i32 %and
54 }
55
56 ; ...and again with i64.
57 define i64 @f7(i64 %a, i64 %b) {
58 ; CHECK-LABEL: f7:
59 ; CHECK: sllg {{%r[0-5]}}
60 ; CHECK: ngr {{%r[0-5]}}
61 ; CHECK: br %r14
62   %shrb = shl i64 %b, 20
63   %and = and i64 %a, %shrb
64   ret i64 %and
65 }
66
67 ; Test a case with just a rotate.  This can't use RNSBG.
68 define i32 @f8(i32 %a, i32 %b) {
69 ; CHECK-LABEL: f8:
70 ; CHECK: rll {{%r[0-5]}}
71 ; CHECK: nr {{%r[0-5]}}
72 ; CHECK: br %r14
73   %shlb = shl i32 %b, 22
74   %shrb = lshr i32 %b, 10
75   %rotlb = or i32 %shlb, %shrb
76   %and = and i32 %a, %rotlb
77   ret i32 %and
78 }
79
80 ; ...and again with i64, which can.
81 define i64 @f9(i64 %a, i64 %b) {
82 ; CHECK-LABEL: f9:
83 ; CHECK: rnsbg %r2, %r3, 0, 63, 44
84 ; CHECK: br %r14
85   %shlb = shl i64 %b, 44
86   %shrb = lshr i64 %b, 20
87   %rotlb = or i64 %shlb, %shrb
88   %and = and i64 %a, %rotlb
89   ret i64 %and
90 }
91
92 ; Test a case with a left shift and OR, where the OR covers all shifted bits.
93 ; We can do the whole thing using RNSBG.
94 define i32 @f10(i32 %a, i32 %b) {
95 ; CHECK-LABEL: f10:
96 ; CHECK: rnsbg %r2, %r3, 32, 56, 7
97 ; CHECK: br %r14
98   %shlb = shl i32 %b, 7
99   %orb = or i32 %shlb, 127
100   %and = and i32 %a, %orb
101   ret i32 %and
102 }
103
104 ; ...and again with i64.
105 define i64 @f11(i64 %a, i64 %b) {
106 ; CHECK-LABEL: f11:
107 ; CHECK: rnsbg %r2, %r3, 0, 56, 7
108 ; CHECK: br %r14
109   %shlb = shl i64 %b, 7
110   %orb = or i64 %shlb, 127
111   %and = and i64 %a, %orb
112   ret i64 %and
113 }
114
115 ; Test a case with a left shift and OR, where the OR doesn't cover all
116 ; shifted bits.  We can't use RNSBG for the shift, but we can for the OR
117 ; and AND.
118 define i32 @f12(i32 %a, i32 %b) {
119 ; CHECK-LABEL: f12:
120 ; CHECK: sll %r3, 7
121 ; CHECK: rnsbg %r2, %r3, 32, 57, 0
122 ; CHECK: br %r14
123   %shlb = shl i32 %b, 7
124   %orb = or i32 %shlb, 63
125   %and = and i32 %a, %orb
126   ret i32 %and
127 }
128
129 ; ...and again with i64.
130 define i64 @f13(i64 %a, i64 %b) {
131 ; CHECK-LABEL: f13:
132 ; CHECK: sllg [[REG:%r[01345]]], %r3, 7
133 ; CHECK: rnsbg %r2, [[REG]], 0, 57, 0
134 ; CHECK: br %r14
135   %shlb = shl i64 %b, 7
136   %orb = or i64 %shlb, 63
137   %and = and i64 %a, %orb
138   ret i64 %and
139 }
140
141 ; Test a case with a right shift and OR, where the OR covers all the shifted
142 ; bits.  The whole thing can be done using RNSBG.
143 define i32 @f14(i32 %a, i32 %b) {
144 ; CHECK-LABEL: f14:
145 ; CHECK: rnsbg %r2, %r3, 60, 63, 37
146 ; CHECK: br %r14
147   %shrb = lshr i32 %b, 27
148   %orb = or i32 %shrb, -16
149   %and = and i32 %a, %orb
150   ret i32 %and
151 }
152
153 ; ...and again with i64.
154 define i64 @f15(i64 %a, i64 %b) {
155 ; CHECK-LABEL: f15:
156 ; CHECK: rnsbg %r2, %r3, 60, 63, 5
157 ; CHECK: br %r14
158   %shrb = lshr i64 %b, 59
159   %orb = or i64 %shrb, -16
160   %and = and i64 %a, %orb
161   ret i64 %and
162 }
163
164 ; Test a case with a right shift and OR, where the OR doesn't cover all the
165 ; shifted bits.  The shift needs to be done separately, but the OR and AND
166 ; can use RNSBG.
167 define i32 @f16(i32 %a, i32 %b) {
168 ; CHECK-LABEL: f16:
169 ; CHECK: srl %r3, 29
170 ; CHECK: rnsbg %r2, %r3, 60, 63, 0
171 ; CHECK: br %r14
172   %shrb = lshr i32 %b, 29
173   %orb = or i32 %shrb, -16
174   %and = and i32 %a, %orb
175   ret i32 %and
176 }
177
178 ; ...and again with i64.
179 define i64 @f17(i64 %a, i64 %b) {
180 ; CHECK-LABEL: f17:
181 ; CHECK: srlg [[REG:%r[01345]]], %r3, 61
182 ; CHECK: rnsbg %r2, [[REG]], 60, 63, 0
183 ; CHECK: br %r14
184   %shrb = lshr i64 %b, 61
185   %orb = or i64 %shrb, -16
186   %and = and i64 %a, %orb
187   ret i64 %and
188 }
189
190 ; Test a combination involving an ASHR in which the sign bits matter.
191 ; We can't use RNSBG for the ASHR in that case, but we can for the rest.
192 define i32 @f18(i32 %a, i32 %b, i32 *%dest) {
193 ; CHECK-LABEL: f18:
194 ; CHECK: sra %r3, 4
195 ; CHECK: rnsbg %r2, %r3, 32, 62, 1
196 ; CHECK: br %r14
197   %ashrb = ashr i32 %b, 4
198   store i32 %ashrb, i32 *%dest
199   %shlb = shl i32 %ashrb, 1
200   %orb = or i32 %shlb, 1
201   %and = and i32 %a, %orb
202   ret i32 %and
203 }
204
205 ; ...and again with i64.
206 define i64 @f19(i64 %a, i64 %b, i64 *%dest) {
207 ; CHECK-LABEL: f19:
208 ; CHECK: srag [[REG:%r[0145]]], %r3, 34
209 ; CHECK: rnsbg %r2, [[REG]], 0, 62, 1
210 ; CHECK: br %r14
211   %ashrb = ashr i64 %b, 34
212   store i64 %ashrb, i64 *%dest
213   %shlb = shl i64 %ashrb, 1
214   %orb = or i64 %shlb, 1
215   %and = and i64 %a, %orb
216   ret i64 %and
217 }
218
219 ; Test a combination involving an ASHR in which the sign bits don't matter.
220 define i32 @f20(i32 %a, i32 %b, i32 *%dest) {
221 ; CHECK-LABEL: f20:
222 ; CHECK: rnsbg %r2, %r3, 48, 62, 48
223 ; CHECK: br %r14
224   %ashrb = ashr i32 %b, 17
225   store i32 %ashrb, i32 *%dest
226   %shlb = shl i32 %ashrb, 1
227   %orb = or i32 %shlb, -65535
228   %and = and i32 %a, %orb
229   ret i32 %and
230 }
231
232 ; ...and again with i64.
233 define i64 @f21(i64 %a, i64 %b, i64 *%dest) {
234 ; CHECK-LABEL: f21:
235 ; CHECK: rnsbg %r2, %r3, 48, 62, 16
236 ; CHECK: br %r14
237   %ashrb = ashr i64 %b, 49
238   store i64 %ashrb, i64 *%dest
239   %shlb = shl i64 %ashrb, 1
240   %orb = or i64 %shlb, -65535
241   %and = and i64 %a, %orb
242   ret i64 %and
243 }
244
245 ; Test a case with a shift, OR, and rotate where the OR covers all shifted bits.
246 define i64 @f22(i64 %a, i64 %b) {
247 ; CHECK-LABEL: f22:
248 ; CHECK: rnsbg %r2, %r3, 60, 54, 9
249 ; CHECK: br %r14
250   %shlb = shl i64 %b, 5
251   %orb = or i64 %shlb, 31
252   %shlorb = shl i64 %orb, 4
253   %shrorb = lshr i64 %orb, 60
254   %rotlorb = or i64 %shlorb, %shrorb
255   %and = and i64 %a, %rotlorb
256   ret i64 %and
257 }