xref: /llvm-project/llvm/test/CodeGen/RISCV/xcvbitmanip.ll (revision 3eaed9e6f574f59d76389c055b047ef5c50afb8a)
1*3eaed9e6Smelonedo; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*3eaed9e6Smelonedo; RUN: llc -O0 -mtriple=riscv32 -mattr=+xcvbitmanip -verify-machineinstrs < %s \
3*3eaed9e6Smelonedo; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-O0
4*3eaed9e6Smelonedo; RUN: llc -O3 -mtriple=riscv32 -mattr=+xcvbitmanip -verify-machineinstrs < %s \
5*3eaed9e6Smelonedo; RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-O3
6*3eaed9e6Smelonedo
7*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.extract(i32, i32)
8*3eaed9e6Smelonedo
9*3eaed9e6Smelonedodefine i32 @test.cv.extractr(i32 %a, i32 %b) {
10*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.extractr:
11*3eaed9e6Smelonedo; CHECK:       # %bb.0:
12*3eaed9e6Smelonedo; CHECK-NEXT:    cv.extractr a0, a0, a1
13*3eaed9e6Smelonedo; CHECK-NEXT:    ret
14*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.extract(i32 %a, i32 %b)
15*3eaed9e6Smelonedo  ret i32 %1
16*3eaed9e6Smelonedo}
17*3eaed9e6Smelonedo
18*3eaed9e6Smelonedodefine i32 @test.cv.extract(i32 %a) {
19*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.extract:
20*3eaed9e6Smelonedo; CHECK:       # %bb.0:
21*3eaed9e6Smelonedo; CHECK-NEXT:    cv.extract a0, a0, 2, 1
22*3eaed9e6Smelonedo; CHECK-NEXT:    ret
23*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.extract(i32 %a, i32 65)
24*3eaed9e6Smelonedo  ret i32 %1
25*3eaed9e6Smelonedo}
26*3eaed9e6Smelonedo
27*3eaed9e6Smelonedodefine i32 @test.cv.extract1023(i32 %a) {
28*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.extract1023:
29*3eaed9e6Smelonedo; CHECK:       # %bb.0:
30*3eaed9e6Smelonedo; CHECK-NEXT:    cv.extract a0, a0, 31, 31
31*3eaed9e6Smelonedo; CHECK-NEXT:    ret
32*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.extract(i32 %a, i32 1023)
33*3eaed9e6Smelonedo  ret i32 %1
34*3eaed9e6Smelonedo}
35*3eaed9e6Smelonedo
36*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.extractu(i32, i32)
37*3eaed9e6Smelonedo
38*3eaed9e6Smelonedodefine i32 @test.cv.extractur(i32 %a, i32 %b) {
39*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.extractur:
40*3eaed9e6Smelonedo; CHECK:       # %bb.0:
41*3eaed9e6Smelonedo; CHECK-NEXT:    cv.extractur a0, a0, a1
42*3eaed9e6Smelonedo; CHECK-NEXT:    ret
43*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.extractu(i32 %a, i32 %b)
44*3eaed9e6Smelonedo  ret i32 %1
45*3eaed9e6Smelonedo}
46*3eaed9e6Smelonedo
47*3eaed9e6Smelonedodefine i32 @test.cv.extractu(i32 %a) {
48*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.extractu:
49*3eaed9e6Smelonedo; CHECK:       # %bb.0:
50*3eaed9e6Smelonedo; CHECK-NEXT:    cv.extractu a0, a0, 2, 1
51*3eaed9e6Smelonedo; CHECK-NEXT:    ret
52*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.extractu(i32 %a, i32 65)
53*3eaed9e6Smelonedo  ret i32 %1
54*3eaed9e6Smelonedo}
55*3eaed9e6Smelonedo
56*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.insert(i32, i32, i32)
57*3eaed9e6Smelonedo
58*3eaed9e6Smelonedodefine i32 @test.cv.insert(i32 %c, i32 %a) {
59*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.insert:
60*3eaed9e6Smelonedo; CHECK:       # %bb.0:
61*3eaed9e6Smelonedo; CHECK-NEXT:    cv.insert a0, a1, 2, 1
62*3eaed9e6Smelonedo; CHECK-NEXT:    ret
63*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.insert(i32 %a, i32 65, i32 %c)
64*3eaed9e6Smelonedo  ret i32 %1
65*3eaed9e6Smelonedo}
66*3eaed9e6Smelonedo
67*3eaed9e6Smelonedodefine i32 @test.cv.insertr(i32 %c, i32 %b, i32 %a) {
68*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.insertr:
69*3eaed9e6Smelonedo; CHECK:       # %bb.0:
70*3eaed9e6Smelonedo; CHECK-NEXT:    cv.insertr a0, a2, a1
71*3eaed9e6Smelonedo; CHECK-NEXT:    ret
72*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.insert(i32 %a, i32 %b, i32 %c)
73*3eaed9e6Smelonedo  ret i32 %1
74*3eaed9e6Smelonedo}
75*3eaed9e6Smelonedo
76*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.bclr(i32, i32)
77*3eaed9e6Smelonedo
78*3eaed9e6Smelonedodefine i32 @test.cv.bclrr(i32 %a, i32 %b) {
79*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.bclrr:
80*3eaed9e6Smelonedo; CHECK:       # %bb.0:
81*3eaed9e6Smelonedo; CHECK-NEXT:    cv.bclrr a0, a0, a1
82*3eaed9e6Smelonedo; CHECK-NEXT:    ret
83*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.bclr(i32 %a, i32 %b)
84*3eaed9e6Smelonedo  ret i32 %1
85*3eaed9e6Smelonedo}
86*3eaed9e6Smelonedo
87*3eaed9e6Smelonedodefine i32 @test.cv.bclr(i32 %a) {
88*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.bclr:
89*3eaed9e6Smelonedo; CHECK:       # %bb.0:
90*3eaed9e6Smelonedo; CHECK-NEXT:    cv.bclr a0, a0, 2, 1
91*3eaed9e6Smelonedo; CHECK-NEXT:    ret
92*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.bclr(i32 %a, i32 65)
93*3eaed9e6Smelonedo  ret i32 %1
94*3eaed9e6Smelonedo}
95*3eaed9e6Smelonedo
96*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.bset(i32, i32)
97*3eaed9e6Smelonedo
98*3eaed9e6Smelonedodefine i32 @test.cv.bsetr(i32 %a, i32 %b) {
99*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.bsetr:
100*3eaed9e6Smelonedo; CHECK:       # %bb.0:
101*3eaed9e6Smelonedo; CHECK-NEXT:    cv.bsetr a0, a0, a1
102*3eaed9e6Smelonedo; CHECK-NEXT:    ret
103*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.bset(i32 %a, i32 %b)
104*3eaed9e6Smelonedo  ret i32 %1
105*3eaed9e6Smelonedo}
106*3eaed9e6Smelonedo
107*3eaed9e6Smelonedodefine i32 @test.cv.bset(i32 %a) {
108*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.bset:
109*3eaed9e6Smelonedo; CHECK:       # %bb.0:
110*3eaed9e6Smelonedo; CHECK-NEXT:    cv.bset a0, a0, 2, 1
111*3eaed9e6Smelonedo; CHECK-NEXT:    ret
112*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.bset(i32 %a, i32 65)
113*3eaed9e6Smelonedo  ret i32 %1
114*3eaed9e6Smelonedo}
115*3eaed9e6Smelonedo
116*3eaed9e6Smelonedodeclare i32 @llvm.cttz.i32(i32, i1)
117*3eaed9e6Smelonedo
118*3eaed9e6Smelonedodefine i32 @test.cv.ff1(i32 %a) {
119*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.ff1:
120*3eaed9e6Smelonedo; CHECK:       # %bb.0:
121*3eaed9e6Smelonedo; CHECK-NEXT:    cv.ff1 a0, a0
122*3eaed9e6Smelonedo; CHECK-NEXT:    ret
123*3eaed9e6Smelonedo  %1 = call i32 @llvm.cttz.i32(i32 %a, i1 0)
124*3eaed9e6Smelonedo  ret i32 %1
125*3eaed9e6Smelonedo}
126*3eaed9e6Smelonedo
127*3eaed9e6Smelonedodeclare i32 @llvm.ctlz.i32(i32, i1)
128*3eaed9e6Smelonedo
129*3eaed9e6Smelonedodefine i32 @test.cv.fl1(i32 %a) {
130*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.fl1:
131*3eaed9e6Smelonedo; CHECK:       # %bb.0:
132*3eaed9e6Smelonedo; CHECK-NEXT:    cv.fl1 a0, a0
133*3eaed9e6Smelonedo; CHECK-NEXT:    ret
134*3eaed9e6Smelonedo  %1 = call i32 @llvm.ctlz.i32(i32 %a, i1 0)
135*3eaed9e6Smelonedo  ret i32 %1
136*3eaed9e6Smelonedo}
137*3eaed9e6Smelonedo
138*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.clb(i32)
139*3eaed9e6Smelonedo
140*3eaed9e6Smelonedodefine i32 @test.cv.clb(i32 %a) {
141*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.clb:
142*3eaed9e6Smelonedo; CHECK:       # %bb.0:
143*3eaed9e6Smelonedo; CHECK-NEXT:    cv.clb a0, a0
144*3eaed9e6Smelonedo; CHECK-NEXT:    ret
145*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.clb(i32 %a)
146*3eaed9e6Smelonedo  ret i32 %1
147*3eaed9e6Smelonedo}
148*3eaed9e6Smelonedo
149*3eaed9e6Smelonedodeclare i32 @llvm.ctpop(i32)
150*3eaed9e6Smelonedo
151*3eaed9e6Smelonedodefine i32 @test.cv.cnt(i32 %a) {
152*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.cnt:
153*3eaed9e6Smelonedo; CHECK:       # %bb.0:
154*3eaed9e6Smelonedo; CHECK-NEXT:    cv.cnt a0, a0
155*3eaed9e6Smelonedo; CHECK-NEXT:    ret
156*3eaed9e6Smelonedo  %1 = call i32 @llvm.ctpop(i32 %a)
157*3eaed9e6Smelonedo  ret i32 %1
158*3eaed9e6Smelonedo}
159*3eaed9e6Smelonedo
160*3eaed9e6Smelonedodeclare i32 @llvm.fshl.i32(i32, i32, i32)
161*3eaed9e6Smelonedo
162*3eaed9e6Smelonedodefine i32 @test.llvm.fshl.imm(i32 %a) {
163*3eaed9e6Smelonedo; CHECK-LABEL: test.llvm.fshl.imm:
164*3eaed9e6Smelonedo; CHECK:       # %bb.0:
165*3eaed9e6Smelonedo; CHECK-NEXT:    li a1, 30
166*3eaed9e6Smelonedo; CHECK-NEXT:    cv.ror a0, a0, a1
167*3eaed9e6Smelonedo; CHECK-NEXT:    ret
168*3eaed9e6Smelonedo  %1 = call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 2)
169*3eaed9e6Smelonedo  ret i32 %1
170*3eaed9e6Smelonedo}
171*3eaed9e6Smelonedo
172*3eaed9e6Smelonedodefine i32 @test.llvm.fshl.reg(i32 %a, i32 %b) {
173*3eaed9e6Smelonedo; CHECK-O0-LABEL: test.llvm.fshl.reg:
174*3eaed9e6Smelonedo; CHECK-O0:       # %bb.0:
175*3eaed9e6Smelonedo; CHECK-O0-NEXT:    mv a2, a1
176*3eaed9e6Smelonedo; CHECK-O0-NEXT:    li a1, 0
177*3eaed9e6Smelonedo; CHECK-O0-NEXT:    sub a1, a1, a2
178*3eaed9e6Smelonedo; CHECK-O0-NEXT:    cv.ror a0, a0, a1
179*3eaed9e6Smelonedo; CHECK-O0-NEXT:    ret
180*3eaed9e6Smelonedo;
181*3eaed9e6Smelonedo; CHECK-O3-LABEL: test.llvm.fshl.reg:
182*3eaed9e6Smelonedo; CHECK-O3:       # %bb.0:
183*3eaed9e6Smelonedo; CHECK-O3-NEXT:    neg a1, a1
184*3eaed9e6Smelonedo; CHECK-O3-NEXT:    cv.ror a0, a0, a1
185*3eaed9e6Smelonedo; CHECK-O3-NEXT:    ret
186*3eaed9e6Smelonedo  %1 = call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 %b)
187*3eaed9e6Smelonedo  ret i32 %1
188*3eaed9e6Smelonedo}
189*3eaed9e6Smelonedo
190*3eaed9e6Smelonedodeclare i32 @llvm.fshr.i32(i32, i32, i32)
191*3eaed9e6Smelonedo
192*3eaed9e6Smelonedodefine i32 @test.llvm.fshr.imm(i32 %a) {
193*3eaed9e6Smelonedo; CHECK-LABEL: test.llvm.fshr.imm:
194*3eaed9e6Smelonedo; CHECK:       # %bb.0:
195*3eaed9e6Smelonedo; CHECK-NEXT:    li a1, 2
196*3eaed9e6Smelonedo; CHECK-NEXT:    cv.ror a0, a0, a1
197*3eaed9e6Smelonedo; CHECK-NEXT:    ret
198*3eaed9e6Smelonedo  %1 = call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 2)
199*3eaed9e6Smelonedo  ret i32 %1
200*3eaed9e6Smelonedo}
201*3eaed9e6Smelonedo
202*3eaed9e6Smelonedodefine i32 @test.llvm.fshr.reg(i32 %a, i32 %b) {
203*3eaed9e6Smelonedo; CHECK-LABEL: test.llvm.fshr.reg:
204*3eaed9e6Smelonedo; CHECK:       # %bb.0:
205*3eaed9e6Smelonedo; CHECK-NEXT:    cv.ror a0, a0, a1
206*3eaed9e6Smelonedo; CHECK-NEXT:    ret
207*3eaed9e6Smelonedo  %1 = call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 %b)
208*3eaed9e6Smelonedo  ret i32 %1
209*3eaed9e6Smelonedo}
210*3eaed9e6Smelonedo
211*3eaed9e6Smelonedodeclare i32 @llvm.riscv.cv.bitmanip.bitrev(i32, i32, i32)
212*3eaed9e6Smelonedo
213*3eaed9e6Smelonedodefine i32 @test.cv.bitrev(i32 %a) {
214*3eaed9e6Smelonedo; CHECK-LABEL: test.cv.bitrev:
215*3eaed9e6Smelonedo; CHECK:       # %bb.0:
216*3eaed9e6Smelonedo; CHECK-NEXT:    cv.bitrev a0, a0, 2, 1
217*3eaed9e6Smelonedo; CHECK-NEXT:    ret
218*3eaed9e6Smelonedo  %1 = call i32 @llvm.riscv.cv.bitmanip.bitrev(i32 %a, i32 1, i32 2)
219*3eaed9e6Smelonedo  ret i32 %1
220*3eaed9e6Smelonedo}
221*3eaed9e6Smelonedo
222*3eaed9e6Smelonedodeclare i32 @llvm.bitreverse(i32)
223*3eaed9e6Smelonedo
224*3eaed9e6Smelonedodefine i32 @test.llvm.bitrev(i32 %a) {
225*3eaed9e6Smelonedo; CHECK-LABEL: test.llvm.bitrev:
226*3eaed9e6Smelonedo; CHECK:       # %bb.0:
227*3eaed9e6Smelonedo; CHECK-NEXT:    cv.bitrev a0, a0, 0, 0
228*3eaed9e6Smelonedo; CHECK-NEXT:    ret
229*3eaed9e6Smelonedo  %1 = call i32 @llvm.bitreverse(i32 %a)
230*3eaed9e6Smelonedo  ret i32 %1
231*3eaed9e6Smelonedo}
232