xref: /llvm-project/llvm/test/CodeGen/PowerPC/testBitReverse.ll (revision b922a3621116b404d868af8b74cab25ab78555be)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mtriple=powerpc -mcpu=ppc32 < %s | FileCheck %s --check-prefix=PPC32
3; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s
4; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s
5declare i32 @llvm.bitreverse.i32(i32)
6define i32 @testBitReverseIntrinsicI32(i32 %arg) {
7; PPC32-LABEL: testBitReverseIntrinsicI32:
8; PPC32:       # %bb.0:
9; PPC32-NEXT:    lis 4, -21846
10; PPC32-NEXT:    ori 4, 4, 43690
11; PPC32-NEXT:    slwi 5, 3, 1
12; PPC32-NEXT:    and 4, 5, 4
13; PPC32-NEXT:    lis 5, 21845
14; PPC32-NEXT:    ori 5, 5, 21845
15; PPC32-NEXT:    srwi 3, 3, 1
16; PPC32-NEXT:    and 3, 3, 5
17; PPC32-NEXT:    lis 5, -13108
18; PPC32-NEXT:    or 3, 3, 4
19; PPC32-NEXT:    ori 5, 5, 52428
20; PPC32-NEXT:    slwi 4, 3, 2
21; PPC32-NEXT:    and 4, 4, 5
22; PPC32-NEXT:    lis 5, 13107
23; PPC32-NEXT:    ori 5, 5, 13107
24; PPC32-NEXT:    srwi 3, 3, 2
25; PPC32-NEXT:    and 3, 3, 5
26; PPC32-NEXT:    lis 5, -3856
27; PPC32-NEXT:    or 3, 3, 4
28; PPC32-NEXT:    ori 5, 5, 61680
29; PPC32-NEXT:    slwi 4, 3, 4
30; PPC32-NEXT:    and 4, 4, 5
31; PPC32-NEXT:    lis 5, 3855
32; PPC32-NEXT:    ori 5, 5, 3855
33; PPC32-NEXT:    srwi 3, 3, 4
34; PPC32-NEXT:    and 3, 3, 5
35; PPC32-NEXT:    or 4, 3, 4
36; PPC32-NEXT:    rotlwi 3, 4, 24
37; PPC32-NEXT:    rlwimi 3, 4, 8, 8, 15
38; PPC32-NEXT:    rlwimi 3, 4, 8, 24, 31
39; PPC32-NEXT:    blr
40;
41; CHECK-LABEL: testBitReverseIntrinsicI32:
42; CHECK:       # %bb.0:
43; CHECK-NEXT:    lis 4, -21846
44; CHECK-NEXT:    slwi 5, 3, 1
45; CHECK-NEXT:    srwi 3, 3, 1
46; CHECK-NEXT:    ori 4, 4, 43690
47; CHECK-NEXT:    and 4, 5, 4
48; CHECK-NEXT:    lis 5, 21845
49; CHECK-NEXT:    ori 5, 5, 21845
50; CHECK-NEXT:    and 3, 3, 5
51; CHECK-NEXT:    lis 5, -13108
52; CHECK-NEXT:    or 3, 3, 4
53; CHECK-NEXT:    ori 5, 5, 52428
54; CHECK-NEXT:    slwi 4, 3, 2
55; CHECK-NEXT:    srwi 3, 3, 2
56; CHECK-NEXT:    and 4, 4, 5
57; CHECK-NEXT:    lis 5, 13107
58; CHECK-NEXT:    ori 5, 5, 13107
59; CHECK-NEXT:    and 3, 3, 5
60; CHECK-NEXT:    lis 5, -3856
61; CHECK-NEXT:    or 3, 3, 4
62; CHECK-NEXT:    ori 5, 5, 61680
63; CHECK-NEXT:    slwi 4, 3, 4
64; CHECK-NEXT:    srwi 3, 3, 4
65; CHECK-NEXT:    and 4, 4, 5
66; CHECK-NEXT:    lis 5, 3855
67; CHECK-NEXT:    ori 5, 5, 3855
68; CHECK-NEXT:    and 3, 3, 5
69; CHECK-NEXT:    or 3, 3, 4
70; CHECK-NEXT:    rotlwi 4, 3, 24
71; CHECK-NEXT:    rlwimi 4, 3, 8, 8, 15
72; CHECK-NEXT:    rlwimi 4, 3, 8, 24, 31
73; CHECK-NEXT:    rldicl 3, 4, 0, 32
74; CHECK-NEXT:    blr
75  %res = call i32 @llvm.bitreverse.i32(i32 %arg)
76  ret i32 %res
77}
78
79declare i64 @llvm.bitreverse.i64(i64)
80define i64 @testBitReverseIntrinsicI64(i64 %arg) {
81; PPC32-LABEL: testBitReverseIntrinsicI64:
82; PPC32:       # %bb.0:
83; PPC32-NEXT:    lis 5, -21846
84; PPC32-NEXT:    lis 6, 21845
85; PPC32-NEXT:    ori 5, 5, 43690
86; PPC32-NEXT:    slwi 10, 4, 1
87; PPC32-NEXT:    slwi 11, 3, 1
88; PPC32-NEXT:    ori 6, 6, 21845
89; PPC32-NEXT:    srwi 4, 4, 1
90; PPC32-NEXT:    srwi 3, 3, 1
91; PPC32-NEXT:    and 10, 10, 5
92; PPC32-NEXT:    and 5, 11, 5
93; PPC32-NEXT:    and 4, 4, 6
94; PPC32-NEXT:    and 3, 3, 6
95; PPC32-NEXT:    lis 7, -13108
96; PPC32-NEXT:    lis 8, 13107
97; PPC32-NEXT:    or 4, 4, 10
98; PPC32-NEXT:    or 3, 3, 5
99; PPC32-NEXT:    ori 7, 7, 52428
100; PPC32-NEXT:    ori 8, 8, 13107
101; PPC32-NEXT:    slwi 5, 4, 2
102; PPC32-NEXT:    srwi 4, 4, 2
103; PPC32-NEXT:    slwi 6, 3, 2
104; PPC32-NEXT:    srwi 3, 3, 2
105; PPC32-NEXT:    and 5, 5, 7
106; PPC32-NEXT:    and 4, 4, 8
107; PPC32-NEXT:    and 6, 6, 7
108; PPC32-NEXT:    and 3, 3, 8
109; PPC32-NEXT:    lis 9, -3856
110; PPC32-NEXT:    lis 11, 3855
111; PPC32-NEXT:    or 4, 4, 5
112; PPC32-NEXT:    or 3, 3, 6
113; PPC32-NEXT:    ori 9, 9, 61680
114; PPC32-NEXT:    ori 11, 11, 3855
115; PPC32-NEXT:    slwi 5, 4, 4
116; PPC32-NEXT:    srwi 4, 4, 4
117; PPC32-NEXT:    slwi 6, 3, 4
118; PPC32-NEXT:    srwi 3, 3, 4
119; PPC32-NEXT:    and 5, 5, 9
120; PPC32-NEXT:    and 4, 4, 11
121; PPC32-NEXT:    and 6, 6, 9
122; PPC32-NEXT:    and 3, 3, 11
123; PPC32-NEXT:    or 5, 4, 5
124; PPC32-NEXT:    or 6, 3, 6
125; PPC32-NEXT:    rotlwi 3, 5, 24
126; PPC32-NEXT:    rotlwi 4, 6, 24
127; PPC32-NEXT:    rlwimi 3, 5, 8, 8, 15
128; PPC32-NEXT:    rlwimi 4, 6, 8, 8, 15
129; PPC32-NEXT:    rlwimi 3, 5, 8, 24, 31
130; PPC32-NEXT:    rlwimi 4, 6, 8, 24, 31
131; PPC32-NEXT:    blr
132;
133; CHECK-LABEL: testBitReverseIntrinsicI64:
134; CHECK:       # %bb.0:
135; CHECK-NEXT:    lis 4, -21846
136; CHECK-NEXT:    sldi 5, 3, 1
137; CHECK-NEXT:    rldicl 3, 3, 63, 1
138; CHECK-NEXT:    ori 4, 4, 43690
139; CHECK-NEXT:    sldi 4, 4, 32
140; CHECK-NEXT:    oris 4, 4, 43690
141; CHECK-NEXT:    ori 4, 4, 43690
142; CHECK-NEXT:    and 4, 5, 4
143; CHECK-NEXT:    lis 5, 21845
144; CHECK-NEXT:    ori 5, 5, 21845
145; CHECK-NEXT:    sldi 5, 5, 32
146; CHECK-NEXT:    oris 5, 5, 21845
147; CHECK-NEXT:    ori 5, 5, 21845
148; CHECK-NEXT:    and 3, 3, 5
149; CHECK-NEXT:    lis 5, -13108
150; CHECK-NEXT:    ori 5, 5, 52428
151; CHECK-NEXT:    or 3, 3, 4
152; CHECK-NEXT:    sldi 5, 5, 32
153; CHECK-NEXT:    sldi 4, 3, 2
154; CHECK-NEXT:    rldicl 3, 3, 62, 2
155; CHECK-NEXT:    oris 5, 5, 52428
156; CHECK-NEXT:    ori 5, 5, 52428
157; CHECK-NEXT:    and 4, 4, 5
158; CHECK-NEXT:    lis 5, 13107
159; CHECK-NEXT:    ori 5, 5, 13107
160; CHECK-NEXT:    sldi 5, 5, 32
161; CHECK-NEXT:    oris 5, 5, 13107
162; CHECK-NEXT:    ori 5, 5, 13107
163; CHECK-NEXT:    and 3, 3, 5
164; CHECK-NEXT:    lis 5, -3856
165; CHECK-NEXT:    ori 5, 5, 61680
166; CHECK-NEXT:    or 3, 3, 4
167; CHECK-NEXT:    sldi 5, 5, 32
168; CHECK-NEXT:    sldi 4, 3, 4
169; CHECK-NEXT:    rldicl 3, 3, 60, 4
170; CHECK-NEXT:    oris 5, 5, 61680
171; CHECK-NEXT:    ori 5, 5, 61680
172; CHECK-NEXT:    and 4, 4, 5
173; CHECK-NEXT:    lis 5, 3855
174; CHECK-NEXT:    ori 5, 5, 3855
175; CHECK-NEXT:    sldi 5, 5, 32
176; CHECK-NEXT:    oris 5, 5, 3855
177; CHECK-NEXT:    ori 5, 5, 3855
178; CHECK-NEXT:    and 3, 3, 5
179; CHECK-NEXT:    or 3, 3, 4
180; CHECK-NEXT:    rldicl 4, 3, 32, 32
181; CHECK-NEXT:    rotlwi 5, 4, 24
182; CHECK-NEXT:    rlwimi 5, 4, 8, 8, 15
183; CHECK-NEXT:    rlwimi 5, 4, 8, 24, 31
184; CHECK-NEXT:    rotlwi 4, 3, 24
185; CHECK-NEXT:    rlwimi 4, 3, 8, 8, 15
186; CHECK-NEXT:    rlwimi 4, 3, 8, 24, 31
187; CHECK-NEXT:    sldi 3, 4, 32
188; CHECK-NEXT:    or 3, 3, 5
189; CHECK-NEXT:    blr
190  %res = call i64 @llvm.bitreverse.i64(i64 %arg)
191  ret i64 %res
192}
193