1dcd751b2SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2dcd751b2SCraig Topper; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 3d0312a5cSCraig Topper; RUN: | FileCheck %s -check-prefixes=RV32_NOZBB,RV32I 4dcd751b2SCraig Topper; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 5d0312a5cSCraig Topper; RUN: | FileCheck %s -check-prefixes=RV64NOZBB,RV64I 6d0312a5cSCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \ 7d0312a5cSCraig Topper; RUN: | FileCheck %s -check-prefixes=RV32_NOZBB,RV32M 8d0312a5cSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \ 9d0312a5cSCraig Topper; RUN: | FileCheck %s -check-prefixes=RV64NOZBB,RV64M 10dcd751b2SCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+zbb -verify-machineinstrs < %s \ 11dcd751b2SCraig Topper; RUN: | FileCheck %s -check-prefix=RV32ZBB 12dcd751b2SCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+zbb -verify-machineinstrs < %s \ 13dcd751b2SCraig Topper; RUN: | FileCheck %s -check-prefix=RV64ZBB 14fc02eeb2SPhilipp Tomsich; RUN: llc -mtriple=riscv32 -mattr=+xtheadbb -verify-machineinstrs < %s \ 15fc02eeb2SPhilipp Tomsich; RUN: | FileCheck %s -check-prefix=RV32XTHEADBB 16fc02eeb2SPhilipp Tomsich; RUN: llc -mtriple=riscv64 -mattr=+xtheadbb -verify-machineinstrs < %s \ 17fc02eeb2SPhilipp Tomsich; RUN: | FileCheck %s -check-prefix=RV64XTHEADBB 18dcd751b2SCraig Topper 19dcd751b2SCraig Topperdeclare i8 @llvm.cttz.i8(i8, i1) 20dcd751b2SCraig Topperdeclare i16 @llvm.cttz.i16(i16, i1) 21dcd751b2SCraig Topperdeclare i32 @llvm.cttz.i32(i32, i1) 22dcd751b2SCraig Topperdeclare i64 @llvm.cttz.i64(i64, i1) 23c748d2cdSCraig Topperdeclare i8 @llvm.ctlz.i8(i8, i1) 24c748d2cdSCraig Topperdeclare i16 @llvm.ctlz.i16(i16, i1) 25dcd751b2SCraig Topperdeclare i32 @llvm.ctlz.i32(i32, i1) 26c748d2cdSCraig Topperdeclare i64 @llvm.ctlz.i64(i64, i1) 27c748d2cdSCraig Topperdeclare i8 @llvm.ctpop.i8(i8) 28c748d2cdSCraig Topperdeclare i16 @llvm.ctpop.i16(i16) 29dcd751b2SCraig Topperdeclare i32 @llvm.ctpop.i32(i32) 30dcd751b2SCraig Topperdeclare i64 @llvm.ctpop.i64(i64) 31dcd751b2SCraig Topper 32dcd751b2SCraig Topperdefine i8 @test_cttz_i8(i8 %a) nounwind { 33d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_cttz_i8: 34d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 35d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a1, a0, 255 36d0312a5cSCraig Topper; RV32_NOZBB-NEXT: beqz a1, .LBB0_2 37d0312a5cSCraig Topper; RV32_NOZBB-NEXT: # %bb.1: # %cond.false 38d0312a5cSCraig Topper; RV32_NOZBB-NEXT: addi a1, a0, -1 39d0312a5cSCraig Topper; RV32_NOZBB-NEXT: not a0, a0 40d0312a5cSCraig Topper; RV32_NOZBB-NEXT: and a0, a0, a1 41d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 1 42d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a1, a1, 85 43d0312a5cSCraig Topper; RV32_NOZBB-NEXT: sub a0, a0, a1 44d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a1, a0, 51 45d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 2 46d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 51 47d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a1, a0 48d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 49d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a0, a1 50d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 15 51d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 52d0312a5cSCraig Topper; RV32_NOZBB-NEXT: .LBB0_2: 53d0312a5cSCraig Topper; RV32_NOZBB-NEXT: li a0, 8 54d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 55dcd751b2SCraig Topper; 56d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_cttz_i8: 57d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 58d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a1, a0, 255 59d0312a5cSCraig Topper; RV64NOZBB-NEXT: beqz a1, .LBB0_2 60d0312a5cSCraig Topper; RV64NOZBB-NEXT: # %bb.1: # %cond.false 6186240751SPhilip Reames; RV64NOZBB-NEXT: addi a1, a0, -1 62d0312a5cSCraig Topper; RV64NOZBB-NEXT: not a0, a0 63d0312a5cSCraig Topper; RV64NOZBB-NEXT: and a0, a0, a1 64d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 1 65d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a1, a1, 85 66cdf09ce7SCraig Topper; RV64NOZBB-NEXT: subw a0, a0, a1 67d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a1, a0, 51 68d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 2 69d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 51 70d0312a5cSCraig Topper; RV64NOZBB-NEXT: add a0, a1, a0 71d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 72d64d3c5aSNitin John Raj; RV64NOZBB-NEXT: add a0, a0, a1 73d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 15 74d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 75d0312a5cSCraig Topper; RV64NOZBB-NEXT: .LBB0_2: 76d0312a5cSCraig Topper; RV64NOZBB-NEXT: li a0, 8 77d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 78dcd751b2SCraig Topper; 79dcd751b2SCraig Topper; RV32ZBB-LABEL: test_cttz_i8: 80dcd751b2SCraig Topper; RV32ZBB: # %bb.0: 81dcd751b2SCraig Topper; RV32ZBB-NEXT: ori a0, a0, 256 82dcd751b2SCraig Topper; RV32ZBB-NEXT: ctz a0, a0 83dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 84dcd751b2SCraig Topper; 85dcd751b2SCraig Topper; RV64ZBB-LABEL: test_cttz_i8: 86dcd751b2SCraig Topper; RV64ZBB: # %bb.0: 87dcd751b2SCraig Topper; RV64ZBB-NEXT: ori a0, a0, 256 88dcd751b2SCraig Topper; RV64ZBB-NEXT: ctz a0, a0 89dcd751b2SCraig Topper; RV64ZBB-NEXT: ret 90fc02eeb2SPhilipp Tomsich; 91fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_cttz_i8: 92fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 93fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: andi a1, a0, 255 94fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: beqz a1, .LBB0_2 95fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: # %bb.1: # %cond.false 96fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a1, a0, -1 97fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: not a0, a0 98fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: and a0, a0, a1 99fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 100fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 32 101fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: sub a0, a1, a0 102fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 103fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: .LBB0_2: 104fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a0, 8 105fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 106fc02eeb2SPhilipp Tomsich; 107fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_cttz_i8: 108fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 109fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: andi a1, a0, 255 110fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: beqz a1, .LBB0_2 111fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: # %bb.1: # %cond.false 112fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: addi a1, a0, -1 113fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: not a0, a0 114fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: and a0, a0, a1 115fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 116fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: li a1, 64 117fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: sub a0, a1, a0 118fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 119fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: .LBB0_2: 120fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: li a0, 8 121fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 122dcd751b2SCraig Topper %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 false) 123dcd751b2SCraig Topper ret i8 %tmp 124dcd751b2SCraig Topper} 125dcd751b2SCraig Topper 126dcd751b2SCraig Topperdefine i16 @test_cttz_i16(i16 %a) nounwind { 127d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_cttz_i16: 128d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 129d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a1, a0, 16 130d0312a5cSCraig Topper; RV32_NOZBB-NEXT: beqz a1, .LBB1_2 131d0312a5cSCraig Topper; RV32_NOZBB-NEXT: # %bb.1: # %cond.false 132d0312a5cSCraig Topper; RV32_NOZBB-NEXT: addi a1, a0, -1 133d0312a5cSCraig Topper; RV32_NOZBB-NEXT: not a0, a0 134d0312a5cSCraig Topper; RV32_NOZBB-NEXT: lui a2, 5 135d0312a5cSCraig Topper; RV32_NOZBB-NEXT: and a0, a0, a1 136*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: addi a1, a2, 1365 137*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: srli a2, a0, 1 138*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a1, a2, a1 139*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: lui a2, 3 140*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: addi a2, a2, 819 141*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: sub a0, a0, a1 142*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a1, a0, a2 143*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: srli a0, a0, 2 144*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a0, a0, a2 145*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: add a0, a1, a0 146d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 147d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a0, a1 1481c4880a2SCraig Topper; RV32_NOZBB-NEXT: andi a1, a0, 15 1491c4880a2SCraig Topper; RV32_NOZBB-NEXT: slli a0, a0, 20 1501c4880a2SCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 28 151d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a1, a0 152d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 153d0312a5cSCraig Topper; RV32_NOZBB-NEXT: .LBB1_2: 154d0312a5cSCraig Topper; RV32_NOZBB-NEXT: li a0, 16 155d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 156dcd751b2SCraig Topper; 157d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_cttz_i16: 158d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 159d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 48 160d0312a5cSCraig Topper; RV64NOZBB-NEXT: beqz a1, .LBB1_2 161d0312a5cSCraig Topper; RV64NOZBB-NEXT: # %bb.1: # %cond.false 162d0312a5cSCraig Topper; RV64NOZBB-NEXT: addi a1, a0, -1 163d0312a5cSCraig Topper; RV64NOZBB-NEXT: not a0, a0 164d0312a5cSCraig Topper; RV64NOZBB-NEXT: lui a2, 5 165d0312a5cSCraig Topper; RV64NOZBB-NEXT: and a0, a0, a1 166*9122c523SPengcheng Wang; RV64NOZBB-NEXT: addiw a1, a2, 1365 167*9122c523SPengcheng Wang; RV64NOZBB-NEXT: srli a2, a0, 1 168*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a1, a2, a1 169*9122c523SPengcheng Wang; RV64NOZBB-NEXT: lui a2, 3 170*9122c523SPengcheng Wang; RV64NOZBB-NEXT: addiw a2, a2, 819 171*9122c523SPengcheng Wang; RV64NOZBB-NEXT: sub a0, a0, a1 172*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a1, a0, a2 173*9122c523SPengcheng Wang; RV64NOZBB-NEXT: srli a0, a0, 2 174*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a0, a0, a2 175*9122c523SPengcheng Wang; RV64NOZBB-NEXT: add a0, a1, a0 176d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 177d64d3c5aSNitin John Raj; RV64NOZBB-NEXT: add a0, a0, a1 1781c4880a2SCraig Topper; RV64NOZBB-NEXT: andi a1, a0, 15 1791c4880a2SCraig Topper; RV64NOZBB-NEXT: slli a0, a0, 52 1801c4880a2SCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 60 1811c4880a2SCraig Topper; RV64NOZBB-NEXT: add a0, a1, a0 182d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 183d0312a5cSCraig Topper; RV64NOZBB-NEXT: .LBB1_2: 184d0312a5cSCraig Topper; RV64NOZBB-NEXT: li a0, 16 185d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 186dcd751b2SCraig Topper; 187dcd751b2SCraig Topper; RV32ZBB-LABEL: test_cttz_i16: 188dcd751b2SCraig Topper; RV32ZBB: # %bb.0: 189dcd751b2SCraig Topper; RV32ZBB-NEXT: lui a1, 16 190dcd751b2SCraig Topper; RV32ZBB-NEXT: or a0, a0, a1 191dcd751b2SCraig Topper; RV32ZBB-NEXT: ctz a0, a0 192dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 193dcd751b2SCraig Topper; 194dcd751b2SCraig Topper; RV64ZBB-LABEL: test_cttz_i16: 195dcd751b2SCraig Topper; RV64ZBB: # %bb.0: 196dcd751b2SCraig Topper; RV64ZBB-NEXT: lui a1, 16 197dcd751b2SCraig Topper; RV64ZBB-NEXT: or a0, a0, a1 198dcd751b2SCraig Topper; RV64ZBB-NEXT: ctz a0, a0 199dcd751b2SCraig Topper; RV64ZBB-NEXT: ret 200fc02eeb2SPhilipp Tomsich; 201fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_cttz_i16: 202fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 203fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: slli a1, a0, 16 204fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: beqz a1, .LBB1_2 205fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: # %bb.1: # %cond.false 206fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a1, a0, -1 207fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: not a0, a0 208fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: and a0, a0, a1 209fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 210fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 32 211fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: sub a0, a1, a0 212fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 213fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: .LBB1_2: 214fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a0, 16 215fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 216fc02eeb2SPhilipp Tomsich; 217fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_cttz_i16: 218fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 219fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: slli a1, a0, 48 220fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: beqz a1, .LBB1_2 221fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: # %bb.1: # %cond.false 222fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: addi a1, a0, -1 223fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: not a0, a0 224fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: and a0, a0, a1 225fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 226fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: li a1, 64 227fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: sub a0, a1, a0 228fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 229fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: .LBB1_2: 230fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: li a0, 16 231fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 232dcd751b2SCraig Topper %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 false) 233dcd751b2SCraig Topper ret i16 %tmp 234dcd751b2SCraig Topper} 235dcd751b2SCraig Topper 236dcd751b2SCraig Topperdefine i32 @test_cttz_i32(i32 %a) nounwind { 237dcd751b2SCraig Topper; RV32I-LABEL: test_cttz_i32: 238dcd751b2SCraig Topper; RV32I: # %bb.0: 23930305d79SCraig Topper; RV32I-NEXT: beqz a0, .LBB2_2 2407af3d4abSDimitry Andric; RV32I-NEXT: # %bb.1: # %cond.false 2415744b9cbSYeting Kuo; RV32I-NEXT: addi sp, sp, -16 2425744b9cbSYeting Kuo; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24330305d79SCraig Topper; RV32I-NEXT: neg a1, a0 24430305d79SCraig Topper; RV32I-NEXT: and a0, a0, a1 245ab4fc87aSShubham Narlawar; RV32I-NEXT: lui a1, 30667 246ab4fc87aSShubham Narlawar; RV32I-NEXT: addi a1, a1, 1329 247eabaee0cSFangrui Song; RV32I-NEXT: call __mulsi3 24830305d79SCraig Topper; RV32I-NEXT: srli a0, a0, 27 249ab4fc87aSShubham Narlawar; RV32I-NEXT: lui a1, %hi(.LCPI2_0) 250ab4fc87aSShubham Narlawar; RV32I-NEXT: addi a1, a1, %lo(.LCPI2_0) 251ab4fc87aSShubham Narlawar; RV32I-NEXT: add a0, a1, a0 252ab4fc87aSShubham Narlawar; RV32I-NEXT: lbu a0, 0(a0) 2537af3d4abSDimitry Andric; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2547af3d4abSDimitry Andric; RV32I-NEXT: addi sp, sp, 16 255dcd751b2SCraig Topper; RV32I-NEXT: ret 25630305d79SCraig Topper; RV32I-NEXT: .LBB2_2: 2575744b9cbSYeting Kuo; RV32I-NEXT: li a0, 32 2585744b9cbSYeting Kuo; RV32I-NEXT: ret 259dcd751b2SCraig Topper; 260dcd751b2SCraig Topper; RV64I-LABEL: test_cttz_i32: 261dcd751b2SCraig Topper; RV64I: # %bb.0: 26230305d79SCraig Topper; RV64I-NEXT: sext.w a1, a0 26330305d79SCraig Topper; RV64I-NEXT: beqz a1, .LBB2_2 26430305d79SCraig Topper; RV64I-NEXT: # %bb.1: # %cond.false 2655744b9cbSYeting Kuo; RV64I-NEXT: addi sp, sp, -16 2665744b9cbSYeting Kuo; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 267ab4fc87aSShubham Narlawar; RV64I-NEXT: neg a1, a0 268dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a1 269ab4fc87aSShubham Narlawar; RV64I-NEXT: lui a1, 30667 270ab4fc87aSShubham Narlawar; RV64I-NEXT: addiw a1, a1, 1329 271eabaee0cSFangrui Song; RV64I-NEXT: call __muldi3 27230305d79SCraig Topper; RV64I-NEXT: srliw a0, a0, 27 273ab4fc87aSShubham Narlawar; RV64I-NEXT: lui a1, %hi(.LCPI2_0) 274ab4fc87aSShubham Narlawar; RV64I-NEXT: addi a1, a1, %lo(.LCPI2_0) 275ab4fc87aSShubham Narlawar; RV64I-NEXT: add a0, a1, a0 276ab4fc87aSShubham Narlawar; RV64I-NEXT: lbu a0, 0(a0) 277ab4fc87aSShubham Narlawar; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 278ab4fc87aSShubham Narlawar; RV64I-NEXT: addi sp, sp, 16 2795744b9cbSYeting Kuo; RV64I-NEXT: ret 28030305d79SCraig Topper; RV64I-NEXT: .LBB2_2: 28130305d79SCraig Topper; RV64I-NEXT: li a0, 32 28230305d79SCraig Topper; RV64I-NEXT: ret 283dcd751b2SCraig Topper; 284d0312a5cSCraig Topper; RV32M-LABEL: test_cttz_i32: 285d0312a5cSCraig Topper; RV32M: # %bb.0: 28630305d79SCraig Topper; RV32M-NEXT: beqz a0, .LBB2_2 287d0312a5cSCraig Topper; RV32M-NEXT: # %bb.1: # %cond.false 28830305d79SCraig Topper; RV32M-NEXT: neg a1, a0 28930305d79SCraig Topper; RV32M-NEXT: and a0, a0, a1 290ab4fc87aSShubham Narlawar; RV32M-NEXT: lui a1, 30667 291ab4fc87aSShubham Narlawar; RV32M-NEXT: addi a1, a1, 1329 292d0312a5cSCraig Topper; RV32M-NEXT: mul a0, a0, a1 293ab4fc87aSShubham Narlawar; RV32M-NEXT: srli a0, a0, 27 294ab4fc87aSShubham Narlawar; RV32M-NEXT: lui a1, %hi(.LCPI2_0) 295ab4fc87aSShubham Narlawar; RV32M-NEXT: addi a1, a1, %lo(.LCPI2_0) 296ab4fc87aSShubham Narlawar; RV32M-NEXT: add a0, a1, a0 297ab4fc87aSShubham Narlawar; RV32M-NEXT: lbu a0, 0(a0) 298d0312a5cSCraig Topper; RV32M-NEXT: ret 29930305d79SCraig Topper; RV32M-NEXT: .LBB2_2: 300d0312a5cSCraig Topper; RV32M-NEXT: li a0, 32 301d0312a5cSCraig Topper; RV32M-NEXT: ret 302d0312a5cSCraig Topper; 303d0312a5cSCraig Topper; RV64M-LABEL: test_cttz_i32: 304d0312a5cSCraig Topper; RV64M: # %bb.0: 30530305d79SCraig Topper; RV64M-NEXT: sext.w a1, a0 30630305d79SCraig Topper; RV64M-NEXT: beqz a1, .LBB2_2 307d0312a5cSCraig Topper; RV64M-NEXT: # %bb.1: # %cond.false 308d741a31aSNitin John Raj; RV64M-NEXT: negw a1, a0 30930305d79SCraig Topper; RV64M-NEXT: and a0, a0, a1 310ab4fc87aSShubham Narlawar; RV64M-NEXT: lui a1, 30667 31186240751SPhilip Reames; RV64M-NEXT: addi a1, a1, 1329 3124063369fSCraig Topper; RV64M-NEXT: mul a0, a0, a1 313ab4fc87aSShubham Narlawar; RV64M-NEXT: srliw a0, a0, 27 314ab4fc87aSShubham Narlawar; RV64M-NEXT: lui a1, %hi(.LCPI2_0) 315ab4fc87aSShubham Narlawar; RV64M-NEXT: addi a1, a1, %lo(.LCPI2_0) 316ab4fc87aSShubham Narlawar; RV64M-NEXT: add a0, a1, a0 317ab4fc87aSShubham Narlawar; RV64M-NEXT: lbu a0, 0(a0) 318d0312a5cSCraig Topper; RV64M-NEXT: ret 31930305d79SCraig Topper; RV64M-NEXT: .LBB2_2: 320d0312a5cSCraig Topper; RV64M-NEXT: li a0, 32 321d0312a5cSCraig Topper; RV64M-NEXT: ret 322d0312a5cSCraig Topper; 323dcd751b2SCraig Topper; RV32ZBB-LABEL: test_cttz_i32: 324dcd751b2SCraig Topper; RV32ZBB: # %bb.0: 325dcd751b2SCraig Topper; RV32ZBB-NEXT: ctz a0, a0 326dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 327dcd751b2SCraig Topper; 328dcd751b2SCraig Topper; RV64ZBB-LABEL: test_cttz_i32: 329dcd751b2SCraig Topper; RV64ZBB: # %bb.0: 330dcd751b2SCraig Topper; RV64ZBB-NEXT: ctzw a0, a0 331dcd751b2SCraig Topper; RV64ZBB-NEXT: ret 332fc02eeb2SPhilipp Tomsich; 333fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_cttz_i32: 334fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 335fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: beqz a0, .LBB2_2 336fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: # %bb.1: # %cond.false 337fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a1, a0, -1 338fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: not a0, a0 339fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: and a0, a0, a1 340fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 341fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 32 342fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: sub a0, a1, a0 343fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 344fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: .LBB2_2: 345fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a0, 32 346fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 347fc02eeb2SPhilipp Tomsich; 348fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_cttz_i32: 349fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 350fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: sext.w a1, a0 351fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: beqz a1, .LBB2_2 352fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: # %bb.1: # %cond.false 353fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: addi a1, a0, -1 354fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: not a0, a0 355fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: and a0, a0, a1 356fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 357fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: li a1, 64 358fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: sub a0, a1, a0 359fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 360fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: .LBB2_2: 361fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: li a0, 32 362fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 363dcd751b2SCraig Topper %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 false) 364dcd751b2SCraig Topper ret i32 %tmp 365dcd751b2SCraig Topper} 366dcd751b2SCraig Topper 367dcd751b2SCraig Topperdefine i64 @test_cttz_i64(i64 %a) nounwind { 368dcd751b2SCraig Topper; RV32I-LABEL: test_cttz_i64: 369dcd751b2SCraig Topper; RV32I: # %bb.0: 370dcd751b2SCraig Topper; RV32I-NEXT: addi sp, sp, -32 371dcd751b2SCraig Topper; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 372dcd751b2SCraig Topper; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 373dcd751b2SCraig Topper; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 374dcd751b2SCraig Topper; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 375dcd751b2SCraig Topper; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 376dcd751b2SCraig Topper; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill 37730305d79SCraig Topper; RV32I-NEXT: mv s2, a1 378dcd751b2SCraig Topper; RV32I-NEXT: mv s0, a0 379ab4fc87aSShubham Narlawar; RV32I-NEXT: neg a0, a0 380ab4fc87aSShubham Narlawar; RV32I-NEXT: and a0, s0, a0 381ab4fc87aSShubham Narlawar; RV32I-NEXT: lui a1, 30667 382ab4fc87aSShubham Narlawar; RV32I-NEXT: addi s3, a1, 1329 383dcd751b2SCraig Topper; RV32I-NEXT: mv a1, s3 384eabaee0cSFangrui Song; RV32I-NEXT: call __mulsi3 38530305d79SCraig Topper; RV32I-NEXT: mv s1, a0 3862d00c6feSCraig Topper; RV32I-NEXT: lui s4, %hi(.LCPI3_0) 3872d00c6feSCraig Topper; RV32I-NEXT: addi s4, s4, %lo(.LCPI3_0) 38830305d79SCraig Topper; RV32I-NEXT: neg a0, s2 38930305d79SCraig Topper; RV32I-NEXT: and a0, s2, a0 390ab4fc87aSShubham Narlawar; RV32I-NEXT: mv a1, s3 391eabaee0cSFangrui Song; RV32I-NEXT: call __mulsi3 3927b970290SLiaoChunyu; RV32I-NEXT: bnez s2, .LBB3_3 39330305d79SCraig Topper; RV32I-NEXT: # %bb.1: 3947b970290SLiaoChunyu; RV32I-NEXT: li a0, 32 3957b970290SLiaoChunyu; RV32I-NEXT: beqz s0, .LBB3_4 39630305d79SCraig Topper; RV32I-NEXT: .LBB3_2: 397a8c79121SCraig Topper; RV32I-NEXT: srli s1, s1, 27 398a8c79121SCraig Topper; RV32I-NEXT: add s1, s4, s1 399a8c79121SCraig Topper; RV32I-NEXT: lbu a0, 0(s1) 4007b970290SLiaoChunyu; RV32I-NEXT: j .LBB3_5 4017b970290SLiaoChunyu; RV32I-NEXT: .LBB3_3: 4027b970290SLiaoChunyu; RV32I-NEXT: srli a0, a0, 27 4037b970290SLiaoChunyu; RV32I-NEXT: add a0, s4, a0 4047b970290SLiaoChunyu; RV32I-NEXT: lbu a0, 0(a0) 4057b970290SLiaoChunyu; RV32I-NEXT: bnez s0, .LBB3_2 4067b970290SLiaoChunyu; RV32I-NEXT: .LBB3_4: 4077b970290SLiaoChunyu; RV32I-NEXT: addi a0, a0, 32 40830305d79SCraig Topper; RV32I-NEXT: .LBB3_5: 409dcd751b2SCraig Topper; RV32I-NEXT: li a1, 0 410dcd751b2SCraig Topper; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 411dcd751b2SCraig Topper; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 412dcd751b2SCraig Topper; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 413dcd751b2SCraig Topper; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 414dcd751b2SCraig Topper; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 415dcd751b2SCraig Topper; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload 416dcd751b2SCraig Topper; RV32I-NEXT: addi sp, sp, 32 417dcd751b2SCraig Topper; RV32I-NEXT: ret 418dcd751b2SCraig Topper; 419dcd751b2SCraig Topper; RV64I-LABEL: test_cttz_i64: 420dcd751b2SCraig Topper; RV64I: # %bb.0: 42130305d79SCraig Topper; RV64I-NEXT: beqz a0, .LBB3_2 4227af3d4abSDimitry Andric; RV64I-NEXT: # %bb.1: # %cond.false 4235744b9cbSYeting Kuo; RV64I-NEXT: addi sp, sp, -16 4245744b9cbSYeting Kuo; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 42530305d79SCraig Topper; RV64I-NEXT: neg a1, a0 42630305d79SCraig Topper; RV64I-NEXT: and a0, a0, a1 427c748d2cdSCraig Topper; RV64I-NEXT: lui a1, %hi(.LCPI3_0) 428c748d2cdSCraig Topper; RV64I-NEXT: ld a1, %lo(.LCPI3_0)(a1) 429eabaee0cSFangrui Song; RV64I-NEXT: call __muldi3 43030305d79SCraig Topper; RV64I-NEXT: srli a0, a0, 58 431ab4fc87aSShubham Narlawar; RV64I-NEXT: lui a1, %hi(.LCPI3_1) 432ab4fc87aSShubham Narlawar; RV64I-NEXT: addi a1, a1, %lo(.LCPI3_1) 433ab4fc87aSShubham Narlawar; RV64I-NEXT: add a0, a1, a0 434ab4fc87aSShubham Narlawar; RV64I-NEXT: lbu a0, 0(a0) 4357af3d4abSDimitry Andric; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4367af3d4abSDimitry Andric; RV64I-NEXT: addi sp, sp, 16 437dcd751b2SCraig Topper; RV64I-NEXT: ret 43830305d79SCraig Topper; RV64I-NEXT: .LBB3_2: 4395744b9cbSYeting Kuo; RV64I-NEXT: li a0, 64 4405744b9cbSYeting Kuo; RV64I-NEXT: ret 441dcd751b2SCraig Topper; 442d0312a5cSCraig Topper; RV32M-LABEL: test_cttz_i64: 443d0312a5cSCraig Topper; RV32M: # %bb.0: 444ab4fc87aSShubham Narlawar; RV32M-NEXT: lui a2, 30667 4452d00c6feSCraig Topper; RV32M-NEXT: addi a3, a2, 1329 4462d00c6feSCraig Topper; RV32M-NEXT: lui a2, %hi(.LCPI3_0) 4472d00c6feSCraig Topper; RV32M-NEXT: addi a2, a2, %lo(.LCPI3_0) 4487b970290SLiaoChunyu; RV32M-NEXT: bnez a1, .LBB3_3 449d0312a5cSCraig Topper; RV32M-NEXT: # %bb.1: 4507b970290SLiaoChunyu; RV32M-NEXT: li a1, 32 4517b970290SLiaoChunyu; RV32M-NEXT: beqz a0, .LBB3_4 452d0312a5cSCraig Topper; RV32M-NEXT: .LBB3_2: 45330305d79SCraig Topper; RV32M-NEXT: neg a1, a0 45430305d79SCraig Topper; RV32M-NEXT: and a0, a0, a1 4552d00c6feSCraig Topper; RV32M-NEXT: mul a0, a0, a3 45630305d79SCraig Topper; RV32M-NEXT: srli a0, a0, 27 4572d00c6feSCraig Topper; RV32M-NEXT: add a0, a2, a0 45830305d79SCraig Topper; RV32M-NEXT: lbu a0, 0(a0) 45930305d79SCraig Topper; RV32M-NEXT: li a1, 0 46030305d79SCraig Topper; RV32M-NEXT: ret 4617b970290SLiaoChunyu; RV32M-NEXT: .LBB3_3: 4627b970290SLiaoChunyu; RV32M-NEXT: neg a4, a1 4637b970290SLiaoChunyu; RV32M-NEXT: and a1, a1, a4 4642d00c6feSCraig Topper; RV32M-NEXT: mul a1, a1, a3 4657b970290SLiaoChunyu; RV32M-NEXT: srli a1, a1, 27 4662d00c6feSCraig Topper; RV32M-NEXT: add a1, a2, a1 4677b970290SLiaoChunyu; RV32M-NEXT: lbu a1, 0(a1) 4687b970290SLiaoChunyu; RV32M-NEXT: bnez a0, .LBB3_2 4697b970290SLiaoChunyu; RV32M-NEXT: .LBB3_4: 4707b970290SLiaoChunyu; RV32M-NEXT: addi a0, a1, 32 4717b970290SLiaoChunyu; RV32M-NEXT: li a1, 0 4727b970290SLiaoChunyu; RV32M-NEXT: ret 473d0312a5cSCraig Topper; 474d0312a5cSCraig Topper; RV64M-LABEL: test_cttz_i64: 475d0312a5cSCraig Topper; RV64M: # %bb.0: 47630305d79SCraig Topper; RV64M-NEXT: beqz a0, .LBB3_2 477d0312a5cSCraig Topper; RV64M-NEXT: # %bb.1: # %cond.false 47830305d79SCraig Topper; RV64M-NEXT: lui a1, %hi(.LCPI3_0) 47930305d79SCraig Topper; RV64M-NEXT: ld a1, %lo(.LCPI3_0)(a1) 48030305d79SCraig Topper; RV64M-NEXT: neg a2, a0 48130305d79SCraig Topper; RV64M-NEXT: and a0, a0, a2 48230305d79SCraig Topper; RV64M-NEXT: mul a0, a0, a1 483ab4fc87aSShubham Narlawar; RV64M-NEXT: srli a0, a0, 58 484ab4fc87aSShubham Narlawar; RV64M-NEXT: lui a1, %hi(.LCPI3_1) 485ab4fc87aSShubham Narlawar; RV64M-NEXT: addi a1, a1, %lo(.LCPI3_1) 486d0312a5cSCraig Topper; RV64M-NEXT: add a0, a1, a0 487ab4fc87aSShubham Narlawar; RV64M-NEXT: lbu a0, 0(a0) 488d0312a5cSCraig Topper; RV64M-NEXT: ret 48930305d79SCraig Topper; RV64M-NEXT: .LBB3_2: 490d0312a5cSCraig Topper; RV64M-NEXT: li a0, 64 491d0312a5cSCraig Topper; RV64M-NEXT: ret 492d0312a5cSCraig Topper; 493dcd751b2SCraig Topper; RV32ZBB-LABEL: test_cttz_i64: 494dcd751b2SCraig Topper; RV32ZBB: # %bb.0: 495c748d2cdSCraig Topper; RV32ZBB-NEXT: bnez a0, .LBB3_2 496dcd751b2SCraig Topper; RV32ZBB-NEXT: # %bb.1: 497dcd751b2SCraig Topper; RV32ZBB-NEXT: ctz a0, a1 498dcd751b2SCraig Topper; RV32ZBB-NEXT: addi a0, a0, 32 499dcd751b2SCraig Topper; RV32ZBB-NEXT: li a1, 0 500dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 501c748d2cdSCraig Topper; RV32ZBB-NEXT: .LBB3_2: 502dcd751b2SCraig Topper; RV32ZBB-NEXT: ctz a0, a0 503dcd751b2SCraig Topper; RV32ZBB-NEXT: li a1, 0 504dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 505dcd751b2SCraig Topper; 506dcd751b2SCraig Topper; RV64ZBB-LABEL: test_cttz_i64: 507dcd751b2SCraig Topper; RV64ZBB: # %bb.0: 508dcd751b2SCraig Topper; RV64ZBB-NEXT: ctz a0, a0 509dcd751b2SCraig Topper; RV64ZBB-NEXT: ret 510fc02eeb2SPhilipp Tomsich; 511fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_cttz_i64: 512fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 513fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: bnez a0, .LBB3_2 514fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: # %bb.1: 515fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a0, a1, -1 516fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: not a1, a1 517fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: and a0, a1, a0 518fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 519fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 64 520fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: j .LBB3_3 521fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: .LBB3_2: 522fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a1, a0, -1 523fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: not a0, a0 524fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: and a0, a0, a1 525fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 526fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 32 527fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: .LBB3_3: 528fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: sub a0, a1, a0 529fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 0 530fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 531fc02eeb2SPhilipp Tomsich; 532fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_cttz_i64: 533fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 534fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: beqz a0, .LBB3_2 535fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: # %bb.1: # %cond.false 536fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: addi a1, a0, -1 537fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: not a0, a0 538fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: and a0, a0, a1 539fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 540fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: li a1, 64 541fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: sub a0, a1, a0 542fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 543fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: .LBB3_2: 544fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: li a0, 64 545fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 546dcd751b2SCraig Topper %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 false) 547dcd751b2SCraig Topper ret i64 %tmp 548dcd751b2SCraig Topper} 549dcd751b2SCraig Topper 550dcd751b2SCraig Topperdefine i8 @test_cttz_i8_zero_undef(i8 %a) nounwind { 551d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_cttz_i8_zero_undef: 552d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 553d0312a5cSCraig Topper; RV32_NOZBB-NEXT: addi a1, a0, -1 554d0312a5cSCraig Topper; RV32_NOZBB-NEXT: not a0, a0 555d0312a5cSCraig Topper; RV32_NOZBB-NEXT: and a0, a0, a1 556d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 1 557d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a1, a1, 85 558d0312a5cSCraig Topper; RV32_NOZBB-NEXT: sub a0, a0, a1 559d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a1, a0, 51 560d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 2 561d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 51 562d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a1, a0 563d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 564d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a0, a1 565d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 15 566d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 567dcd751b2SCraig Topper; 568d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_cttz_i8_zero_undef: 569d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 57086240751SPhilip Reames; RV64NOZBB-NEXT: addi a1, a0, -1 571d0312a5cSCraig Topper; RV64NOZBB-NEXT: not a0, a0 572d0312a5cSCraig Topper; RV64NOZBB-NEXT: and a0, a0, a1 573d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 1 574d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a1, a1, 85 575cdf09ce7SCraig Topper; RV64NOZBB-NEXT: subw a0, a0, a1 576d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a1, a0, 51 577d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 2 578d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 51 579d0312a5cSCraig Topper; RV64NOZBB-NEXT: add a0, a1, a0 580d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 581d64d3c5aSNitin John Raj; RV64NOZBB-NEXT: add a0, a0, a1 582d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 15 583d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 584dcd751b2SCraig Topper; 585dcd751b2SCraig Topper; RV32ZBB-LABEL: test_cttz_i8_zero_undef: 586dcd751b2SCraig Topper; RV32ZBB: # %bb.0: 587dcd751b2SCraig Topper; RV32ZBB-NEXT: ctz a0, a0 588dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 589dcd751b2SCraig Topper; 590dcd751b2SCraig Topper; RV64ZBB-LABEL: test_cttz_i8_zero_undef: 591dcd751b2SCraig Topper; RV64ZBB: # %bb.0: 592dcd751b2SCraig Topper; RV64ZBB-NEXT: ctz a0, a0 593dcd751b2SCraig Topper; RV64ZBB-NEXT: ret 594fc02eeb2SPhilipp Tomsich; 595fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_cttz_i8_zero_undef: 596fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 597fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a1, a0, -1 598fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: not a0, a0 599fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: and a0, a0, a1 600fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 601fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 32 602fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: sub a0, a1, a0 603fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 604fc02eeb2SPhilipp Tomsich; 605fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_cttz_i8_zero_undef: 606fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 607fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: addi a1, a0, -1 608fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: not a0, a0 609fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: and a0, a0, a1 610fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 611fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: li a1, 64 612fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: sub a0, a1, a0 613fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 614dcd751b2SCraig Topper %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 true) 615dcd751b2SCraig Topper ret i8 %tmp 616dcd751b2SCraig Topper} 617dcd751b2SCraig Topper 618dcd751b2SCraig Topperdefine i16 @test_cttz_i16_zero_undef(i16 %a) nounwind { 619d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_cttz_i16_zero_undef: 620d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 621d0312a5cSCraig Topper; RV32_NOZBB-NEXT: addi a1, a0, -1 622d0312a5cSCraig Topper; RV32_NOZBB-NEXT: not a0, a0 623d0312a5cSCraig Topper; RV32_NOZBB-NEXT: lui a2, 5 624d0312a5cSCraig Topper; RV32_NOZBB-NEXT: and a0, a0, a1 625*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: addi a1, a2, 1365 626*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: srli a2, a0, 1 627*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a1, a2, a1 628*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: lui a2, 3 629*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: addi a2, a2, 819 630*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: sub a0, a0, a1 631*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a1, a0, a2 632*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: srli a0, a0, 2 633*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a0, a0, a2 634*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: add a0, a1, a0 635d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 636d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a0, a1 6371c4880a2SCraig Topper; RV32_NOZBB-NEXT: andi a1, a0, 15 6381c4880a2SCraig Topper; RV32_NOZBB-NEXT: slli a0, a0, 20 6391c4880a2SCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 28 640d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a1, a0 641d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 642dcd751b2SCraig Topper; 643d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_cttz_i16_zero_undef: 644d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 645d0312a5cSCraig Topper; RV64NOZBB-NEXT: addi a1, a0, -1 646d0312a5cSCraig Topper; RV64NOZBB-NEXT: not a0, a0 647d0312a5cSCraig Topper; RV64NOZBB-NEXT: lui a2, 5 648d0312a5cSCraig Topper; RV64NOZBB-NEXT: and a0, a0, a1 649*9122c523SPengcheng Wang; RV64NOZBB-NEXT: addiw a1, a2, 1365 650*9122c523SPengcheng Wang; RV64NOZBB-NEXT: srli a2, a0, 1 651*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a1, a2, a1 652*9122c523SPengcheng Wang; RV64NOZBB-NEXT: lui a2, 3 653*9122c523SPengcheng Wang; RV64NOZBB-NEXT: addiw a2, a2, 819 654*9122c523SPengcheng Wang; RV64NOZBB-NEXT: sub a0, a0, a1 655*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a1, a0, a2 656*9122c523SPengcheng Wang; RV64NOZBB-NEXT: srli a0, a0, 2 657*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a0, a0, a2 658*9122c523SPengcheng Wang; RV64NOZBB-NEXT: add a0, a1, a0 659d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 660d64d3c5aSNitin John Raj; RV64NOZBB-NEXT: add a0, a0, a1 6611c4880a2SCraig Topper; RV64NOZBB-NEXT: andi a1, a0, 15 6621c4880a2SCraig Topper; RV64NOZBB-NEXT: slli a0, a0, 52 6631c4880a2SCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 60 6641c4880a2SCraig Topper; RV64NOZBB-NEXT: add a0, a1, a0 665d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 666dcd751b2SCraig Topper; 667dcd751b2SCraig Topper; RV32ZBB-LABEL: test_cttz_i16_zero_undef: 668dcd751b2SCraig Topper; RV32ZBB: # %bb.0: 669dcd751b2SCraig Topper; RV32ZBB-NEXT: ctz a0, a0 670dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 671dcd751b2SCraig Topper; 672dcd751b2SCraig Topper; RV64ZBB-LABEL: test_cttz_i16_zero_undef: 673dcd751b2SCraig Topper; RV64ZBB: # %bb.0: 674dcd751b2SCraig Topper; RV64ZBB-NEXT: ctz a0, a0 675dcd751b2SCraig Topper; RV64ZBB-NEXT: ret 676fc02eeb2SPhilipp Tomsich; 677fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_cttz_i16_zero_undef: 678fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 679fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a1, a0, -1 680fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: not a0, a0 681fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: and a0, a0, a1 682fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 683fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 32 684fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: sub a0, a1, a0 685fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 686fc02eeb2SPhilipp Tomsich; 687fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_cttz_i16_zero_undef: 688fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 689fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: addi a1, a0, -1 690fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: not a0, a0 691fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: and a0, a0, a1 692fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 693fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: li a1, 64 694fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: sub a0, a1, a0 695fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 696dcd751b2SCraig Topper %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 true) 697dcd751b2SCraig Topper ret i16 %tmp 698dcd751b2SCraig Topper} 699dcd751b2SCraig Topper 700dcd751b2SCraig Topperdefine i32 @test_cttz_i32_zero_undef(i32 %a) nounwind { 701dcd751b2SCraig Topper; RV32I-LABEL: test_cttz_i32_zero_undef: 702dcd751b2SCraig Topper; RV32I: # %bb.0: 703dcd751b2SCraig Topper; RV32I-NEXT: addi sp, sp, -16 704dcd751b2SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 70530305d79SCraig Topper; RV32I-NEXT: neg a1, a0 70630305d79SCraig Topper; RV32I-NEXT: and a0, a0, a1 707ab4fc87aSShubham Narlawar; RV32I-NEXT: lui a1, 30667 708ab4fc87aSShubham Narlawar; RV32I-NEXT: addi a1, a1, 1329 709eabaee0cSFangrui Song; RV32I-NEXT: call __mulsi3 71030305d79SCraig Topper; RV32I-NEXT: srli a0, a0, 27 711ab4fc87aSShubham Narlawar; RV32I-NEXT: lui a1, %hi(.LCPI6_0) 712ab4fc87aSShubham Narlawar; RV32I-NEXT: addi a1, a1, %lo(.LCPI6_0) 713ab4fc87aSShubham Narlawar; RV32I-NEXT: add a0, a1, a0 714ab4fc87aSShubham Narlawar; RV32I-NEXT: lbu a0, 0(a0) 715dcd751b2SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 716dcd751b2SCraig Topper; RV32I-NEXT: addi sp, sp, 16 717dcd751b2SCraig Topper; RV32I-NEXT: ret 718dcd751b2SCraig Topper; 719dcd751b2SCraig Topper; RV64I-LABEL: test_cttz_i32_zero_undef: 720dcd751b2SCraig Topper; RV64I: # %bb.0: 721dcd751b2SCraig Topper; RV64I-NEXT: addi sp, sp, -16 722dcd751b2SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 723ab4fc87aSShubham Narlawar; RV64I-NEXT: neg a1, a0 724dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a1 725ab4fc87aSShubham Narlawar; RV64I-NEXT: lui a1, 30667 726ab4fc87aSShubham Narlawar; RV64I-NEXT: addiw a1, a1, 1329 727eabaee0cSFangrui Song; RV64I-NEXT: call __muldi3 72830305d79SCraig Topper; RV64I-NEXT: srliw a0, a0, 27 729ab4fc87aSShubham Narlawar; RV64I-NEXT: lui a1, %hi(.LCPI6_0) 730ab4fc87aSShubham Narlawar; RV64I-NEXT: addi a1, a1, %lo(.LCPI6_0) 731ab4fc87aSShubham Narlawar; RV64I-NEXT: add a0, a1, a0 732ab4fc87aSShubham Narlawar; RV64I-NEXT: lbu a0, 0(a0) 733dcd751b2SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 734dcd751b2SCraig Topper; RV64I-NEXT: addi sp, sp, 16 735dcd751b2SCraig Topper; RV64I-NEXT: ret 736dcd751b2SCraig Topper; 737d0312a5cSCraig Topper; RV32M-LABEL: test_cttz_i32_zero_undef: 738d0312a5cSCraig Topper; RV32M: # %bb.0: 739ab4fc87aSShubham Narlawar; RV32M-NEXT: neg a1, a0 740d0312a5cSCraig Topper; RV32M-NEXT: and a0, a0, a1 741ab4fc87aSShubham Narlawar; RV32M-NEXT: lui a1, 30667 742ab4fc87aSShubham Narlawar; RV32M-NEXT: addi a1, a1, 1329 743d0312a5cSCraig Topper; RV32M-NEXT: mul a0, a0, a1 744ab4fc87aSShubham Narlawar; RV32M-NEXT: srli a0, a0, 27 745ab4fc87aSShubham Narlawar; RV32M-NEXT: lui a1, %hi(.LCPI6_0) 746ab4fc87aSShubham Narlawar; RV32M-NEXT: addi a1, a1, %lo(.LCPI6_0) 747ab4fc87aSShubham Narlawar; RV32M-NEXT: add a0, a1, a0 74830305d79SCraig Topper; RV32M-NEXT: lbu a0, 0(a0) 749d0312a5cSCraig Topper; RV32M-NEXT: ret 750d0312a5cSCraig Topper; 751d0312a5cSCraig Topper; RV64M-LABEL: test_cttz_i32_zero_undef: 752d0312a5cSCraig Topper; RV64M: # %bb.0: 753d741a31aSNitin John Raj; RV64M-NEXT: negw a1, a0 754d0312a5cSCraig Topper; RV64M-NEXT: and a0, a0, a1 755ab4fc87aSShubham Narlawar; RV64M-NEXT: lui a1, 30667 75686240751SPhilip Reames; RV64M-NEXT: addi a1, a1, 1329 7574063369fSCraig Topper; RV64M-NEXT: mul a0, a0, a1 758ab4fc87aSShubham Narlawar; RV64M-NEXT: srliw a0, a0, 27 759ab4fc87aSShubham Narlawar; RV64M-NEXT: lui a1, %hi(.LCPI6_0) 760ab4fc87aSShubham Narlawar; RV64M-NEXT: addi a1, a1, %lo(.LCPI6_0) 761ab4fc87aSShubham Narlawar; RV64M-NEXT: add a0, a1, a0 76230305d79SCraig Topper; RV64M-NEXT: lbu a0, 0(a0) 763d0312a5cSCraig Topper; RV64M-NEXT: ret 764d0312a5cSCraig Topper; 765dcd751b2SCraig Topper; RV32ZBB-LABEL: test_cttz_i32_zero_undef: 766dcd751b2SCraig Topper; RV32ZBB: # %bb.0: 767dcd751b2SCraig Topper; RV32ZBB-NEXT: ctz a0, a0 768dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 769dcd751b2SCraig Topper; 770dcd751b2SCraig Topper; RV64ZBB-LABEL: test_cttz_i32_zero_undef: 771dcd751b2SCraig Topper; RV64ZBB: # %bb.0: 772dcd751b2SCraig Topper; RV64ZBB-NEXT: ctzw a0, a0 773dcd751b2SCraig Topper; RV64ZBB-NEXT: ret 774fc02eeb2SPhilipp Tomsich; 775fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_cttz_i32_zero_undef: 776fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 777fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a1, a0, -1 778fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: not a0, a0 779fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: and a0, a0, a1 780fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 781fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 32 782fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: sub a0, a1, a0 783fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 784fc02eeb2SPhilipp Tomsich; 785fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_cttz_i32_zero_undef: 786fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 787fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: addi a1, a0, -1 788fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: not a0, a0 789fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: and a0, a0, a1 790fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 791fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: li a1, 64 792fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: sub a0, a1, a0 793fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 794dcd751b2SCraig Topper %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 true) 795dcd751b2SCraig Topper ret i32 %tmp 796dcd751b2SCraig Topper} 797dcd751b2SCraig Topper 798dcd751b2SCraig Topperdefine i64 @test_cttz_i64_zero_undef(i64 %a) nounwind { 799dcd751b2SCraig Topper; RV32I-LABEL: test_cttz_i64_zero_undef: 800dcd751b2SCraig Topper; RV32I: # %bb.0: 801dcd751b2SCraig Topper; RV32I-NEXT: addi sp, sp, -32 802dcd751b2SCraig Topper; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 803dcd751b2SCraig Topper; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 804dcd751b2SCraig Topper; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 805dcd751b2SCraig Topper; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 806dcd751b2SCraig Topper; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 807dcd751b2SCraig Topper; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill 808dcd751b2SCraig Topper; RV32I-NEXT: mv s1, a1 80930305d79SCraig Topper; RV32I-NEXT: mv s2, a0 810ab4fc87aSShubham Narlawar; RV32I-NEXT: neg a0, a0 81130305d79SCraig Topper; RV32I-NEXT: and a0, s2, a0 812ab4fc87aSShubham Narlawar; RV32I-NEXT: lui a1, 30667 813ab4fc87aSShubham Narlawar; RV32I-NEXT: addi s3, a1, 1329 814dcd751b2SCraig Topper; RV32I-NEXT: mv a1, s3 815eabaee0cSFangrui Song; RV32I-NEXT: call __mulsi3 81630305d79SCraig Topper; RV32I-NEXT: mv s0, a0 8172d00c6feSCraig Topper; RV32I-NEXT: lui s4, %hi(.LCPI7_0) 8182d00c6feSCraig Topper; RV32I-NEXT: addi s4, s4, %lo(.LCPI7_0) 819ab4fc87aSShubham Narlawar; RV32I-NEXT: neg a0, s1 820ab4fc87aSShubham Narlawar; RV32I-NEXT: and a0, s1, a0 821ab4fc87aSShubham Narlawar; RV32I-NEXT: mv a1, s3 822eabaee0cSFangrui Song; RV32I-NEXT: call __mulsi3 82330305d79SCraig Topper; RV32I-NEXT: bnez s2, .LBB7_2 82430305d79SCraig Topper; RV32I-NEXT: # %bb.1: 825ab4fc87aSShubham Narlawar; RV32I-NEXT: srli a0, a0, 27 82630305d79SCraig Topper; RV32I-NEXT: add a0, s4, a0 82730305d79SCraig Topper; RV32I-NEXT: lbu a0, 0(a0) 82830305d79SCraig Topper; RV32I-NEXT: addi a0, a0, 32 82930305d79SCraig Topper; RV32I-NEXT: j .LBB7_3 83030305d79SCraig Topper; RV32I-NEXT: .LBB7_2: 831a8c79121SCraig Topper; RV32I-NEXT: srli s0, s0, 27 832a8c79121SCraig Topper; RV32I-NEXT: add s0, s4, s0 833a8c79121SCraig Topper; RV32I-NEXT: lbu a0, 0(s0) 83430305d79SCraig Topper; RV32I-NEXT: .LBB7_3: 835dcd751b2SCraig Topper; RV32I-NEXT: li a1, 0 836dcd751b2SCraig Topper; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 837dcd751b2SCraig Topper; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 838dcd751b2SCraig Topper; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 839dcd751b2SCraig Topper; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 840dcd751b2SCraig Topper; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 841dcd751b2SCraig Topper; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload 842dcd751b2SCraig Topper; RV32I-NEXT: addi sp, sp, 32 843dcd751b2SCraig Topper; RV32I-NEXT: ret 844dcd751b2SCraig Topper; 845dcd751b2SCraig Topper; RV64I-LABEL: test_cttz_i64_zero_undef: 846dcd751b2SCraig Topper; RV64I: # %bb.0: 847dcd751b2SCraig Topper; RV64I-NEXT: addi sp, sp, -16 848dcd751b2SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 84930305d79SCraig Topper; RV64I-NEXT: neg a1, a0 85030305d79SCraig Topper; RV64I-NEXT: and a0, a0, a1 851c748d2cdSCraig Topper; RV64I-NEXT: lui a1, %hi(.LCPI7_0) 852c748d2cdSCraig Topper; RV64I-NEXT: ld a1, %lo(.LCPI7_0)(a1) 853eabaee0cSFangrui Song; RV64I-NEXT: call __muldi3 85430305d79SCraig Topper; RV64I-NEXT: srli a0, a0, 58 855ab4fc87aSShubham Narlawar; RV64I-NEXT: lui a1, %hi(.LCPI7_1) 856ab4fc87aSShubham Narlawar; RV64I-NEXT: addi a1, a1, %lo(.LCPI7_1) 857ab4fc87aSShubham Narlawar; RV64I-NEXT: add a0, a1, a0 858ab4fc87aSShubham Narlawar; RV64I-NEXT: lbu a0, 0(a0) 859dcd751b2SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 860dcd751b2SCraig Topper; RV64I-NEXT: addi sp, sp, 16 861dcd751b2SCraig Topper; RV64I-NEXT: ret 862dcd751b2SCraig Topper; 863d0312a5cSCraig Topper; RV32M-LABEL: test_cttz_i64_zero_undef: 864d0312a5cSCraig Topper; RV32M: # %bb.0: 865ab4fc87aSShubham Narlawar; RV32M-NEXT: lui a2, 30667 86630305d79SCraig Topper; RV32M-NEXT: addi a3, a2, 1329 867ab4fc87aSShubham Narlawar; RV32M-NEXT: lui a2, %hi(.LCPI7_0) 86830305d79SCraig Topper; RV32M-NEXT: addi a2, a2, %lo(.LCPI7_0) 86930305d79SCraig Topper; RV32M-NEXT: bnez a0, .LBB7_2 870d0312a5cSCraig Topper; RV32M-NEXT: # %bb.1: 87130305d79SCraig Topper; RV32M-NEXT: neg a0, a1 87230305d79SCraig Topper; RV32M-NEXT: and a0, a1, a0 87330305d79SCraig Topper; RV32M-NEXT: mul a0, a0, a3 87430305d79SCraig Topper; RV32M-NEXT: srli a0, a0, 27 87530305d79SCraig Topper; RV32M-NEXT: add a0, a2, a0 87630305d79SCraig Topper; RV32M-NEXT: lbu a0, 0(a0) 87730305d79SCraig Topper; RV32M-NEXT: addi a0, a0, 32 878d0312a5cSCraig Topper; RV32M-NEXT: li a1, 0 879d0312a5cSCraig Topper; RV32M-NEXT: ret 88030305d79SCraig Topper; RV32M-NEXT: .LBB7_2: 88130305d79SCraig Topper; RV32M-NEXT: neg a1, a0 88230305d79SCraig Topper; RV32M-NEXT: and a0, a0, a1 88330305d79SCraig Topper; RV32M-NEXT: mul a0, a0, a3 88430305d79SCraig Topper; RV32M-NEXT: srli a0, a0, 27 88530305d79SCraig Topper; RV32M-NEXT: add a0, a2, a0 88630305d79SCraig Topper; RV32M-NEXT: lbu a0, 0(a0) 88730305d79SCraig Topper; RV32M-NEXT: li a1, 0 88830305d79SCraig Topper; RV32M-NEXT: ret 889d0312a5cSCraig Topper; 890d0312a5cSCraig Topper; RV64M-LABEL: test_cttz_i64_zero_undef: 891d0312a5cSCraig Topper; RV64M: # %bb.0: 892d0312a5cSCraig Topper; RV64M-NEXT: lui a1, %hi(.LCPI7_0) 893d0312a5cSCraig Topper; RV64M-NEXT: ld a1, %lo(.LCPI7_0)(a1) 894ab4fc87aSShubham Narlawar; RV64M-NEXT: neg a2, a0 895d0312a5cSCraig Topper; RV64M-NEXT: and a0, a0, a2 896ab4fc87aSShubham Narlawar; RV64M-NEXT: mul a0, a0, a1 897ab4fc87aSShubham Narlawar; RV64M-NEXT: srli a0, a0, 58 898ab4fc87aSShubham Narlawar; RV64M-NEXT: lui a1, %hi(.LCPI7_1) 899ab4fc87aSShubham Narlawar; RV64M-NEXT: addi a1, a1, %lo(.LCPI7_1) 900d0312a5cSCraig Topper; RV64M-NEXT: add a0, a1, a0 90130305d79SCraig Topper; RV64M-NEXT: lbu a0, 0(a0) 902d0312a5cSCraig Topper; RV64M-NEXT: ret 903d0312a5cSCraig Topper; 904dcd751b2SCraig Topper; RV32ZBB-LABEL: test_cttz_i64_zero_undef: 905dcd751b2SCraig Topper; RV32ZBB: # %bb.0: 906c748d2cdSCraig Topper; RV32ZBB-NEXT: bnez a0, .LBB7_2 907dcd751b2SCraig Topper; RV32ZBB-NEXT: # %bb.1: 908dcd751b2SCraig Topper; RV32ZBB-NEXT: ctz a0, a1 909dcd751b2SCraig Topper; RV32ZBB-NEXT: addi a0, a0, 32 910dcd751b2SCraig Topper; RV32ZBB-NEXT: li a1, 0 911dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 912c748d2cdSCraig Topper; RV32ZBB-NEXT: .LBB7_2: 913dcd751b2SCraig Topper; RV32ZBB-NEXT: ctz a0, a0 914dcd751b2SCraig Topper; RV32ZBB-NEXT: li a1, 0 915dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 916dcd751b2SCraig Topper; 917dcd751b2SCraig Topper; RV64ZBB-LABEL: test_cttz_i64_zero_undef: 918dcd751b2SCraig Topper; RV64ZBB: # %bb.0: 919dcd751b2SCraig Topper; RV64ZBB-NEXT: ctz a0, a0 920dcd751b2SCraig Topper; RV64ZBB-NEXT: ret 921fc02eeb2SPhilipp Tomsich; 922fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_cttz_i64_zero_undef: 923fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 924fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: bnez a0, .LBB7_2 925fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: # %bb.1: 926fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a0, a1, -1 927fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: not a1, a1 928fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: and a0, a1, a0 929fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 930fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 64 931fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: j .LBB7_3 932fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: .LBB7_2: 933fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a1, a0, -1 934fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: not a0, a0 935fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: and a0, a0, a1 936fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 937fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 32 938fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: .LBB7_3: 939fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: sub a0, a1, a0 940fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 0 941fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 942fc02eeb2SPhilipp Tomsich; 943fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_cttz_i64_zero_undef: 944fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 945fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: addi a1, a0, -1 946fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: not a0, a0 947fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: and a0, a0, a1 948fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 949fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: li a1, 64 950fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: sub a0, a1, a0 951fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 952dcd751b2SCraig Topper %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 true) 953dcd751b2SCraig Topper ret i64 %tmp 954dcd751b2SCraig Topper} 955dcd751b2SCraig Topper 956c748d2cdSCraig Topperdefine i8 @test_ctlz_i8(i8 %a) nounwind { 957d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_ctlz_i8: 958d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 959d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a1, a0, 255 960d0312a5cSCraig Topper; RV32_NOZBB-NEXT: beqz a1, .LBB8_2 961d0312a5cSCraig Topper; RV32_NOZBB-NEXT: # %bb.1: # %cond.false 962d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a1, a0, 24 963d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a1, 25 964d0312a5cSCraig Topper; RV32_NOZBB-NEXT: or a0, a0, a1 965d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a1, a0, 24 966d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a1, 26 967d0312a5cSCraig Topper; RV32_NOZBB-NEXT: or a0, a0, a1 968d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a1, a0, 24 969d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a1, 28 970d0312a5cSCraig Topper; RV32_NOZBB-NEXT: or a0, a0, a1 971d0312a5cSCraig Topper; RV32_NOZBB-NEXT: not a0, a0 972d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 1 973d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a1, a1, 85 974d0312a5cSCraig Topper; RV32_NOZBB-NEXT: sub a0, a0, a1 975d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a1, a0, 51 976d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 2 977d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 51 978d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a1, a0 979d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 980d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a0, a1 981d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 15 982d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 983d0312a5cSCraig Topper; RV32_NOZBB-NEXT: .LBB8_2: 984d0312a5cSCraig Topper; RV32_NOZBB-NEXT: li a0, 8 985d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 986c748d2cdSCraig Topper; 987d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_ctlz_i8: 988d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 989d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a1, a0, 255 990d0312a5cSCraig Topper; RV64NOZBB-NEXT: beqz a1, .LBB8_2 991d0312a5cSCraig Topper; RV64NOZBB-NEXT: # %bb.1: # %cond.false 992d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 56 993d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a1, 57 994d0312a5cSCraig Topper; RV64NOZBB-NEXT: or a0, a0, a1 995d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 56 996d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a1, 58 997d0312a5cSCraig Topper; RV64NOZBB-NEXT: or a0, a0, a1 998d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 56 999d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a1, 60 1000d0312a5cSCraig Topper; RV64NOZBB-NEXT: or a0, a0, a1 1001d0312a5cSCraig Topper; RV64NOZBB-NEXT: not a0, a0 1002d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 1 1003d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a1, a1, 85 1004cdf09ce7SCraig Topper; RV64NOZBB-NEXT: subw a0, a0, a1 1005d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a1, a0, 51 1006d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 2 1007d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 51 1008d0312a5cSCraig Topper; RV64NOZBB-NEXT: add a0, a1, a0 1009d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 1010d64d3c5aSNitin John Raj; RV64NOZBB-NEXT: add a0, a0, a1 1011d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 15 1012d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 1013d0312a5cSCraig Topper; RV64NOZBB-NEXT: .LBB8_2: 1014d0312a5cSCraig Topper; RV64NOZBB-NEXT: li a0, 8 1015d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 1016c748d2cdSCraig Topper; 1017c748d2cdSCraig Topper; RV32ZBB-LABEL: test_ctlz_i8: 1018c748d2cdSCraig Topper; RV32ZBB: # %bb.0: 1019c748d2cdSCraig Topper; RV32ZBB-NEXT: andi a0, a0, 255 1020c748d2cdSCraig Topper; RV32ZBB-NEXT: clz a0, a0 1021c748d2cdSCraig Topper; RV32ZBB-NEXT: addi a0, a0, -24 1022c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 1023c748d2cdSCraig Topper; 1024c748d2cdSCraig Topper; RV64ZBB-LABEL: test_ctlz_i8: 1025c748d2cdSCraig Topper; RV64ZBB: # %bb.0: 1026c748d2cdSCraig Topper; RV64ZBB-NEXT: andi a0, a0, 255 1027c748d2cdSCraig Topper; RV64ZBB-NEXT: clz a0, a0 1028c748d2cdSCraig Topper; RV64ZBB-NEXT: addi a0, a0, -56 1029c748d2cdSCraig Topper; RV64ZBB-NEXT: ret 1030fc02eeb2SPhilipp Tomsich; 1031fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_ctlz_i8: 1032fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 1033fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: andi a0, a0, 255 1034fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 1035fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a0, a0, -24 1036fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 1037fc02eeb2SPhilipp Tomsich; 1038fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_ctlz_i8: 1039fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 1040fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: andi a0, a0, 255 1041fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 1042fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: addi a0, a0, -56 1043fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 1044c748d2cdSCraig Topper %tmp = call i8 @llvm.ctlz.i8(i8 %a, i1 false) 1045c748d2cdSCraig Topper ret i8 %tmp 1046c748d2cdSCraig Topper} 1047c748d2cdSCraig Topper 1048c748d2cdSCraig Topperdefine i16 @test_ctlz_i16(i16 %a) nounwind { 1049d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_ctlz_i16: 1050d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 1051d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a1, a0, 16 10525fcdf762SLiaoChunyu; RV32_NOZBB-NEXT: beqz a1, .LBB9_2 1053d0312a5cSCraig Topper; RV32_NOZBB-NEXT: # %bb.1: # %cond.false 1054d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a1, 17 1055d0312a5cSCraig Topper; RV32_NOZBB-NEXT: lui a2, 5 1056*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: or a0, a0, a1 1057*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: addi a1, a2, 1365 1058*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: slli a2, a0, 16 1059*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: srli a2, a2, 18 1060*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: or a0, a0, a2 1061*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: slli a2, a0, 16 1062*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: srli a2, a2, 20 1063*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: or a0, a0, a2 1064*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: slli a2, a0, 16 1065*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: srli a2, a2, 24 1066*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: or a0, a0, a2 1067*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: not a0, a0 1068*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: srli a2, a0, 1 1069*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a1, a2, a1 1070*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: lui a2, 3 1071*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: addi a2, a2, 819 1072d0312a5cSCraig Topper; RV32_NOZBB-NEXT: sub a0, a0, a1 1073*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a1, a0, a2 1074d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 2 1075*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a0, a0, a2 1076*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: add a0, a1, a0 1077d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 1078d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a0, a1 10791c4880a2SCraig Topper; RV32_NOZBB-NEXT: andi a1, a0, 15 10801c4880a2SCraig Topper; RV32_NOZBB-NEXT: slli a0, a0, 20 10811c4880a2SCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 28 1082d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a1, a0 1083d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 1084d0312a5cSCraig Topper; RV32_NOZBB-NEXT: .LBB9_2: 1085d0312a5cSCraig Topper; RV32_NOZBB-NEXT: li a0, 16 1086d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 1087c748d2cdSCraig Topper; 1088d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_ctlz_i16: 1089d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 1090d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 48 10915fcdf762SLiaoChunyu; RV64NOZBB-NEXT: beqz a1, .LBB9_2 1092d0312a5cSCraig Topper; RV64NOZBB-NEXT: # %bb.1: # %cond.false 1093d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a1, 49 1094d0312a5cSCraig Topper; RV64NOZBB-NEXT: lui a2, 5 1095*9122c523SPengcheng Wang; RV64NOZBB-NEXT: or a0, a0, a1 1096*9122c523SPengcheng Wang; RV64NOZBB-NEXT: addiw a1, a2, 1365 1097*9122c523SPengcheng Wang; RV64NOZBB-NEXT: slli a2, a0, 48 1098*9122c523SPengcheng Wang; RV64NOZBB-NEXT: srli a2, a2, 50 1099*9122c523SPengcheng Wang; RV64NOZBB-NEXT: or a0, a0, a2 1100*9122c523SPengcheng Wang; RV64NOZBB-NEXT: slli a2, a0, 48 1101*9122c523SPengcheng Wang; RV64NOZBB-NEXT: srli a2, a2, 52 1102*9122c523SPengcheng Wang; RV64NOZBB-NEXT: or a0, a0, a2 1103*9122c523SPengcheng Wang; RV64NOZBB-NEXT: slli a2, a0, 48 1104*9122c523SPengcheng Wang; RV64NOZBB-NEXT: srli a2, a2, 56 1105*9122c523SPengcheng Wang; RV64NOZBB-NEXT: or a0, a0, a2 1106*9122c523SPengcheng Wang; RV64NOZBB-NEXT: not a0, a0 1107*9122c523SPengcheng Wang; RV64NOZBB-NEXT: srli a2, a0, 1 1108*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a1, a2, a1 1109*9122c523SPengcheng Wang; RV64NOZBB-NEXT: lui a2, 3 1110*9122c523SPengcheng Wang; RV64NOZBB-NEXT: addiw a2, a2, 819 1111d0312a5cSCraig Topper; RV64NOZBB-NEXT: sub a0, a0, a1 1112*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a1, a0, a2 1113d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 2 1114*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a0, a0, a2 1115*9122c523SPengcheng Wang; RV64NOZBB-NEXT: add a0, a1, a0 1116d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 1117d64d3c5aSNitin John Raj; RV64NOZBB-NEXT: add a0, a0, a1 11181c4880a2SCraig Topper; RV64NOZBB-NEXT: andi a1, a0, 15 11191c4880a2SCraig Topper; RV64NOZBB-NEXT: slli a0, a0, 52 11201c4880a2SCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 60 11211c4880a2SCraig Topper; RV64NOZBB-NEXT: add a0, a1, a0 1122d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 1123d0312a5cSCraig Topper; RV64NOZBB-NEXT: .LBB9_2: 1124d0312a5cSCraig Topper; RV64NOZBB-NEXT: li a0, 16 1125d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 1126c748d2cdSCraig Topper; 1127c748d2cdSCraig Topper; RV32ZBB-LABEL: test_ctlz_i16: 1128c748d2cdSCraig Topper; RV32ZBB: # %bb.0: 1129c748d2cdSCraig Topper; RV32ZBB-NEXT: zext.h a0, a0 1130c748d2cdSCraig Topper; RV32ZBB-NEXT: clz a0, a0 1131c748d2cdSCraig Topper; RV32ZBB-NEXT: addi a0, a0, -16 1132c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 1133c748d2cdSCraig Topper; 1134c748d2cdSCraig Topper; RV64ZBB-LABEL: test_ctlz_i16: 1135c748d2cdSCraig Topper; RV64ZBB: # %bb.0: 1136c748d2cdSCraig Topper; RV64ZBB-NEXT: zext.h a0, a0 1137c748d2cdSCraig Topper; RV64ZBB-NEXT: clz a0, a0 1138c748d2cdSCraig Topper; RV64ZBB-NEXT: addi a0, a0, -48 1139c748d2cdSCraig Topper; RV64ZBB-NEXT: ret 1140fc02eeb2SPhilipp Tomsich; 1141fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_ctlz_i16: 1142fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 1143fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.extu a0, a0, 15, 0 1144fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 1145fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a0, a0, -16 1146fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 1147fc02eeb2SPhilipp Tomsich; 1148fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_ctlz_i16: 1149fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 1150fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.extu a0, a0, 15, 0 1151fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 1152fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: addi a0, a0, -48 1153fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 1154c748d2cdSCraig Topper %tmp = call i16 @llvm.ctlz.i16(i16 %a, i1 false) 1155c748d2cdSCraig Topper ret i16 %tmp 1156c748d2cdSCraig Topper} 1157c748d2cdSCraig Topper 1158c748d2cdSCraig Topperdefine i32 @test_ctlz_i32(i32 %a) nounwind { 11594527fba9SSergei Barannikov; RV32I-LABEL: test_ctlz_i32: 11604527fba9SSergei Barannikov; RV32I: # %bb.0: 11614527fba9SSergei Barannikov; RV32I-NEXT: beqz a0, .LBB10_2 11624527fba9SSergei Barannikov; RV32I-NEXT: # %bb.1: # %cond.false 11634527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 1 11644527fba9SSergei Barannikov; RV32I-NEXT: lui a2, 349525 1165*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a1 1166*9122c523SPengcheng Wang; RV32I-NEXT: addi a1, a2, 1365 1167*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 2 1168*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a2 1169*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 4 1170*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a2 1171*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 8 1172*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a2 1173*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 16 1174*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a2 1175*9122c523SPengcheng Wang; RV32I-NEXT: not a0, a0 1176*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 1 1177*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a2, a1 1178*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 209715 1179*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 819 11804527fba9SSergei Barannikov; RV32I-NEXT: sub a0, a0, a1 1181*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a0, a2 11824527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 2 1183*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a2 1184*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 61681 1185*9122c523SPengcheng Wang; RV32I-NEXT: add a0, a1, a0 11864527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 4 11874527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 1188*9122c523SPengcheng Wang; RV32I-NEXT: addi a1, a2, -241 11894527fba9SSergei Barannikov; RV32I-NEXT: and a0, a0, a1 11904527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 8 11914527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 11924527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 16 11934527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 11944527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 24 11954527fba9SSergei Barannikov; RV32I-NEXT: ret 11964527fba9SSergei Barannikov; RV32I-NEXT: .LBB10_2: 11974527fba9SSergei Barannikov; RV32I-NEXT: li a0, 32 11984527fba9SSergei Barannikov; RV32I-NEXT: ret 1199c748d2cdSCraig Topper; 1200c748d2cdSCraig Topper; RV64I-LABEL: test_ctlz_i32: 1201c748d2cdSCraig Topper; RV64I: # %bb.0: 1202c748d2cdSCraig Topper; RV64I-NEXT: sext.w a1, a0 1203c748d2cdSCraig Topper; RV64I-NEXT: beqz a1, .LBB10_2 1204c748d2cdSCraig Topper; RV64I-NEXT: # %bb.1: # %cond.false 1205c748d2cdSCraig Topper; RV64I-NEXT: srliw a1, a0, 1 1206c748d2cdSCraig Topper; RV64I-NEXT: lui a2, 349525 1207*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a1 1208*9122c523SPengcheng Wang; RV64I-NEXT: addiw a1, a2, 1365 1209*9122c523SPengcheng Wang; RV64I-NEXT: srliw a2, a0, 2 1210*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a2 1211*9122c523SPengcheng Wang; RV64I-NEXT: srliw a2, a0, 4 1212*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a2 1213*9122c523SPengcheng Wang; RV64I-NEXT: srliw a2, a0, 8 1214*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a2 1215*9122c523SPengcheng Wang; RV64I-NEXT: srliw a2, a0, 16 1216*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a2 1217*9122c523SPengcheng Wang; RV64I-NEXT: not a0, a0 1218*9122c523SPengcheng Wang; RV64I-NEXT: srli a2, a0, 1 1219*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a2, a1 1220*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 209715 1221*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 819 122269d5a038SSimon Pilgrim; RV64I-NEXT: sub a0, a0, a1 1223*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a0, a2 1224c748d2cdSCraig Topper; RV64I-NEXT: srli a0, a0, 2 1225*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a2 1226*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 61681 1227*9122c523SPengcheng Wang; RV64I-NEXT: add a0, a1, a0 1228c748d2cdSCraig Topper; RV64I-NEXT: srli a1, a0, 4 1229c748d2cdSCraig Topper; RV64I-NEXT: add a0, a0, a1 1230*9122c523SPengcheng Wang; RV64I-NEXT: addi a1, a2, -241 1231c748d2cdSCraig Topper; RV64I-NEXT: and a0, a0, a1 1232610b9e23SWang Pengcheng; RV64I-NEXT: slli a1, a0, 8 1233610b9e23SWang Pengcheng; RV64I-NEXT: add a0, a0, a1 1234610b9e23SWang Pengcheng; RV64I-NEXT: slli a1, a0, 16 1235610b9e23SWang Pengcheng; RV64I-NEXT: add a0, a0, a1 1236c748d2cdSCraig Topper; RV64I-NEXT: srliw a0, a0, 24 1237c748d2cdSCraig Topper; RV64I-NEXT: ret 12385744b9cbSYeting Kuo; RV64I-NEXT: .LBB10_2: 12395744b9cbSYeting Kuo; RV64I-NEXT: li a0, 32 12405744b9cbSYeting Kuo; RV64I-NEXT: ret 1241c748d2cdSCraig Topper; 12424527fba9SSergei Barannikov; RV32M-LABEL: test_ctlz_i32: 12434527fba9SSergei Barannikov; RV32M: # %bb.0: 12444527fba9SSergei Barannikov; RV32M-NEXT: beqz a0, .LBB10_2 12454527fba9SSergei Barannikov; RV32M-NEXT: # %bb.1: # %cond.false 12464527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 1 12474527fba9SSergei Barannikov; RV32M-NEXT: lui a2, 349525 1248*9122c523SPengcheng Wang; RV32M-NEXT: or a0, a0, a1 1249*9122c523SPengcheng Wang; RV32M-NEXT: addi a1, a2, 1365 1250*9122c523SPengcheng Wang; RV32M-NEXT: srli a2, a0, 2 1251*9122c523SPengcheng Wang; RV32M-NEXT: or a0, a0, a2 1252*9122c523SPengcheng Wang; RV32M-NEXT: srli a2, a0, 4 1253*9122c523SPengcheng Wang; RV32M-NEXT: or a0, a0, a2 1254*9122c523SPengcheng Wang; RV32M-NEXT: srli a2, a0, 8 1255*9122c523SPengcheng Wang; RV32M-NEXT: or a0, a0, a2 1256*9122c523SPengcheng Wang; RV32M-NEXT: srli a2, a0, 16 1257*9122c523SPengcheng Wang; RV32M-NEXT: or a0, a0, a2 1258*9122c523SPengcheng Wang; RV32M-NEXT: not a0, a0 1259*9122c523SPengcheng Wang; RV32M-NEXT: srli a2, a0, 1 1260*9122c523SPengcheng Wang; RV32M-NEXT: and a1, a2, a1 1261*9122c523SPengcheng Wang; RV32M-NEXT: lui a2, 209715 1262*9122c523SPengcheng Wang; RV32M-NEXT: addi a2, a2, 819 12634527fba9SSergei Barannikov; RV32M-NEXT: sub a0, a0, a1 1264*9122c523SPengcheng Wang; RV32M-NEXT: and a1, a0, a2 12654527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 2 1266*9122c523SPengcheng Wang; RV32M-NEXT: and a0, a0, a2 1267*9122c523SPengcheng Wang; RV32M-NEXT: lui a2, 61681 1268*9122c523SPengcheng Wang; RV32M-NEXT: add a0, a1, a0 12694527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 4 12704527fba9SSergei Barannikov; RV32M-NEXT: add a0, a0, a1 12714527fba9SSergei Barannikov; RV32M-NEXT: lui a1, 4112 1272*9122c523SPengcheng Wang; RV32M-NEXT: addi a2, a2, -241 1273*9122c523SPengcheng Wang; RV32M-NEXT: and a0, a0, a2 12744527fba9SSergei Barannikov; RV32M-NEXT: addi a1, a1, 257 12754527fba9SSergei Barannikov; RV32M-NEXT: mul a0, a0, a1 12764527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 24 12774527fba9SSergei Barannikov; RV32M-NEXT: ret 12784527fba9SSergei Barannikov; RV32M-NEXT: .LBB10_2: 12794527fba9SSergei Barannikov; RV32M-NEXT: li a0, 32 12804527fba9SSergei Barannikov; RV32M-NEXT: ret 12814527fba9SSergei Barannikov; 1282d0312a5cSCraig Topper; RV64M-LABEL: test_ctlz_i32: 1283d0312a5cSCraig Topper; RV64M: # %bb.0: 1284d0312a5cSCraig Topper; RV64M-NEXT: sext.w a1, a0 1285d0312a5cSCraig Topper; RV64M-NEXT: beqz a1, .LBB10_2 1286d0312a5cSCraig Topper; RV64M-NEXT: # %bb.1: # %cond.false 1287d0312a5cSCraig Topper; RV64M-NEXT: srliw a1, a0, 1 1288d0312a5cSCraig Topper; RV64M-NEXT: lui a2, 349525 1289*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a1 1290*9122c523SPengcheng Wang; RV64M-NEXT: addiw a1, a2, 1365 1291*9122c523SPengcheng Wang; RV64M-NEXT: srliw a2, a0, 2 1292*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a2 1293*9122c523SPengcheng Wang; RV64M-NEXT: srliw a2, a0, 4 1294*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a2 1295*9122c523SPengcheng Wang; RV64M-NEXT: srliw a2, a0, 8 1296*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a2 1297*9122c523SPengcheng Wang; RV64M-NEXT: srliw a2, a0, 16 1298*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a2 1299*9122c523SPengcheng Wang; RV64M-NEXT: not a0, a0 1300*9122c523SPengcheng Wang; RV64M-NEXT: srli a2, a0, 1 1301*9122c523SPengcheng Wang; RV64M-NEXT: and a1, a2, a1 1302*9122c523SPengcheng Wang; RV64M-NEXT: lui a2, 209715 1303*9122c523SPengcheng Wang; RV64M-NEXT: addiw a2, a2, 819 130469d5a038SSimon Pilgrim; RV64M-NEXT: sub a0, a0, a1 1305*9122c523SPengcheng Wang; RV64M-NEXT: and a1, a0, a2 1306d0312a5cSCraig Topper; RV64M-NEXT: srli a0, a0, 2 1307*9122c523SPengcheng Wang; RV64M-NEXT: and a0, a0, a2 1308*9122c523SPengcheng Wang; RV64M-NEXT: lui a2, 61681 1309*9122c523SPengcheng Wang; RV64M-NEXT: add a0, a1, a0 1310d0312a5cSCraig Topper; RV64M-NEXT: srli a1, a0, 4 1311d64d3c5aSNitin John Raj; RV64M-NEXT: add a0, a0, a1 1312d0312a5cSCraig Topper; RV64M-NEXT: lui a1, 4112 1313*9122c523SPengcheng Wang; RV64M-NEXT: addi a2, a2, -241 1314*9122c523SPengcheng Wang; RV64M-NEXT: and a0, a0, a2 131586240751SPhilip Reames; RV64M-NEXT: addi a1, a1, 257 13164063369fSCraig Topper; RV64M-NEXT: mul a0, a0, a1 1317d0312a5cSCraig Topper; RV64M-NEXT: srliw a0, a0, 24 1318d0312a5cSCraig Topper; RV64M-NEXT: ret 1319d0312a5cSCraig Topper; RV64M-NEXT: .LBB10_2: 1320d0312a5cSCraig Topper; RV64M-NEXT: li a0, 32 1321d0312a5cSCraig Topper; RV64M-NEXT: ret 1322d0312a5cSCraig Topper; 1323c748d2cdSCraig Topper; RV32ZBB-LABEL: test_ctlz_i32: 1324c748d2cdSCraig Topper; RV32ZBB: # %bb.0: 1325c748d2cdSCraig Topper; RV32ZBB-NEXT: clz a0, a0 1326c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 1327c748d2cdSCraig Topper; 1328c748d2cdSCraig Topper; RV64ZBB-LABEL: test_ctlz_i32: 1329c748d2cdSCraig Topper; RV64ZBB: # %bb.0: 1330c748d2cdSCraig Topper; RV64ZBB-NEXT: clzw a0, a0 1331c748d2cdSCraig Topper; RV64ZBB-NEXT: ret 1332fc02eeb2SPhilipp Tomsich; 1333fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_ctlz_i32: 1334fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 1335fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 1336fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 1337fc02eeb2SPhilipp Tomsich; 1338fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_ctlz_i32: 1339fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 1340fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: not a0, a0 1341fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: slli a0, a0, 32 1342fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff0 a0, a0 1343fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 1344c748d2cdSCraig Topper %tmp = call i32 @llvm.ctlz.i32(i32 %a, i1 false) 1345c748d2cdSCraig Topper ret i32 %tmp 1346c748d2cdSCraig Topper} 1347c748d2cdSCraig Topper 1348c748d2cdSCraig Topperdefine i64 @test_ctlz_i64(i64 %a) nounwind { 13494527fba9SSergei Barannikov; RV32I-LABEL: test_ctlz_i64: 13504527fba9SSergei Barannikov; RV32I: # %bb.0: 13514527fba9SSergei Barannikov; RV32I-NEXT: lui a2, 349525 1352*9122c523SPengcheng Wang; RV32I-NEXT: lui a3, 209715 1353*9122c523SPengcheng Wang; RV32I-NEXT: lui a5, 61681 13544527fba9SSergei Barannikov; RV32I-NEXT: addi a4, a2, 1365 1355*9122c523SPengcheng Wang; RV32I-NEXT: addi a3, a3, 819 1356*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a5, -241 13574527fba9SSergei Barannikov; RV32I-NEXT: bnez a1, .LBB11_2 13584527fba9SSergei Barannikov; RV32I-NEXT: # %bb.1: 13594527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 1 13604527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 13614527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 2 13624527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 13634527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 4 13644527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 13654527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 8 13664527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 13674527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 16 13684527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 13694527fba9SSergei Barannikov; RV32I-NEXT: not a0, a0 13704527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 1 13714527fba9SSergei Barannikov; RV32I-NEXT: and a1, a1, a4 13724527fba9SSergei Barannikov; RV32I-NEXT: sub a0, a0, a1 13734527fba9SSergei Barannikov; RV32I-NEXT: and a1, a0, a3 13744527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 2 13754527fba9SSergei Barannikov; RV32I-NEXT: and a0, a0, a3 13764527fba9SSergei Barannikov; RV32I-NEXT: add a0, a1, a0 13774527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 4 13784527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 13794527fba9SSergei Barannikov; RV32I-NEXT: and a0, a0, a2 13804527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 8 13814527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 13824527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 16 13834527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 13844527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 24 13854527fba9SSergei Barannikov; RV32I-NEXT: addi a0, a0, 32 13864527fba9SSergei Barannikov; RV32I-NEXT: li a1, 0 13874527fba9SSergei Barannikov; RV32I-NEXT: ret 13884527fba9SSergei Barannikov; RV32I-NEXT: .LBB11_2: 13894527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a1, 1 13904527fba9SSergei Barannikov; RV32I-NEXT: or a0, a1, a0 13914527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 2 13924527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 13934527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 4 13944527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 13954527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 8 13964527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 13974527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 16 13984527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 13994527fba9SSergei Barannikov; RV32I-NEXT: not a0, a0 14004527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 1 14014527fba9SSergei Barannikov; RV32I-NEXT: and a1, a1, a4 14024527fba9SSergei Barannikov; RV32I-NEXT: sub a0, a0, a1 14034527fba9SSergei Barannikov; RV32I-NEXT: and a1, a0, a3 14044527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 2 14054527fba9SSergei Barannikov; RV32I-NEXT: and a0, a0, a3 14064527fba9SSergei Barannikov; RV32I-NEXT: add a0, a1, a0 14074527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 4 14084527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 14094527fba9SSergei Barannikov; RV32I-NEXT: and a0, a0, a2 14104527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 8 14114527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 14124527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 16 14134527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 14144527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 24 14154527fba9SSergei Barannikov; RV32I-NEXT: li a1, 0 14164527fba9SSergei Barannikov; RV32I-NEXT: ret 1417c748d2cdSCraig Topper; 14184527fba9SSergei Barannikov; RV64I-LABEL: test_ctlz_i64: 14194527fba9SSergei Barannikov; RV64I: # %bb.0: 14204527fba9SSergei Barannikov; RV64I-NEXT: beqz a0, .LBB11_2 14214527fba9SSergei Barannikov; RV64I-NEXT: # %bb.1: # %cond.false 14224527fba9SSergei Barannikov; RV64I-NEXT: srli a1, a0, 1 14234527fba9SSergei Barannikov; RV64I-NEXT: lui a2, 349525 1424*9122c523SPengcheng Wang; RV64I-NEXT: lui a3, 209715 1425*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a1 1426*9122c523SPengcheng Wang; RV64I-NEXT: addiw a1, a2, 1365 1427*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a3, 819 1428*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 2 1429*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a3 1430*9122c523SPengcheng Wang; RV64I-NEXT: slli a3, a1, 32 1431*9122c523SPengcheng Wang; RV64I-NEXT: add a1, a1, a3 14324527fba9SSergei Barannikov; RV64I-NEXT: slli a3, a2, 32 14334527fba9SSergei Barannikov; RV64I-NEXT: add a2, a2, a3 1434*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 4 1435*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a3 1436*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 8 1437*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a3 1438*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 16 1439*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a3 1440*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 32 1441*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a3 1442*9122c523SPengcheng Wang; RV64I-NEXT: not a0, a0 1443*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 1 1444*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a3, a1 1445*9122c523SPengcheng Wang; RV64I-NEXT: lui a3, 61681 1446*9122c523SPengcheng Wang; RV64I-NEXT: addiw a3, a3, -241 14474527fba9SSergei Barannikov; RV64I-NEXT: sub a0, a0, a1 1448*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a0, a2 14494527fba9SSergei Barannikov; RV64I-NEXT: srli a0, a0, 2 1450*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a2 1451*9122c523SPengcheng Wang; RV64I-NEXT: slli a2, a3, 32 1452*9122c523SPengcheng Wang; RV64I-NEXT: add a0, a1, a0 14534527fba9SSergei Barannikov; RV64I-NEXT: srli a1, a0, 4 14544527fba9SSergei Barannikov; RV64I-NEXT: add a0, a0, a1 1455*9122c523SPengcheng Wang; RV64I-NEXT: add a2, a3, a2 1456*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a2 14574527fba9SSergei Barannikov; RV64I-NEXT: slli a1, a0, 8 14584527fba9SSergei Barannikov; RV64I-NEXT: add a0, a0, a1 14594527fba9SSergei Barannikov; RV64I-NEXT: slli a1, a0, 16 14604527fba9SSergei Barannikov; RV64I-NEXT: add a0, a0, a1 14614527fba9SSergei Barannikov; RV64I-NEXT: slli a1, a0, 32 14624527fba9SSergei Barannikov; RV64I-NEXT: add a0, a0, a1 14634527fba9SSergei Barannikov; RV64I-NEXT: srli a0, a0, 56 14644527fba9SSergei Barannikov; RV64I-NEXT: ret 14654527fba9SSergei Barannikov; RV64I-NEXT: .LBB11_2: 14664527fba9SSergei Barannikov; RV64I-NEXT: li a0, 64 14674527fba9SSergei Barannikov; RV64I-NEXT: ret 14684527fba9SSergei Barannikov; 14694527fba9SSergei Barannikov; RV32M-LABEL: test_ctlz_i64: 14704527fba9SSergei Barannikov; RV32M: # %bb.0: 14714527fba9SSergei Barannikov; RV32M-NEXT: lui a2, 349525 1472*9122c523SPengcheng Wang; RV32M-NEXT: lui a3, 209715 1473*9122c523SPengcheng Wang; RV32M-NEXT: lui a6, 61681 1474*9122c523SPengcheng Wang; RV32M-NEXT: lui a7, 4112 14754527fba9SSergei Barannikov; RV32M-NEXT: addi a5, a2, 1365 1476*9122c523SPengcheng Wang; RV32M-NEXT: addi a4, a3, 819 1477*9122c523SPengcheng Wang; RV32M-NEXT: addi a3, a6, -241 1478*9122c523SPengcheng Wang; RV32M-NEXT: addi a2, a7, 257 14794527fba9SSergei Barannikov; RV32M-NEXT: bnez a1, .LBB11_2 14804527fba9SSergei Barannikov; RV32M-NEXT: # %bb.1: 14814527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 1 14824527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 14834527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 2 14844527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 14854527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 4 14864527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 14874527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 8 14884527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 14894527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 16 14904527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 14914527fba9SSergei Barannikov; RV32M-NEXT: not a0, a0 14924527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 1 14934527fba9SSergei Barannikov; RV32M-NEXT: and a1, a1, a5 14944527fba9SSergei Barannikov; RV32M-NEXT: sub a0, a0, a1 14954527fba9SSergei Barannikov; RV32M-NEXT: and a1, a0, a4 14964527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 2 14974527fba9SSergei Barannikov; RV32M-NEXT: and a0, a0, a4 14984527fba9SSergei Barannikov; RV32M-NEXT: add a0, a1, a0 14994527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 4 15004527fba9SSergei Barannikov; RV32M-NEXT: add a0, a0, a1 1501*9122c523SPengcheng Wang; RV32M-NEXT: and a0, a0, a3 1502*9122c523SPengcheng Wang; RV32M-NEXT: mul a0, a0, a2 15034527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 24 15044527fba9SSergei Barannikov; RV32M-NEXT: addi a0, a0, 32 15054527fba9SSergei Barannikov; RV32M-NEXT: li a1, 0 15064527fba9SSergei Barannikov; RV32M-NEXT: ret 15074527fba9SSergei Barannikov; RV32M-NEXT: .LBB11_2: 15084527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a1, 1 15094527fba9SSergei Barannikov; RV32M-NEXT: or a0, a1, a0 15104527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 2 15114527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 15124527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 4 15134527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 15144527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 8 15154527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 15164527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 16 15174527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 15184527fba9SSergei Barannikov; RV32M-NEXT: not a0, a0 15194527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 1 15204527fba9SSergei Barannikov; RV32M-NEXT: and a1, a1, a5 15214527fba9SSergei Barannikov; RV32M-NEXT: sub a0, a0, a1 15224527fba9SSergei Barannikov; RV32M-NEXT: and a1, a0, a4 15234527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 2 15244527fba9SSergei Barannikov; RV32M-NEXT: and a0, a0, a4 15254527fba9SSergei Barannikov; RV32M-NEXT: add a0, a1, a0 15264527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 4 15274527fba9SSergei Barannikov; RV32M-NEXT: add a0, a0, a1 1528*9122c523SPengcheng Wang; RV32M-NEXT: and a0, a0, a3 1529*9122c523SPengcheng Wang; RV32M-NEXT: mul a0, a0, a2 15304527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 24 15314527fba9SSergei Barannikov; RV32M-NEXT: li a1, 0 15324527fba9SSergei Barannikov; RV32M-NEXT: ret 15334527fba9SSergei Barannikov; 15344527fba9SSergei Barannikov; RV64M-LABEL: test_ctlz_i64: 15354527fba9SSergei Barannikov; RV64M: # %bb.0: 15364527fba9SSergei Barannikov; RV64M-NEXT: beqz a0, .LBB11_2 15374527fba9SSergei Barannikov; RV64M-NEXT: # %bb.1: # %cond.false 15384527fba9SSergei Barannikov; RV64M-NEXT: srli a1, a0, 1 15394527fba9SSergei Barannikov; RV64M-NEXT: lui a2, 349525 1540*9122c523SPengcheng Wang; RV64M-NEXT: lui a3, 209715 1541*9122c523SPengcheng Wang; RV64M-NEXT: lui a4, 61681 1542*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a1 1543*9122c523SPengcheng Wang; RV64M-NEXT: addiw a1, a2, 1365 1544*9122c523SPengcheng Wang; RV64M-NEXT: addiw a2, a3, 819 1545*9122c523SPengcheng Wang; RV64M-NEXT: addiw a3, a4, -241 1546*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 2 1547*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a4 1548*9122c523SPengcheng Wang; RV64M-NEXT: slli a4, a1, 32 1549*9122c523SPengcheng Wang; RV64M-NEXT: add a1, a1, a4 1550*9122c523SPengcheng Wang; RV64M-NEXT: slli a4, a2, 32 1551*9122c523SPengcheng Wang; RV64M-NEXT: add a2, a2, a4 1552*9122c523SPengcheng Wang; RV64M-NEXT: slli a4, a3, 32 1553*9122c523SPengcheng Wang; RV64M-NEXT: add a3, a3, a4 1554*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 4 1555*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a4 1556*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 8 1557*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a4 1558*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 16 1559*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a4 1560*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 32 1561*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a4 1562*9122c523SPengcheng Wang; RV64M-NEXT: not a0, a0 1563*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 1 1564*9122c523SPengcheng Wang; RV64M-NEXT: and a1, a4, a1 15654527fba9SSergei Barannikov; RV64M-NEXT: sub a0, a0, a1 1566*9122c523SPengcheng Wang; RV64M-NEXT: and a1, a0, a2 15674527fba9SSergei Barannikov; RV64M-NEXT: srli a0, a0, 2 1568*9122c523SPengcheng Wang; RV64M-NEXT: and a0, a0, a2 1569*9122c523SPengcheng Wang; RV64M-NEXT: lui a2, 4112 1570*9122c523SPengcheng Wang; RV64M-NEXT: addiw a2, a2, 257 1571*9122c523SPengcheng Wang; RV64M-NEXT: add a0, a1, a0 15724527fba9SSergei Barannikov; RV64M-NEXT: srli a1, a0, 4 15734527fba9SSergei Barannikov; RV64M-NEXT: add a0, a0, a1 1574*9122c523SPengcheng Wang; RV64M-NEXT: slli a1, a2, 32 1575*9122c523SPengcheng Wang; RV64M-NEXT: and a0, a0, a3 1576*9122c523SPengcheng Wang; RV64M-NEXT: add a1, a2, a1 15774527fba9SSergei Barannikov; RV64M-NEXT: mul a0, a0, a1 15784527fba9SSergei Barannikov; RV64M-NEXT: srli a0, a0, 56 15794527fba9SSergei Barannikov; RV64M-NEXT: ret 15804527fba9SSergei Barannikov; RV64M-NEXT: .LBB11_2: 15814527fba9SSergei Barannikov; RV64M-NEXT: li a0, 64 15824527fba9SSergei Barannikov; RV64M-NEXT: ret 1583d0312a5cSCraig Topper; 1584c748d2cdSCraig Topper; RV32ZBB-LABEL: test_ctlz_i64: 1585c748d2cdSCraig Topper; RV32ZBB: # %bb.0: 1586c748d2cdSCraig Topper; RV32ZBB-NEXT: bnez a1, .LBB11_2 1587c748d2cdSCraig Topper; RV32ZBB-NEXT: # %bb.1: 1588c748d2cdSCraig Topper; RV32ZBB-NEXT: clz a0, a0 1589c748d2cdSCraig Topper; RV32ZBB-NEXT: addi a0, a0, 32 1590c748d2cdSCraig Topper; RV32ZBB-NEXT: li a1, 0 1591c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 1592c748d2cdSCraig Topper; RV32ZBB-NEXT: .LBB11_2: 1593c748d2cdSCraig Topper; RV32ZBB-NEXT: clz a0, a1 1594c748d2cdSCraig Topper; RV32ZBB-NEXT: li a1, 0 1595c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 1596c748d2cdSCraig Topper; 1597c748d2cdSCraig Topper; RV64ZBB-LABEL: test_ctlz_i64: 1598c748d2cdSCraig Topper; RV64ZBB: # %bb.0: 1599c748d2cdSCraig Topper; RV64ZBB-NEXT: clz a0, a0 1600c748d2cdSCraig Topper; RV64ZBB-NEXT: ret 1601fc02eeb2SPhilipp Tomsich; 1602fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_ctlz_i64: 1603fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 1604fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: bnez a1, .LBB11_2 1605fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: # %bb.1: 1606fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 1607fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a0, a0, 32 1608fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 0 1609fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 1610fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: .LBB11_2: 1611fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a1 1612fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 0 1613fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 1614fc02eeb2SPhilipp Tomsich; 1615fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_ctlz_i64: 1616fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 1617fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 1618fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 1619c748d2cdSCraig Topper %tmp = call i64 @llvm.ctlz.i64(i64 %a, i1 false) 1620c748d2cdSCraig Topper ret i64 %tmp 1621c748d2cdSCraig Topper} 1622c748d2cdSCraig Topper 1623c748d2cdSCraig Topperdefine i8 @test_ctlz_i8_zero_undef(i8 %a) nounwind { 1624d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_ctlz_i8_zero_undef: 1625d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 1626d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a1, a0, 24 1627d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a1, 25 1628d0312a5cSCraig Topper; RV32_NOZBB-NEXT: or a0, a0, a1 1629d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a1, a0, 24 1630d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a1, 26 1631d0312a5cSCraig Topper; RV32_NOZBB-NEXT: or a0, a0, a1 1632d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a1, a0, 24 1633d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a1, 28 1634d0312a5cSCraig Topper; RV32_NOZBB-NEXT: or a0, a0, a1 1635d0312a5cSCraig Topper; RV32_NOZBB-NEXT: not a0, a0 1636d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 1 1637d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a1, a1, 85 1638d0312a5cSCraig Topper; RV32_NOZBB-NEXT: sub a0, a0, a1 1639d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a1, a0, 51 1640d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 2 1641d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 51 1642d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a1, a0 1643d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 1644d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a0, a1 1645d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 15 1646d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 1647c748d2cdSCraig Topper; 1648d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_ctlz_i8_zero_undef: 1649d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 1650d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 56 1651d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a1, 57 1652d0312a5cSCraig Topper; RV64NOZBB-NEXT: or a0, a0, a1 1653d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 56 1654d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a1, 58 1655d0312a5cSCraig Topper; RV64NOZBB-NEXT: or a0, a0, a1 1656d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 56 1657d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a1, 60 1658d0312a5cSCraig Topper; RV64NOZBB-NEXT: or a0, a0, a1 1659d0312a5cSCraig Topper; RV64NOZBB-NEXT: not a0, a0 1660d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 1 1661d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a1, a1, 85 1662cdf09ce7SCraig Topper; RV64NOZBB-NEXT: subw a0, a0, a1 1663d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a1, a0, 51 1664d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 2 1665d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 51 1666d0312a5cSCraig Topper; RV64NOZBB-NEXT: add a0, a1, a0 1667d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 1668d64d3c5aSNitin John Raj; RV64NOZBB-NEXT: add a0, a0, a1 1669d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 15 1670d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 1671c748d2cdSCraig Topper; 1672c748d2cdSCraig Topper; RV32ZBB-LABEL: test_ctlz_i8_zero_undef: 1673c748d2cdSCraig Topper; RV32ZBB: # %bb.0: 167469192e01SManish Kausik H; RV32ZBB-NEXT: slli a0, a0, 24 1675c748d2cdSCraig Topper; RV32ZBB-NEXT: clz a0, a0 1676c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 1677c748d2cdSCraig Topper; 1678c748d2cdSCraig Topper; RV64ZBB-LABEL: test_ctlz_i8_zero_undef: 1679c748d2cdSCraig Topper; RV64ZBB: # %bb.0: 168069192e01SManish Kausik H; RV64ZBB-NEXT: slli a0, a0, 56 1681c748d2cdSCraig Topper; RV64ZBB-NEXT: clz a0, a0 1682c748d2cdSCraig Topper; RV64ZBB-NEXT: ret 1683fc02eeb2SPhilipp Tomsich; 1684fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_ctlz_i8_zero_undef: 1685fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 168669192e01SManish Kausik H; RV32XTHEADBB-NEXT: slli a0, a0, 24 1687fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 1688fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 1689fc02eeb2SPhilipp Tomsich; 1690fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_ctlz_i8_zero_undef: 1691fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 169269192e01SManish Kausik H; RV64XTHEADBB-NEXT: slli a0, a0, 56 1693fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 1694fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 1695c748d2cdSCraig Topper %tmp = call i8 @llvm.ctlz.i8(i8 %a, i1 true) 1696c748d2cdSCraig Topper ret i8 %tmp 1697c748d2cdSCraig Topper} 1698c748d2cdSCraig Topper 1699c748d2cdSCraig Topperdefine i16 @test_ctlz_i16_zero_undef(i16 %a) nounwind { 1700d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_ctlz_i16_zero_undef: 1701d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 1702d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a1, a0, 16 1703*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: lui a2, 5 1704d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a1, 17 1705*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: addi a2, a2, 1365 1706d0312a5cSCraig Topper; RV32_NOZBB-NEXT: or a0, a0, a1 1707d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a1, a0, 16 1708d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a1, 18 1709d0312a5cSCraig Topper; RV32_NOZBB-NEXT: or a0, a0, a1 1710d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a1, a0, 16 1711d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a1, 20 1712d0312a5cSCraig Topper; RV32_NOZBB-NEXT: or a0, a0, a1 1713d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a1, a0, 16 1714d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a1, 24 1715d0312a5cSCraig Topper; RV32_NOZBB-NEXT: or a0, a0, a1 1716d0312a5cSCraig Topper; RV32_NOZBB-NEXT: not a0, a0 1717d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 1 1718d0312a5cSCraig Topper; RV32_NOZBB-NEXT: and a1, a1, a2 1719*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: lui a2, 3 1720*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: addi a2, a2, 819 1721d0312a5cSCraig Topper; RV32_NOZBB-NEXT: sub a0, a0, a1 1722*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a1, a0, a2 1723d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 2 1724*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a0, a0, a2 1725*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: add a0, a1, a0 1726d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 1727d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a0, a1 17281c4880a2SCraig Topper; RV32_NOZBB-NEXT: andi a1, a0, 15 17291c4880a2SCraig Topper; RV32_NOZBB-NEXT: slli a0, a0, 20 17301c4880a2SCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 28 1731d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a1, a0 1732d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 1733c748d2cdSCraig Topper; 1734d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_ctlz_i16_zero_undef: 1735d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 1736d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 48 1737*9122c523SPengcheng Wang; RV64NOZBB-NEXT: lui a2, 5 1738d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a1, 49 1739*9122c523SPengcheng Wang; RV64NOZBB-NEXT: addiw a2, a2, 1365 1740d0312a5cSCraig Topper; RV64NOZBB-NEXT: or a0, a0, a1 1741d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 48 1742d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a1, 50 1743d0312a5cSCraig Topper; RV64NOZBB-NEXT: or a0, a0, a1 1744d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 48 1745d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a1, 52 1746d0312a5cSCraig Topper; RV64NOZBB-NEXT: or a0, a0, a1 1747d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 48 1748d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a1, 56 1749d0312a5cSCraig Topper; RV64NOZBB-NEXT: or a0, a0, a1 1750d0312a5cSCraig Topper; RV64NOZBB-NEXT: not a0, a0 1751d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 1 1752d0312a5cSCraig Topper; RV64NOZBB-NEXT: and a1, a1, a2 1753*9122c523SPengcheng Wang; RV64NOZBB-NEXT: lui a2, 3 1754*9122c523SPengcheng Wang; RV64NOZBB-NEXT: addiw a2, a2, 819 1755d0312a5cSCraig Topper; RV64NOZBB-NEXT: sub a0, a0, a1 1756*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a1, a0, a2 1757d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 2 1758*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a0, a0, a2 1759*9122c523SPengcheng Wang; RV64NOZBB-NEXT: add a0, a1, a0 1760d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 1761d64d3c5aSNitin John Raj; RV64NOZBB-NEXT: add a0, a0, a1 17621c4880a2SCraig Topper; RV64NOZBB-NEXT: andi a1, a0, 15 17631c4880a2SCraig Topper; RV64NOZBB-NEXT: slli a0, a0, 52 17641c4880a2SCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 60 17651c4880a2SCraig Topper; RV64NOZBB-NEXT: add a0, a1, a0 1766d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 1767c748d2cdSCraig Topper; 1768c748d2cdSCraig Topper; RV32ZBB-LABEL: test_ctlz_i16_zero_undef: 1769c748d2cdSCraig Topper; RV32ZBB: # %bb.0: 177069192e01SManish Kausik H; RV32ZBB-NEXT: slli a0, a0, 16 1771c748d2cdSCraig Topper; RV32ZBB-NEXT: clz a0, a0 1772c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 1773c748d2cdSCraig Topper; 1774c748d2cdSCraig Topper; RV64ZBB-LABEL: test_ctlz_i16_zero_undef: 1775c748d2cdSCraig Topper; RV64ZBB: # %bb.0: 177669192e01SManish Kausik H; RV64ZBB-NEXT: slli a0, a0, 48 1777c748d2cdSCraig Topper; RV64ZBB-NEXT: clz a0, a0 1778c748d2cdSCraig Topper; RV64ZBB-NEXT: ret 1779fc02eeb2SPhilipp Tomsich; 1780fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_ctlz_i16_zero_undef: 1781fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 178269192e01SManish Kausik H; RV32XTHEADBB-NEXT: slli a0, a0, 16 1783fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 1784fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 1785fc02eeb2SPhilipp Tomsich; 1786fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_ctlz_i16_zero_undef: 1787fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 178869192e01SManish Kausik H; RV64XTHEADBB-NEXT: slli a0, a0, 48 1789fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 1790fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 1791c748d2cdSCraig Topper %tmp = call i16 @llvm.ctlz.i16(i16 %a, i1 true) 1792c748d2cdSCraig Topper ret i16 %tmp 1793c748d2cdSCraig Topper} 1794c748d2cdSCraig Topper 1795c748d2cdSCraig Topperdefine i32 @test_ctlz_i32_zero_undef(i32 %a) nounwind { 17964527fba9SSergei Barannikov; RV32I-LABEL: test_ctlz_i32_zero_undef: 17974527fba9SSergei Barannikov; RV32I: # %bb.0: 17984527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 1 17994527fba9SSergei Barannikov; RV32I-NEXT: lui a2, 349525 1800*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a1 1801*9122c523SPengcheng Wang; RV32I-NEXT: addi a1, a2, 1365 1802*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 2 1803*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a2 1804*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 4 1805*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a2 1806*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 8 1807*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a2 1808*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 16 1809*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a2 1810*9122c523SPengcheng Wang; RV32I-NEXT: not a0, a0 1811*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a0, 1 1812*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a2, a1 1813*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 209715 1814*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 819 18154527fba9SSergei Barannikov; RV32I-NEXT: sub a0, a0, a1 1816*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a0, a2 18174527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 2 1818*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a2 1819*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 61681 1820*9122c523SPengcheng Wang; RV32I-NEXT: add a0, a1, a0 18214527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 4 18224527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 1823*9122c523SPengcheng Wang; RV32I-NEXT: addi a1, a2, -241 18244527fba9SSergei Barannikov; RV32I-NEXT: and a0, a0, a1 18254527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 8 18264527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 18274527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 16 18284527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 18294527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 24 18304527fba9SSergei Barannikov; RV32I-NEXT: ret 1831c748d2cdSCraig Topper; 1832c748d2cdSCraig Topper; RV64I-LABEL: test_ctlz_i32_zero_undef: 1833c748d2cdSCraig Topper; RV64I: # %bb.0: 1834c748d2cdSCraig Topper; RV64I-NEXT: srliw a1, a0, 1 1835c748d2cdSCraig Topper; RV64I-NEXT: lui a2, 349525 1836*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a1 1837*9122c523SPengcheng Wang; RV64I-NEXT: addiw a1, a2, 1365 1838*9122c523SPengcheng Wang; RV64I-NEXT: srliw a2, a0, 2 1839*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a2 1840*9122c523SPengcheng Wang; RV64I-NEXT: srliw a2, a0, 4 1841*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a2 1842*9122c523SPengcheng Wang; RV64I-NEXT: srliw a2, a0, 8 1843*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a2 1844*9122c523SPengcheng Wang; RV64I-NEXT: srliw a2, a0, 16 1845*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a2 1846*9122c523SPengcheng Wang; RV64I-NEXT: not a0, a0 1847*9122c523SPengcheng Wang; RV64I-NEXT: srli a2, a0, 1 1848*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a2, a1 1849*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 209715 1850*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 819 185169d5a038SSimon Pilgrim; RV64I-NEXT: sub a0, a0, a1 1852*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a0, a2 1853c748d2cdSCraig Topper; RV64I-NEXT: srli a0, a0, 2 1854*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a2 1855*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 61681 1856*9122c523SPengcheng Wang; RV64I-NEXT: add a0, a1, a0 1857c748d2cdSCraig Topper; RV64I-NEXT: srli a1, a0, 4 1858c748d2cdSCraig Topper; RV64I-NEXT: add a0, a0, a1 1859*9122c523SPengcheng Wang; RV64I-NEXT: addi a1, a2, -241 1860c748d2cdSCraig Topper; RV64I-NEXT: and a0, a0, a1 1861610b9e23SWang Pengcheng; RV64I-NEXT: slli a1, a0, 8 1862610b9e23SWang Pengcheng; RV64I-NEXT: add a0, a0, a1 1863610b9e23SWang Pengcheng; RV64I-NEXT: slli a1, a0, 16 1864610b9e23SWang Pengcheng; RV64I-NEXT: add a0, a0, a1 1865c748d2cdSCraig Topper; RV64I-NEXT: srliw a0, a0, 24 1866c748d2cdSCraig Topper; RV64I-NEXT: ret 1867c748d2cdSCraig Topper; 18684527fba9SSergei Barannikov; RV32M-LABEL: test_ctlz_i32_zero_undef: 18694527fba9SSergei Barannikov; RV32M: # %bb.0: 18704527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 1 18714527fba9SSergei Barannikov; RV32M-NEXT: lui a2, 349525 1872*9122c523SPengcheng Wang; RV32M-NEXT: or a0, a0, a1 1873*9122c523SPengcheng Wang; RV32M-NEXT: addi a1, a2, 1365 1874*9122c523SPengcheng Wang; RV32M-NEXT: srli a2, a0, 2 1875*9122c523SPengcheng Wang; RV32M-NEXT: or a0, a0, a2 1876*9122c523SPengcheng Wang; RV32M-NEXT: srli a2, a0, 4 1877*9122c523SPengcheng Wang; RV32M-NEXT: or a0, a0, a2 1878*9122c523SPengcheng Wang; RV32M-NEXT: srli a2, a0, 8 1879*9122c523SPengcheng Wang; RV32M-NEXT: or a0, a0, a2 1880*9122c523SPengcheng Wang; RV32M-NEXT: srli a2, a0, 16 1881*9122c523SPengcheng Wang; RV32M-NEXT: or a0, a0, a2 1882*9122c523SPengcheng Wang; RV32M-NEXT: not a0, a0 1883*9122c523SPengcheng Wang; RV32M-NEXT: srli a2, a0, 1 1884*9122c523SPengcheng Wang; RV32M-NEXT: and a1, a2, a1 1885*9122c523SPengcheng Wang; RV32M-NEXT: lui a2, 209715 1886*9122c523SPengcheng Wang; RV32M-NEXT: addi a2, a2, 819 18874527fba9SSergei Barannikov; RV32M-NEXT: sub a0, a0, a1 1888*9122c523SPengcheng Wang; RV32M-NEXT: and a1, a0, a2 18894527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 2 1890*9122c523SPengcheng Wang; RV32M-NEXT: and a0, a0, a2 1891*9122c523SPengcheng Wang; RV32M-NEXT: lui a2, 61681 1892*9122c523SPengcheng Wang; RV32M-NEXT: add a0, a1, a0 18934527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 4 18944527fba9SSergei Barannikov; RV32M-NEXT: add a0, a0, a1 18954527fba9SSergei Barannikov; RV32M-NEXT: lui a1, 4112 1896*9122c523SPengcheng Wang; RV32M-NEXT: addi a2, a2, -241 1897*9122c523SPengcheng Wang; RV32M-NEXT: and a0, a0, a2 18984527fba9SSergei Barannikov; RV32M-NEXT: addi a1, a1, 257 18994527fba9SSergei Barannikov; RV32M-NEXT: mul a0, a0, a1 19004527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 24 19014527fba9SSergei Barannikov; RV32M-NEXT: ret 19024527fba9SSergei Barannikov; 1903d0312a5cSCraig Topper; RV64M-LABEL: test_ctlz_i32_zero_undef: 1904d0312a5cSCraig Topper; RV64M: # %bb.0: 1905d0312a5cSCraig Topper; RV64M-NEXT: srliw a1, a0, 1 1906d0312a5cSCraig Topper; RV64M-NEXT: lui a2, 349525 1907*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a1 1908*9122c523SPengcheng Wang; RV64M-NEXT: addiw a1, a2, 1365 1909*9122c523SPengcheng Wang; RV64M-NEXT: srliw a2, a0, 2 1910*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a2 1911*9122c523SPengcheng Wang; RV64M-NEXT: srliw a2, a0, 4 1912*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a2 1913*9122c523SPengcheng Wang; RV64M-NEXT: srliw a2, a0, 8 1914*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a2 1915*9122c523SPengcheng Wang; RV64M-NEXT: srliw a2, a0, 16 1916*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a2 1917*9122c523SPengcheng Wang; RV64M-NEXT: not a0, a0 1918*9122c523SPengcheng Wang; RV64M-NEXT: srli a2, a0, 1 1919*9122c523SPengcheng Wang; RV64M-NEXT: and a1, a2, a1 1920*9122c523SPengcheng Wang; RV64M-NEXT: lui a2, 209715 1921*9122c523SPengcheng Wang; RV64M-NEXT: addiw a2, a2, 819 192269d5a038SSimon Pilgrim; RV64M-NEXT: sub a0, a0, a1 1923*9122c523SPengcheng Wang; RV64M-NEXT: and a1, a0, a2 1924d0312a5cSCraig Topper; RV64M-NEXT: srli a0, a0, 2 1925*9122c523SPengcheng Wang; RV64M-NEXT: and a0, a0, a2 1926*9122c523SPengcheng Wang; RV64M-NEXT: lui a2, 61681 1927*9122c523SPengcheng Wang; RV64M-NEXT: add a0, a1, a0 1928d0312a5cSCraig Topper; RV64M-NEXT: srli a1, a0, 4 1929d64d3c5aSNitin John Raj; RV64M-NEXT: add a0, a0, a1 1930d0312a5cSCraig Topper; RV64M-NEXT: lui a1, 4112 1931*9122c523SPengcheng Wang; RV64M-NEXT: addi a2, a2, -241 1932*9122c523SPengcheng Wang; RV64M-NEXT: and a0, a0, a2 193386240751SPhilip Reames; RV64M-NEXT: addi a1, a1, 257 19344063369fSCraig Topper; RV64M-NEXT: mul a0, a0, a1 1935d0312a5cSCraig Topper; RV64M-NEXT: srliw a0, a0, 24 1936d0312a5cSCraig Topper; RV64M-NEXT: ret 1937d0312a5cSCraig Topper; 1938c748d2cdSCraig Topper; RV32ZBB-LABEL: test_ctlz_i32_zero_undef: 1939c748d2cdSCraig Topper; RV32ZBB: # %bb.0: 1940c748d2cdSCraig Topper; RV32ZBB-NEXT: clz a0, a0 1941c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 1942c748d2cdSCraig Topper; 1943c748d2cdSCraig Topper; RV64ZBB-LABEL: test_ctlz_i32_zero_undef: 1944c748d2cdSCraig Topper; RV64ZBB: # %bb.0: 1945c748d2cdSCraig Topper; RV64ZBB-NEXT: clzw a0, a0 1946c748d2cdSCraig Topper; RV64ZBB-NEXT: ret 1947fc02eeb2SPhilipp Tomsich; 1948fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_ctlz_i32_zero_undef: 1949fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 1950fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 1951fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 1952fc02eeb2SPhilipp Tomsich; 1953fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_ctlz_i32_zero_undef: 1954fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 1955fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: not a0, a0 1956fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: slli a0, a0, 32 1957fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff0 a0, a0 1958fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 1959c748d2cdSCraig Topper %tmp = call i32 @llvm.ctlz.i32(i32 %a, i1 true) 1960c748d2cdSCraig Topper ret i32 %tmp 1961c748d2cdSCraig Topper} 1962c748d2cdSCraig Topper 1963c748d2cdSCraig Topperdefine i64 @test_ctlz_i64_zero_undef(i64 %a) nounwind { 19644527fba9SSergei Barannikov; RV32I-LABEL: test_ctlz_i64_zero_undef: 19654527fba9SSergei Barannikov; RV32I: # %bb.0: 19664527fba9SSergei Barannikov; RV32I-NEXT: lui a2, 349525 1967*9122c523SPengcheng Wang; RV32I-NEXT: lui a3, 209715 1968*9122c523SPengcheng Wang; RV32I-NEXT: lui a5, 61681 19694527fba9SSergei Barannikov; RV32I-NEXT: addi a4, a2, 1365 1970*9122c523SPengcheng Wang; RV32I-NEXT: addi a3, a3, 819 1971*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a5, -241 19724527fba9SSergei Barannikov; RV32I-NEXT: bnez a1, .LBB15_2 19734527fba9SSergei Barannikov; RV32I-NEXT: # %bb.1: 19744527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 1 19754527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 19764527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 2 19774527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 19784527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 4 19794527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 19804527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 8 19814527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 19824527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 16 19834527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 19844527fba9SSergei Barannikov; RV32I-NEXT: not a0, a0 19854527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 1 19864527fba9SSergei Barannikov; RV32I-NEXT: and a1, a1, a4 19874527fba9SSergei Barannikov; RV32I-NEXT: sub a0, a0, a1 19884527fba9SSergei Barannikov; RV32I-NEXT: and a1, a0, a3 19894527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 2 19904527fba9SSergei Barannikov; RV32I-NEXT: and a0, a0, a3 19914527fba9SSergei Barannikov; RV32I-NEXT: add a0, a1, a0 19924527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 4 19934527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 19944527fba9SSergei Barannikov; RV32I-NEXT: and a0, a0, a2 19954527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 8 19964527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 19974527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 16 19984527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 19994527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 24 20004527fba9SSergei Barannikov; RV32I-NEXT: addi a0, a0, 32 20014527fba9SSergei Barannikov; RV32I-NEXT: li a1, 0 20024527fba9SSergei Barannikov; RV32I-NEXT: ret 20034527fba9SSergei Barannikov; RV32I-NEXT: .LBB15_2: 20044527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a1, 1 20054527fba9SSergei Barannikov; RV32I-NEXT: or a0, a1, a0 20064527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 2 20074527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 20084527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 4 20094527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 20104527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 8 20114527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 20124527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 16 20134527fba9SSergei Barannikov; RV32I-NEXT: or a0, a0, a1 20144527fba9SSergei Barannikov; RV32I-NEXT: not a0, a0 20154527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 1 20164527fba9SSergei Barannikov; RV32I-NEXT: and a1, a1, a4 20174527fba9SSergei Barannikov; RV32I-NEXT: sub a0, a0, a1 20184527fba9SSergei Barannikov; RV32I-NEXT: and a1, a0, a3 20194527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 2 20204527fba9SSergei Barannikov; RV32I-NEXT: and a0, a0, a3 20214527fba9SSergei Barannikov; RV32I-NEXT: add a0, a1, a0 20224527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 4 20234527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 20244527fba9SSergei Barannikov; RV32I-NEXT: and a0, a0, a2 20254527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 8 20264527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 20274527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 16 20284527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 20294527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 24 20304527fba9SSergei Barannikov; RV32I-NEXT: li a1, 0 20314527fba9SSergei Barannikov; RV32I-NEXT: ret 2032c748d2cdSCraig Topper; 20334527fba9SSergei Barannikov; RV64I-LABEL: test_ctlz_i64_zero_undef: 20344527fba9SSergei Barannikov; RV64I: # %bb.0: 20354527fba9SSergei Barannikov; RV64I-NEXT: srli a1, a0, 1 20364527fba9SSergei Barannikov; RV64I-NEXT: lui a2, 349525 2037*9122c523SPengcheng Wang; RV64I-NEXT: lui a3, 209715 2038*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a1 2039*9122c523SPengcheng Wang; RV64I-NEXT: addiw a1, a2, 1365 2040*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a3, 819 2041*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 2 2042*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a3 2043*9122c523SPengcheng Wang; RV64I-NEXT: slli a3, a1, 32 2044*9122c523SPengcheng Wang; RV64I-NEXT: add a1, a1, a3 20454527fba9SSergei Barannikov; RV64I-NEXT: slli a3, a2, 32 20464527fba9SSergei Barannikov; RV64I-NEXT: add a2, a2, a3 2047*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 4 2048*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a3 2049*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 8 2050*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a3 2051*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 16 2052*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a3 2053*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 32 2054*9122c523SPengcheng Wang; RV64I-NEXT: or a0, a0, a3 2055*9122c523SPengcheng Wang; RV64I-NEXT: not a0, a0 2056*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 1 2057*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a3, a1 2058*9122c523SPengcheng Wang; RV64I-NEXT: lui a3, 61681 2059*9122c523SPengcheng Wang; RV64I-NEXT: addiw a3, a3, -241 20604527fba9SSergei Barannikov; RV64I-NEXT: sub a0, a0, a1 2061*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a0, a2 20624527fba9SSergei Barannikov; RV64I-NEXT: srli a0, a0, 2 2063*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a2 2064*9122c523SPengcheng Wang; RV64I-NEXT: slli a2, a3, 32 2065*9122c523SPengcheng Wang; RV64I-NEXT: add a0, a1, a0 20664527fba9SSergei Barannikov; RV64I-NEXT: srli a1, a0, 4 20674527fba9SSergei Barannikov; RV64I-NEXT: add a0, a0, a1 2068*9122c523SPengcheng Wang; RV64I-NEXT: add a2, a3, a2 2069*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a2 20704527fba9SSergei Barannikov; RV64I-NEXT: slli a1, a0, 8 20714527fba9SSergei Barannikov; RV64I-NEXT: add a0, a0, a1 20724527fba9SSergei Barannikov; RV64I-NEXT: slli a1, a0, 16 20734527fba9SSergei Barannikov; RV64I-NEXT: add a0, a0, a1 20744527fba9SSergei Barannikov; RV64I-NEXT: slli a1, a0, 32 20754527fba9SSergei Barannikov; RV64I-NEXT: add a0, a0, a1 20764527fba9SSergei Barannikov; RV64I-NEXT: srli a0, a0, 56 20774527fba9SSergei Barannikov; RV64I-NEXT: ret 20784527fba9SSergei Barannikov; 20794527fba9SSergei Barannikov; RV32M-LABEL: test_ctlz_i64_zero_undef: 20804527fba9SSergei Barannikov; RV32M: # %bb.0: 20814527fba9SSergei Barannikov; RV32M-NEXT: lui a2, 349525 2082*9122c523SPengcheng Wang; RV32M-NEXT: lui a3, 209715 2083*9122c523SPengcheng Wang; RV32M-NEXT: lui a6, 61681 2084*9122c523SPengcheng Wang; RV32M-NEXT: lui a7, 4112 20854527fba9SSergei Barannikov; RV32M-NEXT: addi a5, a2, 1365 2086*9122c523SPengcheng Wang; RV32M-NEXT: addi a4, a3, 819 2087*9122c523SPengcheng Wang; RV32M-NEXT: addi a3, a6, -241 2088*9122c523SPengcheng Wang; RV32M-NEXT: addi a2, a7, 257 20894527fba9SSergei Barannikov; RV32M-NEXT: bnez a1, .LBB15_2 20904527fba9SSergei Barannikov; RV32M-NEXT: # %bb.1: 20914527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 1 20924527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 20934527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 2 20944527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 20954527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 4 20964527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 20974527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 8 20984527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 20994527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 16 21004527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 21014527fba9SSergei Barannikov; RV32M-NEXT: not a0, a0 21024527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 1 21034527fba9SSergei Barannikov; RV32M-NEXT: and a1, a1, a5 21044527fba9SSergei Barannikov; RV32M-NEXT: sub a0, a0, a1 21054527fba9SSergei Barannikov; RV32M-NEXT: and a1, a0, a4 21064527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 2 21074527fba9SSergei Barannikov; RV32M-NEXT: and a0, a0, a4 21084527fba9SSergei Barannikov; RV32M-NEXT: add a0, a1, a0 21094527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 4 21104527fba9SSergei Barannikov; RV32M-NEXT: add a0, a0, a1 2111*9122c523SPengcheng Wang; RV32M-NEXT: and a0, a0, a3 2112*9122c523SPengcheng Wang; RV32M-NEXT: mul a0, a0, a2 21134527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 24 21144527fba9SSergei Barannikov; RV32M-NEXT: addi a0, a0, 32 21154527fba9SSergei Barannikov; RV32M-NEXT: li a1, 0 21164527fba9SSergei Barannikov; RV32M-NEXT: ret 21174527fba9SSergei Barannikov; RV32M-NEXT: .LBB15_2: 21184527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a1, 1 21194527fba9SSergei Barannikov; RV32M-NEXT: or a0, a1, a0 21204527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 2 21214527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 21224527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 4 21234527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 21244527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 8 21254527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 21264527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 16 21274527fba9SSergei Barannikov; RV32M-NEXT: or a0, a0, a1 21284527fba9SSergei Barannikov; RV32M-NEXT: not a0, a0 21294527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 1 21304527fba9SSergei Barannikov; RV32M-NEXT: and a1, a1, a5 21314527fba9SSergei Barannikov; RV32M-NEXT: sub a0, a0, a1 21324527fba9SSergei Barannikov; RV32M-NEXT: and a1, a0, a4 21334527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 2 21344527fba9SSergei Barannikov; RV32M-NEXT: and a0, a0, a4 21354527fba9SSergei Barannikov; RV32M-NEXT: add a0, a1, a0 21364527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 4 21374527fba9SSergei Barannikov; RV32M-NEXT: add a0, a0, a1 2138*9122c523SPengcheng Wang; RV32M-NEXT: and a0, a0, a3 2139*9122c523SPengcheng Wang; RV32M-NEXT: mul a0, a0, a2 21404527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 24 21414527fba9SSergei Barannikov; RV32M-NEXT: li a1, 0 21424527fba9SSergei Barannikov; RV32M-NEXT: ret 21434527fba9SSergei Barannikov; 21444527fba9SSergei Barannikov; RV64M-LABEL: test_ctlz_i64_zero_undef: 21454527fba9SSergei Barannikov; RV64M: # %bb.0: 21464527fba9SSergei Barannikov; RV64M-NEXT: srli a1, a0, 1 21474527fba9SSergei Barannikov; RV64M-NEXT: lui a2, 349525 2148*9122c523SPengcheng Wang; RV64M-NEXT: lui a3, 209715 2149*9122c523SPengcheng Wang; RV64M-NEXT: lui a4, 61681 2150*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a1 2151*9122c523SPengcheng Wang; RV64M-NEXT: addiw a1, a2, 1365 2152*9122c523SPengcheng Wang; RV64M-NEXT: addiw a2, a3, 819 2153*9122c523SPengcheng Wang; RV64M-NEXT: addiw a3, a4, -241 2154*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 2 2155*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a4 2156*9122c523SPengcheng Wang; RV64M-NEXT: slli a4, a1, 32 2157*9122c523SPengcheng Wang; RV64M-NEXT: add a1, a1, a4 2158*9122c523SPengcheng Wang; RV64M-NEXT: slli a4, a2, 32 2159*9122c523SPengcheng Wang; RV64M-NEXT: add a2, a2, a4 2160*9122c523SPengcheng Wang; RV64M-NEXT: slli a4, a3, 32 2161*9122c523SPengcheng Wang; RV64M-NEXT: add a3, a3, a4 2162*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 4 2163*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a4 2164*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 8 2165*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a4 2166*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 16 2167*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a4 2168*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 32 2169*9122c523SPengcheng Wang; RV64M-NEXT: or a0, a0, a4 2170*9122c523SPengcheng Wang; RV64M-NEXT: not a0, a0 2171*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 1 2172*9122c523SPengcheng Wang; RV64M-NEXT: and a1, a4, a1 21734527fba9SSergei Barannikov; RV64M-NEXT: sub a0, a0, a1 2174*9122c523SPengcheng Wang; RV64M-NEXT: and a1, a0, a2 21754527fba9SSergei Barannikov; RV64M-NEXT: srli a0, a0, 2 2176*9122c523SPengcheng Wang; RV64M-NEXT: and a0, a0, a2 2177*9122c523SPengcheng Wang; RV64M-NEXT: lui a2, 4112 2178*9122c523SPengcheng Wang; RV64M-NEXT: addiw a2, a2, 257 2179*9122c523SPengcheng Wang; RV64M-NEXT: add a0, a1, a0 21804527fba9SSergei Barannikov; RV64M-NEXT: srli a1, a0, 4 21814527fba9SSergei Barannikov; RV64M-NEXT: add a0, a0, a1 2182*9122c523SPengcheng Wang; RV64M-NEXT: slli a1, a2, 32 2183*9122c523SPengcheng Wang; RV64M-NEXT: and a0, a0, a3 2184*9122c523SPengcheng Wang; RV64M-NEXT: add a1, a2, a1 21854527fba9SSergei Barannikov; RV64M-NEXT: mul a0, a0, a1 21864527fba9SSergei Barannikov; RV64M-NEXT: srli a0, a0, 56 21874527fba9SSergei Barannikov; RV64M-NEXT: ret 2188d0312a5cSCraig Topper; 2189c748d2cdSCraig Topper; RV32ZBB-LABEL: test_ctlz_i64_zero_undef: 2190c748d2cdSCraig Topper; RV32ZBB: # %bb.0: 2191c748d2cdSCraig Topper; RV32ZBB-NEXT: bnez a1, .LBB15_2 2192c748d2cdSCraig Topper; RV32ZBB-NEXT: # %bb.1: 2193c748d2cdSCraig Topper; RV32ZBB-NEXT: clz a0, a0 2194c748d2cdSCraig Topper; RV32ZBB-NEXT: addi a0, a0, 32 2195c748d2cdSCraig Topper; RV32ZBB-NEXT: li a1, 0 2196c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 2197c748d2cdSCraig Topper; RV32ZBB-NEXT: .LBB15_2: 2198c748d2cdSCraig Topper; RV32ZBB-NEXT: clz a0, a1 2199c748d2cdSCraig Topper; RV32ZBB-NEXT: li a1, 0 2200c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 2201c748d2cdSCraig Topper; 2202c748d2cdSCraig Topper; RV64ZBB-LABEL: test_ctlz_i64_zero_undef: 2203c748d2cdSCraig Topper; RV64ZBB: # %bb.0: 2204c748d2cdSCraig Topper; RV64ZBB-NEXT: clz a0, a0 2205c748d2cdSCraig Topper; RV64ZBB-NEXT: ret 2206fc02eeb2SPhilipp Tomsich; 2207fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_ctlz_i64_zero_undef: 2208fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 2209fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: bnez a1, .LBB15_2 2210fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: # %bb.1: 2211fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a0 2212fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a0, a0, 32 2213fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 0 2214fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 2215fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: .LBB15_2: 2216fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.ff1 a0, a1 2217fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 0 2218fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 2219fc02eeb2SPhilipp Tomsich; 2220fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_ctlz_i64_zero_undef: 2221fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 2222fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.ff1 a0, a0 2223fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 2224c748d2cdSCraig Topper %tmp = call i64 @llvm.ctlz.i64(i64 %a, i1 true) 2225c748d2cdSCraig Topper ret i64 %tmp 2226c748d2cdSCraig Topper} 2227c748d2cdSCraig Topper 2228c748d2cdSCraig Topperdefine i8 @test_ctpop_i8(i8 %a) nounwind { 2229d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_ctpop_i8: 2230d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 2231d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 1 2232d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a1, a1, 85 2233d0312a5cSCraig Topper; RV32_NOZBB-NEXT: sub a0, a0, a1 2234d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a1, a0, 51 2235d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 2 2236d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 51 2237d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a1, a0 2238d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 2239d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a0, a1 2240d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 15 2241d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 2242c748d2cdSCraig Topper; 2243d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_ctpop_i8: 2244d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 2245d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 1 2246d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a1, a1, 85 2247cdf09ce7SCraig Topper; RV64NOZBB-NEXT: subw a0, a0, a1 2248d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a1, a0, 51 2249d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 2 2250d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 51 2251d0312a5cSCraig Topper; RV64NOZBB-NEXT: add a0, a1, a0 2252d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 2253d64d3c5aSNitin John Raj; RV64NOZBB-NEXT: add a0, a0, a1 2254d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 15 2255d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 2256c748d2cdSCraig Topper; 2257c748d2cdSCraig Topper; RV32ZBB-LABEL: test_ctpop_i8: 2258c748d2cdSCraig Topper; RV32ZBB: # %bb.0: 2259c748d2cdSCraig Topper; RV32ZBB-NEXT: andi a0, a0, 255 2260c748d2cdSCraig Topper; RV32ZBB-NEXT: cpop a0, a0 2261c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 2262c748d2cdSCraig Topper; 2263c748d2cdSCraig Topper; RV64ZBB-LABEL: test_ctpop_i8: 2264c748d2cdSCraig Topper; RV64ZBB: # %bb.0: 2265c748d2cdSCraig Topper; RV64ZBB-NEXT: andi a0, a0, 255 2266c748d2cdSCraig Topper; RV64ZBB-NEXT: cpopw a0, a0 2267c748d2cdSCraig Topper; RV64ZBB-NEXT: ret 2268fc02eeb2SPhilipp Tomsich; 2269fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_ctpop_i8: 2270fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 2271fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 1 2272fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: andi a1, a1, 85 2273fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: sub a0, a0, a1 2274fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: andi a1, a0, 51 2275fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a0, a0, 2 2276fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: andi a0, a0, 51 2277fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: add a0, a1, a0 2278fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 4 2279fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: add a0, a0, a1 2280fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: andi a0, a0, 15 2281fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 2282fc02eeb2SPhilipp Tomsich; 2283fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_ctpop_i8: 2284fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 2285fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 1 2286fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: andi a1, a1, 85 2287fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: subw a0, a0, a1 2288fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: andi a1, a0, 51 2289fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a0, a0, 2 2290fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: andi a0, a0, 51 2291fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: add a0, a1, a0 2292fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 4 2293fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: add a0, a0, a1 2294fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: andi a0, a0, 15 2295fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 2296c748d2cdSCraig Topper %1 = call i8 @llvm.ctpop.i8(i8 %a) 2297c748d2cdSCraig Topper ret i8 %1 2298c748d2cdSCraig Topper} 2299c748d2cdSCraig Topper 2300c748d2cdSCraig Topperdefine i16 @test_ctpop_i16(i16 %a) nounwind { 2301d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_ctpop_i16: 2302d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 2303d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 1 2304d0312a5cSCraig Topper; RV32_NOZBB-NEXT: lui a2, 5 2305d0312a5cSCraig Topper; RV32_NOZBB-NEXT: addi a2, a2, 1365 2306d0312a5cSCraig Topper; RV32_NOZBB-NEXT: and a1, a1, a2 2307*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: lui a2, 3 2308*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: addi a2, a2, 819 2309d0312a5cSCraig Topper; RV32_NOZBB-NEXT: sub a0, a0, a1 2310*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a1, a0, a2 2311d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 2 2312*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: and a0, a0, a2 2313*9122c523SPengcheng Wang; RV32_NOZBB-NEXT: add a0, a1, a0 2314d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 2315d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a0, a1 23161c4880a2SCraig Topper; RV32_NOZBB-NEXT: andi a1, a0, 15 23171c4880a2SCraig Topper; RV32_NOZBB-NEXT: slli a0, a0, 20 23181c4880a2SCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 28 2319d0312a5cSCraig Topper; RV32_NOZBB-NEXT: add a0, a1, a0 2320d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 2321c748d2cdSCraig Topper; 2322d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_ctpop_i16: 2323d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 2324d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 1 2325d0312a5cSCraig Topper; RV64NOZBB-NEXT: lui a2, 5 2326d0312a5cSCraig Topper; RV64NOZBB-NEXT: addiw a2, a2, 1365 2327d0312a5cSCraig Topper; RV64NOZBB-NEXT: and a1, a1, a2 2328*9122c523SPengcheng Wang; RV64NOZBB-NEXT: lui a2, 3 2329*9122c523SPengcheng Wang; RV64NOZBB-NEXT: addiw a2, a2, 819 2330d0312a5cSCraig Topper; RV64NOZBB-NEXT: sub a0, a0, a1 2331*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a1, a0, a2 2332d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 2 2333*9122c523SPengcheng Wang; RV64NOZBB-NEXT: and a0, a0, a2 2334*9122c523SPengcheng Wang; RV64NOZBB-NEXT: add a0, a1, a0 2335d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 2336d64d3c5aSNitin John Raj; RV64NOZBB-NEXT: add a0, a0, a1 23371c4880a2SCraig Topper; RV64NOZBB-NEXT: andi a1, a0, 15 23381c4880a2SCraig Topper; RV64NOZBB-NEXT: slli a0, a0, 52 23391c4880a2SCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 60 23401c4880a2SCraig Topper; RV64NOZBB-NEXT: add a0, a1, a0 2341d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 2342c748d2cdSCraig Topper; 2343c748d2cdSCraig Topper; RV32ZBB-LABEL: test_ctpop_i16: 2344c748d2cdSCraig Topper; RV32ZBB: # %bb.0: 2345c748d2cdSCraig Topper; RV32ZBB-NEXT: zext.h a0, a0 2346c748d2cdSCraig Topper; RV32ZBB-NEXT: cpop a0, a0 2347c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 2348c748d2cdSCraig Topper; 2349c748d2cdSCraig Topper; RV64ZBB-LABEL: test_ctpop_i16: 2350c748d2cdSCraig Topper; RV64ZBB: # %bb.0: 2351c748d2cdSCraig Topper; RV64ZBB-NEXT: zext.h a0, a0 2352c748d2cdSCraig Topper; RV64ZBB-NEXT: cpopw a0, a0 2353c748d2cdSCraig Topper; RV64ZBB-NEXT: ret 2354fc02eeb2SPhilipp Tomsich; 2355fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_ctpop_i16: 2356fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 2357fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 1 2358fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: lui a2, 5 2359fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: addi a2, a2, 1365 2360fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: and a1, a1, a2 2361*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: lui a2, 3 2362*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: addi a2, a2, 819 2363fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: sub a0, a0, a1 2364*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: and a1, a0, a2 2365fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a0, a0, 2 2366*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: and a0, a0, a2 2367*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: add a0, a1, a0 2368fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 4 2369fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: add a0, a0, a1 23701900810bSWang Yaduo; RV32XTHEADBB-NEXT: th.extu a1, a0, 11, 8 23711900810bSWang Yaduo; RV32XTHEADBB-NEXT: andi a0, a0, 15 23721900810bSWang Yaduo; RV32XTHEADBB-NEXT: add a0, a0, a1 2373fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 2374fc02eeb2SPhilipp Tomsich; 2375fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_ctpop_i16: 2376fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 2377fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 1 2378fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: lui a2, 5 2379fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: addiw a2, a2, 1365 2380fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: and a1, a1, a2 2381*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: lui a2, 3 2382*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: addiw a2, a2, 819 2383fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: sub a0, a0, a1 2384*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: and a1, a0, a2 2385fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a0, a0, 2 2386*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: and a0, a0, a2 2387*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: add a0, a1, a0 2388fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 4 2389fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: add a0, a0, a1 23901900810bSWang Yaduo; RV64XTHEADBB-NEXT: th.extu a1, a0, 11, 8 23911900810bSWang Yaduo; RV64XTHEADBB-NEXT: andi a0, a0, 15 23921900810bSWang Yaduo; RV64XTHEADBB-NEXT: add a0, a0, a1 2393fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 2394c748d2cdSCraig Topper %1 = call i16 @llvm.ctpop.i16(i16 %a) 2395c748d2cdSCraig Topper ret i16 %1 2396c748d2cdSCraig Topper} 2397c748d2cdSCraig Topper 2398dcd751b2SCraig Topperdefine i32 @test_ctpop_i32(i32 %a) nounwind { 23994527fba9SSergei Barannikov; RV32I-LABEL: test_ctpop_i32: 24004527fba9SSergei Barannikov; RV32I: # %bb.0: 24014527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 1 24024527fba9SSergei Barannikov; RV32I-NEXT: lui a2, 349525 24034527fba9SSergei Barannikov; RV32I-NEXT: addi a2, a2, 1365 24044527fba9SSergei Barannikov; RV32I-NEXT: and a1, a1, a2 2405*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 209715 2406*9122c523SPengcheng Wang; RV32I-NEXT: addi a2, a2, 819 24074527fba9SSergei Barannikov; RV32I-NEXT: sub a0, a0, a1 2408*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a0, a2 24094527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 2 2410*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a2 2411*9122c523SPengcheng Wang; RV32I-NEXT: lui a2, 61681 2412*9122c523SPengcheng Wang; RV32I-NEXT: add a0, a1, a0 24134527fba9SSergei Barannikov; RV32I-NEXT: srli a1, a0, 4 24144527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 2415*9122c523SPengcheng Wang; RV32I-NEXT: addi a1, a2, -241 24164527fba9SSergei Barannikov; RV32I-NEXT: and a0, a0, a1 24174527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 8 24184527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 24194527fba9SSergei Barannikov; RV32I-NEXT: slli a1, a0, 16 24204527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 24214527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 24 24224527fba9SSergei Barannikov; RV32I-NEXT: ret 2423dcd751b2SCraig Topper; 2424dcd751b2SCraig Topper; RV64I-LABEL: test_ctpop_i32: 2425dcd751b2SCraig Topper; RV64I: # %bb.0: 2426dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 1 2427dcd751b2SCraig Topper; RV64I-NEXT: lui a2, 349525 2428dcd751b2SCraig Topper; RV64I-NEXT: addiw a2, a2, 1365 2429dcd751b2SCraig Topper; RV64I-NEXT: and a1, a1, a2 2430*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 209715 2431*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 819 243269d5a038SSimon Pilgrim; RV64I-NEXT: sub a0, a0, a1 2433*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a0, a2 2434dcd751b2SCraig Topper; RV64I-NEXT: srli a0, a0, 2 2435*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a2 2436*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 61681 2437*9122c523SPengcheng Wang; RV64I-NEXT: add a0, a1, a0 2438dcd751b2SCraig Topper; RV64I-NEXT: srli a1, a0, 4 2439dcd751b2SCraig Topper; RV64I-NEXT: add a0, a0, a1 2440*9122c523SPengcheng Wang; RV64I-NEXT: addi a1, a2, -241 2441dcd751b2SCraig Topper; RV64I-NEXT: and a0, a0, a1 2442610b9e23SWang Pengcheng; RV64I-NEXT: slli a1, a0, 8 2443610b9e23SWang Pengcheng; RV64I-NEXT: add a0, a0, a1 2444610b9e23SWang Pengcheng; RV64I-NEXT: slli a1, a0, 16 2445610b9e23SWang Pengcheng; RV64I-NEXT: add a0, a0, a1 2446dcd751b2SCraig Topper; RV64I-NEXT: srliw a0, a0, 24 2447dcd751b2SCraig Topper; RV64I-NEXT: ret 2448dcd751b2SCraig Topper; 24494527fba9SSergei Barannikov; RV32M-LABEL: test_ctpop_i32: 24504527fba9SSergei Barannikov; RV32M: # %bb.0: 24514527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 1 24524527fba9SSergei Barannikov; RV32M-NEXT: lui a2, 349525 24534527fba9SSergei Barannikov; RV32M-NEXT: addi a2, a2, 1365 24544527fba9SSergei Barannikov; RV32M-NEXT: and a1, a1, a2 2455*9122c523SPengcheng Wang; RV32M-NEXT: lui a2, 209715 2456*9122c523SPengcheng Wang; RV32M-NEXT: addi a2, a2, 819 24574527fba9SSergei Barannikov; RV32M-NEXT: sub a0, a0, a1 2458*9122c523SPengcheng Wang; RV32M-NEXT: and a1, a0, a2 24594527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 2 2460*9122c523SPengcheng Wang; RV32M-NEXT: and a0, a0, a2 2461*9122c523SPengcheng Wang; RV32M-NEXT: lui a2, 61681 2462*9122c523SPengcheng Wang; RV32M-NEXT: add a0, a1, a0 24634527fba9SSergei Barannikov; RV32M-NEXT: srli a1, a0, 4 24644527fba9SSergei Barannikov; RV32M-NEXT: add a0, a0, a1 24654527fba9SSergei Barannikov; RV32M-NEXT: lui a1, 4112 2466*9122c523SPengcheng Wang; RV32M-NEXT: addi a2, a2, -241 2467*9122c523SPengcheng Wang; RV32M-NEXT: and a0, a0, a2 24684527fba9SSergei Barannikov; RV32M-NEXT: addi a1, a1, 257 24694527fba9SSergei Barannikov; RV32M-NEXT: mul a0, a0, a1 24704527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 24 24714527fba9SSergei Barannikov; RV32M-NEXT: ret 24724527fba9SSergei Barannikov; 2473d0312a5cSCraig Topper; RV64M-LABEL: test_ctpop_i32: 2474d0312a5cSCraig Topper; RV64M: # %bb.0: 2475d0312a5cSCraig Topper; RV64M-NEXT: srli a1, a0, 1 2476d0312a5cSCraig Topper; RV64M-NEXT: lui a2, 349525 2477d0312a5cSCraig Topper; RV64M-NEXT: addiw a2, a2, 1365 2478d0312a5cSCraig Topper; RV64M-NEXT: and a1, a1, a2 2479*9122c523SPengcheng Wang; RV64M-NEXT: lui a2, 209715 2480*9122c523SPengcheng Wang; RV64M-NEXT: addiw a2, a2, 819 248169d5a038SSimon Pilgrim; RV64M-NEXT: sub a0, a0, a1 2482*9122c523SPengcheng Wang; RV64M-NEXT: and a1, a0, a2 2483d0312a5cSCraig Topper; RV64M-NEXT: srli a0, a0, 2 2484*9122c523SPengcheng Wang; RV64M-NEXT: and a0, a0, a2 2485*9122c523SPengcheng Wang; RV64M-NEXT: lui a2, 61681 2486*9122c523SPengcheng Wang; RV64M-NEXT: add a0, a1, a0 2487d0312a5cSCraig Topper; RV64M-NEXT: srli a1, a0, 4 2488d64d3c5aSNitin John Raj; RV64M-NEXT: add a0, a0, a1 2489d0312a5cSCraig Topper; RV64M-NEXT: lui a1, 4112 2490*9122c523SPengcheng Wang; RV64M-NEXT: addi a2, a2, -241 2491*9122c523SPengcheng Wang; RV64M-NEXT: and a0, a0, a2 249286240751SPhilip Reames; RV64M-NEXT: addi a1, a1, 257 24934063369fSCraig Topper; RV64M-NEXT: mul a0, a0, a1 2494d0312a5cSCraig Topper; RV64M-NEXT: srliw a0, a0, 24 2495d0312a5cSCraig Topper; RV64M-NEXT: ret 2496d0312a5cSCraig Topper; 2497dcd751b2SCraig Topper; RV32ZBB-LABEL: test_ctpop_i32: 2498dcd751b2SCraig Topper; RV32ZBB: # %bb.0: 2499dcd751b2SCraig Topper; RV32ZBB-NEXT: cpop a0, a0 2500dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 2501dcd751b2SCraig Topper; 2502dcd751b2SCraig Topper; RV64ZBB-LABEL: test_ctpop_i32: 2503dcd751b2SCraig Topper; RV64ZBB: # %bb.0: 2504dcd751b2SCraig Topper; RV64ZBB-NEXT: cpopw a0, a0 2505dcd751b2SCraig Topper; RV64ZBB-NEXT: ret 2506fc02eeb2SPhilipp Tomsich; 2507fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_ctpop_i32: 2508fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 25094527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: srli a1, a0, 1 25104527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: lui a2, 349525 25114527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: addi a2, a2, 1365 25124527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: and a1, a1, a2 2513*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: lui a2, 209715 2514*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: addi a2, a2, 819 25154527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: sub a0, a0, a1 2516*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: and a1, a0, a2 25174527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: srli a0, a0, 2 2518*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: and a0, a0, a2 2519*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: lui a2, 61681 2520*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: add a0, a1, a0 25214527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: srli a1, a0, 4 25224527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: add a0, a0, a1 2523*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: addi a1, a2, -241 25244527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: and a0, a0, a1 25254527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: slli a1, a0, 8 25264527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: add a0, a0, a1 25274527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: slli a1, a0, 16 25284527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: add a0, a0, a1 25294527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: srli a0, a0, 24 25304527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: ret 2531fc02eeb2SPhilipp Tomsich; 2532fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_ctpop_i32: 2533fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 2534fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 1 2535fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: lui a2, 349525 2536fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: addiw a2, a2, 1365 2537fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: and a1, a1, a2 2538*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: lui a2, 209715 2539*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: addiw a2, a2, 819 2540fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: sub a0, a0, a1 2541*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: and a1, a0, a2 2542fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a0, a0, 2 2543*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: and a0, a0, a2 2544*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: lui a2, 61681 2545*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: add a0, a1, a0 2546fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 4 2547fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: add a0, a0, a1 2548*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: addi a1, a2, -241 2549fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: and a0, a0, a1 2550610b9e23SWang Pengcheng; RV64XTHEADBB-NEXT: slli a1, a0, 8 2551610b9e23SWang Pengcheng; RV64XTHEADBB-NEXT: add a0, a0, a1 2552610b9e23SWang Pengcheng; RV64XTHEADBB-NEXT: slli a1, a0, 16 2553610b9e23SWang Pengcheng; RV64XTHEADBB-NEXT: add a0, a0, a1 2554fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srliw a0, a0, 24 2555fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 2556dcd751b2SCraig Topper %1 = call i32 @llvm.ctpop.i32(i32 %a) 2557dcd751b2SCraig Topper ret i32 %1 2558dcd751b2SCraig Topper} 2559dcd751b2SCraig Topper 2560dcd751b2SCraig Topperdefine i64 @test_ctpop_i64(i64 %a) nounwind { 25614527fba9SSergei Barannikov; RV32I-LABEL: test_ctpop_i64: 25624527fba9SSergei Barannikov; RV32I: # %bb.0: 25634527fba9SSergei Barannikov; RV32I-NEXT: srli a2, a1, 1 25644527fba9SSergei Barannikov; RV32I-NEXT: lui a3, 349525 2565*9122c523SPengcheng Wang; RV32I-NEXT: lui a4, 209715 2566*9122c523SPengcheng Wang; RV32I-NEXT: srli a5, a0, 1 25674527fba9SSergei Barannikov; RV32I-NEXT: addi a3, a3, 1365 25684527fba9SSergei Barannikov; RV32I-NEXT: and a2, a2, a3 25694527fba9SSergei Barannikov; RV32I-NEXT: and a3, a5, a3 2570*9122c523SPengcheng Wang; RV32I-NEXT: lui a5, 61681 2571*9122c523SPengcheng Wang; RV32I-NEXT: addi a4, a4, 819 2572*9122c523SPengcheng Wang; RV32I-NEXT: addi a5, a5, -241 2573*9122c523SPengcheng Wang; RV32I-NEXT: sub a1, a1, a2 25744527fba9SSergei Barannikov; RV32I-NEXT: sub a0, a0, a3 2575*9122c523SPengcheng Wang; RV32I-NEXT: and a2, a1, a4 2576*9122c523SPengcheng Wang; RV32I-NEXT: srli a1, a1, 2 2577*9122c523SPengcheng Wang; RV32I-NEXT: and a3, a0, a4 25784527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 2 2579*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a4 25804527fba9SSergei Barannikov; RV32I-NEXT: and a0, a0, a4 2581*9122c523SPengcheng Wang; RV32I-NEXT: add a1, a2, a1 2582*9122c523SPengcheng Wang; RV32I-NEXT: add a0, a3, a0 2583*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a1, 4 2584*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a0, 4 2585*9122c523SPengcheng Wang; RV32I-NEXT: add a1, a1, a2 2586*9122c523SPengcheng Wang; RV32I-NEXT: add a0, a0, a3 2587*9122c523SPengcheng Wang; RV32I-NEXT: and a1, a1, a5 2588*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, a5 2589*9122c523SPengcheng Wang; RV32I-NEXT: slli a2, a1, 8 2590*9122c523SPengcheng Wang; RV32I-NEXT: slli a3, a0, 8 2591*9122c523SPengcheng Wang; RV32I-NEXT: add a1, a1, a2 2592*9122c523SPengcheng Wang; RV32I-NEXT: add a0, a0, a3 2593*9122c523SPengcheng Wang; RV32I-NEXT: slli a2, a1, 16 2594*9122c523SPengcheng Wang; RV32I-NEXT: slli a3, a0, 16 2595*9122c523SPengcheng Wang; RV32I-NEXT: add a1, a1, a2 2596*9122c523SPengcheng Wang; RV32I-NEXT: add a0, a0, a3 2597*9122c523SPengcheng Wang; RV32I-NEXT: srli a1, a1, 24 25984527fba9SSergei Barannikov; RV32I-NEXT: srli a0, a0, 24 25994527fba9SSergei Barannikov; RV32I-NEXT: add a0, a0, a1 26004527fba9SSergei Barannikov; RV32I-NEXT: li a1, 0 26014527fba9SSergei Barannikov; RV32I-NEXT: ret 2602dcd751b2SCraig Topper; 26034527fba9SSergei Barannikov; RV64I-LABEL: test_ctpop_i64: 26044527fba9SSergei Barannikov; RV64I: # %bb.0: 2605*9122c523SPengcheng Wang; RV64I-NEXT: lui a1, 349525 2606*9122c523SPengcheng Wang; RV64I-NEXT: lui a2, 209715 2607*9122c523SPengcheng Wang; RV64I-NEXT: addiw a1, a1, 1365 2608*9122c523SPengcheng Wang; RV64I-NEXT: addiw a2, a2, 819 2609*9122c523SPengcheng Wang; RV64I-NEXT: slli a3, a1, 32 2610*9122c523SPengcheng Wang; RV64I-NEXT: add a1, a1, a3 26114527fba9SSergei Barannikov; RV64I-NEXT: slli a3, a2, 32 26124527fba9SSergei Barannikov; RV64I-NEXT: add a2, a2, a3 2613*9122c523SPengcheng Wang; RV64I-NEXT: srli a3, a0, 1 2614*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a3, a1 2615*9122c523SPengcheng Wang; RV64I-NEXT: lui a3, 61681 2616*9122c523SPengcheng Wang; RV64I-NEXT: addiw a3, a3, -241 26174527fba9SSergei Barannikov; RV64I-NEXT: sub a0, a0, a1 2618*9122c523SPengcheng Wang; RV64I-NEXT: and a1, a0, a2 26194527fba9SSergei Barannikov; RV64I-NEXT: srli a0, a0, 2 2620*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a2 2621*9122c523SPengcheng Wang; RV64I-NEXT: slli a2, a3, 32 2622*9122c523SPengcheng Wang; RV64I-NEXT: add a0, a1, a0 26234527fba9SSergei Barannikov; RV64I-NEXT: srli a1, a0, 4 26244527fba9SSergei Barannikov; RV64I-NEXT: add a0, a0, a1 2625*9122c523SPengcheng Wang; RV64I-NEXT: add a2, a3, a2 2626*9122c523SPengcheng Wang; RV64I-NEXT: and a0, a0, a2 26274527fba9SSergei Barannikov; RV64I-NEXT: slli a1, a0, 8 26284527fba9SSergei Barannikov; RV64I-NEXT: add a0, a0, a1 26294527fba9SSergei Barannikov; RV64I-NEXT: slli a1, a0, 16 26304527fba9SSergei Barannikov; RV64I-NEXT: add a0, a0, a1 26314527fba9SSergei Barannikov; RV64I-NEXT: slli a1, a0, 32 26324527fba9SSergei Barannikov; RV64I-NEXT: add a0, a0, a1 26334527fba9SSergei Barannikov; RV64I-NEXT: srli a0, a0, 56 26344527fba9SSergei Barannikov; RV64I-NEXT: ret 26354527fba9SSergei Barannikov; 26364527fba9SSergei Barannikov; RV32M-LABEL: test_ctpop_i64: 26374527fba9SSergei Barannikov; RV32M: # %bb.0: 26384527fba9SSergei Barannikov; RV32M-NEXT: srli a2, a1, 1 26394527fba9SSergei Barannikov; RV32M-NEXT: lui a3, 349525 2640*9122c523SPengcheng Wang; RV32M-NEXT: lui a4, 209715 2641*9122c523SPengcheng Wang; RV32M-NEXT: lui a5, 61681 2642*9122c523SPengcheng Wang; RV32M-NEXT: srli a6, a0, 1 26434527fba9SSergei Barannikov; RV32M-NEXT: addi a3, a3, 1365 26444527fba9SSergei Barannikov; RV32M-NEXT: and a2, a2, a3 26454527fba9SSergei Barannikov; RV32M-NEXT: and a3, a6, a3 2646*9122c523SPengcheng Wang; RV32M-NEXT: lui a6, 4112 2647*9122c523SPengcheng Wang; RV32M-NEXT: addi a4, a4, 819 2648*9122c523SPengcheng Wang; RV32M-NEXT: addi a5, a5, -241 2649*9122c523SPengcheng Wang; RV32M-NEXT: addi a6, a6, 257 2650*9122c523SPengcheng Wang; RV32M-NEXT: sub a1, a1, a2 26514527fba9SSergei Barannikov; RV32M-NEXT: sub a0, a0, a3 2652*9122c523SPengcheng Wang; RV32M-NEXT: and a2, a1, a4 2653*9122c523SPengcheng Wang; RV32M-NEXT: srli a1, a1, 2 2654*9122c523SPengcheng Wang; RV32M-NEXT: and a3, a0, a4 26554527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 2 2656*9122c523SPengcheng Wang; RV32M-NEXT: and a1, a1, a4 26574527fba9SSergei Barannikov; RV32M-NEXT: and a0, a0, a4 2658*9122c523SPengcheng Wang; RV32M-NEXT: add a1, a2, a1 2659*9122c523SPengcheng Wang; RV32M-NEXT: add a0, a3, a0 2660*9122c523SPengcheng Wang; RV32M-NEXT: srli a2, a1, 4 2661*9122c523SPengcheng Wang; RV32M-NEXT: srli a3, a0, 4 2662*9122c523SPengcheng Wang; RV32M-NEXT: add a1, a1, a2 2663*9122c523SPengcheng Wang; RV32M-NEXT: add a0, a0, a3 2664*9122c523SPengcheng Wang; RV32M-NEXT: and a1, a1, a5 2665*9122c523SPengcheng Wang; RV32M-NEXT: and a0, a0, a5 2666*9122c523SPengcheng Wang; RV32M-NEXT: mul a1, a1, a6 2667*9122c523SPengcheng Wang; RV32M-NEXT: mul a0, a0, a6 2668*9122c523SPengcheng Wang; RV32M-NEXT: srli a1, a1, 24 26694527fba9SSergei Barannikov; RV32M-NEXT: srli a0, a0, 24 26704527fba9SSergei Barannikov; RV32M-NEXT: add a0, a0, a1 26714527fba9SSergei Barannikov; RV32M-NEXT: li a1, 0 26724527fba9SSergei Barannikov; RV32M-NEXT: ret 26734527fba9SSergei Barannikov; 26744527fba9SSergei Barannikov; RV64M-LABEL: test_ctpop_i64: 26754527fba9SSergei Barannikov; RV64M: # %bb.0: 2676*9122c523SPengcheng Wang; RV64M-NEXT: lui a1, 349525 2677*9122c523SPengcheng Wang; RV64M-NEXT: lui a2, 209715 2678*9122c523SPengcheng Wang; RV64M-NEXT: lui a3, 61681 2679*9122c523SPengcheng Wang; RV64M-NEXT: addiw a1, a1, 1365 2680*9122c523SPengcheng Wang; RV64M-NEXT: addiw a2, a2, 819 2681*9122c523SPengcheng Wang; RV64M-NEXT: addiw a3, a3, -241 2682*9122c523SPengcheng Wang; RV64M-NEXT: slli a4, a1, 32 2683*9122c523SPengcheng Wang; RV64M-NEXT: add a1, a1, a4 2684*9122c523SPengcheng Wang; RV64M-NEXT: slli a4, a2, 32 2685*9122c523SPengcheng Wang; RV64M-NEXT: add a2, a2, a4 2686*9122c523SPengcheng Wang; RV64M-NEXT: slli a4, a3, 32 2687*9122c523SPengcheng Wang; RV64M-NEXT: add a3, a3, a4 2688*9122c523SPengcheng Wang; RV64M-NEXT: srli a4, a0, 1 2689*9122c523SPengcheng Wang; RV64M-NEXT: and a1, a4, a1 26904527fba9SSergei Barannikov; RV64M-NEXT: sub a0, a0, a1 2691*9122c523SPengcheng Wang; RV64M-NEXT: and a1, a0, a2 26924527fba9SSergei Barannikov; RV64M-NEXT: srli a0, a0, 2 2693*9122c523SPengcheng Wang; RV64M-NEXT: and a0, a0, a2 2694*9122c523SPengcheng Wang; RV64M-NEXT: lui a2, 4112 2695*9122c523SPengcheng Wang; RV64M-NEXT: addiw a2, a2, 257 2696*9122c523SPengcheng Wang; RV64M-NEXT: add a0, a1, a0 26974527fba9SSergei Barannikov; RV64M-NEXT: srli a1, a0, 4 26984527fba9SSergei Barannikov; RV64M-NEXT: add a0, a0, a1 2699*9122c523SPengcheng Wang; RV64M-NEXT: slli a1, a2, 32 2700*9122c523SPengcheng Wang; RV64M-NEXT: and a0, a0, a3 2701*9122c523SPengcheng Wang; RV64M-NEXT: add a1, a2, a1 27024527fba9SSergei Barannikov; RV64M-NEXT: mul a0, a0, a1 27034527fba9SSergei Barannikov; RV64M-NEXT: srli a0, a0, 56 27044527fba9SSergei Barannikov; RV64M-NEXT: ret 2705d0312a5cSCraig Topper; 2706dcd751b2SCraig Topper; RV32ZBB-LABEL: test_ctpop_i64: 2707dcd751b2SCraig Topper; RV32ZBB: # %bb.0: 2708dcd751b2SCraig Topper; RV32ZBB-NEXT: cpop a1, a1 2709dcd751b2SCraig Topper; RV32ZBB-NEXT: cpop a0, a0 2710dcd751b2SCraig Topper; RV32ZBB-NEXT: add a0, a0, a1 2711dcd751b2SCraig Topper; RV32ZBB-NEXT: li a1, 0 2712dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 2713dcd751b2SCraig Topper; 2714dcd751b2SCraig Topper; RV64ZBB-LABEL: test_ctpop_i64: 2715dcd751b2SCraig Topper; RV64ZBB: # %bb.0: 2716dcd751b2SCraig Topper; RV64ZBB-NEXT: cpop a0, a0 2717dcd751b2SCraig Topper; RV64ZBB-NEXT: ret 2718fc02eeb2SPhilipp Tomsich; 2719fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_ctpop_i64: 2720fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 27214527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: srli a2, a1, 1 27224527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: lui a3, 349525 2723*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: lui a4, 209715 2724*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: srli a5, a0, 1 27254527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: addi a3, a3, 1365 27264527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: and a2, a2, a3 27274527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: and a3, a5, a3 2728*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: lui a5, 61681 2729*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: addi a4, a4, 819 2730*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: addi a5, a5, -241 2731*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: sub a1, a1, a2 27324527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: sub a0, a0, a3 2733*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: and a2, a1, a4 2734*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: srli a1, a1, 2 2735*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: and a3, a0, a4 27364527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: srli a0, a0, 2 2737*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: and a1, a1, a4 27384527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: and a0, a0, a4 2739*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: add a1, a2, a1 2740*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: add a0, a3, a0 2741*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: srli a2, a1, 4 2742*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: srli a3, a0, 4 2743*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: add a1, a1, a2 2744*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: add a0, a0, a3 2745*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: and a1, a1, a5 2746*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: and a0, a0, a5 2747*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: slli a2, a1, 8 2748*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: slli a3, a0, 8 2749*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: add a1, a1, a2 2750*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: add a0, a0, a3 2751*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: slli a2, a1, 16 2752*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: slli a3, a0, 16 2753*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: add a1, a1, a2 2754*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: add a0, a0, a3 2755*9122c523SPengcheng Wang; RV32XTHEADBB-NEXT: srli a1, a1, 24 27564527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: srli a0, a0, 24 27574527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: add a0, a0, a1 27584527fba9SSergei Barannikov; RV32XTHEADBB-NEXT: li a1, 0 2759fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 2760fc02eeb2SPhilipp Tomsich; 2761fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_ctpop_i64: 2762fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 2763*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: lui a1, 349525 2764*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: lui a2, 209715 2765*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: addiw a1, a1, 1365 2766*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: addiw a2, a2, 819 2767*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: slli a3, a1, 32 2768*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: add a1, a1, a3 27694527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: slli a3, a2, 32 27704527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: add a2, a2, a3 2771*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: srli a3, a0, 1 2772*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: and a1, a3, a1 2773*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: lui a3, 61681 2774*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: addiw a3, a3, -241 27754527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: sub a0, a0, a1 2776*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: and a1, a0, a2 27774527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: srli a0, a0, 2 2778*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: and a0, a0, a2 2779*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: slli a2, a3, 32 2780*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: add a0, a1, a0 27814527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: srli a1, a0, 4 27824527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: add a0, a0, a1 2783*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: add a2, a3, a2 2784*9122c523SPengcheng Wang; RV64XTHEADBB-NEXT: and a0, a0, a2 27854527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: slli a1, a0, 8 27864527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: add a0, a0, a1 27874527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: slli a1, a0, 16 27884527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: add a0, a0, a1 27894527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: slli a1, a0, 32 27904527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: add a0, a0, a1 27914527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: srli a0, a0, 56 27924527fba9SSergei Barannikov; RV64XTHEADBB-NEXT: ret 2793dcd751b2SCraig Topper %1 = call i64 @llvm.ctpop.i64(i64 %a) 2794dcd751b2SCraig Topper ret i64 %1 2795dcd751b2SCraig Topper} 2796dcd751b2SCraig Topper 2797c748d2cdSCraig Topperdefine i8 @test_parity_i8(i8 %a) { 2798d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_parity_i8: 2799d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 2800d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 255 2801d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 2802d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 2803d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 2 2804d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 2805d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 1 2806d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 2807d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 1 2808d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 2809c748d2cdSCraig Topper; 2810d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_parity_i8: 2811d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 2812d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 255 2813d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 2814d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 2815d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 2 2816d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 2817d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 1 2818d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 2819d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 1 2820d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 2821c748d2cdSCraig Topper; 2822c748d2cdSCraig Topper; RV32ZBB-LABEL: test_parity_i8: 2823c748d2cdSCraig Topper; RV32ZBB: # %bb.0: 2824c748d2cdSCraig Topper; RV32ZBB-NEXT: andi a0, a0, 255 2825c748d2cdSCraig Topper; RV32ZBB-NEXT: cpop a0, a0 2826c748d2cdSCraig Topper; RV32ZBB-NEXT: andi a0, a0, 1 2827c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 2828c748d2cdSCraig Topper; 2829c748d2cdSCraig Topper; RV64ZBB-LABEL: test_parity_i8: 2830c748d2cdSCraig Topper; RV64ZBB: # %bb.0: 2831c748d2cdSCraig Topper; RV64ZBB-NEXT: andi a0, a0, 255 2832c748d2cdSCraig Topper; RV64ZBB-NEXT: cpopw a0, a0 2833c748d2cdSCraig Topper; RV64ZBB-NEXT: andi a0, a0, 1 2834c748d2cdSCraig Topper; RV64ZBB-NEXT: ret 2835fc02eeb2SPhilipp Tomsich; 2836fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_parity_i8: 2837fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 2838fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: andi a0, a0, 255 2839fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 4 2840fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 2841fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 2 2842fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 2843fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 1 2844fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 2845fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: andi a0, a0, 1 2846fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 2847fc02eeb2SPhilipp Tomsich; 2848fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_parity_i8: 2849fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 2850fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: andi a0, a0, 255 2851fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 4 2852fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 2853fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 2 2854fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 2855fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 1 2856fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 2857fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: andi a0, a0, 1 2858fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 2859c748d2cdSCraig Topper %1 = call i8 @llvm.ctpop.i8(i8 %a) 2860c748d2cdSCraig Topper %2 = and i8 %1, 1 2861c748d2cdSCraig Topper ret i8 %2 2862c748d2cdSCraig Topper} 2863c748d2cdSCraig Topper 2864c748d2cdSCraig Topperdefine i16 @test_parity_i16(i16 %a) { 2865d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_parity_i16: 2866d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 2867d0312a5cSCraig Topper; RV32_NOZBB-NEXT: slli a0, a0, 16 2868d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a0, a0, 16 2869d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 8 2870d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 2871d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 2872d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 2873d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 2 2874d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 2875d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 1 2876d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 2877d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 1 2878d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 2879c748d2cdSCraig Topper; 2880d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_parity_i16: 2881d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 2882d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a0, a0, 48 2883d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a0, a0, 48 2884d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 8 2885d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 2886d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 2887d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 2888d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 2 2889d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 2890d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 1 2891d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 2892d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 1 2893d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 2894c748d2cdSCraig Topper; 2895c748d2cdSCraig Topper; RV32ZBB-LABEL: test_parity_i16: 2896c748d2cdSCraig Topper; RV32ZBB: # %bb.0: 2897c748d2cdSCraig Topper; RV32ZBB-NEXT: zext.h a0, a0 2898c748d2cdSCraig Topper; RV32ZBB-NEXT: cpop a0, a0 2899c748d2cdSCraig Topper; RV32ZBB-NEXT: andi a0, a0, 1 2900c748d2cdSCraig Topper; RV32ZBB-NEXT: ret 2901c748d2cdSCraig Topper; 2902c748d2cdSCraig Topper; RV64ZBB-LABEL: test_parity_i16: 2903c748d2cdSCraig Topper; RV64ZBB: # %bb.0: 2904c748d2cdSCraig Topper; RV64ZBB-NEXT: zext.h a0, a0 2905c748d2cdSCraig Topper; RV64ZBB-NEXT: cpopw a0, a0 2906c748d2cdSCraig Topper; RV64ZBB-NEXT: andi a0, a0, 1 2907c748d2cdSCraig Topper; RV64ZBB-NEXT: ret 2908fc02eeb2SPhilipp Tomsich; 2909fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_parity_i16: 2910fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 2911fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: th.extu a0, a0, 15, 0 2912fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 8 2913fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 2914fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 4 2915fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 2916fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 2 2917fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 2918fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 1 2919fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 2920fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: andi a0, a0, 1 2921fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 2922fc02eeb2SPhilipp Tomsich; 2923fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_parity_i16: 2924fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 2925fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.extu a0, a0, 15, 0 2926fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 8 2927fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 2928fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 4 2929fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 2930fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 2 2931fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 2932fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 1 2933fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 2934fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: andi a0, a0, 1 2935fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 2936c748d2cdSCraig Topper %1 = call i16 @llvm.ctpop.i16(i16 %a) 2937c748d2cdSCraig Topper %2 = and i16 %1, 1 2938c748d2cdSCraig Topper ret i16 %2 2939c748d2cdSCraig Topper} 2940c748d2cdSCraig Topper 2941dcd751b2SCraig Topperdefine i32 @test_parity_i32(i32 %a) { 2942d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_parity_i32: 2943d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 2944d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 16 2945d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 2946d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 8 2947d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 2948d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 2949d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 2950d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 2 2951d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 2952d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 1 2953d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 2954d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 1 2955d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 2956dcd751b2SCraig Topper; 2957d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_parity_i32: 2958d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 2959d0312a5cSCraig Topper; RV64NOZBB-NEXT: slli a1, a0, 32 2960d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a1, 32 2961d0312a5cSCraig Topper; RV64NOZBB-NEXT: srliw a0, a0, 16 2962d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a1, a0 2963d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 8 2964d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 2965d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 2966d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 2967d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 2 2968d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 2969d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 1 2970d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 2971d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 1 2972d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 2973dcd751b2SCraig Topper; 2974dcd751b2SCraig Topper; RV32ZBB-LABEL: test_parity_i32: 2975dcd751b2SCraig Topper; RV32ZBB: # %bb.0: 2976dcd751b2SCraig Topper; RV32ZBB-NEXT: cpop a0, a0 2977dcd751b2SCraig Topper; RV32ZBB-NEXT: andi a0, a0, 1 2978dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 2979dcd751b2SCraig Topper; 2980dcd751b2SCraig Topper; RV64ZBB-LABEL: test_parity_i32: 2981dcd751b2SCraig Topper; RV64ZBB: # %bb.0: 2982dcd751b2SCraig Topper; RV64ZBB-NEXT: cpopw a0, a0 2983dcd751b2SCraig Topper; RV64ZBB-NEXT: andi a0, a0, 1 2984dcd751b2SCraig Topper; RV64ZBB-NEXT: ret 2985fc02eeb2SPhilipp Tomsich; 2986fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_parity_i32: 2987fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 2988fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 16 2989fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 2990fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 8 2991fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 2992fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 4 2993fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 2994fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 2 2995fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 2996fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 1 2997fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 2998fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: andi a0, a0, 1 2999fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 3000fc02eeb2SPhilipp Tomsich; 3001fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_parity_i32: 3002fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 3003fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: th.extu a1, a0, 31, 0 3004fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srliw a0, a0, 16 3005fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a1, a0 3006fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 8 3007fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 3008fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 4 3009fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 3010fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 2 3011fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 3012fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 1 3013fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 3014fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: andi a0, a0, 1 3015fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 3016dcd751b2SCraig Topper %1 = call i32 @llvm.ctpop.i32(i32 %a) 3017dcd751b2SCraig Topper %2 = and i32 %1, 1 3018dcd751b2SCraig Topper ret i32 %2 3019dcd751b2SCraig Topper} 3020dcd751b2SCraig Topper 3021dcd751b2SCraig Topperdefine i64 @test_parity_i64(i64 %a) { 3022d0312a5cSCraig Topper; RV32_NOZBB-LABEL: test_parity_i64: 3023d0312a5cSCraig Topper; RV32_NOZBB: # %bb.0: 3024d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 3025d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 16 3026d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 3027d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 8 3028d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 3029d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 4 3030d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 3031d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 2 3032d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 3033d0312a5cSCraig Topper; RV32_NOZBB-NEXT: srli a1, a0, 1 3034d0312a5cSCraig Topper; RV32_NOZBB-NEXT: xor a0, a0, a1 3035d0312a5cSCraig Topper; RV32_NOZBB-NEXT: andi a0, a0, 1 3036d0312a5cSCraig Topper; RV32_NOZBB-NEXT: li a1, 0 3037d0312a5cSCraig Topper; RV32_NOZBB-NEXT: ret 3038dcd751b2SCraig Topper; 3039d0312a5cSCraig Topper; RV64NOZBB-LABEL: test_parity_i64: 3040d0312a5cSCraig Topper; RV64NOZBB: # %bb.0: 3041d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 32 3042d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 3043d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 16 3044d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 3045d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 8 3046d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 3047d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 4 3048d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 3049d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 2 3050d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 3051d0312a5cSCraig Topper; RV64NOZBB-NEXT: srli a1, a0, 1 3052d0312a5cSCraig Topper; RV64NOZBB-NEXT: xor a0, a0, a1 3053d0312a5cSCraig Topper; RV64NOZBB-NEXT: andi a0, a0, 1 3054d0312a5cSCraig Topper; RV64NOZBB-NEXT: ret 3055dcd751b2SCraig Topper; 3056dcd751b2SCraig Topper; RV32ZBB-LABEL: test_parity_i64: 3057dcd751b2SCraig Topper; RV32ZBB: # %bb.0: 3058dcd751b2SCraig Topper; RV32ZBB-NEXT: xor a0, a0, a1 3059dcd751b2SCraig Topper; RV32ZBB-NEXT: cpop a0, a0 3060dcd751b2SCraig Topper; RV32ZBB-NEXT: andi a0, a0, 1 3061dcd751b2SCraig Topper; RV32ZBB-NEXT: li a1, 0 3062dcd751b2SCraig Topper; RV32ZBB-NEXT: ret 3063dcd751b2SCraig Topper; 3064dcd751b2SCraig Topper; RV64ZBB-LABEL: test_parity_i64: 3065dcd751b2SCraig Topper; RV64ZBB: # %bb.0: 3066dcd751b2SCraig Topper; RV64ZBB-NEXT: cpop a0, a0 3067dcd751b2SCraig Topper; RV64ZBB-NEXT: andi a0, a0, 1 3068dcd751b2SCraig Topper; RV64ZBB-NEXT: ret 3069fc02eeb2SPhilipp Tomsich; 3070fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-LABEL: test_parity_i64: 3071fc02eeb2SPhilipp Tomsich; RV32XTHEADBB: # %bb.0: 3072fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 3073fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 16 3074fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 3075fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 8 3076fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 3077fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 4 3078fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 3079fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 2 3080fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 3081fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: srli a1, a0, 1 3082fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: xor a0, a0, a1 3083fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: andi a0, a0, 1 3084fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: li a1, 0 3085fc02eeb2SPhilipp Tomsich; RV32XTHEADBB-NEXT: ret 3086fc02eeb2SPhilipp Tomsich; 3087fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-LABEL: test_parity_i64: 3088fc02eeb2SPhilipp Tomsich; RV64XTHEADBB: # %bb.0: 3089fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 32 3090fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 3091fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 16 3092fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 3093fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 8 3094fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 3095fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 4 3096fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 3097fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 2 3098fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 3099fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: srli a1, a0, 1 3100fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: xor a0, a0, a1 3101fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: andi a0, a0, 1 3102fc02eeb2SPhilipp Tomsich; RV64XTHEADBB-NEXT: ret 3103dcd751b2SCraig Topper %1 = call i64 @llvm.ctpop.i64(i64 %a) 3104dcd751b2SCraig Topper %2 = and i64 %1, 1 3105dcd751b2SCraig Topper ret i64 %2 3106dcd751b2SCraig Topper} 3107