19e8ecce8SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 29e8ecce8SYingwei Zheng; RUN: llc -mtriple=riscv32 -mattr=+m < %s \ 39e8ecce8SYingwei Zheng; RUN: | FileCheck %s -check-prefix=RV32I 49e8ecce8SYingwei Zheng; RUN: llc -mtriple=riscv32 -mattr=+m,+zbb < %s \ 59e8ecce8SYingwei Zheng; RUN: | FileCheck %s -check-prefix=RV32ZBB 69e8ecce8SYingwei Zheng; RUN: llc -mtriple=riscv64 -mattr=+m < %s \ 7ca7ad38cSCraig Topper; RUN: | FileCheck %s -check-prefixes=RV64I 89e8ecce8SYingwei Zheng; RUN: llc -mtriple=riscv64 -mattr=+m,+zbb < %s \ 9ca7ad38cSCraig Topper; RUN: | FileCheck %s -check-prefixes=RV64ZBB 109e8ecce8SYingwei Zheng 119e8ecce8SYingwei Zhengdefine i8 @shl_cttz_i8(i8 %x, i8 %y) { 129e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_i8: 139e8ecce8SYingwei Zheng; RV32I: # %bb.0: # %entry 149e8ecce8SYingwei Zheng; RV32I-NEXT: addi a2, a1, -1 159e8ecce8SYingwei Zheng; RV32I-NEXT: not a1, a1 169e8ecce8SYingwei Zheng; RV32I-NEXT: and a1, a1, a2 179e8ecce8SYingwei Zheng; RV32I-NEXT: srli a2, a1, 1 189e8ecce8SYingwei Zheng; RV32I-NEXT: andi a2, a2, 85 199e8ecce8SYingwei Zheng; RV32I-NEXT: sub a1, a1, a2 209e8ecce8SYingwei Zheng; RV32I-NEXT: andi a2, a1, 51 219e8ecce8SYingwei Zheng; RV32I-NEXT: srli a1, a1, 2 229e8ecce8SYingwei Zheng; RV32I-NEXT: andi a1, a1, 51 239e8ecce8SYingwei Zheng; RV32I-NEXT: add a1, a2, a1 249e8ecce8SYingwei Zheng; RV32I-NEXT: srli a2, a1, 4 259e8ecce8SYingwei Zheng; RV32I-NEXT: add a1, a1, a2 269e8ecce8SYingwei Zheng; RV32I-NEXT: andi a1, a1, 15 279e8ecce8SYingwei Zheng; RV32I-NEXT: sll a0, a0, a1 289e8ecce8SYingwei Zheng; RV32I-NEXT: ret 299e8ecce8SYingwei Zheng; 309e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_i8: 319e8ecce8SYingwei Zheng; RV32ZBB: # %bb.0: # %entry 329e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ctz a1, a1 339e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sll a0, a0, a1 349e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ret 359e8ecce8SYingwei Zheng; 36ca7ad38cSCraig Topper; RV64I-LABEL: shl_cttz_i8: 37ca7ad38cSCraig Topper; RV64I: # %bb.0: # %entry 38ca7ad38cSCraig Topper; RV64I-NEXT: addi a2, a1, -1 39ca7ad38cSCraig Topper; RV64I-NEXT: not a1, a1 40ca7ad38cSCraig Topper; RV64I-NEXT: and a1, a1, a2 41ca7ad38cSCraig Topper; RV64I-NEXT: srli a2, a1, 1 42ca7ad38cSCraig Topper; RV64I-NEXT: andi a2, a2, 85 43ca7ad38cSCraig Topper; RV64I-NEXT: subw a1, a1, a2 44ca7ad38cSCraig Topper; RV64I-NEXT: andi a2, a1, 51 45ca7ad38cSCraig Topper; RV64I-NEXT: srli a1, a1, 2 46ca7ad38cSCraig Topper; RV64I-NEXT: andi a1, a1, 51 47ca7ad38cSCraig Topper; RV64I-NEXT: add a1, a2, a1 48ca7ad38cSCraig Topper; RV64I-NEXT: srli a2, a1, 4 49ca7ad38cSCraig Topper; RV64I-NEXT: add a1, a1, a2 50ca7ad38cSCraig Topper; RV64I-NEXT: andi a1, a1, 15 51ca7ad38cSCraig Topper; RV64I-NEXT: sll a0, a0, a1 52ca7ad38cSCraig Topper; RV64I-NEXT: ret 539e8ecce8SYingwei Zheng; 54ca7ad38cSCraig Topper; RV64ZBB-LABEL: shl_cttz_i8: 55ca7ad38cSCraig Topper; RV64ZBB: # %bb.0: # %entry 56ca7ad38cSCraig Topper; RV64ZBB-NEXT: ctz a1, a1 57ca7ad38cSCraig Topper; RV64ZBB-NEXT: sll a0, a0, a1 58ca7ad38cSCraig Topper; RV64ZBB-NEXT: ret 599e8ecce8SYingwei Zhengentry: 609e8ecce8SYingwei Zheng %cttz = call i8 @llvm.cttz.i8(i8 %y, i1 true) 619e8ecce8SYingwei Zheng %res = shl i8 %x, %cttz 629e8ecce8SYingwei Zheng ret i8 %res 639e8ecce8SYingwei Zheng} 649e8ecce8SYingwei Zheng 659e8ecce8SYingwei Zhengdefine i8 @shl_cttz_constant_i8(i8 %y) { 669e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_constant_i8: 679e8ecce8SYingwei Zheng; RV32I: # %bb.0: # %entry 689e8ecce8SYingwei Zheng; RV32I-NEXT: addi a1, a0, -1 699e8ecce8SYingwei Zheng; RV32I-NEXT: not a0, a0 709e8ecce8SYingwei Zheng; RV32I-NEXT: and a0, a0, a1 719e8ecce8SYingwei Zheng; RV32I-NEXT: srli a1, a0, 1 729e8ecce8SYingwei Zheng; RV32I-NEXT: andi a1, a1, 85 739e8ecce8SYingwei Zheng; RV32I-NEXT: sub a0, a0, a1 749e8ecce8SYingwei Zheng; RV32I-NEXT: andi a1, a0, 51 759e8ecce8SYingwei Zheng; RV32I-NEXT: srli a0, a0, 2 769e8ecce8SYingwei Zheng; RV32I-NEXT: andi a0, a0, 51 779e8ecce8SYingwei Zheng; RV32I-NEXT: add a0, a1, a0 789e8ecce8SYingwei Zheng; RV32I-NEXT: srli a1, a0, 4 799e8ecce8SYingwei Zheng; RV32I-NEXT: add a0, a0, a1 809e8ecce8SYingwei Zheng; RV32I-NEXT: andi a0, a0, 15 819e8ecce8SYingwei Zheng; RV32I-NEXT: li a1, 4 829e8ecce8SYingwei Zheng; RV32I-NEXT: sll a0, a1, a0 839e8ecce8SYingwei Zheng; RV32I-NEXT: ret 849e8ecce8SYingwei Zheng; 859e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_constant_i8: 869e8ecce8SYingwei Zheng; RV32ZBB: # %bb.0: # %entry 879e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ctz a0, a0 889e8ecce8SYingwei Zheng; RV32ZBB-NEXT: li a1, 4 899e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sll a0, a1, a0 909e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ret 919e8ecce8SYingwei Zheng; 92ca7ad38cSCraig Topper; RV64I-LABEL: shl_cttz_constant_i8: 93ca7ad38cSCraig Topper; RV64I: # %bb.0: # %entry 94ca7ad38cSCraig Topper; RV64I-NEXT: addi a1, a0, -1 95ca7ad38cSCraig Topper; RV64I-NEXT: not a0, a0 96ca7ad38cSCraig Topper; RV64I-NEXT: and a0, a0, a1 97ca7ad38cSCraig Topper; RV64I-NEXT: srli a1, a0, 1 98ca7ad38cSCraig Topper; RV64I-NEXT: andi a1, a1, 85 99ca7ad38cSCraig Topper; RV64I-NEXT: subw a0, a0, a1 100ca7ad38cSCraig Topper; RV64I-NEXT: andi a1, a0, 51 101ca7ad38cSCraig Topper; RV64I-NEXT: srli a0, a0, 2 102ca7ad38cSCraig Topper; RV64I-NEXT: andi a0, a0, 51 103ca7ad38cSCraig Topper; RV64I-NEXT: add a0, a1, a0 104ca7ad38cSCraig Topper; RV64I-NEXT: srli a1, a0, 4 105ca7ad38cSCraig Topper; RV64I-NEXT: add a0, a0, a1 106ca7ad38cSCraig Topper; RV64I-NEXT: andi a0, a0, 15 107ca7ad38cSCraig Topper; RV64I-NEXT: li a1, 4 108ca7ad38cSCraig Topper; RV64I-NEXT: sll a0, a1, a0 109ca7ad38cSCraig Topper; RV64I-NEXT: ret 1109e8ecce8SYingwei Zheng; 111ca7ad38cSCraig Topper; RV64ZBB-LABEL: shl_cttz_constant_i8: 112ca7ad38cSCraig Topper; RV64ZBB: # %bb.0: # %entry 113ca7ad38cSCraig Topper; RV64ZBB-NEXT: ctz a0, a0 114ca7ad38cSCraig Topper; RV64ZBB-NEXT: li a1, 4 115ca7ad38cSCraig Topper; RV64ZBB-NEXT: sll a0, a1, a0 116ca7ad38cSCraig Topper; RV64ZBB-NEXT: ret 1179e8ecce8SYingwei Zhengentry: 1189e8ecce8SYingwei Zheng %cttz = call i8 @llvm.cttz.i8(i8 %y, i1 true) 1199e8ecce8SYingwei Zheng %res = shl i8 4, %cttz 1209e8ecce8SYingwei Zheng ret i8 %res 1219e8ecce8SYingwei Zheng} 1229e8ecce8SYingwei Zheng 1239e8ecce8SYingwei Zhengdefine i16 @shl_cttz_i16(i16 %x, i16 %y) { 1249e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_i16: 1259e8ecce8SYingwei Zheng; RV32I: # %bb.0: # %entry 1269e8ecce8SYingwei Zheng; RV32I-NEXT: addi a2, a1, -1 1279e8ecce8SYingwei Zheng; RV32I-NEXT: not a1, a1 1289e8ecce8SYingwei Zheng; RV32I-NEXT: lui a3, 5 1299e8ecce8SYingwei Zheng; RV32I-NEXT: and a1, a1, a2 130*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a3, 1365 131*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a1, 1 132*9122c523SPengcheng Wang; RV32I-NEXT: and a2, a3, a2 133*9122c523SPengcheng Wang; RV32I-NEXT: lui a3, 3 134*9122c523SPengcheng Wang; RV32I-NEXT: addi a3, a3, 819 135*9122c523SPengcheng Wang; RV32I-NEXT: sub a1, a1, a2 136*9122c523SPengcheng Wang; RV32I-NEXT: and a2, a1, a3 137*9122c523SPengcheng Wang; RV32I-NEXT: srli a1, a1, 2 138*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a3 139*9122c523SPengcheng Wang; RV32I-NEXT: add a1, a2, a1 1409e8ecce8SYingwei Zheng; RV32I-NEXT: srli a2, a1, 4 1419e8ecce8SYingwei Zheng; RV32I-NEXT: add a1, a1, a2 1429e8ecce8SYingwei Zheng; RV32I-NEXT: andi a2, a1, 15 1439e8ecce8SYingwei Zheng; RV32I-NEXT: slli a1, a1, 20 1449e8ecce8SYingwei Zheng; RV32I-NEXT: srli a1, a1, 28 1459e8ecce8SYingwei Zheng; RV32I-NEXT: add a1, a2, a1 1469e8ecce8SYingwei Zheng; RV32I-NEXT: sll a0, a0, a1 1479e8ecce8SYingwei Zheng; RV32I-NEXT: ret 1489e8ecce8SYingwei Zheng; 1499e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_i16: 1509e8ecce8SYingwei Zheng; RV32ZBB: # %bb.0: # %entry 1519e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ctz a1, a1 1529e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sll a0, a0, a1 1539e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ret 1549e8ecce8SYingwei Zheng; 155ca7ad38cSCraig Topper; RV64I-LABEL: shl_cttz_i16: 156ca7ad38cSCraig Topper; RV64I: # %bb.0: # %entry 157ca7ad38cSCraig Topper; RV64I-NEXT: addi a2, a1, -1 158ca7ad38cSCraig Topper; RV64I-NEXT: not a1, a1 159ca7ad38cSCraig Topper; RV64I-NEXT: lui a3, 5 160ca7ad38cSCraig Topper; RV64I-NEXT: and a1, a1, a2 161*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a3, 1365 162*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a1, 1 163*9122c523SPengcheng Wang; RV64I-NEXT: and a2, a3, a2 164*9122c523SPengcheng Wang; RV64I-NEXT: lui a3, 3 165*9122c523SPengcheng Wang; RV64I-NEXT: addiw a3, a3, 819 166*9122c523SPengcheng Wang; RV64I-NEXT: sub a1, a1, a2 167*9122c523SPengcheng Wang; RV64I-NEXT: and a2, a1, a3 168*9122c523SPengcheng Wang; RV64I-NEXT: srli a1, a1, 2 169*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a1, a3 170*9122c523SPengcheng Wang; RV64I-NEXT: add a1, a2, a1 171ca7ad38cSCraig Topper; RV64I-NEXT: srli a2, a1, 4 172ca7ad38cSCraig Topper; RV64I-NEXT: add a1, a1, a2 173ca7ad38cSCraig Topper; RV64I-NEXT: andi a2, a1, 15 174ca7ad38cSCraig Topper; RV64I-NEXT: slli a1, a1, 52 175ca7ad38cSCraig Topper; RV64I-NEXT: srli a1, a1, 60 176ca7ad38cSCraig Topper; RV64I-NEXT: add a1, a2, a1 177ca7ad38cSCraig Topper; RV64I-NEXT: sll a0, a0, a1 178ca7ad38cSCraig Topper; RV64I-NEXT: ret 1799e8ecce8SYingwei Zheng; 180ca7ad38cSCraig Topper; RV64ZBB-LABEL: shl_cttz_i16: 181ca7ad38cSCraig Topper; RV64ZBB: # %bb.0: # %entry 182ca7ad38cSCraig Topper; RV64ZBB-NEXT: ctz a1, a1 183ca7ad38cSCraig Topper; RV64ZBB-NEXT: sll a0, a0, a1 184ca7ad38cSCraig Topper; RV64ZBB-NEXT: ret 1859e8ecce8SYingwei Zhengentry: 1869e8ecce8SYingwei Zheng %cttz = call i16 @llvm.cttz.i16(i16 %y, i1 true) 1879e8ecce8SYingwei Zheng %res = shl i16 %x, %cttz 1889e8ecce8SYingwei Zheng ret i16 %res 1899e8ecce8SYingwei Zheng} 1909e8ecce8SYingwei Zheng 1919e8ecce8SYingwei Zhengdefine i16 @shl_cttz_constant_i16(i16 %y) { 1929e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_constant_i16: 1939e8ecce8SYingwei Zheng; RV32I: # %bb.0: # %entry 1949e8ecce8SYingwei Zheng; RV32I-NEXT: addi a1, a0, -1 1959e8ecce8SYingwei Zheng; RV32I-NEXT: not a0, a0 1969e8ecce8SYingwei Zheng; RV32I-NEXT: lui a2, 5 1979e8ecce8SYingwei Zheng; RV32I-NEXT: and a0, a0, a1 198*9122c523SPengcheng Wang; RV32I-NEXT: addi a1, a2, 1365 199*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 1 200*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a2, a1 201*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 3 202*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 819 203*9122c523SPengcheng Wang; RV32I-NEXT: sub a0, a0, a1 204*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a0, a2 205*9122c523SPengcheng Wang; RV32I-NEXT: srli a0, a0, 2 206*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a2 207*9122c523SPengcheng Wang; RV32I-NEXT: add a0, a1, a0 2089e8ecce8SYingwei Zheng; RV32I-NEXT: srli a1, a0, 4 2099e8ecce8SYingwei Zheng; RV32I-NEXT: add a0, a0, a1 2109e8ecce8SYingwei Zheng; RV32I-NEXT: andi a1, a0, 15 2119e8ecce8SYingwei Zheng; RV32I-NEXT: slli a0, a0, 20 2129e8ecce8SYingwei Zheng; RV32I-NEXT: srli a0, a0, 28 2139e8ecce8SYingwei Zheng; RV32I-NEXT: add a0, a1, a0 2149e8ecce8SYingwei Zheng; RV32I-NEXT: li a1, 4 2159e8ecce8SYingwei Zheng; RV32I-NEXT: sll a0, a1, a0 2169e8ecce8SYingwei Zheng; RV32I-NEXT: ret 2179e8ecce8SYingwei Zheng; 2189e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_constant_i16: 2199e8ecce8SYingwei Zheng; RV32ZBB: # %bb.0: # %entry 2209e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ctz a0, a0 2219e8ecce8SYingwei Zheng; RV32ZBB-NEXT: li a1, 4 2229e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sll a0, a1, a0 2239e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ret 2249e8ecce8SYingwei Zheng; 225ca7ad38cSCraig Topper; RV64I-LABEL: shl_cttz_constant_i16: 226ca7ad38cSCraig Topper; RV64I: # %bb.0: # %entry 227ca7ad38cSCraig Topper; RV64I-NEXT: addi a1, a0, -1 228ca7ad38cSCraig Topper; RV64I-NEXT: not a0, a0 229ca7ad38cSCraig Topper; RV64I-NEXT: lui a2, 5 230ca7ad38cSCraig Topper; RV64I-NEXT: and a0, a0, a1 231*9122c523SPengcheng Wang; RV64I-NEXT: addiw a1, a2, 1365 232*9122c523SPengcheng Wang; RV64I-NEXT: srli a2, a0, 1 233*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a2, a1 234*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 3 235*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 819 236*9122c523SPengcheng Wang; RV64I-NEXT: sub a0, a0, a1 237*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a0, a2 238*9122c523SPengcheng Wang; RV64I-NEXT: srli a0, a0, 2 239*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a2 240*9122c523SPengcheng Wang; RV64I-NEXT: add a0, a1, a0 241ca7ad38cSCraig Topper; RV64I-NEXT: srli a1, a0, 4 242ca7ad38cSCraig Topper; RV64I-NEXT: add a0, a0, a1 243ca7ad38cSCraig Topper; RV64I-NEXT: andi a1, a0, 15 244ca7ad38cSCraig Topper; RV64I-NEXT: slli a0, a0, 52 245ca7ad38cSCraig Topper; RV64I-NEXT: srli a0, a0, 60 246ca7ad38cSCraig Topper; RV64I-NEXT: add a0, a1, a0 247ca7ad38cSCraig Topper; RV64I-NEXT: li a1, 4 248ca7ad38cSCraig Topper; RV64I-NEXT: sll a0, a1, a0 249ca7ad38cSCraig Topper; RV64I-NEXT: ret 2509e8ecce8SYingwei Zheng; 251ca7ad38cSCraig Topper; RV64ZBB-LABEL: shl_cttz_constant_i16: 252ca7ad38cSCraig Topper; RV64ZBB: # %bb.0: # %entry 253ca7ad38cSCraig Topper; RV64ZBB-NEXT: ctz a0, a0 254ca7ad38cSCraig Topper; RV64ZBB-NEXT: li a1, 4 255ca7ad38cSCraig Topper; RV64ZBB-NEXT: sll a0, a1, a0 256ca7ad38cSCraig Topper; RV64ZBB-NEXT: ret 2579e8ecce8SYingwei Zhengentry: 2589e8ecce8SYingwei Zheng %cttz = call i16 @llvm.cttz.i16(i16 %y, i1 true) 2599e8ecce8SYingwei Zheng %res = shl i16 4, %cttz 2609e8ecce8SYingwei Zheng ret i16 %res 2619e8ecce8SYingwei Zheng} 2629e8ecce8SYingwei Zheng 2639e8ecce8SYingwei Zhengdefine i32 @shl_cttz_i32(i32 %x, i32 %y) { 2649e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_i32: 2659e8ecce8SYingwei Zheng; RV32I: # %bb.0: # %entry 2669e8ecce8SYingwei Zheng; RV32I-NEXT: neg a2, a1 2679e8ecce8SYingwei Zheng; RV32I-NEXT: and a1, a1, a2 2689e8ecce8SYingwei Zheng; RV32I-NEXT: mul a0, a1, a0 2699e8ecce8SYingwei Zheng; RV32I-NEXT: ret 2709e8ecce8SYingwei Zheng; 2719e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_i32: 2729e8ecce8SYingwei Zheng; RV32ZBB: # %bb.0: # %entry 2739e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ctz a1, a1 2749e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sll a0, a0, a1 2759e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ret 2769e8ecce8SYingwei Zheng; 2779e8ecce8SYingwei Zheng; RV64I-LABEL: shl_cttz_i32: 2789e8ecce8SYingwei Zheng; RV64I: # %bb.0: # %entry 2799e8ecce8SYingwei Zheng; RV64I-NEXT: negw a2, a1 2809e8ecce8SYingwei Zheng; RV64I-NEXT: and a1, a1, a2 2819e8ecce8SYingwei Zheng; RV64I-NEXT: lui a2, 30667 2829e8ecce8SYingwei Zheng; RV64I-NEXT: addi a2, a2, 1329 2839e8ecce8SYingwei Zheng; RV64I-NEXT: mul a1, a1, a2 2849e8ecce8SYingwei Zheng; RV64I-NEXT: srliw a1, a1, 27 2859e8ecce8SYingwei Zheng; RV64I-NEXT: lui a2, %hi(.LCPI4_0) 2869e8ecce8SYingwei Zheng; RV64I-NEXT: addi a2, a2, %lo(.LCPI4_0) 2879e8ecce8SYingwei Zheng; RV64I-NEXT: add a1, a2, a1 2889e8ecce8SYingwei Zheng; RV64I-NEXT: lbu a1, 0(a1) 2899e8ecce8SYingwei Zheng; RV64I-NEXT: sllw a0, a0, a1 2909e8ecce8SYingwei Zheng; RV64I-NEXT: ret 2919e8ecce8SYingwei Zheng; 2929e8ecce8SYingwei Zheng; RV64ZBB-LABEL: shl_cttz_i32: 2939e8ecce8SYingwei Zheng; RV64ZBB: # %bb.0: # %entry 2949e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ctzw a1, a1 2959e8ecce8SYingwei Zheng; RV64ZBB-NEXT: sllw a0, a0, a1 2969e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ret 2979e8ecce8SYingwei Zhengentry: 2989e8ecce8SYingwei Zheng %cttz = call i32 @llvm.cttz.i32(i32 %y, i1 true) 2999e8ecce8SYingwei Zheng %res = shl i32 %x, %cttz 3009e8ecce8SYingwei Zheng ret i32 %res 3019e8ecce8SYingwei Zheng} 3029e8ecce8SYingwei Zheng 3039e8ecce8SYingwei Zhengdefine i32 @shl_cttz_i32_zero_is_defined(i32 %x, i32 %y) { 3049e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_i32_zero_is_defined: 3059e8ecce8SYingwei Zheng; RV32I: # %bb.0: # %entry 3069e8ecce8SYingwei Zheng; RV32I-NEXT: beqz a1, .LBB5_2 3079e8ecce8SYingwei Zheng; RV32I-NEXT: # %bb.1: # %cond.false 3089e8ecce8SYingwei Zheng; RV32I-NEXT: neg a2, a1 3099e8ecce8SYingwei Zheng; RV32I-NEXT: and a1, a1, a2 3109e8ecce8SYingwei Zheng; RV32I-NEXT: lui a2, 30667 3119e8ecce8SYingwei Zheng; RV32I-NEXT: addi a2, a2, 1329 3129e8ecce8SYingwei Zheng; RV32I-NEXT: mul a1, a1, a2 3139e8ecce8SYingwei Zheng; RV32I-NEXT: srli a1, a1, 27 3149e8ecce8SYingwei Zheng; RV32I-NEXT: lui a2, %hi(.LCPI5_0) 3159e8ecce8SYingwei Zheng; RV32I-NEXT: addi a2, a2, %lo(.LCPI5_0) 3169e8ecce8SYingwei Zheng; RV32I-NEXT: add a1, a2, a1 3179e8ecce8SYingwei Zheng; RV32I-NEXT: lbu a1, 0(a1) 3189e8ecce8SYingwei Zheng; RV32I-NEXT: sll a0, a0, a1 3199e8ecce8SYingwei Zheng; RV32I-NEXT: ret 3209e8ecce8SYingwei Zheng; RV32I-NEXT: .LBB5_2: 3219e8ecce8SYingwei Zheng; RV32I-NEXT: li a1, 32 3229e8ecce8SYingwei Zheng; RV32I-NEXT: sll a0, a0, a1 3239e8ecce8SYingwei Zheng; RV32I-NEXT: ret 3249e8ecce8SYingwei Zheng; 3259e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_i32_zero_is_defined: 3269e8ecce8SYingwei Zheng; RV32ZBB: # %bb.0: # %entry 3279e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ctz a1, a1 3289e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sll a0, a0, a1 3299e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ret 3309e8ecce8SYingwei Zheng; 3319e8ecce8SYingwei Zheng; RV64I-LABEL: shl_cttz_i32_zero_is_defined: 3329e8ecce8SYingwei Zheng; RV64I: # %bb.0: # %entry 3339e8ecce8SYingwei Zheng; RV64I-NEXT: sext.w a2, a1 3349e8ecce8SYingwei Zheng; RV64I-NEXT: beqz a2, .LBB5_2 3359e8ecce8SYingwei Zheng; RV64I-NEXT: # %bb.1: # %cond.false 3369e8ecce8SYingwei Zheng; RV64I-NEXT: negw a2, a1 3379e8ecce8SYingwei Zheng; RV64I-NEXT: and a1, a1, a2 3389e8ecce8SYingwei Zheng; RV64I-NEXT: lui a2, 30667 3399e8ecce8SYingwei Zheng; RV64I-NEXT: addi a2, a2, 1329 3409e8ecce8SYingwei Zheng; RV64I-NEXT: mul a1, a1, a2 3419e8ecce8SYingwei Zheng; RV64I-NEXT: srliw a1, a1, 27 3429e8ecce8SYingwei Zheng; RV64I-NEXT: lui a2, %hi(.LCPI5_0) 3439e8ecce8SYingwei Zheng; RV64I-NEXT: addi a2, a2, %lo(.LCPI5_0) 3449e8ecce8SYingwei Zheng; RV64I-NEXT: add a1, a2, a1 3459e8ecce8SYingwei Zheng; RV64I-NEXT: lbu a1, 0(a1) 3469e8ecce8SYingwei Zheng; RV64I-NEXT: sllw a0, a0, a1 3479e8ecce8SYingwei Zheng; RV64I-NEXT: ret 3489e8ecce8SYingwei Zheng; RV64I-NEXT: .LBB5_2: 3499e8ecce8SYingwei Zheng; RV64I-NEXT: li a1, 32 3509e8ecce8SYingwei Zheng; RV64I-NEXT: sllw a0, a0, a1 3519e8ecce8SYingwei Zheng; RV64I-NEXT: ret 3529e8ecce8SYingwei Zheng; 3539e8ecce8SYingwei Zheng; RV64ZBB-LABEL: shl_cttz_i32_zero_is_defined: 3549e8ecce8SYingwei Zheng; RV64ZBB: # %bb.0: # %entry 3559e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ctzw a1, a1 3569e8ecce8SYingwei Zheng; RV64ZBB-NEXT: sllw a0, a0, a1 3579e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ret 3589e8ecce8SYingwei Zhengentry: 3599e8ecce8SYingwei Zheng %cttz = call i32 @llvm.cttz.i32(i32 %y, i1 false) 3609e8ecce8SYingwei Zheng %res = shl i32 %x, %cttz 3619e8ecce8SYingwei Zheng ret i32 %res 3629e8ecce8SYingwei Zheng} 3639e8ecce8SYingwei Zheng 3649e8ecce8SYingwei Zhengdefine i32 @shl_cttz_constant_i32(i32 %y) { 3659e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_constant_i32: 3669e8ecce8SYingwei Zheng; RV32I: # %bb.0: # %entry 3679e8ecce8SYingwei Zheng; RV32I-NEXT: neg a1, a0 3689e8ecce8SYingwei Zheng; RV32I-NEXT: and a0, a0, a1 3699e8ecce8SYingwei Zheng; RV32I-NEXT: slli a0, a0, 2 3709e8ecce8SYingwei Zheng; RV32I-NEXT: ret 3719e8ecce8SYingwei Zheng; 3729e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_constant_i32: 3739e8ecce8SYingwei Zheng; RV32ZBB: # %bb.0: # %entry 3749e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ctz a0, a0 3759e8ecce8SYingwei Zheng; RV32ZBB-NEXT: li a1, 4 3769e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sll a0, a1, a0 3779e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ret 3789e8ecce8SYingwei Zheng; 3799e8ecce8SYingwei Zheng; RV64I-LABEL: shl_cttz_constant_i32: 3809e8ecce8SYingwei Zheng; RV64I: # %bb.0: # %entry 3819e8ecce8SYingwei Zheng; RV64I-NEXT: negw a1, a0 3829e8ecce8SYingwei Zheng; RV64I-NEXT: and a0, a0, a1 3839e8ecce8SYingwei Zheng; RV64I-NEXT: lui a1, 30667 3849e8ecce8SYingwei Zheng; RV64I-NEXT: addi a1, a1, 1329 3859e8ecce8SYingwei Zheng; RV64I-NEXT: mul a0, a0, a1 3869e8ecce8SYingwei Zheng; RV64I-NEXT: srliw a0, a0, 27 3879e8ecce8SYingwei Zheng; RV64I-NEXT: lui a1, %hi(.LCPI6_0) 3889e8ecce8SYingwei Zheng; RV64I-NEXT: addi a1, a1, %lo(.LCPI6_0) 3899e8ecce8SYingwei Zheng; RV64I-NEXT: add a0, a1, a0 3909e8ecce8SYingwei Zheng; RV64I-NEXT: lbu a0, 0(a0) 3919e8ecce8SYingwei Zheng; RV64I-NEXT: li a1, 4 3929e8ecce8SYingwei Zheng; RV64I-NEXT: sllw a0, a1, a0 3939e8ecce8SYingwei Zheng; RV64I-NEXT: ret 3949e8ecce8SYingwei Zheng; 3959e8ecce8SYingwei Zheng; RV64ZBB-LABEL: shl_cttz_constant_i32: 3969e8ecce8SYingwei Zheng; RV64ZBB: # %bb.0: # %entry 3979e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ctzw a0, a0 3989e8ecce8SYingwei Zheng; RV64ZBB-NEXT: li a1, 4 3999e8ecce8SYingwei Zheng; RV64ZBB-NEXT: sllw a0, a1, a0 4009e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ret 4019e8ecce8SYingwei Zhengentry: 4029e8ecce8SYingwei Zheng %cttz = call i32 @llvm.cttz.i32(i32 %y, i1 true) 4039e8ecce8SYingwei Zheng %res = shl i32 4, %cttz 4049e8ecce8SYingwei Zheng ret i32 %res 4059e8ecce8SYingwei Zheng} 4069e8ecce8SYingwei Zheng 4079e8ecce8SYingwei Zhengdefine i32 @shl_cttz_multiuse_i32(i32 %x, i32 %y) { 4089e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_multiuse_i32: 4099e8ecce8SYingwei Zheng; RV32I: # %bb.0: # %entry 4109e8ecce8SYingwei Zheng; RV32I-NEXT: addi sp, sp, -16 4119e8ecce8SYingwei Zheng; RV32I-NEXT: .cfi_def_cfa_offset 16 4129e8ecce8SYingwei Zheng; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4139e8ecce8SYingwei Zheng; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 4149e8ecce8SYingwei Zheng; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 4159e8ecce8SYingwei Zheng; RV32I-NEXT: .cfi_offset ra, -4 4169e8ecce8SYingwei Zheng; RV32I-NEXT: .cfi_offset s0, -8 4179e8ecce8SYingwei Zheng; RV32I-NEXT: .cfi_offset s1, -12 4189e8ecce8SYingwei Zheng; RV32I-NEXT: neg a2, a1 4199e8ecce8SYingwei Zheng; RV32I-NEXT: and a1, a1, a2 4209e8ecce8SYingwei Zheng; RV32I-NEXT: lui a2, 30667 4219e8ecce8SYingwei Zheng; RV32I-NEXT: addi a2, a2, 1329 4229e8ecce8SYingwei Zheng; RV32I-NEXT: mul a1, a1, a2 4239e8ecce8SYingwei Zheng; RV32I-NEXT: srli a1, a1, 27 4249e8ecce8SYingwei Zheng; RV32I-NEXT: lui a2, %hi(.LCPI7_0) 4259e8ecce8SYingwei Zheng; RV32I-NEXT: addi a2, a2, %lo(.LCPI7_0) 4269e8ecce8SYingwei Zheng; RV32I-NEXT: add a1, a2, a1 4279e8ecce8SYingwei Zheng; RV32I-NEXT: lbu s0, 0(a1) 4289e8ecce8SYingwei Zheng; RV32I-NEXT: mv s1, a0 4299e8ecce8SYingwei Zheng; RV32I-NEXT: mv a0, s0 4309e8ecce8SYingwei Zheng; RV32I-NEXT: call use32 4319e8ecce8SYingwei Zheng; RV32I-NEXT: sll a0, s1, s0 4329e8ecce8SYingwei Zheng; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4339e8ecce8SYingwei Zheng; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 4349e8ecce8SYingwei Zheng; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 43597982a8cSdlav-sc; RV32I-NEXT: .cfi_restore ra 43697982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s0 43797982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s1 4389e8ecce8SYingwei Zheng; RV32I-NEXT: addi sp, sp, 16 43997982a8cSdlav-sc; RV32I-NEXT: .cfi_def_cfa_offset 0 4409e8ecce8SYingwei Zheng; RV32I-NEXT: ret 4419e8ecce8SYingwei Zheng; 4429e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_multiuse_i32: 4439e8ecce8SYingwei Zheng; RV32ZBB: # %bb.0: # %entry 4449e8ecce8SYingwei Zheng; RV32ZBB-NEXT: addi sp, sp, -16 4459e8ecce8SYingwei Zheng; RV32ZBB-NEXT: .cfi_def_cfa_offset 16 4469e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4479e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 4489e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 4499e8ecce8SYingwei Zheng; RV32ZBB-NEXT: .cfi_offset ra, -4 4509e8ecce8SYingwei Zheng; RV32ZBB-NEXT: .cfi_offset s0, -8 4519e8ecce8SYingwei Zheng; RV32ZBB-NEXT: .cfi_offset s1, -12 4529e8ecce8SYingwei Zheng; RV32ZBB-NEXT: mv s0, a0 4539e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ctz s1, a1 4549e8ecce8SYingwei Zheng; RV32ZBB-NEXT: mv a0, s1 4559e8ecce8SYingwei Zheng; RV32ZBB-NEXT: call use32 4569e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sll a0, s0, s1 4579e8ecce8SYingwei Zheng; RV32ZBB-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4589e8ecce8SYingwei Zheng; RV32ZBB-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 4599e8ecce8SYingwei Zheng; RV32ZBB-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 46097982a8cSdlav-sc; RV32ZBB-NEXT: .cfi_restore ra 46197982a8cSdlav-sc; RV32ZBB-NEXT: .cfi_restore s0 46297982a8cSdlav-sc; RV32ZBB-NEXT: .cfi_restore s1 4639e8ecce8SYingwei Zheng; RV32ZBB-NEXT: addi sp, sp, 16 46497982a8cSdlav-sc; RV32ZBB-NEXT: .cfi_def_cfa_offset 0 4659e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ret 4669e8ecce8SYingwei Zheng; 4679e8ecce8SYingwei Zheng; RV64I-LABEL: shl_cttz_multiuse_i32: 4689e8ecce8SYingwei Zheng; RV64I: # %bb.0: # %entry 4699e8ecce8SYingwei Zheng; RV64I-NEXT: addi sp, sp, -32 4709e8ecce8SYingwei Zheng; RV64I-NEXT: .cfi_def_cfa_offset 32 4719e8ecce8SYingwei Zheng; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 4729e8ecce8SYingwei Zheng; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 4739e8ecce8SYingwei Zheng; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 4749e8ecce8SYingwei Zheng; RV64I-NEXT: .cfi_offset ra, -8 4759e8ecce8SYingwei Zheng; RV64I-NEXT: .cfi_offset s0, -16 4769e8ecce8SYingwei Zheng; RV64I-NEXT: .cfi_offset s1, -24 4779e8ecce8SYingwei Zheng; RV64I-NEXT: negw a2, a1 4789e8ecce8SYingwei Zheng; RV64I-NEXT: and a1, a1, a2 4799e8ecce8SYingwei Zheng; RV64I-NEXT: lui a2, 30667 4809e8ecce8SYingwei Zheng; RV64I-NEXT: addi a2, a2, 1329 4819e8ecce8SYingwei Zheng; RV64I-NEXT: mul a1, a1, a2 4829e8ecce8SYingwei Zheng; RV64I-NEXT: srliw a1, a1, 27 4839e8ecce8SYingwei Zheng; RV64I-NEXT: lui a2, %hi(.LCPI7_0) 4849e8ecce8SYingwei Zheng; RV64I-NEXT: addi a2, a2, %lo(.LCPI7_0) 4859e8ecce8SYingwei Zheng; RV64I-NEXT: add a1, a2, a1 4869e8ecce8SYingwei Zheng; RV64I-NEXT: lbu s0, 0(a1) 4879e8ecce8SYingwei Zheng; RV64I-NEXT: mv s1, a0 4889e8ecce8SYingwei Zheng; RV64I-NEXT: mv a0, s0 4899e8ecce8SYingwei Zheng; RV64I-NEXT: call use32 4909e8ecce8SYingwei Zheng; RV64I-NEXT: sllw a0, s1, s0 4919e8ecce8SYingwei Zheng; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 4929e8ecce8SYingwei Zheng; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 4939e8ecce8SYingwei Zheng; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 49497982a8cSdlav-sc; RV64I-NEXT: .cfi_restore ra 49597982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s0 49697982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s1 4979e8ecce8SYingwei Zheng; RV64I-NEXT: addi sp, sp, 32 49897982a8cSdlav-sc; RV64I-NEXT: .cfi_def_cfa_offset 0 4999e8ecce8SYingwei Zheng; RV64I-NEXT: ret 5009e8ecce8SYingwei Zheng; 5019e8ecce8SYingwei Zheng; RV64ZBB-LABEL: shl_cttz_multiuse_i32: 5029e8ecce8SYingwei Zheng; RV64ZBB: # %bb.0: # %entry 5039e8ecce8SYingwei Zheng; RV64ZBB-NEXT: addi sp, sp, -32 5049e8ecce8SYingwei Zheng; RV64ZBB-NEXT: .cfi_def_cfa_offset 32 5059e8ecce8SYingwei Zheng; RV64ZBB-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 5069e8ecce8SYingwei Zheng; RV64ZBB-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 5079e8ecce8SYingwei Zheng; RV64ZBB-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 5089e8ecce8SYingwei Zheng; RV64ZBB-NEXT: .cfi_offset ra, -8 5099e8ecce8SYingwei Zheng; RV64ZBB-NEXT: .cfi_offset s0, -16 5109e8ecce8SYingwei Zheng; RV64ZBB-NEXT: .cfi_offset s1, -24 5119e8ecce8SYingwei Zheng; RV64ZBB-NEXT: mv s0, a0 5129e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ctzw s1, a1 5139e8ecce8SYingwei Zheng; RV64ZBB-NEXT: mv a0, s1 5149e8ecce8SYingwei Zheng; RV64ZBB-NEXT: call use32 5159e8ecce8SYingwei Zheng; RV64ZBB-NEXT: sllw a0, s0, s1 5169e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 5179e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 5189e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 51997982a8cSdlav-sc; RV64ZBB-NEXT: .cfi_restore ra 52097982a8cSdlav-sc; RV64ZBB-NEXT: .cfi_restore s0 52197982a8cSdlav-sc; RV64ZBB-NEXT: .cfi_restore s1 5229e8ecce8SYingwei Zheng; RV64ZBB-NEXT: addi sp, sp, 32 52397982a8cSdlav-sc; RV64ZBB-NEXT: .cfi_def_cfa_offset 0 5249e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ret 5259e8ecce8SYingwei Zhengentry: 5269e8ecce8SYingwei Zheng %cttz = call i32 @llvm.cttz.i32(i32 %y, i1 true) 5279e8ecce8SYingwei Zheng call void @use32(i32 %cttz) 5289e8ecce8SYingwei Zheng %res = shl i32 %x, %cttz 5299e8ecce8SYingwei Zheng ret i32 %res 5309e8ecce8SYingwei Zheng} 5319e8ecce8SYingwei Zheng 5329e8ecce8SYingwei Zhengdefine i64 @shl_cttz_i64(i64 %x, i64 %y) { 5339e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_i64: 5349e8ecce8SYingwei Zheng; RV32I: # %bb.0: # %entry 5359e8ecce8SYingwei Zheng; RV32I-NEXT: lui a4, 30667 5369e8ecce8SYingwei Zheng; RV32I-NEXT: addi a5, a4, 1329 5379e8ecce8SYingwei Zheng; RV32I-NEXT: lui a4, %hi(.LCPI8_0) 5389e8ecce8SYingwei Zheng; RV32I-NEXT: addi a4, a4, %lo(.LCPI8_0) 5399e8ecce8SYingwei Zheng; RV32I-NEXT: bnez a2, .LBB8_2 5409e8ecce8SYingwei Zheng; RV32I-NEXT: # %bb.1: # %entry 5419e8ecce8SYingwei Zheng; RV32I-NEXT: neg a2, a3 5429e8ecce8SYingwei Zheng; RV32I-NEXT: and a2, a3, a2 5439e8ecce8SYingwei Zheng; RV32I-NEXT: mul a2, a2, a5 5449e8ecce8SYingwei Zheng; RV32I-NEXT: srli a2, a2, 27 5459e8ecce8SYingwei Zheng; RV32I-NEXT: add a2, a4, a2 5469e8ecce8SYingwei Zheng; RV32I-NEXT: lbu a2, 0(a2) 5479e8ecce8SYingwei Zheng; RV32I-NEXT: addi a4, a2, 32 5489e8ecce8SYingwei Zheng; RV32I-NEXT: j .LBB8_3 5499e8ecce8SYingwei Zheng; RV32I-NEXT: .LBB8_2: 5509e8ecce8SYingwei Zheng; RV32I-NEXT: neg a3, a2 5519e8ecce8SYingwei Zheng; RV32I-NEXT: and a2, a2, a3 5529e8ecce8SYingwei Zheng; RV32I-NEXT: mul a2, a2, a5 5539e8ecce8SYingwei Zheng; RV32I-NEXT: srli a2, a2, 27 5549e8ecce8SYingwei Zheng; RV32I-NEXT: add a2, a4, a2 5559e8ecce8SYingwei Zheng; RV32I-NEXT: lbu a4, 0(a2) 5569e8ecce8SYingwei Zheng; RV32I-NEXT: .LBB8_3: # %entry 5579e8ecce8SYingwei Zheng; RV32I-NEXT: addi a3, a4, -32 5589e8ecce8SYingwei Zheng; RV32I-NEXT: sll a2, a0, a4 5599e8ecce8SYingwei Zheng; RV32I-NEXT: bltz a3, .LBB8_5 5609e8ecce8SYingwei Zheng; RV32I-NEXT: # %bb.4: # %entry 5619e8ecce8SYingwei Zheng; RV32I-NEXT: mv a1, a2 5629e8ecce8SYingwei Zheng; RV32I-NEXT: j .LBB8_6 5639e8ecce8SYingwei Zheng; RV32I-NEXT: .LBB8_5: 5649e8ecce8SYingwei Zheng; RV32I-NEXT: sll a1, a1, a4 5659e8ecce8SYingwei Zheng; RV32I-NEXT: not a4, a4 5669e8ecce8SYingwei Zheng; RV32I-NEXT: srli a0, a0, 1 5679e8ecce8SYingwei Zheng; RV32I-NEXT: srl a0, a0, a4 5689e8ecce8SYingwei Zheng; RV32I-NEXT: or a1, a1, a0 5699e8ecce8SYingwei Zheng; RV32I-NEXT: .LBB8_6: # %entry 5709e8ecce8SYingwei Zheng; RV32I-NEXT: srai a0, a3, 31 5719e8ecce8SYingwei Zheng; RV32I-NEXT: and a0, a0, a2 5729e8ecce8SYingwei Zheng; RV32I-NEXT: ret 5739e8ecce8SYingwei Zheng; 5749e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_i64: 5759e8ecce8SYingwei Zheng; RV32ZBB: # %bb.0: # %entry 5769e8ecce8SYingwei Zheng; RV32ZBB-NEXT: bnez a2, .LBB8_2 5779e8ecce8SYingwei Zheng; RV32ZBB-NEXT: # %bb.1: # %entry 5789e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ctz a2, a3 5799e8ecce8SYingwei Zheng; RV32ZBB-NEXT: addi a4, a2, 32 5809e8ecce8SYingwei Zheng; RV32ZBB-NEXT: j .LBB8_3 5819e8ecce8SYingwei Zheng; RV32ZBB-NEXT: .LBB8_2: 5829e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ctz a4, a2 5839e8ecce8SYingwei Zheng; RV32ZBB-NEXT: .LBB8_3: # %entry 5849e8ecce8SYingwei Zheng; RV32ZBB-NEXT: addi a3, a4, -32 5859e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sll a2, a0, a4 5869e8ecce8SYingwei Zheng; RV32ZBB-NEXT: bltz a3, .LBB8_5 5879e8ecce8SYingwei Zheng; RV32ZBB-NEXT: # %bb.4: # %entry 5889e8ecce8SYingwei Zheng; RV32ZBB-NEXT: mv a1, a2 5899e8ecce8SYingwei Zheng; RV32ZBB-NEXT: j .LBB8_6 5909e8ecce8SYingwei Zheng; RV32ZBB-NEXT: .LBB8_5: 5919e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sll a1, a1, a4 5929e8ecce8SYingwei Zheng; RV32ZBB-NEXT: not a4, a4 5939e8ecce8SYingwei Zheng; RV32ZBB-NEXT: srli a0, a0, 1 5949e8ecce8SYingwei Zheng; RV32ZBB-NEXT: srl a0, a0, a4 5959e8ecce8SYingwei Zheng; RV32ZBB-NEXT: or a1, a1, a0 5969e8ecce8SYingwei Zheng; RV32ZBB-NEXT: .LBB8_6: # %entry 5979e8ecce8SYingwei Zheng; RV32ZBB-NEXT: srai a0, a3, 31 5989e8ecce8SYingwei Zheng; RV32ZBB-NEXT: and a0, a0, a2 5999e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ret 6009e8ecce8SYingwei Zheng; 6019e8ecce8SYingwei Zheng; RV64I-LABEL: shl_cttz_i64: 6029e8ecce8SYingwei Zheng; RV64I: # %bb.0: # %entry 6039e8ecce8SYingwei Zheng; RV64I-NEXT: neg a2, a1 6049e8ecce8SYingwei Zheng; RV64I-NEXT: and a1, a1, a2 6059e8ecce8SYingwei Zheng; RV64I-NEXT: mul a0, a1, a0 6069e8ecce8SYingwei Zheng; RV64I-NEXT: ret 6079e8ecce8SYingwei Zheng; 6089e8ecce8SYingwei Zheng; RV64ZBB-LABEL: shl_cttz_i64: 6099e8ecce8SYingwei Zheng; RV64ZBB: # %bb.0: # %entry 6109e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ctz a1, a1 6119e8ecce8SYingwei Zheng; RV64ZBB-NEXT: sll a0, a0, a1 6129e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ret 6139e8ecce8SYingwei Zhengentry: 6149e8ecce8SYingwei Zheng %cttz = call i64 @llvm.cttz.i64(i64 %y, i1 true) 6159e8ecce8SYingwei Zheng %res = shl i64 %x, %cttz 6169e8ecce8SYingwei Zheng ret i64 %res 6179e8ecce8SYingwei Zheng} 6189e8ecce8SYingwei Zheng 6199e8ecce8SYingwei Zhengdefine i64 @shl_cttz_constant_i64(i64 %y) { 6209e8ecce8SYingwei Zheng; RV32I-LABEL: shl_cttz_constant_i64: 6219e8ecce8SYingwei Zheng; RV32I: # %bb.0: # %entry 6229e8ecce8SYingwei Zheng; RV32I-NEXT: lui a2, 30667 6239e8ecce8SYingwei Zheng; RV32I-NEXT: addi a3, a2, 1329 6249e8ecce8SYingwei Zheng; RV32I-NEXT: lui a2, %hi(.LCPI9_0) 6259e8ecce8SYingwei Zheng; RV32I-NEXT: addi a2, a2, %lo(.LCPI9_0) 6269e8ecce8SYingwei Zheng; RV32I-NEXT: bnez a0, .LBB9_2 6279e8ecce8SYingwei Zheng; RV32I-NEXT: # %bb.1: # %entry 6289e8ecce8SYingwei Zheng; RV32I-NEXT: neg a0, a1 6299e8ecce8SYingwei Zheng; RV32I-NEXT: and a0, a1, a0 6309e8ecce8SYingwei Zheng; RV32I-NEXT: mul a0, a0, a3 6319e8ecce8SYingwei Zheng; RV32I-NEXT: srli a0, a0, 27 6329e8ecce8SYingwei Zheng; RV32I-NEXT: add a0, a2, a0 6339e8ecce8SYingwei Zheng; RV32I-NEXT: lbu a0, 0(a0) 6349e8ecce8SYingwei Zheng; RV32I-NEXT: addi a1, a0, 32 6359e8ecce8SYingwei Zheng; RV32I-NEXT: j .LBB9_3 6369e8ecce8SYingwei Zheng; RV32I-NEXT: .LBB9_2: 6379e8ecce8SYingwei Zheng; RV32I-NEXT: neg a1, a0 6389e8ecce8SYingwei Zheng; RV32I-NEXT: and a0, a0, a1 6399e8ecce8SYingwei Zheng; RV32I-NEXT: mul a0, a0, a3 6409e8ecce8SYingwei Zheng; RV32I-NEXT: srli a0, a0, 27 6419e8ecce8SYingwei Zheng; RV32I-NEXT: add a0, a2, a0 6429e8ecce8SYingwei Zheng; RV32I-NEXT: lbu a1, 0(a0) 6439e8ecce8SYingwei Zheng; RV32I-NEXT: .LBB9_3: # %entry 6449e8ecce8SYingwei Zheng; RV32I-NEXT: li a0, 4 6459e8ecce8SYingwei Zheng; RV32I-NEXT: addi a2, a1, -32 6469e8ecce8SYingwei Zheng; RV32I-NEXT: sll a0, a0, a1 6479e8ecce8SYingwei Zheng; RV32I-NEXT: bltz a2, .LBB9_5 6489e8ecce8SYingwei Zheng; RV32I-NEXT: # %bb.4: # %entry 6499e8ecce8SYingwei Zheng; RV32I-NEXT: mv a1, a0 6509e8ecce8SYingwei Zheng; RV32I-NEXT: j .LBB9_6 6519e8ecce8SYingwei Zheng; RV32I-NEXT: .LBB9_5: 6529e8ecce8SYingwei Zheng; RV32I-NEXT: not a1, a1 6539e8ecce8SYingwei Zheng; RV32I-NEXT: li a3, 2 6549e8ecce8SYingwei Zheng; RV32I-NEXT: srl a1, a3, a1 6559e8ecce8SYingwei Zheng; RV32I-NEXT: .LBB9_6: # %entry 6569e8ecce8SYingwei Zheng; RV32I-NEXT: srai a2, a2, 31 6579e8ecce8SYingwei Zheng; RV32I-NEXT: and a0, a2, a0 6589e8ecce8SYingwei Zheng; RV32I-NEXT: ret 6599e8ecce8SYingwei Zheng; 6609e8ecce8SYingwei Zheng; RV32ZBB-LABEL: shl_cttz_constant_i64: 6619e8ecce8SYingwei Zheng; RV32ZBB: # %bb.0: # %entry 6629e8ecce8SYingwei Zheng; RV32ZBB-NEXT: bnez a0, .LBB9_2 6639e8ecce8SYingwei Zheng; RV32ZBB-NEXT: # %bb.1: # %entry 6649e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ctz a0, a1 6659e8ecce8SYingwei Zheng; RV32ZBB-NEXT: addi a1, a0, 32 6669e8ecce8SYingwei Zheng; RV32ZBB-NEXT: j .LBB9_3 6679e8ecce8SYingwei Zheng; RV32ZBB-NEXT: .LBB9_2: 6689e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ctz a1, a0 6699e8ecce8SYingwei Zheng; RV32ZBB-NEXT: .LBB9_3: # %entry 6709e8ecce8SYingwei Zheng; RV32ZBB-NEXT: li a0, 4 6719e8ecce8SYingwei Zheng; RV32ZBB-NEXT: addi a2, a1, -32 6729e8ecce8SYingwei Zheng; RV32ZBB-NEXT: sll a0, a0, a1 6739e8ecce8SYingwei Zheng; RV32ZBB-NEXT: bltz a2, .LBB9_5 6749e8ecce8SYingwei Zheng; RV32ZBB-NEXT: # %bb.4: # %entry 6759e8ecce8SYingwei Zheng; RV32ZBB-NEXT: mv a1, a0 6769e8ecce8SYingwei Zheng; RV32ZBB-NEXT: j .LBB9_6 6779e8ecce8SYingwei Zheng; RV32ZBB-NEXT: .LBB9_5: 6789e8ecce8SYingwei Zheng; RV32ZBB-NEXT: not a1, a1 6799e8ecce8SYingwei Zheng; RV32ZBB-NEXT: li a3, 2 6809e8ecce8SYingwei Zheng; RV32ZBB-NEXT: srl a1, a3, a1 6819e8ecce8SYingwei Zheng; RV32ZBB-NEXT: .LBB9_6: # %entry 6829e8ecce8SYingwei Zheng; RV32ZBB-NEXT: srai a2, a2, 31 6839e8ecce8SYingwei Zheng; RV32ZBB-NEXT: and a0, a2, a0 6849e8ecce8SYingwei Zheng; RV32ZBB-NEXT: ret 6859e8ecce8SYingwei Zheng; 6869e8ecce8SYingwei Zheng; RV64I-LABEL: shl_cttz_constant_i64: 6879e8ecce8SYingwei Zheng; RV64I: # %bb.0: # %entry 6889e8ecce8SYingwei Zheng; RV64I-NEXT: neg a1, a0 6899e8ecce8SYingwei Zheng; RV64I-NEXT: and a0, a0, a1 6909e8ecce8SYingwei Zheng; RV64I-NEXT: slli a0, a0, 2 6919e8ecce8SYingwei Zheng; RV64I-NEXT: ret 6929e8ecce8SYingwei Zheng; 6939e8ecce8SYingwei Zheng; RV64ZBB-LABEL: shl_cttz_constant_i64: 6949e8ecce8SYingwei Zheng; RV64ZBB: # %bb.0: # %entry 6959e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ctz a0, a0 6969e8ecce8SYingwei Zheng; RV64ZBB-NEXT: li a1, 4 6979e8ecce8SYingwei Zheng; RV64ZBB-NEXT: sll a0, a1, a0 6989e8ecce8SYingwei Zheng; RV64ZBB-NEXT: ret 6999e8ecce8SYingwei Zhengentry: 7009e8ecce8SYingwei Zheng %cttz = call i64 @llvm.cttz.i64(i64 %y, i1 true) 7019e8ecce8SYingwei Zheng %res = shl i64 4, %cttz 7029e8ecce8SYingwei Zheng ret i64 %res 7039e8ecce8SYingwei Zheng} 7049e8ecce8SYingwei Zheng 7059e8ecce8SYingwei Zhengdeclare void @use32(i32 signext) 706