xref: /llvm-project/llvm/test/CodeGen/RISCV/rv32xtheadbb.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1fc02eeb2SPhilipp Tomsich; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2fc02eeb2SPhilipp Tomsich; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3fc02eeb2SPhilipp Tomsich; RUN:   | FileCheck %s -check-prefixes=RV32I
4fc02eeb2SPhilipp Tomsich; RUN: llc -mtriple=riscv32 -mattr=+xtheadbb -verify-machineinstrs < %s \
5fc02eeb2SPhilipp Tomsich; RUN:   | FileCheck %s -check-prefixes=RV32XTHEADBB
6fc02eeb2SPhilipp Tomsich
7fc02eeb2SPhilipp Tomsichdeclare i32 @llvm.ctlz.i32(i32, i1)
8fc02eeb2SPhilipp Tomsich
9fc02eeb2SPhilipp Tomsichdefine i32 @ctlz_i32(i32 %a) nounwind {
10fc02eeb2SPhilipp Tomsich; RV32I-LABEL: ctlz_i32:
11fc02eeb2SPhilipp Tomsich; RV32I:       # %bb.0:
12fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    beqz a0, .LBB0_2
13fc02eeb2SPhilipp Tomsich; RV32I-NEXT:  # %bb.1: # %cond.false
14fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srli a1, a0, 1
154527fba9SSergei Barannikov; RV32I-NEXT:    lui a2, 349525
16*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a0, a1
17*9122c523SPengcheng Wang; RV32I-NEXT:    addi a1, a2, 1365
18*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a0, 2
19*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a0, a2
20*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a0, 4
21*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a0, a2
22*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a0, 8
23*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a0, a2
24*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a0, 16
25*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a0, a2
26*9122c523SPengcheng Wang; RV32I-NEXT:    not a0, a0
27*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a0, 1
28*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a2, a1
29*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 209715
30*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 819
314527fba9SSergei Barannikov; RV32I-NEXT:    sub a0, a0, a1
32*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a0, a2
334527fba9SSergei Barannikov; RV32I-NEXT:    srli a0, a0, 2
34*9122c523SPengcheng Wang; RV32I-NEXT:    and a0, a0, a2
35*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 61681
36*9122c523SPengcheng Wang; RV32I-NEXT:    add a0, a1, a0
374527fba9SSergei Barannikov; RV32I-NEXT:    srli a1, a0, 4
384527fba9SSergei Barannikov; RV32I-NEXT:    add a0, a0, a1
39*9122c523SPengcheng Wang; RV32I-NEXT:    addi a1, a2, -241
404527fba9SSergei Barannikov; RV32I-NEXT:    and a0, a0, a1
414527fba9SSergei Barannikov; RV32I-NEXT:    slli a1, a0, 8
424527fba9SSergei Barannikov; RV32I-NEXT:    add a0, a0, a1
434527fba9SSergei Barannikov; RV32I-NEXT:    slli a1, a0, 16
444527fba9SSergei Barannikov; RV32I-NEXT:    add a0, a0, a1
454527fba9SSergei Barannikov; RV32I-NEXT:    srli a0, a0, 24
46fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
47fc02eeb2SPhilipp Tomsich; RV32I-NEXT:  .LBB0_2:
48fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    li a0, 32
49fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
50fc02eeb2SPhilipp Tomsich;
51fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: ctlz_i32:
52fc02eeb2SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
53fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.ff1 a0, a0
54fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
55fc02eeb2SPhilipp Tomsich  %1 = call i32 @llvm.ctlz.i32(i32 %a, i1 false)
56fc02eeb2SPhilipp Tomsich  ret i32 %1
57fc02eeb2SPhilipp Tomsich}
58fc02eeb2SPhilipp Tomsich
59fc02eeb2SPhilipp Tomsichdeclare i64 @llvm.ctlz.i64(i64, i1)
60fc02eeb2SPhilipp Tomsich
61fc02eeb2SPhilipp Tomsichdefine i64 @ctlz_i64(i64 %a) nounwind {
62fc02eeb2SPhilipp Tomsich; RV32I-LABEL: ctlz_i64:
63fc02eeb2SPhilipp Tomsich; RV32I:       # %bb.0:
644527fba9SSergei Barannikov; RV32I-NEXT:    lui a2, 349525
65*9122c523SPengcheng Wang; RV32I-NEXT:    lui a3, 209715
66*9122c523SPengcheng Wang; RV32I-NEXT:    lui a5, 61681
674527fba9SSergei Barannikov; RV32I-NEXT:    addi a4, a2, 1365
68*9122c523SPengcheng Wang; RV32I-NEXT:    addi a3, a3, 819
69*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a5, -241
704527fba9SSergei Barannikov; RV32I-NEXT:    bnez a1, .LBB1_2
714527fba9SSergei Barannikov; RV32I-NEXT:  # %bb.1:
7292e18ffdSSergei Barannikov; RV32I-NEXT:    srli a1, a0, 1
7392e18ffdSSergei Barannikov; RV32I-NEXT:    or a0, a0, a1
7492e18ffdSSergei Barannikov; RV32I-NEXT:    srli a1, a0, 2
7592e18ffdSSergei Barannikov; RV32I-NEXT:    or a0, a0, a1
7692e18ffdSSergei Barannikov; RV32I-NEXT:    srli a1, a0, 4
7792e18ffdSSergei Barannikov; RV32I-NEXT:    or a0, a0, a1
7892e18ffdSSergei Barannikov; RV32I-NEXT:    srli a1, a0, 8
7992e18ffdSSergei Barannikov; RV32I-NEXT:    or a0, a0, a1
8092e18ffdSSergei Barannikov; RV32I-NEXT:    srli a1, a0, 16
8192e18ffdSSergei Barannikov; RV32I-NEXT:    or a0, a0, a1
8292e18ffdSSergei Barannikov; RV32I-NEXT:    not a0, a0
834527fba9SSergei Barannikov; RV32I-NEXT:    srli a1, a0, 1
844527fba9SSergei Barannikov; RV32I-NEXT:    and a1, a1, a4
854527fba9SSergei Barannikov; RV32I-NEXT:    sub a0, a0, a1
864527fba9SSergei Barannikov; RV32I-NEXT:    and a1, a0, a3
874527fba9SSergei Barannikov; RV32I-NEXT:    srli a0, a0, 2
884527fba9SSergei Barannikov; RV32I-NEXT:    and a0, a0, a3
894527fba9SSergei Barannikov; RV32I-NEXT:    add a0, a1, a0
904527fba9SSergei Barannikov; RV32I-NEXT:    srli a1, a0, 4
914527fba9SSergei Barannikov; RV32I-NEXT:    add a0, a0, a1
924527fba9SSergei Barannikov; RV32I-NEXT:    and a0, a0, a2
934527fba9SSergei Barannikov; RV32I-NEXT:    slli a1, a0, 8
944527fba9SSergei Barannikov; RV32I-NEXT:    add a0, a0, a1
954527fba9SSergei Barannikov; RV32I-NEXT:    slli a1, a0, 16
964527fba9SSergei Barannikov; RV32I-NEXT:    add a0, a0, a1
974527fba9SSergei Barannikov; RV32I-NEXT:    srli a0, a0, 24
984527fba9SSergei Barannikov; RV32I-NEXT:    addi a0, a0, 32
994527fba9SSergei Barannikov; RV32I-NEXT:    li a1, 0
1004527fba9SSergei Barannikov; RV32I-NEXT:    ret
1014527fba9SSergei Barannikov; RV32I-NEXT:  .LBB1_2:
1024527fba9SSergei Barannikov; RV32I-NEXT:    srli a0, a1, 1
1034527fba9SSergei Barannikov; RV32I-NEXT:    or a0, a1, a0
10492e18ffdSSergei Barannikov; RV32I-NEXT:    srli a1, a0, 2
10592e18ffdSSergei Barannikov; RV32I-NEXT:    or a0, a0, a1
10692e18ffdSSergei Barannikov; RV32I-NEXT:    srli a1, a0, 4
10792e18ffdSSergei Barannikov; RV32I-NEXT:    or a0, a0, a1
10892e18ffdSSergei Barannikov; RV32I-NEXT:    srli a1, a0, 8
10992e18ffdSSergei Barannikov; RV32I-NEXT:    or a0, a0, a1
11092e18ffdSSergei Barannikov; RV32I-NEXT:    srli a1, a0, 16
11192e18ffdSSergei Barannikov; RV32I-NEXT:    or a0, a0, a1
11292e18ffdSSergei Barannikov; RV32I-NEXT:    not a0, a0
1134527fba9SSergei Barannikov; RV32I-NEXT:    srli a1, a0, 1
1144527fba9SSergei Barannikov; RV32I-NEXT:    and a1, a1, a4
1154527fba9SSergei Barannikov; RV32I-NEXT:    sub a0, a0, a1
1164527fba9SSergei Barannikov; RV32I-NEXT:    and a1, a0, a3
1174527fba9SSergei Barannikov; RV32I-NEXT:    srli a0, a0, 2
1184527fba9SSergei Barannikov; RV32I-NEXT:    and a0, a0, a3
1194527fba9SSergei Barannikov; RV32I-NEXT:    add a0, a1, a0
1204527fba9SSergei Barannikov; RV32I-NEXT:    srli a1, a0, 4
1214527fba9SSergei Barannikov; RV32I-NEXT:    add a0, a0, a1
1224527fba9SSergei Barannikov; RV32I-NEXT:    and a0, a0, a2
1234527fba9SSergei Barannikov; RV32I-NEXT:    slli a1, a0, 8
1244527fba9SSergei Barannikov; RV32I-NEXT:    add a0, a0, a1
1254527fba9SSergei Barannikov; RV32I-NEXT:    slli a1, a0, 16
1264527fba9SSergei Barannikov; RV32I-NEXT:    add a0, a0, a1
1274527fba9SSergei Barannikov; RV32I-NEXT:    srli a0, a0, 24
128fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    li a1, 0
129fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
130fc02eeb2SPhilipp Tomsich;
131fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: ctlz_i64:
132fc02eeb2SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
133fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    bnez a1, .LBB1_2
134fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:  # %bb.1:
135fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.ff1 a0, a0
136fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    addi a0, a0, 32
137fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    li a1, 0
138fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
139fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:  .LBB1_2:
140fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.ff1 a0, a1
141fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    li a1, 0
142fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
143fc02eeb2SPhilipp Tomsich  %1 = call i64 @llvm.ctlz.i64(i64 %a, i1 false)
144fc02eeb2SPhilipp Tomsich  ret i64 %1
145fc02eeb2SPhilipp Tomsich}
146fc02eeb2SPhilipp Tomsich
147fc02eeb2SPhilipp Tomsichdeclare i32 @llvm.cttz.i32(i32, i1)
148fc02eeb2SPhilipp Tomsich
149fc02eeb2SPhilipp Tomsichdefine i32 @cttz_i32(i32 %a) nounwind {
150fc02eeb2SPhilipp Tomsich; RV32I-LABEL: cttz_i32:
151fc02eeb2SPhilipp Tomsich; RV32I:       # %bb.0:
152fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    beqz a0, .LBB2_2
153fc02eeb2SPhilipp Tomsich; RV32I-NEXT:  # %bb.1: # %cond.false
154fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    addi sp, sp, -16
155fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
156fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    neg a1, a0
157fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    and a0, a0, a1
158fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lui a1, 30667
159fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    addi a1, a1, 1329
160eabaee0cSFangrui Song; RV32I-NEXT:    call __mulsi3
161fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srli a0, a0, 27
162fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lui a1, %hi(.LCPI2_0)
163fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    addi a1, a1, %lo(.LCPI2_0)
164fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    add a0, a1, a0
165fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lbu a0, 0(a0)
166fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
167fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    addi sp, sp, 16
168fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
169fc02eeb2SPhilipp Tomsich; RV32I-NEXT:  .LBB2_2:
170fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    li a0, 32
171fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
172fc02eeb2SPhilipp Tomsich;
173fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: cttz_i32:
174fc02eeb2SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
175fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    beqz a0, .LBB2_2
176fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:  # %bb.1: # %cond.false
177fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    addi a1, a0, -1
178fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    not a0, a0
179fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    and a0, a0, a1
180fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.ff1 a0, a0
181fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    li a1, 32
182fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    sub a0, a1, a0
183fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
184fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:  .LBB2_2:
185fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    li a0, 32
186fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
187fc02eeb2SPhilipp Tomsich  %1 = call i32 @llvm.cttz.i32(i32 %a, i1 false)
188fc02eeb2SPhilipp Tomsich  ret i32 %1
189fc02eeb2SPhilipp Tomsich}
190fc02eeb2SPhilipp Tomsich
191fc02eeb2SPhilipp Tomsichdeclare i64 @llvm.cttz.i64(i64, i1)
192fc02eeb2SPhilipp Tomsich
193fc02eeb2SPhilipp Tomsichdefine i64 @cttz_i64(i64 %a) nounwind {
194fc02eeb2SPhilipp Tomsich; RV32I-LABEL: cttz_i64:
195fc02eeb2SPhilipp Tomsich; RV32I:       # %bb.0:
196fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    addi sp, sp, -32
197fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
198fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
199fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
200fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
201fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
202fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    sw s4, 8(sp) # 4-byte Folded Spill
203fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    mv s2, a1
204fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    mv s0, a0
205fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    neg a0, a0
206fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    and a0, s0, a0
207fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lui a1, 30667
208fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    addi s3, a1, 1329
209fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    mv a1, s3
210eabaee0cSFangrui Song; RV32I-NEXT:    call __mulsi3
211fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    mv s1, a0
2122d00c6feSCraig Topper; RV32I-NEXT:    lui s4, %hi(.LCPI3_0)
2132d00c6feSCraig Topper; RV32I-NEXT:    addi s4, s4, %lo(.LCPI3_0)
214fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    neg a0, s2
215fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    and a0, s2, a0
216fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    mv a1, s3
217eabaee0cSFangrui Song; RV32I-NEXT:    call __mulsi3
218fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    bnez s2, .LBB3_3
219fc02eeb2SPhilipp Tomsich; RV32I-NEXT:  # %bb.1:
220fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    li a0, 32
221fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    beqz s0, .LBB3_4
222fc02eeb2SPhilipp Tomsich; RV32I-NEXT:  .LBB3_2:
223fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srli s1, s1, 27
224fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    add s1, s4, s1
225fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lbu a0, 0(s1)
226fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    j .LBB3_5
227fc02eeb2SPhilipp Tomsich; RV32I-NEXT:  .LBB3_3:
228fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srli a0, a0, 27
229fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    add a0, s4, a0
230fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lbu a0, 0(a0)
231fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    bnez s0, .LBB3_2
232fc02eeb2SPhilipp Tomsich; RV32I-NEXT:  .LBB3_4:
233fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    addi a0, a0, 32
234fc02eeb2SPhilipp Tomsich; RV32I-NEXT:  .LBB3_5:
235fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    li a1, 0
236fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
237fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
238fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
239fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
240fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
241fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lw s4, 8(sp) # 4-byte Folded Reload
242fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    addi sp, sp, 32
243fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
244fc02eeb2SPhilipp Tomsich;
245fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: cttz_i64:
246fc02eeb2SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
247fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    bnez a0, .LBB3_2
248fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:  # %bb.1:
249fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    addi a0, a1, -1
250fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    not a1, a1
251fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    and a0, a1, a0
252fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.ff1 a0, a0
253fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    li a1, 64
254fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    j .LBB3_3
255fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:  .LBB3_2:
256fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    addi a1, a0, -1
257fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    not a0, a0
258fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    and a0, a0, a1
259fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.ff1 a0, a0
260fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    li a1, 32
261fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:  .LBB3_3:
262fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    sub a0, a1, a0
263fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    li a1, 0
264fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
265fc02eeb2SPhilipp Tomsich  %1 = call i64 @llvm.cttz.i64(i64 %a, i1 false)
266fc02eeb2SPhilipp Tomsich  ret i64 %1
267fc02eeb2SPhilipp Tomsich}
268fc02eeb2SPhilipp Tomsich
26990252025SCraig Topperdefine i32 @sexti1_i32(i32 %a) nounwind {
27090252025SCraig Topper; RV32I-LABEL: sexti1_i32:
27190252025SCraig Topper; RV32I:       # %bb.0:
27290252025SCraig Topper; RV32I-NEXT:    slli a0, a0, 31
27390252025SCraig Topper; RV32I-NEXT:    srai a0, a0, 31
27490252025SCraig Topper; RV32I-NEXT:    ret
27590252025SCraig Topper;
27690252025SCraig Topper; RV32XTHEADBB-LABEL: sexti1_i32:
27790252025SCraig Topper; RV32XTHEADBB:       # %bb.0:
27890252025SCraig Topper; RV32XTHEADBB-NEXT:    th.ext a0, a0, 0, 0
27990252025SCraig Topper; RV32XTHEADBB-NEXT:    ret
28090252025SCraig Topper  %shl = shl i32 %a, 31
28190252025SCraig Topper  %shr = ashr exact i32 %shl, 31
28290252025SCraig Topper  ret i32 %shr
28390252025SCraig Topper}
28490252025SCraig Topper
28590252025SCraig Topperdefine i32 @sexti1_i32_2(i1 %a) nounwind {
28690252025SCraig Topper; RV32I-LABEL: sexti1_i32_2:
28790252025SCraig Topper; RV32I:       # %bb.0:
28890252025SCraig Topper; RV32I-NEXT:    slli a0, a0, 31
28990252025SCraig Topper; RV32I-NEXT:    srai a0, a0, 31
29090252025SCraig Topper; RV32I-NEXT:    ret
29190252025SCraig Topper;
29290252025SCraig Topper; RV32XTHEADBB-LABEL: sexti1_i32_2:
29390252025SCraig Topper; RV32XTHEADBB:       # %bb.0:
29490252025SCraig Topper; RV32XTHEADBB-NEXT:    th.ext a0, a0, 0, 0
29590252025SCraig Topper; RV32XTHEADBB-NEXT:    ret
29690252025SCraig Topper  %sext = sext i1 %a to i32
29790252025SCraig Topper  ret i32 %sext
29890252025SCraig Topper}
29990252025SCraig Topper
300fc02eeb2SPhilipp Tomsichdefine i32 @sextb_i32(i32 %a) nounwind {
301fc02eeb2SPhilipp Tomsich; RV32I-LABEL: sextb_i32:
302fc02eeb2SPhilipp Tomsich; RV32I:       # %bb.0:
303fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    slli a0, a0, 24
304fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srai a0, a0, 24
305fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
306fc02eeb2SPhilipp Tomsich;
307fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: sextb_i32:
308fc02eeb2SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
309fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.ext a0, a0, 7, 0
310fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
311fc02eeb2SPhilipp Tomsich  %shl = shl i32 %a, 24
312fc02eeb2SPhilipp Tomsich  %shr = ashr exact i32 %shl, 24
313fc02eeb2SPhilipp Tomsich  ret i32 %shr
314fc02eeb2SPhilipp Tomsich}
315fc02eeb2SPhilipp Tomsich
316fc02eeb2SPhilipp Tomsichdefine i64 @sextb_i64(i64 %a) nounwind {
317fc02eeb2SPhilipp Tomsich; RV32I-LABEL: sextb_i64:
318fc02eeb2SPhilipp Tomsich; RV32I:       # %bb.0:
319fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    slli a1, a0, 24
320fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srai a0, a1, 24
321fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srai a1, a1, 31
322fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
323fc02eeb2SPhilipp Tomsich;
324fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: sextb_i64:
325fc02eeb2SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
326fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.ext a0, a0, 7, 0
327fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    srai a1, a0, 31
328fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
329fc02eeb2SPhilipp Tomsich  %shl = shl i64 %a, 56
330fc02eeb2SPhilipp Tomsich  %shr = ashr exact i64 %shl, 56
331fc02eeb2SPhilipp Tomsich  ret i64 %shr
332fc02eeb2SPhilipp Tomsich}
333fc02eeb2SPhilipp Tomsich
334fc02eeb2SPhilipp Tomsichdefine i32 @sexth_i32(i32 %a) nounwind {
335fc02eeb2SPhilipp Tomsich; RV32I-LABEL: sexth_i32:
336fc02eeb2SPhilipp Tomsich; RV32I:       # %bb.0:
337fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    slli a0, a0, 16
338fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srai a0, a0, 16
339fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
340fc02eeb2SPhilipp Tomsich;
341fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: sexth_i32:
342fc02eeb2SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
343fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.ext a0, a0, 15, 0
344fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
345fc02eeb2SPhilipp Tomsich  %shl = shl i32 %a, 16
346fc02eeb2SPhilipp Tomsich  %shr = ashr exact i32 %shl, 16
347fc02eeb2SPhilipp Tomsich  ret i32 %shr
348fc02eeb2SPhilipp Tomsich}
349fc02eeb2SPhilipp Tomsich
35010b7cd66SPhilipp Tomsichdefine i32 @no_sexth_i32(i32 %a) nounwind {
35110b7cd66SPhilipp Tomsich; RV32I-LABEL: no_sexth_i32:
35210b7cd66SPhilipp Tomsich; RV32I:       # %bb.0:
35310b7cd66SPhilipp Tomsich; RV32I-NEXT:    slli a0, a0, 17
35410b7cd66SPhilipp Tomsich; RV32I-NEXT:    srai a0, a0, 16
35510b7cd66SPhilipp Tomsich; RV32I-NEXT:    ret
35610b7cd66SPhilipp Tomsich;
35710b7cd66SPhilipp Tomsich; RV32XTHEADBB-LABEL: no_sexth_i32:
35810b7cd66SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
35910b7cd66SPhilipp Tomsich; RV32XTHEADBB-NEXT:    slli a0, a0, 17
36010b7cd66SPhilipp Tomsich; RV32XTHEADBB-NEXT:    srai a0, a0, 16
36110b7cd66SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
36210b7cd66SPhilipp Tomsich  %shl = shl i32 %a, 17
36310b7cd66SPhilipp Tomsich  %shr = ashr exact i32 %shl, 16
36410b7cd66SPhilipp Tomsich  ret i32 %shr
36510b7cd66SPhilipp Tomsich}
36610b7cd66SPhilipp Tomsich
367fc02eeb2SPhilipp Tomsichdefine i64 @sexth_i64(i64 %a) nounwind {
368fc02eeb2SPhilipp Tomsich; RV32I-LABEL: sexth_i64:
369fc02eeb2SPhilipp Tomsich; RV32I:       # %bb.0:
370fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    slli a1, a0, 16
371fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srai a0, a1, 16
372fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srai a1, a1, 31
373fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
374fc02eeb2SPhilipp Tomsich;
375fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: sexth_i64:
376fc02eeb2SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
377fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.ext a0, a0, 15, 0
378fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    srai a1, a0, 31
379fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
380fc02eeb2SPhilipp Tomsich  %shl = shl i64 %a, 48
381fc02eeb2SPhilipp Tomsich  %shr = ashr exact i64 %shl, 48
382fc02eeb2SPhilipp Tomsich  ret i64 %shr
383fc02eeb2SPhilipp Tomsich}
384fc02eeb2SPhilipp Tomsich
38510b7cd66SPhilipp Tomsichdefine i64 @no_sexth_i64(i64 %a) nounwind {
38610b7cd66SPhilipp Tomsich; RV32I-LABEL: no_sexth_i64:
38710b7cd66SPhilipp Tomsich; RV32I:       # %bb.0:
38810b7cd66SPhilipp Tomsich; RV32I-NEXT:    slli a1, a0, 17
38910b7cd66SPhilipp Tomsich; RV32I-NEXT:    srai a0, a1, 16
39010b7cd66SPhilipp Tomsich; RV32I-NEXT:    srai a1, a1, 31
39110b7cd66SPhilipp Tomsich; RV32I-NEXT:    ret
39210b7cd66SPhilipp Tomsich;
39310b7cd66SPhilipp Tomsich; RV32XTHEADBB-LABEL: no_sexth_i64:
39410b7cd66SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
39510b7cd66SPhilipp Tomsich; RV32XTHEADBB-NEXT:    slli a1, a0, 17
39610b7cd66SPhilipp Tomsich; RV32XTHEADBB-NEXT:    srai a0, a1, 16
39710b7cd66SPhilipp Tomsich; RV32XTHEADBB-NEXT:    srai a1, a1, 31
39810b7cd66SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
39910b7cd66SPhilipp Tomsich  %shl = shl i64 %a, 49
40010b7cd66SPhilipp Tomsich  %shr = ashr exact i64 %shl, 48
40110b7cd66SPhilipp Tomsich  ret i64 %shr
40210b7cd66SPhilipp Tomsich}
40310b7cd66SPhilipp Tomsich
404fc02eeb2SPhilipp Tomsichdefine i32 @zexth_i32(i32 %a) nounwind {
405fc02eeb2SPhilipp Tomsich; RV32I-LABEL: zexth_i32:
406fc02eeb2SPhilipp Tomsich; RV32I:       # %bb.0:
407fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    slli a0, a0, 16
408fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srli a0, a0, 16
409fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
410fc02eeb2SPhilipp Tomsich;
411fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: zexth_i32:
412fc02eeb2SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
413fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.extu a0, a0, 15, 0
414fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
415fc02eeb2SPhilipp Tomsich  %and = and i32 %a, 65535
416fc02eeb2SPhilipp Tomsich  ret i32 %and
417fc02eeb2SPhilipp Tomsich}
418fc02eeb2SPhilipp Tomsich
419fc02eeb2SPhilipp Tomsichdefine i64 @zexth_i64(i64 %a) nounwind {
420fc02eeb2SPhilipp Tomsich; RV32I-LABEL: zexth_i64:
421fc02eeb2SPhilipp Tomsich; RV32I:       # %bb.0:
422fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    slli a0, a0, 16
423fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srli a0, a0, 16
424fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    li a1, 0
425fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
426fc02eeb2SPhilipp Tomsich;
427fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: zexth_i64:
428fc02eeb2SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
429fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.extu a0, a0, 15, 0
430fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    li a1, 0
431fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
432fc02eeb2SPhilipp Tomsich  %and = and i64 %a, 65535
433fc02eeb2SPhilipp Tomsich  ret i64 %and
434fc02eeb2SPhilipp Tomsich}
435fc02eeb2SPhilipp Tomsich
436fc02eeb2SPhilipp Tomsichdeclare i32 @llvm.bswap.i32(i32)
437fc02eeb2SPhilipp Tomsich
438fc02eeb2SPhilipp Tomsichdefine i32 @bswap_i32(i32 %a) nounwind {
439fc02eeb2SPhilipp Tomsich; RV32I-LABEL: bswap_i32:
440fc02eeb2SPhilipp Tomsich; RV32I:       # %bb.0:
441fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srli a1, a0, 8
442fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lui a2, 16
443*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a0, 24
444fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    addi a2, a2, -256
445fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    and a1, a1, a2
446fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    and a2, a0, a2
447*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a1, a3
448fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    slli a2, a2, 8
449fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    slli a0, a0, 24
450fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    or a0, a0, a2
451fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    or a0, a0, a1
452fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
453fc02eeb2SPhilipp Tomsich;
454fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: bswap_i32:
455fc02eeb2SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
456fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.rev a0, a0
457fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
458fc02eeb2SPhilipp Tomsich  %1 = tail call i32 @llvm.bswap.i32(i32 %a)
459fc02eeb2SPhilipp Tomsich  ret i32 %1
460fc02eeb2SPhilipp Tomsich}
461fc02eeb2SPhilipp Tomsich
462fc02eeb2SPhilipp Tomsichdeclare i64 @llvm.bswap.i64(i64)
463fc02eeb2SPhilipp Tomsich
464fc02eeb2SPhilipp Tomsichdefine i64 @bswap_i64(i64 %a) {
465fc02eeb2SPhilipp Tomsich; RV32I-LABEL: bswap_i64:
466fc02eeb2SPhilipp Tomsich; RV32I:       # %bb.0:
467fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srli a2, a1, 8
468fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    lui a3, 16
469*9122c523SPengcheng Wang; RV32I-NEXT:    srli a4, a1, 24
470*9122c523SPengcheng Wang; RV32I-NEXT:    srli a5, a0, 8
471fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    addi a3, a3, -256
472fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    and a2, a2, a3
473fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    or a2, a2, a4
474fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    srli a4, a0, 24
475*9122c523SPengcheng Wang; RV32I-NEXT:    and a5, a5, a3
476*9122c523SPengcheng Wang; RV32I-NEXT:    or a4, a5, a4
477*9122c523SPengcheng Wang; RV32I-NEXT:    slli a5, a1, 24
478*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a3
479*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 8
480*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a5, a1
481fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    and a3, a0, a3
482fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    slli a0, a0, 24
483*9122c523SPengcheng Wang; RV32I-NEXT:    slli a3, a3, 8
484*9122c523SPengcheng Wang; RV32I-NEXT:    or a3, a0, a3
485*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a1, a2
486*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a3, a4
487fc02eeb2SPhilipp Tomsich; RV32I-NEXT:    ret
488fc02eeb2SPhilipp Tomsich;
489fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: bswap_i64:
490fc02eeb2SPhilipp Tomsich; RV32XTHEADBB:       # %bb.0:
491fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.rev a2, a1
492fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    th.rev a1, a0
493fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    mv a0, a2
494fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT:    ret
495fc02eeb2SPhilipp Tomsich  %1 = call i64 @llvm.bswap.i64(i64 %a)
496fc02eeb2SPhilipp Tomsich  ret i64 %1
497fc02eeb2SPhilipp Tomsich}
498