xref: /llvm-project/llvm/test/CodeGen/PowerPC/rldimi.ll (revision a4558a4a53eda8d170bbd2c358d383bb0a13f91f)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 | FileCheck %s
3; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-ibm-aix -mcpu=pwr8 | FileCheck %s
4
5define i64 @rldimi1(i64 %a) {
6; CHECK-LABEL: rldimi1:
7; CHECK:       # %bb.0: # %entry
8; CHECK-NEXT:    rldimi 3, 3, 8, 0
9; CHECK-NEXT:    blr
10entry:
11  %x0 = shl i64 %a, 8
12  %x1 = and i64 %a, 255
13  %x2 = or i64 %x0, %x1
14  ret i64 %x2
15}
16
17define i64 @rldimi2(i64 %a) {
18; CHECK-LABEL: rldimi2:
19; CHECK:       # %bb.0: # %entry
20; CHECK-NEXT:    mr 4, 3
21; CHECK-NEXT:    rlwimi 4, 3, 8, 16, 23
22; CHECK-NEXT:    rlwimi 4, 3, 16, 8, 15
23; CHECK-NEXT:    rldimi 4, 3, 24, 0
24; CHECK-NEXT:    mr 3, 4
25; CHECK-NEXT:    blr
26entry:
27  %x0 = shl i64 %a, 8
28  %x1 = and i64 %a, 255
29  %x2 = or i64 %x0, %x1
30  %x3 = shl i64 %x2, 16
31  %x4 = and i64 %x2, 65535
32  %x5 = or i64 %x3, %x4
33  ret i64 %x5
34}
35
36define i64 @rldimi3(i64 %a) {
37; CHECK-LABEL: rldimi3:
38; CHECK:       # %bb.0: # %entry
39; CHECK-NEXT:    rotldi 4, 3, 32
40; CHECK-NEXT:    rlwimi 4, 3, 0, 24, 31
41; CHECK-NEXT:    rlwimi 4, 3, 8, 16, 23
42; CHECK-NEXT:    rlwimi 4, 3, 16, 8, 15
43; CHECK-NEXT:    rlwimi 4, 3, 24, 0, 7
44; CHECK-NEXT:    rldimi 4, 3, 40, 16
45; CHECK-NEXT:    rldimi 4, 3, 48, 8
46; CHECK-NEXT:    rldimi 4, 3, 56, 0
47; CHECK-NEXT:    mr 3, 4
48; CHECK-NEXT:    blr
49entry:
50  %0 = shl i64 %a, 8
51  %1 = and i64 %a, 255
52  %2 = or i64 %0, %1
53  %3 = shl i64 %2, 16
54  %4 = and i64 %2, 65535
55  %5 = or i64 %3, %4
56  %6 = shl i64 %5, 32
57  %7 = and i64 %5, 4294967295
58  %8 = or i64 %6, %7
59  ret i64 %8
60}
61
62define i64 @rldimi4(i64 %a) {
63; CHECK-LABEL: rldimi4:
64; CHECK:       # %bb.0:
65; CHECK-NEXT:    rldimi 3, 3, 8, 0
66; CHECK-NEXT:    rldimi 3, 3, 16, 0
67; CHECK-NEXT:    rldimi 3, 3, 32, 0
68; CHECK-NEXT:    blr
69  %r1 = call i64 @llvm.ppc.rldimi(i64 %a, i64 %a, i32 8, i64 -256)
70  %r2 = call i64 @llvm.ppc.rldimi(i64 %r1, i64 %r1, i32 16, i64 -65536)
71  %r3 = call i64 @llvm.ppc.rldimi(i64 %r2, i64 %r2, i32 32, i64 -4294967296)
72  ret i64 %r3
73}
74
75define i64 @rldimi5(i64 %a, i64 %b) {
76; CHECK-LABEL: rldimi5:
77; CHECK:       # %bb.0:
78; CHECK-NEXT:    rldimi 4, 3, 8, 40
79; CHECK-NEXT:    mr 3, 4
80; CHECK-NEXT:    blr
81  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 8, i64 16776960) ; 0xffff << 8
82  ret i64 %r
83}
84
85define i64 @rldimi6(i64 %a, i64 %b) {
86; CHECK-LABEL: rldimi6:
87; CHECK:       # %bb.0:
88; CHECK-NEXT:    rotldi 3, 3, 1
89; CHECK-NEXT:    rldimi 4, 3, 7, 41
90; CHECK-NEXT:    mr 3, 4
91; CHECK-NEXT:    blr
92  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 8, i64 8388480) ; 0xffff << 7
93  ret i64 %r
94}
95
96define i64 @rldimi7(i64 %a, i64 %b) {
97; CHECK-LABEL: rldimi7:
98; CHECK:       # %bb.0:
99; CHECK-NEXT:    rotldi 3, 3, 63
100; CHECK-NEXT:    rldimi 4, 3, 9, 39
101; CHECK-NEXT:    mr 3, 4
102; CHECK-NEXT:    blr
103  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 8, i64 33553920) ; 0xffff << 9
104  ret i64 %r
105}
106
107define i64 @rldimi8(i64 %a, i64 %b) {
108; CHECK-LABEL: rldimi8:
109; CHECK:       # %bb.0:
110; CHECK-NEXT:    mr 3, 4
111; CHECK-NEXT:    blr
112  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 0, i64 0)
113  ret i64 %r
114}
115
116define i64 @rldimi9(i64 %a, i64 %b) {
117; CHECK-LABEL: rldimi9:
118; CHECK:       # %bb.0:
119; CHECK-NEXT:    mr 3, 4
120; CHECK-NEXT:    blr
121  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 63, i64 0)
122  ret i64 %r
123}
124
125define i64 @rldimi10(i64 %a, i64 %b) {
126; CHECK-LABEL: rldimi10:
127; CHECK:       # %bb.0:
128; CHECK-NEXT:    blr
129  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 0, i64 -1)
130  ret i64 %r
131}
132
133define i64 @rldimi11(i64 %a, i64 %b) {
134; CHECK-LABEL: rldimi11:
135; CHECK:       # %bb.0:
136; CHECK-NEXT:    rotldi 3, 3, 8
137; CHECK-NEXT:    blr
138  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 8, i64 -1)
139  ret i64 %r
140}
141
142define i64 @rldimi12(i64 %a, i64 %b) {
143; CHECK-LABEL: rldimi12:
144; CHECK:       # %bb.0:
145; CHECK-NEXT:    rotldi 3, 3, 20
146; CHECK-NEXT:    rldimi 4, 3, 44, 31
147; CHECK-NEXT:    mr 3, 4
148; CHECK-NEXT:    blr
149  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 0, i64 18446726490113441791)
150  ret i64 %r
151}
152
153define i64 @rldimi13(i64 %a, i64 %b) {
154; CHECK-LABEL: rldimi13:
155; CHECK:       # %bb.0:
156; CHECK-NEXT:    rotldi 3, 3, 62
157; CHECK-NEXT:    rldimi 4, 3, 32, 2
158; CHECK-NEXT:    mr 3, 4
159; CHECK-NEXT:    blr
160  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 30, i64 4611686014132420608)
161  ret i64 %r
162}
163
164define i64 @rldimi14(i64 %a, i64 %b) {
165; CHECK-LABEL: rldimi14:
166; CHECK:       # %bb.0:
167; CHECK-NEXT:    rotldi 3, 3, 23
168; CHECK-NEXT:    rldimi 4, 3, 53, 0
169; CHECK-NEXT:    mr 3, 4
170; CHECK-NEXT:    blr
171  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18437736874454810624) ; mb=0, me=10
172  ret i64 %r
173}
174
175define i64 @rldimi15(i64 %a, i64 %b) {
176; CHECK-LABEL: rldimi15:
177; CHECK:       # %bb.0:
178; CHECK-NEXT:    rotldi 3, 3, 36
179; CHECK-NEXT:    rldimi 4, 3, 40, 10
180; CHECK-NEXT:    mr 3, 4
181; CHECK-NEXT:    blr
182  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18013298997854208) ; mb=10, me=23
183  ret i64 %r
184}
185
186define i64 @rldimi16(i64 %a, i64 %b) {
187; CHECK-LABEL: rldimi16:
188; CHECK:       # %bb.0:
189; CHECK-NEXT:    rotldi 3, 3, 57
190; CHECK-NEXT:    rldimi 4, 3, 19, 10
191; CHECK-NEXT:    mr 3, 4
192; CHECK-NEXT:    blr
193  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18014398508957696) ; mb=10, me=44
194  ret i64 %r
195}
196
197define i64 @rldimi17(i64 %a, i64 %b) {
198; CHECK-LABEL: rldimi17:
199; CHECK:       # %bb.0:
200; CHECK-NEXT:    rotldi 3, 3, 43
201; CHECK-NEXT:    rldimi 4, 3, 33, 25
202; CHECK-NEXT:    mr 3, 4
203; CHECK-NEXT:    blr
204  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 541165879296) ; mb=25, me=30
205  ret i64 %r
206}
207
208define i64 @rldimi18(i64 %a, i64 %b) {
209; CHECK-LABEL: rldimi18:
210; CHECK:       # %bb.0:
211; CHECK-NEXT:    rotldi 3, 3, 57
212; CHECK-NEXT:    rldimi 4, 3, 19, 25
213; CHECK-NEXT:    mr 3, 4
214; CHECK-NEXT:    blr
215  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 549755289600) ; mb=25, me=44
216  ret i64 %r
217}
218
219define i64 @rldimi19(i64 %a, i64 %b) {
220; CHECK-LABEL: rldimi19:
221; CHECK:       # %bb.0:
222; CHECK-NEXT:    rotldi 3, 3, 57
223; CHECK-NEXT:    rldimi 4, 3, 19, 33
224; CHECK-NEXT:    mr 3, 4
225; CHECK-NEXT:    blr
226  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 2146959360) ; mb=33, me=44
227  ret i64 %r
228}
229
230define i64 @rldimi20(i64 %a, i64 %b) {
231; CHECK-LABEL: rldimi20:
232; CHECK:       # %bb.0:
233; CHECK-NEXT:    rotldi 3, 3, 23
234; CHECK-NEXT:    rldimi 4, 3, 53, 15
235; CHECK-NEXT:    mr 3, 4
236; CHECK-NEXT:    blr
237  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18438299824408231935) ; mb=15, me=10
238  ret i64 %r
239}
240
241define i64 @rldimi21(i64 %a, i64 %b) {
242; CHECK-LABEL: rldimi21:
243; CHECK:       # %bb.0:
244; CHECK-NEXT:    rotldi 3, 3, 23
245; CHECK-NEXT:    rldimi 4, 3, 53, 25
246; CHECK-NEXT:    mr 3, 4
247; CHECK-NEXT:    blr
248  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18437737424210624511) ; mb=25, me=10
249  ret i64 %r
250}
251
252define i64 @rldimi22(i64 %a, i64 %b) {
253; CHECK-LABEL: rldimi22:
254; CHECK:       # %bb.0:
255; CHECK-NEXT:    rotldi 3, 3, 34
256; CHECK-NEXT:    rldimi 4, 3, 42, 25
257; CHECK-NEXT:    mr 3, 4
258; CHECK-NEXT:    blr
259  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18446740225418854399) ; mb=25, me=21
260  ret i64 %r
261}
262
263define i64 @rldimi23(i64 %a, i64 %b) {
264; CHECK-LABEL: rldimi23:
265; CHECK:       # %bb.0:
266; CHECK-NEXT:    rotldi 3, 3, 23
267; CHECK-NEXT:    rldimi 4, 3, 53, 44
268; CHECK-NEXT:    mr 3, 4
269; CHECK-NEXT:    blr
270  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18437736874455859199) ; mb=44, me=10
271  ret i64 %r
272}
273
274define i64 @rldimi24(i64 %a, i64 %b) {
275; CHECK-LABEL: rldimi24:
276; CHECK:       # %bb.0:
277; CHECK-NEXT:    rotldi 3, 3, 38
278; CHECK-NEXT:    rldimi 4, 3, 38, 44
279; CHECK-NEXT:    mr 3, 4
280; CHECK-NEXT:    blr
281  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18446743798832693247) ; mb=44, me=25
282  ret i64 %r
283}
284
285define i64 @rldimi25(i64 %a, i64 %b) {
286; CHECK-LABEL: rldimi25:
287; CHECK:       # %bb.0:
288; CHECK-NEXT:    rotldi 3, 3, 48
289; CHECK-NEXT:    rldimi 4, 3, 28, 44
290; CHECK-NEXT:    mr 3, 4
291; CHECK-NEXT:    blr
292  %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18446744073442164735) ; mb=44, me=35
293  ret i64 %r
294}
295
296declare i64 @llvm.ppc.rldimi(i64, i64, i32 immarg, i64 immarg)
297