xref: /llvm-project/llvm/test/CodeGen/RISCV/ctlz-cttz-ctpop.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
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