xref: /llvm-project/llvm/test/CodeGen/PowerPC/ppc-rotate-clear.ll (revision b922a3621116b404d868af8b74cab25ab78555be)
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
10
11define 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
22;
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
28;
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
34;
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
40entry:
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
48}
49
50declare i64 @llvm.ctlz.i64(i64, i1 immarg) #0
51declare i32 @llvm.fshl.i32(i32, i32, i32) #0
52
53define 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
74;
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
80;
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
86;
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
92entry:
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
97}
98
99declare i64 @llvm.fshl.i64(i64, i64, i64) #1
100
101define 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
122;
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
128;
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
134;
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
140entry:
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
145}
146
147define 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
169;
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
177;
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
185;
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
193entry:
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
198}
199
200define 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
216;
217; AIX64-LABEL: rotatemask64_nocount:
218; AIX64:       # %bb.0: # %entry
219; AIX64-NEXT:    rldcl r3, r3, r4, 8
220; AIX64-NEXT:    blr
221;
222; LINUX64BE-LABEL: rotatemask64_nocount:
223; LINUX64BE:       # %bb.0: # %entry
224; LINUX64BE-NEXT:    rldcl r3, r3, r4, 8
225; LINUX64BE-NEXT:    blr
226;
227; LINUX64LE-LABEL: rotatemask64_nocount:
228; LINUX64LE:       # %bb.0: # %entry
229; LINUX64LE-NEXT:    rldcl r3, r3, r4, 8
230; LINUX64LE-NEXT:    blr
231entry:
232  %0 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %clz)
233  %and = and i64 %0, 72057594037927935
234  ret i64 %and
235}
236
237define 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
253;
254; AIX64-LABEL: builtincheck:
255; AIX64:       # %bb.0: # %entry
256; AIX64-NEXT:    rldcl r3, r3, r4, 1
257; AIX64-NEXT:    blr
258;
259; LINUX64BE-LABEL: builtincheck:
260; LINUX64BE:       # %bb.0: # %entry
261; LINUX64BE-NEXT:    rldcl r3, r3, r4, 1
262; LINUX64BE-NEXT:    blr
263;
264; LINUX64LE-LABEL: builtincheck:
265; LINUX64LE:       # %bb.0: # %entry
266; LINUX64LE-NEXT:    rldcl r3, r3, r4, 1
267; LINUX64LE-NEXT:    blr
268entry:
269  %0 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 %shift)
270  %1 = and i64 %0, 9223372036854775807
271  ret i64 %1
272}
273
274define 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
284;
285; AIX64-LABEL: immshift:
286; AIX64:       # %bb.0: # %entry
287; AIX64-NEXT:    rldicl r3, r3, 15, 12
288; AIX64-NEXT:    blr
289;
290; LINUX64BE-LABEL: immshift:
291; LINUX64BE:       # %bb.0: # %entry
292; LINUX64BE-NEXT:    rldicl r3, r3, 15, 12
293; LINUX64BE-NEXT:    blr
294;
295; LINUX64LE-LABEL: immshift:
296; LINUX64LE:       # %bb.0: # %entry
297; LINUX64LE-NEXT:    rldicl r3, r3, 15, 12
298; LINUX64LE-NEXT:    blr
299entry:
300  %0 = tail call i64 @llvm.fshl.i64(i64 %word, i64 %word, i64 15)
301  %and = and i64 %0, 4503599627370495
302  ret i64 %and
303}
304
305define 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
336;
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
352;
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
368;
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
384entry:
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
391}
392
393declare i64 @callee(i64 noundef, i64 noundef) local_unnamed_addr #0
394
395define 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
430;
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
446;
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
462;
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
478entry:
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
486}
487
488attributes #0 = { nounwind }
489