[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / PowerPC / ppc-rotate-clear.ll
blobf9d2c259a4c197b6e3cfb5d771f334e93b41ee62
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr8 \
3 ; RUN:   -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefixes=AIX32
4 ; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr8 \
5 ; RUN:   -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefixes=AIX64
6 ; RUN: llc -verify-machineinstrs -mtriple powerpc64-unknown-linux -mcpu=pwr8 \
7 ; RUN:   -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefixes=LINUX64BE
8 ; RUN: llc -verify-machineinstrs -mtriple powerpc64le-unknown-linux -mcpu=pwr8 \
9 ; RUN:   -ppc-asm-full-reg-names < %s | FileCheck %s --check-prefixes=LINUX64LE
11 define dso_local i64 @rotatemask32(i64 noundef %word) local_unnamed_addr #0 {
12 ; AIX32-LABEL: rotatemask32:
13 ; AIX32:       # %bb.0: # %entry
14 ; AIX32-NEXT:    cntlzw r5, r3
15 ; AIX32-NEXT:    cmplwi r3, 0
16 ; AIX32-NEXT:    cntlzw r3, r4
17 ; AIX32-NEXT:    addi r3, r3, 32
18 ; AIX32-NEXT:    iseleq r3, r3, r5
19 ; AIX32-NEXT:    rlwnm r4, r4, r3, 1, 31
20 ; AIX32-NEXT:    li r3, 0
21 ; AIX32-NEXT:    blr
23 ; AIX64-LABEL: rotatemask32:
24 ; AIX64:       # %bb.0: # %entry
25 ; AIX64-NEXT:    cntlzd r4, r3
26 ; AIX64-NEXT:    rlwnm r3, r3, r4, 1, 31
27 ; AIX64-NEXT:    blr
29 ; LINUX64BE-LABEL: rotatemask32:
30 ; LINUX64BE:       # %bb.0: # %entry
31 ; LINUX64BE-NEXT:    cntlzd r4, r3
32 ; LINUX64BE-NEXT:    rlwnm r3, r3, r4, 1, 31
33 ; LINUX64BE-NEXT:    blr
35 ; LINUX64LE-LABEL: rotatemask32:
36 ; LINUX64LE:       # %bb.0: # %entry
37 ; LINUX64LE-NEXT:    cntlzd r4, r3
38 ; LINUX64LE-NEXT:    rlwnm r3, r3, r4, 1, 31
39 ; LINUX64LE-NEXT:    blr
40 entry:
41   %0 = tail call i64 @llvm.ctlz.i64(i64 %word, i1 false)
42   %cast = trunc i64 %0 to i32
43   %conv1 = trunc i64 %word to i32
44   %1 = tail call i32 @llvm.fshl.i32(i32 %conv1, i32 %conv1, i32 %cast)
45   %2 = and i32 %1, 2147483647
46   %and = zext i32 %2 to i64
47   ret i64 %and
50 declare i64 @llvm.ctlz.i64(i64, i1 immarg) #0
51 declare i32 @llvm.fshl.i32(i32, i32, i32) #0
53 define dso_local i64 @rotatemask64(i64 noundef %word) local_unnamed_addr #0 {
54 ; AIX32-LABEL: rotatemask64:
55 ; AIX32:       # %bb.0: # %entry
56 ; AIX32-NEXT:    cmplwi r3, 0
57 ; AIX32-NEXT:    cntlzw r6, r4
58 ; AIX32-NEXT:    addi r6, r6, 32
59 ; AIX32-NEXT:    cntlzw r5, r3
60 ; AIX32-NEXT:    iseleq r5, r6, r5
61 ; AIX32-NEXT:    andi. r6, r5, 32
62 ; AIX32-NEXT:    clrlwi r5, r5, 27
63 ; AIX32-NEXT:    iseleq r6, r3, r4
64 ; AIX32-NEXT:    iseleq r3, r4, r3
65 ; AIX32-NEXT:    subfic r7, r5, 32
66 ; AIX32-NEXT:    slw r4, r3, r5
67 ; AIX32-NEXT:    srw r3, r3, r7
68 ; AIX32-NEXT:    slw r5, r6, r5
69 ; AIX32-NEXT:    srw r8, r6, r7
70 ; AIX32-NEXT:    or r3, r5, r3
71 ; AIX32-NEXT:    or r4, r4, r8
72 ; AIX32-NEXT:    clrlwi r3, r3, 1
73 ; AIX32-NEXT:    blr
75 ; AIX64-LABEL: rotatemask64:
76 ; AIX64:       # %bb.0: # %entry
77 ; AIX64-NEXT:    cntlzd r4, r3
78 ; AIX64-NEXT:    rldcl r3, r3, r4, 1
79 ; AIX64-NEXT:    blr
81 ; LINUX64BE-LABEL: rotatemask64:
82 ; LINUX64BE:       # %bb.0: # %entry
83 ; LINUX64BE-NEXT:    cntlzd r4, r3
84 ; LINUX64BE-NEXT:    rldcl r3, r3, r4, 1
85 ; LINUX64BE-NEXT:    blr
87 ; LINUX64LE-LABEL: rotatemask64:
88 ; LINUX64LE:       # %bb.0: # %entry
89 ; LINUX64LE-NEXT:    cntlzd r4, r3
90 ; LINUX64LE-NEXT:    rldcl r3, r3, r4, 1
91 ; LINUX64LE-NEXT:    blr
92 entry:
93   %0 = tail call i64 @llvm.ctlz.i64(i64 %word, i1 false)
94   %1 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %0)
95   %and = and i64 %1, 9223372036854775807
96   ret i64 %and
99 declare i64 @llvm.fshl.i64(i64, i64, i64) #1
101 define dso_local i64 @rotatemask64_2(i64 noundef %word) local_unnamed_addr #0 {
102 ; AIX32-LABEL: rotatemask64_2:
103 ; AIX32:       # %bb.0: # %entry
104 ; AIX32-NEXT:    cmplwi r3, 0
105 ; AIX32-NEXT:    cntlzw r6, r4
106 ; AIX32-NEXT:    addi r6, r6, 32
107 ; AIX32-NEXT:    cntlzw r5, r3
108 ; AIX32-NEXT:    iseleq r5, r6, r5
109 ; AIX32-NEXT:    andi. r6, r5, 32
110 ; AIX32-NEXT:    clrlwi r5, r5, 27
111 ; AIX32-NEXT:    iseleq r6, r3, r4
112 ; AIX32-NEXT:    iseleq r3, r4, r3
113 ; AIX32-NEXT:    subfic r7, r5, 32
114 ; AIX32-NEXT:    slw r4, r3, r5
115 ; AIX32-NEXT:    srw r3, r3, r7
116 ; AIX32-NEXT:    slw r5, r6, r5
117 ; AIX32-NEXT:    srw r8, r6, r7
118 ; AIX32-NEXT:    or r3, r5, r3
119 ; AIX32-NEXT:    or r4, r4, r8
120 ; AIX32-NEXT:    clrlwi r3, r3, 1
121 ; AIX32-NEXT:    blr
123 ; AIX64-LABEL: rotatemask64_2:
124 ; AIX64:       # %bb.0: # %entry
125 ; AIX64-NEXT:    cntlzd r4, r3
126 ; AIX64-NEXT:    rldcl r3, r3, r4, 1
127 ; AIX64-NEXT:    blr
129 ; LINUX64BE-LABEL: rotatemask64_2:
130 ; LINUX64BE:       # %bb.0: # %entry
131 ; LINUX64BE-NEXT:    cntlzd r4, r3
132 ; LINUX64BE-NEXT:    rldcl r3, r3, r4, 1
133 ; LINUX64BE-NEXT:    blr
135 ; LINUX64LE-LABEL: rotatemask64_2:
136 ; LINUX64LE:       # %bb.0: # %entry
137 ; LINUX64LE-NEXT:    cntlzd r4, r3
138 ; LINUX64LE-NEXT:    rldcl r3, r3, r4, 1
139 ; LINUX64LE-NEXT:    blr
140 entry:
141   %0 = tail call i64 @llvm.ctlz.i64(i64 %word, i1 false)
142   %1 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %0)
143   %and = and i64 %1, 9223372036854775807
144   ret i64 %and
147 define dso_local i64 @rotatemask64_3(i64 noundef %word) local_unnamed_addr #0 {
148 ; AIX32-LABEL: rotatemask64_3:
149 ; AIX32:       # %bb.0: # %entry
150 ; AIX32-NEXT:    cmplwi r3, 0
151 ; AIX32-NEXT:    cntlzw r6, r4
152 ; AIX32-NEXT:    addi r6, r6, 32
153 ; AIX32-NEXT:    cntlzw r5, r3
154 ; AIX32-NEXT:    iseleq r5, r6, r5
155 ; AIX32-NEXT:    andi. r6, r5, 32
156 ; AIX32-NEXT:    clrlwi r5, r5, 27
157 ; AIX32-NEXT:    iseleq r6, r3, r4
158 ; AIX32-NEXT:    iseleq r3, r4, r3
159 ; AIX32-NEXT:    subfic r7, r5, 32
160 ; AIX32-NEXT:    srw r8, r6, r7
161 ; AIX32-NEXT:    slw r4, r3, r5
162 ; AIX32-NEXT:    srw r3, r3, r7
163 ; AIX32-NEXT:    slw r5, r6, r5
164 ; AIX32-NEXT:    or r4, r4, r8
165 ; AIX32-NEXT:    or r3, r5, r3
166 ; AIX32-NEXT:    clrlwi r3, r3, 1
167 ; AIX32-NEXT:    rlwinm r4, r4, 0, 0, 23
168 ; AIX32-NEXT:    blr
170 ; AIX64-LABEL: rotatemask64_3:
171 ; AIX64:       # %bb.0: # %entry
172 ; AIX64-NEXT:    cntlzd r4, r3
173 ; AIX64-NEXT:    rotld r3, r3, r4
174 ; AIX64-NEXT:    rldicl r3, r3, 56, 8
175 ; AIX64-NEXT:    rldicl r3, r3, 8, 1
176 ; AIX64-NEXT:    blr
178 ; LINUX64BE-LABEL: rotatemask64_3:
179 ; LINUX64BE:       # %bb.0: # %entry
180 ; LINUX64BE-NEXT:    cntlzd r4, r3
181 ; LINUX64BE-NEXT:    rotld r3, r3, r4
182 ; LINUX64BE-NEXT:    rldicl r3, r3, 56, 8
183 ; LINUX64BE-NEXT:    rldicl r3, r3, 8, 1
184 ; LINUX64BE-NEXT:    blr
186 ; LINUX64LE-LABEL: rotatemask64_3:
187 ; LINUX64LE:       # %bb.0: # %entry
188 ; LINUX64LE-NEXT:    cntlzd r4, r3
189 ; LINUX64LE-NEXT:    rotld r3, r3, r4
190 ; LINUX64LE-NEXT:    rldicl r3, r3, 56, 8
191 ; LINUX64LE-NEXT:    rldicl r3, r3, 8, 1
192 ; LINUX64LE-NEXT:    blr
193 entry:
194   %0 = tail call i64 @llvm.ctlz.i64(i64 %word, i1 false)
195   %1 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %0)
196   %and = and i64 %1, 9223372036854775552
197   ret i64 %and
200 define dso_local i64 @rotatemask64_nocount(i64 noundef %word, i64 noundef %clz) local_unnamed_addr #0 {
201 ; AIX32-LABEL: rotatemask64_nocount:
202 ; AIX32:       # %bb.0: # %entry
203 ; AIX32-NEXT:    andi. r5, r6, 32
204 ; AIX32-NEXT:    clrlwi r6, r6, 27
205 ; AIX32-NEXT:    subfic r7, r6, 32
206 ; AIX32-NEXT:    iseleq r5, r3, r4
207 ; AIX32-NEXT:    iseleq r3, r4, r3
208 ; AIX32-NEXT:    srw r8, r5, r7
209 ; AIX32-NEXT:    slw r4, r3, r6
210 ; AIX32-NEXT:    srw r3, r3, r7
211 ; AIX32-NEXT:    slw r5, r5, r6
212 ; AIX32-NEXT:    or r3, r5, r3
213 ; AIX32-NEXT:    or r4, r4, r8
214 ; AIX32-NEXT:    clrlwi r3, r3, 8
215 ; AIX32-NEXT:    blr
217 ; AIX64-LABEL: rotatemask64_nocount:
218 ; AIX64:       # %bb.0: # %entry
219 ; AIX64-NEXT:    rldcl r3, r3, r4, 8
220 ; AIX64-NEXT:    blr
222 ; LINUX64BE-LABEL: rotatemask64_nocount:
223 ; LINUX64BE:       # %bb.0: # %entry
224 ; LINUX64BE-NEXT:    rldcl r3, r3, r4, 8
225 ; LINUX64BE-NEXT:    blr
227 ; LINUX64LE-LABEL: rotatemask64_nocount:
228 ; LINUX64LE:       # %bb.0: # %entry
229 ; LINUX64LE-NEXT:    rldcl r3, r3, r4, 8
230 ; LINUX64LE-NEXT:    blr
231 entry:
232   %0 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %clz)
233   %and = and i64 %0, 72057594037927935
234   ret i64 %and
237 define dso_local i64 @builtincheck(i64 noundef %word, i64 noundef %shift) local_unnamed_addr #0 {
238 ; AIX32-LABEL: builtincheck:
239 ; AIX32:       # %bb.0: # %entry
240 ; AIX32-NEXT:    andi. r5, r6, 32
241 ; AIX32-NEXT:    clrlwi r6, r6, 27
242 ; AIX32-NEXT:    subfic r7, r6, 32
243 ; AIX32-NEXT:    iseleq r5, r3, r4
244 ; AIX32-NEXT:    iseleq r3, r4, r3
245 ; AIX32-NEXT:    srw r8, r5, r7
246 ; AIX32-NEXT:    slw r4, r3, r6
247 ; AIX32-NEXT:    srw r3, r3, r7
248 ; AIX32-NEXT:    slw r5, r5, r6
249 ; AIX32-NEXT:    or r3, r5, r3
250 ; AIX32-NEXT:    or r4, r4, r8
251 ; AIX32-NEXT:    clrlwi r3, r3, 1
252 ; AIX32-NEXT:    blr
254 ; AIX64-LABEL: builtincheck:
255 ; AIX64:       # %bb.0: # %entry
256 ; AIX64-NEXT:    rldcl r3, r3, r4, 1
257 ; AIX64-NEXT:    blr
259 ; LINUX64BE-LABEL: builtincheck:
260 ; LINUX64BE:       # %bb.0: # %entry
261 ; LINUX64BE-NEXT:    rldcl r3, r3, r4, 1
262 ; LINUX64BE-NEXT:    blr
264 ; LINUX64LE-LABEL: builtincheck:
265 ; LINUX64LE:       # %bb.0: # %entry
266 ; LINUX64LE-NEXT:    rldcl r3, r3, r4, 1
267 ; LINUX64LE-NEXT:    blr
268 entry:
269   %0 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %shift)
270   %1 = and i64 %0, 9223372036854775807
271   ret i64 %1
274 define dso_local i64 @immshift(i64 noundef %word) local_unnamed_addr #0 {
275 ; AIX32-LABEL: immshift:
276 ; AIX32:       # %bb.0: # %entry
277 ; AIX32-NEXT:    rotlwi r5, r3, 15
278 ; AIX32-NEXT:    rlwimi r5, r4, 15, 0, 16
279 ; AIX32-NEXT:    srwi r4, r4, 17
280 ; AIX32-NEXT:    rlwimi r4, r3, 15, 12, 16
281 ; AIX32-NEXT:    mr r3, r4
282 ; AIX32-NEXT:    mr r4, r5
283 ; AIX32-NEXT:    blr
285 ; AIX64-LABEL: immshift:
286 ; AIX64:       # %bb.0: # %entry
287 ; AIX64-NEXT:    rldicl r3, r3, 15, 12
288 ; AIX64-NEXT:    blr
290 ; LINUX64BE-LABEL: immshift:
291 ; LINUX64BE:       # %bb.0: # %entry
292 ; LINUX64BE-NEXT:    rldicl r3, r3, 15, 12
293 ; LINUX64BE-NEXT:    blr
295 ; LINUX64LE-LABEL: immshift:
296 ; LINUX64LE:       # %bb.0: # %entry
297 ; LINUX64LE-NEXT:    rldicl r3, r3, 15, 12
298 ; LINUX64LE-NEXT:    blr
299 entry:
300   %0 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 15)
301   %and = and i64 %0, 4503599627370495
302   ret i64 %and
305 define dso_local i64 @twomasks(i64 noundef %word) local_unnamed_addr #0 {
306 ; AIX32-LABEL: twomasks:
307 ; AIX32:       # %bb.0: # %entry
308 ; AIX32-NEXT:    mflr r0
309 ; AIX32-NEXT:    stwu r1, -64(r1)
310 ; AIX32-NEXT:    cmplwi r3, 0
311 ; AIX32-NEXT:    cntlzw r6, r4
312 ; AIX32-NEXT:    stw r0, 72(r1)
313 ; AIX32-NEXT:    addi r6, r6, 32
314 ; AIX32-NEXT:    cntlzw r5, r3
315 ; AIX32-NEXT:    iseleq r5, r6, r5
316 ; AIX32-NEXT:    andi. r6, r5, 32
317 ; AIX32-NEXT:    clrlwi r5, r5, 27
318 ; AIX32-NEXT:    iseleq r6, r3, r4
319 ; AIX32-NEXT:    iseleq r3, r4, r3
320 ; AIX32-NEXT:    subfic r7, r5, 32
321 ; AIX32-NEXT:    srw r8, r6, r7
322 ; AIX32-NEXT:    slw r4, r3, r5
323 ; AIX32-NEXT:    srw r3, r3, r7
324 ; AIX32-NEXT:    slw r5, r6, r5
325 ; AIX32-NEXT:    or r4, r4, r8
326 ; AIX32-NEXT:    or r5, r5, r3
327 ; AIX32-NEXT:    clrlwi r3, r5, 1
328 ; AIX32-NEXT:    clrlwi r5, r5, 16
329 ; AIX32-NEXT:    mr r6, r4
330 ; AIX32-NEXT:    bl .callee[PR]
331 ; AIX32-NEXT:    nop
332 ; AIX32-NEXT:    addi r1, r1, 64
333 ; AIX32-NEXT:    lwz r0, 8(r1)
334 ; AIX32-NEXT:    mtlr r0
335 ; AIX32-NEXT:    blr
337 ; AIX64-LABEL: twomasks:
338 ; AIX64:       # %bb.0: # %entry
339 ; AIX64-NEXT:    mflr r0
340 ; AIX64-NEXT:    stdu r1, -112(r1)
341 ; AIX64-NEXT:    cntlzd r4, r3
342 ; AIX64-NEXT:    std r0, 128(r1)
343 ; AIX64-NEXT:    rldcl r5, r3, r4, 1
344 ; AIX64-NEXT:    rldcl r4, r3, r4, 16
345 ; AIX64-NEXT:    mr r3, r5
346 ; AIX64-NEXT:    bl .callee[PR]
347 ; AIX64-NEXT:    nop
348 ; AIX64-NEXT:    addi r1, r1, 112
349 ; AIX64-NEXT:    ld r0, 16(r1)
350 ; AIX64-NEXT:    mtlr r0
351 ; AIX64-NEXT:    blr
353 ; LINUX64BE-LABEL: twomasks:
354 ; LINUX64BE:       # %bb.0: # %entry
355 ; LINUX64BE-NEXT:    mflr r0
356 ; LINUX64BE-NEXT:    stdu r1, -112(r1)
357 ; LINUX64BE-NEXT:    cntlzd r4, r3
358 ; LINUX64BE-NEXT:    std r0, 128(r1)
359 ; LINUX64BE-NEXT:    rldcl r5, r3, r4, 1
360 ; LINUX64BE-NEXT:    rldcl r4, r3, r4, 16
361 ; LINUX64BE-NEXT:    mr r3, r5
362 ; LINUX64BE-NEXT:    bl callee
363 ; LINUX64BE-NEXT:    nop
364 ; LINUX64BE-NEXT:    addi r1, r1, 112
365 ; LINUX64BE-NEXT:    ld r0, 16(r1)
366 ; LINUX64BE-NEXT:    mtlr r0
367 ; LINUX64BE-NEXT:    blr
369 ; LINUX64LE-LABEL: twomasks:
370 ; LINUX64LE:       # %bb.0: # %entry
371 ; LINUX64LE-NEXT:    mflr r0
372 ; LINUX64LE-NEXT:    stdu r1, -32(r1)
373 ; LINUX64LE-NEXT:    cntlzd r4, r3
374 ; LINUX64LE-NEXT:    std r0, 48(r1)
375 ; LINUX64LE-NEXT:    rldcl r5, r3, r4, 1
376 ; LINUX64LE-NEXT:    rldcl r4, r3, r4, 16
377 ; LINUX64LE-NEXT:    mr r3, r5
378 ; LINUX64LE-NEXT:    bl callee
379 ; LINUX64LE-NEXT:    nop
380 ; LINUX64LE-NEXT:    addi r1, r1, 32
381 ; LINUX64LE-NEXT:    ld r0, 16(r1)
382 ; LINUX64LE-NEXT:    mtlr r0
383 ; LINUX64LE-NEXT:    blr
384 entry:
385   %0 = tail call i64 @llvm.ctlz.i64(i64 %word, i1 false)
386   %1 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %0)
387   %and = and i64 %1, 9223372036854775807
388   %and1 = and i64 %1, 281474976710655
389   %call = tail call i64 @callee(i64 noundef %and, i64 noundef %and1) #0
390   ret i64 %call
393 declare i64 @callee(i64 noundef, i64 noundef) local_unnamed_addr #0
395 define dso_local i64 @tworotates(i64 noundef %word) local_unnamed_addr #0 {
396 ; AIX32-LABEL: tworotates:
397 ; AIX32:       # %bb.0: # %entry
398 ; AIX32-NEXT:    mflr r0
399 ; AIX32-NEXT:    stwu r1, -64(r1)
400 ; AIX32-NEXT:    cmplwi r3, 0
401 ; AIX32-NEXT:    cntlzw r6, r4
402 ; AIX32-NEXT:    stw r0, 72(r1)
403 ; AIX32-NEXT:    addi r6, r6, 32
404 ; AIX32-NEXT:    cntlzw r5, r3
405 ; AIX32-NEXT:    iseleq r5, r6, r5
406 ; AIX32-NEXT:    andi. r6, r5, 32
407 ; AIX32-NEXT:    clrlwi r5, r5, 27
408 ; AIX32-NEXT:    iseleq r6, r3, r4
409 ; AIX32-NEXT:    iseleq r9, r4, r3
410 ; AIX32-NEXT:    subfic r7, r5, 32
411 ; AIX32-NEXT:    srw r8, r6, r7
412 ; AIX32-NEXT:    slw r10, r9, r5
413 ; AIX32-NEXT:    srw r7, r9, r7
414 ; AIX32-NEXT:    slw r5, r6, r5
415 ; AIX32-NEXT:    rotlwi r6, r3, 23
416 ; AIX32-NEXT:    or r5, r5, r7
417 ; AIX32-NEXT:    or r8, r10, r8
418 ; AIX32-NEXT:    rlwimi r6, r4, 23, 0, 8
419 ; AIX32-NEXT:    clrlwi r7, r5, 1
420 ; AIX32-NEXT:    srwi r5, r4, 9
421 ; AIX32-NEXT:    mr r4, r8
422 ; AIX32-NEXT:    rlwimi r5, r3, 23, 1, 8
423 ; AIX32-NEXT:    mr r3, r7
424 ; AIX32-NEXT:    bl .callee[PR]
425 ; AIX32-NEXT:    nop
426 ; AIX32-NEXT:    addi r1, r1, 64
427 ; AIX32-NEXT:    lwz r0, 8(r1)
428 ; AIX32-NEXT:    mtlr r0
429 ; AIX32-NEXT:    blr
431 ; AIX64-LABEL: tworotates:
432 ; AIX64:       # %bb.0: # %entry
433 ; AIX64-NEXT:    mflr r0
434 ; AIX64-NEXT:    stdu r1, -112(r1)
435 ; AIX64-NEXT:    cntlzd r4, r3
436 ; AIX64-NEXT:    std r0, 128(r1)
437 ; AIX64-NEXT:    rldcl r5, r3, r4, 1
438 ; AIX64-NEXT:    rldicl r4, r3, 23, 1
439 ; AIX64-NEXT:    mr r3, r5
440 ; AIX64-NEXT:    bl .callee[PR]
441 ; AIX64-NEXT:    nop
442 ; AIX64-NEXT:    addi r1, r1, 112
443 ; AIX64-NEXT:    ld r0, 16(r1)
444 ; AIX64-NEXT:    mtlr r0
445 ; AIX64-NEXT:    blr
447 ; LINUX64BE-LABEL: tworotates:
448 ; LINUX64BE:       # %bb.0: # %entry
449 ; LINUX64BE-NEXT:    mflr r0
450 ; LINUX64BE-NEXT:    stdu r1, -112(r1)
451 ; LINUX64BE-NEXT:    cntlzd r4, r3
452 ; LINUX64BE-NEXT:    std r0, 128(r1)
453 ; LINUX64BE-NEXT:    rldcl r5, r3, r4, 1
454 ; LINUX64BE-NEXT:    rldicl r4, r3, 23, 1
455 ; LINUX64BE-NEXT:    mr r3, r5
456 ; LINUX64BE-NEXT:    bl callee
457 ; LINUX64BE-NEXT:    nop
458 ; LINUX64BE-NEXT:    addi r1, r1, 112
459 ; LINUX64BE-NEXT:    ld r0, 16(r1)
460 ; LINUX64BE-NEXT:    mtlr r0
461 ; LINUX64BE-NEXT:    blr
463 ; LINUX64LE-LABEL: tworotates:
464 ; LINUX64LE:       # %bb.0: # %entry
465 ; LINUX64LE-NEXT:    mflr r0
466 ; LINUX64LE-NEXT:    stdu r1, -32(r1)
467 ; LINUX64LE-NEXT:    cntlzd r4, r3
468 ; LINUX64LE-NEXT:    std r0, 48(r1)
469 ; LINUX64LE-NEXT:    rldcl r5, r3, r4, 1
470 ; LINUX64LE-NEXT:    rldicl r4, r3, 23, 1
471 ; LINUX64LE-NEXT:    mr r3, r5
472 ; LINUX64LE-NEXT:    bl callee
473 ; LINUX64LE-NEXT:    nop
474 ; LINUX64LE-NEXT:    addi r1, r1, 32
475 ; LINUX64LE-NEXT:    ld r0, 16(r1)
476 ; LINUX64LE-NEXT:    mtlr r0
477 ; LINUX64LE-NEXT:    blr
478 entry:
479   %0 = tail call i64 @llvm.ctlz.i64(i64 %word, i1 false)
480   %1 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %0)
481   %2 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 23)
482   %and = and i64 %1, 9223372036854775807
483   %and1 = and i64 %2, 9223372036854775807
484   %call = tail call i64 @callee(i64 noundef %and, i64 noundef %and1) #0
485   ret i64 %call
488 attributes #0 = { nounwind }