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