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