xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/bmi-intrinsics-fast-isel.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -fast-isel -mtriple=i686-unknown-unknown -mattr=+bmi | FileCheck %s --check-prefix=X32
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -fast-isel -mtriple=x86_64-unknown-unknown -mattr=+bmi | FileCheck %s --check-prefix=X64
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/bmi-builtins.c
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker;
8*9880d681SAndroid Build Coastguard Worker; AMD Intrinsics
9*9880d681SAndroid Build Coastguard Worker;
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdefine i16 @test__tzcnt_u16(i16 %a0) {
12*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__tzcnt_u16:
13*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
14*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
15*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movzwl %ax, %ecx
16*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    cmpl $0, %ecx
17*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    jne .LBB0_1
18*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  # BB#2:
19*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movw $16, %ax
20*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
21*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  .LBB0_1:
22*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    tzcntw %ax, %ax
23*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
24*9880d681SAndroid Build Coastguard Worker;
25*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__tzcnt_u16:
26*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
27*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movw $16, %cx
28*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movzwl %di, %edx
29*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    tzcntw %dx, %ax
30*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    cmpl $0, %edx
31*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    cmovew %cx, %ax
32*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
33*9880d681SAndroid Build Coastguard Worker  %zext = zext i16 %a0 to i32
34*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %zext, 0
35*9880d681SAndroid Build Coastguard Worker  %cttz = call i16 @llvm.cttz.i16(i16 %a0, i1 true)
36*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, i16 %cttz, i16 16
37*9880d681SAndroid Build Coastguard Worker  ret i16 %res
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerdefine i32 @test__andn_u32(i32 %a0, i32 %a1) {
41*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__andn_u32:
42*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
43*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
44*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    xorl $-1, %eax
45*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
46*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
47*9880d681SAndroid Build Coastguard Worker;
48*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__andn_u32:
49*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
50*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    xorl $-1, %edi
51*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    andl %esi, %edi
52*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movl %edi, %eax
53*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
54*9880d681SAndroid Build Coastguard Worker  %xor = xor i32 %a0, -1
55*9880d681SAndroid Build Coastguard Worker  %res = and i32 %xor, %a1
56*9880d681SAndroid Build Coastguard Worker  ret i32 %res
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine i32 @test__bextr_u32(i32 %a0, i32 %a1) {
60*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__bextr_u32:
61*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
62*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
63*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    bextrl %eax, {{[0-9]+}}(%esp), %eax
64*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
65*9880d681SAndroid Build Coastguard Worker;
66*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__bextr_u32:
67*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
68*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    bextrl %esi, %edi, %eax
69*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
70*9880d681SAndroid Build Coastguard Worker  %res = call i32 @llvm.x86.bmi.bextr.32(i32 %a0, i32 %a1)
71*9880d681SAndroid Build Coastguard Worker  ret i32 %res
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blsi_u32(i32 %a0) {
75*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blsi_u32:
76*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
77*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
78*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    xorl %eax, %eax
79*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    subl %ecx, %eax
80*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    andl %ecx, %eax
81*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
82*9880d681SAndroid Build Coastguard Worker;
83*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blsi_u32:
84*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
85*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    xorl %eax, %eax
86*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    subl %edi, %eax
87*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    andl %edi, %eax
88*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
89*9880d681SAndroid Build Coastguard Worker  %neg = sub i32 0, %a0
90*9880d681SAndroid Build Coastguard Worker  %res = and i32 %a0, %neg
91*9880d681SAndroid Build Coastguard Worker  ret i32 %res
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blsmsk_u32(i32 %a0) {
95*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blsmsk_u32:
96*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
97*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
98*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl %ecx, %eax
99*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    subl $1, %eax
100*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    xorl %ecx, %eax
101*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
102*9880d681SAndroid Build Coastguard Worker;
103*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blsmsk_u32:
104*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
105*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movl %edi, %eax
106*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    subl $1, %eax
107*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    xorl %edi, %eax
108*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
109*9880d681SAndroid Build Coastguard Worker  %dec = sub i32 %a0, 1
110*9880d681SAndroid Build Coastguard Worker  %res = xor i32 %a0, %dec
111*9880d681SAndroid Build Coastguard Worker  ret i32 %res
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdefine i32 @test__blsr_u32(i32 %a0) {
115*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__blsr_u32:
116*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
117*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
118*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl %ecx, %eax
119*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    subl $1, %eax
120*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    andl %ecx, %eax
121*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
122*9880d681SAndroid Build Coastguard Worker;
123*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__blsr_u32:
124*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
125*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movl %edi, %eax
126*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    subl $1, %eax
127*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    andl %edi, %eax
128*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
129*9880d681SAndroid Build Coastguard Worker  %dec = sub i32 %a0, 1
130*9880d681SAndroid Build Coastguard Worker  %res = and i32 %a0, %dec
131*9880d681SAndroid Build Coastguard Worker  ret i32 %res
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdefine i32 @test__tzcnt_u32(i32 %a0) {
135*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test__tzcnt_u32:
136*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
137*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
138*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    cmpl $0, %eax
139*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    jne .LBB6_1
140*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  # BB#2:
141*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl $32, %eax
142*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
143*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  .LBB6_1:
144*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    tzcntl %eax, %eax
145*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
146*9880d681SAndroid Build Coastguard Worker;
147*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test__tzcnt_u32:
148*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
149*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movl $32, %ecx
150*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    tzcntl %edi, %eax
151*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    cmovbl %ecx, %eax
152*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
153*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %a0, 0
154*9880d681SAndroid Build Coastguard Worker  %cttz = call i32 @llvm.cttz.i32(i32 %a0, i1 true)
155*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, i32 %cttz, i32 32
156*9880d681SAndroid Build Coastguard Worker  ret i32 %res
157*9880d681SAndroid Build Coastguard Worker}
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker;
160*9880d681SAndroid Build Coastguard Worker; Intel intrinsics
161*9880d681SAndroid Build Coastguard Worker;
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerdefine i16 @test_tzcnt_u16(i16 %a0) {
164*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_tzcnt_u16:
165*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
166*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
167*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movzwl %ax, %ecx
168*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    cmpl $0, %ecx
169*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    jne .LBB7_1
170*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  # BB#2:
171*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movw $16, %ax
172*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
173*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  .LBB7_1:
174*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    tzcntw %ax, %ax
175*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
176*9880d681SAndroid Build Coastguard Worker;
177*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_tzcnt_u16:
178*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
179*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movw $16, %cx
180*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movzwl %di, %edx
181*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    tzcntw %dx, %ax
182*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    cmpl $0, %edx
183*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    cmovew %cx, %ax
184*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
185*9880d681SAndroid Build Coastguard Worker  %zext = zext i16 %a0 to i32
186*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %zext, 0
187*9880d681SAndroid Build Coastguard Worker  %cttz = call i16 @llvm.cttz.i16(i16 %a0, i1 true)
188*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, i16 %cttz, i16 16
189*9880d681SAndroid Build Coastguard Worker  ret i16 %res
190*9880d681SAndroid Build Coastguard Worker}
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerdefine i32 @test_andn_u32(i32 %a0, i32 %a1) {
193*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_andn_u32:
194*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
195*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
196*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    xorl $-1, %eax
197*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
198*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
199*9880d681SAndroid Build Coastguard Worker;
200*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_andn_u32:
201*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
202*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    xorl $-1, %edi
203*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    andl %esi, %edi
204*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movl %edi, %eax
205*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
206*9880d681SAndroid Build Coastguard Worker  %xor = xor i32 %a0, -1
207*9880d681SAndroid Build Coastguard Worker  %res = and i32 %xor, %a1
208*9880d681SAndroid Build Coastguard Worker  ret i32 %res
209*9880d681SAndroid Build Coastguard Worker}
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Workerdefine i32 @test_bextr_u32(i32 %a0, i32 %a1, i32 %a2) {
212*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_bextr_u32:
213*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
214*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
215*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
216*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    andl $255, %ecx
217*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    andl $255, %eax
218*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    shll $8, %eax
219*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    orl %ecx, %eax
220*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    bextrl %eax, {{[0-9]+}}(%esp), %eax
221*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
222*9880d681SAndroid Build Coastguard Worker;
223*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_bextr_u32:
224*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
225*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    andl $255, %esi
226*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    andl $255, %edx
227*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    shll $8, %edx
228*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    orl %esi, %edx
229*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    bextrl %edx, %edi, %eax
230*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
231*9880d681SAndroid Build Coastguard Worker  %and1 = and i32 %a1, 255
232*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %a2, 255
233*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %and2, 8
234*9880d681SAndroid Build Coastguard Worker  %or = or i32 %and1, %shl
235*9880d681SAndroid Build Coastguard Worker  %res = call i32 @llvm.x86.bmi.bextr.32(i32 %a0, i32 %or)
236*9880d681SAndroid Build Coastguard Worker  ret i32 %res
237*9880d681SAndroid Build Coastguard Worker}
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerdefine i32 @test_blsi_u32(i32 %a0) {
240*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_blsi_u32:
241*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
242*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
243*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    xorl %eax, %eax
244*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    subl %ecx, %eax
245*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    andl %ecx, %eax
246*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
247*9880d681SAndroid Build Coastguard Worker;
248*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_blsi_u32:
249*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
250*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    xorl %eax, %eax
251*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    subl %edi, %eax
252*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    andl %edi, %eax
253*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
254*9880d681SAndroid Build Coastguard Worker  %neg = sub i32 0, %a0
255*9880d681SAndroid Build Coastguard Worker  %res = and i32 %a0, %neg
256*9880d681SAndroid Build Coastguard Worker  ret i32 %res
257*9880d681SAndroid Build Coastguard Worker}
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerdefine i32 @test_blsmsk_u32(i32 %a0) {
260*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_blsmsk_u32:
261*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
262*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
263*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl %ecx, %eax
264*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    subl $1, %eax
265*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    xorl %ecx, %eax
266*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
267*9880d681SAndroid Build Coastguard Worker;
268*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_blsmsk_u32:
269*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
270*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movl %edi, %eax
271*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    subl $1, %eax
272*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    xorl %edi, %eax
273*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
274*9880d681SAndroid Build Coastguard Worker  %dec = sub i32 %a0, 1
275*9880d681SAndroid Build Coastguard Worker  %res = xor i32 %a0, %dec
276*9880d681SAndroid Build Coastguard Worker  ret i32 %res
277*9880d681SAndroid Build Coastguard Worker}
278*9880d681SAndroid Build Coastguard Worker
279*9880d681SAndroid Build Coastguard Workerdefine i32 @test_blsr_u32(i32 %a0) {
280*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_blsr_u32:
281*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
282*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
283*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl %ecx, %eax
284*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    subl $1, %eax
285*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    andl %ecx, %eax
286*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
287*9880d681SAndroid Build Coastguard Worker;
288*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_blsr_u32:
289*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
290*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movl %edi, %eax
291*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    subl $1, %eax
292*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    andl %edi, %eax
293*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
294*9880d681SAndroid Build Coastguard Worker  %dec = sub i32 %a0, 1
295*9880d681SAndroid Build Coastguard Worker  %res = and i32 %a0, %dec
296*9880d681SAndroid Build Coastguard Worker  ret i32 %res
297*9880d681SAndroid Build Coastguard Worker}
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Workerdefine i32 @test_tzcnt_u32(i32 %a0) {
300*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_tzcnt_u32:
301*9880d681SAndroid Build Coastguard Worker; X32:       # BB#0:
302*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
303*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    cmpl $0, %eax
304*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    jne .LBB13_1
305*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  # BB#2:
306*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    movl $32, %eax
307*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
308*9880d681SAndroid Build Coastguard Worker; X32-NEXT:  .LBB13_1:
309*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    tzcntl %eax, %eax
310*9880d681SAndroid Build Coastguard Worker; X32-NEXT:    retl
311*9880d681SAndroid Build Coastguard Worker;
312*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_tzcnt_u32:
313*9880d681SAndroid Build Coastguard Worker; X64:       # BB#0:
314*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    movl $32, %ecx
315*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    tzcntl %edi, %eax
316*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    cmovbl %ecx, %eax
317*9880d681SAndroid Build Coastguard Worker; X64-NEXT:    retq
318*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %a0, 0
319*9880d681SAndroid Build Coastguard Worker  %cttz = call i32 @llvm.cttz.i32(i32 %a0, i1 true)
320*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cmp, i32 %cttz, i32 32
321*9880d681SAndroid Build Coastguard Worker  ret i32 %res
322*9880d681SAndroid Build Coastguard Worker}
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.cttz.i16(i16, i1)
325*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.cttz.i32(i32, i1)
326*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.bmi.bextr.32(i32, i32)
327