xref: /llvm-project/llvm/test/CodeGen/RISCV/rv64xtheadbb.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1fc02eeb2SPhilipp Tomsich; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2fc02eeb2SPhilipp Tomsich; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
3fc02eeb2SPhilipp Tomsich; RUN:   | FileCheck %s -check-prefix=RV64I
4fc02eeb2SPhilipp Tomsich; RUN: llc -mtriple=riscv64 -mattr=+xtheadbb -verify-machineinstrs < %s \
5fc02eeb2SPhilipp Tomsich; RUN:   | FileCheck %s -check-prefix=RV64XTHEADBB
6fc02eeb2SPhilipp Tomsich
7fc02eeb2SPhilipp Tomsichdeclare i32 @llvm.ctlz.i32(i32, i1)
8fc02eeb2SPhilipp Tomsich
9fc02eeb2SPhilipp Tomsichdefine signext i32 @ctlz_i32(i32 signext %a) nounwind {
10fc02eeb2SPhilipp Tomsich; RV64I-LABEL: ctlz_i32:
11fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
12fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    beqz a0, .LBB0_2
13fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  # %bb.1: # %cond.false
14fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srliw a1, a0, 1
15fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a2, 349525
16*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a1
17*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a1, a2, 1365
18*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a2, a0, 2
19*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a2
20*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a2, a0, 4
21*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a2
22*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a2, a0, 8
23*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a2
24*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a2, a0, 16
25*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a2
26*9122c523SPengcheng Wang; RV64I-NEXT:    not a0, a0
27*9122c523SPengcheng Wang; RV64I-NEXT:    srli a2, a0, 1
28*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a2, a1
29*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 209715
30*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 819
31fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    sub a0, a0, a1
32*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a0, a2
33fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a0, a0, 2
34*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a2
35*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 61681
36*9122c523SPengcheng Wang; RV64I-NEXT:    add a0, a1, a0
37fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a1, a0, 4
38fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
39*9122c523SPengcheng Wang; RV64I-NEXT:    addi a1, a2, -241
40fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a0, a0, a1
41610b9e23SWang Pengcheng; RV64I-NEXT:    slli a1, a0, 8
42610b9e23SWang Pengcheng; RV64I-NEXT:    add a0, a0, a1
43610b9e23SWang Pengcheng; RV64I-NEXT:    slli a1, a0, 16
44610b9e23SWang Pengcheng; RV64I-NEXT:    add a0, a0, a1
45fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srliw a0, a0, 24
46fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
47fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  .LBB0_2:
48fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    li a0, 32
49fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
50fc02eeb2SPhilipp Tomsich;
51fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: ctlz_i32:
52fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
53fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    not a0, a0
54fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    slli a0, a0, 32
55fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ff0 a0, a0
56fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
57fc02eeb2SPhilipp Tomsich  %1 = call i32 @llvm.ctlz.i32(i32 %a, i1 false)
58fc02eeb2SPhilipp Tomsich  ret i32 %1
59fc02eeb2SPhilipp Tomsich}
60fc02eeb2SPhilipp Tomsich
61fc02eeb2SPhilipp Tomsichdefine signext i32 @log2_i32(i32 signext %a) nounwind {
62fc02eeb2SPhilipp Tomsich; RV64I-LABEL: log2_i32:
63fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
64fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    beqz a0, .LBB1_2
65fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  # %bb.1: # %cond.false
66fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srliw a1, a0, 1
67fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a2, 349525
68*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a1
69*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a1, a2, 1365
70*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a2, a0, 2
71*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a2
72*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a2, a0, 4
73*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a2
74*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a2, a0, 8
75*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a2
76*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a2, a0, 16
77*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a2
78*9122c523SPengcheng Wang; RV64I-NEXT:    not a0, a0
79*9122c523SPengcheng Wang; RV64I-NEXT:    srli a2, a0, 1
80*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a2, a1
81*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 209715
82*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 819
83fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    sub a0, a0, a1
84*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a0, a2
85fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a0, a0, 2
86*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a2
87*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 61681
88*9122c523SPengcheng Wang; RV64I-NEXT:    add a0, a1, a0
89fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a1, a0, 4
90fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
91*9122c523SPengcheng Wang; RV64I-NEXT:    addi a1, a2, -241
92fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a0, a0, a1
93610b9e23SWang Pengcheng; RV64I-NEXT:    slli a1, a0, 8
94610b9e23SWang Pengcheng; RV64I-NEXT:    add a0, a0, a1
95610b9e23SWang Pengcheng; RV64I-NEXT:    slli a1, a0, 16
96610b9e23SWang Pengcheng; RV64I-NEXT:    add a0, a0, a1
97fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srliw a0, a0, 24
98fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    j .LBB1_3
99fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  .LBB1_2:
100fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    li a0, 32
101fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  .LBB1_3: # %cond.end
102fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    li a1, 31
103fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    sub a0, a1, a0
104fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
105fc02eeb2SPhilipp Tomsich;
106fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: log2_i32:
107fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
108fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    not a0, a0
109fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    slli a0, a0, 32
110fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ff0 a0, a0
111fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    li a1, 31
112fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    sub a0, a1, a0
113fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
114fc02eeb2SPhilipp Tomsich  %1 = call i32 @llvm.ctlz.i32(i32 %a, i1 false)
115fc02eeb2SPhilipp Tomsich  %2 = sub i32 31, %1
116fc02eeb2SPhilipp Tomsich  ret i32 %2
117fc02eeb2SPhilipp Tomsich}
118fc02eeb2SPhilipp Tomsich
119fc02eeb2SPhilipp Tomsichdefine signext i32 @log2_ceil_i32(i32 signext %a) nounwind {
120fc02eeb2SPhilipp Tomsich; RV64I-LABEL: log2_ceil_i32:
121fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
122610b9e23SWang Pengcheng; RV64I-NEXT:    addiw a1, a0, -1
123610b9e23SWang Pengcheng; RV64I-NEXT:    li a0, 32
124610b9e23SWang Pengcheng; RV64I-NEXT:    li a2, 32
125610b9e23SWang Pengcheng; RV64I-NEXT:    beqz a1, .LBB2_2
126fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  # %bb.1: # %cond.false
127610b9e23SWang Pengcheng; RV64I-NEXT:    srliw a2, a1, 1
128610b9e23SWang Pengcheng; RV64I-NEXT:    lui a3, 349525
129*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a1, a2
130*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a3, 1365
131*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a1, 2
132*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a1, a3
133*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a1, 4
134*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a1, a3
135*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a1, 8
136*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a1, a3
137*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a1, 16
138*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a1, a3
139*9122c523SPengcheng Wang; RV64I-NEXT:    not a1, a1
140*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a1, 1
141*9122c523SPengcheng Wang; RV64I-NEXT:    and a2, a3, a2
142*9122c523SPengcheng Wang; RV64I-NEXT:    lui a3, 209715
143*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a3, a3, 819
144610b9e23SWang Pengcheng; RV64I-NEXT:    sub a1, a1, a2
145*9122c523SPengcheng Wang; RV64I-NEXT:    and a2, a1, a3
146610b9e23SWang Pengcheng; RV64I-NEXT:    srli a1, a1, 2
147*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a3
148*9122c523SPengcheng Wang; RV64I-NEXT:    lui a3, 61681
149*9122c523SPengcheng Wang; RV64I-NEXT:    add a1, a2, a1
150610b9e23SWang Pengcheng; RV64I-NEXT:    srli a2, a1, 4
151610b9e23SWang Pengcheng; RV64I-NEXT:    add a1, a1, a2
152*9122c523SPengcheng Wang; RV64I-NEXT:    addi a2, a3, -241
153610b9e23SWang Pengcheng; RV64I-NEXT:    and a1, a1, a2
154610b9e23SWang Pengcheng; RV64I-NEXT:    slli a2, a1, 8
155610b9e23SWang Pengcheng; RV64I-NEXT:    add a1, a1, a2
156610b9e23SWang Pengcheng; RV64I-NEXT:    slli a2, a1, 16
157610b9e23SWang Pengcheng; RV64I-NEXT:    add a1, a1, a2
158610b9e23SWang Pengcheng; RV64I-NEXT:    srliw a2, a1, 24
159fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  .LBB2_2: # %cond.end
160610b9e23SWang Pengcheng; RV64I-NEXT:    sub a0, a0, a2
161fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
162fc02eeb2SPhilipp Tomsich;
163fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: log2_ceil_i32:
164fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
16586240751SPhilip Reames; RV64XTHEADBB-NEXT:    addi a0, a0, -1
166fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    not a0, a0
167fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    slli a0, a0, 32
168fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ff0 a0, a0
169fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    li a1, 32
170fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    sub a0, a1, a0
171fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
172fc02eeb2SPhilipp Tomsich  %1 = sub i32 %a, 1
173fc02eeb2SPhilipp Tomsich  %2 = call i32 @llvm.ctlz.i32(i32 %1, i1 false)
174fc02eeb2SPhilipp Tomsich  %3 = sub i32 32, %2
175fc02eeb2SPhilipp Tomsich  ret i32 %3
176fc02eeb2SPhilipp Tomsich}
177fc02eeb2SPhilipp Tomsich
178fc02eeb2SPhilipp Tomsichdefine signext i32 @findLastSet_i32(i32 signext %a) nounwind {
179fc02eeb2SPhilipp Tomsich; RV64I-LABEL: findLastSet_i32:
180fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
181610b9e23SWang Pengcheng; RV64I-NEXT:    srliw a1, a0, 1
182*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 349525
183610b9e23SWang Pengcheng; RV64I-NEXT:    or a1, a0, a1
184*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 1365
185*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a1, 2
186*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a1, a3
187*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a1, 4
188*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a1, a3
189*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a1, 8
190*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a1, a3
191*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a1, 16
192*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a1, a3
193610b9e23SWang Pengcheng; RV64I-NEXT:    not a1, a1
194*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a1, 1
195*9122c523SPengcheng Wang; RV64I-NEXT:    and a2, a3, a2
196*9122c523SPengcheng Wang; RV64I-NEXT:    lui a3, 209715
197*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a3, a3, 819
198610b9e23SWang Pengcheng; RV64I-NEXT:    sub a1, a1, a2
199*9122c523SPengcheng Wang; RV64I-NEXT:    and a2, a1, a3
200610b9e23SWang Pengcheng; RV64I-NEXT:    srli a1, a1, 2
201*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a3
202*9122c523SPengcheng Wang; RV64I-NEXT:    lui a3, 61681
203*9122c523SPengcheng Wang; RV64I-NEXT:    snez a0, a0
204*9122c523SPengcheng Wang; RV64I-NEXT:    addi a3, a3, -241
205*9122c523SPengcheng Wang; RV64I-NEXT:    add a1, a2, a1
206610b9e23SWang Pengcheng; RV64I-NEXT:    srli a2, a1, 4
207610b9e23SWang Pengcheng; RV64I-NEXT:    add a1, a1, a2
208*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a3
209610b9e23SWang Pengcheng; RV64I-NEXT:    slli a2, a1, 8
210610b9e23SWang Pengcheng; RV64I-NEXT:    add a1, a1, a2
211610b9e23SWang Pengcheng; RV64I-NEXT:    slli a2, a1, 16
212610b9e23SWang Pengcheng; RV64I-NEXT:    add a1, a1, a2
213610b9e23SWang Pengcheng; RV64I-NEXT:    srliw a1, a1, 24
214610b9e23SWang Pengcheng; RV64I-NEXT:    xori a1, a1, 31
215610b9e23SWang Pengcheng; RV64I-NEXT:    addi a0, a0, -1
216610b9e23SWang Pengcheng; RV64I-NEXT:    or a0, a0, a1
217fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
218fc02eeb2SPhilipp Tomsich;
219fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: findLastSet_i32:
220fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
221fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    not a1, a0
222*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT:    snez a0, a0
223fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    slli a1, a1, 32
224fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ff0 a1, a1
225fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    xori a1, a1, 31
226fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    addi a0, a0, -1
227fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    or a0, a0, a1
228fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
229fc02eeb2SPhilipp Tomsich  %1 = call i32 @llvm.ctlz.i32(i32 %a, i1 true)
230fc02eeb2SPhilipp Tomsich  %2 = xor i32 31, %1
231fc02eeb2SPhilipp Tomsich  %3 = icmp eq i32 %a, 0
232fc02eeb2SPhilipp Tomsich  %4 = select i1 %3, i32 -1, i32 %2
233fc02eeb2SPhilipp Tomsich  ret i32 %4
234fc02eeb2SPhilipp Tomsich}
235fc02eeb2SPhilipp Tomsich
236fc02eeb2SPhilipp Tomsichdefine i32 @ctlz_lshr_i32(i32 signext %a) {
237fc02eeb2SPhilipp Tomsich; RV64I-LABEL: ctlz_lshr_i32:
238fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
239fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srliw a0, a0, 1
240fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    beqz a0, .LBB4_2
241fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  # %bb.1: # %cond.false
242fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srliw a1, a0, 1
243fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a2, 349525
244*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a1
245*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a1, a2, 1365
246*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a2, a0, 2
247*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a2
248*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a2, a0, 4
249*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a2
250*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a2, a0, 8
251*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a2
252*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a2, a0, 16
253*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a2
254*9122c523SPengcheng Wang; RV64I-NEXT:    not a0, a0
255*9122c523SPengcheng Wang; RV64I-NEXT:    srli a2, a0, 1
256*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a2, a1
257*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 209715
258*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 819
259fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    sub a0, a0, a1
260*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a0, a2
261fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a0, a0, 2
262*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a2
263*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 61681
264*9122c523SPengcheng Wang; RV64I-NEXT:    add a0, a1, a0
265fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a1, a0, 4
266fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
267*9122c523SPengcheng Wang; RV64I-NEXT:    addi a1, a2, -241
268fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a0, a0, a1
269610b9e23SWang Pengcheng; RV64I-NEXT:    slli a1, a0, 8
270610b9e23SWang Pengcheng; RV64I-NEXT:    add a0, a0, a1
271610b9e23SWang Pengcheng; RV64I-NEXT:    slli a1, a0, 16
272610b9e23SWang Pengcheng; RV64I-NEXT:    add a0, a0, a1
273fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srliw a0, a0, 24
274fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
275fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  .LBB4_2:
276fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    li a0, 32
277fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
278fc02eeb2SPhilipp Tomsich;
279fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: ctlz_lshr_i32:
280fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
281fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    srliw a0, a0, 1
282fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    not a0, a0
283fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    slli a0, a0, 32
284fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ff0 a0, a0
285fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
286fc02eeb2SPhilipp Tomsich  %1 = lshr i32 %a, 1
287fc02eeb2SPhilipp Tomsich  %2 = call i32 @llvm.ctlz.i32(i32 %1, i1 false)
288fc02eeb2SPhilipp Tomsich  ret i32 %2
289fc02eeb2SPhilipp Tomsich}
290fc02eeb2SPhilipp Tomsich
291fc02eeb2SPhilipp Tomsichdeclare i64 @llvm.ctlz.i64(i64, i1)
292fc02eeb2SPhilipp Tomsich
293fc02eeb2SPhilipp Tomsichdefine i64 @ctlz_i64(i64 %a) nounwind {
294fc02eeb2SPhilipp Tomsich; RV64I-LABEL: ctlz_i64:
295fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
296fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    beqz a0, .LBB5_2
297fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  # %bb.1: # %cond.false
298fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a1, a0, 1
2994527fba9SSergei Barannikov; RV64I-NEXT:    lui a2, 349525
300*9122c523SPengcheng Wang; RV64I-NEXT:    lui a3, 209715
301*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a1
302*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a1, a2, 1365
303*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a3, 819
304*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a0, 2
305*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a3
306*9122c523SPengcheng Wang; RV64I-NEXT:    slli a3, a1, 32
307*9122c523SPengcheng Wang; RV64I-NEXT:    add a1, a1, a3
3084527fba9SSergei Barannikov; RV64I-NEXT:    slli a3, a2, 32
3094527fba9SSergei Barannikov; RV64I-NEXT:    add a2, a2, a3
310*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a0, 4
311*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a3
312*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a0, 8
313*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a3
314*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a0, 16
315*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a3
316*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a0, 32
317*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a3
318*9122c523SPengcheng Wang; RV64I-NEXT:    not a0, a0
319*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a0, 1
320*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a3, a1
321*9122c523SPengcheng Wang; RV64I-NEXT:    lui a3, 61681
322*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a3, a3, -241
3234527fba9SSergei Barannikov; RV64I-NEXT:    sub a0, a0, a1
324*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a0, a2
3254527fba9SSergei Barannikov; RV64I-NEXT:    srli a0, a0, 2
326*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a2
327*9122c523SPengcheng Wang; RV64I-NEXT:    slli a2, a3, 32
328*9122c523SPengcheng Wang; RV64I-NEXT:    add a0, a1, a0
3294527fba9SSergei Barannikov; RV64I-NEXT:    srli a1, a0, 4
3304527fba9SSergei Barannikov; RV64I-NEXT:    add a0, a0, a1
331*9122c523SPengcheng Wang; RV64I-NEXT:    add a2, a3, a2
332*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a2
3334527fba9SSergei Barannikov; RV64I-NEXT:    slli a1, a0, 8
3344527fba9SSergei Barannikov; RV64I-NEXT:    add a0, a0, a1
3354527fba9SSergei Barannikov; RV64I-NEXT:    slli a1, a0, 16
3364527fba9SSergei Barannikov; RV64I-NEXT:    add a0, a0, a1
3374527fba9SSergei Barannikov; RV64I-NEXT:    slli a1, a0, 32
3384527fba9SSergei Barannikov; RV64I-NEXT:    add a0, a0, a1
3394527fba9SSergei Barannikov; RV64I-NEXT:    srli a0, a0, 56
340fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
341fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  .LBB5_2:
342fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    li a0, 64
343fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
344fc02eeb2SPhilipp Tomsich;
345fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: ctlz_i64:
346fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
347fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ff1 a0, a0
348fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
349fc02eeb2SPhilipp Tomsich  %1 = call i64 @llvm.ctlz.i64(i64 %a, i1 false)
350fc02eeb2SPhilipp Tomsich  ret i64 %1
351fc02eeb2SPhilipp Tomsich}
352fc02eeb2SPhilipp Tomsich
353fc02eeb2SPhilipp Tomsichdeclare i32 @llvm.cttz.i32(i32, i1)
354fc02eeb2SPhilipp Tomsich
355fc02eeb2SPhilipp Tomsichdefine signext i32 @cttz_i32(i32 signext %a) nounwind {
356fc02eeb2SPhilipp Tomsich; RV64I-LABEL: cttz_i32:
357fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
358fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    beqz a0, .LBB6_2
359fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  # %bb.1: # %cond.false
360fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi sp, sp, -16
361fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
362fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    neg a1, a0
363fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a0, a0, a1
364fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a1, 30667
365fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addiw a1, a1, 1329
366eabaee0cSFangrui Song; RV64I-NEXT:    call __muldi3
367fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srliw a0, a0, 27
368fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a1, %hi(.LCPI6_0)
369fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi a1, a1, %lo(.LCPI6_0)
370fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    add a0, a1, a0
371fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lbu a0, 0(a0)
372fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
373fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi sp, sp, 16
374fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
375fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  .LBB6_2:
376fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    li a0, 32
377fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
378fc02eeb2SPhilipp Tomsich;
379fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: cttz_i32:
380fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
381fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    beqz a0, .LBB6_2
382fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:  # %bb.1: # %cond.false
383fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    addi a1, a0, -1
384fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    not a0, a0
385fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    and a0, a0, a1
386fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ff1 a0, a0
387fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    li a1, 64
388fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    sub a0, a1, a0
389fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
390fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:  .LBB6_2:
391fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    li a0, 32
392fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
393fc02eeb2SPhilipp Tomsich  %1 = call i32 @llvm.cttz.i32(i32 %a, i1 false)
394fc02eeb2SPhilipp Tomsich  ret i32 %1
395fc02eeb2SPhilipp Tomsich}
396fc02eeb2SPhilipp Tomsich
397fc02eeb2SPhilipp Tomsichdefine signext i32 @cttz_zero_undef_i32(i32 signext %a) nounwind {
398fc02eeb2SPhilipp Tomsich; RV64I-LABEL: cttz_zero_undef_i32:
399fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
400fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi sp, sp, -16
401fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
402fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    neg a1, a0
403fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a0, a0, a1
404fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a1, 30667
405fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addiw a1, a1, 1329
406eabaee0cSFangrui Song; RV64I-NEXT:    call __muldi3
407fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srliw a0, a0, 27
408fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a1, %hi(.LCPI7_0)
409fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi a1, a1, %lo(.LCPI7_0)
410fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    add a0, a1, a0
411fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lbu a0, 0(a0)
412fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
413fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi sp, sp, 16
414fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
415fc02eeb2SPhilipp Tomsich;
416fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: cttz_zero_undef_i32:
417fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
418fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    addi a1, a0, -1
419fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    not a0, a0
420fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    and a0, a0, a1
421fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ff1 a0, a0
422fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    li a1, 64
423fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    sub a0, a1, a0
424fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
425fc02eeb2SPhilipp Tomsich  %1 = call i32 @llvm.cttz.i32(i32 %a, i1 true)
426fc02eeb2SPhilipp Tomsich  ret i32 %1
427fc02eeb2SPhilipp Tomsich}
428fc02eeb2SPhilipp Tomsich
429fc02eeb2SPhilipp Tomsichdefine signext i32 @findFirstSet_i32(i32 signext %a) nounwind {
430fc02eeb2SPhilipp Tomsich; RV64I-LABEL: findFirstSet_i32:
431fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
432fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi sp, sp, -16
433fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
434fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
435fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    mv s0, a0
436fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    neg a0, a0
437fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a0, s0, a0
438fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a1, 30667
439fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addiw a1, a1, 1329
440eabaee0cSFangrui Song; RV64I-NEXT:    call __muldi3
441fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srliw a0, a0, 27
442fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a1, %hi(.LCPI8_0)
443fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi a1, a1, %lo(.LCPI8_0)
444fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    add a0, a1, a0
445fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lbu a0, 0(a0)
446fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    snez a1, s0
447fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi a1, a1, -1
448fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    or a0, a1, a0
449fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
450fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
451fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi sp, sp, 16
452fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
453fc02eeb2SPhilipp Tomsich;
454fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: findFirstSet_i32:
455fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
456fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    addi a1, a0, -1
457fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    not a2, a0
458fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    and a1, a2, a1
459fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    li a2, 64
460fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    snez a0, a0
461*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT:    th.ff1 a1, a1
462*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT:    sub a2, a2, a1
463fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    addi a0, a0, -1
464fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    or a0, a0, a2
465fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
466fc02eeb2SPhilipp Tomsich  %1 = call i32 @llvm.cttz.i32(i32 %a, i1 true)
467fc02eeb2SPhilipp Tomsich  %2 = icmp eq i32 %a, 0
468fc02eeb2SPhilipp Tomsich  %3 = select i1 %2, i32 -1, i32 %1
469fc02eeb2SPhilipp Tomsich  ret i32 %3
470fc02eeb2SPhilipp Tomsich}
471fc02eeb2SPhilipp Tomsich
472fc02eeb2SPhilipp Tomsichdefine signext i32 @ffs_i32(i32 signext %a) nounwind {
473fc02eeb2SPhilipp Tomsich; RV64I-LABEL: ffs_i32:
474fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
475fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi sp, sp, -16
476fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
477fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
478fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    mv s0, a0
479fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    neg a0, a0
480fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a0, s0, a0
481fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a1, 30667
482fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addiw a1, a1, 1329
483eabaee0cSFangrui Song; RV64I-NEXT:    call __muldi3
484fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srliw a0, a0, 27
485fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a1, %hi(.LCPI9_0)
486fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi a1, a1, %lo(.LCPI9_0)
487fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    add a0, a1, a0
488fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lbu a0, 0(a0)
489fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    seqz a1, s0
490*9122c523SPengcheng Wang; RV64I-NEXT:    addi a0, a0, 1
491fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi a1, a1, -1
492fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a0, a1, a0
493fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
494fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
495fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi sp, sp, 16
496fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
497fc02eeb2SPhilipp Tomsich;
498fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: ffs_i32:
499fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
500fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    addi a1, a0, -1
501fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    not a2, a0
502fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    and a1, a2, a1
503fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    li a2, 65
504fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    seqz a0, a0
505*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT:    th.ff1 a1, a1
506*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT:    sub a2, a2, a1
507fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    addi a0, a0, -1
508fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    and a0, a0, a2
509fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
510fc02eeb2SPhilipp Tomsich  %1 = call i32 @llvm.cttz.i32(i32 %a, i1 true)
511fc02eeb2SPhilipp Tomsich  %2 = add i32 %1, 1
512fc02eeb2SPhilipp Tomsich  %3 = icmp eq i32 %a, 0
513fc02eeb2SPhilipp Tomsich  %4 = select i1 %3, i32 0, i32 %2
514fc02eeb2SPhilipp Tomsich  ret i32 %4
515fc02eeb2SPhilipp Tomsich}
516fc02eeb2SPhilipp Tomsich
517fc02eeb2SPhilipp Tomsichdeclare i64 @llvm.cttz.i64(i64, i1)
518fc02eeb2SPhilipp Tomsich
519fc02eeb2SPhilipp Tomsichdefine i64 @cttz_i64(i64 %a) nounwind {
520fc02eeb2SPhilipp Tomsich; RV64I-LABEL: cttz_i64:
521fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
522fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    beqz a0, .LBB10_2
523fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  # %bb.1: # %cond.false
524fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi sp, sp, -16
525fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
526fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    neg a1, a0
527fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a0, a0, a1
528fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a1, %hi(.LCPI10_0)
529fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ld a1, %lo(.LCPI10_0)(a1)
530eabaee0cSFangrui Song; RV64I-NEXT:    call __muldi3
531fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a0, a0, 58
532fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a1, %hi(.LCPI10_1)
533fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi a1, a1, %lo(.LCPI10_1)
534fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    add a0, a1, a0
535fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lbu a0, 0(a0)
536fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
537fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addi sp, sp, 16
538fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
539fc02eeb2SPhilipp Tomsich; RV64I-NEXT:  .LBB10_2:
540fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    li a0, 64
541fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
542fc02eeb2SPhilipp Tomsich;
543fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: cttz_i64:
544fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
545fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    beqz a0, .LBB10_2
546fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:  # %bb.1: # %cond.false
547fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    addi a1, a0, -1
548fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    not a0, a0
549fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    and a0, a0, a1
550fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ff1 a0, a0
551fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    li a1, 64
552fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    sub a0, a1, a0
553fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
554fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:  .LBB10_2:
555fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    li a0, 64
556fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
557fc02eeb2SPhilipp Tomsich  %1 = call i64 @llvm.cttz.i64(i64 %a, i1 false)
558fc02eeb2SPhilipp Tomsich  ret i64 %1
559fc02eeb2SPhilipp Tomsich}
560fc02eeb2SPhilipp Tomsich
56190252025SCraig Topperdefine signext i32 @sexti1_i32(i32 signext %a) nounwind {
56290252025SCraig Topper; RV64I-LABEL: sexti1_i32:
56390252025SCraig Topper; RV64I:       # %bb.0:
56490252025SCraig Topper; RV64I-NEXT:    slli a0, a0, 63
56590252025SCraig Topper; RV64I-NEXT:    srai a0, a0, 63
56690252025SCraig Topper; RV64I-NEXT:    ret
56790252025SCraig Topper;
56890252025SCraig Topper; RV64XTHEADBB-LABEL: sexti1_i32:
56990252025SCraig Topper; RV64XTHEADBB:       # %bb.0:
57090252025SCraig Topper; RV64XTHEADBB-NEXT:    th.ext a0, a0, 0, 0
57190252025SCraig Topper; RV64XTHEADBB-NEXT:    ret
57290252025SCraig Topper  %shl = shl i32 %a, 31
57390252025SCraig Topper  %shr = ashr exact i32 %shl, 31
57490252025SCraig Topper  ret i32 %shr
57590252025SCraig Topper}
57690252025SCraig Topper
57790252025SCraig Topperdefine signext i32 @sexti1_i32_2(i1 %a) nounwind {
57890252025SCraig Topper; RV64I-LABEL: sexti1_i32_2:
57990252025SCraig Topper; RV64I:       # %bb.0:
58090252025SCraig Topper; RV64I-NEXT:    slli a0, a0, 63
58190252025SCraig Topper; RV64I-NEXT:    srai a0, a0, 63
58290252025SCraig Topper; RV64I-NEXT:    ret
58390252025SCraig Topper;
58490252025SCraig Topper; RV64XTHEADBB-LABEL: sexti1_i32_2:
58590252025SCraig Topper; RV64XTHEADBB:       # %bb.0:
58690252025SCraig Topper; RV64XTHEADBB-NEXT:    th.ext a0, a0, 0, 0
58790252025SCraig Topper; RV64XTHEADBB-NEXT:    ret
58890252025SCraig Topper  %sext = sext i1 %a to i32
58990252025SCraig Topper  ret i32 %sext
59090252025SCraig Topper}
59190252025SCraig Topper
59290252025SCraig Topperdefine i64 @sexti1_i64(i64 %a) nounwind {
59390252025SCraig Topper; RV64I-LABEL: sexti1_i64:
59490252025SCraig Topper; RV64I:       # %bb.0:
59590252025SCraig Topper; RV64I-NEXT:    slli a0, a0, 63
59690252025SCraig Topper; RV64I-NEXT:    srai a0, a0, 63
59790252025SCraig Topper; RV64I-NEXT:    ret
59890252025SCraig Topper;
59990252025SCraig Topper; RV64XTHEADBB-LABEL: sexti1_i64:
60090252025SCraig Topper; RV64XTHEADBB:       # %bb.0:
60190252025SCraig Topper; RV64XTHEADBB-NEXT:    th.ext a0, a0, 0, 0
60290252025SCraig Topper; RV64XTHEADBB-NEXT:    ret
60390252025SCraig Topper  %shl = shl i64 %a, 63
60490252025SCraig Topper  %shr = ashr exact i64 %shl, 63
60590252025SCraig Topper  ret i64 %shr
60690252025SCraig Topper}
60790252025SCraig Topper
60890252025SCraig Topperdefine i64 @sexti1_i64_2(i1 %a) nounwind {
60990252025SCraig Topper; RV64I-LABEL: sexti1_i64_2:
61090252025SCraig Topper; RV64I:       # %bb.0:
61190252025SCraig Topper; RV64I-NEXT:    slli a0, a0, 63
61290252025SCraig Topper; RV64I-NEXT:    srai a0, a0, 63
61390252025SCraig Topper; RV64I-NEXT:    ret
61490252025SCraig Topper;
61590252025SCraig Topper; RV64XTHEADBB-LABEL: sexti1_i64_2:
61690252025SCraig Topper; RV64XTHEADBB:       # %bb.0:
61790252025SCraig Topper; RV64XTHEADBB-NEXT:    th.ext a0, a0, 0, 0
61890252025SCraig Topper; RV64XTHEADBB-NEXT:    ret
61990252025SCraig Topper  %sext = sext i1 %a to i64
62090252025SCraig Topper  ret i64 %sext
62190252025SCraig Topper}
62290252025SCraig Topper
623fc02eeb2SPhilipp Tomsichdefine signext i32 @sextb_i32(i32 signext %a) nounwind {
624fc02eeb2SPhilipp Tomsich; RV64I-LABEL: sextb_i32:
625fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
626fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 56
627fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srai a0, a0, 56
628fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
629fc02eeb2SPhilipp Tomsich;
630fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: sextb_i32:
631fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
632fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ext a0, a0, 7, 0
633fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
634fc02eeb2SPhilipp Tomsich  %shl = shl i32 %a, 24
635fc02eeb2SPhilipp Tomsich  %shr = ashr exact i32 %shl, 24
636fc02eeb2SPhilipp Tomsich  ret i32 %shr
637fc02eeb2SPhilipp Tomsich}
638fc02eeb2SPhilipp Tomsich
639fc02eeb2SPhilipp Tomsichdefine i64 @sextb_i64(i64 %a) nounwind {
640fc02eeb2SPhilipp Tomsich; RV64I-LABEL: sextb_i64:
641fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
642fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 56
643fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srai a0, a0, 56
644fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
645fc02eeb2SPhilipp Tomsich;
646fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: sextb_i64:
647fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
648fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ext a0, a0, 7, 0
649fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
650fc02eeb2SPhilipp Tomsich  %shl = shl i64 %a, 56
651fc02eeb2SPhilipp Tomsich  %shr = ashr exact i64 %shl, 56
652fc02eeb2SPhilipp Tomsich  ret i64 %shr
653fc02eeb2SPhilipp Tomsich}
654fc02eeb2SPhilipp Tomsich
655fc02eeb2SPhilipp Tomsichdefine signext i32 @sexth_i32(i32 signext %a) nounwind {
656fc02eeb2SPhilipp Tomsich; RV64I-LABEL: sexth_i32:
657fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
658fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 48
659fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srai a0, a0, 48
660fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
661fc02eeb2SPhilipp Tomsich;
662fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: sexth_i32:
663fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
664fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ext a0, a0, 15, 0
665fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
666fc02eeb2SPhilipp Tomsich  %shl = shl i32 %a, 16
667fc02eeb2SPhilipp Tomsich  %shr = ashr exact i32 %shl, 16
668fc02eeb2SPhilipp Tomsich  ret i32 %shr
669fc02eeb2SPhilipp Tomsich}
670fc02eeb2SPhilipp Tomsich
67110b7cd66SPhilipp Tomsichdefine signext i32 @no_sexth_i32(i32 signext %a) nounwind {
67210b7cd66SPhilipp Tomsich; RV64I-LABEL: no_sexth_i32:
67310b7cd66SPhilipp Tomsich; RV64I:       # %bb.0:
67410b7cd66SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 49
67510b7cd66SPhilipp Tomsich; RV64I-NEXT:    srai a0, a0, 48
67610b7cd66SPhilipp Tomsich; RV64I-NEXT:    ret
67710b7cd66SPhilipp Tomsich;
67810b7cd66SPhilipp Tomsich; RV64XTHEADBB-LABEL: no_sexth_i32:
67910b7cd66SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
68010b7cd66SPhilipp Tomsich; RV64XTHEADBB-NEXT:    slli a0, a0, 49
68110b7cd66SPhilipp Tomsich; RV64XTHEADBB-NEXT:    srai a0, a0, 48
68210b7cd66SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
68310b7cd66SPhilipp Tomsich  %shl = shl i32 %a, 17
68410b7cd66SPhilipp Tomsich  %shr = ashr exact i32 %shl, 16
68510b7cd66SPhilipp Tomsich  ret i32 %shr
68610b7cd66SPhilipp Tomsich}
68710b7cd66SPhilipp Tomsich
688fc02eeb2SPhilipp Tomsichdefine i64 @sexth_i64(i64 %a) nounwind {
689fc02eeb2SPhilipp Tomsich; RV64I-LABEL: sexth_i64:
690fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
691fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 48
692fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srai a0, a0, 48
693fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
694fc02eeb2SPhilipp Tomsich;
695fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: sexth_i64:
696fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
697fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.ext a0, a0, 15, 0
698fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
699fc02eeb2SPhilipp Tomsich  %shl = shl i64 %a, 48
700fc02eeb2SPhilipp Tomsich  %shr = ashr exact i64 %shl, 48
701fc02eeb2SPhilipp Tomsich  ret i64 %shr
702fc02eeb2SPhilipp Tomsich}
703fc02eeb2SPhilipp Tomsich
70410b7cd66SPhilipp Tomsichdefine i64 @no_sexth_i64(i64 %a) nounwind {
70510b7cd66SPhilipp Tomsich; RV64I-LABEL: no_sexth_i64:
70610b7cd66SPhilipp Tomsich; RV64I:       # %bb.0:
70710b7cd66SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 49
70810b7cd66SPhilipp Tomsich; RV64I-NEXT:    srai a0, a0, 48
70910b7cd66SPhilipp Tomsich; RV64I-NEXT:    ret
71010b7cd66SPhilipp Tomsich;
71110b7cd66SPhilipp Tomsich; RV64XTHEADBB-LABEL: no_sexth_i64:
71210b7cd66SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
71310b7cd66SPhilipp Tomsich; RV64XTHEADBB-NEXT:    slli a0, a0, 49
71410b7cd66SPhilipp Tomsich; RV64XTHEADBB-NEXT:    srai a0, a0, 48
71510b7cd66SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
71610b7cd66SPhilipp Tomsich  %shl = shl i64 %a, 49
71710b7cd66SPhilipp Tomsich  %shr = ashr exact i64 %shl, 48
71810b7cd66SPhilipp Tomsich  ret i64 %shr
71910b7cd66SPhilipp Tomsich}
72010b7cd66SPhilipp Tomsich
721fc02eeb2SPhilipp Tomsichdefine i32 @zexth_i32(i32 %a) nounwind {
722fc02eeb2SPhilipp Tomsich; RV64I-LABEL: zexth_i32:
723fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
724fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 48
725fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a0, a0, 48
726fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
727fc02eeb2SPhilipp Tomsich;
728fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: zexth_i32:
729fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
730fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.extu a0, a0, 15, 0
731fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
732fc02eeb2SPhilipp Tomsich  %and = and i32 %a, 65535
733fc02eeb2SPhilipp Tomsich  ret i32 %and
734fc02eeb2SPhilipp Tomsich}
735fc02eeb2SPhilipp Tomsich
736fc02eeb2SPhilipp Tomsichdefine i64 @zexth_i64(i64 %a) nounwind {
737fc02eeb2SPhilipp Tomsich; RV64I-LABEL: zexth_i64:
738fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
739fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 48
740fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a0, a0, 48
741fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
742fc02eeb2SPhilipp Tomsich;
743fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: zexth_i64:
744fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
745fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.extu a0, a0, 15, 0
746fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
747fc02eeb2SPhilipp Tomsich  %and = and i64 %a, 65535
748fc02eeb2SPhilipp Tomsich  ret i64 %and
749fc02eeb2SPhilipp Tomsich}
750fc02eeb2SPhilipp Tomsich
75110b7cd66SPhilipp Tomsichdefine i64 @zext_bf_i64(i64 %a) nounwind {
75210b7cd66SPhilipp Tomsich; RV64I-LABEL: zext_bf_i64:
75310b7cd66SPhilipp Tomsich; RV64I:       # %bb.0:
75410b7cd66SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 47
75510b7cd66SPhilipp Tomsich; RV64I-NEXT:    srli a0, a0, 48
75610b7cd66SPhilipp Tomsich; RV64I-NEXT:    ret
75710b7cd66SPhilipp Tomsich;
75810b7cd66SPhilipp Tomsich; RV64XTHEADBB-LABEL: zext_bf_i64:
75910b7cd66SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
76010b7cd66SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.extu a0, a0, 16, 1
76110b7cd66SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
76210b7cd66SPhilipp Tomsich  %1 = lshr i64 %a, 1
76310b7cd66SPhilipp Tomsich  %and = and i64 %1, 65535
76410b7cd66SPhilipp Tomsich  ret i64 %and
76510b7cd66SPhilipp Tomsich}
76610b7cd66SPhilipp Tomsich
7671900810bSWang Yaduodefine i64 @zext_bf2_i64(i64 %a) nounwind {
7681900810bSWang Yaduo; RV64I-LABEL: zext_bf2_i64:
7691900810bSWang Yaduo; RV64I:       # %bb.0:
7701900810bSWang Yaduo; RV64I-NEXT:    slli a0, a0, 48
7711900810bSWang Yaduo; RV64I-NEXT:    srli a0, a0, 49
7721900810bSWang Yaduo; RV64I-NEXT:    ret
7731900810bSWang Yaduo;
7741900810bSWang Yaduo; RV64XTHEADBB-LABEL: zext_bf2_i64:
7751900810bSWang Yaduo; RV64XTHEADBB:       # %bb.0:
7761900810bSWang Yaduo; RV64XTHEADBB-NEXT:    th.extu a0, a0, 15, 1
7771900810bSWang Yaduo; RV64XTHEADBB-NEXT:    ret
7781900810bSWang Yaduo  %t0 = and i64 %a, 65535
7791900810bSWang Yaduo  %result = lshr i64 %t0, 1
7801900810bSWang Yaduo  ret i64 %result
7811900810bSWang Yaduo}
7821900810bSWang Yaduo
78310b7cd66SPhilipp Tomsichdefine i64 @zext_i64_srliw(i64 %a) nounwind {
78410b7cd66SPhilipp Tomsich; RV64I-LABEL: zext_i64_srliw:
78510b7cd66SPhilipp Tomsich; RV64I:       # %bb.0:
78610b7cd66SPhilipp Tomsich; RV64I-NEXT:    srliw a0, a0, 16
78710b7cd66SPhilipp Tomsich; RV64I-NEXT:    ret
78810b7cd66SPhilipp Tomsich;
78910b7cd66SPhilipp Tomsich; RV64XTHEADBB-LABEL: zext_i64_srliw:
79010b7cd66SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
79110b7cd66SPhilipp Tomsich; RV64XTHEADBB-NEXT:    srliw a0, a0, 16
79210b7cd66SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
79310b7cd66SPhilipp Tomsich  %1 = lshr i64 %a, 16
79410b7cd66SPhilipp Tomsich  %and = and i64 %1, 65535
79510b7cd66SPhilipp Tomsich  ret i64 %and
79610b7cd66SPhilipp Tomsich}
79710b7cd66SPhilipp Tomsich
798fc02eeb2SPhilipp Tomsichdeclare i32 @llvm.bswap.i32(i32)
799fc02eeb2SPhilipp Tomsich
800fc02eeb2SPhilipp Tomsichdefine signext i32 @bswap_i32(i32 signext %a) nounwind {
801fc02eeb2SPhilipp Tomsich; RV64I-LABEL: bswap_i32:
802fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
803fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a1, a0, 8
804fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a2, 16
805*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a0, 24
806fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addiw a2, a2, -256
807fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a1, a1, a2
808fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a2, a0, a2
809*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a1, a3
810fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    slli a2, a2, 8
811fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    slliw a0, a0, 24
812fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    or a0, a0, a2
813fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    or a0, a0, a1
814fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
815fc02eeb2SPhilipp Tomsich;
816fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: bswap_i32:
817fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
818fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.revw a0, a0
819fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
820fc02eeb2SPhilipp Tomsich  %1 = tail call i32 @llvm.bswap.i32(i32 %a)
821fc02eeb2SPhilipp Tomsich  ret i32 %1
822fc02eeb2SPhilipp Tomsich}
823fc02eeb2SPhilipp Tomsich
824fc02eeb2SPhilipp Tomsich; Similar to bswap_i32 but the result is not sign extended.
825fc02eeb2SPhilipp Tomsichdefine void @bswap_i32_nosext(i32 signext %a, ptr %x) nounwind {
826fc02eeb2SPhilipp Tomsich; RV64I-LABEL: bswap_i32_nosext:
827fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
828fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a2, a0, 8
829fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a3, 16
830*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a4, a0, 24
83186240751SPhilip Reames; RV64I-NEXT:    addi a3, a3, -256
832fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a2, a2, a3
833fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a3, a0, a3
834*9122c523SPengcheng Wang; RV64I-NEXT:    or a2, a2, a4
835fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    slli a3, a3, 8
836fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 24
837fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    or a0, a0, a3
838fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    or a0, a0, a2
839fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    sw a0, 0(a1)
840fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
841fc02eeb2SPhilipp Tomsich;
842fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: bswap_i32_nosext:
843fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
844fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.revw a0, a0
845fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    sw a0, 0(a1)
846fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
847fc02eeb2SPhilipp Tomsich  %1 = tail call i32 @llvm.bswap.i32(i32 %a)
848fc02eeb2SPhilipp Tomsich  store i32 %1, ptr %x
849fc02eeb2SPhilipp Tomsich  ret void
850fc02eeb2SPhilipp Tomsich}
851fc02eeb2SPhilipp Tomsich
852fc02eeb2SPhilipp Tomsichdeclare i64 @llvm.bswap.i64(i64)
853fc02eeb2SPhilipp Tomsich
854fc02eeb2SPhilipp Tomsichdefine i64 @bswap_i64(i64 %a) {
855fc02eeb2SPhilipp Tomsich; RV64I-LABEL: bswap_i64:
856fc02eeb2SPhilipp Tomsich; RV64I:       # %bb.0:
857fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    srli a1, a0, 40
858fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    lui a2, 16
859*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a0, 56
860*9122c523SPengcheng Wang; RV64I-NEXT:    srli a4, a0, 24
861*9122c523SPengcheng Wang; RV64I-NEXT:    lui a5, 4080
862fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    addiw a2, a2, -256
863fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a1, a1, a2
864fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    or a1, a1, a3
865*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a0, 8
866*9122c523SPengcheng Wang; RV64I-NEXT:    and a4, a4, a5
867*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a3, 24
868*9122c523SPengcheng Wang; RV64I-NEXT:    slli a3, a3, 24
869*9122c523SPengcheng Wang; RV64I-NEXT:    or a3, a3, a4
870*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a4, a0, 24
871*9122c523SPengcheng Wang; RV64I-NEXT:    and a5, a0, a5
872fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    and a2, a0, a2
873fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 56
874*9122c523SPengcheng Wang; RV64I-NEXT:    slli a4, a4, 32
875*9122c523SPengcheng Wang; RV64I-NEXT:    slli a5, a5, 24
876*9122c523SPengcheng Wang; RV64I-NEXT:    or a4, a5, a4
877*9122c523SPengcheng Wang; RV64I-NEXT:    slli a2, a2, 40
878*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a3, a1
879fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    or a0, a0, a2
880*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a4
881fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    or a0, a0, a1
882fc02eeb2SPhilipp Tomsich; RV64I-NEXT:    ret
883fc02eeb2SPhilipp Tomsich;
884fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: bswap_i64:
885fc02eeb2SPhilipp Tomsich; RV64XTHEADBB:       # %bb.0:
886fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    th.rev a0, a0
887fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT:    ret
888fc02eeb2SPhilipp Tomsich  %1 = call i64 @llvm.bswap.i64(i64 %a)
889fc02eeb2SPhilipp Tomsich  ret i64 %1
890fc02eeb2SPhilipp Tomsich}
891