[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / extract-bits.ll
blobedb603f87d0eddb3a4d97955d05f4fb7ecff5945
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=-bmi,-tbm,-bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=CHECK,X86,NOBMI,X86-NOBMI
3 ; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,-tbm,-bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=CHECK,X86,BMI1,X86-BMI1,BMI1NOTBM,X86-BMI1NOTBM
4 ; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,+tbm,-bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=CHECK,X86,BMI1,X86-BMI1,BMI1TBM,X86-BMI1TBM
5 ; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,+tbm,+bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=CHECK,X86,BMI1,X86-BMI1,BMI1BMI2,X86-BMI1BMI2,BMI1TBM,X86-BMI1TBM,BMI1TBMBMI2,X86-BMI1TBMBMI2
6 ; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,-tbm,+bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=CHECK,X86,BMI1,X86-BMI1,BMI1BMI2,X86-BMI1BMI2,BMI1NOTBMBMI2,X86-BMI1NOTBMBMI2
7 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=-bmi,-tbm,-bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=CHECK,X64,NOBMI,X64-NOBMI
8 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,-tbm,-bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=CHECK,X64,BMI1,X64-BMI1,BMI1NOTBM,X64-BMI1NOTBM
9 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,+tbm,-bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=CHECK,X64,BMI1,X64-BMI1,BMI1TBM,X64-BMI1TBM
10 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,+tbm,+bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=CHECK,X64,BMI1,X64-BMI1,BMI1BMI2,X64-BMI1BMI2,BMI1TBM,X64-BMI1TBM,BMI1TBMBMI2,X64-BMI1TBMBMI2
11 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,-tbm,+bmi2,+fast-bextr < %s | FileCheck %s --check-prefixes=CHECK,X64,BMI1,X64-BMI1,BMI1BMI2,X64-BMI1BMI2,BMI1NOTBMBMI2,X64-BMI1NOTBMBMI2
13 ; *Please* keep in sync with test/CodeGen/AArch64/extract-bits.ll
15 ; https://bugs.llvm.org/show_bug.cgi?id=36419
16 ; https://bugs.llvm.org/show_bug.cgi?id=37603
17 ; https://bugs.llvm.org/show_bug.cgi?id=37610
19 ; Patterns:
20 ;   a) (x >> start) &  (1 << nbits) - 1
21 ;   b) (x >> start) & ~(-1 << nbits)
22 ;   c) (x >> start) &  (-1 >> (32 - y))
23 ;   d) (x >> start) << (32 - y) >> (32 - y)
24 ; are equivalent.
26 declare void @use32(i32)
27 declare void @use64(i64)
29 ; ---------------------------------------------------------------------------- ;
30 ; Pattern a. 32-bit
31 ; ---------------------------------------------------------------------------- ;
33 define i32 @bextr32_a0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
34 ; X86-NOBMI-LABEL: bextr32_a0:
35 ; X86-NOBMI:       # %bb.0:
36 ; X86-NOBMI-NEXT:    pushl %esi
37 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
38 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
39 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
40 ; X86-NOBMI-NEXT:    shrl %cl, %esi
41 ; X86-NOBMI-NEXT:    movl $1, %eax
42 ; X86-NOBMI-NEXT:    movl %edx, %ecx
43 ; X86-NOBMI-NEXT:    shll %cl, %eax
44 ; X86-NOBMI-NEXT:    decl %eax
45 ; X86-NOBMI-NEXT:    andl %esi, %eax
46 ; X86-NOBMI-NEXT:    popl %esi
47 ; X86-NOBMI-NEXT:    retl
49 ; X86-BMI1NOTBM-LABEL: bextr32_a0:
50 ; X86-BMI1NOTBM:       # %bb.0:
51 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
52 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
53 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
54 ; X86-BMI1NOTBM-NEXT:    orl %eax, %ecx
55 ; X86-BMI1NOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax
56 ; X86-BMI1NOTBM-NEXT:    retl
58 ; X86-BMI1BMI2-LABEL: bextr32_a0:
59 ; X86-BMI1BMI2:       # %bb.0:
60 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
61 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
62 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx
63 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
64 ; X86-BMI1BMI2-NEXT:    retl
66 ; X64-NOBMI-LABEL: bextr32_a0:
67 ; X64-NOBMI:       # %bb.0:
68 ; X64-NOBMI-NEXT:    movl %esi, %ecx
69 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
70 ; X64-NOBMI-NEXT:    shrl %cl, %edi
71 ; X64-NOBMI-NEXT:    movl $1, %eax
72 ; X64-NOBMI-NEXT:    movl %edx, %ecx
73 ; X64-NOBMI-NEXT:    shll %cl, %eax
74 ; X64-NOBMI-NEXT:    decl %eax
75 ; X64-NOBMI-NEXT:    andl %edi, %eax
76 ; X64-NOBMI-NEXT:    retq
78 ; X64-BMI1NOTBM-LABEL: bextr32_a0:
79 ; X64-BMI1NOTBM:       # %bb.0:
80 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
81 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
82 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
83 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %eax
84 ; X64-BMI1NOTBM-NEXT:    retq
86 ; X64-BMI1BMI2-LABEL: bextr32_a0:
87 ; X64-BMI1BMI2:       # %bb.0:
88 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %eax
89 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
90 ; X64-BMI1BMI2-NEXT:    retq
91   %shifted = lshr i32 %val, %numskipbits
92   %onebit = shl i32 1, %numlowbits
93   %mask = add nsw i32 %onebit, -1
94   %masked = and i32 %mask, %shifted
95   ret i32 %masked
98 define i32 @bextr32_a0_arithmetic(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
99 ; X86-NOBMI-LABEL: bextr32_a0_arithmetic:
100 ; X86-NOBMI:       # %bb.0:
101 ; X86-NOBMI-NEXT:    pushl %esi
102 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
103 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
104 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
105 ; X86-NOBMI-NEXT:    sarl %cl, %esi
106 ; X86-NOBMI-NEXT:    movl $1, %eax
107 ; X86-NOBMI-NEXT:    movl %edx, %ecx
108 ; X86-NOBMI-NEXT:    shll %cl, %eax
109 ; X86-NOBMI-NEXT:    decl %eax
110 ; X86-NOBMI-NEXT:    andl %esi, %eax
111 ; X86-NOBMI-NEXT:    popl %esi
112 ; X86-NOBMI-NEXT:    retl
114 ; X86-BMI1NOTBM-LABEL: bextr32_a0_arithmetic:
115 ; X86-BMI1NOTBM:       # %bb.0:
116 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
117 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
118 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edx
119 ; X86-BMI1NOTBM-NEXT:    sarl %cl, %edx
120 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
121 ; X86-BMI1NOTBM-NEXT:    bextrl %eax, %edx, %eax
122 ; X86-BMI1NOTBM-NEXT:    retl
124 ; X86-BMI1BMI2-LABEL: bextr32_a0_arithmetic:
125 ; X86-BMI1BMI2:       # %bb.0:
126 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
127 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
128 ; X86-BMI1BMI2-NEXT:    sarxl %ecx, {{[0-9]+}}(%esp), %ecx
129 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
130 ; X86-BMI1BMI2-NEXT:    retl
132 ; X64-NOBMI-LABEL: bextr32_a0_arithmetic:
133 ; X64-NOBMI:       # %bb.0:
134 ; X64-NOBMI-NEXT:    movl %esi, %ecx
135 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
136 ; X64-NOBMI-NEXT:    sarl %cl, %edi
137 ; X64-NOBMI-NEXT:    movl $1, %eax
138 ; X64-NOBMI-NEXT:    movl %edx, %ecx
139 ; X64-NOBMI-NEXT:    shll %cl, %eax
140 ; X64-NOBMI-NEXT:    decl %eax
141 ; X64-NOBMI-NEXT:    andl %edi, %eax
142 ; X64-NOBMI-NEXT:    retq
144 ; X64-BMI1NOTBM-LABEL: bextr32_a0_arithmetic:
145 ; X64-BMI1NOTBM:       # %bb.0:
146 ; X64-BMI1NOTBM-NEXT:    movl %esi, %ecx
147 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
148 ; X64-BMI1NOTBM-NEXT:    sarl %cl, %edi
149 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
150 ; X64-BMI1NOTBM-NEXT:    bextrl %edx, %edi, %eax
151 ; X64-BMI1NOTBM-NEXT:    retq
153 ; X64-BMI1BMI2-LABEL: bextr32_a0_arithmetic:
154 ; X64-BMI1BMI2:       # %bb.0:
155 ; X64-BMI1BMI2-NEXT:    sarxl %esi, %edi, %eax
156 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
157 ; X64-BMI1BMI2-NEXT:    retq
158   %shifted = ashr i32 %val, %numskipbits
159   %onebit = shl i32 1, %numlowbits
160   %mask = add nsw i32 %onebit, -1
161   %masked = and i32 %mask, %shifted
162   ret i32 %masked
165 define i32 @bextr32_a1_indexzext(i32 %val, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {
166 ; X86-NOBMI-LABEL: bextr32_a1_indexzext:
167 ; X86-NOBMI:       # %bb.0:
168 ; X86-NOBMI-NEXT:    pushl %esi
169 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
170 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
171 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
172 ; X86-NOBMI-NEXT:    shrl %cl, %esi
173 ; X86-NOBMI-NEXT:    movl $1, %eax
174 ; X86-NOBMI-NEXT:    movl %edx, %ecx
175 ; X86-NOBMI-NEXT:    shll %cl, %eax
176 ; X86-NOBMI-NEXT:    decl %eax
177 ; X86-NOBMI-NEXT:    andl %esi, %eax
178 ; X86-NOBMI-NEXT:    popl %esi
179 ; X86-NOBMI-NEXT:    retl
181 ; X86-BMI1NOTBM-LABEL: bextr32_a1_indexzext:
182 ; X86-BMI1NOTBM:       # %bb.0:
183 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
184 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
185 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
186 ; X86-BMI1NOTBM-NEXT:    orl %eax, %ecx
187 ; X86-BMI1NOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax
188 ; X86-BMI1NOTBM-NEXT:    retl
190 ; X86-BMI1BMI2-LABEL: bextr32_a1_indexzext:
191 ; X86-BMI1BMI2:       # %bb.0:
192 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
193 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
194 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx
195 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
196 ; X86-BMI1BMI2-NEXT:    retl
198 ; X64-NOBMI-LABEL: bextr32_a1_indexzext:
199 ; X64-NOBMI:       # %bb.0:
200 ; X64-NOBMI-NEXT:    movl %esi, %ecx
201 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
202 ; X64-NOBMI-NEXT:    shrl %cl, %edi
203 ; X64-NOBMI-NEXT:    movl $1, %eax
204 ; X64-NOBMI-NEXT:    movl %edx, %ecx
205 ; X64-NOBMI-NEXT:    shll %cl, %eax
206 ; X64-NOBMI-NEXT:    decl %eax
207 ; X64-NOBMI-NEXT:    andl %edi, %eax
208 ; X64-NOBMI-NEXT:    retq
210 ; X64-BMI1NOTBM-LABEL: bextr32_a1_indexzext:
211 ; X64-BMI1NOTBM:       # %bb.0:
212 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
213 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
214 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
215 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %eax
216 ; X64-BMI1NOTBM-NEXT:    retq
218 ; X64-BMI1BMI2-LABEL: bextr32_a1_indexzext:
219 ; X64-BMI1BMI2:       # %bb.0:
220 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %eax
221 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
222 ; X64-BMI1BMI2-NEXT:    retq
223   %skip = zext i8 %numskipbits to i32
224   %shifted = lshr i32 %val, %skip
225   %conv = zext i8 %numlowbits to i32
226   %onebit = shl i32 1, %conv
227   %mask = add nsw i32 %onebit, -1
228   %masked = and i32 %mask, %shifted
229   ret i32 %masked
232 define i32 @bextr32_a2_load(i32* %w, i32 %numskipbits, i32 %numlowbits) nounwind {
233 ; X86-NOBMI-LABEL: bextr32_a2_load:
234 ; X86-NOBMI:       # %bb.0:
235 ; X86-NOBMI-NEXT:    pushl %esi
236 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
237 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
238 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
239 ; X86-NOBMI-NEXT:    movl (%eax), %esi
240 ; X86-NOBMI-NEXT:    shrl %cl, %esi
241 ; X86-NOBMI-NEXT:    movl $1, %eax
242 ; X86-NOBMI-NEXT:    movl %edx, %ecx
243 ; X86-NOBMI-NEXT:    shll %cl, %eax
244 ; X86-NOBMI-NEXT:    decl %eax
245 ; X86-NOBMI-NEXT:    andl %esi, %eax
246 ; X86-NOBMI-NEXT:    popl %esi
247 ; X86-NOBMI-NEXT:    retl
249 ; X86-BMI1NOTBM-LABEL: bextr32_a2_load:
250 ; X86-BMI1NOTBM:       # %bb.0:
251 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
252 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
253 ; X86-BMI1NOTBM-NEXT:    shll $8, %ecx
254 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
255 ; X86-BMI1NOTBM-NEXT:    orl %ecx, %edx
256 ; X86-BMI1NOTBM-NEXT:    bextrl %edx, (%eax), %eax
257 ; X86-BMI1NOTBM-NEXT:    retl
259 ; X86-BMI1BMI2-LABEL: bextr32_a2_load:
260 ; X86-BMI1BMI2:       # %bb.0:
261 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
262 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
263 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %dl
264 ; X86-BMI1BMI2-NEXT:    shrxl %edx, (%ecx), %ecx
265 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
266 ; X86-BMI1BMI2-NEXT:    retl
268 ; X64-NOBMI-LABEL: bextr32_a2_load:
269 ; X64-NOBMI:       # %bb.0:
270 ; X64-NOBMI-NEXT:    movl %esi, %ecx
271 ; X64-NOBMI-NEXT:    movl (%rdi), %esi
272 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
273 ; X64-NOBMI-NEXT:    shrl %cl, %esi
274 ; X64-NOBMI-NEXT:    movl $1, %eax
275 ; X64-NOBMI-NEXT:    movl %edx, %ecx
276 ; X64-NOBMI-NEXT:    shll %cl, %eax
277 ; X64-NOBMI-NEXT:    decl %eax
278 ; X64-NOBMI-NEXT:    andl %esi, %eax
279 ; X64-NOBMI-NEXT:    retq
281 ; X64-BMI1NOTBM-LABEL: bextr32_a2_load:
282 ; X64-BMI1NOTBM:       # %bb.0:
283 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
284 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
285 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
286 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, (%rdi), %eax
287 ; X64-BMI1NOTBM-NEXT:    retq
289 ; X64-BMI1BMI2-LABEL: bextr32_a2_load:
290 ; X64-BMI1BMI2:       # %bb.0:
291 ; X64-BMI1BMI2-NEXT:    shrxl %esi, (%rdi), %eax
292 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
293 ; X64-BMI1BMI2-NEXT:    retq
294   %val = load i32, i32* %w
295   %shifted = lshr i32 %val, %numskipbits
296   %onebit = shl i32 1, %numlowbits
297   %mask = add nsw i32 %onebit, -1
298   %masked = and i32 %mask, %shifted
299   ret i32 %masked
302 define i32 @bextr32_a3_load_indexzext(i32* %w, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {
303 ; X86-NOBMI-LABEL: bextr32_a3_load_indexzext:
304 ; X86-NOBMI:       # %bb.0:
305 ; X86-NOBMI-NEXT:    pushl %esi
306 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
307 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
308 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
309 ; X86-NOBMI-NEXT:    movl (%eax), %esi
310 ; X86-NOBMI-NEXT:    shrl %cl, %esi
311 ; X86-NOBMI-NEXT:    movl $1, %eax
312 ; X86-NOBMI-NEXT:    movl %edx, %ecx
313 ; X86-NOBMI-NEXT:    shll %cl, %eax
314 ; X86-NOBMI-NEXT:    decl %eax
315 ; X86-NOBMI-NEXT:    andl %esi, %eax
316 ; X86-NOBMI-NEXT:    popl %esi
317 ; X86-NOBMI-NEXT:    retl
319 ; X86-BMI1NOTBM-LABEL: bextr32_a3_load_indexzext:
320 ; X86-BMI1NOTBM:       # %bb.0:
321 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
322 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
323 ; X86-BMI1NOTBM-NEXT:    shll $8, %ecx
324 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
325 ; X86-BMI1NOTBM-NEXT:    orl %ecx, %edx
326 ; X86-BMI1NOTBM-NEXT:    bextrl %edx, (%eax), %eax
327 ; X86-BMI1NOTBM-NEXT:    retl
329 ; X86-BMI1BMI2-LABEL: bextr32_a3_load_indexzext:
330 ; X86-BMI1BMI2:       # %bb.0:
331 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
332 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
333 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %dl
334 ; X86-BMI1BMI2-NEXT:    shrxl %edx, (%ecx), %ecx
335 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
336 ; X86-BMI1BMI2-NEXT:    retl
338 ; X64-NOBMI-LABEL: bextr32_a3_load_indexzext:
339 ; X64-NOBMI:       # %bb.0:
340 ; X64-NOBMI-NEXT:    movl %esi, %ecx
341 ; X64-NOBMI-NEXT:    movl (%rdi), %esi
342 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
343 ; X64-NOBMI-NEXT:    shrl %cl, %esi
344 ; X64-NOBMI-NEXT:    movl $1, %eax
345 ; X64-NOBMI-NEXT:    movl %edx, %ecx
346 ; X64-NOBMI-NEXT:    shll %cl, %eax
347 ; X64-NOBMI-NEXT:    decl %eax
348 ; X64-NOBMI-NEXT:    andl %esi, %eax
349 ; X64-NOBMI-NEXT:    retq
351 ; X64-BMI1NOTBM-LABEL: bextr32_a3_load_indexzext:
352 ; X64-BMI1NOTBM:       # %bb.0:
353 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
354 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
355 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
356 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, (%rdi), %eax
357 ; X64-BMI1NOTBM-NEXT:    retq
359 ; X64-BMI1BMI2-LABEL: bextr32_a3_load_indexzext:
360 ; X64-BMI1BMI2:       # %bb.0:
361 ; X64-BMI1BMI2-NEXT:    shrxl %esi, (%rdi), %eax
362 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
363 ; X64-BMI1BMI2-NEXT:    retq
364   %val = load i32, i32* %w
365   %skip = zext i8 %numskipbits to i32
366   %shifted = lshr i32 %val, %skip
367   %conv = zext i8 %numlowbits to i32
368   %onebit = shl i32 1, %conv
369   %mask = add nsw i32 %onebit, -1
370   %masked = and i32 %mask, %shifted
371   ret i32 %masked
374 define i32 @bextr32_a4_commutative(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
375 ; X86-NOBMI-LABEL: bextr32_a4_commutative:
376 ; X86-NOBMI:       # %bb.0:
377 ; X86-NOBMI-NEXT:    pushl %esi
378 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
379 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
380 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
381 ; X86-NOBMI-NEXT:    shrl %cl, %esi
382 ; X86-NOBMI-NEXT:    movl $1, %eax
383 ; X86-NOBMI-NEXT:    movl %edx, %ecx
384 ; X86-NOBMI-NEXT:    shll %cl, %eax
385 ; X86-NOBMI-NEXT:    decl %eax
386 ; X86-NOBMI-NEXT:    andl %esi, %eax
387 ; X86-NOBMI-NEXT:    popl %esi
388 ; X86-NOBMI-NEXT:    retl
390 ; X86-BMI1NOTBM-LABEL: bextr32_a4_commutative:
391 ; X86-BMI1NOTBM:       # %bb.0:
392 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
393 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
394 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
395 ; X86-BMI1NOTBM-NEXT:    orl %eax, %ecx
396 ; X86-BMI1NOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax
397 ; X86-BMI1NOTBM-NEXT:    retl
399 ; X86-BMI1BMI2-LABEL: bextr32_a4_commutative:
400 ; X86-BMI1BMI2:       # %bb.0:
401 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
402 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
403 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx
404 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
405 ; X86-BMI1BMI2-NEXT:    retl
407 ; X64-NOBMI-LABEL: bextr32_a4_commutative:
408 ; X64-NOBMI:       # %bb.0:
409 ; X64-NOBMI-NEXT:    movl %esi, %ecx
410 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
411 ; X64-NOBMI-NEXT:    shrl %cl, %edi
412 ; X64-NOBMI-NEXT:    movl $1, %eax
413 ; X64-NOBMI-NEXT:    movl %edx, %ecx
414 ; X64-NOBMI-NEXT:    shll %cl, %eax
415 ; X64-NOBMI-NEXT:    decl %eax
416 ; X64-NOBMI-NEXT:    andl %edi, %eax
417 ; X64-NOBMI-NEXT:    retq
419 ; X64-BMI1NOTBM-LABEL: bextr32_a4_commutative:
420 ; X64-BMI1NOTBM:       # %bb.0:
421 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
422 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
423 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
424 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %eax
425 ; X64-BMI1NOTBM-NEXT:    retq
427 ; X64-BMI1BMI2-LABEL: bextr32_a4_commutative:
428 ; X64-BMI1BMI2:       # %bb.0:
429 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %eax
430 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
431 ; X64-BMI1BMI2-NEXT:    retq
432   %shifted = lshr i32 %val, %numskipbits
433   %onebit = shl i32 1, %numlowbits
434   %mask = add nsw i32 %onebit, -1
435   %masked = and i32 %shifted, %mask ; swapped order
436   ret i32 %masked
439 define i32 @bextr32_a5_skipextrauses(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
440 ; X86-NOBMI-LABEL: bextr32_a5_skipextrauses:
441 ; X86-NOBMI:       # %bb.0:
442 ; X86-NOBMI-NEXT:    pushl %edi
443 ; X86-NOBMI-NEXT:    pushl %esi
444 ; X86-NOBMI-NEXT:    pushl %eax
445 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
446 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
447 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
448 ; X86-NOBMI-NEXT:    movl %eax, %ecx
449 ; X86-NOBMI-NEXT:    shrl %cl, %edi
450 ; X86-NOBMI-NEXT:    movl $1, %esi
451 ; X86-NOBMI-NEXT:    movl %edx, %ecx
452 ; X86-NOBMI-NEXT:    shll %cl, %esi
453 ; X86-NOBMI-NEXT:    decl %esi
454 ; X86-NOBMI-NEXT:    andl %edi, %esi
455 ; X86-NOBMI-NEXT:    movl %eax, (%esp)
456 ; X86-NOBMI-NEXT:    calll use32
457 ; X86-NOBMI-NEXT:    movl %esi, %eax
458 ; X86-NOBMI-NEXT:    addl $4, %esp
459 ; X86-NOBMI-NEXT:    popl %esi
460 ; X86-NOBMI-NEXT:    popl %edi
461 ; X86-NOBMI-NEXT:    retl
463 ; X86-BMI1NOTBM-LABEL: bextr32_a5_skipextrauses:
464 ; X86-BMI1NOTBM:       # %bb.0:
465 ; X86-BMI1NOTBM-NEXT:    pushl %esi
466 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
467 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
468 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
469 ; X86-BMI1NOTBM-NEXT:    shll $8, %ecx
470 ; X86-BMI1NOTBM-NEXT:    movzbl %al, %edx
471 ; X86-BMI1NOTBM-NEXT:    orl %ecx, %edx
472 ; X86-BMI1NOTBM-NEXT:    bextrl %edx, {{[0-9]+}}(%esp), %esi
473 ; X86-BMI1NOTBM-NEXT:    movl %eax, (%esp)
474 ; X86-BMI1NOTBM-NEXT:    calll use32
475 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
476 ; X86-BMI1NOTBM-NEXT:    addl $8, %esp
477 ; X86-BMI1NOTBM-NEXT:    popl %esi
478 ; X86-BMI1NOTBM-NEXT:    retl
480 ; X86-BMI1BMI2-LABEL: bextr32_a5_skipextrauses:
481 ; X86-BMI1BMI2:       # %bb.0:
482 ; X86-BMI1BMI2-NEXT:    pushl %esi
483 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
484 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
485 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
486 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %edx
487 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %edx, %esi
488 ; X86-BMI1BMI2-NEXT:    movl %ecx, (%esp)
489 ; X86-BMI1BMI2-NEXT:    calll use32
490 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
491 ; X86-BMI1BMI2-NEXT:    addl $8, %esp
492 ; X86-BMI1BMI2-NEXT:    popl %esi
493 ; X86-BMI1BMI2-NEXT:    retl
495 ; X64-NOBMI-LABEL: bextr32_a5_skipextrauses:
496 ; X64-NOBMI:       # %bb.0:
497 ; X64-NOBMI-NEXT:    pushq %rbx
498 ; X64-NOBMI-NEXT:    movl %esi, %ecx
499 ; X64-NOBMI-NEXT:    shrl %cl, %edi
500 ; X64-NOBMI-NEXT:    movl $1, %ebx
501 ; X64-NOBMI-NEXT:    movl %edx, %ecx
502 ; X64-NOBMI-NEXT:    shll %cl, %ebx
503 ; X64-NOBMI-NEXT:    decl %ebx
504 ; X64-NOBMI-NEXT:    andl %edi, %ebx
505 ; X64-NOBMI-NEXT:    movl %esi, %edi
506 ; X64-NOBMI-NEXT:    callq use32
507 ; X64-NOBMI-NEXT:    movl %ebx, %eax
508 ; X64-NOBMI-NEXT:    popq %rbx
509 ; X64-NOBMI-NEXT:    retq
511 ; X64-BMI1NOTBM-LABEL: bextr32_a5_skipextrauses:
512 ; X64-BMI1NOTBM:       # %bb.0:
513 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
514 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
515 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
516 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
517 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %ebx
518 ; X64-BMI1NOTBM-NEXT:    movl %esi, %edi
519 ; X64-BMI1NOTBM-NEXT:    callq use32
520 ; X64-BMI1NOTBM-NEXT:    movl %ebx, %eax
521 ; X64-BMI1NOTBM-NEXT:    popq %rbx
522 ; X64-BMI1NOTBM-NEXT:    retq
524 ; X64-BMI1BMI2-LABEL: bextr32_a5_skipextrauses:
525 ; X64-BMI1BMI2:       # %bb.0:
526 ; X64-BMI1BMI2-NEXT:    pushq %rbx
527 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %eax
528 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %ebx
529 ; X64-BMI1BMI2-NEXT:    movl %esi, %edi
530 ; X64-BMI1BMI2-NEXT:    callq use32
531 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
532 ; X64-BMI1BMI2-NEXT:    popq %rbx
533 ; X64-BMI1BMI2-NEXT:    retq
534   %shifted = lshr i32 %val, %numskipbits
535   %onebit = shl i32 1, %numlowbits
536   %mask = add nsw i32 %onebit, -1
537   %masked = and i32 %mask, %shifted
538   call void @use32(i32 %numskipbits)
539   ret i32 %masked
542 ; 64-bit
544 define i64 @bextr64_a0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
545 ; X86-NOBMI-LABEL: bextr64_a0:
546 ; X86-NOBMI:       # %bb.0:
547 ; X86-NOBMI-NEXT:    pushl %edi
548 ; X86-NOBMI-NEXT:    pushl %esi
549 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch
550 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
551 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
552 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
553 ; X86-NOBMI-NEXT:    movl %eax, %edi
554 ; X86-NOBMI-NEXT:    shrl %cl, %edi
555 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
556 ; X86-NOBMI-NEXT:    testb $32, %cl
557 ; X86-NOBMI-NEXT:    je .LBB7_2
558 ; X86-NOBMI-NEXT:  # %bb.1:
559 ; X86-NOBMI-NEXT:    movl %edi, %esi
560 ; X86-NOBMI-NEXT:    xorl %edi, %edi
561 ; X86-NOBMI-NEXT:  .LBB7_2:
562 ; X86-NOBMI-NEXT:    movl $1, %eax
563 ; X86-NOBMI-NEXT:    xorl %edx, %edx
564 ; X86-NOBMI-NEXT:    movb %ch, %cl
565 ; X86-NOBMI-NEXT:    shldl %cl, %eax, %edx
566 ; X86-NOBMI-NEXT:    shll %cl, %eax
567 ; X86-NOBMI-NEXT:    testb $32, %ch
568 ; X86-NOBMI-NEXT:    je .LBB7_4
569 ; X86-NOBMI-NEXT:  # %bb.3:
570 ; X86-NOBMI-NEXT:    movl %eax, %edx
571 ; X86-NOBMI-NEXT:    xorl %eax, %eax
572 ; X86-NOBMI-NEXT:  .LBB7_4:
573 ; X86-NOBMI-NEXT:    addl $-1, %eax
574 ; X86-NOBMI-NEXT:    adcl $-1, %edx
575 ; X86-NOBMI-NEXT:    andl %esi, %eax
576 ; X86-NOBMI-NEXT:    andl %edi, %edx
577 ; X86-NOBMI-NEXT:    popl %esi
578 ; X86-NOBMI-NEXT:    popl %edi
579 ; X86-NOBMI-NEXT:    retl
581 ; X86-BMI1NOTBM-LABEL: bextr64_a0:
582 ; X86-BMI1NOTBM:       # %bb.0:
583 ; X86-BMI1NOTBM-NEXT:    pushl %edi
584 ; X86-BMI1NOTBM-NEXT:    pushl %esi
585 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %ch
586 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
587 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
588 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
589 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
590 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
591 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %esi
592 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
593 ; X86-BMI1NOTBM-NEXT:    je .LBB7_2
594 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
595 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
596 ; X86-BMI1NOTBM-NEXT:    xorl %edi, %edi
597 ; X86-BMI1NOTBM-NEXT:  .LBB7_2:
598 ; X86-BMI1NOTBM-NEXT:    movl $1, %eax
599 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
600 ; X86-BMI1NOTBM-NEXT:    movb %ch, %cl
601 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %eax, %edx
602 ; X86-BMI1NOTBM-NEXT:    shll %cl, %eax
603 ; X86-BMI1NOTBM-NEXT:    testb $32, %ch
604 ; X86-BMI1NOTBM-NEXT:    je .LBB7_4
605 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
606 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edx
607 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
608 ; X86-BMI1NOTBM-NEXT:  .LBB7_4:
609 ; X86-BMI1NOTBM-NEXT:    addl $-1, %eax
610 ; X86-BMI1NOTBM-NEXT:    adcl $-1, %edx
611 ; X86-BMI1NOTBM-NEXT:    andl %esi, %eax
612 ; X86-BMI1NOTBM-NEXT:    andl %edi, %edx
613 ; X86-BMI1NOTBM-NEXT:    popl %esi
614 ; X86-BMI1NOTBM-NEXT:    popl %edi
615 ; X86-BMI1NOTBM-NEXT:    retl
617 ; X86-BMI1BMI2-LABEL: bextr64_a0:
618 ; X86-BMI1BMI2:       # %bb.0:
619 ; X86-BMI1BMI2-NEXT:    pushl %ebx
620 ; X86-BMI1BMI2-NEXT:    pushl %edi
621 ; X86-BMI1BMI2-NEXT:    pushl %esi
622 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
623 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
624 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
625 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
626 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
627 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edi
628 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
629 ; X86-BMI1BMI2-NEXT:    je .LBB7_2
630 ; X86-BMI1BMI2-NEXT:  # %bb.1:
631 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
632 ; X86-BMI1BMI2-NEXT:    xorl %edi, %edi
633 ; X86-BMI1BMI2-NEXT:  .LBB7_2:
634 ; X86-BMI1BMI2-NEXT:    movl $1, %eax
635 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
636 ; X86-BMI1BMI2-NEXT:    movl %ebx, %ecx
637 ; X86-BMI1BMI2-NEXT:    shldl %cl, %eax, %edx
638 ; X86-BMI1BMI2-NEXT:    shlxl %ebx, %eax, %eax
639 ; X86-BMI1BMI2-NEXT:    testb $32, %bl
640 ; X86-BMI1BMI2-NEXT:    je .LBB7_4
641 ; X86-BMI1BMI2-NEXT:  # %bb.3:
642 ; X86-BMI1BMI2-NEXT:    movl %eax, %edx
643 ; X86-BMI1BMI2-NEXT:    xorl %eax, %eax
644 ; X86-BMI1BMI2-NEXT:  .LBB7_4:
645 ; X86-BMI1BMI2-NEXT:    addl $-1, %eax
646 ; X86-BMI1BMI2-NEXT:    adcl $-1, %edx
647 ; X86-BMI1BMI2-NEXT:    andl %esi, %eax
648 ; X86-BMI1BMI2-NEXT:    andl %edi, %edx
649 ; X86-BMI1BMI2-NEXT:    popl %esi
650 ; X86-BMI1BMI2-NEXT:    popl %edi
651 ; X86-BMI1BMI2-NEXT:    popl %ebx
652 ; X86-BMI1BMI2-NEXT:    retl
654 ; X64-NOBMI-LABEL: bextr64_a0:
655 ; X64-NOBMI:       # %bb.0:
656 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
657 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
658 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
659 ; X64-NOBMI-NEXT:    movl $1, %eax
660 ; X64-NOBMI-NEXT:    movl %edx, %ecx
661 ; X64-NOBMI-NEXT:    shlq %cl, %rax
662 ; X64-NOBMI-NEXT:    decq %rax
663 ; X64-NOBMI-NEXT:    andq %rdi, %rax
664 ; X64-NOBMI-NEXT:    retq
666 ; X64-BMI1NOTBM-LABEL: bextr64_a0:
667 ; X64-BMI1NOTBM:       # %bb.0:
668 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
669 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
670 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
671 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
672 ; X64-BMI1NOTBM-NEXT:    retq
674 ; X64-BMI1BMI2-LABEL: bextr64_a0:
675 ; X64-BMI1BMI2:       # %bb.0:
676 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
677 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
678 ; X64-BMI1BMI2-NEXT:    retq
679   %shifted = lshr i64 %val, %numskipbits
680   %onebit = shl i64 1, %numlowbits
681   %mask = add nsw i64 %onebit, -1
682   %masked = and i64 %mask, %shifted
683   ret i64 %masked
686 define i64 @bextr64_a0_arithmetic(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
687 ; X86-NOBMI-LABEL: bextr64_a0_arithmetic:
688 ; X86-NOBMI:       # %bb.0:
689 ; X86-NOBMI-NEXT:    pushl %edi
690 ; X86-NOBMI-NEXT:    pushl %esi
691 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch
692 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
693 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
694 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
695 ; X86-NOBMI-NEXT:    movl %eax, %esi
696 ; X86-NOBMI-NEXT:    sarl %cl, %esi
697 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %edi
698 ; X86-NOBMI-NEXT:    testb $32, %cl
699 ; X86-NOBMI-NEXT:    je .LBB8_2
700 ; X86-NOBMI-NEXT:  # %bb.1:
701 ; X86-NOBMI-NEXT:    sarl $31, %eax
702 ; X86-NOBMI-NEXT:    movl %esi, %edi
703 ; X86-NOBMI-NEXT:    movl %eax, %esi
704 ; X86-NOBMI-NEXT:  .LBB8_2:
705 ; X86-NOBMI-NEXT:    movl $1, %eax
706 ; X86-NOBMI-NEXT:    xorl %edx, %edx
707 ; X86-NOBMI-NEXT:    movb %ch, %cl
708 ; X86-NOBMI-NEXT:    shldl %cl, %eax, %edx
709 ; X86-NOBMI-NEXT:    shll %cl, %eax
710 ; X86-NOBMI-NEXT:    testb $32, %ch
711 ; X86-NOBMI-NEXT:    je .LBB8_4
712 ; X86-NOBMI-NEXT:  # %bb.3:
713 ; X86-NOBMI-NEXT:    movl %eax, %edx
714 ; X86-NOBMI-NEXT:    xorl %eax, %eax
715 ; X86-NOBMI-NEXT:  .LBB8_4:
716 ; X86-NOBMI-NEXT:    addl $-1, %eax
717 ; X86-NOBMI-NEXT:    adcl $-1, %edx
718 ; X86-NOBMI-NEXT:    andl %edi, %eax
719 ; X86-NOBMI-NEXT:    andl %esi, %edx
720 ; X86-NOBMI-NEXT:    popl %esi
721 ; X86-NOBMI-NEXT:    popl %edi
722 ; X86-NOBMI-NEXT:    retl
724 ; X86-BMI1NOTBM-LABEL: bextr64_a0_arithmetic:
725 ; X86-BMI1NOTBM:       # %bb.0:
726 ; X86-BMI1NOTBM-NEXT:    pushl %edi
727 ; X86-BMI1NOTBM-NEXT:    pushl %esi
728 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %ch
729 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
730 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
731 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
732 ; X86-BMI1NOTBM-NEXT:    movl %eax, %esi
733 ; X86-BMI1NOTBM-NEXT:    sarl %cl, %esi
734 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %edi
735 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
736 ; X86-BMI1NOTBM-NEXT:    je .LBB8_2
737 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
738 ; X86-BMI1NOTBM-NEXT:    sarl $31, %eax
739 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edi
740 ; X86-BMI1NOTBM-NEXT:    movl %eax, %esi
741 ; X86-BMI1NOTBM-NEXT:  .LBB8_2:
742 ; X86-BMI1NOTBM-NEXT:    movl $1, %eax
743 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
744 ; X86-BMI1NOTBM-NEXT:    movb %ch, %cl
745 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %eax, %edx
746 ; X86-BMI1NOTBM-NEXT:    shll %cl, %eax
747 ; X86-BMI1NOTBM-NEXT:    testb $32, %ch
748 ; X86-BMI1NOTBM-NEXT:    je .LBB8_4
749 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
750 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edx
751 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
752 ; X86-BMI1NOTBM-NEXT:  .LBB8_4:
753 ; X86-BMI1NOTBM-NEXT:    addl $-1, %eax
754 ; X86-BMI1NOTBM-NEXT:    adcl $-1, %edx
755 ; X86-BMI1NOTBM-NEXT:    andl %edi, %eax
756 ; X86-BMI1NOTBM-NEXT:    andl %esi, %edx
757 ; X86-BMI1NOTBM-NEXT:    popl %esi
758 ; X86-BMI1NOTBM-NEXT:    popl %edi
759 ; X86-BMI1NOTBM-NEXT:    retl
761 ; X86-BMI1BMI2-LABEL: bextr64_a0_arithmetic:
762 ; X86-BMI1BMI2:       # %bb.0:
763 ; X86-BMI1BMI2-NEXT:    pushl %ebx
764 ; X86-BMI1BMI2-NEXT:    pushl %edi
765 ; X86-BMI1BMI2-NEXT:    pushl %esi
766 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
767 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
768 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
769 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
770 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
771 ; X86-BMI1BMI2-NEXT:    sarxl %ecx, %eax, %edi
772 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
773 ; X86-BMI1BMI2-NEXT:    je .LBB8_2
774 ; X86-BMI1BMI2-NEXT:  # %bb.1:
775 ; X86-BMI1BMI2-NEXT:    sarl $31, %eax
776 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
777 ; X86-BMI1BMI2-NEXT:    movl %eax, %edi
778 ; X86-BMI1BMI2-NEXT:  .LBB8_2:
779 ; X86-BMI1BMI2-NEXT:    movl $1, %eax
780 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
781 ; X86-BMI1BMI2-NEXT:    movl %ebx, %ecx
782 ; X86-BMI1BMI2-NEXT:    shldl %cl, %eax, %edx
783 ; X86-BMI1BMI2-NEXT:    shlxl %ebx, %eax, %eax
784 ; X86-BMI1BMI2-NEXT:    testb $32, %bl
785 ; X86-BMI1BMI2-NEXT:    je .LBB8_4
786 ; X86-BMI1BMI2-NEXT:  # %bb.3:
787 ; X86-BMI1BMI2-NEXT:    movl %eax, %edx
788 ; X86-BMI1BMI2-NEXT:    xorl %eax, %eax
789 ; X86-BMI1BMI2-NEXT:  .LBB8_4:
790 ; X86-BMI1BMI2-NEXT:    addl $-1, %eax
791 ; X86-BMI1BMI2-NEXT:    adcl $-1, %edx
792 ; X86-BMI1BMI2-NEXT:    andl %esi, %eax
793 ; X86-BMI1BMI2-NEXT:    andl %edi, %edx
794 ; X86-BMI1BMI2-NEXT:    popl %esi
795 ; X86-BMI1BMI2-NEXT:    popl %edi
796 ; X86-BMI1BMI2-NEXT:    popl %ebx
797 ; X86-BMI1BMI2-NEXT:    retl
799 ; X64-NOBMI-LABEL: bextr64_a0_arithmetic:
800 ; X64-NOBMI:       # %bb.0:
801 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
802 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
803 ; X64-NOBMI-NEXT:    sarq %cl, %rdi
804 ; X64-NOBMI-NEXT:    movl $1, %eax
805 ; X64-NOBMI-NEXT:    movl %edx, %ecx
806 ; X64-NOBMI-NEXT:    shlq %cl, %rax
807 ; X64-NOBMI-NEXT:    decq %rax
808 ; X64-NOBMI-NEXT:    andq %rdi, %rax
809 ; X64-NOBMI-NEXT:    retq
811 ; X64-BMI1NOTBM-LABEL: bextr64_a0_arithmetic:
812 ; X64-BMI1NOTBM:       # %bb.0:
813 ; X64-BMI1NOTBM-NEXT:    movq %rsi, %rcx
814 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $rcx
815 ; X64-BMI1NOTBM-NEXT:    sarq %cl, %rdi
816 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
817 ; X64-BMI1NOTBM-NEXT:    bextrq %rdx, %rdi, %rax
818 ; X64-BMI1NOTBM-NEXT:    retq
820 ; X64-BMI1BMI2-LABEL: bextr64_a0_arithmetic:
821 ; X64-BMI1BMI2:       # %bb.0:
822 ; X64-BMI1BMI2-NEXT:    sarxq %rsi, %rdi, %rax
823 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
824 ; X64-BMI1BMI2-NEXT:    retq
825   %shifted = ashr i64 %val, %numskipbits
826   %onebit = shl i64 1, %numlowbits
827   %mask = add nsw i64 %onebit, -1
828   %masked = and i64 %mask, %shifted
829   ret i64 %masked
832 define i64 @bextr64_a1_indexzext(i64 %val, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {
833 ; X86-NOBMI-LABEL: bextr64_a1_indexzext:
834 ; X86-NOBMI:       # %bb.0:
835 ; X86-NOBMI-NEXT:    pushl %edi
836 ; X86-NOBMI-NEXT:    pushl %esi
837 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch
838 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
839 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
840 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
841 ; X86-NOBMI-NEXT:    movl %eax, %edi
842 ; X86-NOBMI-NEXT:    shrl %cl, %edi
843 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
844 ; X86-NOBMI-NEXT:    testb $32, %cl
845 ; X86-NOBMI-NEXT:    je .LBB9_2
846 ; X86-NOBMI-NEXT:  # %bb.1:
847 ; X86-NOBMI-NEXT:    movl %edi, %esi
848 ; X86-NOBMI-NEXT:    xorl %edi, %edi
849 ; X86-NOBMI-NEXT:  .LBB9_2:
850 ; X86-NOBMI-NEXT:    movl $1, %eax
851 ; X86-NOBMI-NEXT:    xorl %edx, %edx
852 ; X86-NOBMI-NEXT:    movb %ch, %cl
853 ; X86-NOBMI-NEXT:    shldl %cl, %eax, %edx
854 ; X86-NOBMI-NEXT:    shll %cl, %eax
855 ; X86-NOBMI-NEXT:    testb $32, %ch
856 ; X86-NOBMI-NEXT:    je .LBB9_4
857 ; X86-NOBMI-NEXT:  # %bb.3:
858 ; X86-NOBMI-NEXT:    movl %eax, %edx
859 ; X86-NOBMI-NEXT:    xorl %eax, %eax
860 ; X86-NOBMI-NEXT:  .LBB9_4:
861 ; X86-NOBMI-NEXT:    addl $-1, %eax
862 ; X86-NOBMI-NEXT:    adcl $-1, %edx
863 ; X86-NOBMI-NEXT:    andl %esi, %eax
864 ; X86-NOBMI-NEXT:    andl %edi, %edx
865 ; X86-NOBMI-NEXT:    popl %esi
866 ; X86-NOBMI-NEXT:    popl %edi
867 ; X86-NOBMI-NEXT:    retl
869 ; X86-BMI1NOTBM-LABEL: bextr64_a1_indexzext:
870 ; X86-BMI1NOTBM:       # %bb.0:
871 ; X86-BMI1NOTBM-NEXT:    pushl %edi
872 ; X86-BMI1NOTBM-NEXT:    pushl %esi
873 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %ch
874 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
875 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
876 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
877 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
878 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
879 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %esi
880 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
881 ; X86-BMI1NOTBM-NEXT:    je .LBB9_2
882 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
883 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
884 ; X86-BMI1NOTBM-NEXT:    xorl %edi, %edi
885 ; X86-BMI1NOTBM-NEXT:  .LBB9_2:
886 ; X86-BMI1NOTBM-NEXT:    movl $1, %eax
887 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
888 ; X86-BMI1NOTBM-NEXT:    movb %ch, %cl
889 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %eax, %edx
890 ; X86-BMI1NOTBM-NEXT:    shll %cl, %eax
891 ; X86-BMI1NOTBM-NEXT:    testb $32, %ch
892 ; X86-BMI1NOTBM-NEXT:    je .LBB9_4
893 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
894 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edx
895 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
896 ; X86-BMI1NOTBM-NEXT:  .LBB9_4:
897 ; X86-BMI1NOTBM-NEXT:    addl $-1, %eax
898 ; X86-BMI1NOTBM-NEXT:    adcl $-1, %edx
899 ; X86-BMI1NOTBM-NEXT:    andl %esi, %eax
900 ; X86-BMI1NOTBM-NEXT:    andl %edi, %edx
901 ; X86-BMI1NOTBM-NEXT:    popl %esi
902 ; X86-BMI1NOTBM-NEXT:    popl %edi
903 ; X86-BMI1NOTBM-NEXT:    retl
905 ; X86-BMI1BMI2-LABEL: bextr64_a1_indexzext:
906 ; X86-BMI1BMI2:       # %bb.0:
907 ; X86-BMI1BMI2-NEXT:    pushl %ebx
908 ; X86-BMI1BMI2-NEXT:    pushl %edi
909 ; X86-BMI1BMI2-NEXT:    pushl %esi
910 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
911 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
912 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
913 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
914 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
915 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edi
916 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
917 ; X86-BMI1BMI2-NEXT:    je .LBB9_2
918 ; X86-BMI1BMI2-NEXT:  # %bb.1:
919 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
920 ; X86-BMI1BMI2-NEXT:    xorl %edi, %edi
921 ; X86-BMI1BMI2-NEXT:  .LBB9_2:
922 ; X86-BMI1BMI2-NEXT:    movl $1, %eax
923 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
924 ; X86-BMI1BMI2-NEXT:    movl %ebx, %ecx
925 ; X86-BMI1BMI2-NEXT:    shldl %cl, %eax, %edx
926 ; X86-BMI1BMI2-NEXT:    shlxl %ebx, %eax, %eax
927 ; X86-BMI1BMI2-NEXT:    testb $32, %bl
928 ; X86-BMI1BMI2-NEXT:    je .LBB9_4
929 ; X86-BMI1BMI2-NEXT:  # %bb.3:
930 ; X86-BMI1BMI2-NEXT:    movl %eax, %edx
931 ; X86-BMI1BMI2-NEXT:    xorl %eax, %eax
932 ; X86-BMI1BMI2-NEXT:  .LBB9_4:
933 ; X86-BMI1BMI2-NEXT:    addl $-1, %eax
934 ; X86-BMI1BMI2-NEXT:    adcl $-1, %edx
935 ; X86-BMI1BMI2-NEXT:    andl %esi, %eax
936 ; X86-BMI1BMI2-NEXT:    andl %edi, %edx
937 ; X86-BMI1BMI2-NEXT:    popl %esi
938 ; X86-BMI1BMI2-NEXT:    popl %edi
939 ; X86-BMI1BMI2-NEXT:    popl %ebx
940 ; X86-BMI1BMI2-NEXT:    retl
942 ; X64-NOBMI-LABEL: bextr64_a1_indexzext:
943 ; X64-NOBMI:       # %bb.0:
944 ; X64-NOBMI-NEXT:    movl %esi, %ecx
945 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
946 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
947 ; X64-NOBMI-NEXT:    movl $1, %eax
948 ; X64-NOBMI-NEXT:    movl %edx, %ecx
949 ; X64-NOBMI-NEXT:    shlq %cl, %rax
950 ; X64-NOBMI-NEXT:    decq %rax
951 ; X64-NOBMI-NEXT:    andq %rdi, %rax
952 ; X64-NOBMI-NEXT:    retq
954 ; X64-BMI1NOTBM-LABEL: bextr64_a1_indexzext:
955 ; X64-BMI1NOTBM:       # %bb.0:
956 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
957 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
958 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
959 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
960 ; X64-BMI1NOTBM-NEXT:    retq
962 ; X64-BMI1BMI2-LABEL: bextr64_a1_indexzext:
963 ; X64-BMI1BMI2:       # %bb.0:
964 ; X64-BMI1BMI2-NEXT:    # kill: def $edx killed $edx def $rdx
965 ; X64-BMI1BMI2-NEXT:    # kill: def $esi killed $esi def $rsi
966 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
967 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
968 ; X64-BMI1BMI2-NEXT:    retq
969   %skip = zext i8 %numskipbits to i64
970   %shifted = lshr i64 %val, %skip
971   %conv = zext i8 %numlowbits to i64
972   %onebit = shl i64 1, %conv
973   %mask = add nsw i64 %onebit, -1
974   %masked = and i64 %mask, %shifted
975   ret i64 %masked
978 define i64 @bextr64_a2_load(i64* %w, i64 %numskipbits, i64 %numlowbits) nounwind {
979 ; X86-NOBMI-LABEL: bextr64_a2_load:
980 ; X86-NOBMI:       # %bb.0:
981 ; X86-NOBMI-NEXT:    pushl %edi
982 ; X86-NOBMI-NEXT:    pushl %esi
983 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch
984 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
985 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
986 ; X86-NOBMI-NEXT:    movl (%eax), %esi
987 ; X86-NOBMI-NEXT:    movl 4(%eax), %eax
988 ; X86-NOBMI-NEXT:    movl %eax, %edi
989 ; X86-NOBMI-NEXT:    shrl %cl, %edi
990 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
991 ; X86-NOBMI-NEXT:    testb $32, %cl
992 ; X86-NOBMI-NEXT:    je .LBB10_2
993 ; X86-NOBMI-NEXT:  # %bb.1:
994 ; X86-NOBMI-NEXT:    movl %edi, %esi
995 ; X86-NOBMI-NEXT:    xorl %edi, %edi
996 ; X86-NOBMI-NEXT:  .LBB10_2:
997 ; X86-NOBMI-NEXT:    movl $1, %eax
998 ; X86-NOBMI-NEXT:    xorl %edx, %edx
999 ; X86-NOBMI-NEXT:    movb %ch, %cl
1000 ; X86-NOBMI-NEXT:    shldl %cl, %eax, %edx
1001 ; X86-NOBMI-NEXT:    shll %cl, %eax
1002 ; X86-NOBMI-NEXT:    testb $32, %ch
1003 ; X86-NOBMI-NEXT:    je .LBB10_4
1004 ; X86-NOBMI-NEXT:  # %bb.3:
1005 ; X86-NOBMI-NEXT:    movl %eax, %edx
1006 ; X86-NOBMI-NEXT:    xorl %eax, %eax
1007 ; X86-NOBMI-NEXT:  .LBB10_4:
1008 ; X86-NOBMI-NEXT:    addl $-1, %eax
1009 ; X86-NOBMI-NEXT:    adcl $-1, %edx
1010 ; X86-NOBMI-NEXT:    andl %esi, %eax
1011 ; X86-NOBMI-NEXT:    andl %edi, %edx
1012 ; X86-NOBMI-NEXT:    popl %esi
1013 ; X86-NOBMI-NEXT:    popl %edi
1014 ; X86-NOBMI-NEXT:    retl
1016 ; X86-BMI1NOTBM-LABEL: bextr64_a2_load:
1017 ; X86-BMI1NOTBM:       # %bb.0:
1018 ; X86-BMI1NOTBM-NEXT:    pushl %edi
1019 ; X86-BMI1NOTBM-NEXT:    pushl %esi
1020 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %ch
1021 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
1022 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
1023 ; X86-BMI1NOTBM-NEXT:    movl (%eax), %esi
1024 ; X86-BMI1NOTBM-NEXT:    movl 4(%eax), %eax
1025 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
1026 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
1027 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %esi
1028 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
1029 ; X86-BMI1NOTBM-NEXT:    je .LBB10_2
1030 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
1031 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
1032 ; X86-BMI1NOTBM-NEXT:    xorl %edi, %edi
1033 ; X86-BMI1NOTBM-NEXT:  .LBB10_2:
1034 ; X86-BMI1NOTBM-NEXT:    movl $1, %eax
1035 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
1036 ; X86-BMI1NOTBM-NEXT:    movb %ch, %cl
1037 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %eax, %edx
1038 ; X86-BMI1NOTBM-NEXT:    shll %cl, %eax
1039 ; X86-BMI1NOTBM-NEXT:    testb $32, %ch
1040 ; X86-BMI1NOTBM-NEXT:    je .LBB10_4
1041 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
1042 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edx
1043 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
1044 ; X86-BMI1NOTBM-NEXT:  .LBB10_4:
1045 ; X86-BMI1NOTBM-NEXT:    addl $-1, %eax
1046 ; X86-BMI1NOTBM-NEXT:    adcl $-1, %edx
1047 ; X86-BMI1NOTBM-NEXT:    andl %esi, %eax
1048 ; X86-BMI1NOTBM-NEXT:    andl %edi, %edx
1049 ; X86-BMI1NOTBM-NEXT:    popl %esi
1050 ; X86-BMI1NOTBM-NEXT:    popl %edi
1051 ; X86-BMI1NOTBM-NEXT:    retl
1053 ; X86-BMI1BMI2-LABEL: bextr64_a2_load:
1054 ; X86-BMI1BMI2:       # %bb.0:
1055 ; X86-BMI1BMI2-NEXT:    pushl %ebx
1056 ; X86-BMI1BMI2-NEXT:    pushl %edi
1057 ; X86-BMI1BMI2-NEXT:    pushl %esi
1058 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
1059 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
1060 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1061 ; X86-BMI1BMI2-NEXT:    movl (%eax), %esi
1062 ; X86-BMI1BMI2-NEXT:    movl 4(%eax), %eax
1063 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edi
1064 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
1065 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
1066 ; X86-BMI1BMI2-NEXT:    je .LBB10_2
1067 ; X86-BMI1BMI2-NEXT:  # %bb.1:
1068 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
1069 ; X86-BMI1BMI2-NEXT:    xorl %edi, %edi
1070 ; X86-BMI1BMI2-NEXT:  .LBB10_2:
1071 ; X86-BMI1BMI2-NEXT:    movl $1, %eax
1072 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
1073 ; X86-BMI1BMI2-NEXT:    movl %ebx, %ecx
1074 ; X86-BMI1BMI2-NEXT:    shldl %cl, %eax, %edx
1075 ; X86-BMI1BMI2-NEXT:    shlxl %ebx, %eax, %eax
1076 ; X86-BMI1BMI2-NEXT:    testb $32, %bl
1077 ; X86-BMI1BMI2-NEXT:    je .LBB10_4
1078 ; X86-BMI1BMI2-NEXT:  # %bb.3:
1079 ; X86-BMI1BMI2-NEXT:    movl %eax, %edx
1080 ; X86-BMI1BMI2-NEXT:    xorl %eax, %eax
1081 ; X86-BMI1BMI2-NEXT:  .LBB10_4:
1082 ; X86-BMI1BMI2-NEXT:    addl $-1, %eax
1083 ; X86-BMI1BMI2-NEXT:    adcl $-1, %edx
1084 ; X86-BMI1BMI2-NEXT:    andl %esi, %eax
1085 ; X86-BMI1BMI2-NEXT:    andl %edi, %edx
1086 ; X86-BMI1BMI2-NEXT:    popl %esi
1087 ; X86-BMI1BMI2-NEXT:    popl %edi
1088 ; X86-BMI1BMI2-NEXT:    popl %ebx
1089 ; X86-BMI1BMI2-NEXT:    retl
1091 ; X64-NOBMI-LABEL: bextr64_a2_load:
1092 ; X64-NOBMI:       # %bb.0:
1093 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
1094 ; X64-NOBMI-NEXT:    movq (%rdi), %rsi
1095 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
1096 ; X64-NOBMI-NEXT:    shrq %cl, %rsi
1097 ; X64-NOBMI-NEXT:    movl $1, %eax
1098 ; X64-NOBMI-NEXT:    movl %edx, %ecx
1099 ; X64-NOBMI-NEXT:    shlq %cl, %rax
1100 ; X64-NOBMI-NEXT:    decq %rax
1101 ; X64-NOBMI-NEXT:    andq %rsi, %rax
1102 ; X64-NOBMI-NEXT:    retq
1104 ; X64-BMI1NOTBM-LABEL: bextr64_a2_load:
1105 ; X64-BMI1NOTBM:       # %bb.0:
1106 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
1107 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
1108 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
1109 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, (%rdi), %rax
1110 ; X64-BMI1NOTBM-NEXT:    retq
1112 ; X64-BMI1BMI2-LABEL: bextr64_a2_load:
1113 ; X64-BMI1BMI2:       # %bb.0:
1114 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, (%rdi), %rax
1115 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
1116 ; X64-BMI1BMI2-NEXT:    retq
1117   %val = load i64, i64* %w
1118   %shifted = lshr i64 %val, %numskipbits
1119   %onebit = shl i64 1, %numlowbits
1120   %mask = add nsw i64 %onebit, -1
1121   %masked = and i64 %mask, %shifted
1122   ret i64 %masked
1125 define i64 @bextr64_a3_load_indexzext(i64* %w, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {
1126 ; X86-NOBMI-LABEL: bextr64_a3_load_indexzext:
1127 ; X86-NOBMI:       # %bb.0:
1128 ; X86-NOBMI-NEXT:    pushl %edi
1129 ; X86-NOBMI-NEXT:    pushl %esi
1130 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch
1131 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
1132 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
1133 ; X86-NOBMI-NEXT:    movl (%eax), %esi
1134 ; X86-NOBMI-NEXT:    movl 4(%eax), %eax
1135 ; X86-NOBMI-NEXT:    movl %eax, %edi
1136 ; X86-NOBMI-NEXT:    shrl %cl, %edi
1137 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
1138 ; X86-NOBMI-NEXT:    testb $32, %cl
1139 ; X86-NOBMI-NEXT:    je .LBB11_2
1140 ; X86-NOBMI-NEXT:  # %bb.1:
1141 ; X86-NOBMI-NEXT:    movl %edi, %esi
1142 ; X86-NOBMI-NEXT:    xorl %edi, %edi
1143 ; X86-NOBMI-NEXT:  .LBB11_2:
1144 ; X86-NOBMI-NEXT:    movl $1, %eax
1145 ; X86-NOBMI-NEXT:    xorl %edx, %edx
1146 ; X86-NOBMI-NEXT:    movb %ch, %cl
1147 ; X86-NOBMI-NEXT:    shldl %cl, %eax, %edx
1148 ; X86-NOBMI-NEXT:    shll %cl, %eax
1149 ; X86-NOBMI-NEXT:    testb $32, %ch
1150 ; X86-NOBMI-NEXT:    je .LBB11_4
1151 ; X86-NOBMI-NEXT:  # %bb.3:
1152 ; X86-NOBMI-NEXT:    movl %eax, %edx
1153 ; X86-NOBMI-NEXT:    xorl %eax, %eax
1154 ; X86-NOBMI-NEXT:  .LBB11_4:
1155 ; X86-NOBMI-NEXT:    addl $-1, %eax
1156 ; X86-NOBMI-NEXT:    adcl $-1, %edx
1157 ; X86-NOBMI-NEXT:    andl %esi, %eax
1158 ; X86-NOBMI-NEXT:    andl %edi, %edx
1159 ; X86-NOBMI-NEXT:    popl %esi
1160 ; X86-NOBMI-NEXT:    popl %edi
1161 ; X86-NOBMI-NEXT:    retl
1163 ; X86-BMI1NOTBM-LABEL: bextr64_a3_load_indexzext:
1164 ; X86-BMI1NOTBM:       # %bb.0:
1165 ; X86-BMI1NOTBM-NEXT:    pushl %edi
1166 ; X86-BMI1NOTBM-NEXT:    pushl %esi
1167 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %ch
1168 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
1169 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
1170 ; X86-BMI1NOTBM-NEXT:    movl (%eax), %esi
1171 ; X86-BMI1NOTBM-NEXT:    movl 4(%eax), %eax
1172 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
1173 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
1174 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %esi
1175 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
1176 ; X86-BMI1NOTBM-NEXT:    je .LBB11_2
1177 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
1178 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
1179 ; X86-BMI1NOTBM-NEXT:    xorl %edi, %edi
1180 ; X86-BMI1NOTBM-NEXT:  .LBB11_2:
1181 ; X86-BMI1NOTBM-NEXT:    movl $1, %eax
1182 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
1183 ; X86-BMI1NOTBM-NEXT:    movb %ch, %cl
1184 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %eax, %edx
1185 ; X86-BMI1NOTBM-NEXT:    shll %cl, %eax
1186 ; X86-BMI1NOTBM-NEXT:    testb $32, %ch
1187 ; X86-BMI1NOTBM-NEXT:    je .LBB11_4
1188 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
1189 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edx
1190 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
1191 ; X86-BMI1NOTBM-NEXT:  .LBB11_4:
1192 ; X86-BMI1NOTBM-NEXT:    addl $-1, %eax
1193 ; X86-BMI1NOTBM-NEXT:    adcl $-1, %edx
1194 ; X86-BMI1NOTBM-NEXT:    andl %esi, %eax
1195 ; X86-BMI1NOTBM-NEXT:    andl %edi, %edx
1196 ; X86-BMI1NOTBM-NEXT:    popl %esi
1197 ; X86-BMI1NOTBM-NEXT:    popl %edi
1198 ; X86-BMI1NOTBM-NEXT:    retl
1200 ; X86-BMI1BMI2-LABEL: bextr64_a3_load_indexzext:
1201 ; X86-BMI1BMI2:       # %bb.0:
1202 ; X86-BMI1BMI2-NEXT:    pushl %ebx
1203 ; X86-BMI1BMI2-NEXT:    pushl %edi
1204 ; X86-BMI1BMI2-NEXT:    pushl %esi
1205 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
1206 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
1207 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1208 ; X86-BMI1BMI2-NEXT:    movl (%eax), %esi
1209 ; X86-BMI1BMI2-NEXT:    movl 4(%eax), %eax
1210 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edi
1211 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
1212 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
1213 ; X86-BMI1BMI2-NEXT:    je .LBB11_2
1214 ; X86-BMI1BMI2-NEXT:  # %bb.1:
1215 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
1216 ; X86-BMI1BMI2-NEXT:    xorl %edi, %edi
1217 ; X86-BMI1BMI2-NEXT:  .LBB11_2:
1218 ; X86-BMI1BMI2-NEXT:    movl $1, %eax
1219 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
1220 ; X86-BMI1BMI2-NEXT:    movl %ebx, %ecx
1221 ; X86-BMI1BMI2-NEXT:    shldl %cl, %eax, %edx
1222 ; X86-BMI1BMI2-NEXT:    shlxl %ebx, %eax, %eax
1223 ; X86-BMI1BMI2-NEXT:    testb $32, %bl
1224 ; X86-BMI1BMI2-NEXT:    je .LBB11_4
1225 ; X86-BMI1BMI2-NEXT:  # %bb.3:
1226 ; X86-BMI1BMI2-NEXT:    movl %eax, %edx
1227 ; X86-BMI1BMI2-NEXT:    xorl %eax, %eax
1228 ; X86-BMI1BMI2-NEXT:  .LBB11_4:
1229 ; X86-BMI1BMI2-NEXT:    addl $-1, %eax
1230 ; X86-BMI1BMI2-NEXT:    adcl $-1, %edx
1231 ; X86-BMI1BMI2-NEXT:    andl %esi, %eax
1232 ; X86-BMI1BMI2-NEXT:    andl %edi, %edx
1233 ; X86-BMI1BMI2-NEXT:    popl %esi
1234 ; X86-BMI1BMI2-NEXT:    popl %edi
1235 ; X86-BMI1BMI2-NEXT:    popl %ebx
1236 ; X86-BMI1BMI2-NEXT:    retl
1238 ; X64-NOBMI-LABEL: bextr64_a3_load_indexzext:
1239 ; X64-NOBMI:       # %bb.0:
1240 ; X64-NOBMI-NEXT:    movl %esi, %ecx
1241 ; X64-NOBMI-NEXT:    movq (%rdi), %rsi
1242 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
1243 ; X64-NOBMI-NEXT:    shrq %cl, %rsi
1244 ; X64-NOBMI-NEXT:    movl $1, %eax
1245 ; X64-NOBMI-NEXT:    movl %edx, %ecx
1246 ; X64-NOBMI-NEXT:    shlq %cl, %rax
1247 ; X64-NOBMI-NEXT:    decq %rax
1248 ; X64-NOBMI-NEXT:    andq %rsi, %rax
1249 ; X64-NOBMI-NEXT:    retq
1251 ; X64-BMI1NOTBM-LABEL: bextr64_a3_load_indexzext:
1252 ; X64-BMI1NOTBM:       # %bb.0:
1253 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
1254 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
1255 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
1256 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, (%rdi), %rax
1257 ; X64-BMI1NOTBM-NEXT:    retq
1259 ; X64-BMI1BMI2-LABEL: bextr64_a3_load_indexzext:
1260 ; X64-BMI1BMI2:       # %bb.0:
1261 ; X64-BMI1BMI2-NEXT:    # kill: def $edx killed $edx def $rdx
1262 ; X64-BMI1BMI2-NEXT:    # kill: def $esi killed $esi def $rsi
1263 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, (%rdi), %rax
1264 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
1265 ; X64-BMI1BMI2-NEXT:    retq
1266   %val = load i64, i64* %w
1267   %skip = zext i8 %numskipbits to i64
1268   %shifted = lshr i64 %val, %skip
1269   %conv = zext i8 %numlowbits to i64
1270   %onebit = shl i64 1, %conv
1271   %mask = add nsw i64 %onebit, -1
1272   %masked = and i64 %mask, %shifted
1273   ret i64 %masked
1276 define i64 @bextr64_a4_commutative(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
1277 ; X86-NOBMI-LABEL: bextr64_a4_commutative:
1278 ; X86-NOBMI:       # %bb.0:
1279 ; X86-NOBMI-NEXT:    pushl %edi
1280 ; X86-NOBMI-NEXT:    pushl %esi
1281 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch
1282 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
1283 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
1284 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
1285 ; X86-NOBMI-NEXT:    movl %esi, %edx
1286 ; X86-NOBMI-NEXT:    shrl %cl, %edx
1287 ; X86-NOBMI-NEXT:    shrdl %cl, %esi, %eax
1288 ; X86-NOBMI-NEXT:    testb $32, %cl
1289 ; X86-NOBMI-NEXT:    je .LBB12_2
1290 ; X86-NOBMI-NEXT:  # %bb.1:
1291 ; X86-NOBMI-NEXT:    movl %edx, %eax
1292 ; X86-NOBMI-NEXT:    xorl %edx, %edx
1293 ; X86-NOBMI-NEXT:  .LBB12_2:
1294 ; X86-NOBMI-NEXT:    movl $1, %esi
1295 ; X86-NOBMI-NEXT:    xorl %edi, %edi
1296 ; X86-NOBMI-NEXT:    movb %ch, %cl
1297 ; X86-NOBMI-NEXT:    shldl %cl, %esi, %edi
1298 ; X86-NOBMI-NEXT:    shll %cl, %esi
1299 ; X86-NOBMI-NEXT:    testb $32, %ch
1300 ; X86-NOBMI-NEXT:    je .LBB12_4
1301 ; X86-NOBMI-NEXT:  # %bb.3:
1302 ; X86-NOBMI-NEXT:    movl %esi, %edi
1303 ; X86-NOBMI-NEXT:    xorl %esi, %esi
1304 ; X86-NOBMI-NEXT:  .LBB12_4:
1305 ; X86-NOBMI-NEXT:    addl $-1, %esi
1306 ; X86-NOBMI-NEXT:    adcl $-1, %edi
1307 ; X86-NOBMI-NEXT:    andl %esi, %eax
1308 ; X86-NOBMI-NEXT:    andl %edi, %edx
1309 ; X86-NOBMI-NEXT:    popl %esi
1310 ; X86-NOBMI-NEXT:    popl %edi
1311 ; X86-NOBMI-NEXT:    retl
1313 ; X86-BMI1NOTBM-LABEL: bextr64_a4_commutative:
1314 ; X86-BMI1NOTBM:       # %bb.0:
1315 ; X86-BMI1NOTBM-NEXT:    pushl %edi
1316 ; X86-BMI1NOTBM-NEXT:    pushl %esi
1317 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %ch
1318 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
1319 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
1320 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
1321 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
1322 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
1323 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %esi, %eax
1324 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
1325 ; X86-BMI1NOTBM-NEXT:    je .LBB12_2
1326 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
1327 ; X86-BMI1NOTBM-NEXT:    movl %edx, %eax
1328 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
1329 ; X86-BMI1NOTBM-NEXT:  .LBB12_2:
1330 ; X86-BMI1NOTBM-NEXT:    movl $1, %esi
1331 ; X86-BMI1NOTBM-NEXT:    xorl %edi, %edi
1332 ; X86-BMI1NOTBM-NEXT:    movb %ch, %cl
1333 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %esi, %edi
1334 ; X86-BMI1NOTBM-NEXT:    shll %cl, %esi
1335 ; X86-BMI1NOTBM-NEXT:    testb $32, %ch
1336 ; X86-BMI1NOTBM-NEXT:    je .LBB12_4
1337 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
1338 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edi
1339 ; X86-BMI1NOTBM-NEXT:    xorl %esi, %esi
1340 ; X86-BMI1NOTBM-NEXT:  .LBB12_4:
1341 ; X86-BMI1NOTBM-NEXT:    addl $-1, %esi
1342 ; X86-BMI1NOTBM-NEXT:    adcl $-1, %edi
1343 ; X86-BMI1NOTBM-NEXT:    andl %esi, %eax
1344 ; X86-BMI1NOTBM-NEXT:    andl %edi, %edx
1345 ; X86-BMI1NOTBM-NEXT:    popl %esi
1346 ; X86-BMI1NOTBM-NEXT:    popl %edi
1347 ; X86-BMI1NOTBM-NEXT:    retl
1349 ; X86-BMI1BMI2-LABEL: bextr64_a4_commutative:
1350 ; X86-BMI1BMI2:       # %bb.0:
1351 ; X86-BMI1BMI2-NEXT:    pushl %ebx
1352 ; X86-BMI1BMI2-NEXT:    pushl %edi
1353 ; X86-BMI1BMI2-NEXT:    pushl %esi
1354 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
1355 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
1356 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1357 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
1358 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edx, %eax
1359 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edx, %edx
1360 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
1361 ; X86-BMI1BMI2-NEXT:    je .LBB12_2
1362 ; X86-BMI1BMI2-NEXT:  # %bb.1:
1363 ; X86-BMI1BMI2-NEXT:    movl %edx, %eax
1364 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
1365 ; X86-BMI1BMI2-NEXT:  .LBB12_2:
1366 ; X86-BMI1BMI2-NEXT:    movl $1, %edi
1367 ; X86-BMI1BMI2-NEXT:    xorl %esi, %esi
1368 ; X86-BMI1BMI2-NEXT:    movl %ebx, %ecx
1369 ; X86-BMI1BMI2-NEXT:    shldl %cl, %edi, %esi
1370 ; X86-BMI1BMI2-NEXT:    shlxl %ebx, %edi, %ecx
1371 ; X86-BMI1BMI2-NEXT:    testb $32, %bl
1372 ; X86-BMI1BMI2-NEXT:    je .LBB12_4
1373 ; X86-BMI1BMI2-NEXT:  # %bb.3:
1374 ; X86-BMI1BMI2-NEXT:    movl %ecx, %esi
1375 ; X86-BMI1BMI2-NEXT:    xorl %ecx, %ecx
1376 ; X86-BMI1BMI2-NEXT:  .LBB12_4:
1377 ; X86-BMI1BMI2-NEXT:    addl $-1, %ecx
1378 ; X86-BMI1BMI2-NEXT:    adcl $-1, %esi
1379 ; X86-BMI1BMI2-NEXT:    andl %ecx, %eax
1380 ; X86-BMI1BMI2-NEXT:    andl %esi, %edx
1381 ; X86-BMI1BMI2-NEXT:    popl %esi
1382 ; X86-BMI1BMI2-NEXT:    popl %edi
1383 ; X86-BMI1BMI2-NEXT:    popl %ebx
1384 ; X86-BMI1BMI2-NEXT:    retl
1386 ; X64-NOBMI-LABEL: bextr64_a4_commutative:
1387 ; X64-NOBMI:       # %bb.0:
1388 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
1389 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
1390 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
1391 ; X64-NOBMI-NEXT:    movl $1, %eax
1392 ; X64-NOBMI-NEXT:    movl %edx, %ecx
1393 ; X64-NOBMI-NEXT:    shlq %cl, %rax
1394 ; X64-NOBMI-NEXT:    decq %rax
1395 ; X64-NOBMI-NEXT:    andq %rdi, %rax
1396 ; X64-NOBMI-NEXT:    retq
1398 ; X64-BMI1NOTBM-LABEL: bextr64_a4_commutative:
1399 ; X64-BMI1NOTBM:       # %bb.0:
1400 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
1401 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
1402 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
1403 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
1404 ; X64-BMI1NOTBM-NEXT:    retq
1406 ; X64-BMI1BMI2-LABEL: bextr64_a4_commutative:
1407 ; X64-BMI1BMI2:       # %bb.0:
1408 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
1409 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
1410 ; X64-BMI1BMI2-NEXT:    retq
1411   %shifted = lshr i64 %val, %numskipbits
1412   %onebit = shl i64 1, %numlowbits
1413   %mask = add nsw i64 %onebit, -1
1414   %masked = and i64 %shifted, %mask ; swapped order
1415   ret i64 %masked
1418 define i64 @bextr64_a5_skipextrauses(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
1419 ; X86-NOBMI-LABEL: bextr64_a5_skipextrauses:
1420 ; X86-NOBMI:       # %bb.0:
1421 ; X86-NOBMI-NEXT:    pushl %ebp
1422 ; X86-NOBMI-NEXT:    pushl %ebx
1423 ; X86-NOBMI-NEXT:    pushl %edi
1424 ; X86-NOBMI-NEXT:    pushl %esi
1425 ; X86-NOBMI-NEXT:    subl $12, %esp
1426 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
1427 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ebx
1428 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
1429 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
1430 ; X86-NOBMI-NEXT:    movl %esi, %ebp
1431 ; X86-NOBMI-NEXT:    movl %eax, %ecx
1432 ; X86-NOBMI-NEXT:    shrl %cl, %ebp
1433 ; X86-NOBMI-NEXT:    shrdl %cl, %esi, %ebx
1434 ; X86-NOBMI-NEXT:    testb $32, %al
1435 ; X86-NOBMI-NEXT:    je .LBB13_2
1436 ; X86-NOBMI-NEXT:  # %bb.1:
1437 ; X86-NOBMI-NEXT:    movl %ebp, %ebx
1438 ; X86-NOBMI-NEXT:    xorl %ebp, %ebp
1439 ; X86-NOBMI-NEXT:  .LBB13_2:
1440 ; X86-NOBMI-NEXT:    movl $1, %esi
1441 ; X86-NOBMI-NEXT:    xorl %edi, %edi
1442 ; X86-NOBMI-NEXT:    movl %edx, %ecx
1443 ; X86-NOBMI-NEXT:    shldl %cl, %esi, %edi
1444 ; X86-NOBMI-NEXT:    shll %cl, %esi
1445 ; X86-NOBMI-NEXT:    testb $32, %dl
1446 ; X86-NOBMI-NEXT:    je .LBB13_4
1447 ; X86-NOBMI-NEXT:  # %bb.3:
1448 ; X86-NOBMI-NEXT:    movl %esi, %edi
1449 ; X86-NOBMI-NEXT:    xorl %esi, %esi
1450 ; X86-NOBMI-NEXT:  .LBB13_4:
1451 ; X86-NOBMI-NEXT:    addl $-1, %esi
1452 ; X86-NOBMI-NEXT:    adcl $-1, %edi
1453 ; X86-NOBMI-NEXT:    andl %ebx, %esi
1454 ; X86-NOBMI-NEXT:    andl %ebp, %edi
1455 ; X86-NOBMI-NEXT:    subl $8, %esp
1456 ; X86-NOBMI-NEXT:    pushl {{[0-9]+}}(%esp)
1457 ; X86-NOBMI-NEXT:    pushl %eax
1458 ; X86-NOBMI-NEXT:    calll use64
1459 ; X86-NOBMI-NEXT:    addl $16, %esp
1460 ; X86-NOBMI-NEXT:    movl %esi, %eax
1461 ; X86-NOBMI-NEXT:    movl %edi, %edx
1462 ; X86-NOBMI-NEXT:    addl $12, %esp
1463 ; X86-NOBMI-NEXT:    popl %esi
1464 ; X86-NOBMI-NEXT:    popl %edi
1465 ; X86-NOBMI-NEXT:    popl %ebx
1466 ; X86-NOBMI-NEXT:    popl %ebp
1467 ; X86-NOBMI-NEXT:    retl
1469 ; X86-BMI1NOTBM-LABEL: bextr64_a5_skipextrauses:
1470 ; X86-BMI1NOTBM:       # %bb.0:
1471 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
1472 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
1473 ; X86-BMI1NOTBM-NEXT:    pushl %edi
1474 ; X86-BMI1NOTBM-NEXT:    pushl %esi
1475 ; X86-BMI1NOTBM-NEXT:    subl $12, %esp
1476 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %dl
1477 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %ebx
1478 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
1479 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
1480 ; X86-BMI1NOTBM-NEXT:    movl %esi, %ebp
1481 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ecx
1482 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %ebp
1483 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %esi, %ebx
1484 ; X86-BMI1NOTBM-NEXT:    testb $32, %al
1485 ; X86-BMI1NOTBM-NEXT:    je .LBB13_2
1486 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
1487 ; X86-BMI1NOTBM-NEXT:    movl %ebp, %ebx
1488 ; X86-BMI1NOTBM-NEXT:    xorl %ebp, %ebp
1489 ; X86-BMI1NOTBM-NEXT:  .LBB13_2:
1490 ; X86-BMI1NOTBM-NEXT:    movl $1, %esi
1491 ; X86-BMI1NOTBM-NEXT:    xorl %edi, %edi
1492 ; X86-BMI1NOTBM-NEXT:    movl %edx, %ecx
1493 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %esi, %edi
1494 ; X86-BMI1NOTBM-NEXT:    shll %cl, %esi
1495 ; X86-BMI1NOTBM-NEXT:    testb $32, %dl
1496 ; X86-BMI1NOTBM-NEXT:    je .LBB13_4
1497 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
1498 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edi
1499 ; X86-BMI1NOTBM-NEXT:    xorl %esi, %esi
1500 ; X86-BMI1NOTBM-NEXT:  .LBB13_4:
1501 ; X86-BMI1NOTBM-NEXT:    addl $-1, %esi
1502 ; X86-BMI1NOTBM-NEXT:    adcl $-1, %edi
1503 ; X86-BMI1NOTBM-NEXT:    andl %ebx, %esi
1504 ; X86-BMI1NOTBM-NEXT:    andl %ebp, %edi
1505 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
1506 ; X86-BMI1NOTBM-NEXT:    pushl {{[0-9]+}}(%esp)
1507 ; X86-BMI1NOTBM-NEXT:    pushl %eax
1508 ; X86-BMI1NOTBM-NEXT:    calll use64
1509 ; X86-BMI1NOTBM-NEXT:    addl $16, %esp
1510 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
1511 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
1512 ; X86-BMI1NOTBM-NEXT:    addl $12, %esp
1513 ; X86-BMI1NOTBM-NEXT:    popl %esi
1514 ; X86-BMI1NOTBM-NEXT:    popl %edi
1515 ; X86-BMI1NOTBM-NEXT:    popl %ebx
1516 ; X86-BMI1NOTBM-NEXT:    popl %ebp
1517 ; X86-BMI1NOTBM-NEXT:    retl
1519 ; X86-BMI1BMI2-LABEL: bextr64_a5_skipextrauses:
1520 ; X86-BMI1BMI2:       # %bb.0:
1521 ; X86-BMI1BMI2-NEXT:    pushl %ebp
1522 ; X86-BMI1BMI2-NEXT:    pushl %ebx
1523 ; X86-BMI1BMI2-NEXT:    pushl %edi
1524 ; X86-BMI1BMI2-NEXT:    pushl %esi
1525 ; X86-BMI1BMI2-NEXT:    subl $12, %esp
1526 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %dl
1527 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ebx
1528 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
1529 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1530 ; X86-BMI1BMI2-NEXT:    movl %eax, %ecx
1531 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %ebx
1532 ; X86-BMI1BMI2-NEXT:    shrxl %eax, %esi, %ebp
1533 ; X86-BMI1BMI2-NEXT:    testb $32, %al
1534 ; X86-BMI1BMI2-NEXT:    je .LBB13_2
1535 ; X86-BMI1BMI2-NEXT:  # %bb.1:
1536 ; X86-BMI1BMI2-NEXT:    movl %ebp, %ebx
1537 ; X86-BMI1BMI2-NEXT:    xorl %ebp, %ebp
1538 ; X86-BMI1BMI2-NEXT:  .LBB13_2:
1539 ; X86-BMI1BMI2-NEXT:    movl $1, %edi
1540 ; X86-BMI1BMI2-NEXT:    xorl %esi, %esi
1541 ; X86-BMI1BMI2-NEXT:    movl %edx, %ecx
1542 ; X86-BMI1BMI2-NEXT:    shldl %cl, %edi, %esi
1543 ; X86-BMI1BMI2-NEXT:    shlxl %edx, %edi, %edi
1544 ; X86-BMI1BMI2-NEXT:    testb $32, %dl
1545 ; X86-BMI1BMI2-NEXT:    je .LBB13_4
1546 ; X86-BMI1BMI2-NEXT:  # %bb.3:
1547 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
1548 ; X86-BMI1BMI2-NEXT:    xorl %edi, %edi
1549 ; X86-BMI1BMI2-NEXT:  .LBB13_4:
1550 ; X86-BMI1BMI2-NEXT:    addl $-1, %edi
1551 ; X86-BMI1BMI2-NEXT:    adcl $-1, %esi
1552 ; X86-BMI1BMI2-NEXT:    andl %ebx, %edi
1553 ; X86-BMI1BMI2-NEXT:    andl %ebp, %esi
1554 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
1555 ; X86-BMI1BMI2-NEXT:    pushl {{[0-9]+}}(%esp)
1556 ; X86-BMI1BMI2-NEXT:    pushl %eax
1557 ; X86-BMI1BMI2-NEXT:    calll use64
1558 ; X86-BMI1BMI2-NEXT:    addl $16, %esp
1559 ; X86-BMI1BMI2-NEXT:    movl %edi, %eax
1560 ; X86-BMI1BMI2-NEXT:    movl %esi, %edx
1561 ; X86-BMI1BMI2-NEXT:    addl $12, %esp
1562 ; X86-BMI1BMI2-NEXT:    popl %esi
1563 ; X86-BMI1BMI2-NEXT:    popl %edi
1564 ; X86-BMI1BMI2-NEXT:    popl %ebx
1565 ; X86-BMI1BMI2-NEXT:    popl %ebp
1566 ; X86-BMI1BMI2-NEXT:    retl
1568 ; X64-NOBMI-LABEL: bextr64_a5_skipextrauses:
1569 ; X64-NOBMI:       # %bb.0:
1570 ; X64-NOBMI-NEXT:    pushq %rbx
1571 ; X64-NOBMI-NEXT:    movl %esi, %ecx
1572 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
1573 ; X64-NOBMI-NEXT:    movl $1, %ebx
1574 ; X64-NOBMI-NEXT:    movl %edx, %ecx
1575 ; X64-NOBMI-NEXT:    shlq %cl, %rbx
1576 ; X64-NOBMI-NEXT:    decq %rbx
1577 ; X64-NOBMI-NEXT:    andq %rdi, %rbx
1578 ; X64-NOBMI-NEXT:    movq %rsi, %rdi
1579 ; X64-NOBMI-NEXT:    callq use64
1580 ; X64-NOBMI-NEXT:    movq %rbx, %rax
1581 ; X64-NOBMI-NEXT:    popq %rbx
1582 ; X64-NOBMI-NEXT:    retq
1584 ; X64-BMI1NOTBM-LABEL: bextr64_a5_skipextrauses:
1585 ; X64-BMI1NOTBM:       # %bb.0:
1586 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
1587 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
1588 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
1589 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
1590 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rbx
1591 ; X64-BMI1NOTBM-NEXT:    movq %rsi, %rdi
1592 ; X64-BMI1NOTBM-NEXT:    callq use64
1593 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rax
1594 ; X64-BMI1NOTBM-NEXT:    popq %rbx
1595 ; X64-BMI1NOTBM-NEXT:    retq
1597 ; X64-BMI1BMI2-LABEL: bextr64_a5_skipextrauses:
1598 ; X64-BMI1BMI2:       # %bb.0:
1599 ; X64-BMI1BMI2-NEXT:    pushq %rbx
1600 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
1601 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rbx
1602 ; X64-BMI1BMI2-NEXT:    movq %rsi, %rdi
1603 ; X64-BMI1BMI2-NEXT:    callq use64
1604 ; X64-BMI1BMI2-NEXT:    movq %rbx, %rax
1605 ; X64-BMI1BMI2-NEXT:    popq %rbx
1606 ; X64-BMI1BMI2-NEXT:    retq
1607   %shifted = lshr i64 %val, %numskipbits
1608   %onebit = shl i64 1, %numlowbits
1609   %mask = add nsw i64 %onebit, -1
1610   %masked = and i64 %mask, %shifted
1611   call void @use64(i64 %numskipbits)
1612   ret i64 %masked
1615 ; 64-bit, but with 32-bit output
1617 ; Everything done in 64-bit, truncation happens last.
1618 define i32 @bextr64_32_a0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
1619 ; X86-NOBMI-LABEL: bextr64_32_a0:
1620 ; X86-NOBMI:       # %bb.0:
1621 ; X86-NOBMI-NEXT:    pushl %edi
1622 ; X86-NOBMI-NEXT:    pushl %esi
1623 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
1624 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
1625 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
1626 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
1627 ; X86-NOBMI-NEXT:    movl %edi, %esi
1628 ; X86-NOBMI-NEXT:    shrl %cl, %esi
1629 ; X86-NOBMI-NEXT:    shrdl %cl, %edi, %eax
1630 ; X86-NOBMI-NEXT:    testb $32, %cl
1631 ; X86-NOBMI-NEXT:    jne .LBB14_2
1632 ; X86-NOBMI-NEXT:  # %bb.1:
1633 ; X86-NOBMI-NEXT:    movl %eax, %esi
1634 ; X86-NOBMI-NEXT:  .LBB14_2:
1635 ; X86-NOBMI-NEXT:    movl $1, %edi
1636 ; X86-NOBMI-NEXT:    movl %edx, %ecx
1637 ; X86-NOBMI-NEXT:    shll %cl, %edi
1638 ; X86-NOBMI-NEXT:    xorl %eax, %eax
1639 ; X86-NOBMI-NEXT:    testb $32, %dl
1640 ; X86-NOBMI-NEXT:    jne .LBB14_4
1641 ; X86-NOBMI-NEXT:  # %bb.3:
1642 ; X86-NOBMI-NEXT:    movl %edi, %eax
1643 ; X86-NOBMI-NEXT:  .LBB14_4:
1644 ; X86-NOBMI-NEXT:    decl %eax
1645 ; X86-NOBMI-NEXT:    andl %esi, %eax
1646 ; X86-NOBMI-NEXT:    popl %esi
1647 ; X86-NOBMI-NEXT:    popl %edi
1648 ; X86-NOBMI-NEXT:    retl
1650 ; X86-BMI1NOTBM-LABEL: bextr64_32_a0:
1651 ; X86-BMI1NOTBM:       # %bb.0:
1652 ; X86-BMI1NOTBM-NEXT:    pushl %edi
1653 ; X86-BMI1NOTBM-NEXT:    pushl %esi
1654 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %dl
1655 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
1656 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
1657 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
1658 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
1659 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %esi
1660 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %eax
1661 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
1662 ; X86-BMI1NOTBM-NEXT:    jne .LBB14_2
1663 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
1664 ; X86-BMI1NOTBM-NEXT:    movl %eax, %esi
1665 ; X86-BMI1NOTBM-NEXT:  .LBB14_2:
1666 ; X86-BMI1NOTBM-NEXT:    movl $1, %edi
1667 ; X86-BMI1NOTBM-NEXT:    movl %edx, %ecx
1668 ; X86-BMI1NOTBM-NEXT:    shll %cl, %edi
1669 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
1670 ; X86-BMI1NOTBM-NEXT:    testb $32, %dl
1671 ; X86-BMI1NOTBM-NEXT:    jne .LBB14_4
1672 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
1673 ; X86-BMI1NOTBM-NEXT:    movl %edi, %eax
1674 ; X86-BMI1NOTBM-NEXT:  .LBB14_4:
1675 ; X86-BMI1NOTBM-NEXT:    decl %eax
1676 ; X86-BMI1NOTBM-NEXT:    andl %esi, %eax
1677 ; X86-BMI1NOTBM-NEXT:    popl %esi
1678 ; X86-BMI1NOTBM-NEXT:    popl %edi
1679 ; X86-BMI1NOTBM-NEXT:    retl
1681 ; X86-BMI1BMI2-LABEL: bextr64_32_a0:
1682 ; X86-BMI1BMI2:       # %bb.0:
1683 ; X86-BMI1BMI2-NEXT:    pushl %ebx
1684 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
1685 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
1686 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
1687 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1688 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %edx
1689 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
1690 ; X86-BMI1BMI2-NEXT:    je .LBB14_2
1691 ; X86-BMI1BMI2-NEXT:  # %bb.1:
1692 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edx
1693 ; X86-BMI1BMI2-NEXT:  .LBB14_2:
1694 ; X86-BMI1BMI2-NEXT:    xorl %eax, %eax
1695 ; X86-BMI1BMI2-NEXT:    testb $32, %bl
1696 ; X86-BMI1BMI2-NEXT:    jne .LBB14_4
1697 ; X86-BMI1BMI2-NEXT:  # %bb.3:
1698 ; X86-BMI1BMI2-NEXT:    movl $1, %eax
1699 ; X86-BMI1BMI2-NEXT:    shlxl %ebx, %eax, %eax
1700 ; X86-BMI1BMI2-NEXT:  .LBB14_4:
1701 ; X86-BMI1BMI2-NEXT:    decl %eax
1702 ; X86-BMI1BMI2-NEXT:    andl %edx, %eax
1703 ; X86-BMI1BMI2-NEXT:    popl %ebx
1704 ; X86-BMI1BMI2-NEXT:    retl
1706 ; X64-NOBMI-LABEL: bextr64_32_a0:
1707 ; X64-NOBMI:       # %bb.0:
1708 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
1709 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
1710 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
1711 ; X64-NOBMI-NEXT:    movl $1, %eax
1712 ; X64-NOBMI-NEXT:    movl %edx, %ecx
1713 ; X64-NOBMI-NEXT:    shlq %cl, %rax
1714 ; X64-NOBMI-NEXT:    decl %eax
1715 ; X64-NOBMI-NEXT:    andl %edi, %eax
1716 ; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax
1717 ; X64-NOBMI-NEXT:    retq
1719 ; X64-BMI1NOTBM-LABEL: bextr64_32_a0:
1720 ; X64-BMI1NOTBM:       # %bb.0:
1721 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
1722 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
1723 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
1724 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
1725 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
1726 ; X64-BMI1NOTBM-NEXT:    retq
1728 ; X64-BMI1BMI2-LABEL: bextr64_32_a0:
1729 ; X64-BMI1BMI2:       # %bb.0:
1730 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
1731 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
1732 ; X64-BMI1BMI2-NEXT:    retq
1733   %shifted = lshr i64 %val, %numskipbits
1734   %onebit = shl i64 1, %numlowbits
1735   %mask = add nsw i64 %onebit, -1
1736   %masked = and i64 %mask, %shifted
1737   %res = trunc i64 %masked to i32
1738   ret i32 %res
1741 ; Shifting happens in 64-bit, then truncation. Masking is 32-bit.
1742 define i32 @bextr64_32_a1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {
1743 ; X86-NOBMI-LABEL: bextr64_32_a1:
1744 ; X86-NOBMI:       # %bb.0:
1745 ; X86-NOBMI-NEXT:    pushl %edi
1746 ; X86-NOBMI-NEXT:    pushl %esi
1747 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
1748 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
1749 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
1750 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
1751 ; X86-NOBMI-NEXT:    movl %edi, %esi
1752 ; X86-NOBMI-NEXT:    shrl %cl, %esi
1753 ; X86-NOBMI-NEXT:    shrdl %cl, %edi, %eax
1754 ; X86-NOBMI-NEXT:    testb $32, %cl
1755 ; X86-NOBMI-NEXT:    jne .LBB15_2
1756 ; X86-NOBMI-NEXT:  # %bb.1:
1757 ; X86-NOBMI-NEXT:    movl %eax, %esi
1758 ; X86-NOBMI-NEXT:  .LBB15_2:
1759 ; X86-NOBMI-NEXT:    movl $1, %eax
1760 ; X86-NOBMI-NEXT:    movl %edx, %ecx
1761 ; X86-NOBMI-NEXT:    shll %cl, %eax
1762 ; X86-NOBMI-NEXT:    decl %eax
1763 ; X86-NOBMI-NEXT:    andl %esi, %eax
1764 ; X86-NOBMI-NEXT:    popl %esi
1765 ; X86-NOBMI-NEXT:    popl %edi
1766 ; X86-NOBMI-NEXT:    retl
1768 ; X86-BMI1NOTBM-LABEL: bextr64_32_a1:
1769 ; X86-BMI1NOTBM:       # %bb.0:
1770 ; X86-BMI1NOTBM-NEXT:    pushl %edi
1771 ; X86-BMI1NOTBM-NEXT:    pushl %esi
1772 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
1773 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
1774 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
1775 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
1776 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
1777 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
1778 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
1779 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
1780 ; X86-BMI1NOTBM-NEXT:    jne .LBB15_2
1781 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
1782 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
1783 ; X86-BMI1NOTBM-NEXT:  .LBB15_2:
1784 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
1785 ; X86-BMI1NOTBM-NEXT:    bextrl %eax, %edx, %eax
1786 ; X86-BMI1NOTBM-NEXT:    popl %esi
1787 ; X86-BMI1NOTBM-NEXT:    popl %edi
1788 ; X86-BMI1NOTBM-NEXT:    retl
1790 ; X86-BMI1BMI2-LABEL: bextr64_32_a1:
1791 ; X86-BMI1BMI2:       # %bb.0:
1792 ; X86-BMI1BMI2-NEXT:    pushl %esi
1793 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
1794 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
1795 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
1796 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
1797 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edx
1798 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
1799 ; X86-BMI1BMI2-NEXT:    je .LBB15_2
1800 ; X86-BMI1BMI2-NEXT:  # %bb.1:
1801 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %edx
1802 ; X86-BMI1BMI2-NEXT:  .LBB15_2:
1803 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %edx, %eax
1804 ; X86-BMI1BMI2-NEXT:    popl %esi
1805 ; X86-BMI1BMI2-NEXT:    retl
1807 ; X64-NOBMI-LABEL: bextr64_32_a1:
1808 ; X64-NOBMI:       # %bb.0:
1809 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
1810 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
1811 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
1812 ; X64-NOBMI-NEXT:    movl $1, %eax
1813 ; X64-NOBMI-NEXT:    movl %edx, %ecx
1814 ; X64-NOBMI-NEXT:    shll %cl, %eax
1815 ; X64-NOBMI-NEXT:    decl %eax
1816 ; X64-NOBMI-NEXT:    andl %edi, %eax
1817 ; X64-NOBMI-NEXT:    retq
1819 ; X64-BMI1NOTBM-LABEL: bextr64_32_a1:
1820 ; X64-BMI1NOTBM:       # %bb.0:
1821 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
1822 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
1823 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
1824 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
1825 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
1826 ; X64-BMI1NOTBM-NEXT:    retq
1828 ; X64-BMI1BMI2-LABEL: bextr64_32_a1:
1829 ; X64-BMI1BMI2:       # %bb.0:
1830 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
1831 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
1832 ; X64-BMI1BMI2-NEXT:    retq
1833   %shifted = lshr i64 %val, %numskipbits
1834   %truncshifted = trunc i64 %shifted to i32
1835   %onebit = shl i32 1, %numlowbits
1836   %mask = add nsw i32 %onebit, -1
1837   %masked = and i32 %mask, %truncshifted
1838   ret i32 %masked
1841 ; Shifting happens in 64-bit, then truncation (with extra use).
1842 ; Masking is 32-bit.
1843 define i32 @bextr64_32_a1_trunc_extrause(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {
1844 ; X86-NOBMI-LABEL: bextr64_32_a1_trunc_extrause:
1845 ; X86-NOBMI:       # %bb.0:
1846 ; X86-NOBMI-NEXT:    pushl %ebx
1847 ; X86-NOBMI-NEXT:    pushl %esi
1848 ; X86-NOBMI-NEXT:    pushl %eax
1849 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %bl
1850 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
1851 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
1852 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx
1853 ; X86-NOBMI-NEXT:    movl %edx, %esi
1854 ; X86-NOBMI-NEXT:    shrl %cl, %esi
1855 ; X86-NOBMI-NEXT:    shrdl %cl, %edx, %eax
1856 ; X86-NOBMI-NEXT:    testb $32, %cl
1857 ; X86-NOBMI-NEXT:    jne .LBB16_2
1858 ; X86-NOBMI-NEXT:  # %bb.1:
1859 ; X86-NOBMI-NEXT:    movl %eax, %esi
1860 ; X86-NOBMI-NEXT:  .LBB16_2:
1861 ; X86-NOBMI-NEXT:    movl %esi, (%esp)
1862 ; X86-NOBMI-NEXT:    calll use32
1863 ; X86-NOBMI-NEXT:    movl $1, %eax
1864 ; X86-NOBMI-NEXT:    movl %ebx, %ecx
1865 ; X86-NOBMI-NEXT:    shll %cl, %eax
1866 ; X86-NOBMI-NEXT:    decl %eax
1867 ; X86-NOBMI-NEXT:    andl %esi, %eax
1868 ; X86-NOBMI-NEXT:    addl $4, %esp
1869 ; X86-NOBMI-NEXT:    popl %esi
1870 ; X86-NOBMI-NEXT:    popl %ebx
1871 ; X86-NOBMI-NEXT:    retl
1873 ; X86-BMI1NOTBM-LABEL: bextr64_32_a1_trunc_extrause:
1874 ; X86-BMI1NOTBM:       # %bb.0:
1875 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
1876 ; X86-BMI1NOTBM-NEXT:    pushl %esi
1877 ; X86-BMI1NOTBM-NEXT:    pushl %eax
1878 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %bl
1879 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
1880 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
1881 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edx
1882 ; X86-BMI1NOTBM-NEXT:    movl %edx, %esi
1883 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %esi
1884 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edx, %eax
1885 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
1886 ; X86-BMI1NOTBM-NEXT:    jne .LBB16_2
1887 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
1888 ; X86-BMI1NOTBM-NEXT:    movl %eax, %esi
1889 ; X86-BMI1NOTBM-NEXT:  .LBB16_2:
1890 ; X86-BMI1NOTBM-NEXT:    movl %esi, (%esp)
1891 ; X86-BMI1NOTBM-NEXT:    calll use32
1892 ; X86-BMI1NOTBM-NEXT:    shll $8, %ebx
1893 ; X86-BMI1NOTBM-NEXT:    bextrl %ebx, %esi, %eax
1894 ; X86-BMI1NOTBM-NEXT:    addl $4, %esp
1895 ; X86-BMI1NOTBM-NEXT:    popl %esi
1896 ; X86-BMI1NOTBM-NEXT:    popl %ebx
1897 ; X86-BMI1NOTBM-NEXT:    retl
1899 ; X86-BMI1BMI2-LABEL: bextr64_32_a1_trunc_extrause:
1900 ; X86-BMI1BMI2:       # %bb.0:
1901 ; X86-BMI1BMI2-NEXT:    pushl %ebx
1902 ; X86-BMI1BMI2-NEXT:    pushl %esi
1903 ; X86-BMI1BMI2-NEXT:    pushl %eax
1904 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
1905 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
1906 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
1907 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1908 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
1909 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
1910 ; X86-BMI1BMI2-NEXT:    je .LBB16_2
1911 ; X86-BMI1BMI2-NEXT:  # %bb.1:
1912 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %esi
1913 ; X86-BMI1BMI2-NEXT:  .LBB16_2:
1914 ; X86-BMI1BMI2-NEXT:    movl %esi, (%esp)
1915 ; X86-BMI1BMI2-NEXT:    calll use32
1916 ; X86-BMI1BMI2-NEXT:    bzhil %ebx, %esi, %eax
1917 ; X86-BMI1BMI2-NEXT:    addl $4, %esp
1918 ; X86-BMI1BMI2-NEXT:    popl %esi
1919 ; X86-BMI1BMI2-NEXT:    popl %ebx
1920 ; X86-BMI1BMI2-NEXT:    retl
1922 ; X64-NOBMI-LABEL: bextr64_32_a1_trunc_extrause:
1923 ; X64-NOBMI:       # %bb.0:
1924 ; X64-NOBMI-NEXT:    pushq %rbp
1925 ; X64-NOBMI-NEXT:    pushq %rbx
1926 ; X64-NOBMI-NEXT:    pushq %rax
1927 ; X64-NOBMI-NEXT:    movl %edx, %ebp
1928 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
1929 ; X64-NOBMI-NEXT:    movq %rdi, %rbx
1930 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
1931 ; X64-NOBMI-NEXT:    shrq %cl, %rbx
1932 ; X64-NOBMI-NEXT:    movl %ebx, %edi
1933 ; X64-NOBMI-NEXT:    callq use32
1934 ; X64-NOBMI-NEXT:    movl $1, %eax
1935 ; X64-NOBMI-NEXT:    movl %ebp, %ecx
1936 ; X64-NOBMI-NEXT:    shll %cl, %eax
1937 ; X64-NOBMI-NEXT:    decl %eax
1938 ; X64-NOBMI-NEXT:    andl %ebx, %eax
1939 ; X64-NOBMI-NEXT:    addq $8, %rsp
1940 ; X64-NOBMI-NEXT:    popq %rbx
1941 ; X64-NOBMI-NEXT:    popq %rbp
1942 ; X64-NOBMI-NEXT:    retq
1944 ; X64-BMI1NOTBM-LABEL: bextr64_32_a1_trunc_extrause:
1945 ; X64-BMI1NOTBM:       # %bb.0:
1946 ; X64-BMI1NOTBM-NEXT:    pushq %rbp
1947 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
1948 ; X64-BMI1NOTBM-NEXT:    pushq %rax
1949 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ebp
1950 ; X64-BMI1NOTBM-NEXT:    movq %rsi, %rcx
1951 ; X64-BMI1NOTBM-NEXT:    movq %rdi, %rbx
1952 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $rcx
1953 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %rbx
1954 ; X64-BMI1NOTBM-NEXT:    movl %ebx, %edi
1955 ; X64-BMI1NOTBM-NEXT:    callq use32
1956 ; X64-BMI1NOTBM-NEXT:    shll $8, %ebp
1957 ; X64-BMI1NOTBM-NEXT:    bextrl %ebp, %ebx, %eax
1958 ; X64-BMI1NOTBM-NEXT:    addq $8, %rsp
1959 ; X64-BMI1NOTBM-NEXT:    popq %rbx
1960 ; X64-BMI1NOTBM-NEXT:    popq %rbp
1961 ; X64-BMI1NOTBM-NEXT:    retq
1963 ; X64-BMI1BMI2-LABEL: bextr64_32_a1_trunc_extrause:
1964 ; X64-BMI1BMI2:       # %bb.0:
1965 ; X64-BMI1BMI2-NEXT:    pushq %rbp
1966 ; X64-BMI1BMI2-NEXT:    pushq %rbx
1967 ; X64-BMI1BMI2-NEXT:    pushq %rax
1968 ; X64-BMI1BMI2-NEXT:    movl %edx, %ebp
1969 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rbx
1970 ; X64-BMI1BMI2-NEXT:    movl %ebx, %edi
1971 ; X64-BMI1BMI2-NEXT:    callq use32
1972 ; X64-BMI1BMI2-NEXT:    bzhil %ebp, %ebx, %eax
1973 ; X64-BMI1BMI2-NEXT:    addq $8, %rsp
1974 ; X64-BMI1BMI2-NEXT:    popq %rbx
1975 ; X64-BMI1BMI2-NEXT:    popq %rbp
1976 ; X64-BMI1BMI2-NEXT:    retq
1977   %shifted = lshr i64 %val, %numskipbits
1978   %truncshifted = trunc i64 %shifted to i32
1979   call void @use32(i32 %truncshifted)
1980   %onebit = shl i32 1, %numlowbits
1981   %mask = add nsw i32 %onebit, -1
1982   %masked = and i32 %mask, %truncshifted
1983   ret i32 %masked
1986 ; Shifting happens in 64-bit. Mask is 32-bit, but extended to 64-bit.
1987 ; Masking is 64-bit. Then truncation.
1988 define i32 @bextr64_32_a2(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {
1989 ; X86-NOBMI-LABEL: bextr64_32_a2:
1990 ; X86-NOBMI:       # %bb.0:
1991 ; X86-NOBMI-NEXT:    pushl %edi
1992 ; X86-NOBMI-NEXT:    pushl %esi
1993 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
1994 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
1995 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
1996 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
1997 ; X86-NOBMI-NEXT:    movl %edi, %esi
1998 ; X86-NOBMI-NEXT:    shrl %cl, %esi
1999 ; X86-NOBMI-NEXT:    shrdl %cl, %edi, %eax
2000 ; X86-NOBMI-NEXT:    testb $32, %cl
2001 ; X86-NOBMI-NEXT:    jne .LBB17_2
2002 ; X86-NOBMI-NEXT:  # %bb.1:
2003 ; X86-NOBMI-NEXT:    movl %eax, %esi
2004 ; X86-NOBMI-NEXT:  .LBB17_2:
2005 ; X86-NOBMI-NEXT:    movl $1, %eax
2006 ; X86-NOBMI-NEXT:    movl %edx, %ecx
2007 ; X86-NOBMI-NEXT:    shll %cl, %eax
2008 ; X86-NOBMI-NEXT:    decl %eax
2009 ; X86-NOBMI-NEXT:    andl %esi, %eax
2010 ; X86-NOBMI-NEXT:    popl %esi
2011 ; X86-NOBMI-NEXT:    popl %edi
2012 ; X86-NOBMI-NEXT:    retl
2014 ; X86-BMI1NOTBM-LABEL: bextr64_32_a2:
2015 ; X86-BMI1NOTBM:       # %bb.0:
2016 ; X86-BMI1NOTBM-NEXT:    pushl %edi
2017 ; X86-BMI1NOTBM-NEXT:    pushl %esi
2018 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
2019 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
2020 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
2021 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
2022 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
2023 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
2024 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
2025 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
2026 ; X86-BMI1NOTBM-NEXT:    jne .LBB17_2
2027 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
2028 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
2029 ; X86-BMI1NOTBM-NEXT:  .LBB17_2:
2030 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
2031 ; X86-BMI1NOTBM-NEXT:    bextrl %eax, %edx, %eax
2032 ; X86-BMI1NOTBM-NEXT:    popl %esi
2033 ; X86-BMI1NOTBM-NEXT:    popl %edi
2034 ; X86-BMI1NOTBM-NEXT:    retl
2036 ; X86-BMI1BMI2-LABEL: bextr64_32_a2:
2037 ; X86-BMI1BMI2:       # %bb.0:
2038 ; X86-BMI1BMI2-NEXT:    pushl %esi
2039 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
2040 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
2041 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
2042 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
2043 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edx
2044 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
2045 ; X86-BMI1BMI2-NEXT:    je .LBB17_2
2046 ; X86-BMI1BMI2-NEXT:  # %bb.1:
2047 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %edx
2048 ; X86-BMI1BMI2-NEXT:  .LBB17_2:
2049 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %edx, %eax
2050 ; X86-BMI1BMI2-NEXT:    popl %esi
2051 ; X86-BMI1BMI2-NEXT:    retl
2053 ; X64-NOBMI-LABEL: bextr64_32_a2:
2054 ; X64-NOBMI:       # %bb.0:
2055 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
2056 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
2057 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
2058 ; X64-NOBMI-NEXT:    movl $1, %eax
2059 ; X64-NOBMI-NEXT:    movl %edx, %ecx
2060 ; X64-NOBMI-NEXT:    shll %cl, %eax
2061 ; X64-NOBMI-NEXT:    decl %eax
2062 ; X64-NOBMI-NEXT:    andl %edi, %eax
2063 ; X64-NOBMI-NEXT:    retq
2065 ; X64-BMI1NOTBM-LABEL: bextr64_32_a2:
2066 ; X64-BMI1NOTBM:       # %bb.0:
2067 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
2068 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
2069 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
2070 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
2071 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
2072 ; X64-BMI1NOTBM-NEXT:    retq
2074 ; X64-BMI1BMI2-LABEL: bextr64_32_a2:
2075 ; X64-BMI1BMI2:       # %bb.0:
2076 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
2077 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
2078 ; X64-BMI1BMI2-NEXT:    retq
2079   %shifted = lshr i64 %val, %numskipbits
2080   %onebit = shl i32 1, %numlowbits
2081   %mask = add nsw i32 %onebit, -1
2082   %zextmask = zext i32 %mask to i64
2083   %masked = and i64 %zextmask, %shifted
2084   %truncmasked = trunc i64 %masked to i32
2085   ret i32 %truncmasked
2088 ; Shifting happens in 64-bit. Mask is 32-bit, but calculated in 64-bit.
2089 ; Masking is 64-bit. Then truncation.
2090 define i32 @bextr64_32_a3(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
2091 ; X86-NOBMI-LABEL: bextr64_32_a3:
2092 ; X86-NOBMI:       # %bb.0:
2093 ; X86-NOBMI-NEXT:    pushl %edi
2094 ; X86-NOBMI-NEXT:    pushl %esi
2095 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
2096 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
2097 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
2098 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
2099 ; X86-NOBMI-NEXT:    movl %edi, %esi
2100 ; X86-NOBMI-NEXT:    shrl %cl, %esi
2101 ; X86-NOBMI-NEXT:    shrdl %cl, %edi, %eax
2102 ; X86-NOBMI-NEXT:    testb $32, %cl
2103 ; X86-NOBMI-NEXT:    jne .LBB18_2
2104 ; X86-NOBMI-NEXT:  # %bb.1:
2105 ; X86-NOBMI-NEXT:    movl %eax, %esi
2106 ; X86-NOBMI-NEXT:  .LBB18_2:
2107 ; X86-NOBMI-NEXT:    movl $1, %edi
2108 ; X86-NOBMI-NEXT:    movl %edx, %ecx
2109 ; X86-NOBMI-NEXT:    shll %cl, %edi
2110 ; X86-NOBMI-NEXT:    xorl %eax, %eax
2111 ; X86-NOBMI-NEXT:    testb $32, %dl
2112 ; X86-NOBMI-NEXT:    jne .LBB18_4
2113 ; X86-NOBMI-NEXT:  # %bb.3:
2114 ; X86-NOBMI-NEXT:    movl %edi, %eax
2115 ; X86-NOBMI-NEXT:  .LBB18_4:
2116 ; X86-NOBMI-NEXT:    decl %eax
2117 ; X86-NOBMI-NEXT:    andl %esi, %eax
2118 ; X86-NOBMI-NEXT:    popl %esi
2119 ; X86-NOBMI-NEXT:    popl %edi
2120 ; X86-NOBMI-NEXT:    retl
2122 ; X86-BMI1NOTBM-LABEL: bextr64_32_a3:
2123 ; X86-BMI1NOTBM:       # %bb.0:
2124 ; X86-BMI1NOTBM-NEXT:    pushl %edi
2125 ; X86-BMI1NOTBM-NEXT:    pushl %esi
2126 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %dl
2127 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
2128 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
2129 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
2130 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
2131 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %esi
2132 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %eax
2133 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
2134 ; X86-BMI1NOTBM-NEXT:    jne .LBB18_2
2135 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
2136 ; X86-BMI1NOTBM-NEXT:    movl %eax, %esi
2137 ; X86-BMI1NOTBM-NEXT:  .LBB18_2:
2138 ; X86-BMI1NOTBM-NEXT:    movl $1, %edi
2139 ; X86-BMI1NOTBM-NEXT:    movl %edx, %ecx
2140 ; X86-BMI1NOTBM-NEXT:    shll %cl, %edi
2141 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
2142 ; X86-BMI1NOTBM-NEXT:    testb $32, %dl
2143 ; X86-BMI1NOTBM-NEXT:    jne .LBB18_4
2144 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
2145 ; X86-BMI1NOTBM-NEXT:    movl %edi, %eax
2146 ; X86-BMI1NOTBM-NEXT:  .LBB18_4:
2147 ; X86-BMI1NOTBM-NEXT:    decl %eax
2148 ; X86-BMI1NOTBM-NEXT:    andl %esi, %eax
2149 ; X86-BMI1NOTBM-NEXT:    popl %esi
2150 ; X86-BMI1NOTBM-NEXT:    popl %edi
2151 ; X86-BMI1NOTBM-NEXT:    retl
2153 ; X86-BMI1BMI2-LABEL: bextr64_32_a3:
2154 ; X86-BMI1BMI2:       # %bb.0:
2155 ; X86-BMI1BMI2-NEXT:    pushl %ebx
2156 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
2157 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
2158 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
2159 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2160 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %edx
2161 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
2162 ; X86-BMI1BMI2-NEXT:    je .LBB18_2
2163 ; X86-BMI1BMI2-NEXT:  # %bb.1:
2164 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edx
2165 ; X86-BMI1BMI2-NEXT:  .LBB18_2:
2166 ; X86-BMI1BMI2-NEXT:    xorl %eax, %eax
2167 ; X86-BMI1BMI2-NEXT:    testb $32, %bl
2168 ; X86-BMI1BMI2-NEXT:    jne .LBB18_4
2169 ; X86-BMI1BMI2-NEXT:  # %bb.3:
2170 ; X86-BMI1BMI2-NEXT:    movl $1, %eax
2171 ; X86-BMI1BMI2-NEXT:    shlxl %ebx, %eax, %eax
2172 ; X86-BMI1BMI2-NEXT:  .LBB18_4:
2173 ; X86-BMI1BMI2-NEXT:    decl %eax
2174 ; X86-BMI1BMI2-NEXT:    andl %edx, %eax
2175 ; X86-BMI1BMI2-NEXT:    popl %ebx
2176 ; X86-BMI1BMI2-NEXT:    retl
2178 ; X64-NOBMI-LABEL: bextr64_32_a3:
2179 ; X64-NOBMI:       # %bb.0:
2180 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
2181 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
2182 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
2183 ; X64-NOBMI-NEXT:    movl $1, %eax
2184 ; X64-NOBMI-NEXT:    movl %edx, %ecx
2185 ; X64-NOBMI-NEXT:    shlq %cl, %rax
2186 ; X64-NOBMI-NEXT:    decl %eax
2187 ; X64-NOBMI-NEXT:    andl %edi, %eax
2188 ; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax
2189 ; X64-NOBMI-NEXT:    retq
2191 ; X64-BMI1NOTBM-LABEL: bextr64_32_a3:
2192 ; X64-BMI1NOTBM:       # %bb.0:
2193 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
2194 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
2195 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
2196 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
2197 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
2198 ; X64-BMI1NOTBM-NEXT:    retq
2200 ; X64-BMI1BMI2-LABEL: bextr64_32_a3:
2201 ; X64-BMI1BMI2:       # %bb.0:
2202 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
2203 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
2204 ; X64-BMI1BMI2-NEXT:    retq
2205   %shifted = lshr i64 %val, %numskipbits
2206   %onebit = shl i64 1, %numlowbits
2207   %mask = add nsw i64 %onebit, 4294967295
2208   %masked = and i64 %mask, %shifted
2209   %truncmasked = trunc i64 %masked to i32
2210   ret i32 %truncmasked
2213 ; ---------------------------------------------------------------------------- ;
2214 ; Pattern b. 32-bit
2215 ; ---------------------------------------------------------------------------- ;
2217 define i32 @bextr32_b0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
2218 ; X86-NOBMI-LABEL: bextr32_b0:
2219 ; X86-NOBMI:       # %bb.0:
2220 ; X86-NOBMI-NEXT:    pushl %esi
2221 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
2222 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
2223 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
2224 ; X86-NOBMI-NEXT:    shrl %cl, %esi
2225 ; X86-NOBMI-NEXT:    movl $-1, %eax
2226 ; X86-NOBMI-NEXT:    movl %edx, %ecx
2227 ; X86-NOBMI-NEXT:    shll %cl, %eax
2228 ; X86-NOBMI-NEXT:    notl %eax
2229 ; X86-NOBMI-NEXT:    andl %esi, %eax
2230 ; X86-NOBMI-NEXT:    popl %esi
2231 ; X86-NOBMI-NEXT:    retl
2233 ; X86-BMI1NOTBM-LABEL: bextr32_b0:
2234 ; X86-BMI1NOTBM:       # %bb.0:
2235 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
2236 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
2237 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
2238 ; X86-BMI1NOTBM-NEXT:    orl %eax, %ecx
2239 ; X86-BMI1NOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax
2240 ; X86-BMI1NOTBM-NEXT:    retl
2242 ; X86-BMI1BMI2-LABEL: bextr32_b0:
2243 ; X86-BMI1BMI2:       # %bb.0:
2244 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
2245 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
2246 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx
2247 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
2248 ; X86-BMI1BMI2-NEXT:    retl
2250 ; X64-NOBMI-LABEL: bextr32_b0:
2251 ; X64-NOBMI:       # %bb.0:
2252 ; X64-NOBMI-NEXT:    movl %esi, %ecx
2253 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
2254 ; X64-NOBMI-NEXT:    shrl %cl, %edi
2255 ; X64-NOBMI-NEXT:    movl $-1, %eax
2256 ; X64-NOBMI-NEXT:    movl %edx, %ecx
2257 ; X64-NOBMI-NEXT:    shll %cl, %eax
2258 ; X64-NOBMI-NEXT:    notl %eax
2259 ; X64-NOBMI-NEXT:    andl %edi, %eax
2260 ; X64-NOBMI-NEXT:    retq
2262 ; X64-BMI1NOTBM-LABEL: bextr32_b0:
2263 ; X64-BMI1NOTBM:       # %bb.0:
2264 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
2265 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
2266 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
2267 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %eax
2268 ; X64-BMI1NOTBM-NEXT:    retq
2270 ; X64-BMI1BMI2-LABEL: bextr32_b0:
2271 ; X64-BMI1BMI2:       # %bb.0:
2272 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %eax
2273 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
2274 ; X64-BMI1BMI2-NEXT:    retq
2275   %shifted = lshr i32 %val, %numskipbits
2276   %notmask = shl i32 -1, %numlowbits
2277   %mask = xor i32 %notmask, -1
2278   %masked = and i32 %mask, %shifted
2279   ret i32 %masked
2282 define i32 @bextr32_b1_indexzext(i32 %val, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {
2283 ; X86-NOBMI-LABEL: bextr32_b1_indexzext:
2284 ; X86-NOBMI:       # %bb.0:
2285 ; X86-NOBMI-NEXT:    pushl %esi
2286 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
2287 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
2288 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
2289 ; X86-NOBMI-NEXT:    shrl %cl, %esi
2290 ; X86-NOBMI-NEXT:    movl $-1, %eax
2291 ; X86-NOBMI-NEXT:    movl %edx, %ecx
2292 ; X86-NOBMI-NEXT:    shll %cl, %eax
2293 ; X86-NOBMI-NEXT:    notl %eax
2294 ; X86-NOBMI-NEXT:    andl %esi, %eax
2295 ; X86-NOBMI-NEXT:    popl %esi
2296 ; X86-NOBMI-NEXT:    retl
2298 ; X86-BMI1NOTBM-LABEL: bextr32_b1_indexzext:
2299 ; X86-BMI1NOTBM:       # %bb.0:
2300 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
2301 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
2302 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
2303 ; X86-BMI1NOTBM-NEXT:    orl %eax, %ecx
2304 ; X86-BMI1NOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax
2305 ; X86-BMI1NOTBM-NEXT:    retl
2307 ; X86-BMI1BMI2-LABEL: bextr32_b1_indexzext:
2308 ; X86-BMI1BMI2:       # %bb.0:
2309 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
2310 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
2311 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx
2312 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
2313 ; X86-BMI1BMI2-NEXT:    retl
2315 ; X64-NOBMI-LABEL: bextr32_b1_indexzext:
2316 ; X64-NOBMI:       # %bb.0:
2317 ; X64-NOBMI-NEXT:    movl %esi, %ecx
2318 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
2319 ; X64-NOBMI-NEXT:    shrl %cl, %edi
2320 ; X64-NOBMI-NEXT:    movl $-1, %eax
2321 ; X64-NOBMI-NEXT:    movl %edx, %ecx
2322 ; X64-NOBMI-NEXT:    shll %cl, %eax
2323 ; X64-NOBMI-NEXT:    notl %eax
2324 ; X64-NOBMI-NEXT:    andl %edi, %eax
2325 ; X64-NOBMI-NEXT:    retq
2327 ; X64-BMI1NOTBM-LABEL: bextr32_b1_indexzext:
2328 ; X64-BMI1NOTBM:       # %bb.0:
2329 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
2330 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
2331 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
2332 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %eax
2333 ; X64-BMI1NOTBM-NEXT:    retq
2335 ; X64-BMI1BMI2-LABEL: bextr32_b1_indexzext:
2336 ; X64-BMI1BMI2:       # %bb.0:
2337 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %eax
2338 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
2339 ; X64-BMI1BMI2-NEXT:    retq
2340   %skip = zext i8 %numskipbits to i32
2341   %shifted = lshr i32 %val, %skip
2342   %conv = zext i8 %numlowbits to i32
2343   %notmask = shl i32 -1, %conv
2344   %mask = xor i32 %notmask, -1
2345   %masked = and i32 %mask, %shifted
2346   ret i32 %masked
2349 define i32 @bextr32_b2_load(i32* %w, i32 %numskipbits, i32 %numlowbits) nounwind {
2350 ; X86-NOBMI-LABEL: bextr32_b2_load:
2351 ; X86-NOBMI:       # %bb.0:
2352 ; X86-NOBMI-NEXT:    pushl %esi
2353 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
2354 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
2355 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
2356 ; X86-NOBMI-NEXT:    movl (%eax), %esi
2357 ; X86-NOBMI-NEXT:    shrl %cl, %esi
2358 ; X86-NOBMI-NEXT:    movl $-1, %eax
2359 ; X86-NOBMI-NEXT:    movl %edx, %ecx
2360 ; X86-NOBMI-NEXT:    shll %cl, %eax
2361 ; X86-NOBMI-NEXT:    notl %eax
2362 ; X86-NOBMI-NEXT:    andl %esi, %eax
2363 ; X86-NOBMI-NEXT:    popl %esi
2364 ; X86-NOBMI-NEXT:    retl
2366 ; X86-BMI1NOTBM-LABEL: bextr32_b2_load:
2367 ; X86-BMI1NOTBM:       # %bb.0:
2368 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
2369 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
2370 ; X86-BMI1NOTBM-NEXT:    shll $8, %ecx
2371 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
2372 ; X86-BMI1NOTBM-NEXT:    orl %ecx, %edx
2373 ; X86-BMI1NOTBM-NEXT:    bextrl %edx, (%eax), %eax
2374 ; X86-BMI1NOTBM-NEXT:    retl
2376 ; X86-BMI1BMI2-LABEL: bextr32_b2_load:
2377 ; X86-BMI1BMI2:       # %bb.0:
2378 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
2379 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2380 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %dl
2381 ; X86-BMI1BMI2-NEXT:    shrxl %edx, (%ecx), %ecx
2382 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
2383 ; X86-BMI1BMI2-NEXT:    retl
2385 ; X64-NOBMI-LABEL: bextr32_b2_load:
2386 ; X64-NOBMI:       # %bb.0:
2387 ; X64-NOBMI-NEXT:    movl %esi, %ecx
2388 ; X64-NOBMI-NEXT:    movl (%rdi), %esi
2389 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
2390 ; X64-NOBMI-NEXT:    shrl %cl, %esi
2391 ; X64-NOBMI-NEXT:    movl $-1, %eax
2392 ; X64-NOBMI-NEXT:    movl %edx, %ecx
2393 ; X64-NOBMI-NEXT:    shll %cl, %eax
2394 ; X64-NOBMI-NEXT:    notl %eax
2395 ; X64-NOBMI-NEXT:    andl %esi, %eax
2396 ; X64-NOBMI-NEXT:    retq
2398 ; X64-BMI1NOTBM-LABEL: bextr32_b2_load:
2399 ; X64-BMI1NOTBM:       # %bb.0:
2400 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
2401 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
2402 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
2403 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, (%rdi), %eax
2404 ; X64-BMI1NOTBM-NEXT:    retq
2406 ; X64-BMI1BMI2-LABEL: bextr32_b2_load:
2407 ; X64-BMI1BMI2:       # %bb.0:
2408 ; X64-BMI1BMI2-NEXT:    shrxl %esi, (%rdi), %eax
2409 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
2410 ; X64-BMI1BMI2-NEXT:    retq
2411   %val = load i32, i32* %w
2412   %shifted = lshr i32 %val, %numskipbits
2413   %notmask = shl i32 -1, %numlowbits
2414   %mask = xor i32 %notmask, -1
2415   %masked = and i32 %mask, %shifted
2416   ret i32 %masked
2419 define i32 @bextr32_b3_load_indexzext(i32* %w, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {
2420 ; X86-NOBMI-LABEL: bextr32_b3_load_indexzext:
2421 ; X86-NOBMI:       # %bb.0:
2422 ; X86-NOBMI-NEXT:    pushl %esi
2423 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
2424 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
2425 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
2426 ; X86-NOBMI-NEXT:    movl (%eax), %esi
2427 ; X86-NOBMI-NEXT:    shrl %cl, %esi
2428 ; X86-NOBMI-NEXT:    movl $-1, %eax
2429 ; X86-NOBMI-NEXT:    movl %edx, %ecx
2430 ; X86-NOBMI-NEXT:    shll %cl, %eax
2431 ; X86-NOBMI-NEXT:    notl %eax
2432 ; X86-NOBMI-NEXT:    andl %esi, %eax
2433 ; X86-NOBMI-NEXT:    popl %esi
2434 ; X86-NOBMI-NEXT:    retl
2436 ; X86-BMI1NOTBM-LABEL: bextr32_b3_load_indexzext:
2437 ; X86-BMI1NOTBM:       # %bb.0:
2438 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
2439 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
2440 ; X86-BMI1NOTBM-NEXT:    shll $8, %ecx
2441 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
2442 ; X86-BMI1NOTBM-NEXT:    orl %ecx, %edx
2443 ; X86-BMI1NOTBM-NEXT:    bextrl %edx, (%eax), %eax
2444 ; X86-BMI1NOTBM-NEXT:    retl
2446 ; X86-BMI1BMI2-LABEL: bextr32_b3_load_indexzext:
2447 ; X86-BMI1BMI2:       # %bb.0:
2448 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
2449 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2450 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %dl
2451 ; X86-BMI1BMI2-NEXT:    shrxl %edx, (%ecx), %ecx
2452 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
2453 ; X86-BMI1BMI2-NEXT:    retl
2455 ; X64-NOBMI-LABEL: bextr32_b3_load_indexzext:
2456 ; X64-NOBMI:       # %bb.0:
2457 ; X64-NOBMI-NEXT:    movl %esi, %ecx
2458 ; X64-NOBMI-NEXT:    movl (%rdi), %esi
2459 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
2460 ; X64-NOBMI-NEXT:    shrl %cl, %esi
2461 ; X64-NOBMI-NEXT:    movl $-1, %eax
2462 ; X64-NOBMI-NEXT:    movl %edx, %ecx
2463 ; X64-NOBMI-NEXT:    shll %cl, %eax
2464 ; X64-NOBMI-NEXT:    notl %eax
2465 ; X64-NOBMI-NEXT:    andl %esi, %eax
2466 ; X64-NOBMI-NEXT:    retq
2468 ; X64-BMI1NOTBM-LABEL: bextr32_b3_load_indexzext:
2469 ; X64-BMI1NOTBM:       # %bb.0:
2470 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
2471 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
2472 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
2473 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, (%rdi), %eax
2474 ; X64-BMI1NOTBM-NEXT:    retq
2476 ; X64-BMI1BMI2-LABEL: bextr32_b3_load_indexzext:
2477 ; X64-BMI1BMI2:       # %bb.0:
2478 ; X64-BMI1BMI2-NEXT:    shrxl %esi, (%rdi), %eax
2479 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
2480 ; X64-BMI1BMI2-NEXT:    retq
2481   %val = load i32, i32* %w
2482   %skip = zext i8 %numskipbits to i32
2483   %shifted = lshr i32 %val, %skip
2484   %conv = zext i8 %numlowbits to i32
2485   %notmask = shl i32 -1, %conv
2486   %mask = xor i32 %notmask, -1
2487   %masked = and i32 %mask, %shifted
2488   ret i32 %masked
2491 define i32 @bextr32_b4_commutative(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
2492 ; X86-NOBMI-LABEL: bextr32_b4_commutative:
2493 ; X86-NOBMI:       # %bb.0:
2494 ; X86-NOBMI-NEXT:    pushl %esi
2495 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
2496 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
2497 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
2498 ; X86-NOBMI-NEXT:    shrl %cl, %esi
2499 ; X86-NOBMI-NEXT:    movl $-1, %eax
2500 ; X86-NOBMI-NEXT:    movl %edx, %ecx
2501 ; X86-NOBMI-NEXT:    shll %cl, %eax
2502 ; X86-NOBMI-NEXT:    notl %eax
2503 ; X86-NOBMI-NEXT:    andl %esi, %eax
2504 ; X86-NOBMI-NEXT:    popl %esi
2505 ; X86-NOBMI-NEXT:    retl
2507 ; X86-BMI1NOTBM-LABEL: bextr32_b4_commutative:
2508 ; X86-BMI1NOTBM:       # %bb.0:
2509 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
2510 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
2511 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
2512 ; X86-BMI1NOTBM-NEXT:    orl %eax, %ecx
2513 ; X86-BMI1NOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax
2514 ; X86-BMI1NOTBM-NEXT:    retl
2516 ; X86-BMI1BMI2-LABEL: bextr32_b4_commutative:
2517 ; X86-BMI1BMI2:       # %bb.0:
2518 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
2519 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
2520 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx
2521 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
2522 ; X86-BMI1BMI2-NEXT:    retl
2524 ; X64-NOBMI-LABEL: bextr32_b4_commutative:
2525 ; X64-NOBMI:       # %bb.0:
2526 ; X64-NOBMI-NEXT:    movl %esi, %ecx
2527 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
2528 ; X64-NOBMI-NEXT:    shrl %cl, %edi
2529 ; X64-NOBMI-NEXT:    movl $-1, %eax
2530 ; X64-NOBMI-NEXT:    movl %edx, %ecx
2531 ; X64-NOBMI-NEXT:    shll %cl, %eax
2532 ; X64-NOBMI-NEXT:    notl %eax
2533 ; X64-NOBMI-NEXT:    andl %edi, %eax
2534 ; X64-NOBMI-NEXT:    retq
2536 ; X64-BMI1NOTBM-LABEL: bextr32_b4_commutative:
2537 ; X64-BMI1NOTBM:       # %bb.0:
2538 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
2539 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
2540 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
2541 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %eax
2542 ; X64-BMI1NOTBM-NEXT:    retq
2544 ; X64-BMI1BMI2-LABEL: bextr32_b4_commutative:
2545 ; X64-BMI1BMI2:       # %bb.0:
2546 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %eax
2547 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
2548 ; X64-BMI1BMI2-NEXT:    retq
2549   %shifted = lshr i32 %val, %numskipbits
2550   %notmask = shl i32 -1, %numlowbits
2551   %mask = xor i32 %notmask, -1
2552   %masked = and i32 %shifted, %mask ; swapped order
2553   ret i32 %masked
2556 define i32 @bextr32_b5_skipextrauses(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
2557 ; X86-NOBMI-LABEL: bextr32_b5_skipextrauses:
2558 ; X86-NOBMI:       # %bb.0:
2559 ; X86-NOBMI-NEXT:    pushl %edi
2560 ; X86-NOBMI-NEXT:    pushl %esi
2561 ; X86-NOBMI-NEXT:    pushl %eax
2562 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
2563 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
2564 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
2565 ; X86-NOBMI-NEXT:    movl %eax, %ecx
2566 ; X86-NOBMI-NEXT:    shrl %cl, %edi
2567 ; X86-NOBMI-NEXT:    movl $-1, %esi
2568 ; X86-NOBMI-NEXT:    movl %edx, %ecx
2569 ; X86-NOBMI-NEXT:    shll %cl, %esi
2570 ; X86-NOBMI-NEXT:    notl %esi
2571 ; X86-NOBMI-NEXT:    andl %edi, %esi
2572 ; X86-NOBMI-NEXT:    movl %eax, (%esp)
2573 ; X86-NOBMI-NEXT:    calll use32
2574 ; X86-NOBMI-NEXT:    movl %esi, %eax
2575 ; X86-NOBMI-NEXT:    addl $4, %esp
2576 ; X86-NOBMI-NEXT:    popl %esi
2577 ; X86-NOBMI-NEXT:    popl %edi
2578 ; X86-NOBMI-NEXT:    retl
2580 ; X86-BMI1NOTBM-LABEL: bextr32_b5_skipextrauses:
2581 ; X86-BMI1NOTBM:       # %bb.0:
2582 ; X86-BMI1NOTBM-NEXT:    pushl %esi
2583 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
2584 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
2585 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
2586 ; X86-BMI1NOTBM-NEXT:    shll $8, %ecx
2587 ; X86-BMI1NOTBM-NEXT:    movzbl %al, %edx
2588 ; X86-BMI1NOTBM-NEXT:    orl %ecx, %edx
2589 ; X86-BMI1NOTBM-NEXT:    bextrl %edx, {{[0-9]+}}(%esp), %esi
2590 ; X86-BMI1NOTBM-NEXT:    movl %eax, (%esp)
2591 ; X86-BMI1NOTBM-NEXT:    calll use32
2592 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
2593 ; X86-BMI1NOTBM-NEXT:    addl $8, %esp
2594 ; X86-BMI1NOTBM-NEXT:    popl %esi
2595 ; X86-BMI1NOTBM-NEXT:    retl
2597 ; X86-BMI1BMI2-LABEL: bextr32_b5_skipextrauses:
2598 ; X86-BMI1BMI2:       # %bb.0:
2599 ; X86-BMI1BMI2-NEXT:    pushl %esi
2600 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
2601 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
2602 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2603 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %edx
2604 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %edx, %esi
2605 ; X86-BMI1BMI2-NEXT:    movl %ecx, (%esp)
2606 ; X86-BMI1BMI2-NEXT:    calll use32
2607 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
2608 ; X86-BMI1BMI2-NEXT:    addl $8, %esp
2609 ; X86-BMI1BMI2-NEXT:    popl %esi
2610 ; X86-BMI1BMI2-NEXT:    retl
2612 ; X64-NOBMI-LABEL: bextr32_b5_skipextrauses:
2613 ; X64-NOBMI:       # %bb.0:
2614 ; X64-NOBMI-NEXT:    pushq %rbx
2615 ; X64-NOBMI-NEXT:    movl %esi, %ecx
2616 ; X64-NOBMI-NEXT:    shrl %cl, %edi
2617 ; X64-NOBMI-NEXT:    movl $-1, %ebx
2618 ; X64-NOBMI-NEXT:    movl %edx, %ecx
2619 ; X64-NOBMI-NEXT:    shll %cl, %ebx
2620 ; X64-NOBMI-NEXT:    notl %ebx
2621 ; X64-NOBMI-NEXT:    andl %edi, %ebx
2622 ; X64-NOBMI-NEXT:    movl %esi, %edi
2623 ; X64-NOBMI-NEXT:    callq use32
2624 ; X64-NOBMI-NEXT:    movl %ebx, %eax
2625 ; X64-NOBMI-NEXT:    popq %rbx
2626 ; X64-NOBMI-NEXT:    retq
2628 ; X64-BMI1NOTBM-LABEL: bextr32_b5_skipextrauses:
2629 ; X64-BMI1NOTBM:       # %bb.0:
2630 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
2631 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
2632 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
2633 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
2634 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %ebx
2635 ; X64-BMI1NOTBM-NEXT:    movl %esi, %edi
2636 ; X64-BMI1NOTBM-NEXT:    callq use32
2637 ; X64-BMI1NOTBM-NEXT:    movl %ebx, %eax
2638 ; X64-BMI1NOTBM-NEXT:    popq %rbx
2639 ; X64-BMI1NOTBM-NEXT:    retq
2641 ; X64-BMI1BMI2-LABEL: bextr32_b5_skipextrauses:
2642 ; X64-BMI1BMI2:       # %bb.0:
2643 ; X64-BMI1BMI2-NEXT:    pushq %rbx
2644 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %eax
2645 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %ebx
2646 ; X64-BMI1BMI2-NEXT:    movl %esi, %edi
2647 ; X64-BMI1BMI2-NEXT:    callq use32
2648 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
2649 ; X64-BMI1BMI2-NEXT:    popq %rbx
2650 ; X64-BMI1BMI2-NEXT:    retq
2651   %shifted = lshr i32 %val, %numskipbits
2652   %notmask = shl i32 -1, %numlowbits
2653   %mask = xor i32 %notmask, -1
2654   %masked = and i32 %mask, %shifted
2655   call void @use32(i32 %numskipbits)
2656   ret i32 %masked
2659 ; 64-bit
2661 define i64 @bextr64_b0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
2662 ; X86-NOBMI-LABEL: bextr64_b0:
2663 ; X86-NOBMI:       # %bb.0:
2664 ; X86-NOBMI-NEXT:    pushl %edi
2665 ; X86-NOBMI-NEXT:    pushl %esi
2666 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch
2667 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
2668 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
2669 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
2670 ; X86-NOBMI-NEXT:    movl %eax, %edi
2671 ; X86-NOBMI-NEXT:    shrl %cl, %edi
2672 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
2673 ; X86-NOBMI-NEXT:    testb $32, %cl
2674 ; X86-NOBMI-NEXT:    je .LBB25_2
2675 ; X86-NOBMI-NEXT:  # %bb.1:
2676 ; X86-NOBMI-NEXT:    movl %edi, %esi
2677 ; X86-NOBMI-NEXT:    xorl %edi, %edi
2678 ; X86-NOBMI-NEXT:  .LBB25_2:
2679 ; X86-NOBMI-NEXT:    movl $-1, %edx
2680 ; X86-NOBMI-NEXT:    movl $-1, %eax
2681 ; X86-NOBMI-NEXT:    movb %ch, %cl
2682 ; X86-NOBMI-NEXT:    shll %cl, %eax
2683 ; X86-NOBMI-NEXT:    shldl %cl, %edx, %edx
2684 ; X86-NOBMI-NEXT:    testb $32, %ch
2685 ; X86-NOBMI-NEXT:    je .LBB25_4
2686 ; X86-NOBMI-NEXT:  # %bb.3:
2687 ; X86-NOBMI-NEXT:    movl %eax, %edx
2688 ; X86-NOBMI-NEXT:    xorl %eax, %eax
2689 ; X86-NOBMI-NEXT:  .LBB25_4:
2690 ; X86-NOBMI-NEXT:    notl %edx
2691 ; X86-NOBMI-NEXT:    andl %edi, %edx
2692 ; X86-NOBMI-NEXT:    notl %eax
2693 ; X86-NOBMI-NEXT:    andl %esi, %eax
2694 ; X86-NOBMI-NEXT:    popl %esi
2695 ; X86-NOBMI-NEXT:    popl %edi
2696 ; X86-NOBMI-NEXT:    retl
2698 ; X86-BMI1NOTBM-LABEL: bextr64_b0:
2699 ; X86-BMI1NOTBM:       # %bb.0:
2700 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
2701 ; X86-BMI1NOTBM-NEXT:    pushl %edi
2702 ; X86-BMI1NOTBM-NEXT:    pushl %esi
2703 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
2704 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
2705 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
2706 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
2707 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
2708 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
2709 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
2710 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
2711 ; X86-BMI1NOTBM-NEXT:    je .LBB25_2
2712 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
2713 ; X86-BMI1NOTBM-NEXT:    movl %edx, %esi
2714 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
2715 ; X86-BMI1NOTBM-NEXT:  .LBB25_2:
2716 ; X86-BMI1NOTBM-NEXT:    movl $-1, %edi
2717 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebx
2718 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ecx
2719 ; X86-BMI1NOTBM-NEXT:    shll %cl, %ebx
2720 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %edi, %edi
2721 ; X86-BMI1NOTBM-NEXT:    testb $32, %al
2722 ; X86-BMI1NOTBM-NEXT:    je .LBB25_4
2723 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
2724 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %edi
2725 ; X86-BMI1NOTBM-NEXT:    xorl %ebx, %ebx
2726 ; X86-BMI1NOTBM-NEXT:  .LBB25_4:
2727 ; X86-BMI1NOTBM-NEXT:    andnl %edx, %edi, %edx
2728 ; X86-BMI1NOTBM-NEXT:    andnl %esi, %ebx, %eax
2729 ; X86-BMI1NOTBM-NEXT:    popl %esi
2730 ; X86-BMI1NOTBM-NEXT:    popl %edi
2731 ; X86-BMI1NOTBM-NEXT:    popl %ebx
2732 ; X86-BMI1NOTBM-NEXT:    retl
2734 ; X86-BMI1BMI2-LABEL: bextr64_b0:
2735 ; X86-BMI1BMI2:       # %bb.0:
2736 ; X86-BMI1BMI2-NEXT:    pushl %ebx
2737 ; X86-BMI1BMI2-NEXT:    pushl %edi
2738 ; X86-BMI1BMI2-NEXT:    pushl %esi
2739 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
2740 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
2741 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
2742 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
2743 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edx, %esi
2744 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edx, %edx
2745 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
2746 ; X86-BMI1BMI2-NEXT:    je .LBB25_2
2747 ; X86-BMI1BMI2-NEXT:  # %bb.1:
2748 ; X86-BMI1BMI2-NEXT:    movl %edx, %esi
2749 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
2750 ; X86-BMI1BMI2-NEXT:  .LBB25_2:
2751 ; X86-BMI1BMI2-NEXT:    movl $-1, %edi
2752 ; X86-BMI1BMI2-NEXT:    shlxl %eax, %edi, %ebx
2753 ; X86-BMI1BMI2-NEXT:    movl %eax, %ecx
2754 ; X86-BMI1BMI2-NEXT:    shldl %cl, %edi, %edi
2755 ; X86-BMI1BMI2-NEXT:    testb $32, %al
2756 ; X86-BMI1BMI2-NEXT:    je .LBB25_4
2757 ; X86-BMI1BMI2-NEXT:  # %bb.3:
2758 ; X86-BMI1BMI2-NEXT:    movl %ebx, %edi
2759 ; X86-BMI1BMI2-NEXT:    xorl %ebx, %ebx
2760 ; X86-BMI1BMI2-NEXT:  .LBB25_4:
2761 ; X86-BMI1BMI2-NEXT:    andnl %edx, %edi, %edx
2762 ; X86-BMI1BMI2-NEXT:    andnl %esi, %ebx, %eax
2763 ; X86-BMI1BMI2-NEXT:    popl %esi
2764 ; X86-BMI1BMI2-NEXT:    popl %edi
2765 ; X86-BMI1BMI2-NEXT:    popl %ebx
2766 ; X86-BMI1BMI2-NEXT:    retl
2768 ; X64-NOBMI-LABEL: bextr64_b0:
2769 ; X64-NOBMI:       # %bb.0:
2770 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
2771 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
2772 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
2773 ; X64-NOBMI-NEXT:    movq $-1, %rax
2774 ; X64-NOBMI-NEXT:    movl %edx, %ecx
2775 ; X64-NOBMI-NEXT:    shlq %cl, %rax
2776 ; X64-NOBMI-NEXT:    notq %rax
2777 ; X64-NOBMI-NEXT:    andq %rdi, %rax
2778 ; X64-NOBMI-NEXT:    retq
2780 ; X64-BMI1NOTBM-LABEL: bextr64_b0:
2781 ; X64-BMI1NOTBM:       # %bb.0:
2782 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
2783 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
2784 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
2785 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
2786 ; X64-BMI1NOTBM-NEXT:    retq
2788 ; X64-BMI1BMI2-LABEL: bextr64_b0:
2789 ; X64-BMI1BMI2:       # %bb.0:
2790 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
2791 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
2792 ; X64-BMI1BMI2-NEXT:    retq
2793   %shifted = lshr i64 %val, %numskipbits
2794   %notmask = shl i64 -1, %numlowbits
2795   %mask = xor i64 %notmask, -1
2796   %masked = and i64 %mask, %shifted
2797   ret i64 %masked
2800 define i64 @bextr64_b1_indexzext(i64 %val, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {
2801 ; X86-NOBMI-LABEL: bextr64_b1_indexzext:
2802 ; X86-NOBMI:       # %bb.0:
2803 ; X86-NOBMI-NEXT:    pushl %edi
2804 ; X86-NOBMI-NEXT:    pushl %esi
2805 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch
2806 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
2807 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
2808 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
2809 ; X86-NOBMI-NEXT:    movl %eax, %edi
2810 ; X86-NOBMI-NEXT:    shrl %cl, %edi
2811 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
2812 ; X86-NOBMI-NEXT:    testb $32, %cl
2813 ; X86-NOBMI-NEXT:    je .LBB26_2
2814 ; X86-NOBMI-NEXT:  # %bb.1:
2815 ; X86-NOBMI-NEXT:    movl %edi, %esi
2816 ; X86-NOBMI-NEXT:    xorl %edi, %edi
2817 ; X86-NOBMI-NEXT:  .LBB26_2:
2818 ; X86-NOBMI-NEXT:    movl $-1, %edx
2819 ; X86-NOBMI-NEXT:    movl $-1, %eax
2820 ; X86-NOBMI-NEXT:    movb %ch, %cl
2821 ; X86-NOBMI-NEXT:    shll %cl, %eax
2822 ; X86-NOBMI-NEXT:    shldl %cl, %edx, %edx
2823 ; X86-NOBMI-NEXT:    testb $32, %ch
2824 ; X86-NOBMI-NEXT:    je .LBB26_4
2825 ; X86-NOBMI-NEXT:  # %bb.3:
2826 ; X86-NOBMI-NEXT:    movl %eax, %edx
2827 ; X86-NOBMI-NEXT:    xorl %eax, %eax
2828 ; X86-NOBMI-NEXT:  .LBB26_4:
2829 ; X86-NOBMI-NEXT:    notl %edx
2830 ; X86-NOBMI-NEXT:    andl %edi, %edx
2831 ; X86-NOBMI-NEXT:    notl %eax
2832 ; X86-NOBMI-NEXT:    andl %esi, %eax
2833 ; X86-NOBMI-NEXT:    popl %esi
2834 ; X86-NOBMI-NEXT:    popl %edi
2835 ; X86-NOBMI-NEXT:    retl
2837 ; X86-BMI1NOTBM-LABEL: bextr64_b1_indexzext:
2838 ; X86-BMI1NOTBM:       # %bb.0:
2839 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
2840 ; X86-BMI1NOTBM-NEXT:    pushl %edi
2841 ; X86-BMI1NOTBM-NEXT:    pushl %esi
2842 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
2843 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
2844 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
2845 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
2846 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
2847 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
2848 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
2849 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
2850 ; X86-BMI1NOTBM-NEXT:    je .LBB26_2
2851 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
2852 ; X86-BMI1NOTBM-NEXT:    movl %edx, %esi
2853 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
2854 ; X86-BMI1NOTBM-NEXT:  .LBB26_2:
2855 ; X86-BMI1NOTBM-NEXT:    movl $-1, %edi
2856 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebx
2857 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ecx
2858 ; X86-BMI1NOTBM-NEXT:    shll %cl, %ebx
2859 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %edi, %edi
2860 ; X86-BMI1NOTBM-NEXT:    testb $32, %al
2861 ; X86-BMI1NOTBM-NEXT:    je .LBB26_4
2862 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
2863 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %edi
2864 ; X86-BMI1NOTBM-NEXT:    xorl %ebx, %ebx
2865 ; X86-BMI1NOTBM-NEXT:  .LBB26_4:
2866 ; X86-BMI1NOTBM-NEXT:    andnl %edx, %edi, %edx
2867 ; X86-BMI1NOTBM-NEXT:    andnl %esi, %ebx, %eax
2868 ; X86-BMI1NOTBM-NEXT:    popl %esi
2869 ; X86-BMI1NOTBM-NEXT:    popl %edi
2870 ; X86-BMI1NOTBM-NEXT:    popl %ebx
2871 ; X86-BMI1NOTBM-NEXT:    retl
2873 ; X86-BMI1BMI2-LABEL: bextr64_b1_indexzext:
2874 ; X86-BMI1BMI2:       # %bb.0:
2875 ; X86-BMI1BMI2-NEXT:    pushl %ebx
2876 ; X86-BMI1BMI2-NEXT:    pushl %edi
2877 ; X86-BMI1BMI2-NEXT:    pushl %esi
2878 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
2879 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
2880 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
2881 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
2882 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edx, %esi
2883 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edx, %edx
2884 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
2885 ; X86-BMI1BMI2-NEXT:    je .LBB26_2
2886 ; X86-BMI1BMI2-NEXT:  # %bb.1:
2887 ; X86-BMI1BMI2-NEXT:    movl %edx, %esi
2888 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
2889 ; X86-BMI1BMI2-NEXT:  .LBB26_2:
2890 ; X86-BMI1BMI2-NEXT:    movl $-1, %edi
2891 ; X86-BMI1BMI2-NEXT:    shlxl %eax, %edi, %ebx
2892 ; X86-BMI1BMI2-NEXT:    movl %eax, %ecx
2893 ; X86-BMI1BMI2-NEXT:    shldl %cl, %edi, %edi
2894 ; X86-BMI1BMI2-NEXT:    testb $32, %al
2895 ; X86-BMI1BMI2-NEXT:    je .LBB26_4
2896 ; X86-BMI1BMI2-NEXT:  # %bb.3:
2897 ; X86-BMI1BMI2-NEXT:    movl %ebx, %edi
2898 ; X86-BMI1BMI2-NEXT:    xorl %ebx, %ebx
2899 ; X86-BMI1BMI2-NEXT:  .LBB26_4:
2900 ; X86-BMI1BMI2-NEXT:    andnl %edx, %edi, %edx
2901 ; X86-BMI1BMI2-NEXT:    andnl %esi, %ebx, %eax
2902 ; X86-BMI1BMI2-NEXT:    popl %esi
2903 ; X86-BMI1BMI2-NEXT:    popl %edi
2904 ; X86-BMI1BMI2-NEXT:    popl %ebx
2905 ; X86-BMI1BMI2-NEXT:    retl
2907 ; X64-NOBMI-LABEL: bextr64_b1_indexzext:
2908 ; X64-NOBMI:       # %bb.0:
2909 ; X64-NOBMI-NEXT:    movl %esi, %ecx
2910 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
2911 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
2912 ; X64-NOBMI-NEXT:    movq $-1, %rax
2913 ; X64-NOBMI-NEXT:    movl %edx, %ecx
2914 ; X64-NOBMI-NEXT:    shlq %cl, %rax
2915 ; X64-NOBMI-NEXT:    notq %rax
2916 ; X64-NOBMI-NEXT:    andq %rdi, %rax
2917 ; X64-NOBMI-NEXT:    retq
2919 ; X64-BMI1NOTBM-LABEL: bextr64_b1_indexzext:
2920 ; X64-BMI1NOTBM:       # %bb.0:
2921 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
2922 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
2923 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
2924 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
2925 ; X64-BMI1NOTBM-NEXT:    retq
2927 ; X64-BMI1BMI2-LABEL: bextr64_b1_indexzext:
2928 ; X64-BMI1BMI2:       # %bb.0:
2929 ; X64-BMI1BMI2-NEXT:    # kill: def $edx killed $edx def $rdx
2930 ; X64-BMI1BMI2-NEXT:    # kill: def $esi killed $esi def $rsi
2931 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
2932 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
2933 ; X64-BMI1BMI2-NEXT:    retq
2934   %skip = zext i8 %numskipbits to i64
2935   %shifted = lshr i64 %val, %skip
2936   %conv = zext i8 %numlowbits to i64
2937   %notmask = shl i64 -1, %conv
2938   %mask = xor i64 %notmask, -1
2939   %masked = and i64 %mask, %shifted
2940   ret i64 %masked
2943 define i64 @bextr64_b2_load(i64* %w, i64 %numskipbits, i64 %numlowbits) nounwind {
2944 ; X86-NOBMI-LABEL: bextr64_b2_load:
2945 ; X86-NOBMI:       # %bb.0:
2946 ; X86-NOBMI-NEXT:    pushl %edi
2947 ; X86-NOBMI-NEXT:    pushl %esi
2948 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch
2949 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
2950 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
2951 ; X86-NOBMI-NEXT:    movl (%eax), %esi
2952 ; X86-NOBMI-NEXT:    movl 4(%eax), %eax
2953 ; X86-NOBMI-NEXT:    movl %eax, %edi
2954 ; X86-NOBMI-NEXT:    shrl %cl, %edi
2955 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
2956 ; X86-NOBMI-NEXT:    testb $32, %cl
2957 ; X86-NOBMI-NEXT:    je .LBB27_2
2958 ; X86-NOBMI-NEXT:  # %bb.1:
2959 ; X86-NOBMI-NEXT:    movl %edi, %esi
2960 ; X86-NOBMI-NEXT:    xorl %edi, %edi
2961 ; X86-NOBMI-NEXT:  .LBB27_2:
2962 ; X86-NOBMI-NEXT:    movl $-1, %edx
2963 ; X86-NOBMI-NEXT:    movl $-1, %eax
2964 ; X86-NOBMI-NEXT:    movb %ch, %cl
2965 ; X86-NOBMI-NEXT:    shll %cl, %eax
2966 ; X86-NOBMI-NEXT:    shldl %cl, %edx, %edx
2967 ; X86-NOBMI-NEXT:    testb $32, %ch
2968 ; X86-NOBMI-NEXT:    je .LBB27_4
2969 ; X86-NOBMI-NEXT:  # %bb.3:
2970 ; X86-NOBMI-NEXT:    movl %eax, %edx
2971 ; X86-NOBMI-NEXT:    xorl %eax, %eax
2972 ; X86-NOBMI-NEXT:  .LBB27_4:
2973 ; X86-NOBMI-NEXT:    notl %edx
2974 ; X86-NOBMI-NEXT:    andl %edi, %edx
2975 ; X86-NOBMI-NEXT:    notl %eax
2976 ; X86-NOBMI-NEXT:    andl %esi, %eax
2977 ; X86-NOBMI-NEXT:    popl %esi
2978 ; X86-NOBMI-NEXT:    popl %edi
2979 ; X86-NOBMI-NEXT:    retl
2981 ; X86-BMI1NOTBM-LABEL: bextr64_b2_load:
2982 ; X86-BMI1NOTBM:       # %bb.0:
2983 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
2984 ; X86-BMI1NOTBM-NEXT:    pushl %edi
2985 ; X86-BMI1NOTBM-NEXT:    pushl %esi
2986 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
2987 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
2988 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edx
2989 ; X86-BMI1NOTBM-NEXT:    movl (%edx), %esi
2990 ; X86-BMI1NOTBM-NEXT:    movl 4(%edx), %edi
2991 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
2992 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
2993 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
2994 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
2995 ; X86-BMI1NOTBM-NEXT:    je .LBB27_2
2996 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
2997 ; X86-BMI1NOTBM-NEXT:    movl %edx, %esi
2998 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
2999 ; X86-BMI1NOTBM-NEXT:  .LBB27_2:
3000 ; X86-BMI1NOTBM-NEXT:    movl $-1, %edi
3001 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebx
3002 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ecx
3003 ; X86-BMI1NOTBM-NEXT:    shll %cl, %ebx
3004 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %edi, %edi
3005 ; X86-BMI1NOTBM-NEXT:    testb $32, %al
3006 ; X86-BMI1NOTBM-NEXT:    je .LBB27_4
3007 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
3008 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %edi
3009 ; X86-BMI1NOTBM-NEXT:    xorl %ebx, %ebx
3010 ; X86-BMI1NOTBM-NEXT:  .LBB27_4:
3011 ; X86-BMI1NOTBM-NEXT:    andnl %edx, %edi, %edx
3012 ; X86-BMI1NOTBM-NEXT:    andnl %esi, %ebx, %eax
3013 ; X86-BMI1NOTBM-NEXT:    popl %esi
3014 ; X86-BMI1NOTBM-NEXT:    popl %edi
3015 ; X86-BMI1NOTBM-NEXT:    popl %ebx
3016 ; X86-BMI1NOTBM-NEXT:    retl
3018 ; X86-BMI1BMI2-LABEL: bextr64_b2_load:
3019 ; X86-BMI1BMI2:       # %bb.0:
3020 ; X86-BMI1BMI2-NEXT:    pushl %ebx
3021 ; X86-BMI1BMI2-NEXT:    pushl %edi
3022 ; X86-BMI1BMI2-NEXT:    pushl %esi
3023 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
3024 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
3025 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
3026 ; X86-BMI1BMI2-NEXT:    movl (%edx), %esi
3027 ; X86-BMI1BMI2-NEXT:    movl 4(%edx), %edi
3028 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edi, %edx
3029 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edi, %esi
3030 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
3031 ; X86-BMI1BMI2-NEXT:    je .LBB27_2
3032 ; X86-BMI1BMI2-NEXT:  # %bb.1:
3033 ; X86-BMI1BMI2-NEXT:    movl %edx, %esi
3034 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
3035 ; X86-BMI1BMI2-NEXT:  .LBB27_2:
3036 ; X86-BMI1BMI2-NEXT:    movl $-1, %edi
3037 ; X86-BMI1BMI2-NEXT:    shlxl %eax, %edi, %ebx
3038 ; X86-BMI1BMI2-NEXT:    movl %eax, %ecx
3039 ; X86-BMI1BMI2-NEXT:    shldl %cl, %edi, %edi
3040 ; X86-BMI1BMI2-NEXT:    testb $32, %al
3041 ; X86-BMI1BMI2-NEXT:    je .LBB27_4
3042 ; X86-BMI1BMI2-NEXT:  # %bb.3:
3043 ; X86-BMI1BMI2-NEXT:    movl %ebx, %edi
3044 ; X86-BMI1BMI2-NEXT:    xorl %ebx, %ebx
3045 ; X86-BMI1BMI2-NEXT:  .LBB27_4:
3046 ; X86-BMI1BMI2-NEXT:    andnl %edx, %edi, %edx
3047 ; X86-BMI1BMI2-NEXT:    andnl %esi, %ebx, %eax
3048 ; X86-BMI1BMI2-NEXT:    popl %esi
3049 ; X86-BMI1BMI2-NEXT:    popl %edi
3050 ; X86-BMI1BMI2-NEXT:    popl %ebx
3051 ; X86-BMI1BMI2-NEXT:    retl
3053 ; X64-NOBMI-LABEL: bextr64_b2_load:
3054 ; X64-NOBMI:       # %bb.0:
3055 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
3056 ; X64-NOBMI-NEXT:    movq (%rdi), %rsi
3057 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
3058 ; X64-NOBMI-NEXT:    shrq %cl, %rsi
3059 ; X64-NOBMI-NEXT:    movq $-1, %rax
3060 ; X64-NOBMI-NEXT:    movl %edx, %ecx
3061 ; X64-NOBMI-NEXT:    shlq %cl, %rax
3062 ; X64-NOBMI-NEXT:    notq %rax
3063 ; X64-NOBMI-NEXT:    andq %rsi, %rax
3064 ; X64-NOBMI-NEXT:    retq
3066 ; X64-BMI1NOTBM-LABEL: bextr64_b2_load:
3067 ; X64-BMI1NOTBM:       # %bb.0:
3068 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
3069 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
3070 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
3071 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, (%rdi), %rax
3072 ; X64-BMI1NOTBM-NEXT:    retq
3074 ; X64-BMI1BMI2-LABEL: bextr64_b2_load:
3075 ; X64-BMI1BMI2:       # %bb.0:
3076 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, (%rdi), %rax
3077 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
3078 ; X64-BMI1BMI2-NEXT:    retq
3079   %val = load i64, i64* %w
3080   %shifted = lshr i64 %val, %numskipbits
3081   %notmask = shl i64 -1, %numlowbits
3082   %mask = xor i64 %notmask, -1
3083   %masked = and i64 %mask, %shifted
3084   ret i64 %masked
3087 define i64 @bextr64_b3_load_indexzext(i64* %w, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {
3088 ; X86-NOBMI-LABEL: bextr64_b3_load_indexzext:
3089 ; X86-NOBMI:       # %bb.0:
3090 ; X86-NOBMI-NEXT:    pushl %edi
3091 ; X86-NOBMI-NEXT:    pushl %esi
3092 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch
3093 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
3094 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
3095 ; X86-NOBMI-NEXT:    movl (%eax), %esi
3096 ; X86-NOBMI-NEXT:    movl 4(%eax), %eax
3097 ; X86-NOBMI-NEXT:    movl %eax, %edi
3098 ; X86-NOBMI-NEXT:    shrl %cl, %edi
3099 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
3100 ; X86-NOBMI-NEXT:    testb $32, %cl
3101 ; X86-NOBMI-NEXT:    je .LBB28_2
3102 ; X86-NOBMI-NEXT:  # %bb.1:
3103 ; X86-NOBMI-NEXT:    movl %edi, %esi
3104 ; X86-NOBMI-NEXT:    xorl %edi, %edi
3105 ; X86-NOBMI-NEXT:  .LBB28_2:
3106 ; X86-NOBMI-NEXT:    movl $-1, %edx
3107 ; X86-NOBMI-NEXT:    movl $-1, %eax
3108 ; X86-NOBMI-NEXT:    movb %ch, %cl
3109 ; X86-NOBMI-NEXT:    shll %cl, %eax
3110 ; X86-NOBMI-NEXT:    shldl %cl, %edx, %edx
3111 ; X86-NOBMI-NEXT:    testb $32, %ch
3112 ; X86-NOBMI-NEXT:    je .LBB28_4
3113 ; X86-NOBMI-NEXT:  # %bb.3:
3114 ; X86-NOBMI-NEXT:    movl %eax, %edx
3115 ; X86-NOBMI-NEXT:    xorl %eax, %eax
3116 ; X86-NOBMI-NEXT:  .LBB28_4:
3117 ; X86-NOBMI-NEXT:    notl %edx
3118 ; X86-NOBMI-NEXT:    andl %edi, %edx
3119 ; X86-NOBMI-NEXT:    notl %eax
3120 ; X86-NOBMI-NEXT:    andl %esi, %eax
3121 ; X86-NOBMI-NEXT:    popl %esi
3122 ; X86-NOBMI-NEXT:    popl %edi
3123 ; X86-NOBMI-NEXT:    retl
3125 ; X86-BMI1NOTBM-LABEL: bextr64_b3_load_indexzext:
3126 ; X86-BMI1NOTBM:       # %bb.0:
3127 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
3128 ; X86-BMI1NOTBM-NEXT:    pushl %edi
3129 ; X86-BMI1NOTBM-NEXT:    pushl %esi
3130 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
3131 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
3132 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edx
3133 ; X86-BMI1NOTBM-NEXT:    movl (%edx), %esi
3134 ; X86-BMI1NOTBM-NEXT:    movl 4(%edx), %edi
3135 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
3136 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
3137 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
3138 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
3139 ; X86-BMI1NOTBM-NEXT:    je .LBB28_2
3140 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
3141 ; X86-BMI1NOTBM-NEXT:    movl %edx, %esi
3142 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
3143 ; X86-BMI1NOTBM-NEXT:  .LBB28_2:
3144 ; X86-BMI1NOTBM-NEXT:    movl $-1, %edi
3145 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebx
3146 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ecx
3147 ; X86-BMI1NOTBM-NEXT:    shll %cl, %ebx
3148 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %edi, %edi
3149 ; X86-BMI1NOTBM-NEXT:    testb $32, %al
3150 ; X86-BMI1NOTBM-NEXT:    je .LBB28_4
3151 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
3152 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %edi
3153 ; X86-BMI1NOTBM-NEXT:    xorl %ebx, %ebx
3154 ; X86-BMI1NOTBM-NEXT:  .LBB28_4:
3155 ; X86-BMI1NOTBM-NEXT:    andnl %edx, %edi, %edx
3156 ; X86-BMI1NOTBM-NEXT:    andnl %esi, %ebx, %eax
3157 ; X86-BMI1NOTBM-NEXT:    popl %esi
3158 ; X86-BMI1NOTBM-NEXT:    popl %edi
3159 ; X86-BMI1NOTBM-NEXT:    popl %ebx
3160 ; X86-BMI1NOTBM-NEXT:    retl
3162 ; X86-BMI1BMI2-LABEL: bextr64_b3_load_indexzext:
3163 ; X86-BMI1BMI2:       # %bb.0:
3164 ; X86-BMI1BMI2-NEXT:    pushl %ebx
3165 ; X86-BMI1BMI2-NEXT:    pushl %edi
3166 ; X86-BMI1BMI2-NEXT:    pushl %esi
3167 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
3168 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
3169 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
3170 ; X86-BMI1BMI2-NEXT:    movl (%edx), %esi
3171 ; X86-BMI1BMI2-NEXT:    movl 4(%edx), %edi
3172 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edi, %edx
3173 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edi, %esi
3174 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
3175 ; X86-BMI1BMI2-NEXT:    je .LBB28_2
3176 ; X86-BMI1BMI2-NEXT:  # %bb.1:
3177 ; X86-BMI1BMI2-NEXT:    movl %edx, %esi
3178 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
3179 ; X86-BMI1BMI2-NEXT:  .LBB28_2:
3180 ; X86-BMI1BMI2-NEXT:    movl $-1, %edi
3181 ; X86-BMI1BMI2-NEXT:    shlxl %eax, %edi, %ebx
3182 ; X86-BMI1BMI2-NEXT:    movl %eax, %ecx
3183 ; X86-BMI1BMI2-NEXT:    shldl %cl, %edi, %edi
3184 ; X86-BMI1BMI2-NEXT:    testb $32, %al
3185 ; X86-BMI1BMI2-NEXT:    je .LBB28_4
3186 ; X86-BMI1BMI2-NEXT:  # %bb.3:
3187 ; X86-BMI1BMI2-NEXT:    movl %ebx, %edi
3188 ; X86-BMI1BMI2-NEXT:    xorl %ebx, %ebx
3189 ; X86-BMI1BMI2-NEXT:  .LBB28_4:
3190 ; X86-BMI1BMI2-NEXT:    andnl %edx, %edi, %edx
3191 ; X86-BMI1BMI2-NEXT:    andnl %esi, %ebx, %eax
3192 ; X86-BMI1BMI2-NEXT:    popl %esi
3193 ; X86-BMI1BMI2-NEXT:    popl %edi
3194 ; X86-BMI1BMI2-NEXT:    popl %ebx
3195 ; X86-BMI1BMI2-NEXT:    retl
3197 ; X64-NOBMI-LABEL: bextr64_b3_load_indexzext:
3198 ; X64-NOBMI:       # %bb.0:
3199 ; X64-NOBMI-NEXT:    movl %esi, %ecx
3200 ; X64-NOBMI-NEXT:    movq (%rdi), %rsi
3201 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
3202 ; X64-NOBMI-NEXT:    shrq %cl, %rsi
3203 ; X64-NOBMI-NEXT:    movq $-1, %rax
3204 ; X64-NOBMI-NEXT:    movl %edx, %ecx
3205 ; X64-NOBMI-NEXT:    shlq %cl, %rax
3206 ; X64-NOBMI-NEXT:    notq %rax
3207 ; X64-NOBMI-NEXT:    andq %rsi, %rax
3208 ; X64-NOBMI-NEXT:    retq
3210 ; X64-BMI1NOTBM-LABEL: bextr64_b3_load_indexzext:
3211 ; X64-BMI1NOTBM:       # %bb.0:
3212 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
3213 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
3214 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
3215 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, (%rdi), %rax
3216 ; X64-BMI1NOTBM-NEXT:    retq
3218 ; X64-BMI1BMI2-LABEL: bextr64_b3_load_indexzext:
3219 ; X64-BMI1BMI2:       # %bb.0:
3220 ; X64-BMI1BMI2-NEXT:    # kill: def $edx killed $edx def $rdx
3221 ; X64-BMI1BMI2-NEXT:    # kill: def $esi killed $esi def $rsi
3222 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, (%rdi), %rax
3223 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
3224 ; X64-BMI1BMI2-NEXT:    retq
3225   %val = load i64, i64* %w
3226   %skip = zext i8 %numskipbits to i64
3227   %shifted = lshr i64 %val, %skip
3228   %conv = zext i8 %numlowbits to i64
3229   %notmask = shl i64 -1, %conv
3230   %mask = xor i64 %notmask, -1
3231   %masked = and i64 %mask, %shifted
3232   ret i64 %masked
3235 define i64 @bextr64_b4_commutative(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
3236 ; X86-NOBMI-LABEL: bextr64_b4_commutative:
3237 ; X86-NOBMI:       # %bb.0:
3238 ; X86-NOBMI-NEXT:    pushl %edi
3239 ; X86-NOBMI-NEXT:    pushl %esi
3240 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %ch
3241 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
3242 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
3243 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
3244 ; X86-NOBMI-NEXT:    movl %esi, %edx
3245 ; X86-NOBMI-NEXT:    shrl %cl, %edx
3246 ; X86-NOBMI-NEXT:    shrdl %cl, %esi, %eax
3247 ; X86-NOBMI-NEXT:    testb $32, %cl
3248 ; X86-NOBMI-NEXT:    je .LBB29_2
3249 ; X86-NOBMI-NEXT:  # %bb.1:
3250 ; X86-NOBMI-NEXT:    movl %edx, %eax
3251 ; X86-NOBMI-NEXT:    xorl %edx, %edx
3252 ; X86-NOBMI-NEXT:  .LBB29_2:
3253 ; X86-NOBMI-NEXT:    movl $-1, %edi
3254 ; X86-NOBMI-NEXT:    movl $-1, %esi
3255 ; X86-NOBMI-NEXT:    movb %ch, %cl
3256 ; X86-NOBMI-NEXT:    shll %cl, %esi
3257 ; X86-NOBMI-NEXT:    shldl %cl, %edi, %edi
3258 ; X86-NOBMI-NEXT:    testb $32, %ch
3259 ; X86-NOBMI-NEXT:    je .LBB29_4
3260 ; X86-NOBMI-NEXT:  # %bb.3:
3261 ; X86-NOBMI-NEXT:    movl %esi, %edi
3262 ; X86-NOBMI-NEXT:    xorl %esi, %esi
3263 ; X86-NOBMI-NEXT:  .LBB29_4:
3264 ; X86-NOBMI-NEXT:    notl %edi
3265 ; X86-NOBMI-NEXT:    andl %edi, %edx
3266 ; X86-NOBMI-NEXT:    notl %esi
3267 ; X86-NOBMI-NEXT:    andl %esi, %eax
3268 ; X86-NOBMI-NEXT:    popl %esi
3269 ; X86-NOBMI-NEXT:    popl %edi
3270 ; X86-NOBMI-NEXT:    retl
3272 ; X86-BMI1NOTBM-LABEL: bextr64_b4_commutative:
3273 ; X86-BMI1NOTBM:       # %bb.0:
3274 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
3275 ; X86-BMI1NOTBM-NEXT:    pushl %edi
3276 ; X86-BMI1NOTBM-NEXT:    pushl %esi
3277 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
3278 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
3279 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
3280 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
3281 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
3282 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
3283 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
3284 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
3285 ; X86-BMI1NOTBM-NEXT:    je .LBB29_2
3286 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
3287 ; X86-BMI1NOTBM-NEXT:    movl %edx, %esi
3288 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
3289 ; X86-BMI1NOTBM-NEXT:  .LBB29_2:
3290 ; X86-BMI1NOTBM-NEXT:    movl $-1, %edi
3291 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebx
3292 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ecx
3293 ; X86-BMI1NOTBM-NEXT:    shll %cl, %ebx
3294 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %edi, %edi
3295 ; X86-BMI1NOTBM-NEXT:    testb $32, %al
3296 ; X86-BMI1NOTBM-NEXT:    je .LBB29_4
3297 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
3298 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %edi
3299 ; X86-BMI1NOTBM-NEXT:    xorl %ebx, %ebx
3300 ; X86-BMI1NOTBM-NEXT:  .LBB29_4:
3301 ; X86-BMI1NOTBM-NEXT:    andnl %edx, %edi, %edx
3302 ; X86-BMI1NOTBM-NEXT:    andnl %esi, %ebx, %eax
3303 ; X86-BMI1NOTBM-NEXT:    popl %esi
3304 ; X86-BMI1NOTBM-NEXT:    popl %edi
3305 ; X86-BMI1NOTBM-NEXT:    popl %ebx
3306 ; X86-BMI1NOTBM-NEXT:    retl
3308 ; X86-BMI1BMI2-LABEL: bextr64_b4_commutative:
3309 ; X86-BMI1BMI2:       # %bb.0:
3310 ; X86-BMI1BMI2-NEXT:    pushl %ebx
3311 ; X86-BMI1BMI2-NEXT:    pushl %edi
3312 ; X86-BMI1BMI2-NEXT:    pushl %esi
3313 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
3314 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
3315 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
3316 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
3317 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edx, %esi
3318 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edx, %edx
3319 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
3320 ; X86-BMI1BMI2-NEXT:    je .LBB29_2
3321 ; X86-BMI1BMI2-NEXT:  # %bb.1:
3322 ; X86-BMI1BMI2-NEXT:    movl %edx, %esi
3323 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
3324 ; X86-BMI1BMI2-NEXT:  .LBB29_2:
3325 ; X86-BMI1BMI2-NEXT:    movl $-1, %edi
3326 ; X86-BMI1BMI2-NEXT:    shlxl %eax, %edi, %ebx
3327 ; X86-BMI1BMI2-NEXT:    movl %eax, %ecx
3328 ; X86-BMI1BMI2-NEXT:    shldl %cl, %edi, %edi
3329 ; X86-BMI1BMI2-NEXT:    testb $32, %al
3330 ; X86-BMI1BMI2-NEXT:    je .LBB29_4
3331 ; X86-BMI1BMI2-NEXT:  # %bb.3:
3332 ; X86-BMI1BMI2-NEXT:    movl %ebx, %edi
3333 ; X86-BMI1BMI2-NEXT:    xorl %ebx, %ebx
3334 ; X86-BMI1BMI2-NEXT:  .LBB29_4:
3335 ; X86-BMI1BMI2-NEXT:    andnl %edx, %edi, %edx
3336 ; X86-BMI1BMI2-NEXT:    andnl %esi, %ebx, %eax
3337 ; X86-BMI1BMI2-NEXT:    popl %esi
3338 ; X86-BMI1BMI2-NEXT:    popl %edi
3339 ; X86-BMI1BMI2-NEXT:    popl %ebx
3340 ; X86-BMI1BMI2-NEXT:    retl
3342 ; X64-NOBMI-LABEL: bextr64_b4_commutative:
3343 ; X64-NOBMI:       # %bb.0:
3344 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
3345 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
3346 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
3347 ; X64-NOBMI-NEXT:    movq $-1, %rax
3348 ; X64-NOBMI-NEXT:    movl %edx, %ecx
3349 ; X64-NOBMI-NEXT:    shlq %cl, %rax
3350 ; X64-NOBMI-NEXT:    notq %rax
3351 ; X64-NOBMI-NEXT:    andq %rdi, %rax
3352 ; X64-NOBMI-NEXT:    retq
3354 ; X64-BMI1NOTBM-LABEL: bextr64_b4_commutative:
3355 ; X64-BMI1NOTBM:       # %bb.0:
3356 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
3357 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
3358 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
3359 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
3360 ; X64-BMI1NOTBM-NEXT:    retq
3362 ; X64-BMI1BMI2-LABEL: bextr64_b4_commutative:
3363 ; X64-BMI1BMI2:       # %bb.0:
3364 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
3365 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
3366 ; X64-BMI1BMI2-NEXT:    retq
3367   %shifted = lshr i64 %val, %numskipbits
3368   %notmask = shl i64 -1, %numlowbits
3369   %mask = xor i64 %notmask, -1
3370   %masked = and i64 %shifted, %mask ; swapped order
3371   ret i64 %masked
3374 define i64 @bextr64_b5_skipextrauses(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
3375 ; X86-NOBMI-LABEL: bextr64_b5_skipextrauses:
3376 ; X86-NOBMI:       # %bb.0:
3377 ; X86-NOBMI-NEXT:    pushl %ebp
3378 ; X86-NOBMI-NEXT:    pushl %ebx
3379 ; X86-NOBMI-NEXT:    pushl %edi
3380 ; X86-NOBMI-NEXT:    pushl %esi
3381 ; X86-NOBMI-NEXT:    subl $12, %esp
3382 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
3383 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ebx
3384 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
3385 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
3386 ; X86-NOBMI-NEXT:    movl %esi, %ebp
3387 ; X86-NOBMI-NEXT:    movl %eax, %ecx
3388 ; X86-NOBMI-NEXT:    shrl %cl, %ebp
3389 ; X86-NOBMI-NEXT:    shrdl %cl, %esi, %ebx
3390 ; X86-NOBMI-NEXT:    testb $32, %al
3391 ; X86-NOBMI-NEXT:    je .LBB30_2
3392 ; X86-NOBMI-NEXT:  # %bb.1:
3393 ; X86-NOBMI-NEXT:    movl %ebp, %ebx
3394 ; X86-NOBMI-NEXT:    xorl %ebp, %ebp
3395 ; X86-NOBMI-NEXT:  .LBB30_2:
3396 ; X86-NOBMI-NEXT:    movl $-1, %esi
3397 ; X86-NOBMI-NEXT:    movl $-1, %edi
3398 ; X86-NOBMI-NEXT:    movl %edx, %ecx
3399 ; X86-NOBMI-NEXT:    shll %cl, %edi
3400 ; X86-NOBMI-NEXT:    shldl %cl, %esi, %esi
3401 ; X86-NOBMI-NEXT:    testb $32, %dl
3402 ; X86-NOBMI-NEXT:    je .LBB30_4
3403 ; X86-NOBMI-NEXT:  # %bb.3:
3404 ; X86-NOBMI-NEXT:    movl %edi, %esi
3405 ; X86-NOBMI-NEXT:    xorl %edi, %edi
3406 ; X86-NOBMI-NEXT:  .LBB30_4:
3407 ; X86-NOBMI-NEXT:    notl %esi
3408 ; X86-NOBMI-NEXT:    andl %ebp, %esi
3409 ; X86-NOBMI-NEXT:    notl %edi
3410 ; X86-NOBMI-NEXT:    andl %ebx, %edi
3411 ; X86-NOBMI-NEXT:    subl $8, %esp
3412 ; X86-NOBMI-NEXT:    pushl {{[0-9]+}}(%esp)
3413 ; X86-NOBMI-NEXT:    pushl %eax
3414 ; X86-NOBMI-NEXT:    calll use64
3415 ; X86-NOBMI-NEXT:    addl $16, %esp
3416 ; X86-NOBMI-NEXT:    movl %edi, %eax
3417 ; X86-NOBMI-NEXT:    movl %esi, %edx
3418 ; X86-NOBMI-NEXT:    addl $12, %esp
3419 ; X86-NOBMI-NEXT:    popl %esi
3420 ; X86-NOBMI-NEXT:    popl %edi
3421 ; X86-NOBMI-NEXT:    popl %ebx
3422 ; X86-NOBMI-NEXT:    popl %ebp
3423 ; X86-NOBMI-NEXT:    retl
3425 ; X86-BMI1NOTBM-LABEL: bextr64_b5_skipextrauses:
3426 ; X86-BMI1NOTBM:       # %bb.0:
3427 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
3428 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
3429 ; X86-BMI1NOTBM-NEXT:    pushl %edi
3430 ; X86-BMI1NOTBM-NEXT:    pushl %esi
3431 ; X86-BMI1NOTBM-NEXT:    subl $12, %esp
3432 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %dl
3433 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
3434 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %ebx
3435 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
3436 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %esi
3437 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ecx
3438 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %esi
3439 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %ebx, %edi
3440 ; X86-BMI1NOTBM-NEXT:    testb $32, %al
3441 ; X86-BMI1NOTBM-NEXT:    je .LBB30_2
3442 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
3443 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edi
3444 ; X86-BMI1NOTBM-NEXT:    xorl %esi, %esi
3445 ; X86-BMI1NOTBM-NEXT:  .LBB30_2:
3446 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebx
3447 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebp
3448 ; X86-BMI1NOTBM-NEXT:    movl %edx, %ecx
3449 ; X86-BMI1NOTBM-NEXT:    shll %cl, %ebp
3450 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %ebx, %ebx
3451 ; X86-BMI1NOTBM-NEXT:    testb $32, %dl
3452 ; X86-BMI1NOTBM-NEXT:    je .LBB30_4
3453 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
3454 ; X86-BMI1NOTBM-NEXT:    movl %ebp, %ebx
3455 ; X86-BMI1NOTBM-NEXT:    xorl %ebp, %ebp
3456 ; X86-BMI1NOTBM-NEXT:  .LBB30_4:
3457 ; X86-BMI1NOTBM-NEXT:    andnl %esi, %ebx, %esi
3458 ; X86-BMI1NOTBM-NEXT:    andnl %edi, %ebp, %edi
3459 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
3460 ; X86-BMI1NOTBM-NEXT:    pushl {{[0-9]+}}(%esp)
3461 ; X86-BMI1NOTBM-NEXT:    pushl %eax
3462 ; X86-BMI1NOTBM-NEXT:    calll use64
3463 ; X86-BMI1NOTBM-NEXT:    addl $16, %esp
3464 ; X86-BMI1NOTBM-NEXT:    movl %edi, %eax
3465 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
3466 ; X86-BMI1NOTBM-NEXT:    addl $12, %esp
3467 ; X86-BMI1NOTBM-NEXT:    popl %esi
3468 ; X86-BMI1NOTBM-NEXT:    popl %edi
3469 ; X86-BMI1NOTBM-NEXT:    popl %ebx
3470 ; X86-BMI1NOTBM-NEXT:    popl %ebp
3471 ; X86-BMI1NOTBM-NEXT:    retl
3473 ; X86-BMI1BMI2-LABEL: bextr64_b5_skipextrauses:
3474 ; X86-BMI1BMI2:       # %bb.0:
3475 ; X86-BMI1BMI2-NEXT:    pushl %ebp
3476 ; X86-BMI1BMI2-NEXT:    pushl %ebx
3477 ; X86-BMI1BMI2-NEXT:    pushl %edi
3478 ; X86-BMI1BMI2-NEXT:    pushl %esi
3479 ; X86-BMI1BMI2-NEXT:    subl $12, %esp
3480 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %dl
3481 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edi
3482 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
3483 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
3484 ; X86-BMI1BMI2-NEXT:    movl %eax, %ecx
3485 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edi
3486 ; X86-BMI1BMI2-NEXT:    shrxl %eax, %esi, %esi
3487 ; X86-BMI1BMI2-NEXT:    testb $32, %al
3488 ; X86-BMI1BMI2-NEXT:    je .LBB30_2
3489 ; X86-BMI1BMI2-NEXT:  # %bb.1:
3490 ; X86-BMI1BMI2-NEXT:    movl %esi, %edi
3491 ; X86-BMI1BMI2-NEXT:    xorl %esi, %esi
3492 ; X86-BMI1BMI2-NEXT:  .LBB30_2:
3493 ; X86-BMI1BMI2-NEXT:    movl $-1, %ebp
3494 ; X86-BMI1BMI2-NEXT:    shlxl %edx, %ebp, %ebx
3495 ; X86-BMI1BMI2-NEXT:    movl %edx, %ecx
3496 ; X86-BMI1BMI2-NEXT:    shldl %cl, %ebp, %ebp
3497 ; X86-BMI1BMI2-NEXT:    testb $32, %dl
3498 ; X86-BMI1BMI2-NEXT:    je .LBB30_4
3499 ; X86-BMI1BMI2-NEXT:  # %bb.3:
3500 ; X86-BMI1BMI2-NEXT:    movl %ebx, %ebp
3501 ; X86-BMI1BMI2-NEXT:    xorl %ebx, %ebx
3502 ; X86-BMI1BMI2-NEXT:  .LBB30_4:
3503 ; X86-BMI1BMI2-NEXT:    andnl %esi, %ebp, %esi
3504 ; X86-BMI1BMI2-NEXT:    andnl %edi, %ebx, %edi
3505 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
3506 ; X86-BMI1BMI2-NEXT:    pushl {{[0-9]+}}(%esp)
3507 ; X86-BMI1BMI2-NEXT:    pushl %eax
3508 ; X86-BMI1BMI2-NEXT:    calll use64
3509 ; X86-BMI1BMI2-NEXT:    addl $16, %esp
3510 ; X86-BMI1BMI2-NEXT:    movl %edi, %eax
3511 ; X86-BMI1BMI2-NEXT:    movl %esi, %edx
3512 ; X86-BMI1BMI2-NEXT:    addl $12, %esp
3513 ; X86-BMI1BMI2-NEXT:    popl %esi
3514 ; X86-BMI1BMI2-NEXT:    popl %edi
3515 ; X86-BMI1BMI2-NEXT:    popl %ebx
3516 ; X86-BMI1BMI2-NEXT:    popl %ebp
3517 ; X86-BMI1BMI2-NEXT:    retl
3519 ; X64-NOBMI-LABEL: bextr64_b5_skipextrauses:
3520 ; X64-NOBMI:       # %bb.0:
3521 ; X64-NOBMI-NEXT:    pushq %rbx
3522 ; X64-NOBMI-NEXT:    movl %esi, %ecx
3523 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
3524 ; X64-NOBMI-NEXT:    movq $-1, %rbx
3525 ; X64-NOBMI-NEXT:    movl %edx, %ecx
3526 ; X64-NOBMI-NEXT:    shlq %cl, %rbx
3527 ; X64-NOBMI-NEXT:    notq %rbx
3528 ; X64-NOBMI-NEXT:    andq %rdi, %rbx
3529 ; X64-NOBMI-NEXT:    movq %rsi, %rdi
3530 ; X64-NOBMI-NEXT:    callq use64
3531 ; X64-NOBMI-NEXT:    movq %rbx, %rax
3532 ; X64-NOBMI-NEXT:    popq %rbx
3533 ; X64-NOBMI-NEXT:    retq
3535 ; X64-BMI1NOTBM-LABEL: bextr64_b5_skipextrauses:
3536 ; X64-BMI1NOTBM:       # %bb.0:
3537 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
3538 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
3539 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
3540 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
3541 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rbx
3542 ; X64-BMI1NOTBM-NEXT:    movq %rsi, %rdi
3543 ; X64-BMI1NOTBM-NEXT:    callq use64
3544 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rax
3545 ; X64-BMI1NOTBM-NEXT:    popq %rbx
3546 ; X64-BMI1NOTBM-NEXT:    retq
3548 ; X64-BMI1BMI2-LABEL: bextr64_b5_skipextrauses:
3549 ; X64-BMI1BMI2:       # %bb.0:
3550 ; X64-BMI1BMI2-NEXT:    pushq %rbx
3551 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
3552 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rbx
3553 ; X64-BMI1BMI2-NEXT:    movq %rsi, %rdi
3554 ; X64-BMI1BMI2-NEXT:    callq use64
3555 ; X64-BMI1BMI2-NEXT:    movq %rbx, %rax
3556 ; X64-BMI1BMI2-NEXT:    popq %rbx
3557 ; X64-BMI1BMI2-NEXT:    retq
3558   %shifted = lshr i64 %val, %numskipbits
3559   %notmask = shl i64 -1, %numlowbits
3560   %mask = xor i64 %notmask, -1
3561   %masked = and i64 %mask, %shifted
3562   call void @use64(i64 %numskipbits)
3563   ret i64 %masked
3566 ; 64-bit, but with 32-bit output
3568 ; Everything done in 64-bit, truncation happens last.
3569 define i32 @bextr64_32_b0(i64 %val, i64 %numskipbits, i8 %numlowbits) nounwind {
3570 ; X86-NOBMI-LABEL: bextr64_32_b0:
3571 ; X86-NOBMI:       # %bb.0:
3572 ; X86-NOBMI-NEXT:    pushl %edi
3573 ; X86-NOBMI-NEXT:    pushl %esi
3574 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
3575 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
3576 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
3577 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
3578 ; X86-NOBMI-NEXT:    movl %edi, %eax
3579 ; X86-NOBMI-NEXT:    shrl %cl, %eax
3580 ; X86-NOBMI-NEXT:    shrdl %cl, %edi, %esi
3581 ; X86-NOBMI-NEXT:    testb $32, %cl
3582 ; X86-NOBMI-NEXT:    jne .LBB31_2
3583 ; X86-NOBMI-NEXT:  # %bb.1:
3584 ; X86-NOBMI-NEXT:    movl %esi, %eax
3585 ; X86-NOBMI-NEXT:  .LBB31_2:
3586 ; X86-NOBMI-NEXT:    movl $-1, %esi
3587 ; X86-NOBMI-NEXT:    movl %edx, %ecx
3588 ; X86-NOBMI-NEXT:    shll %cl, %esi
3589 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
3590 ; X86-NOBMI-NEXT:    testb $32, %dl
3591 ; X86-NOBMI-NEXT:    jne .LBB31_4
3592 ; X86-NOBMI-NEXT:  # %bb.3:
3593 ; X86-NOBMI-NEXT:    movl %esi, %ecx
3594 ; X86-NOBMI-NEXT:  .LBB31_4:
3595 ; X86-NOBMI-NEXT:    notl %ecx
3596 ; X86-NOBMI-NEXT:    andl %ecx, %eax
3597 ; X86-NOBMI-NEXT:    popl %esi
3598 ; X86-NOBMI-NEXT:    popl %edi
3599 ; X86-NOBMI-NEXT:    retl
3601 ; X86-BMI1NOTBM-LABEL: bextr64_32_b0:
3602 ; X86-BMI1NOTBM:       # %bb.0:
3603 ; X86-BMI1NOTBM-NEXT:    pushl %edi
3604 ; X86-BMI1NOTBM-NEXT:    pushl %esi
3605 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
3606 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
3607 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
3608 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
3609 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
3610 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
3611 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
3612 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
3613 ; X86-BMI1NOTBM-NEXT:    jne .LBB31_2
3614 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
3615 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
3616 ; X86-BMI1NOTBM-NEXT:  .LBB31_2:
3617 ; X86-BMI1NOTBM-NEXT:    movl $-1, %esi
3618 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ecx
3619 ; X86-BMI1NOTBM-NEXT:    shll %cl, %esi
3620 ; X86-BMI1NOTBM-NEXT:    xorl %ecx, %ecx
3621 ; X86-BMI1NOTBM-NEXT:    testb $32, %al
3622 ; X86-BMI1NOTBM-NEXT:    jne .LBB31_4
3623 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
3624 ; X86-BMI1NOTBM-NEXT:    movl %esi, %ecx
3625 ; X86-BMI1NOTBM-NEXT:  .LBB31_4:
3626 ; X86-BMI1NOTBM-NEXT:    andnl %edx, %ecx, %eax
3627 ; X86-BMI1NOTBM-NEXT:    popl %esi
3628 ; X86-BMI1NOTBM-NEXT:    popl %edi
3629 ; X86-BMI1NOTBM-NEXT:    retl
3631 ; X86-BMI1BMI2-LABEL: bextr64_32_b0:
3632 ; X86-BMI1BMI2:       # %bb.0:
3633 ; X86-BMI1BMI2-NEXT:    pushl %esi
3634 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
3635 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
3636 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
3637 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
3638 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edx
3639 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
3640 ; X86-BMI1BMI2-NEXT:    je .LBB31_2
3641 ; X86-BMI1BMI2-NEXT:  # %bb.1:
3642 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %edx
3643 ; X86-BMI1BMI2-NEXT:  .LBB31_2:
3644 ; X86-BMI1BMI2-NEXT:    xorl %ecx, %ecx
3645 ; X86-BMI1BMI2-NEXT:    testb $32, %al
3646 ; X86-BMI1BMI2-NEXT:    jne .LBB31_4
3647 ; X86-BMI1BMI2-NEXT:  # %bb.3:
3648 ; X86-BMI1BMI2-NEXT:    movl $-1, %ecx
3649 ; X86-BMI1BMI2-NEXT:    shlxl %eax, %ecx, %ecx
3650 ; X86-BMI1BMI2-NEXT:  .LBB31_4:
3651 ; X86-BMI1BMI2-NEXT:    andnl %edx, %ecx, %eax
3652 ; X86-BMI1BMI2-NEXT:    popl %esi
3653 ; X86-BMI1BMI2-NEXT:    retl
3655 ; X64-NOBMI-LABEL: bextr64_32_b0:
3656 ; X64-NOBMI:       # %bb.0:
3657 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
3658 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
3659 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
3660 ; X64-NOBMI-NEXT:    movq $-1, %rax
3661 ; X64-NOBMI-NEXT:    movl %edx, %ecx
3662 ; X64-NOBMI-NEXT:    shlq %cl, %rax
3663 ; X64-NOBMI-NEXT:    notl %eax
3664 ; X64-NOBMI-NEXT:    andl %edi, %eax
3665 ; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax
3666 ; X64-NOBMI-NEXT:    retq
3668 ; X64-BMI1NOTBM-LABEL: bextr64_32_b0:
3669 ; X64-BMI1NOTBM:       # %bb.0:
3670 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
3671 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
3672 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
3673 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
3674 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
3675 ; X64-BMI1NOTBM-NEXT:    retq
3677 ; X64-BMI1BMI2-LABEL: bextr64_32_b0:
3678 ; X64-BMI1BMI2:       # %bb.0:
3679 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
3680 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
3681 ; X64-BMI1BMI2-NEXT:    retq
3682   %shiftedval = lshr i64 %val, %numskipbits
3683   %widenumlowbits = zext i8 %numlowbits to i64
3684   %notmask = shl nsw i64 -1, %widenumlowbits
3685   %mask = xor i64 %notmask, -1
3686   %wideres = and i64 %shiftedval, %mask
3687   %res = trunc i64 %wideres to i32
3688   ret i32 %res
3691 ; Shifting happens in 64-bit, then truncation. Masking is 32-bit.
3692 define i32 @bextr64_32_b1(i64 %val, i64 %numskipbits, i8 %numlowbits) nounwind {
3693 ; X86-NOBMI-LABEL: bextr64_32_b1:
3694 ; X86-NOBMI:       # %bb.0:
3695 ; X86-NOBMI-NEXT:    pushl %edi
3696 ; X86-NOBMI-NEXT:    pushl %esi
3697 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
3698 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
3699 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
3700 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
3701 ; X86-NOBMI-NEXT:    movl %edi, %esi
3702 ; X86-NOBMI-NEXT:    shrl %cl, %esi
3703 ; X86-NOBMI-NEXT:    shrdl %cl, %edi, %eax
3704 ; X86-NOBMI-NEXT:    testb $32, %cl
3705 ; X86-NOBMI-NEXT:    jne .LBB32_2
3706 ; X86-NOBMI-NEXT:  # %bb.1:
3707 ; X86-NOBMI-NEXT:    movl %eax, %esi
3708 ; X86-NOBMI-NEXT:  .LBB32_2:
3709 ; X86-NOBMI-NEXT:    movl $-1, %eax
3710 ; X86-NOBMI-NEXT:    movl %edx, %ecx
3711 ; X86-NOBMI-NEXT:    shll %cl, %eax
3712 ; X86-NOBMI-NEXT:    notl %eax
3713 ; X86-NOBMI-NEXT:    andl %esi, %eax
3714 ; X86-NOBMI-NEXT:    popl %esi
3715 ; X86-NOBMI-NEXT:    popl %edi
3716 ; X86-NOBMI-NEXT:    retl
3718 ; X86-BMI1NOTBM-LABEL: bextr64_32_b1:
3719 ; X86-BMI1NOTBM:       # %bb.0:
3720 ; X86-BMI1NOTBM-NEXT:    pushl %edi
3721 ; X86-BMI1NOTBM-NEXT:    pushl %esi
3722 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
3723 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
3724 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
3725 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
3726 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
3727 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
3728 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
3729 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
3730 ; X86-BMI1NOTBM-NEXT:    jne .LBB32_2
3731 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
3732 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
3733 ; X86-BMI1NOTBM-NEXT:  .LBB32_2:
3734 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
3735 ; X86-BMI1NOTBM-NEXT:    bextrl %eax, %edx, %eax
3736 ; X86-BMI1NOTBM-NEXT:    popl %esi
3737 ; X86-BMI1NOTBM-NEXT:    popl %edi
3738 ; X86-BMI1NOTBM-NEXT:    retl
3740 ; X86-BMI1BMI2-LABEL: bextr64_32_b1:
3741 ; X86-BMI1BMI2:       # %bb.0:
3742 ; X86-BMI1BMI2-NEXT:    pushl %esi
3743 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
3744 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
3745 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
3746 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
3747 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edx
3748 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
3749 ; X86-BMI1BMI2-NEXT:    je .LBB32_2
3750 ; X86-BMI1BMI2-NEXT:  # %bb.1:
3751 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %edx
3752 ; X86-BMI1BMI2-NEXT:  .LBB32_2:
3753 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %edx, %eax
3754 ; X86-BMI1BMI2-NEXT:    popl %esi
3755 ; X86-BMI1BMI2-NEXT:    retl
3757 ; X64-NOBMI-LABEL: bextr64_32_b1:
3758 ; X64-NOBMI:       # %bb.0:
3759 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
3760 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
3761 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
3762 ; X64-NOBMI-NEXT:    movl $-1, %eax
3763 ; X64-NOBMI-NEXT:    movl %edx, %ecx
3764 ; X64-NOBMI-NEXT:    shll %cl, %eax
3765 ; X64-NOBMI-NEXT:    notl %eax
3766 ; X64-NOBMI-NEXT:    andl %edi, %eax
3767 ; X64-NOBMI-NEXT:    retq
3769 ; X64-BMI1NOTBM-LABEL: bextr64_32_b1:
3770 ; X64-BMI1NOTBM:       # %bb.0:
3771 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
3772 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
3773 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
3774 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
3775 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
3776 ; X64-BMI1NOTBM-NEXT:    retq
3778 ; X64-BMI1BMI2-LABEL: bextr64_32_b1:
3779 ; X64-BMI1BMI2:       # %bb.0:
3780 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
3781 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
3782 ; X64-BMI1BMI2-NEXT:    retq
3783   %shiftedval = lshr i64 %val, %numskipbits
3784   %truncshiftedval = trunc i64 %shiftedval to i32
3785   %widenumlowbits = zext i8 %numlowbits to i32
3786   %notmask = shl nsw i32 -1, %widenumlowbits
3787   %mask = xor i32 %notmask, -1
3788   %res = and i32 %truncshiftedval, %mask
3789   ret i32 %res
3792 ; Shifting happens in 64-bit. Mask is 32-bit, but extended to 64-bit.
3793 ; Masking is 64-bit. Then truncation.
3794 define i32 @bextr64_32_b2(i64 %val, i64 %numskipbits, i8 %numlowbits) nounwind {
3795 ; X86-NOBMI-LABEL: bextr64_32_b2:
3796 ; X86-NOBMI:       # %bb.0:
3797 ; X86-NOBMI-NEXT:    pushl %edi
3798 ; X86-NOBMI-NEXT:    pushl %esi
3799 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
3800 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
3801 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
3802 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
3803 ; X86-NOBMI-NEXT:    movl %edi, %esi
3804 ; X86-NOBMI-NEXT:    shrl %cl, %esi
3805 ; X86-NOBMI-NEXT:    shrdl %cl, %edi, %eax
3806 ; X86-NOBMI-NEXT:    testb $32, %cl
3807 ; X86-NOBMI-NEXT:    jne .LBB33_2
3808 ; X86-NOBMI-NEXT:  # %bb.1:
3809 ; X86-NOBMI-NEXT:    movl %eax, %esi
3810 ; X86-NOBMI-NEXT:  .LBB33_2:
3811 ; X86-NOBMI-NEXT:    movl $-1, %eax
3812 ; X86-NOBMI-NEXT:    movl %edx, %ecx
3813 ; X86-NOBMI-NEXT:    shll %cl, %eax
3814 ; X86-NOBMI-NEXT:    notl %eax
3815 ; X86-NOBMI-NEXT:    andl %esi, %eax
3816 ; X86-NOBMI-NEXT:    popl %esi
3817 ; X86-NOBMI-NEXT:    popl %edi
3818 ; X86-NOBMI-NEXT:    retl
3820 ; X86-BMI1NOTBM-LABEL: bextr64_32_b2:
3821 ; X86-BMI1NOTBM:       # %bb.0:
3822 ; X86-BMI1NOTBM-NEXT:    pushl %edi
3823 ; X86-BMI1NOTBM-NEXT:    pushl %esi
3824 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
3825 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
3826 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
3827 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
3828 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
3829 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
3830 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
3831 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
3832 ; X86-BMI1NOTBM-NEXT:    jne .LBB33_2
3833 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
3834 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
3835 ; X86-BMI1NOTBM-NEXT:  .LBB33_2:
3836 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
3837 ; X86-BMI1NOTBM-NEXT:    bextrl %eax, %edx, %eax
3838 ; X86-BMI1NOTBM-NEXT:    popl %esi
3839 ; X86-BMI1NOTBM-NEXT:    popl %edi
3840 ; X86-BMI1NOTBM-NEXT:    retl
3842 ; X86-BMI1BMI2-LABEL: bextr64_32_b2:
3843 ; X86-BMI1BMI2:       # %bb.0:
3844 ; X86-BMI1BMI2-NEXT:    pushl %esi
3845 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
3846 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
3847 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
3848 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
3849 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edx
3850 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
3851 ; X86-BMI1BMI2-NEXT:    je .LBB33_2
3852 ; X86-BMI1BMI2-NEXT:  # %bb.1:
3853 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %edx
3854 ; X86-BMI1BMI2-NEXT:  .LBB33_2:
3855 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %edx, %eax
3856 ; X86-BMI1BMI2-NEXT:    popl %esi
3857 ; X86-BMI1BMI2-NEXT:    retl
3859 ; X64-NOBMI-LABEL: bextr64_32_b2:
3860 ; X64-NOBMI:       # %bb.0:
3861 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
3862 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
3863 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
3864 ; X64-NOBMI-NEXT:    movl $-1, %eax
3865 ; X64-NOBMI-NEXT:    movl %edx, %ecx
3866 ; X64-NOBMI-NEXT:    shll %cl, %eax
3867 ; X64-NOBMI-NEXT:    notl %eax
3868 ; X64-NOBMI-NEXT:    andl %edi, %eax
3869 ; X64-NOBMI-NEXT:    retq
3871 ; X64-BMI1NOTBM-LABEL: bextr64_32_b2:
3872 ; X64-BMI1NOTBM:       # %bb.0:
3873 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
3874 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
3875 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
3876 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
3877 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
3878 ; X64-BMI1NOTBM-NEXT:    retq
3880 ; X64-BMI1BMI2-LABEL: bextr64_32_b2:
3881 ; X64-BMI1BMI2:       # %bb.0:
3882 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
3883 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
3884 ; X64-BMI1BMI2-NEXT:    retq
3885   %shiftedval = lshr i64 %val, %numskipbits
3886   %widenumlowbits = zext i8 %numlowbits to i32
3887   %notmask = shl nsw i32 -1, %widenumlowbits
3888   %mask = xor i32 %notmask, -1
3889   %zextmask = zext i32 %mask to i64
3890   %wideres = and i64 %shiftedval, %zextmask
3891   %res = trunc i64 %wideres to i32
3892   ret i32 %res
3895 ; Shifting happens in 64-bit. Mask is 32-bit, but calculated in 64-bit.
3896 ; Masking is 64-bit. Then truncation.
3897 define i32 @bextr64_32_b3(i64 %val, i64 %numskipbits, i8 %numlowbits) nounwind {
3898 ; X86-NOBMI-LABEL: bextr64_32_b3:
3899 ; X86-NOBMI:       # %bb.0:
3900 ; X86-NOBMI-NEXT:    pushl %edi
3901 ; X86-NOBMI-NEXT:    pushl %esi
3902 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %dl
3903 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
3904 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
3905 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
3906 ; X86-NOBMI-NEXT:    movl %edi, %eax
3907 ; X86-NOBMI-NEXT:    shrl %cl, %eax
3908 ; X86-NOBMI-NEXT:    shrdl %cl, %edi, %esi
3909 ; X86-NOBMI-NEXT:    testb $32, %cl
3910 ; X86-NOBMI-NEXT:    jne .LBB34_2
3911 ; X86-NOBMI-NEXT:  # %bb.1:
3912 ; X86-NOBMI-NEXT:    movl %esi, %eax
3913 ; X86-NOBMI-NEXT:  .LBB34_2:
3914 ; X86-NOBMI-NEXT:    movl $-1, %esi
3915 ; X86-NOBMI-NEXT:    movl %edx, %ecx
3916 ; X86-NOBMI-NEXT:    shll %cl, %esi
3917 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
3918 ; X86-NOBMI-NEXT:    testb $32, %dl
3919 ; X86-NOBMI-NEXT:    jne .LBB34_4
3920 ; X86-NOBMI-NEXT:  # %bb.3:
3921 ; X86-NOBMI-NEXT:    movl %esi, %ecx
3922 ; X86-NOBMI-NEXT:  .LBB34_4:
3923 ; X86-NOBMI-NEXT:    notl %ecx
3924 ; X86-NOBMI-NEXT:    andl %ecx, %eax
3925 ; X86-NOBMI-NEXT:    popl %esi
3926 ; X86-NOBMI-NEXT:    popl %edi
3927 ; X86-NOBMI-NEXT:    retl
3929 ; X86-BMI1NOTBM-LABEL: bextr64_32_b3:
3930 ; X86-BMI1NOTBM:       # %bb.0:
3931 ; X86-BMI1NOTBM-NEXT:    pushl %edi
3932 ; X86-BMI1NOTBM-NEXT:    pushl %esi
3933 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
3934 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
3935 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
3936 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
3937 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
3938 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
3939 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
3940 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
3941 ; X86-BMI1NOTBM-NEXT:    jne .LBB34_2
3942 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
3943 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
3944 ; X86-BMI1NOTBM-NEXT:  .LBB34_2:
3945 ; X86-BMI1NOTBM-NEXT:    movl $-1, %esi
3946 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ecx
3947 ; X86-BMI1NOTBM-NEXT:    shll %cl, %esi
3948 ; X86-BMI1NOTBM-NEXT:    xorl %ecx, %ecx
3949 ; X86-BMI1NOTBM-NEXT:    testb $32, %al
3950 ; X86-BMI1NOTBM-NEXT:    jne .LBB34_4
3951 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
3952 ; X86-BMI1NOTBM-NEXT:    movl %esi, %ecx
3953 ; X86-BMI1NOTBM-NEXT:  .LBB34_4:
3954 ; X86-BMI1NOTBM-NEXT:    andnl %edx, %ecx, %eax
3955 ; X86-BMI1NOTBM-NEXT:    popl %esi
3956 ; X86-BMI1NOTBM-NEXT:    popl %edi
3957 ; X86-BMI1NOTBM-NEXT:    retl
3959 ; X86-BMI1BMI2-LABEL: bextr64_32_b3:
3960 ; X86-BMI1BMI2:       # %bb.0:
3961 ; X86-BMI1BMI2-NEXT:    pushl %esi
3962 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
3963 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
3964 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
3965 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
3966 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edx
3967 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
3968 ; X86-BMI1BMI2-NEXT:    je .LBB34_2
3969 ; X86-BMI1BMI2-NEXT:  # %bb.1:
3970 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %edx
3971 ; X86-BMI1BMI2-NEXT:  .LBB34_2:
3972 ; X86-BMI1BMI2-NEXT:    xorl %ecx, %ecx
3973 ; X86-BMI1BMI2-NEXT:    testb $32, %al
3974 ; X86-BMI1BMI2-NEXT:    jne .LBB34_4
3975 ; X86-BMI1BMI2-NEXT:  # %bb.3:
3976 ; X86-BMI1BMI2-NEXT:    movl $-1, %ecx
3977 ; X86-BMI1BMI2-NEXT:    shlxl %eax, %ecx, %ecx
3978 ; X86-BMI1BMI2-NEXT:  .LBB34_4:
3979 ; X86-BMI1BMI2-NEXT:    andnl %edx, %ecx, %eax
3980 ; X86-BMI1BMI2-NEXT:    popl %esi
3981 ; X86-BMI1BMI2-NEXT:    retl
3983 ; X64-NOBMI-LABEL: bextr64_32_b3:
3984 ; X64-NOBMI:       # %bb.0:
3985 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
3986 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
3987 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
3988 ; X64-NOBMI-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF
3989 ; X64-NOBMI-NEXT:    movl $4294967295, %esi # imm = 0xFFFFFFFF
3990 ; X64-NOBMI-NEXT:    movl %edx, %ecx
3991 ; X64-NOBMI-NEXT:    shlq %cl, %rsi
3992 ; X64-NOBMI-NEXT:    xorl %esi, %eax
3993 ; X64-NOBMI-NEXT:    andl %edi, %eax
3994 ; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax
3995 ; X64-NOBMI-NEXT:    retq
3997 ; X64-BMI1NOTBM-LABEL: bextr64_32_b3:
3998 ; X64-BMI1NOTBM:       # %bb.0:
3999 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
4000 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
4001 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
4002 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
4003 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
4004 ; X64-BMI1NOTBM-NEXT:    retq
4006 ; X64-BMI1BMI2-LABEL: bextr64_32_b3:
4007 ; X64-BMI1BMI2:       # %bb.0:
4008 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
4009 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
4010 ; X64-BMI1BMI2-NEXT:    retq
4011   %shiftedval = lshr i64 %val, %numskipbits
4012   %widenumlowbits = zext i8 %numlowbits to i64
4013   %notmask = shl nsw i64 4294967295, %widenumlowbits
4014   %mask = xor i64 %notmask, 4294967295
4015   %wideres = and i64 %shiftedval, %mask
4016   %res = trunc i64 %wideres to i32
4017   ret i32 %res
4020 ; ---------------------------------------------------------------------------- ;
4021 ; Pattern c. 32-bit
4022 ; ---------------------------------------------------------------------------- ;
4024 define i32 @bextr32_c0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
4025 ; X86-NOBMI-LABEL: bextr32_c0:
4026 ; X86-NOBMI:       # %bb.0:
4027 ; X86-NOBMI-NEXT:    pushl %edi
4028 ; X86-NOBMI-NEXT:    pushl %esi
4029 ; X86-NOBMI-NEXT:    pushl %eax
4030 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
4031 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
4032 ; X86-NOBMI-NEXT:    shrl %cl, %edi
4033 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
4034 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
4035 ; X86-NOBMI-NEXT:    movl $-1, %esi
4036 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
4037 ; X86-NOBMI-NEXT:    shrl %cl, %esi
4038 ; X86-NOBMI-NEXT:    movl %esi, (%esp)
4039 ; X86-NOBMI-NEXT:    calll use32
4040 ; X86-NOBMI-NEXT:    andl %edi, %esi
4041 ; X86-NOBMI-NEXT:    movl %esi, %eax
4042 ; X86-NOBMI-NEXT:    addl $4, %esp
4043 ; X86-NOBMI-NEXT:    popl %esi
4044 ; X86-NOBMI-NEXT:    popl %edi
4045 ; X86-NOBMI-NEXT:    retl
4047 ; X86-BMI1NOTBM-LABEL: bextr32_c0:
4048 ; X86-BMI1NOTBM:       # %bb.0:
4049 ; X86-BMI1NOTBM-NEXT:    pushl %edi
4050 ; X86-BMI1NOTBM-NEXT:    pushl %esi
4051 ; X86-BMI1NOTBM-NEXT:    pushl %eax
4052 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
4053 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
4054 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
4055 ; X86-BMI1NOTBM-NEXT:    xorl %ecx, %ecx
4056 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
4057 ; X86-BMI1NOTBM-NEXT:    movl $-1, %esi
4058 ; X86-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
4059 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %esi
4060 ; X86-BMI1NOTBM-NEXT:    movl %esi, (%esp)
4061 ; X86-BMI1NOTBM-NEXT:    calll use32
4062 ; X86-BMI1NOTBM-NEXT:    andl %edi, %esi
4063 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
4064 ; X86-BMI1NOTBM-NEXT:    addl $4, %esp
4065 ; X86-BMI1NOTBM-NEXT:    popl %esi
4066 ; X86-BMI1NOTBM-NEXT:    popl %edi
4067 ; X86-BMI1NOTBM-NEXT:    retl
4069 ; X86-BMI1BMI2-LABEL: bextr32_c0:
4070 ; X86-BMI1BMI2:       # %bb.0:
4071 ; X86-BMI1BMI2-NEXT:    pushl %ebx
4072 ; X86-BMI1BMI2-NEXT:    pushl %esi
4073 ; X86-BMI1BMI2-NEXT:    pushl %eax
4074 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
4075 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
4076 ; X86-BMI1BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %esi
4077 ; X86-BMI1BMI2-NEXT:    movl %ebx, %eax
4078 ; X86-BMI1BMI2-NEXT:    negb %al
4079 ; X86-BMI1BMI2-NEXT:    movl $-1, %ecx
4080 ; X86-BMI1BMI2-NEXT:    shrxl %eax, %ecx, %eax
4081 ; X86-BMI1BMI2-NEXT:    movl %eax, (%esp)
4082 ; X86-BMI1BMI2-NEXT:    calll use32
4083 ; X86-BMI1BMI2-NEXT:    bzhil %ebx, %esi, %eax
4084 ; X86-BMI1BMI2-NEXT:    addl $4, %esp
4085 ; X86-BMI1BMI2-NEXT:    popl %esi
4086 ; X86-BMI1BMI2-NEXT:    popl %ebx
4087 ; X86-BMI1BMI2-NEXT:    retl
4089 ; X64-NOBMI-LABEL: bextr32_c0:
4090 ; X64-NOBMI:       # %bb.0:
4091 ; X64-NOBMI-NEXT:    pushq %rbp
4092 ; X64-NOBMI-NEXT:    pushq %rbx
4093 ; X64-NOBMI-NEXT:    pushq %rax
4094 ; X64-NOBMI-NEXT:    movl %esi, %ecx
4095 ; X64-NOBMI-NEXT:    movl %edi, %ebx
4096 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
4097 ; X64-NOBMI-NEXT:    shrl %cl, %ebx
4098 ; X64-NOBMI-NEXT:    negb %dl
4099 ; X64-NOBMI-NEXT:    movl $-1, %ebp
4100 ; X64-NOBMI-NEXT:    movl %edx, %ecx
4101 ; X64-NOBMI-NEXT:    shrl %cl, %ebp
4102 ; X64-NOBMI-NEXT:    movl %ebp, %edi
4103 ; X64-NOBMI-NEXT:    callq use32
4104 ; X64-NOBMI-NEXT:    andl %ebx, %ebp
4105 ; X64-NOBMI-NEXT:    movl %ebp, %eax
4106 ; X64-NOBMI-NEXT:    addq $8, %rsp
4107 ; X64-NOBMI-NEXT:    popq %rbx
4108 ; X64-NOBMI-NEXT:    popq %rbp
4109 ; X64-NOBMI-NEXT:    retq
4111 ; X64-BMI1NOTBM-LABEL: bextr32_c0:
4112 ; X64-BMI1NOTBM:       # %bb.0:
4113 ; X64-BMI1NOTBM-NEXT:    pushq %rbp
4114 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
4115 ; X64-BMI1NOTBM-NEXT:    pushq %rax
4116 ; X64-BMI1NOTBM-NEXT:    movl %esi, %ecx
4117 ; X64-BMI1NOTBM-NEXT:    movl %edi, %ebx
4118 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
4119 ; X64-BMI1NOTBM-NEXT:    shrl %cl, %ebx
4120 ; X64-BMI1NOTBM-NEXT:    negb %dl
4121 ; X64-BMI1NOTBM-NEXT:    movl $-1, %ebp
4122 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
4123 ; X64-BMI1NOTBM-NEXT:    shrl %cl, %ebp
4124 ; X64-BMI1NOTBM-NEXT:    movl %ebp, %edi
4125 ; X64-BMI1NOTBM-NEXT:    callq use32
4126 ; X64-BMI1NOTBM-NEXT:    andl %ebx, %ebp
4127 ; X64-BMI1NOTBM-NEXT:    movl %ebp, %eax
4128 ; X64-BMI1NOTBM-NEXT:    addq $8, %rsp
4129 ; X64-BMI1NOTBM-NEXT:    popq %rbx
4130 ; X64-BMI1NOTBM-NEXT:    popq %rbp
4131 ; X64-BMI1NOTBM-NEXT:    retq
4133 ; X64-BMI1BMI2-LABEL: bextr32_c0:
4134 ; X64-BMI1BMI2:       # %bb.0:
4135 ; X64-BMI1BMI2-NEXT:    pushq %rbp
4136 ; X64-BMI1BMI2-NEXT:    pushq %rbx
4137 ; X64-BMI1BMI2-NEXT:    pushq %rax
4138 ; X64-BMI1BMI2-NEXT:    movl %edx, %ebx
4139 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %ebp
4140 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
4141 ; X64-BMI1BMI2-NEXT:    negb %al
4142 ; X64-BMI1BMI2-NEXT:    movl $-1, %ecx
4143 ; X64-BMI1BMI2-NEXT:    shrxl %eax, %ecx, %edi
4144 ; X64-BMI1BMI2-NEXT:    callq use32
4145 ; X64-BMI1BMI2-NEXT:    bzhil %ebx, %ebp, %eax
4146 ; X64-BMI1BMI2-NEXT:    addq $8, %rsp
4147 ; X64-BMI1BMI2-NEXT:    popq %rbx
4148 ; X64-BMI1BMI2-NEXT:    popq %rbp
4149 ; X64-BMI1BMI2-NEXT:    retq
4150   %shifted = lshr i32 %val, %numskipbits
4151   %numhighbits = sub i32 32, %numlowbits
4152   %mask = lshr i32 -1, %numhighbits
4153   call void @use32(i32 %mask)
4154   %masked = and i32 %mask, %shifted
4155   ret i32 %masked
4158 define i32 @bextr32_c1_indexzext(i32 %val, i8 %numskipbits, i8 %numlowbits) nounwind {
4159 ; X86-NOBMI-LABEL: bextr32_c1_indexzext:
4160 ; X86-NOBMI:       # %bb.0:
4161 ; X86-NOBMI-NEXT:    pushl %edi
4162 ; X86-NOBMI-NEXT:    pushl %esi
4163 ; X86-NOBMI-NEXT:    pushl %eax
4164 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
4165 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
4166 ; X86-NOBMI-NEXT:    shrl %cl, %edi
4167 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
4168 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
4169 ; X86-NOBMI-NEXT:    movl $-1, %esi
4170 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
4171 ; X86-NOBMI-NEXT:    shrl %cl, %esi
4172 ; X86-NOBMI-NEXT:    movl %esi, (%esp)
4173 ; X86-NOBMI-NEXT:    calll use32
4174 ; X86-NOBMI-NEXT:    andl %edi, %esi
4175 ; X86-NOBMI-NEXT:    movl %esi, %eax
4176 ; X86-NOBMI-NEXT:    addl $4, %esp
4177 ; X86-NOBMI-NEXT:    popl %esi
4178 ; X86-NOBMI-NEXT:    popl %edi
4179 ; X86-NOBMI-NEXT:    retl
4181 ; X86-BMI1NOTBM-LABEL: bextr32_c1_indexzext:
4182 ; X86-BMI1NOTBM:       # %bb.0:
4183 ; X86-BMI1NOTBM-NEXT:    pushl %edi
4184 ; X86-BMI1NOTBM-NEXT:    pushl %esi
4185 ; X86-BMI1NOTBM-NEXT:    pushl %eax
4186 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
4187 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
4188 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
4189 ; X86-BMI1NOTBM-NEXT:    xorl %ecx, %ecx
4190 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
4191 ; X86-BMI1NOTBM-NEXT:    movl $-1, %esi
4192 ; X86-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
4193 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %esi
4194 ; X86-BMI1NOTBM-NEXT:    movl %esi, (%esp)
4195 ; X86-BMI1NOTBM-NEXT:    calll use32
4196 ; X86-BMI1NOTBM-NEXT:    andl %edi, %esi
4197 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
4198 ; X86-BMI1NOTBM-NEXT:    addl $4, %esp
4199 ; X86-BMI1NOTBM-NEXT:    popl %esi
4200 ; X86-BMI1NOTBM-NEXT:    popl %edi
4201 ; X86-BMI1NOTBM-NEXT:    retl
4203 ; X86-BMI1BMI2-LABEL: bextr32_c1_indexzext:
4204 ; X86-BMI1BMI2:       # %bb.0:
4205 ; X86-BMI1BMI2-NEXT:    pushl %ebx
4206 ; X86-BMI1BMI2-NEXT:    pushl %esi
4207 ; X86-BMI1BMI2-NEXT:    pushl %eax
4208 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
4209 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
4210 ; X86-BMI1BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %esi
4211 ; X86-BMI1BMI2-NEXT:    movl %ebx, %eax
4212 ; X86-BMI1BMI2-NEXT:    negb %al
4213 ; X86-BMI1BMI2-NEXT:    movl $-1, %ecx
4214 ; X86-BMI1BMI2-NEXT:    shrxl %eax, %ecx, %eax
4215 ; X86-BMI1BMI2-NEXT:    movl %eax, (%esp)
4216 ; X86-BMI1BMI2-NEXT:    calll use32
4217 ; X86-BMI1BMI2-NEXT:    bzhil %ebx, %esi, %eax
4218 ; X86-BMI1BMI2-NEXT:    addl $4, %esp
4219 ; X86-BMI1BMI2-NEXT:    popl %esi
4220 ; X86-BMI1BMI2-NEXT:    popl %ebx
4221 ; X86-BMI1BMI2-NEXT:    retl
4223 ; X64-NOBMI-LABEL: bextr32_c1_indexzext:
4224 ; X64-NOBMI:       # %bb.0:
4225 ; X64-NOBMI-NEXT:    pushq %rbp
4226 ; X64-NOBMI-NEXT:    pushq %rbx
4227 ; X64-NOBMI-NEXT:    pushq %rax
4228 ; X64-NOBMI-NEXT:    movl %esi, %ecx
4229 ; X64-NOBMI-NEXT:    movl %edi, %ebx
4230 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
4231 ; X64-NOBMI-NEXT:    shrl %cl, %ebx
4232 ; X64-NOBMI-NEXT:    negb %dl
4233 ; X64-NOBMI-NEXT:    movl $-1, %ebp
4234 ; X64-NOBMI-NEXT:    movl %edx, %ecx
4235 ; X64-NOBMI-NEXT:    shrl %cl, %ebp
4236 ; X64-NOBMI-NEXT:    movl %ebp, %edi
4237 ; X64-NOBMI-NEXT:    callq use32
4238 ; X64-NOBMI-NEXT:    andl %ebx, %ebp
4239 ; X64-NOBMI-NEXT:    movl %ebp, %eax
4240 ; X64-NOBMI-NEXT:    addq $8, %rsp
4241 ; X64-NOBMI-NEXT:    popq %rbx
4242 ; X64-NOBMI-NEXT:    popq %rbp
4243 ; X64-NOBMI-NEXT:    retq
4245 ; X64-BMI1NOTBM-LABEL: bextr32_c1_indexzext:
4246 ; X64-BMI1NOTBM:       # %bb.0:
4247 ; X64-BMI1NOTBM-NEXT:    pushq %rbp
4248 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
4249 ; X64-BMI1NOTBM-NEXT:    pushq %rax
4250 ; X64-BMI1NOTBM-NEXT:    movl %esi, %ecx
4251 ; X64-BMI1NOTBM-NEXT:    movl %edi, %ebx
4252 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
4253 ; X64-BMI1NOTBM-NEXT:    shrl %cl, %ebx
4254 ; X64-BMI1NOTBM-NEXT:    negb %dl
4255 ; X64-BMI1NOTBM-NEXT:    movl $-1, %ebp
4256 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
4257 ; X64-BMI1NOTBM-NEXT:    shrl %cl, %ebp
4258 ; X64-BMI1NOTBM-NEXT:    movl %ebp, %edi
4259 ; X64-BMI1NOTBM-NEXT:    callq use32
4260 ; X64-BMI1NOTBM-NEXT:    andl %ebx, %ebp
4261 ; X64-BMI1NOTBM-NEXT:    movl %ebp, %eax
4262 ; X64-BMI1NOTBM-NEXT:    addq $8, %rsp
4263 ; X64-BMI1NOTBM-NEXT:    popq %rbx
4264 ; X64-BMI1NOTBM-NEXT:    popq %rbp
4265 ; X64-BMI1NOTBM-NEXT:    retq
4267 ; X64-BMI1BMI2-LABEL: bextr32_c1_indexzext:
4268 ; X64-BMI1BMI2:       # %bb.0:
4269 ; X64-BMI1BMI2-NEXT:    pushq %rbp
4270 ; X64-BMI1BMI2-NEXT:    pushq %rbx
4271 ; X64-BMI1BMI2-NEXT:    pushq %rax
4272 ; X64-BMI1BMI2-NEXT:    movl %edx, %ebx
4273 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %ebp
4274 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
4275 ; X64-BMI1BMI2-NEXT:    negb %al
4276 ; X64-BMI1BMI2-NEXT:    movl $-1, %ecx
4277 ; X64-BMI1BMI2-NEXT:    shrxl %eax, %ecx, %edi
4278 ; X64-BMI1BMI2-NEXT:    callq use32
4279 ; X64-BMI1BMI2-NEXT:    bzhil %ebx, %ebp, %eax
4280 ; X64-BMI1BMI2-NEXT:    addq $8, %rsp
4281 ; X64-BMI1BMI2-NEXT:    popq %rbx
4282 ; X64-BMI1BMI2-NEXT:    popq %rbp
4283 ; X64-BMI1BMI2-NEXT:    retq
4284   %skip = zext i8 %numskipbits to i32
4285   %shifted = lshr i32 %val, %skip
4286   %numhighbits = sub i8 32, %numlowbits
4287   %sh_prom = zext i8 %numhighbits to i32
4288   %mask = lshr i32 -1, %sh_prom
4289   call void @use32(i32 %mask)
4290   %masked = and i32 %mask, %shifted
4291   ret i32 %masked
4294 define i32 @bextr32_c2_load(i32* %w, i32 %numskipbits, i32 %numlowbits) nounwind {
4295 ; X86-NOBMI-LABEL: bextr32_c2_load:
4296 ; X86-NOBMI:       # %bb.0:
4297 ; X86-NOBMI-NEXT:    pushl %edi
4298 ; X86-NOBMI-NEXT:    pushl %esi
4299 ; X86-NOBMI-NEXT:    pushl %eax
4300 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
4301 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
4302 ; X86-NOBMI-NEXT:    movl (%eax), %edi
4303 ; X86-NOBMI-NEXT:    shrl %cl, %edi
4304 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
4305 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
4306 ; X86-NOBMI-NEXT:    movl $-1, %esi
4307 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
4308 ; X86-NOBMI-NEXT:    shrl %cl, %esi
4309 ; X86-NOBMI-NEXT:    movl %esi, (%esp)
4310 ; X86-NOBMI-NEXT:    calll use32
4311 ; X86-NOBMI-NEXT:    andl %edi, %esi
4312 ; X86-NOBMI-NEXT:    movl %esi, %eax
4313 ; X86-NOBMI-NEXT:    addl $4, %esp
4314 ; X86-NOBMI-NEXT:    popl %esi
4315 ; X86-NOBMI-NEXT:    popl %edi
4316 ; X86-NOBMI-NEXT:    retl
4318 ; X86-BMI1NOTBM-LABEL: bextr32_c2_load:
4319 ; X86-BMI1NOTBM:       # %bb.0:
4320 ; X86-BMI1NOTBM-NEXT:    pushl %edi
4321 ; X86-BMI1NOTBM-NEXT:    pushl %esi
4322 ; X86-BMI1NOTBM-NEXT:    pushl %eax
4323 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
4324 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
4325 ; X86-BMI1NOTBM-NEXT:    movl (%eax), %edi
4326 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
4327 ; X86-BMI1NOTBM-NEXT:    xorl %ecx, %ecx
4328 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
4329 ; X86-BMI1NOTBM-NEXT:    movl $-1, %esi
4330 ; X86-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
4331 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %esi
4332 ; X86-BMI1NOTBM-NEXT:    movl %esi, (%esp)
4333 ; X86-BMI1NOTBM-NEXT:    calll use32
4334 ; X86-BMI1NOTBM-NEXT:    andl %edi, %esi
4335 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
4336 ; X86-BMI1NOTBM-NEXT:    addl $4, %esp
4337 ; X86-BMI1NOTBM-NEXT:    popl %esi
4338 ; X86-BMI1NOTBM-NEXT:    popl %edi
4339 ; X86-BMI1NOTBM-NEXT:    retl
4341 ; X86-BMI1BMI2-LABEL: bextr32_c2_load:
4342 ; X86-BMI1BMI2:       # %bb.0:
4343 ; X86-BMI1BMI2-NEXT:    pushl %ebx
4344 ; X86-BMI1BMI2-NEXT:    pushl %esi
4345 ; X86-BMI1BMI2-NEXT:    pushl %eax
4346 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
4347 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
4348 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
4349 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, (%eax), %esi
4350 ; X86-BMI1BMI2-NEXT:    movl %ebx, %eax
4351 ; X86-BMI1BMI2-NEXT:    negb %al
4352 ; X86-BMI1BMI2-NEXT:    movl $-1, %ecx
4353 ; X86-BMI1BMI2-NEXT:    shrxl %eax, %ecx, %eax
4354 ; X86-BMI1BMI2-NEXT:    movl %eax, (%esp)
4355 ; X86-BMI1BMI2-NEXT:    calll use32
4356 ; X86-BMI1BMI2-NEXT:    bzhil %ebx, %esi, %eax
4357 ; X86-BMI1BMI2-NEXT:    addl $4, %esp
4358 ; X86-BMI1BMI2-NEXT:    popl %esi
4359 ; X86-BMI1BMI2-NEXT:    popl %ebx
4360 ; X86-BMI1BMI2-NEXT:    retl
4362 ; X64-NOBMI-LABEL: bextr32_c2_load:
4363 ; X64-NOBMI:       # %bb.0:
4364 ; X64-NOBMI-NEXT:    pushq %rbp
4365 ; X64-NOBMI-NEXT:    pushq %rbx
4366 ; X64-NOBMI-NEXT:    pushq %rax
4367 ; X64-NOBMI-NEXT:    movl %esi, %ecx
4368 ; X64-NOBMI-NEXT:    movl (%rdi), %ebp
4369 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
4370 ; X64-NOBMI-NEXT:    shrl %cl, %ebp
4371 ; X64-NOBMI-NEXT:    negb %dl
4372 ; X64-NOBMI-NEXT:    movl $-1, %ebx
4373 ; X64-NOBMI-NEXT:    movl %edx, %ecx
4374 ; X64-NOBMI-NEXT:    shrl %cl, %ebx
4375 ; X64-NOBMI-NEXT:    movl %ebx, %edi
4376 ; X64-NOBMI-NEXT:    callq use32
4377 ; X64-NOBMI-NEXT:    andl %ebp, %ebx
4378 ; X64-NOBMI-NEXT:    movl %ebx, %eax
4379 ; X64-NOBMI-NEXT:    addq $8, %rsp
4380 ; X64-NOBMI-NEXT:    popq %rbx
4381 ; X64-NOBMI-NEXT:    popq %rbp
4382 ; X64-NOBMI-NEXT:    retq
4384 ; X64-BMI1NOTBM-LABEL: bextr32_c2_load:
4385 ; X64-BMI1NOTBM:       # %bb.0:
4386 ; X64-BMI1NOTBM-NEXT:    pushq %rbp
4387 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
4388 ; X64-BMI1NOTBM-NEXT:    pushq %rax
4389 ; X64-BMI1NOTBM-NEXT:    movl %esi, %ecx
4390 ; X64-BMI1NOTBM-NEXT:    movl (%rdi), %ebp
4391 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
4392 ; X64-BMI1NOTBM-NEXT:    shrl %cl, %ebp
4393 ; X64-BMI1NOTBM-NEXT:    negb %dl
4394 ; X64-BMI1NOTBM-NEXT:    movl $-1, %ebx
4395 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
4396 ; X64-BMI1NOTBM-NEXT:    shrl %cl, %ebx
4397 ; X64-BMI1NOTBM-NEXT:    movl %ebx, %edi
4398 ; X64-BMI1NOTBM-NEXT:    callq use32
4399 ; X64-BMI1NOTBM-NEXT:    andl %ebp, %ebx
4400 ; X64-BMI1NOTBM-NEXT:    movl %ebx, %eax
4401 ; X64-BMI1NOTBM-NEXT:    addq $8, %rsp
4402 ; X64-BMI1NOTBM-NEXT:    popq %rbx
4403 ; X64-BMI1NOTBM-NEXT:    popq %rbp
4404 ; X64-BMI1NOTBM-NEXT:    retq
4406 ; X64-BMI1BMI2-LABEL: bextr32_c2_load:
4407 ; X64-BMI1BMI2:       # %bb.0:
4408 ; X64-BMI1BMI2-NEXT:    pushq %rbp
4409 ; X64-BMI1BMI2-NEXT:    pushq %rbx
4410 ; X64-BMI1BMI2-NEXT:    pushq %rax
4411 ; X64-BMI1BMI2-NEXT:    movl %edx, %ebx
4412 ; X64-BMI1BMI2-NEXT:    shrxl %esi, (%rdi), %ebp
4413 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
4414 ; X64-BMI1BMI2-NEXT:    negb %al
4415 ; X64-BMI1BMI2-NEXT:    movl $-1, %ecx
4416 ; X64-BMI1BMI2-NEXT:    shrxl %eax, %ecx, %edi
4417 ; X64-BMI1BMI2-NEXT:    callq use32
4418 ; X64-BMI1BMI2-NEXT:    bzhil %ebx, %ebp, %eax
4419 ; X64-BMI1BMI2-NEXT:    addq $8, %rsp
4420 ; X64-BMI1BMI2-NEXT:    popq %rbx
4421 ; X64-BMI1BMI2-NEXT:    popq %rbp
4422 ; X64-BMI1BMI2-NEXT:    retq
4423   %val = load i32, i32* %w
4424   %shifted = lshr i32 %val, %numskipbits
4425   %numhighbits = sub i32 32, %numlowbits
4426   %mask = lshr i32 -1, %numhighbits
4427   call void @use32(i32 %mask)
4428   %masked = and i32 %mask, %shifted
4429   ret i32 %masked
4432 define i32 @bextr32_c3_load_indexzext(i32* %w, i8 %numskipbits, i8 %numlowbits) nounwind {
4433 ; X86-NOBMI-LABEL: bextr32_c3_load_indexzext:
4434 ; X86-NOBMI:       # %bb.0:
4435 ; X86-NOBMI-NEXT:    pushl %edi
4436 ; X86-NOBMI-NEXT:    pushl %esi
4437 ; X86-NOBMI-NEXT:    pushl %eax
4438 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
4439 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
4440 ; X86-NOBMI-NEXT:    movl (%eax), %edi
4441 ; X86-NOBMI-NEXT:    shrl %cl, %edi
4442 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
4443 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
4444 ; X86-NOBMI-NEXT:    movl $-1, %esi
4445 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
4446 ; X86-NOBMI-NEXT:    shrl %cl, %esi
4447 ; X86-NOBMI-NEXT:    movl %esi, (%esp)
4448 ; X86-NOBMI-NEXT:    calll use32
4449 ; X86-NOBMI-NEXT:    andl %edi, %esi
4450 ; X86-NOBMI-NEXT:    movl %esi, %eax
4451 ; X86-NOBMI-NEXT:    addl $4, %esp
4452 ; X86-NOBMI-NEXT:    popl %esi
4453 ; X86-NOBMI-NEXT:    popl %edi
4454 ; X86-NOBMI-NEXT:    retl
4456 ; X86-BMI1NOTBM-LABEL: bextr32_c3_load_indexzext:
4457 ; X86-BMI1NOTBM:       # %bb.0:
4458 ; X86-BMI1NOTBM-NEXT:    pushl %edi
4459 ; X86-BMI1NOTBM-NEXT:    pushl %esi
4460 ; X86-BMI1NOTBM-NEXT:    pushl %eax
4461 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
4462 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
4463 ; X86-BMI1NOTBM-NEXT:    movl (%eax), %edi
4464 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
4465 ; X86-BMI1NOTBM-NEXT:    xorl %ecx, %ecx
4466 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
4467 ; X86-BMI1NOTBM-NEXT:    movl $-1, %esi
4468 ; X86-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
4469 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %esi
4470 ; X86-BMI1NOTBM-NEXT:    movl %esi, (%esp)
4471 ; X86-BMI1NOTBM-NEXT:    calll use32
4472 ; X86-BMI1NOTBM-NEXT:    andl %edi, %esi
4473 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
4474 ; X86-BMI1NOTBM-NEXT:    addl $4, %esp
4475 ; X86-BMI1NOTBM-NEXT:    popl %esi
4476 ; X86-BMI1NOTBM-NEXT:    popl %edi
4477 ; X86-BMI1NOTBM-NEXT:    retl
4479 ; X86-BMI1BMI2-LABEL: bextr32_c3_load_indexzext:
4480 ; X86-BMI1BMI2:       # %bb.0:
4481 ; X86-BMI1BMI2-NEXT:    pushl %ebx
4482 ; X86-BMI1BMI2-NEXT:    pushl %esi
4483 ; X86-BMI1BMI2-NEXT:    pushl %eax
4484 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
4485 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
4486 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
4487 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, (%eax), %esi
4488 ; X86-BMI1BMI2-NEXT:    movl %ebx, %eax
4489 ; X86-BMI1BMI2-NEXT:    negb %al
4490 ; X86-BMI1BMI2-NEXT:    movl $-1, %ecx
4491 ; X86-BMI1BMI2-NEXT:    shrxl %eax, %ecx, %eax
4492 ; X86-BMI1BMI2-NEXT:    movl %eax, (%esp)
4493 ; X86-BMI1BMI2-NEXT:    calll use32
4494 ; X86-BMI1BMI2-NEXT:    bzhil %ebx, %esi, %eax
4495 ; X86-BMI1BMI2-NEXT:    addl $4, %esp
4496 ; X86-BMI1BMI2-NEXT:    popl %esi
4497 ; X86-BMI1BMI2-NEXT:    popl %ebx
4498 ; X86-BMI1BMI2-NEXT:    retl
4500 ; X64-NOBMI-LABEL: bextr32_c3_load_indexzext:
4501 ; X64-NOBMI:       # %bb.0:
4502 ; X64-NOBMI-NEXT:    pushq %rbp
4503 ; X64-NOBMI-NEXT:    pushq %rbx
4504 ; X64-NOBMI-NEXT:    pushq %rax
4505 ; X64-NOBMI-NEXT:    movl %esi, %ecx
4506 ; X64-NOBMI-NEXT:    movl (%rdi), %ebp
4507 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
4508 ; X64-NOBMI-NEXT:    shrl %cl, %ebp
4509 ; X64-NOBMI-NEXT:    negb %dl
4510 ; X64-NOBMI-NEXT:    movl $-1, %ebx
4511 ; X64-NOBMI-NEXT:    movl %edx, %ecx
4512 ; X64-NOBMI-NEXT:    shrl %cl, %ebx
4513 ; X64-NOBMI-NEXT:    movl %ebx, %edi
4514 ; X64-NOBMI-NEXT:    callq use32
4515 ; X64-NOBMI-NEXT:    andl %ebp, %ebx
4516 ; X64-NOBMI-NEXT:    movl %ebx, %eax
4517 ; X64-NOBMI-NEXT:    addq $8, %rsp
4518 ; X64-NOBMI-NEXT:    popq %rbx
4519 ; X64-NOBMI-NEXT:    popq %rbp
4520 ; X64-NOBMI-NEXT:    retq
4522 ; X64-BMI1NOTBM-LABEL: bextr32_c3_load_indexzext:
4523 ; X64-BMI1NOTBM:       # %bb.0:
4524 ; X64-BMI1NOTBM-NEXT:    pushq %rbp
4525 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
4526 ; X64-BMI1NOTBM-NEXT:    pushq %rax
4527 ; X64-BMI1NOTBM-NEXT:    movl %esi, %ecx
4528 ; X64-BMI1NOTBM-NEXT:    movl (%rdi), %ebp
4529 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
4530 ; X64-BMI1NOTBM-NEXT:    shrl %cl, %ebp
4531 ; X64-BMI1NOTBM-NEXT:    negb %dl
4532 ; X64-BMI1NOTBM-NEXT:    movl $-1, %ebx
4533 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
4534 ; X64-BMI1NOTBM-NEXT:    shrl %cl, %ebx
4535 ; X64-BMI1NOTBM-NEXT:    movl %ebx, %edi
4536 ; X64-BMI1NOTBM-NEXT:    callq use32
4537 ; X64-BMI1NOTBM-NEXT:    andl %ebp, %ebx
4538 ; X64-BMI1NOTBM-NEXT:    movl %ebx, %eax
4539 ; X64-BMI1NOTBM-NEXT:    addq $8, %rsp
4540 ; X64-BMI1NOTBM-NEXT:    popq %rbx
4541 ; X64-BMI1NOTBM-NEXT:    popq %rbp
4542 ; X64-BMI1NOTBM-NEXT:    retq
4544 ; X64-BMI1BMI2-LABEL: bextr32_c3_load_indexzext:
4545 ; X64-BMI1BMI2:       # %bb.0:
4546 ; X64-BMI1BMI2-NEXT:    pushq %rbp
4547 ; X64-BMI1BMI2-NEXT:    pushq %rbx
4548 ; X64-BMI1BMI2-NEXT:    pushq %rax
4549 ; X64-BMI1BMI2-NEXT:    movl %edx, %ebx
4550 ; X64-BMI1BMI2-NEXT:    shrxl %esi, (%rdi), %ebp
4551 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
4552 ; X64-BMI1BMI2-NEXT:    negb %al
4553 ; X64-BMI1BMI2-NEXT:    movl $-1, %ecx
4554 ; X64-BMI1BMI2-NEXT:    shrxl %eax, %ecx, %edi
4555 ; X64-BMI1BMI2-NEXT:    callq use32
4556 ; X64-BMI1BMI2-NEXT:    bzhil %ebx, %ebp, %eax
4557 ; X64-BMI1BMI2-NEXT:    addq $8, %rsp
4558 ; X64-BMI1BMI2-NEXT:    popq %rbx
4559 ; X64-BMI1BMI2-NEXT:    popq %rbp
4560 ; X64-BMI1BMI2-NEXT:    retq
4561   %val = load i32, i32* %w
4562   %skip = zext i8 %numskipbits to i32
4563   %shifted = lshr i32 %val, %skip
4564   %numhighbits = sub i8 32, %numlowbits
4565   %sh_prom = zext i8 %numhighbits to i32
4566   %mask = lshr i32 -1, %sh_prom
4567   call void @use32(i32 %mask)
4568   %masked = and i32 %mask, %shifted
4569   ret i32 %masked
4572 define i32 @bextr32_c4_commutative(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
4573 ; X86-NOBMI-LABEL: bextr32_c4_commutative:
4574 ; X86-NOBMI:       # %bb.0:
4575 ; X86-NOBMI-NEXT:    pushl %edi
4576 ; X86-NOBMI-NEXT:    pushl %esi
4577 ; X86-NOBMI-NEXT:    pushl %eax
4578 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
4579 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
4580 ; X86-NOBMI-NEXT:    shrl %cl, %edi
4581 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
4582 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
4583 ; X86-NOBMI-NEXT:    movl $-1, %esi
4584 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
4585 ; X86-NOBMI-NEXT:    shrl %cl, %esi
4586 ; X86-NOBMI-NEXT:    movl %esi, (%esp)
4587 ; X86-NOBMI-NEXT:    calll use32
4588 ; X86-NOBMI-NEXT:    andl %edi, %esi
4589 ; X86-NOBMI-NEXT:    movl %esi, %eax
4590 ; X86-NOBMI-NEXT:    addl $4, %esp
4591 ; X86-NOBMI-NEXT:    popl %esi
4592 ; X86-NOBMI-NEXT:    popl %edi
4593 ; X86-NOBMI-NEXT:    retl
4595 ; X86-BMI1NOTBM-LABEL: bextr32_c4_commutative:
4596 ; X86-BMI1NOTBM:       # %bb.0:
4597 ; X86-BMI1NOTBM-NEXT:    pushl %edi
4598 ; X86-BMI1NOTBM-NEXT:    pushl %esi
4599 ; X86-BMI1NOTBM-NEXT:    pushl %eax
4600 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
4601 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
4602 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
4603 ; X86-BMI1NOTBM-NEXT:    xorl %ecx, %ecx
4604 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
4605 ; X86-BMI1NOTBM-NEXT:    movl $-1, %esi
4606 ; X86-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
4607 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %esi
4608 ; X86-BMI1NOTBM-NEXT:    movl %esi, (%esp)
4609 ; X86-BMI1NOTBM-NEXT:    calll use32
4610 ; X86-BMI1NOTBM-NEXT:    andl %edi, %esi
4611 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
4612 ; X86-BMI1NOTBM-NEXT:    addl $4, %esp
4613 ; X86-BMI1NOTBM-NEXT:    popl %esi
4614 ; X86-BMI1NOTBM-NEXT:    popl %edi
4615 ; X86-BMI1NOTBM-NEXT:    retl
4617 ; X86-BMI1BMI2-LABEL: bextr32_c4_commutative:
4618 ; X86-BMI1BMI2:       # %bb.0:
4619 ; X86-BMI1BMI2-NEXT:    pushl %ebx
4620 ; X86-BMI1BMI2-NEXT:    pushl %esi
4621 ; X86-BMI1BMI2-NEXT:    pushl %eax
4622 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
4623 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
4624 ; X86-BMI1BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %esi
4625 ; X86-BMI1BMI2-NEXT:    movl %ebx, %eax
4626 ; X86-BMI1BMI2-NEXT:    negb %al
4627 ; X86-BMI1BMI2-NEXT:    movl $-1, %ecx
4628 ; X86-BMI1BMI2-NEXT:    shrxl %eax, %ecx, %eax
4629 ; X86-BMI1BMI2-NEXT:    movl %eax, (%esp)
4630 ; X86-BMI1BMI2-NEXT:    calll use32
4631 ; X86-BMI1BMI2-NEXT:    bzhil %ebx, %esi, %eax
4632 ; X86-BMI1BMI2-NEXT:    addl $4, %esp
4633 ; X86-BMI1BMI2-NEXT:    popl %esi
4634 ; X86-BMI1BMI2-NEXT:    popl %ebx
4635 ; X86-BMI1BMI2-NEXT:    retl
4637 ; X64-NOBMI-LABEL: bextr32_c4_commutative:
4638 ; X64-NOBMI:       # %bb.0:
4639 ; X64-NOBMI-NEXT:    pushq %rbp
4640 ; X64-NOBMI-NEXT:    pushq %rbx
4641 ; X64-NOBMI-NEXT:    pushq %rax
4642 ; X64-NOBMI-NEXT:    movl %esi, %ecx
4643 ; X64-NOBMI-NEXT:    movl %edi, %ebx
4644 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
4645 ; X64-NOBMI-NEXT:    shrl %cl, %ebx
4646 ; X64-NOBMI-NEXT:    negb %dl
4647 ; X64-NOBMI-NEXT:    movl $-1, %ebp
4648 ; X64-NOBMI-NEXT:    movl %edx, %ecx
4649 ; X64-NOBMI-NEXT:    shrl %cl, %ebp
4650 ; X64-NOBMI-NEXT:    movl %ebp, %edi
4651 ; X64-NOBMI-NEXT:    callq use32
4652 ; X64-NOBMI-NEXT:    andl %ebx, %ebp
4653 ; X64-NOBMI-NEXT:    movl %ebp, %eax
4654 ; X64-NOBMI-NEXT:    addq $8, %rsp
4655 ; X64-NOBMI-NEXT:    popq %rbx
4656 ; X64-NOBMI-NEXT:    popq %rbp
4657 ; X64-NOBMI-NEXT:    retq
4659 ; X64-BMI1NOTBM-LABEL: bextr32_c4_commutative:
4660 ; X64-BMI1NOTBM:       # %bb.0:
4661 ; X64-BMI1NOTBM-NEXT:    pushq %rbp
4662 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
4663 ; X64-BMI1NOTBM-NEXT:    pushq %rax
4664 ; X64-BMI1NOTBM-NEXT:    movl %esi, %ecx
4665 ; X64-BMI1NOTBM-NEXT:    movl %edi, %ebx
4666 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
4667 ; X64-BMI1NOTBM-NEXT:    shrl %cl, %ebx
4668 ; X64-BMI1NOTBM-NEXT:    negb %dl
4669 ; X64-BMI1NOTBM-NEXT:    movl $-1, %ebp
4670 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
4671 ; X64-BMI1NOTBM-NEXT:    shrl %cl, %ebp
4672 ; X64-BMI1NOTBM-NEXT:    movl %ebp, %edi
4673 ; X64-BMI1NOTBM-NEXT:    callq use32
4674 ; X64-BMI1NOTBM-NEXT:    andl %ebx, %ebp
4675 ; X64-BMI1NOTBM-NEXT:    movl %ebp, %eax
4676 ; X64-BMI1NOTBM-NEXT:    addq $8, %rsp
4677 ; X64-BMI1NOTBM-NEXT:    popq %rbx
4678 ; X64-BMI1NOTBM-NEXT:    popq %rbp
4679 ; X64-BMI1NOTBM-NEXT:    retq
4681 ; X64-BMI1BMI2-LABEL: bextr32_c4_commutative:
4682 ; X64-BMI1BMI2:       # %bb.0:
4683 ; X64-BMI1BMI2-NEXT:    pushq %rbp
4684 ; X64-BMI1BMI2-NEXT:    pushq %rbx
4685 ; X64-BMI1BMI2-NEXT:    pushq %rax
4686 ; X64-BMI1BMI2-NEXT:    movl %edx, %ebx
4687 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %ebp
4688 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
4689 ; X64-BMI1BMI2-NEXT:    negb %al
4690 ; X64-BMI1BMI2-NEXT:    movl $-1, %ecx
4691 ; X64-BMI1BMI2-NEXT:    shrxl %eax, %ecx, %edi
4692 ; X64-BMI1BMI2-NEXT:    callq use32
4693 ; X64-BMI1BMI2-NEXT:    bzhil %ebx, %ebp, %eax
4694 ; X64-BMI1BMI2-NEXT:    addq $8, %rsp
4695 ; X64-BMI1BMI2-NEXT:    popq %rbx
4696 ; X64-BMI1BMI2-NEXT:    popq %rbp
4697 ; X64-BMI1BMI2-NEXT:    retq
4698   %shifted = lshr i32 %val, %numskipbits
4699   %numhighbits = sub i32 32, %numlowbits
4700   %mask = lshr i32 -1, %numhighbits
4701   call void @use32(i32 %mask)
4702   %masked = and i32 %shifted, %mask ; swapped order
4703   ret i32 %masked
4706 define i32 @bextr32_c5_skipextrauses(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
4707 ; X86-NOBMI-LABEL: bextr32_c5_skipextrauses:
4708 ; X86-NOBMI:       # %bb.0:
4709 ; X86-NOBMI-NEXT:    pushl %ebx
4710 ; X86-NOBMI-NEXT:    pushl %edi
4711 ; X86-NOBMI-NEXT:    pushl %esi
4712 ; X86-NOBMI-NEXT:    subl $16, %esp
4713 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
4714 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ebx
4715 ; X86-NOBMI-NEXT:    movl %ebx, %ecx
4716 ; X86-NOBMI-NEXT:    shrl %cl, %edi
4717 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
4718 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
4719 ; X86-NOBMI-NEXT:    movl $-1, %esi
4720 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
4721 ; X86-NOBMI-NEXT:    shrl %cl, %esi
4722 ; X86-NOBMI-NEXT:    movl %esi, (%esp)
4723 ; X86-NOBMI-NEXT:    calll use32
4724 ; X86-NOBMI-NEXT:    andl %edi, %esi
4725 ; X86-NOBMI-NEXT:    movl %ebx, (%esp)
4726 ; X86-NOBMI-NEXT:    calll use32
4727 ; X86-NOBMI-NEXT:    movl %esi, %eax
4728 ; X86-NOBMI-NEXT:    addl $16, %esp
4729 ; X86-NOBMI-NEXT:    popl %esi
4730 ; X86-NOBMI-NEXT:    popl %edi
4731 ; X86-NOBMI-NEXT:    popl %ebx
4732 ; X86-NOBMI-NEXT:    retl
4734 ; X86-BMI1NOTBM-LABEL: bextr32_c5_skipextrauses:
4735 ; X86-BMI1NOTBM:       # %bb.0:
4736 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
4737 ; X86-BMI1NOTBM-NEXT:    pushl %edi
4738 ; X86-BMI1NOTBM-NEXT:    pushl %esi
4739 ; X86-BMI1NOTBM-NEXT:    subl $16, %esp
4740 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
4741 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %ebx
4742 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %ecx
4743 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
4744 ; X86-BMI1NOTBM-NEXT:    xorl %ecx, %ecx
4745 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
4746 ; X86-BMI1NOTBM-NEXT:    movl $-1, %esi
4747 ; X86-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
4748 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %esi
4749 ; X86-BMI1NOTBM-NEXT:    movl %esi, (%esp)
4750 ; X86-BMI1NOTBM-NEXT:    calll use32
4751 ; X86-BMI1NOTBM-NEXT:    andl %edi, %esi
4752 ; X86-BMI1NOTBM-NEXT:    movl %ebx, (%esp)
4753 ; X86-BMI1NOTBM-NEXT:    calll use32
4754 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
4755 ; X86-BMI1NOTBM-NEXT:    addl $16, %esp
4756 ; X86-BMI1NOTBM-NEXT:    popl %esi
4757 ; X86-BMI1NOTBM-NEXT:    popl %edi
4758 ; X86-BMI1NOTBM-NEXT:    popl %ebx
4759 ; X86-BMI1NOTBM-NEXT:    retl
4761 ; X86-BMI1BMI2-LABEL: bextr32_c5_skipextrauses:
4762 ; X86-BMI1BMI2:       # %bb.0:
4763 ; X86-BMI1BMI2-NEXT:    pushl %ebx
4764 ; X86-BMI1BMI2-NEXT:    pushl %edi
4765 ; X86-BMI1BMI2-NEXT:    pushl %esi
4766 ; X86-BMI1BMI2-NEXT:    subl $16, %esp
4767 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %bl
4768 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edi
4769 ; X86-BMI1BMI2-NEXT:    shrxl %edi, {{[0-9]+}}(%esp), %esi
4770 ; X86-BMI1BMI2-NEXT:    movl %ebx, %eax
4771 ; X86-BMI1BMI2-NEXT:    negb %al
4772 ; X86-BMI1BMI2-NEXT:    movl $-1, %ecx
4773 ; X86-BMI1BMI2-NEXT:    shrxl %eax, %ecx, %eax
4774 ; X86-BMI1BMI2-NEXT:    movl %eax, (%esp)
4775 ; X86-BMI1BMI2-NEXT:    calll use32
4776 ; X86-BMI1BMI2-NEXT:    bzhil %ebx, %esi, %esi
4777 ; X86-BMI1BMI2-NEXT:    movl %edi, (%esp)
4778 ; X86-BMI1BMI2-NEXT:    calll use32
4779 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
4780 ; X86-BMI1BMI2-NEXT:    addl $16, %esp
4781 ; X86-BMI1BMI2-NEXT:    popl %esi
4782 ; X86-BMI1BMI2-NEXT:    popl %edi
4783 ; X86-BMI1BMI2-NEXT:    popl %ebx
4784 ; X86-BMI1BMI2-NEXT:    retl
4786 ; X64-NOBMI-LABEL: bextr32_c5_skipextrauses:
4787 ; X64-NOBMI:       # %bb.0:
4788 ; X64-NOBMI-NEXT:    pushq %rbp
4789 ; X64-NOBMI-NEXT:    pushq %r14
4790 ; X64-NOBMI-NEXT:    pushq %rbx
4791 ; X64-NOBMI-NEXT:    movl %esi, %r14d
4792 ; X64-NOBMI-NEXT:    movl %edi, %ebp
4793 ; X64-NOBMI-NEXT:    movl %r14d, %ecx
4794 ; X64-NOBMI-NEXT:    shrl %cl, %ebp
4795 ; X64-NOBMI-NEXT:    negb %dl
4796 ; X64-NOBMI-NEXT:    movl $-1, %ebx
4797 ; X64-NOBMI-NEXT:    movl %edx, %ecx
4798 ; X64-NOBMI-NEXT:    shrl %cl, %ebx
4799 ; X64-NOBMI-NEXT:    movl %ebx, %edi
4800 ; X64-NOBMI-NEXT:    callq use32
4801 ; X64-NOBMI-NEXT:    andl %ebp, %ebx
4802 ; X64-NOBMI-NEXT:    movl %r14d, %edi
4803 ; X64-NOBMI-NEXT:    callq use32
4804 ; X64-NOBMI-NEXT:    movl %ebx, %eax
4805 ; X64-NOBMI-NEXT:    popq %rbx
4806 ; X64-NOBMI-NEXT:    popq %r14
4807 ; X64-NOBMI-NEXT:    popq %rbp
4808 ; X64-NOBMI-NEXT:    retq
4810 ; X64-BMI1NOTBM-LABEL: bextr32_c5_skipextrauses:
4811 ; X64-BMI1NOTBM:       # %bb.0:
4812 ; X64-BMI1NOTBM-NEXT:    pushq %rbp
4813 ; X64-BMI1NOTBM-NEXT:    pushq %r14
4814 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
4815 ; X64-BMI1NOTBM-NEXT:    movl %esi, %r14d
4816 ; X64-BMI1NOTBM-NEXT:    movl %edi, %ebp
4817 ; X64-BMI1NOTBM-NEXT:    movl %r14d, %ecx
4818 ; X64-BMI1NOTBM-NEXT:    shrl %cl, %ebp
4819 ; X64-BMI1NOTBM-NEXT:    negb %dl
4820 ; X64-BMI1NOTBM-NEXT:    movl $-1, %ebx
4821 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
4822 ; X64-BMI1NOTBM-NEXT:    shrl %cl, %ebx
4823 ; X64-BMI1NOTBM-NEXT:    movl %ebx, %edi
4824 ; X64-BMI1NOTBM-NEXT:    callq use32
4825 ; X64-BMI1NOTBM-NEXT:    andl %ebp, %ebx
4826 ; X64-BMI1NOTBM-NEXT:    movl %r14d, %edi
4827 ; X64-BMI1NOTBM-NEXT:    callq use32
4828 ; X64-BMI1NOTBM-NEXT:    movl %ebx, %eax
4829 ; X64-BMI1NOTBM-NEXT:    popq %rbx
4830 ; X64-BMI1NOTBM-NEXT:    popq %r14
4831 ; X64-BMI1NOTBM-NEXT:    popq %rbp
4832 ; X64-BMI1NOTBM-NEXT:    retq
4834 ; X64-BMI1BMI2-LABEL: bextr32_c5_skipextrauses:
4835 ; X64-BMI1BMI2:       # %bb.0:
4836 ; X64-BMI1BMI2-NEXT:    pushq %rbp
4837 ; X64-BMI1BMI2-NEXT:    pushq %r14
4838 ; X64-BMI1BMI2-NEXT:    pushq %rbx
4839 ; X64-BMI1BMI2-NEXT:    movl %edx, %ebx
4840 ; X64-BMI1BMI2-NEXT:    movl %esi, %ebp
4841 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %r14d
4842 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
4843 ; X64-BMI1BMI2-NEXT:    negb %al
4844 ; X64-BMI1BMI2-NEXT:    movl $-1, %ecx
4845 ; X64-BMI1BMI2-NEXT:    shrxl %eax, %ecx, %edi
4846 ; X64-BMI1BMI2-NEXT:    callq use32
4847 ; X64-BMI1BMI2-NEXT:    bzhil %ebx, %r14d, %ebx
4848 ; X64-BMI1BMI2-NEXT:    movl %ebp, %edi
4849 ; X64-BMI1BMI2-NEXT:    callq use32
4850 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
4851 ; X64-BMI1BMI2-NEXT:    popq %rbx
4852 ; X64-BMI1BMI2-NEXT:    popq %r14
4853 ; X64-BMI1BMI2-NEXT:    popq %rbp
4854 ; X64-BMI1BMI2-NEXT:    retq
4855   %shifted = lshr i32 %val, %numskipbits
4856   %numhighbits = sub i32 32, %numlowbits
4857   %mask = lshr i32 -1, %numhighbits
4858   call void @use32(i32 %mask)
4859   %masked = and i32 %mask, %shifted
4860   call void @use32(i32 %numskipbits)
4861   ret i32 %masked
4864 ; 64-bit
4866 define i64 @bextr64_c0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
4867 ; X86-NOBMI-LABEL: bextr64_c0:
4868 ; X86-NOBMI:       # %bb.0:
4869 ; X86-NOBMI-NEXT:    pushl %ebp
4870 ; X86-NOBMI-NEXT:    pushl %ebx
4871 ; X86-NOBMI-NEXT:    pushl %edi
4872 ; X86-NOBMI-NEXT:    pushl %esi
4873 ; X86-NOBMI-NEXT:    subl $12, %esp
4874 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
4875 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
4876 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
4877 ; X86-NOBMI-NEXT:    movl %eax, %edi
4878 ; X86-NOBMI-NEXT:    shrl %cl, %edi
4879 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
4880 ; X86-NOBMI-NEXT:    testb $32, %cl
4881 ; X86-NOBMI-NEXT:    je .LBB41_2
4882 ; X86-NOBMI-NEXT:  # %bb.1:
4883 ; X86-NOBMI-NEXT:    movl %edi, %esi
4884 ; X86-NOBMI-NEXT:    xorl %edi, %edi
4885 ; X86-NOBMI-NEXT:  .LBB41_2:
4886 ; X86-NOBMI-NEXT:    movb $64, %cl
4887 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
4888 ; X86-NOBMI-NEXT:    movl $-1, %ebp
4889 ; X86-NOBMI-NEXT:    movl $-1, %ebx
4890 ; X86-NOBMI-NEXT:    shrl %cl, %ebx
4891 ; X86-NOBMI-NEXT:    shrdl %cl, %ebp, %ebp
4892 ; X86-NOBMI-NEXT:    testb $32, %cl
4893 ; X86-NOBMI-NEXT:    je .LBB41_4
4894 ; X86-NOBMI-NEXT:  # %bb.3:
4895 ; X86-NOBMI-NEXT:    movl %ebx, %ebp
4896 ; X86-NOBMI-NEXT:    xorl %ebx, %ebx
4897 ; X86-NOBMI-NEXT:  .LBB41_4:
4898 ; X86-NOBMI-NEXT:    subl $8, %esp
4899 ; X86-NOBMI-NEXT:    pushl %ebx
4900 ; X86-NOBMI-NEXT:    pushl %ebp
4901 ; X86-NOBMI-NEXT:    calll use64
4902 ; X86-NOBMI-NEXT:    addl $16, %esp
4903 ; X86-NOBMI-NEXT:    andl %ebp, %esi
4904 ; X86-NOBMI-NEXT:    andl %ebx, %edi
4905 ; X86-NOBMI-NEXT:    movl %esi, %eax
4906 ; X86-NOBMI-NEXT:    movl %edi, %edx
4907 ; X86-NOBMI-NEXT:    addl $12, %esp
4908 ; X86-NOBMI-NEXT:    popl %esi
4909 ; X86-NOBMI-NEXT:    popl %edi
4910 ; X86-NOBMI-NEXT:    popl %ebx
4911 ; X86-NOBMI-NEXT:    popl %ebp
4912 ; X86-NOBMI-NEXT:    retl
4914 ; X86-BMI1NOTBM-LABEL: bextr64_c0:
4915 ; X86-BMI1NOTBM:       # %bb.0:
4916 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
4917 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
4918 ; X86-BMI1NOTBM-NEXT:    pushl %edi
4919 ; X86-BMI1NOTBM-NEXT:    pushl %esi
4920 ; X86-BMI1NOTBM-NEXT:    subl $12, %esp
4921 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
4922 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
4923 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
4924 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
4925 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
4926 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %esi
4927 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
4928 ; X86-BMI1NOTBM-NEXT:    je .LBB41_2
4929 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
4930 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
4931 ; X86-BMI1NOTBM-NEXT:    xorl %edi, %edi
4932 ; X86-BMI1NOTBM-NEXT:  .LBB41_2:
4933 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
4934 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
4935 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebp
4936 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebx
4937 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %ebx
4938 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %ebp, %ebp
4939 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
4940 ; X86-BMI1NOTBM-NEXT:    je .LBB41_4
4941 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
4942 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %ebp
4943 ; X86-BMI1NOTBM-NEXT:    xorl %ebx, %ebx
4944 ; X86-BMI1NOTBM-NEXT:  .LBB41_4:
4945 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
4946 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
4947 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
4948 ; X86-BMI1NOTBM-NEXT:    calll use64
4949 ; X86-BMI1NOTBM-NEXT:    addl $16, %esp
4950 ; X86-BMI1NOTBM-NEXT:    andl %ebp, %esi
4951 ; X86-BMI1NOTBM-NEXT:    andl %ebx, %edi
4952 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
4953 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
4954 ; X86-BMI1NOTBM-NEXT:    addl $12, %esp
4955 ; X86-BMI1NOTBM-NEXT:    popl %esi
4956 ; X86-BMI1NOTBM-NEXT:    popl %edi
4957 ; X86-BMI1NOTBM-NEXT:    popl %ebx
4958 ; X86-BMI1NOTBM-NEXT:    popl %ebp
4959 ; X86-BMI1NOTBM-NEXT:    retl
4961 ; X86-BMI1BMI2-LABEL: bextr64_c0:
4962 ; X86-BMI1BMI2:       # %bb.0:
4963 ; X86-BMI1BMI2-NEXT:    pushl %ebp
4964 ; X86-BMI1BMI2-NEXT:    pushl %ebx
4965 ; X86-BMI1BMI2-NEXT:    pushl %edi
4966 ; X86-BMI1BMI2-NEXT:    pushl %esi
4967 ; X86-BMI1BMI2-NEXT:    subl $12, %esp
4968 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
4969 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
4970 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
4971 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
4972 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edi
4973 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
4974 ; X86-BMI1BMI2-NEXT:    je .LBB41_2
4975 ; X86-BMI1BMI2-NEXT:  # %bb.1:
4976 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
4977 ; X86-BMI1BMI2-NEXT:    xorl %edi, %edi
4978 ; X86-BMI1BMI2-NEXT:  .LBB41_2:
4979 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
4980 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
4981 ; X86-BMI1BMI2-NEXT:    movl $-1, %ebx
4982 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %ebx, %ebp
4983 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %ebx, %ebx
4984 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
4985 ; X86-BMI1BMI2-NEXT:    je .LBB41_4
4986 ; X86-BMI1BMI2-NEXT:  # %bb.3:
4987 ; X86-BMI1BMI2-NEXT:    movl %ebp, %ebx
4988 ; X86-BMI1BMI2-NEXT:    xorl %ebp, %ebp
4989 ; X86-BMI1BMI2-NEXT:  .LBB41_4:
4990 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
4991 ; X86-BMI1BMI2-NEXT:    pushl %ebp
4992 ; X86-BMI1BMI2-NEXT:    pushl %ebx
4993 ; X86-BMI1BMI2-NEXT:    calll use64
4994 ; X86-BMI1BMI2-NEXT:    addl $16, %esp
4995 ; X86-BMI1BMI2-NEXT:    andl %ebx, %esi
4996 ; X86-BMI1BMI2-NEXT:    andl %ebp, %edi
4997 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
4998 ; X86-BMI1BMI2-NEXT:    movl %edi, %edx
4999 ; X86-BMI1BMI2-NEXT:    addl $12, %esp
5000 ; X86-BMI1BMI2-NEXT:    popl %esi
5001 ; X86-BMI1BMI2-NEXT:    popl %edi
5002 ; X86-BMI1BMI2-NEXT:    popl %ebx
5003 ; X86-BMI1BMI2-NEXT:    popl %ebp
5004 ; X86-BMI1BMI2-NEXT:    retl
5006 ; X64-NOBMI-LABEL: bextr64_c0:
5007 ; X64-NOBMI:       # %bb.0:
5008 ; X64-NOBMI-NEXT:    pushq %r14
5009 ; X64-NOBMI-NEXT:    pushq %rbx
5010 ; X64-NOBMI-NEXT:    pushq %rax
5011 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
5012 ; X64-NOBMI-NEXT:    movq %rdi, %r14
5013 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
5014 ; X64-NOBMI-NEXT:    shrq %cl, %r14
5015 ; X64-NOBMI-NEXT:    negb %dl
5016 ; X64-NOBMI-NEXT:    movq $-1, %rbx
5017 ; X64-NOBMI-NEXT:    movl %edx, %ecx
5018 ; X64-NOBMI-NEXT:    shrq %cl, %rbx
5019 ; X64-NOBMI-NEXT:    movq %rbx, %rdi
5020 ; X64-NOBMI-NEXT:    callq use64
5021 ; X64-NOBMI-NEXT:    andq %r14, %rbx
5022 ; X64-NOBMI-NEXT:    movq %rbx, %rax
5023 ; X64-NOBMI-NEXT:    addq $8, %rsp
5024 ; X64-NOBMI-NEXT:    popq %rbx
5025 ; X64-NOBMI-NEXT:    popq %r14
5026 ; X64-NOBMI-NEXT:    retq
5028 ; X64-BMI1NOTBM-LABEL: bextr64_c0:
5029 ; X64-BMI1NOTBM:       # %bb.0:
5030 ; X64-BMI1NOTBM-NEXT:    pushq %r14
5031 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
5032 ; X64-BMI1NOTBM-NEXT:    pushq %rax
5033 ; X64-BMI1NOTBM-NEXT:    movq %rsi, %rcx
5034 ; X64-BMI1NOTBM-NEXT:    movq %rdi, %r14
5035 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $rcx
5036 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %r14
5037 ; X64-BMI1NOTBM-NEXT:    negb %dl
5038 ; X64-BMI1NOTBM-NEXT:    movq $-1, %rbx
5039 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
5040 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %rbx
5041 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rdi
5042 ; X64-BMI1NOTBM-NEXT:    callq use64
5043 ; X64-BMI1NOTBM-NEXT:    andq %r14, %rbx
5044 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rax
5045 ; X64-BMI1NOTBM-NEXT:    addq $8, %rsp
5046 ; X64-BMI1NOTBM-NEXT:    popq %rbx
5047 ; X64-BMI1NOTBM-NEXT:    popq %r14
5048 ; X64-BMI1NOTBM-NEXT:    retq
5050 ; X64-BMI1BMI2-LABEL: bextr64_c0:
5051 ; X64-BMI1BMI2:       # %bb.0:
5052 ; X64-BMI1BMI2-NEXT:    pushq %r14
5053 ; X64-BMI1BMI2-NEXT:    pushq %rbx
5054 ; X64-BMI1BMI2-NEXT:    pushq %rax
5055 ; X64-BMI1BMI2-NEXT:    movq %rdx, %rbx
5056 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %r14
5057 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
5058 ; X64-BMI1BMI2-NEXT:    negb %al
5059 ; X64-BMI1BMI2-NEXT:    movq $-1, %rcx
5060 ; X64-BMI1BMI2-NEXT:    shrxq %rax, %rcx, %rdi
5061 ; X64-BMI1BMI2-NEXT:    callq use64
5062 ; X64-BMI1BMI2-NEXT:    bzhiq %rbx, %r14, %rax
5063 ; X64-BMI1BMI2-NEXT:    addq $8, %rsp
5064 ; X64-BMI1BMI2-NEXT:    popq %rbx
5065 ; X64-BMI1BMI2-NEXT:    popq %r14
5066 ; X64-BMI1BMI2-NEXT:    retq
5067   %shifted = lshr i64 %val, %numskipbits
5068   %numhighbits = sub i64 64, %numlowbits
5069   %mask = lshr i64 -1, %numhighbits
5070   call void @use64(i64 %mask)
5071   %masked = and i64 %mask, %shifted
5072   ret i64 %masked
5075 define i64 @bextr64_c1_indexzext(i64 %val, i8 %numskipbits, i8 %numlowbits) nounwind {
5076 ; X86-NOBMI-LABEL: bextr64_c1_indexzext:
5077 ; X86-NOBMI:       # %bb.0:
5078 ; X86-NOBMI-NEXT:    pushl %ebp
5079 ; X86-NOBMI-NEXT:    pushl %ebx
5080 ; X86-NOBMI-NEXT:    pushl %edi
5081 ; X86-NOBMI-NEXT:    pushl %esi
5082 ; X86-NOBMI-NEXT:    subl $12, %esp
5083 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
5084 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
5085 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
5086 ; X86-NOBMI-NEXT:    movl %eax, %edi
5087 ; X86-NOBMI-NEXT:    shrl %cl, %edi
5088 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
5089 ; X86-NOBMI-NEXT:    testb $32, %cl
5090 ; X86-NOBMI-NEXT:    je .LBB42_2
5091 ; X86-NOBMI-NEXT:  # %bb.1:
5092 ; X86-NOBMI-NEXT:    movl %edi, %esi
5093 ; X86-NOBMI-NEXT:    xorl %edi, %edi
5094 ; X86-NOBMI-NEXT:  .LBB42_2:
5095 ; X86-NOBMI-NEXT:    movb $64, %cl
5096 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
5097 ; X86-NOBMI-NEXT:    movl $-1, %ebp
5098 ; X86-NOBMI-NEXT:    movl $-1, %ebx
5099 ; X86-NOBMI-NEXT:    shrl %cl, %ebx
5100 ; X86-NOBMI-NEXT:    shrdl %cl, %ebp, %ebp
5101 ; X86-NOBMI-NEXT:    testb $32, %cl
5102 ; X86-NOBMI-NEXT:    je .LBB42_4
5103 ; X86-NOBMI-NEXT:  # %bb.3:
5104 ; X86-NOBMI-NEXT:    movl %ebx, %ebp
5105 ; X86-NOBMI-NEXT:    xorl %ebx, %ebx
5106 ; X86-NOBMI-NEXT:  .LBB42_4:
5107 ; X86-NOBMI-NEXT:    subl $8, %esp
5108 ; X86-NOBMI-NEXT:    pushl %ebx
5109 ; X86-NOBMI-NEXT:    pushl %ebp
5110 ; X86-NOBMI-NEXT:    calll use64
5111 ; X86-NOBMI-NEXT:    addl $16, %esp
5112 ; X86-NOBMI-NEXT:    andl %ebp, %esi
5113 ; X86-NOBMI-NEXT:    andl %ebx, %edi
5114 ; X86-NOBMI-NEXT:    movl %esi, %eax
5115 ; X86-NOBMI-NEXT:    movl %edi, %edx
5116 ; X86-NOBMI-NEXT:    addl $12, %esp
5117 ; X86-NOBMI-NEXT:    popl %esi
5118 ; X86-NOBMI-NEXT:    popl %edi
5119 ; X86-NOBMI-NEXT:    popl %ebx
5120 ; X86-NOBMI-NEXT:    popl %ebp
5121 ; X86-NOBMI-NEXT:    retl
5123 ; X86-BMI1NOTBM-LABEL: bextr64_c1_indexzext:
5124 ; X86-BMI1NOTBM:       # %bb.0:
5125 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
5126 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
5127 ; X86-BMI1NOTBM-NEXT:    pushl %edi
5128 ; X86-BMI1NOTBM-NEXT:    pushl %esi
5129 ; X86-BMI1NOTBM-NEXT:    subl $12, %esp
5130 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
5131 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
5132 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
5133 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
5134 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
5135 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %esi
5136 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
5137 ; X86-BMI1NOTBM-NEXT:    je .LBB42_2
5138 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
5139 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
5140 ; X86-BMI1NOTBM-NEXT:    xorl %edi, %edi
5141 ; X86-BMI1NOTBM-NEXT:  .LBB42_2:
5142 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
5143 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
5144 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebp
5145 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebx
5146 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %ebx
5147 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %ebp, %ebp
5148 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
5149 ; X86-BMI1NOTBM-NEXT:    je .LBB42_4
5150 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
5151 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %ebp
5152 ; X86-BMI1NOTBM-NEXT:    xorl %ebx, %ebx
5153 ; X86-BMI1NOTBM-NEXT:  .LBB42_4:
5154 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
5155 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
5156 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
5157 ; X86-BMI1NOTBM-NEXT:    calll use64
5158 ; X86-BMI1NOTBM-NEXT:    addl $16, %esp
5159 ; X86-BMI1NOTBM-NEXT:    andl %ebp, %esi
5160 ; X86-BMI1NOTBM-NEXT:    andl %ebx, %edi
5161 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
5162 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
5163 ; X86-BMI1NOTBM-NEXT:    addl $12, %esp
5164 ; X86-BMI1NOTBM-NEXT:    popl %esi
5165 ; X86-BMI1NOTBM-NEXT:    popl %edi
5166 ; X86-BMI1NOTBM-NEXT:    popl %ebx
5167 ; X86-BMI1NOTBM-NEXT:    popl %ebp
5168 ; X86-BMI1NOTBM-NEXT:    retl
5170 ; X86-BMI1BMI2-LABEL: bextr64_c1_indexzext:
5171 ; X86-BMI1BMI2:       # %bb.0:
5172 ; X86-BMI1BMI2-NEXT:    pushl %ebp
5173 ; X86-BMI1BMI2-NEXT:    pushl %ebx
5174 ; X86-BMI1BMI2-NEXT:    pushl %edi
5175 ; X86-BMI1BMI2-NEXT:    pushl %esi
5176 ; X86-BMI1BMI2-NEXT:    subl $12, %esp
5177 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
5178 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
5179 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
5180 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
5181 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edi
5182 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
5183 ; X86-BMI1BMI2-NEXT:    je .LBB42_2
5184 ; X86-BMI1BMI2-NEXT:  # %bb.1:
5185 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
5186 ; X86-BMI1BMI2-NEXT:    xorl %edi, %edi
5187 ; X86-BMI1BMI2-NEXT:  .LBB42_2:
5188 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
5189 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
5190 ; X86-BMI1BMI2-NEXT:    movl $-1, %ebx
5191 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %ebx, %ebp
5192 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %ebx, %ebx
5193 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
5194 ; X86-BMI1BMI2-NEXT:    je .LBB42_4
5195 ; X86-BMI1BMI2-NEXT:  # %bb.3:
5196 ; X86-BMI1BMI2-NEXT:    movl %ebp, %ebx
5197 ; X86-BMI1BMI2-NEXT:    xorl %ebp, %ebp
5198 ; X86-BMI1BMI2-NEXT:  .LBB42_4:
5199 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
5200 ; X86-BMI1BMI2-NEXT:    pushl %ebp
5201 ; X86-BMI1BMI2-NEXT:    pushl %ebx
5202 ; X86-BMI1BMI2-NEXT:    calll use64
5203 ; X86-BMI1BMI2-NEXT:    addl $16, %esp
5204 ; X86-BMI1BMI2-NEXT:    andl %ebx, %esi
5205 ; X86-BMI1BMI2-NEXT:    andl %ebp, %edi
5206 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
5207 ; X86-BMI1BMI2-NEXT:    movl %edi, %edx
5208 ; X86-BMI1BMI2-NEXT:    addl $12, %esp
5209 ; X86-BMI1BMI2-NEXT:    popl %esi
5210 ; X86-BMI1BMI2-NEXT:    popl %edi
5211 ; X86-BMI1BMI2-NEXT:    popl %ebx
5212 ; X86-BMI1BMI2-NEXT:    popl %ebp
5213 ; X86-BMI1BMI2-NEXT:    retl
5215 ; X64-NOBMI-LABEL: bextr64_c1_indexzext:
5216 ; X64-NOBMI:       # %bb.0:
5217 ; X64-NOBMI-NEXT:    pushq %r14
5218 ; X64-NOBMI-NEXT:    pushq %rbx
5219 ; X64-NOBMI-NEXT:    pushq %rax
5220 ; X64-NOBMI-NEXT:    movl %esi, %ecx
5221 ; X64-NOBMI-NEXT:    movq %rdi, %r14
5222 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
5223 ; X64-NOBMI-NEXT:    shrq %cl, %r14
5224 ; X64-NOBMI-NEXT:    negb %dl
5225 ; X64-NOBMI-NEXT:    movq $-1, %rbx
5226 ; X64-NOBMI-NEXT:    movl %edx, %ecx
5227 ; X64-NOBMI-NEXT:    shrq %cl, %rbx
5228 ; X64-NOBMI-NEXT:    movq %rbx, %rdi
5229 ; X64-NOBMI-NEXT:    callq use64
5230 ; X64-NOBMI-NEXT:    andq %r14, %rbx
5231 ; X64-NOBMI-NEXT:    movq %rbx, %rax
5232 ; X64-NOBMI-NEXT:    addq $8, %rsp
5233 ; X64-NOBMI-NEXT:    popq %rbx
5234 ; X64-NOBMI-NEXT:    popq %r14
5235 ; X64-NOBMI-NEXT:    retq
5237 ; X64-BMI1NOTBM-LABEL: bextr64_c1_indexzext:
5238 ; X64-BMI1NOTBM:       # %bb.0:
5239 ; X64-BMI1NOTBM-NEXT:    pushq %r14
5240 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
5241 ; X64-BMI1NOTBM-NEXT:    pushq %rax
5242 ; X64-BMI1NOTBM-NEXT:    movl %esi, %ecx
5243 ; X64-BMI1NOTBM-NEXT:    movq %rdi, %r14
5244 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
5245 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %r14
5246 ; X64-BMI1NOTBM-NEXT:    negb %dl
5247 ; X64-BMI1NOTBM-NEXT:    movq $-1, %rbx
5248 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
5249 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %rbx
5250 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rdi
5251 ; X64-BMI1NOTBM-NEXT:    callq use64
5252 ; X64-BMI1NOTBM-NEXT:    andq %r14, %rbx
5253 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rax
5254 ; X64-BMI1NOTBM-NEXT:    addq $8, %rsp
5255 ; X64-BMI1NOTBM-NEXT:    popq %rbx
5256 ; X64-BMI1NOTBM-NEXT:    popq %r14
5257 ; X64-BMI1NOTBM-NEXT:    retq
5259 ; X64-BMI1BMI2-LABEL: bextr64_c1_indexzext:
5260 ; X64-BMI1BMI2:       # %bb.0:
5261 ; X64-BMI1BMI2-NEXT:    pushq %r14
5262 ; X64-BMI1BMI2-NEXT:    pushq %rbx
5263 ; X64-BMI1BMI2-NEXT:    pushq %rax
5264 ; X64-BMI1BMI2-NEXT:    movl %edx, %ebx
5265 ; X64-BMI1BMI2-NEXT:    # kill: def $esi killed $esi def $rsi
5266 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %r14
5267 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
5268 ; X64-BMI1BMI2-NEXT:    negb %al
5269 ; X64-BMI1BMI2-NEXT:    movq $-1, %rcx
5270 ; X64-BMI1BMI2-NEXT:    shrxq %rax, %rcx, %rdi
5271 ; X64-BMI1BMI2-NEXT:    callq use64
5272 ; X64-BMI1BMI2-NEXT:    bzhiq %rbx, %r14, %rax
5273 ; X64-BMI1BMI2-NEXT:    addq $8, %rsp
5274 ; X64-BMI1BMI2-NEXT:    popq %rbx
5275 ; X64-BMI1BMI2-NEXT:    popq %r14
5276 ; X64-BMI1BMI2-NEXT:    retq
5277   %skip = zext i8 %numskipbits to i64
5278   %shifted = lshr i64 %val, %skip
5279   %numhighbits = sub i8 64, %numlowbits
5280   %sh_prom = zext i8 %numhighbits to i64
5281   %mask = lshr i64 -1, %sh_prom
5282   call void @use64(i64 %mask)
5283   %masked = and i64 %mask, %shifted
5284   ret i64 %masked
5287 define i64 @bextr64_c2_load(i64* %w, i64 %numskipbits, i64 %numlowbits) nounwind {
5288 ; X86-NOBMI-LABEL: bextr64_c2_load:
5289 ; X86-NOBMI:       # %bb.0:
5290 ; X86-NOBMI-NEXT:    pushl %ebp
5291 ; X86-NOBMI-NEXT:    pushl %ebx
5292 ; X86-NOBMI-NEXT:    pushl %edi
5293 ; X86-NOBMI-NEXT:    pushl %esi
5294 ; X86-NOBMI-NEXT:    subl $12, %esp
5295 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
5296 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
5297 ; X86-NOBMI-NEXT:    movl (%eax), %esi
5298 ; X86-NOBMI-NEXT:    movl 4(%eax), %eax
5299 ; X86-NOBMI-NEXT:    movl %eax, %edi
5300 ; X86-NOBMI-NEXT:    shrl %cl, %edi
5301 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
5302 ; X86-NOBMI-NEXT:    testb $32, %cl
5303 ; X86-NOBMI-NEXT:    je .LBB43_2
5304 ; X86-NOBMI-NEXT:  # %bb.1:
5305 ; X86-NOBMI-NEXT:    movl %edi, %esi
5306 ; X86-NOBMI-NEXT:    xorl %edi, %edi
5307 ; X86-NOBMI-NEXT:  .LBB43_2:
5308 ; X86-NOBMI-NEXT:    movb $64, %cl
5309 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
5310 ; X86-NOBMI-NEXT:    movl $-1, %ebp
5311 ; X86-NOBMI-NEXT:    movl $-1, %ebx
5312 ; X86-NOBMI-NEXT:    shrl %cl, %ebx
5313 ; X86-NOBMI-NEXT:    shrdl %cl, %ebp, %ebp
5314 ; X86-NOBMI-NEXT:    testb $32, %cl
5315 ; X86-NOBMI-NEXT:    je .LBB43_4
5316 ; X86-NOBMI-NEXT:  # %bb.3:
5317 ; X86-NOBMI-NEXT:    movl %ebx, %ebp
5318 ; X86-NOBMI-NEXT:    xorl %ebx, %ebx
5319 ; X86-NOBMI-NEXT:  .LBB43_4:
5320 ; X86-NOBMI-NEXT:    subl $8, %esp
5321 ; X86-NOBMI-NEXT:    pushl %ebx
5322 ; X86-NOBMI-NEXT:    pushl %ebp
5323 ; X86-NOBMI-NEXT:    calll use64
5324 ; X86-NOBMI-NEXT:    addl $16, %esp
5325 ; X86-NOBMI-NEXT:    andl %ebp, %esi
5326 ; X86-NOBMI-NEXT:    andl %ebx, %edi
5327 ; X86-NOBMI-NEXT:    movl %esi, %eax
5328 ; X86-NOBMI-NEXT:    movl %edi, %edx
5329 ; X86-NOBMI-NEXT:    addl $12, %esp
5330 ; X86-NOBMI-NEXT:    popl %esi
5331 ; X86-NOBMI-NEXT:    popl %edi
5332 ; X86-NOBMI-NEXT:    popl %ebx
5333 ; X86-NOBMI-NEXT:    popl %ebp
5334 ; X86-NOBMI-NEXT:    retl
5336 ; X86-BMI1NOTBM-LABEL: bextr64_c2_load:
5337 ; X86-BMI1NOTBM:       # %bb.0:
5338 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
5339 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
5340 ; X86-BMI1NOTBM-NEXT:    pushl %edi
5341 ; X86-BMI1NOTBM-NEXT:    pushl %esi
5342 ; X86-BMI1NOTBM-NEXT:    subl $12, %esp
5343 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
5344 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
5345 ; X86-BMI1NOTBM-NEXT:    movl (%eax), %esi
5346 ; X86-BMI1NOTBM-NEXT:    movl 4(%eax), %eax
5347 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
5348 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
5349 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %esi
5350 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
5351 ; X86-BMI1NOTBM-NEXT:    je .LBB43_2
5352 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
5353 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
5354 ; X86-BMI1NOTBM-NEXT:    xorl %edi, %edi
5355 ; X86-BMI1NOTBM-NEXT:  .LBB43_2:
5356 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
5357 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
5358 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebp
5359 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebx
5360 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %ebx
5361 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %ebp, %ebp
5362 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
5363 ; X86-BMI1NOTBM-NEXT:    je .LBB43_4
5364 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
5365 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %ebp
5366 ; X86-BMI1NOTBM-NEXT:    xorl %ebx, %ebx
5367 ; X86-BMI1NOTBM-NEXT:  .LBB43_4:
5368 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
5369 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
5370 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
5371 ; X86-BMI1NOTBM-NEXT:    calll use64
5372 ; X86-BMI1NOTBM-NEXT:    addl $16, %esp
5373 ; X86-BMI1NOTBM-NEXT:    andl %ebp, %esi
5374 ; X86-BMI1NOTBM-NEXT:    andl %ebx, %edi
5375 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
5376 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
5377 ; X86-BMI1NOTBM-NEXT:    addl $12, %esp
5378 ; X86-BMI1NOTBM-NEXT:    popl %esi
5379 ; X86-BMI1NOTBM-NEXT:    popl %edi
5380 ; X86-BMI1NOTBM-NEXT:    popl %ebx
5381 ; X86-BMI1NOTBM-NEXT:    popl %ebp
5382 ; X86-BMI1NOTBM-NEXT:    retl
5384 ; X86-BMI1BMI2-LABEL: bextr64_c2_load:
5385 ; X86-BMI1BMI2:       # %bb.0:
5386 ; X86-BMI1BMI2-NEXT:    pushl %ebp
5387 ; X86-BMI1BMI2-NEXT:    pushl %ebx
5388 ; X86-BMI1BMI2-NEXT:    pushl %edi
5389 ; X86-BMI1BMI2-NEXT:    pushl %esi
5390 ; X86-BMI1BMI2-NEXT:    subl $12, %esp
5391 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
5392 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
5393 ; X86-BMI1BMI2-NEXT:    movl (%eax), %esi
5394 ; X86-BMI1BMI2-NEXT:    movl 4(%eax), %eax
5395 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edi
5396 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
5397 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
5398 ; X86-BMI1BMI2-NEXT:    je .LBB43_2
5399 ; X86-BMI1BMI2-NEXT:  # %bb.1:
5400 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
5401 ; X86-BMI1BMI2-NEXT:    xorl %edi, %edi
5402 ; X86-BMI1BMI2-NEXT:  .LBB43_2:
5403 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
5404 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
5405 ; X86-BMI1BMI2-NEXT:    movl $-1, %ebx
5406 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %ebx, %ebp
5407 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %ebx, %ebx
5408 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
5409 ; X86-BMI1BMI2-NEXT:    je .LBB43_4
5410 ; X86-BMI1BMI2-NEXT:  # %bb.3:
5411 ; X86-BMI1BMI2-NEXT:    movl %ebp, %ebx
5412 ; X86-BMI1BMI2-NEXT:    xorl %ebp, %ebp
5413 ; X86-BMI1BMI2-NEXT:  .LBB43_4:
5414 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
5415 ; X86-BMI1BMI2-NEXT:    pushl %ebp
5416 ; X86-BMI1BMI2-NEXT:    pushl %ebx
5417 ; X86-BMI1BMI2-NEXT:    calll use64
5418 ; X86-BMI1BMI2-NEXT:    addl $16, %esp
5419 ; X86-BMI1BMI2-NEXT:    andl %ebx, %esi
5420 ; X86-BMI1BMI2-NEXT:    andl %ebp, %edi
5421 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
5422 ; X86-BMI1BMI2-NEXT:    movl %edi, %edx
5423 ; X86-BMI1BMI2-NEXT:    addl $12, %esp
5424 ; X86-BMI1BMI2-NEXT:    popl %esi
5425 ; X86-BMI1BMI2-NEXT:    popl %edi
5426 ; X86-BMI1BMI2-NEXT:    popl %ebx
5427 ; X86-BMI1BMI2-NEXT:    popl %ebp
5428 ; X86-BMI1BMI2-NEXT:    retl
5430 ; X64-NOBMI-LABEL: bextr64_c2_load:
5431 ; X64-NOBMI:       # %bb.0:
5432 ; X64-NOBMI-NEXT:    pushq %r14
5433 ; X64-NOBMI-NEXT:    pushq %rbx
5434 ; X64-NOBMI-NEXT:    pushq %rax
5435 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
5436 ; X64-NOBMI-NEXT:    movq (%rdi), %r14
5437 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
5438 ; X64-NOBMI-NEXT:    shrq %cl, %r14
5439 ; X64-NOBMI-NEXT:    negb %dl
5440 ; X64-NOBMI-NEXT:    movq $-1, %rbx
5441 ; X64-NOBMI-NEXT:    movl %edx, %ecx
5442 ; X64-NOBMI-NEXT:    shrq %cl, %rbx
5443 ; X64-NOBMI-NEXT:    movq %rbx, %rdi
5444 ; X64-NOBMI-NEXT:    callq use64
5445 ; X64-NOBMI-NEXT:    andq %r14, %rbx
5446 ; X64-NOBMI-NEXT:    movq %rbx, %rax
5447 ; X64-NOBMI-NEXT:    addq $8, %rsp
5448 ; X64-NOBMI-NEXT:    popq %rbx
5449 ; X64-NOBMI-NEXT:    popq %r14
5450 ; X64-NOBMI-NEXT:    retq
5452 ; X64-BMI1NOTBM-LABEL: bextr64_c2_load:
5453 ; X64-BMI1NOTBM:       # %bb.0:
5454 ; X64-BMI1NOTBM-NEXT:    pushq %r14
5455 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
5456 ; X64-BMI1NOTBM-NEXT:    pushq %rax
5457 ; X64-BMI1NOTBM-NEXT:    movq %rsi, %rcx
5458 ; X64-BMI1NOTBM-NEXT:    movq (%rdi), %r14
5459 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $rcx
5460 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %r14
5461 ; X64-BMI1NOTBM-NEXT:    negb %dl
5462 ; X64-BMI1NOTBM-NEXT:    movq $-1, %rbx
5463 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
5464 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %rbx
5465 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rdi
5466 ; X64-BMI1NOTBM-NEXT:    callq use64
5467 ; X64-BMI1NOTBM-NEXT:    andq %r14, %rbx
5468 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rax
5469 ; X64-BMI1NOTBM-NEXT:    addq $8, %rsp
5470 ; X64-BMI1NOTBM-NEXT:    popq %rbx
5471 ; X64-BMI1NOTBM-NEXT:    popq %r14
5472 ; X64-BMI1NOTBM-NEXT:    retq
5474 ; X64-BMI1BMI2-LABEL: bextr64_c2_load:
5475 ; X64-BMI1BMI2:       # %bb.0:
5476 ; X64-BMI1BMI2-NEXT:    pushq %r14
5477 ; X64-BMI1BMI2-NEXT:    pushq %rbx
5478 ; X64-BMI1BMI2-NEXT:    pushq %rax
5479 ; X64-BMI1BMI2-NEXT:    movq %rdx, %rbx
5480 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, (%rdi), %r14
5481 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
5482 ; X64-BMI1BMI2-NEXT:    negb %al
5483 ; X64-BMI1BMI2-NEXT:    movq $-1, %rcx
5484 ; X64-BMI1BMI2-NEXT:    shrxq %rax, %rcx, %rdi
5485 ; X64-BMI1BMI2-NEXT:    callq use64
5486 ; X64-BMI1BMI2-NEXT:    bzhiq %rbx, %r14, %rax
5487 ; X64-BMI1BMI2-NEXT:    addq $8, %rsp
5488 ; X64-BMI1BMI2-NEXT:    popq %rbx
5489 ; X64-BMI1BMI2-NEXT:    popq %r14
5490 ; X64-BMI1BMI2-NEXT:    retq
5491   %val = load i64, i64* %w
5492   %shifted = lshr i64 %val, %numskipbits
5493   %numhighbits = sub i64 64, %numlowbits
5494   %mask = lshr i64 -1, %numhighbits
5495   call void @use64(i64 %mask)
5496   %masked = and i64 %mask, %shifted
5497   ret i64 %masked
5500 define i64 @bextr64_c3_load_indexzext(i64* %w, i8 %numskipbits, i8 %numlowbits) nounwind {
5501 ; X86-NOBMI-LABEL: bextr64_c3_load_indexzext:
5502 ; X86-NOBMI:       # %bb.0:
5503 ; X86-NOBMI-NEXT:    pushl %ebp
5504 ; X86-NOBMI-NEXT:    pushl %ebx
5505 ; X86-NOBMI-NEXT:    pushl %edi
5506 ; X86-NOBMI-NEXT:    pushl %esi
5507 ; X86-NOBMI-NEXT:    subl $12, %esp
5508 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
5509 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
5510 ; X86-NOBMI-NEXT:    movl (%eax), %esi
5511 ; X86-NOBMI-NEXT:    movl 4(%eax), %eax
5512 ; X86-NOBMI-NEXT:    movl %eax, %edi
5513 ; X86-NOBMI-NEXT:    shrl %cl, %edi
5514 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
5515 ; X86-NOBMI-NEXT:    testb $32, %cl
5516 ; X86-NOBMI-NEXT:    je .LBB44_2
5517 ; X86-NOBMI-NEXT:  # %bb.1:
5518 ; X86-NOBMI-NEXT:    movl %edi, %esi
5519 ; X86-NOBMI-NEXT:    xorl %edi, %edi
5520 ; X86-NOBMI-NEXT:  .LBB44_2:
5521 ; X86-NOBMI-NEXT:    movb $64, %cl
5522 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
5523 ; X86-NOBMI-NEXT:    movl $-1, %ebp
5524 ; X86-NOBMI-NEXT:    movl $-1, %ebx
5525 ; X86-NOBMI-NEXT:    shrl %cl, %ebx
5526 ; X86-NOBMI-NEXT:    shrdl %cl, %ebp, %ebp
5527 ; X86-NOBMI-NEXT:    testb $32, %cl
5528 ; X86-NOBMI-NEXT:    je .LBB44_4
5529 ; X86-NOBMI-NEXT:  # %bb.3:
5530 ; X86-NOBMI-NEXT:    movl %ebx, %ebp
5531 ; X86-NOBMI-NEXT:    xorl %ebx, %ebx
5532 ; X86-NOBMI-NEXT:  .LBB44_4:
5533 ; X86-NOBMI-NEXT:    subl $8, %esp
5534 ; X86-NOBMI-NEXT:    pushl %ebx
5535 ; X86-NOBMI-NEXT:    pushl %ebp
5536 ; X86-NOBMI-NEXT:    calll use64
5537 ; X86-NOBMI-NEXT:    addl $16, %esp
5538 ; X86-NOBMI-NEXT:    andl %ebp, %esi
5539 ; X86-NOBMI-NEXT:    andl %ebx, %edi
5540 ; X86-NOBMI-NEXT:    movl %esi, %eax
5541 ; X86-NOBMI-NEXT:    movl %edi, %edx
5542 ; X86-NOBMI-NEXT:    addl $12, %esp
5543 ; X86-NOBMI-NEXT:    popl %esi
5544 ; X86-NOBMI-NEXT:    popl %edi
5545 ; X86-NOBMI-NEXT:    popl %ebx
5546 ; X86-NOBMI-NEXT:    popl %ebp
5547 ; X86-NOBMI-NEXT:    retl
5549 ; X86-BMI1NOTBM-LABEL: bextr64_c3_load_indexzext:
5550 ; X86-BMI1NOTBM:       # %bb.0:
5551 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
5552 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
5553 ; X86-BMI1NOTBM-NEXT:    pushl %edi
5554 ; X86-BMI1NOTBM-NEXT:    pushl %esi
5555 ; X86-BMI1NOTBM-NEXT:    subl $12, %esp
5556 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
5557 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
5558 ; X86-BMI1NOTBM-NEXT:    movl (%eax), %esi
5559 ; X86-BMI1NOTBM-NEXT:    movl 4(%eax), %eax
5560 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
5561 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
5562 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %esi
5563 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
5564 ; X86-BMI1NOTBM-NEXT:    je .LBB44_2
5565 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
5566 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
5567 ; X86-BMI1NOTBM-NEXT:    xorl %edi, %edi
5568 ; X86-BMI1NOTBM-NEXT:  .LBB44_2:
5569 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
5570 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
5571 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebp
5572 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebx
5573 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %ebx
5574 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %ebp, %ebp
5575 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
5576 ; X86-BMI1NOTBM-NEXT:    je .LBB44_4
5577 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
5578 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %ebp
5579 ; X86-BMI1NOTBM-NEXT:    xorl %ebx, %ebx
5580 ; X86-BMI1NOTBM-NEXT:  .LBB44_4:
5581 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
5582 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
5583 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
5584 ; X86-BMI1NOTBM-NEXT:    calll use64
5585 ; X86-BMI1NOTBM-NEXT:    addl $16, %esp
5586 ; X86-BMI1NOTBM-NEXT:    andl %ebp, %esi
5587 ; X86-BMI1NOTBM-NEXT:    andl %ebx, %edi
5588 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
5589 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
5590 ; X86-BMI1NOTBM-NEXT:    addl $12, %esp
5591 ; X86-BMI1NOTBM-NEXT:    popl %esi
5592 ; X86-BMI1NOTBM-NEXT:    popl %edi
5593 ; X86-BMI1NOTBM-NEXT:    popl %ebx
5594 ; X86-BMI1NOTBM-NEXT:    popl %ebp
5595 ; X86-BMI1NOTBM-NEXT:    retl
5597 ; X86-BMI1BMI2-LABEL: bextr64_c3_load_indexzext:
5598 ; X86-BMI1BMI2:       # %bb.0:
5599 ; X86-BMI1BMI2-NEXT:    pushl %ebp
5600 ; X86-BMI1BMI2-NEXT:    pushl %ebx
5601 ; X86-BMI1BMI2-NEXT:    pushl %edi
5602 ; X86-BMI1BMI2-NEXT:    pushl %esi
5603 ; X86-BMI1BMI2-NEXT:    subl $12, %esp
5604 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
5605 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
5606 ; X86-BMI1BMI2-NEXT:    movl (%eax), %esi
5607 ; X86-BMI1BMI2-NEXT:    movl 4(%eax), %eax
5608 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edi
5609 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
5610 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
5611 ; X86-BMI1BMI2-NEXT:    je .LBB44_2
5612 ; X86-BMI1BMI2-NEXT:  # %bb.1:
5613 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
5614 ; X86-BMI1BMI2-NEXT:    xorl %edi, %edi
5615 ; X86-BMI1BMI2-NEXT:  .LBB44_2:
5616 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
5617 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
5618 ; X86-BMI1BMI2-NEXT:    movl $-1, %ebx
5619 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %ebx, %ebp
5620 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %ebx, %ebx
5621 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
5622 ; X86-BMI1BMI2-NEXT:    je .LBB44_4
5623 ; X86-BMI1BMI2-NEXT:  # %bb.3:
5624 ; X86-BMI1BMI2-NEXT:    movl %ebp, %ebx
5625 ; X86-BMI1BMI2-NEXT:    xorl %ebp, %ebp
5626 ; X86-BMI1BMI2-NEXT:  .LBB44_4:
5627 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
5628 ; X86-BMI1BMI2-NEXT:    pushl %ebp
5629 ; X86-BMI1BMI2-NEXT:    pushl %ebx
5630 ; X86-BMI1BMI2-NEXT:    calll use64
5631 ; X86-BMI1BMI2-NEXT:    addl $16, %esp
5632 ; X86-BMI1BMI2-NEXT:    andl %ebx, %esi
5633 ; X86-BMI1BMI2-NEXT:    andl %ebp, %edi
5634 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
5635 ; X86-BMI1BMI2-NEXT:    movl %edi, %edx
5636 ; X86-BMI1BMI2-NEXT:    addl $12, %esp
5637 ; X86-BMI1BMI2-NEXT:    popl %esi
5638 ; X86-BMI1BMI2-NEXT:    popl %edi
5639 ; X86-BMI1BMI2-NEXT:    popl %ebx
5640 ; X86-BMI1BMI2-NEXT:    popl %ebp
5641 ; X86-BMI1BMI2-NEXT:    retl
5643 ; X64-NOBMI-LABEL: bextr64_c3_load_indexzext:
5644 ; X64-NOBMI:       # %bb.0:
5645 ; X64-NOBMI-NEXT:    pushq %r14
5646 ; X64-NOBMI-NEXT:    pushq %rbx
5647 ; X64-NOBMI-NEXT:    pushq %rax
5648 ; X64-NOBMI-NEXT:    movl %esi, %ecx
5649 ; X64-NOBMI-NEXT:    movq (%rdi), %r14
5650 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
5651 ; X64-NOBMI-NEXT:    shrq %cl, %r14
5652 ; X64-NOBMI-NEXT:    negb %dl
5653 ; X64-NOBMI-NEXT:    movq $-1, %rbx
5654 ; X64-NOBMI-NEXT:    movl %edx, %ecx
5655 ; X64-NOBMI-NEXT:    shrq %cl, %rbx
5656 ; X64-NOBMI-NEXT:    movq %rbx, %rdi
5657 ; X64-NOBMI-NEXT:    callq use64
5658 ; X64-NOBMI-NEXT:    andq %r14, %rbx
5659 ; X64-NOBMI-NEXT:    movq %rbx, %rax
5660 ; X64-NOBMI-NEXT:    addq $8, %rsp
5661 ; X64-NOBMI-NEXT:    popq %rbx
5662 ; X64-NOBMI-NEXT:    popq %r14
5663 ; X64-NOBMI-NEXT:    retq
5665 ; X64-BMI1NOTBM-LABEL: bextr64_c3_load_indexzext:
5666 ; X64-BMI1NOTBM:       # %bb.0:
5667 ; X64-BMI1NOTBM-NEXT:    pushq %r14
5668 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
5669 ; X64-BMI1NOTBM-NEXT:    pushq %rax
5670 ; X64-BMI1NOTBM-NEXT:    movl %esi, %ecx
5671 ; X64-BMI1NOTBM-NEXT:    movq (%rdi), %r14
5672 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $ecx
5673 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %r14
5674 ; X64-BMI1NOTBM-NEXT:    negb %dl
5675 ; X64-BMI1NOTBM-NEXT:    movq $-1, %rbx
5676 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
5677 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %rbx
5678 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rdi
5679 ; X64-BMI1NOTBM-NEXT:    callq use64
5680 ; X64-BMI1NOTBM-NEXT:    andq %r14, %rbx
5681 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rax
5682 ; X64-BMI1NOTBM-NEXT:    addq $8, %rsp
5683 ; X64-BMI1NOTBM-NEXT:    popq %rbx
5684 ; X64-BMI1NOTBM-NEXT:    popq %r14
5685 ; X64-BMI1NOTBM-NEXT:    retq
5687 ; X64-BMI1BMI2-LABEL: bextr64_c3_load_indexzext:
5688 ; X64-BMI1BMI2:       # %bb.0:
5689 ; X64-BMI1BMI2-NEXT:    pushq %r14
5690 ; X64-BMI1BMI2-NEXT:    pushq %rbx
5691 ; X64-BMI1BMI2-NEXT:    pushq %rax
5692 ; X64-BMI1BMI2-NEXT:    movl %edx, %ebx
5693 ; X64-BMI1BMI2-NEXT:    # kill: def $esi killed $esi def $rsi
5694 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, (%rdi), %r14
5695 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
5696 ; X64-BMI1BMI2-NEXT:    negb %al
5697 ; X64-BMI1BMI2-NEXT:    movq $-1, %rcx
5698 ; X64-BMI1BMI2-NEXT:    shrxq %rax, %rcx, %rdi
5699 ; X64-BMI1BMI2-NEXT:    callq use64
5700 ; X64-BMI1BMI2-NEXT:    bzhiq %rbx, %r14, %rax
5701 ; X64-BMI1BMI2-NEXT:    addq $8, %rsp
5702 ; X64-BMI1BMI2-NEXT:    popq %rbx
5703 ; X64-BMI1BMI2-NEXT:    popq %r14
5704 ; X64-BMI1BMI2-NEXT:    retq
5705   %val = load i64, i64* %w
5706   %skip = zext i8 %numskipbits to i64
5707   %shifted = lshr i64 %val, %skip
5708   %numhighbits = sub i8 64, %numlowbits
5709   %sh_prom = zext i8 %numhighbits to i64
5710   %mask = lshr i64 -1, %sh_prom
5711   call void @use64(i64 %mask)
5712   %masked = and i64 %mask, %shifted
5713   ret i64 %masked
5716 define i64 @bextr64_c4_commutative(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
5717 ; X86-NOBMI-LABEL: bextr64_c4_commutative:
5718 ; X86-NOBMI:       # %bb.0:
5719 ; X86-NOBMI-NEXT:    pushl %ebp
5720 ; X86-NOBMI-NEXT:    pushl %ebx
5721 ; X86-NOBMI-NEXT:    pushl %edi
5722 ; X86-NOBMI-NEXT:    pushl %esi
5723 ; X86-NOBMI-NEXT:    subl $12, %esp
5724 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
5725 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
5726 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
5727 ; X86-NOBMI-NEXT:    movl %eax, %edi
5728 ; X86-NOBMI-NEXT:    shrl %cl, %edi
5729 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
5730 ; X86-NOBMI-NEXT:    testb $32, %cl
5731 ; X86-NOBMI-NEXT:    je .LBB45_2
5732 ; X86-NOBMI-NEXT:  # %bb.1:
5733 ; X86-NOBMI-NEXT:    movl %edi, %esi
5734 ; X86-NOBMI-NEXT:    xorl %edi, %edi
5735 ; X86-NOBMI-NEXT:  .LBB45_2:
5736 ; X86-NOBMI-NEXT:    movb $64, %cl
5737 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
5738 ; X86-NOBMI-NEXT:    movl $-1, %ebp
5739 ; X86-NOBMI-NEXT:    movl $-1, %ebx
5740 ; X86-NOBMI-NEXT:    shrl %cl, %ebx
5741 ; X86-NOBMI-NEXT:    shrdl %cl, %ebp, %ebp
5742 ; X86-NOBMI-NEXT:    testb $32, %cl
5743 ; X86-NOBMI-NEXT:    je .LBB45_4
5744 ; X86-NOBMI-NEXT:  # %bb.3:
5745 ; X86-NOBMI-NEXT:    movl %ebx, %ebp
5746 ; X86-NOBMI-NEXT:    xorl %ebx, %ebx
5747 ; X86-NOBMI-NEXT:  .LBB45_4:
5748 ; X86-NOBMI-NEXT:    subl $8, %esp
5749 ; X86-NOBMI-NEXT:    pushl %ebx
5750 ; X86-NOBMI-NEXT:    pushl %ebp
5751 ; X86-NOBMI-NEXT:    calll use64
5752 ; X86-NOBMI-NEXT:    addl $16, %esp
5753 ; X86-NOBMI-NEXT:    andl %ebp, %esi
5754 ; X86-NOBMI-NEXT:    andl %ebx, %edi
5755 ; X86-NOBMI-NEXT:    movl %esi, %eax
5756 ; X86-NOBMI-NEXT:    movl %edi, %edx
5757 ; X86-NOBMI-NEXT:    addl $12, %esp
5758 ; X86-NOBMI-NEXT:    popl %esi
5759 ; X86-NOBMI-NEXT:    popl %edi
5760 ; X86-NOBMI-NEXT:    popl %ebx
5761 ; X86-NOBMI-NEXT:    popl %ebp
5762 ; X86-NOBMI-NEXT:    retl
5764 ; X86-BMI1NOTBM-LABEL: bextr64_c4_commutative:
5765 ; X86-BMI1NOTBM:       # %bb.0:
5766 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
5767 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
5768 ; X86-BMI1NOTBM-NEXT:    pushl %edi
5769 ; X86-BMI1NOTBM-NEXT:    pushl %esi
5770 ; X86-BMI1NOTBM-NEXT:    subl $12, %esp
5771 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
5772 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
5773 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
5774 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
5775 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
5776 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %esi
5777 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
5778 ; X86-BMI1NOTBM-NEXT:    je .LBB45_2
5779 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
5780 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
5781 ; X86-BMI1NOTBM-NEXT:    xorl %edi, %edi
5782 ; X86-BMI1NOTBM-NEXT:  .LBB45_2:
5783 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
5784 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
5785 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebp
5786 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebx
5787 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %ebx
5788 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %ebp, %ebp
5789 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
5790 ; X86-BMI1NOTBM-NEXT:    je .LBB45_4
5791 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
5792 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %ebp
5793 ; X86-BMI1NOTBM-NEXT:    xorl %ebx, %ebx
5794 ; X86-BMI1NOTBM-NEXT:  .LBB45_4:
5795 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
5796 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
5797 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
5798 ; X86-BMI1NOTBM-NEXT:    calll use64
5799 ; X86-BMI1NOTBM-NEXT:    addl $16, %esp
5800 ; X86-BMI1NOTBM-NEXT:    andl %ebp, %esi
5801 ; X86-BMI1NOTBM-NEXT:    andl %ebx, %edi
5802 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
5803 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
5804 ; X86-BMI1NOTBM-NEXT:    addl $12, %esp
5805 ; X86-BMI1NOTBM-NEXT:    popl %esi
5806 ; X86-BMI1NOTBM-NEXT:    popl %edi
5807 ; X86-BMI1NOTBM-NEXT:    popl %ebx
5808 ; X86-BMI1NOTBM-NEXT:    popl %ebp
5809 ; X86-BMI1NOTBM-NEXT:    retl
5811 ; X86-BMI1BMI2-LABEL: bextr64_c4_commutative:
5812 ; X86-BMI1BMI2:       # %bb.0:
5813 ; X86-BMI1BMI2-NEXT:    pushl %ebp
5814 ; X86-BMI1BMI2-NEXT:    pushl %ebx
5815 ; X86-BMI1BMI2-NEXT:    pushl %edi
5816 ; X86-BMI1BMI2-NEXT:    pushl %esi
5817 ; X86-BMI1BMI2-NEXT:    subl $12, %esp
5818 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
5819 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
5820 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
5821 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
5822 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edi
5823 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
5824 ; X86-BMI1BMI2-NEXT:    je .LBB45_2
5825 ; X86-BMI1BMI2-NEXT:  # %bb.1:
5826 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
5827 ; X86-BMI1BMI2-NEXT:    xorl %edi, %edi
5828 ; X86-BMI1BMI2-NEXT:  .LBB45_2:
5829 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
5830 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
5831 ; X86-BMI1BMI2-NEXT:    movl $-1, %ebx
5832 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %ebx, %ebp
5833 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %ebx, %ebx
5834 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
5835 ; X86-BMI1BMI2-NEXT:    je .LBB45_4
5836 ; X86-BMI1BMI2-NEXT:  # %bb.3:
5837 ; X86-BMI1BMI2-NEXT:    movl %ebp, %ebx
5838 ; X86-BMI1BMI2-NEXT:    xorl %ebp, %ebp
5839 ; X86-BMI1BMI2-NEXT:  .LBB45_4:
5840 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
5841 ; X86-BMI1BMI2-NEXT:    pushl %ebp
5842 ; X86-BMI1BMI2-NEXT:    pushl %ebx
5843 ; X86-BMI1BMI2-NEXT:    calll use64
5844 ; X86-BMI1BMI2-NEXT:    addl $16, %esp
5845 ; X86-BMI1BMI2-NEXT:    andl %ebx, %esi
5846 ; X86-BMI1BMI2-NEXT:    andl %ebp, %edi
5847 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
5848 ; X86-BMI1BMI2-NEXT:    movl %edi, %edx
5849 ; X86-BMI1BMI2-NEXT:    addl $12, %esp
5850 ; X86-BMI1BMI2-NEXT:    popl %esi
5851 ; X86-BMI1BMI2-NEXT:    popl %edi
5852 ; X86-BMI1BMI2-NEXT:    popl %ebx
5853 ; X86-BMI1BMI2-NEXT:    popl %ebp
5854 ; X86-BMI1BMI2-NEXT:    retl
5856 ; X64-NOBMI-LABEL: bextr64_c4_commutative:
5857 ; X64-NOBMI:       # %bb.0:
5858 ; X64-NOBMI-NEXT:    pushq %r14
5859 ; X64-NOBMI-NEXT:    pushq %rbx
5860 ; X64-NOBMI-NEXT:    pushq %rax
5861 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
5862 ; X64-NOBMI-NEXT:    movq %rdi, %r14
5863 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
5864 ; X64-NOBMI-NEXT:    shrq %cl, %r14
5865 ; X64-NOBMI-NEXT:    negb %dl
5866 ; X64-NOBMI-NEXT:    movq $-1, %rbx
5867 ; X64-NOBMI-NEXT:    movl %edx, %ecx
5868 ; X64-NOBMI-NEXT:    shrq %cl, %rbx
5869 ; X64-NOBMI-NEXT:    movq %rbx, %rdi
5870 ; X64-NOBMI-NEXT:    callq use64
5871 ; X64-NOBMI-NEXT:    andq %r14, %rbx
5872 ; X64-NOBMI-NEXT:    movq %rbx, %rax
5873 ; X64-NOBMI-NEXT:    addq $8, %rsp
5874 ; X64-NOBMI-NEXT:    popq %rbx
5875 ; X64-NOBMI-NEXT:    popq %r14
5876 ; X64-NOBMI-NEXT:    retq
5878 ; X64-BMI1NOTBM-LABEL: bextr64_c4_commutative:
5879 ; X64-BMI1NOTBM:       # %bb.0:
5880 ; X64-BMI1NOTBM-NEXT:    pushq %r14
5881 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
5882 ; X64-BMI1NOTBM-NEXT:    pushq %rax
5883 ; X64-BMI1NOTBM-NEXT:    movq %rsi, %rcx
5884 ; X64-BMI1NOTBM-NEXT:    movq %rdi, %r14
5885 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $rcx
5886 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %r14
5887 ; X64-BMI1NOTBM-NEXT:    negb %dl
5888 ; X64-BMI1NOTBM-NEXT:    movq $-1, %rbx
5889 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
5890 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %rbx
5891 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rdi
5892 ; X64-BMI1NOTBM-NEXT:    callq use64
5893 ; X64-BMI1NOTBM-NEXT:    andq %r14, %rbx
5894 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rax
5895 ; X64-BMI1NOTBM-NEXT:    addq $8, %rsp
5896 ; X64-BMI1NOTBM-NEXT:    popq %rbx
5897 ; X64-BMI1NOTBM-NEXT:    popq %r14
5898 ; X64-BMI1NOTBM-NEXT:    retq
5900 ; X64-BMI1BMI2-LABEL: bextr64_c4_commutative:
5901 ; X64-BMI1BMI2:       # %bb.0:
5902 ; X64-BMI1BMI2-NEXT:    pushq %r14
5903 ; X64-BMI1BMI2-NEXT:    pushq %rbx
5904 ; X64-BMI1BMI2-NEXT:    pushq %rax
5905 ; X64-BMI1BMI2-NEXT:    movq %rdx, %rbx
5906 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %r14
5907 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
5908 ; X64-BMI1BMI2-NEXT:    negb %al
5909 ; X64-BMI1BMI2-NEXT:    movq $-1, %rcx
5910 ; X64-BMI1BMI2-NEXT:    shrxq %rax, %rcx, %rdi
5911 ; X64-BMI1BMI2-NEXT:    callq use64
5912 ; X64-BMI1BMI2-NEXT:    bzhiq %rbx, %r14, %rax
5913 ; X64-BMI1BMI2-NEXT:    addq $8, %rsp
5914 ; X64-BMI1BMI2-NEXT:    popq %rbx
5915 ; X64-BMI1BMI2-NEXT:    popq %r14
5916 ; X64-BMI1BMI2-NEXT:    retq
5917   %shifted = lshr i64 %val, %numskipbits
5918   %numhighbits = sub i64 64, %numlowbits
5919   %mask = lshr i64 -1, %numhighbits
5920   call void @use64(i64 %mask)
5921   %masked = and i64 %shifted, %mask ; swapped order
5922   ret i64 %masked
5925 define i64 @bextr64_c5_skipextrauses(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
5926 ; X86-NOBMI-LABEL: bextr64_c5_skipextrauses:
5927 ; X86-NOBMI:       # %bb.0:
5928 ; X86-NOBMI-NEXT:    pushl %ebp
5929 ; X86-NOBMI-NEXT:    pushl %ebx
5930 ; X86-NOBMI-NEXT:    pushl %edi
5931 ; X86-NOBMI-NEXT:    pushl %esi
5932 ; X86-NOBMI-NEXT:    subl $12, %esp
5933 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
5934 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
5935 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx
5936 ; X86-NOBMI-NEXT:    movl %eax, %edi
5937 ; X86-NOBMI-NEXT:    shrl %cl, %edi
5938 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
5939 ; X86-NOBMI-NEXT:    testb $32, %cl
5940 ; X86-NOBMI-NEXT:    je .LBB46_2
5941 ; X86-NOBMI-NEXT:  # %bb.1:
5942 ; X86-NOBMI-NEXT:    movl %edi, %esi
5943 ; X86-NOBMI-NEXT:    xorl %edi, %edi
5944 ; X86-NOBMI-NEXT:  .LBB46_2:
5945 ; X86-NOBMI-NEXT:    movb $64, %cl
5946 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
5947 ; X86-NOBMI-NEXT:    movl $-1, %ebx
5948 ; X86-NOBMI-NEXT:    movl $-1, %ebp
5949 ; X86-NOBMI-NEXT:    shrl %cl, %ebp
5950 ; X86-NOBMI-NEXT:    shrdl %cl, %ebx, %ebx
5951 ; X86-NOBMI-NEXT:    testb $32, %cl
5952 ; X86-NOBMI-NEXT:    je .LBB46_4
5953 ; X86-NOBMI-NEXT:  # %bb.3:
5954 ; X86-NOBMI-NEXT:    movl %ebp, %ebx
5955 ; X86-NOBMI-NEXT:    xorl %ebp, %ebp
5956 ; X86-NOBMI-NEXT:  .LBB46_4:
5957 ; X86-NOBMI-NEXT:    subl $8, %esp
5958 ; X86-NOBMI-NEXT:    pushl %ebp
5959 ; X86-NOBMI-NEXT:    pushl %ebx
5960 ; X86-NOBMI-NEXT:    calll use64
5961 ; X86-NOBMI-NEXT:    addl $16, %esp
5962 ; X86-NOBMI-NEXT:    andl %ebx, %esi
5963 ; X86-NOBMI-NEXT:    andl %ebp, %edi
5964 ; X86-NOBMI-NEXT:    subl $8, %esp
5965 ; X86-NOBMI-NEXT:    pushl {{[0-9]+}}(%esp)
5966 ; X86-NOBMI-NEXT:    pushl {{[0-9]+}}(%esp)
5967 ; X86-NOBMI-NEXT:    calll use64
5968 ; X86-NOBMI-NEXT:    addl $16, %esp
5969 ; X86-NOBMI-NEXT:    movl %esi, %eax
5970 ; X86-NOBMI-NEXT:    movl %edi, %edx
5971 ; X86-NOBMI-NEXT:    addl $12, %esp
5972 ; X86-NOBMI-NEXT:    popl %esi
5973 ; X86-NOBMI-NEXT:    popl %edi
5974 ; X86-NOBMI-NEXT:    popl %ebx
5975 ; X86-NOBMI-NEXT:    popl %ebp
5976 ; X86-NOBMI-NEXT:    retl
5978 ; X86-BMI1NOTBM-LABEL: bextr64_c5_skipextrauses:
5979 ; X86-BMI1NOTBM:       # %bb.0:
5980 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
5981 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
5982 ; X86-BMI1NOTBM-NEXT:    pushl %edi
5983 ; X86-BMI1NOTBM-NEXT:    pushl %esi
5984 ; X86-BMI1NOTBM-NEXT:    subl $12, %esp
5985 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
5986 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
5987 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %ecx
5988 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
5989 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edi
5990 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %esi
5991 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
5992 ; X86-BMI1NOTBM-NEXT:    je .LBB46_2
5993 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
5994 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
5995 ; X86-BMI1NOTBM-NEXT:    xorl %edi, %edi
5996 ; X86-BMI1NOTBM-NEXT:  .LBB46_2:
5997 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
5998 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
5999 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebx
6000 ; X86-BMI1NOTBM-NEXT:    movl $-1, %ebp
6001 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %ebp
6002 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %ebx, %ebx
6003 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
6004 ; X86-BMI1NOTBM-NEXT:    je .LBB46_4
6005 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
6006 ; X86-BMI1NOTBM-NEXT:    movl %ebp, %ebx
6007 ; X86-BMI1NOTBM-NEXT:    xorl %ebp, %ebp
6008 ; X86-BMI1NOTBM-NEXT:  .LBB46_4:
6009 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
6010 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
6011 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
6012 ; X86-BMI1NOTBM-NEXT:    calll use64
6013 ; X86-BMI1NOTBM-NEXT:    addl $16, %esp
6014 ; X86-BMI1NOTBM-NEXT:    andl %ebx, %esi
6015 ; X86-BMI1NOTBM-NEXT:    andl %ebp, %edi
6016 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
6017 ; X86-BMI1NOTBM-NEXT:    pushl {{[0-9]+}}(%esp)
6018 ; X86-BMI1NOTBM-NEXT:    pushl {{[0-9]+}}(%esp)
6019 ; X86-BMI1NOTBM-NEXT:    calll use64
6020 ; X86-BMI1NOTBM-NEXT:    addl $16, %esp
6021 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
6022 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
6023 ; X86-BMI1NOTBM-NEXT:    addl $12, %esp
6024 ; X86-BMI1NOTBM-NEXT:    popl %esi
6025 ; X86-BMI1NOTBM-NEXT:    popl %edi
6026 ; X86-BMI1NOTBM-NEXT:    popl %ebx
6027 ; X86-BMI1NOTBM-NEXT:    popl %ebp
6028 ; X86-BMI1NOTBM-NEXT:    retl
6030 ; X86-BMI1BMI2-LABEL: bextr64_c5_skipextrauses:
6031 ; X86-BMI1BMI2:       # %bb.0:
6032 ; X86-BMI1BMI2-NEXT:    pushl %ebp
6033 ; X86-BMI1BMI2-NEXT:    pushl %ebx
6034 ; X86-BMI1BMI2-NEXT:    pushl %edi
6035 ; X86-BMI1BMI2-NEXT:    pushl %esi
6036 ; X86-BMI1BMI2-NEXT:    subl $12, %esp
6037 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
6038 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
6039 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
6040 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
6041 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edi
6042 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
6043 ; X86-BMI1BMI2-NEXT:    je .LBB46_2
6044 ; X86-BMI1BMI2-NEXT:  # %bb.1:
6045 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
6046 ; X86-BMI1BMI2-NEXT:    xorl %edi, %edi
6047 ; X86-BMI1BMI2-NEXT:  .LBB46_2:
6048 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
6049 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
6050 ; X86-BMI1BMI2-NEXT:    movl $-1, %ebp
6051 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %ebp, %ebx
6052 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %ebp, %ebp
6053 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
6054 ; X86-BMI1BMI2-NEXT:    je .LBB46_4
6055 ; X86-BMI1BMI2-NEXT:  # %bb.3:
6056 ; X86-BMI1BMI2-NEXT:    movl %ebx, %ebp
6057 ; X86-BMI1BMI2-NEXT:    xorl %ebx, %ebx
6058 ; X86-BMI1BMI2-NEXT:  .LBB46_4:
6059 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
6060 ; X86-BMI1BMI2-NEXT:    pushl %ebx
6061 ; X86-BMI1BMI2-NEXT:    pushl %ebp
6062 ; X86-BMI1BMI2-NEXT:    calll use64
6063 ; X86-BMI1BMI2-NEXT:    addl $16, %esp
6064 ; X86-BMI1BMI2-NEXT:    andl %ebp, %esi
6065 ; X86-BMI1BMI2-NEXT:    andl %ebx, %edi
6066 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
6067 ; X86-BMI1BMI2-NEXT:    pushl {{[0-9]+}}(%esp)
6068 ; X86-BMI1BMI2-NEXT:    pushl {{[0-9]+}}(%esp)
6069 ; X86-BMI1BMI2-NEXT:    calll use64
6070 ; X86-BMI1BMI2-NEXT:    addl $16, %esp
6071 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
6072 ; X86-BMI1BMI2-NEXT:    movl %edi, %edx
6073 ; X86-BMI1BMI2-NEXT:    addl $12, %esp
6074 ; X86-BMI1BMI2-NEXT:    popl %esi
6075 ; X86-BMI1BMI2-NEXT:    popl %edi
6076 ; X86-BMI1BMI2-NEXT:    popl %ebx
6077 ; X86-BMI1BMI2-NEXT:    popl %ebp
6078 ; X86-BMI1BMI2-NEXT:    retl
6080 ; X64-NOBMI-LABEL: bextr64_c5_skipextrauses:
6081 ; X64-NOBMI:       # %bb.0:
6082 ; X64-NOBMI-NEXT:    pushq %r15
6083 ; X64-NOBMI-NEXT:    pushq %r14
6084 ; X64-NOBMI-NEXT:    pushq %rbx
6085 ; X64-NOBMI-NEXT:    movq %rsi, %r14
6086 ; X64-NOBMI-NEXT:    movq %rdi, %r15
6087 ; X64-NOBMI-NEXT:    movl %r14d, %ecx
6088 ; X64-NOBMI-NEXT:    shrq %cl, %r15
6089 ; X64-NOBMI-NEXT:    negb %dl
6090 ; X64-NOBMI-NEXT:    movq $-1, %rbx
6091 ; X64-NOBMI-NEXT:    movl %edx, %ecx
6092 ; X64-NOBMI-NEXT:    shrq %cl, %rbx
6093 ; X64-NOBMI-NEXT:    movq %rbx, %rdi
6094 ; X64-NOBMI-NEXT:    callq use64
6095 ; X64-NOBMI-NEXT:    andq %r15, %rbx
6096 ; X64-NOBMI-NEXT:    movq %r14, %rdi
6097 ; X64-NOBMI-NEXT:    callq use64
6098 ; X64-NOBMI-NEXT:    movq %rbx, %rax
6099 ; X64-NOBMI-NEXT:    popq %rbx
6100 ; X64-NOBMI-NEXT:    popq %r14
6101 ; X64-NOBMI-NEXT:    popq %r15
6102 ; X64-NOBMI-NEXT:    retq
6104 ; X64-BMI1NOTBM-LABEL: bextr64_c5_skipextrauses:
6105 ; X64-BMI1NOTBM:       # %bb.0:
6106 ; X64-BMI1NOTBM-NEXT:    pushq %r15
6107 ; X64-BMI1NOTBM-NEXT:    pushq %r14
6108 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
6109 ; X64-BMI1NOTBM-NEXT:    movq %rsi, %r14
6110 ; X64-BMI1NOTBM-NEXT:    movq %rdi, %r15
6111 ; X64-BMI1NOTBM-NEXT:    movl %r14d, %ecx
6112 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %r15
6113 ; X64-BMI1NOTBM-NEXT:    negb %dl
6114 ; X64-BMI1NOTBM-NEXT:    movq $-1, %rbx
6115 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
6116 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %rbx
6117 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rdi
6118 ; X64-BMI1NOTBM-NEXT:    callq use64
6119 ; X64-BMI1NOTBM-NEXT:    andq %r15, %rbx
6120 ; X64-BMI1NOTBM-NEXT:    movq %r14, %rdi
6121 ; X64-BMI1NOTBM-NEXT:    callq use64
6122 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rax
6123 ; X64-BMI1NOTBM-NEXT:    popq %rbx
6124 ; X64-BMI1NOTBM-NEXT:    popq %r14
6125 ; X64-BMI1NOTBM-NEXT:    popq %r15
6126 ; X64-BMI1NOTBM-NEXT:    retq
6128 ; X64-BMI1BMI2-LABEL: bextr64_c5_skipextrauses:
6129 ; X64-BMI1BMI2:       # %bb.0:
6130 ; X64-BMI1BMI2-NEXT:    pushq %r15
6131 ; X64-BMI1BMI2-NEXT:    pushq %r14
6132 ; X64-BMI1BMI2-NEXT:    pushq %rbx
6133 ; X64-BMI1BMI2-NEXT:    movq %rdx, %rbx
6134 ; X64-BMI1BMI2-NEXT:    movq %rsi, %r14
6135 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %r15
6136 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
6137 ; X64-BMI1BMI2-NEXT:    negb %al
6138 ; X64-BMI1BMI2-NEXT:    movq $-1, %rcx
6139 ; X64-BMI1BMI2-NEXT:    shrxq %rax, %rcx, %rdi
6140 ; X64-BMI1BMI2-NEXT:    callq use64
6141 ; X64-BMI1BMI2-NEXT:    bzhiq %rbx, %r15, %rbx
6142 ; X64-BMI1BMI2-NEXT:    movq %r14, %rdi
6143 ; X64-BMI1BMI2-NEXT:    callq use64
6144 ; X64-BMI1BMI2-NEXT:    movq %rbx, %rax
6145 ; X64-BMI1BMI2-NEXT:    popq %rbx
6146 ; X64-BMI1BMI2-NEXT:    popq %r14
6147 ; X64-BMI1BMI2-NEXT:    popq %r15
6148 ; X64-BMI1BMI2-NEXT:    retq
6149   %shifted = lshr i64 %val, %numskipbits
6150   %numhighbits = sub i64 64, %numlowbits
6151   %mask = lshr i64 -1, %numhighbits
6152   call void @use64(i64 %mask)
6153   %masked = and i64 %mask, %shifted
6154   call void @use64(i64 %numskipbits)
6155   ret i64 %masked
6158 ; 64-bit, but with 32-bit output
6160 ; Everything done in 64-bit, truncation happens last.
6161 define i32 @bextr64_32_c0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
6162 ; X86-NOBMI-LABEL: bextr64_32_c0:
6163 ; X86-NOBMI:       # %bb.0:
6164 ; X86-NOBMI-NEXT:    pushl %esi
6165 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
6166 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
6167 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
6168 ; X86-NOBMI-NEXT:    movl %esi, %edx
6169 ; X86-NOBMI-NEXT:    shrl %cl, %edx
6170 ; X86-NOBMI-NEXT:    shrdl %cl, %esi, %eax
6171 ; X86-NOBMI-NEXT:    testb $32, %cl
6172 ; X86-NOBMI-NEXT:    jne .LBB47_2
6173 ; X86-NOBMI-NEXT:  # %bb.1:
6174 ; X86-NOBMI-NEXT:    movl %eax, %edx
6175 ; X86-NOBMI-NEXT:  .LBB47_2:
6176 ; X86-NOBMI-NEXT:    movb $64, %cl
6177 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
6178 ; X86-NOBMI-NEXT:    movl $-1, %esi
6179 ; X86-NOBMI-NEXT:    movl $-1, %eax
6180 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6181 ; X86-NOBMI-NEXT:    shrdl %cl, %esi, %esi
6182 ; X86-NOBMI-NEXT:    testb $32, %cl
6183 ; X86-NOBMI-NEXT:    jne .LBB47_4
6184 ; X86-NOBMI-NEXT:  # %bb.3:
6185 ; X86-NOBMI-NEXT:    movl %esi, %eax
6186 ; X86-NOBMI-NEXT:  .LBB47_4:
6187 ; X86-NOBMI-NEXT:    andl %edx, %eax
6188 ; X86-NOBMI-NEXT:    popl %esi
6189 ; X86-NOBMI-NEXT:    retl
6191 ; X86-BMI1NOTBM-LABEL: bextr64_32_c0:
6192 ; X86-BMI1NOTBM:       # %bb.0:
6193 ; X86-BMI1NOTBM-NEXT:    pushl %esi
6194 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
6195 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
6196 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
6197 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
6198 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
6199 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %esi, %eax
6200 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
6201 ; X86-BMI1NOTBM-NEXT:    jne .LBB47_2
6202 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
6203 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edx
6204 ; X86-BMI1NOTBM-NEXT:  .LBB47_2:
6205 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
6206 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
6207 ; X86-BMI1NOTBM-NEXT:    movl $-1, %esi
6208 ; X86-BMI1NOTBM-NEXT:    movl $-1, %eax
6209 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %eax
6210 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %esi, %esi
6211 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
6212 ; X86-BMI1NOTBM-NEXT:    jne .LBB47_4
6213 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
6214 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
6215 ; X86-BMI1NOTBM-NEXT:  .LBB47_4:
6216 ; X86-BMI1NOTBM-NEXT:    andl %edx, %eax
6217 ; X86-BMI1NOTBM-NEXT:    popl %esi
6218 ; X86-BMI1NOTBM-NEXT:    retl
6220 ; X86-BMI1BMI2-LABEL: bextr64_32_c0:
6221 ; X86-BMI1BMI2:       # %bb.0:
6222 ; X86-BMI1BMI2-NEXT:    pushl %esi
6223 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
6224 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
6225 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
6226 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %edx
6227 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
6228 ; X86-BMI1BMI2-NEXT:    je .LBB47_2
6229 ; X86-BMI1BMI2-NEXT:  # %bb.1:
6230 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edx
6231 ; X86-BMI1BMI2-NEXT:  .LBB47_2:
6232 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
6233 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
6234 ; X86-BMI1BMI2-NEXT:    movl $-1, %esi
6235 ; X86-BMI1BMI2-NEXT:    movl $-1, %eax
6236 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %eax
6237 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
6238 ; X86-BMI1BMI2-NEXT:    je .LBB47_4
6239 ; X86-BMI1BMI2-NEXT:  # %bb.3:
6240 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %eax
6241 ; X86-BMI1BMI2-NEXT:  .LBB47_4:
6242 ; X86-BMI1BMI2-NEXT:    andl %edx, %eax
6243 ; X86-BMI1BMI2-NEXT:    popl %esi
6244 ; X86-BMI1BMI2-NEXT:    retl
6246 ; X64-NOBMI-LABEL: bextr64_32_c0:
6247 ; X64-NOBMI:       # %bb.0:
6248 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
6249 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
6250 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
6251 ; X64-NOBMI-NEXT:    negb %dl
6252 ; X64-NOBMI-NEXT:    movq $-1, %rax
6253 ; X64-NOBMI-NEXT:    movl %edx, %ecx
6254 ; X64-NOBMI-NEXT:    shrq %cl, %rax
6255 ; X64-NOBMI-NEXT:    andl %edi, %eax
6256 ; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax
6257 ; X64-NOBMI-NEXT:    retq
6259 ; X64-BMI1NOTBM-LABEL: bextr64_32_c0:
6260 ; X64-BMI1NOTBM:       # %bb.0:
6261 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
6262 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
6263 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
6264 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
6265 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
6266 ; X64-BMI1NOTBM-NEXT:    retq
6268 ; X64-BMI1BMI2-LABEL: bextr64_32_c0:
6269 ; X64-BMI1BMI2:       # %bb.0:
6270 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
6271 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
6272 ; X64-BMI1BMI2-NEXT:    retq
6273   %shifted = lshr i64 %val, %numskipbits
6274   %numhighbits = sub i64 64, %numlowbits
6275   %mask = lshr i64 -1, %numhighbits
6276   %masked = and i64 %mask, %shifted
6277   %res = trunc i64 %masked to i32
6278   ret i32 %res
6281 ; Shifting happens in 64-bit, then truncation. Masking is 32-bit.
6282 define i32 @bextr64_32_c1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {
6283 ; X86-NOBMI-LABEL: bextr64_32_c1:
6284 ; X86-NOBMI:       # %bb.0:
6285 ; X86-NOBMI-NEXT:    pushl %esi
6286 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
6287 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx
6288 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
6289 ; X86-NOBMI-NEXT:    movl %esi, %eax
6290 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6291 ; X86-NOBMI-NEXT:    shrdl %cl, %esi, %edx
6292 ; X86-NOBMI-NEXT:    testb $32, %cl
6293 ; X86-NOBMI-NEXT:    jne .LBB48_2
6294 ; X86-NOBMI-NEXT:  # %bb.1:
6295 ; X86-NOBMI-NEXT:    movl %edx, %eax
6296 ; X86-NOBMI-NEXT:  .LBB48_2:
6297 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
6298 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
6299 ; X86-NOBMI-NEXT:    shll %cl, %eax
6300 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
6301 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6302 ; X86-NOBMI-NEXT:    popl %esi
6303 ; X86-NOBMI-NEXT:    retl
6305 ; X86-BMI1NOTBM-LABEL: bextr64_32_c1:
6306 ; X86-BMI1NOTBM:       # %bb.0:
6307 ; X86-BMI1NOTBM-NEXT:    pushl %edi
6308 ; X86-BMI1NOTBM-NEXT:    pushl %esi
6309 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
6310 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
6311 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
6312 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
6313 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
6314 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
6315 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
6316 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
6317 ; X86-BMI1NOTBM-NEXT:    jne .LBB48_2
6318 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
6319 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
6320 ; X86-BMI1NOTBM-NEXT:  .LBB48_2:
6321 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
6322 ; X86-BMI1NOTBM-NEXT:    bextrl %eax, %edx, %eax
6323 ; X86-BMI1NOTBM-NEXT:    popl %esi
6324 ; X86-BMI1NOTBM-NEXT:    popl %edi
6325 ; X86-BMI1NOTBM-NEXT:    retl
6327 ; X86-BMI1BMI2-LABEL: bextr64_32_c1:
6328 ; X86-BMI1BMI2:       # %bb.0:
6329 ; X86-BMI1BMI2-NEXT:    pushl %esi
6330 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
6331 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
6332 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
6333 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
6334 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edx
6335 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
6336 ; X86-BMI1BMI2-NEXT:    je .LBB48_2
6337 ; X86-BMI1BMI2-NEXT:  # %bb.1:
6338 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %edx
6339 ; X86-BMI1BMI2-NEXT:  .LBB48_2:
6340 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %edx, %eax
6341 ; X86-BMI1BMI2-NEXT:    popl %esi
6342 ; X86-BMI1BMI2-NEXT:    retl
6344 ; X64-NOBMI-LABEL: bextr64_32_c1:
6345 ; X64-NOBMI:       # %bb.0:
6346 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
6347 ; X64-NOBMI-NEXT:    movq %rdi, %rax
6348 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
6349 ; X64-NOBMI-NEXT:    shrq %cl, %rax
6350 ; X64-NOBMI-NEXT:    negb %dl
6351 ; X64-NOBMI-NEXT:    movl %edx, %ecx
6352 ; X64-NOBMI-NEXT:    shll %cl, %eax
6353 ; X64-NOBMI-NEXT:    shrl %cl, %eax
6354 ; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax
6355 ; X64-NOBMI-NEXT:    retq
6357 ; X64-BMI1NOTBM-LABEL: bextr64_32_c1:
6358 ; X64-BMI1NOTBM:       # %bb.0:
6359 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
6360 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
6361 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
6362 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
6363 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
6364 ; X64-BMI1NOTBM-NEXT:    retq
6366 ; X64-BMI1BMI2-LABEL: bextr64_32_c1:
6367 ; X64-BMI1BMI2:       # %bb.0:
6368 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
6369 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
6370 ; X64-BMI1BMI2-NEXT:    retq
6371   %shifted = lshr i64 %val, %numskipbits
6372   %truncshifted = trunc i64 %shifted to i32
6373   %numhighbits = sub i32 32, %numlowbits
6374   %mask = lshr i32 -1, %numhighbits
6375   %masked = and i32 %mask, %truncshifted
6376   ret i32 %masked
6379 ; Shifting happens in 64-bit. Mask is 32-bit, but extended to 64-bit.
6380 ; Masking is 64-bit. Then truncation.
6381 define i32 @bextr64_32_c2(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {
6382 ; X86-NOBMI-LABEL: bextr64_32_c2:
6383 ; X86-NOBMI:       # %bb.0:
6384 ; X86-NOBMI-NEXT:    pushl %esi
6385 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
6386 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx
6387 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
6388 ; X86-NOBMI-NEXT:    movl %esi, %eax
6389 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6390 ; X86-NOBMI-NEXT:    shrdl %cl, %esi, %edx
6391 ; X86-NOBMI-NEXT:    testb $32, %cl
6392 ; X86-NOBMI-NEXT:    jne .LBB49_2
6393 ; X86-NOBMI-NEXT:  # %bb.1:
6394 ; X86-NOBMI-NEXT:    movl %edx, %eax
6395 ; X86-NOBMI-NEXT:  .LBB49_2:
6396 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
6397 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
6398 ; X86-NOBMI-NEXT:    shll %cl, %eax
6399 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
6400 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6401 ; X86-NOBMI-NEXT:    popl %esi
6402 ; X86-NOBMI-NEXT:    retl
6404 ; X86-BMI1NOTBM-LABEL: bextr64_32_c2:
6405 ; X86-BMI1NOTBM:       # %bb.0:
6406 ; X86-BMI1NOTBM-NEXT:    pushl %edi
6407 ; X86-BMI1NOTBM-NEXT:    pushl %esi
6408 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
6409 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
6410 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
6411 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
6412 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
6413 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
6414 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
6415 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
6416 ; X86-BMI1NOTBM-NEXT:    jne .LBB49_2
6417 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
6418 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
6419 ; X86-BMI1NOTBM-NEXT:  .LBB49_2:
6420 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
6421 ; X86-BMI1NOTBM-NEXT:    bextrl %eax, %edx, %eax
6422 ; X86-BMI1NOTBM-NEXT:    popl %esi
6423 ; X86-BMI1NOTBM-NEXT:    popl %edi
6424 ; X86-BMI1NOTBM-NEXT:    retl
6426 ; X86-BMI1BMI2-LABEL: bextr64_32_c2:
6427 ; X86-BMI1BMI2:       # %bb.0:
6428 ; X86-BMI1BMI2-NEXT:    pushl %esi
6429 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
6430 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
6431 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
6432 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
6433 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edx
6434 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
6435 ; X86-BMI1BMI2-NEXT:    je .LBB49_2
6436 ; X86-BMI1BMI2-NEXT:  # %bb.1:
6437 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %edx
6438 ; X86-BMI1BMI2-NEXT:  .LBB49_2:
6439 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %edx, %eax
6440 ; X86-BMI1BMI2-NEXT:    popl %esi
6441 ; X86-BMI1BMI2-NEXT:    retl
6443 ; X64-NOBMI-LABEL: bextr64_32_c2:
6444 ; X64-NOBMI:       # %bb.0:
6445 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
6446 ; X64-NOBMI-NEXT:    movq %rdi, %rax
6447 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
6448 ; X64-NOBMI-NEXT:    shrq %cl, %rax
6449 ; X64-NOBMI-NEXT:    negb %dl
6450 ; X64-NOBMI-NEXT:    movl %edx, %ecx
6451 ; X64-NOBMI-NEXT:    shll %cl, %eax
6452 ; X64-NOBMI-NEXT:    shrl %cl, %eax
6453 ; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax
6454 ; X64-NOBMI-NEXT:    retq
6456 ; X64-BMI1NOTBM-LABEL: bextr64_32_c2:
6457 ; X64-BMI1NOTBM:       # %bb.0:
6458 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
6459 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
6460 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
6461 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
6462 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
6463 ; X64-BMI1NOTBM-NEXT:    retq
6465 ; X64-BMI1BMI2-LABEL: bextr64_32_c2:
6466 ; X64-BMI1BMI2:       # %bb.0:
6467 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
6468 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
6469 ; X64-BMI1BMI2-NEXT:    retq
6470   %shifted = lshr i64 %val, %numskipbits
6471   %numhighbits = sub i32 32, %numlowbits
6472   %mask = lshr i32 -1, %numhighbits
6473   %zextmask = zext i32 %mask to i64
6474   %masked = and i64 %zextmask, %shifted
6475   %truncmasked = trunc i64 %masked to i32
6476   ret i32 %truncmasked
6479 ; Shifting happens in 64-bit. Mask is 32-bit, but calculated in 64-bit.
6480 ; Masking is 64-bit. Then truncation.
6481 define i32 @bextr64_32_c3(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
6482 ; X86-NOBMI-LABEL: bextr64_32_c3:
6483 ; X86-NOBMI:       # %bb.0:
6484 ; X86-NOBMI-NEXT:    pushl %esi
6485 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
6486 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
6487 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
6488 ; X86-NOBMI-NEXT:    movl %esi, %edx
6489 ; X86-NOBMI-NEXT:    shrl %cl, %edx
6490 ; X86-NOBMI-NEXT:    shrdl %cl, %esi, %eax
6491 ; X86-NOBMI-NEXT:    testb $32, %cl
6492 ; X86-NOBMI-NEXT:    jne .LBB50_2
6493 ; X86-NOBMI-NEXT:  # %bb.1:
6494 ; X86-NOBMI-NEXT:    movl %eax, %edx
6495 ; X86-NOBMI-NEXT:  .LBB50_2:
6496 ; X86-NOBMI-NEXT:    movb $64, %cl
6497 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
6498 ; X86-NOBMI-NEXT:    xorl %eax, %eax
6499 ; X86-NOBMI-NEXT:    movl $-1, %esi
6500 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %esi
6501 ; X86-NOBMI-NEXT:    testb $32, %cl
6502 ; X86-NOBMI-NEXT:    jne .LBB50_4
6503 ; X86-NOBMI-NEXT:  # %bb.3:
6504 ; X86-NOBMI-NEXT:    movl %esi, %eax
6505 ; X86-NOBMI-NEXT:  .LBB50_4:
6506 ; X86-NOBMI-NEXT:    andl %edx, %eax
6507 ; X86-NOBMI-NEXT:    popl %esi
6508 ; X86-NOBMI-NEXT:    retl
6510 ; X86-BMI1NOTBM-LABEL: bextr64_32_c3:
6511 ; X86-BMI1NOTBM:       # %bb.0:
6512 ; X86-BMI1NOTBM-NEXT:    pushl %esi
6513 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
6514 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
6515 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
6516 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
6517 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
6518 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %esi, %eax
6519 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
6520 ; X86-BMI1NOTBM-NEXT:    jne .LBB50_2
6521 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
6522 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edx
6523 ; X86-BMI1NOTBM-NEXT:  .LBB50_2:
6524 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
6525 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
6526 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
6527 ; X86-BMI1NOTBM-NEXT:    movl $-1, %esi
6528 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %esi
6529 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
6530 ; X86-BMI1NOTBM-NEXT:    jne .LBB50_4
6531 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
6532 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
6533 ; X86-BMI1NOTBM-NEXT:  .LBB50_4:
6534 ; X86-BMI1NOTBM-NEXT:    andl %edx, %eax
6535 ; X86-BMI1NOTBM-NEXT:    popl %esi
6536 ; X86-BMI1NOTBM-NEXT:    retl
6538 ; X86-BMI1BMI2-LABEL: bextr64_32_c3:
6539 ; X86-BMI1BMI2:       # %bb.0:
6540 ; X86-BMI1BMI2-NEXT:    pushl %esi
6541 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
6542 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
6543 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
6544 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %edx
6545 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
6546 ; X86-BMI1BMI2-NEXT:    je .LBB50_2
6547 ; X86-BMI1BMI2-NEXT:  # %bb.1:
6548 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %eax, %edx
6549 ; X86-BMI1BMI2-NEXT:  .LBB50_2:
6550 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
6551 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
6552 ; X86-BMI1BMI2-NEXT:    xorl %eax, %eax
6553 ; X86-BMI1BMI2-NEXT:    movl $-1, %esi
6554 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %eax, %esi
6555 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
6556 ; X86-BMI1BMI2-NEXT:    jne .LBB50_4
6557 ; X86-BMI1BMI2-NEXT:  # %bb.3:
6558 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
6559 ; X86-BMI1BMI2-NEXT:  .LBB50_4:
6560 ; X86-BMI1BMI2-NEXT:    andl %edx, %eax
6561 ; X86-BMI1BMI2-NEXT:    popl %esi
6562 ; X86-BMI1BMI2-NEXT:    retl
6564 ; X64-NOBMI-LABEL: bextr64_32_c3:
6565 ; X64-NOBMI:       # %bb.0:
6566 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
6567 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
6568 ; X64-NOBMI-NEXT:    shrq %cl, %rdi
6569 ; X64-NOBMI-NEXT:    negb %dl
6570 ; X64-NOBMI-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF
6571 ; X64-NOBMI-NEXT:    movl %edx, %ecx
6572 ; X64-NOBMI-NEXT:    shrq %cl, %rax
6573 ; X64-NOBMI-NEXT:    andl %edi, %eax
6574 ; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax
6575 ; X64-NOBMI-NEXT:    retq
6577 ; X64-BMI1NOTBM-LABEL: bextr64_32_c3:
6578 ; X64-BMI1NOTBM:       # %bb.0:
6579 ; X64-BMI1NOTBM-NEXT:    movq %rsi, %rcx
6580 ; X64-BMI1NOTBM-NEXT:    # kill: def $cl killed $cl killed $rcx
6581 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %rdi
6582 ; X64-BMI1NOTBM-NEXT:    negb %dl
6583 ; X64-BMI1NOTBM-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF
6584 ; X64-BMI1NOTBM-NEXT:    movl %edx, %ecx
6585 ; X64-BMI1NOTBM-NEXT:    shrq %cl, %rax
6586 ; X64-BMI1NOTBM-NEXT:    andl %edi, %eax
6587 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
6588 ; X64-BMI1NOTBM-NEXT:    retq
6590 ; X64-BMI1BMI2-LABEL: bextr64_32_c3:
6591 ; X64-BMI1BMI2:       # %bb.0:
6592 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rcx
6593 ; X64-BMI1BMI2-NEXT:    negb %dl
6594 ; X64-BMI1BMI2-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF
6595 ; X64-BMI1BMI2-NEXT:    shrxq %rdx, %rax, %rax
6596 ; X64-BMI1BMI2-NEXT:    andl %ecx, %eax
6597 ; X64-BMI1BMI2-NEXT:    # kill: def $eax killed $eax killed $rax
6598 ; X64-BMI1BMI2-NEXT:    retq
6599   %shifted = lshr i64 %val, %numskipbits
6600   %numhighbits = sub i64 64, %numlowbits
6601   %mask = lshr i64 4294967295, %numhighbits
6602   %masked = and i64 %mask, %shifted
6603   %truncmasked = trunc i64 %masked to i32
6604   ret i32 %truncmasked
6607 ; ---------------------------------------------------------------------------- ;
6608 ; Pattern d. 32-bit.
6609 ; ---------------------------------------------------------------------------- ;
6611 define i32 @bextr32_d0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
6612 ; X86-NOBMI-LABEL: bextr32_d0:
6613 ; X86-NOBMI:       # %bb.0:
6614 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
6615 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
6616 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6617 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
6618 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
6619 ; X86-NOBMI-NEXT:    shll %cl, %eax
6620 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
6621 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6622 ; X86-NOBMI-NEXT:    retl
6624 ; X86-BMI1NOTBM-LABEL: bextr32_d0:
6625 ; X86-BMI1NOTBM:       # %bb.0:
6626 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
6627 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
6628 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
6629 ; X86-BMI1NOTBM-NEXT:    orl %eax, %ecx
6630 ; X86-BMI1NOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax
6631 ; X86-BMI1NOTBM-NEXT:    retl
6633 ; X86-BMI1BMI2-LABEL: bextr32_d0:
6634 ; X86-BMI1BMI2:       # %bb.0:
6635 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
6636 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
6637 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx
6638 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
6639 ; X86-BMI1BMI2-NEXT:    retl
6641 ; X64-NOBMI-LABEL: bextr32_d0:
6642 ; X64-NOBMI:       # %bb.0:
6643 ; X64-NOBMI-NEXT:    movl %esi, %ecx
6644 ; X64-NOBMI-NEXT:    movl %edi, %eax
6645 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
6646 ; X64-NOBMI-NEXT:    shrl %cl, %eax
6647 ; X64-NOBMI-NEXT:    negb %dl
6648 ; X64-NOBMI-NEXT:    movl %edx, %ecx
6649 ; X64-NOBMI-NEXT:    shll %cl, %eax
6650 ; X64-NOBMI-NEXT:    shrl %cl, %eax
6651 ; X64-NOBMI-NEXT:    retq
6653 ; X64-BMI1NOTBM-LABEL: bextr32_d0:
6654 ; X64-BMI1NOTBM:       # %bb.0:
6655 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
6656 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
6657 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
6658 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %eax
6659 ; X64-BMI1NOTBM-NEXT:    retq
6661 ; X64-BMI1BMI2-LABEL: bextr32_d0:
6662 ; X64-BMI1BMI2:       # %bb.0:
6663 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %eax
6664 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
6665 ; X64-BMI1BMI2-NEXT:    retq
6666   %shifted = lshr i32 %val, %numskipbits
6667   %numhighbits = sub i32 32, %numlowbits
6668   %highbitscleared = shl i32 %shifted, %numhighbits
6669   %masked = lshr i32 %highbitscleared, %numhighbits
6670   ret i32 %masked
6673 define i32 @bextr32_d1_indexzext(i32 %val, i8 %numskipbits, i8 %numlowbits) nounwind {
6674 ; X86-NOBMI-LABEL: bextr32_d1_indexzext:
6675 ; X86-NOBMI:       # %bb.0:
6676 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
6677 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
6678 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6679 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
6680 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
6681 ; X86-NOBMI-NEXT:    shll %cl, %eax
6682 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
6683 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6684 ; X86-NOBMI-NEXT:    retl
6686 ; X86-BMI1NOTBM-LABEL: bextr32_d1_indexzext:
6687 ; X86-BMI1NOTBM:       # %bb.0:
6688 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
6689 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
6690 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
6691 ; X86-BMI1NOTBM-NEXT:    orl %eax, %ecx
6692 ; X86-BMI1NOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %eax
6693 ; X86-BMI1NOTBM-NEXT:    retl
6695 ; X86-BMI1BMI2-LABEL: bextr32_d1_indexzext:
6696 ; X86-BMI1BMI2:       # %bb.0:
6697 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
6698 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
6699 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %ecx
6700 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
6701 ; X86-BMI1BMI2-NEXT:    retl
6703 ; X64-NOBMI-LABEL: bextr32_d1_indexzext:
6704 ; X64-NOBMI:       # %bb.0:
6705 ; X64-NOBMI-NEXT:    movl %esi, %ecx
6706 ; X64-NOBMI-NEXT:    movl %edi, %eax
6707 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
6708 ; X64-NOBMI-NEXT:    shrl %cl, %eax
6709 ; X64-NOBMI-NEXT:    negb %dl
6710 ; X64-NOBMI-NEXT:    movl %edx, %ecx
6711 ; X64-NOBMI-NEXT:    shll %cl, %eax
6712 ; X64-NOBMI-NEXT:    shrl %cl, %eax
6713 ; X64-NOBMI-NEXT:    retq
6715 ; X64-BMI1NOTBM-LABEL: bextr32_d1_indexzext:
6716 ; X64-BMI1NOTBM:       # %bb.0:
6717 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
6718 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
6719 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
6720 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %eax
6721 ; X64-BMI1NOTBM-NEXT:    retq
6723 ; X64-BMI1BMI2-LABEL: bextr32_d1_indexzext:
6724 ; X64-BMI1BMI2:       # %bb.0:
6725 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %eax
6726 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
6727 ; X64-BMI1BMI2-NEXT:    retq
6728   %skip = zext i8 %numskipbits to i32
6729   %shifted = lshr i32 %val, %skip
6730   %numhighbits = sub i8 32, %numlowbits
6731   %sh_prom = zext i8 %numhighbits to i32
6732   %highbitscleared = shl i32 %shifted, %sh_prom
6733   %masked = lshr i32 %highbitscleared, %sh_prom
6734   ret i32 %masked
6737 define i32 @bextr32_d2_load(i32* %w, i32 %numskipbits, i32 %numlowbits) nounwind {
6738 ; X86-NOBMI-LABEL: bextr32_d2_load:
6739 ; X86-NOBMI:       # %bb.0:
6740 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
6741 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
6742 ; X86-NOBMI-NEXT:    movl (%eax), %eax
6743 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6744 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
6745 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
6746 ; X86-NOBMI-NEXT:    shll %cl, %eax
6747 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
6748 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6749 ; X86-NOBMI-NEXT:    retl
6751 ; X86-BMI1NOTBM-LABEL: bextr32_d2_load:
6752 ; X86-BMI1NOTBM:       # %bb.0:
6753 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
6754 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
6755 ; X86-BMI1NOTBM-NEXT:    shll $8, %ecx
6756 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
6757 ; X86-BMI1NOTBM-NEXT:    orl %ecx, %edx
6758 ; X86-BMI1NOTBM-NEXT:    bextrl %edx, (%eax), %eax
6759 ; X86-BMI1NOTBM-NEXT:    retl
6761 ; X86-BMI1BMI2-LABEL: bextr32_d2_load:
6762 ; X86-BMI1BMI2:       # %bb.0:
6763 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
6764 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
6765 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %dl
6766 ; X86-BMI1BMI2-NEXT:    shrxl %edx, (%ecx), %ecx
6767 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
6768 ; X86-BMI1BMI2-NEXT:    retl
6770 ; X64-NOBMI-LABEL: bextr32_d2_load:
6771 ; X64-NOBMI:       # %bb.0:
6772 ; X64-NOBMI-NEXT:    movl %esi, %ecx
6773 ; X64-NOBMI-NEXT:    movl (%rdi), %eax
6774 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
6775 ; X64-NOBMI-NEXT:    shrl %cl, %eax
6776 ; X64-NOBMI-NEXT:    negb %dl
6777 ; X64-NOBMI-NEXT:    movl %edx, %ecx
6778 ; X64-NOBMI-NEXT:    shll %cl, %eax
6779 ; X64-NOBMI-NEXT:    shrl %cl, %eax
6780 ; X64-NOBMI-NEXT:    retq
6782 ; X64-BMI1NOTBM-LABEL: bextr32_d2_load:
6783 ; X64-BMI1NOTBM:       # %bb.0:
6784 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
6785 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
6786 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
6787 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, (%rdi), %eax
6788 ; X64-BMI1NOTBM-NEXT:    retq
6790 ; X64-BMI1BMI2-LABEL: bextr32_d2_load:
6791 ; X64-BMI1BMI2:       # %bb.0:
6792 ; X64-BMI1BMI2-NEXT:    shrxl %esi, (%rdi), %eax
6793 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
6794 ; X64-BMI1BMI2-NEXT:    retq
6795   %val = load i32, i32* %w
6796   %shifted = lshr i32 %val, %numskipbits
6797   %numhighbits = sub i32 32, %numlowbits
6798   %highbitscleared = shl i32 %shifted, %numhighbits
6799   %masked = lshr i32 %highbitscleared, %numhighbits
6800   ret i32 %masked
6803 define i32 @bextr32_d3_load_indexzext(i32* %w, i8 %numskipbits, i8 %numlowbits) nounwind {
6804 ; X86-NOBMI-LABEL: bextr32_d3_load_indexzext:
6805 ; X86-NOBMI:       # %bb.0:
6806 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
6807 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
6808 ; X86-NOBMI-NEXT:    movl (%eax), %eax
6809 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6810 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
6811 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
6812 ; X86-NOBMI-NEXT:    shll %cl, %eax
6813 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
6814 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6815 ; X86-NOBMI-NEXT:    retl
6817 ; X86-BMI1NOTBM-LABEL: bextr32_d3_load_indexzext:
6818 ; X86-BMI1NOTBM:       # %bb.0:
6819 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
6820 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
6821 ; X86-BMI1NOTBM-NEXT:    shll $8, %ecx
6822 ; X86-BMI1NOTBM-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
6823 ; X86-BMI1NOTBM-NEXT:    orl %ecx, %edx
6824 ; X86-BMI1NOTBM-NEXT:    bextrl %edx, (%eax), %eax
6825 ; X86-BMI1NOTBM-NEXT:    retl
6827 ; X86-BMI1BMI2-LABEL: bextr32_d3_load_indexzext:
6828 ; X86-BMI1BMI2:       # %bb.0:
6829 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
6830 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
6831 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %dl
6832 ; X86-BMI1BMI2-NEXT:    shrxl %edx, (%ecx), %ecx
6833 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %ecx, %eax
6834 ; X86-BMI1BMI2-NEXT:    retl
6836 ; X64-NOBMI-LABEL: bextr32_d3_load_indexzext:
6837 ; X64-NOBMI:       # %bb.0:
6838 ; X64-NOBMI-NEXT:    movl %esi, %ecx
6839 ; X64-NOBMI-NEXT:    movl (%rdi), %eax
6840 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
6841 ; X64-NOBMI-NEXT:    shrl %cl, %eax
6842 ; X64-NOBMI-NEXT:    negb %dl
6843 ; X64-NOBMI-NEXT:    movl %edx, %ecx
6844 ; X64-NOBMI-NEXT:    shll %cl, %eax
6845 ; X64-NOBMI-NEXT:    shrl %cl, %eax
6846 ; X64-NOBMI-NEXT:    retq
6848 ; X64-BMI1NOTBM-LABEL: bextr32_d3_load_indexzext:
6849 ; X64-BMI1NOTBM:       # %bb.0:
6850 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
6851 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
6852 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
6853 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, (%rdi), %eax
6854 ; X64-BMI1NOTBM-NEXT:    retq
6856 ; X64-BMI1BMI2-LABEL: bextr32_d3_load_indexzext:
6857 ; X64-BMI1BMI2:       # %bb.0:
6858 ; X64-BMI1BMI2-NEXT:    shrxl %esi, (%rdi), %eax
6859 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
6860 ; X64-BMI1BMI2-NEXT:    retq
6861   %val = load i32, i32* %w
6862   %skip = zext i8 %numskipbits to i32
6863   %shifted = lshr i32 %val, %skip
6864   %numhighbits = sub i8 32, %numlowbits
6865   %sh_prom = zext i8 %numhighbits to i32
6866   %highbitscleared = shl i32 %shifted, %sh_prom
6867   %masked = lshr i32 %highbitscleared, %sh_prom
6868   ret i32 %masked
6871 define i32 @bextr32_d5_skipextrauses(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
6872 ; X86-NOBMI-LABEL: bextr32_d5_skipextrauses:
6873 ; X86-NOBMI:       # %bb.0:
6874 ; X86-NOBMI-NEXT:    pushl %esi
6875 ; X86-NOBMI-NEXT:    subl $8, %esp
6876 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
6877 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
6878 ; X86-NOBMI-NEXT:    movl %eax, %ecx
6879 ; X86-NOBMI-NEXT:    shrl %cl, %esi
6880 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
6881 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
6882 ; X86-NOBMI-NEXT:    shll %cl, %esi
6883 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
6884 ; X86-NOBMI-NEXT:    shrl %cl, %esi
6885 ; X86-NOBMI-NEXT:    movl %eax, (%esp)
6886 ; X86-NOBMI-NEXT:    calll use32
6887 ; X86-NOBMI-NEXT:    movl %esi, %eax
6888 ; X86-NOBMI-NEXT:    addl $8, %esp
6889 ; X86-NOBMI-NEXT:    popl %esi
6890 ; X86-NOBMI-NEXT:    retl
6892 ; X86-BMI1NOTBM-LABEL: bextr32_d5_skipextrauses:
6893 ; X86-BMI1NOTBM:       # %bb.0:
6894 ; X86-BMI1NOTBM-NEXT:    pushl %esi
6895 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
6896 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
6897 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
6898 ; X86-BMI1NOTBM-NEXT:    shll $8, %ecx
6899 ; X86-BMI1NOTBM-NEXT:    movzbl %al, %edx
6900 ; X86-BMI1NOTBM-NEXT:    orl %ecx, %edx
6901 ; X86-BMI1NOTBM-NEXT:    bextrl %edx, {{[0-9]+}}(%esp), %esi
6902 ; X86-BMI1NOTBM-NEXT:    movl %eax, (%esp)
6903 ; X86-BMI1NOTBM-NEXT:    calll use32
6904 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
6905 ; X86-BMI1NOTBM-NEXT:    addl $8, %esp
6906 ; X86-BMI1NOTBM-NEXT:    popl %esi
6907 ; X86-BMI1NOTBM-NEXT:    retl
6909 ; X86-BMI1BMI2-LABEL: bextr32_d5_skipextrauses:
6910 ; X86-BMI1BMI2:       # %bb.0:
6911 ; X86-BMI1BMI2-NEXT:    pushl %esi
6912 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
6913 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
6914 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
6915 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, {{[0-9]+}}(%esp), %edx
6916 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %edx, %esi
6917 ; X86-BMI1BMI2-NEXT:    movl %ecx, (%esp)
6918 ; X86-BMI1BMI2-NEXT:    calll use32
6919 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
6920 ; X86-BMI1BMI2-NEXT:    addl $8, %esp
6921 ; X86-BMI1BMI2-NEXT:    popl %esi
6922 ; X86-BMI1BMI2-NEXT:    retl
6924 ; X64-NOBMI-LABEL: bextr32_d5_skipextrauses:
6925 ; X64-NOBMI:       # %bb.0:
6926 ; X64-NOBMI-NEXT:    pushq %rbx
6927 ; X64-NOBMI-NEXT:    movl %edi, %ebx
6928 ; X64-NOBMI-NEXT:    movl %esi, %ecx
6929 ; X64-NOBMI-NEXT:    shrl %cl, %ebx
6930 ; X64-NOBMI-NEXT:    negb %dl
6931 ; X64-NOBMI-NEXT:    movl %edx, %ecx
6932 ; X64-NOBMI-NEXT:    shll %cl, %ebx
6933 ; X64-NOBMI-NEXT:    shrl %cl, %ebx
6934 ; X64-NOBMI-NEXT:    movl %esi, %edi
6935 ; X64-NOBMI-NEXT:    callq use32
6936 ; X64-NOBMI-NEXT:    movl %ebx, %eax
6937 ; X64-NOBMI-NEXT:    popq %rbx
6938 ; X64-NOBMI-NEXT:    retq
6940 ; X64-BMI1NOTBM-LABEL: bextr32_d5_skipextrauses:
6941 ; X64-BMI1NOTBM:       # %bb.0:
6942 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
6943 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
6944 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
6945 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
6946 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %ebx
6947 ; X64-BMI1NOTBM-NEXT:    movl %esi, %edi
6948 ; X64-BMI1NOTBM-NEXT:    callq use32
6949 ; X64-BMI1NOTBM-NEXT:    movl %ebx, %eax
6950 ; X64-BMI1NOTBM-NEXT:    popq %rbx
6951 ; X64-BMI1NOTBM-NEXT:    retq
6953 ; X64-BMI1BMI2-LABEL: bextr32_d5_skipextrauses:
6954 ; X64-BMI1BMI2:       # %bb.0:
6955 ; X64-BMI1BMI2-NEXT:    pushq %rbx
6956 ; X64-BMI1BMI2-NEXT:    shrxl %esi, %edi, %eax
6957 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %ebx
6958 ; X64-BMI1BMI2-NEXT:    movl %esi, %edi
6959 ; X64-BMI1BMI2-NEXT:    callq use32
6960 ; X64-BMI1BMI2-NEXT:    movl %ebx, %eax
6961 ; X64-BMI1BMI2-NEXT:    popq %rbx
6962 ; X64-BMI1BMI2-NEXT:    retq
6963   %shifted = lshr i32 %val, %numskipbits
6964   %numhighbits = sub i32 32, %numlowbits
6965   %highbitscleared = shl i32 %shifted, %numhighbits
6966   %masked = lshr i32 %highbitscleared, %numhighbits
6967   call void @use32(i32 %numskipbits)
6968   ret i32 %masked
6971 ; 64-bit.
6973 define i64 @bextr64_d0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
6974 ; X86-NOBMI-LABEL: bextr64_d0:
6975 ; X86-NOBMI:       # %bb.0:
6976 ; X86-NOBMI-NEXT:    pushl %ebx
6977 ; X86-NOBMI-NEXT:    pushl %edi
6978 ; X86-NOBMI-NEXT:    pushl %esi
6979 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
6980 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
6981 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx
6982 ; X86-NOBMI-NEXT:    movl %edx, %eax
6983 ; X86-NOBMI-NEXT:    shrl %cl, %eax
6984 ; X86-NOBMI-NEXT:    shrdl %cl, %edx, %edi
6985 ; X86-NOBMI-NEXT:    xorl %esi, %esi
6986 ; X86-NOBMI-NEXT:    testb $32, %cl
6987 ; X86-NOBMI-NEXT:    je .LBB56_2
6988 ; X86-NOBMI-NEXT:  # %bb.1:
6989 ; X86-NOBMI-NEXT:    movl %eax, %edi
6990 ; X86-NOBMI-NEXT:    xorl %eax, %eax
6991 ; X86-NOBMI-NEXT:  .LBB56_2:
6992 ; X86-NOBMI-NEXT:    movb $64, %cl
6993 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
6994 ; X86-NOBMI-NEXT:    shldl %cl, %edi, %eax
6995 ; X86-NOBMI-NEXT:    shll %cl, %edi
6996 ; X86-NOBMI-NEXT:    testb $32, %cl
6997 ; X86-NOBMI-NEXT:    movl %edi, %ebx
6998 ; X86-NOBMI-NEXT:    jne .LBB56_4
6999 ; X86-NOBMI-NEXT:  # %bb.3:
7000 ; X86-NOBMI-NEXT:    movl %eax, %ebx
7001 ; X86-NOBMI-NEXT:  .LBB56_4:
7002 ; X86-NOBMI-NEXT:    movl %ebx, %eax
7003 ; X86-NOBMI-NEXT:    shrl %cl, %eax
7004 ; X86-NOBMI-NEXT:    testb $32, %cl
7005 ; X86-NOBMI-NEXT:    movl $0, %edx
7006 ; X86-NOBMI-NEXT:    jne .LBB56_6
7007 ; X86-NOBMI-NEXT:  # %bb.5:
7008 ; X86-NOBMI-NEXT:    movl %edi, %esi
7009 ; X86-NOBMI-NEXT:    movl %eax, %edx
7010 ; X86-NOBMI-NEXT:  .LBB56_6:
7011 ; X86-NOBMI-NEXT:    shrdl %cl, %ebx, %esi
7012 ; X86-NOBMI-NEXT:    testb $32, %cl
7013 ; X86-NOBMI-NEXT:    jne .LBB56_8
7014 ; X86-NOBMI-NEXT:  # %bb.7:
7015 ; X86-NOBMI-NEXT:    movl %esi, %eax
7016 ; X86-NOBMI-NEXT:  .LBB56_8:
7017 ; X86-NOBMI-NEXT:    popl %esi
7018 ; X86-NOBMI-NEXT:    popl %edi
7019 ; X86-NOBMI-NEXT:    popl %ebx
7020 ; X86-NOBMI-NEXT:    retl
7022 ; X86-BMI1NOTBM-LABEL: bextr64_d0:
7023 ; X86-BMI1NOTBM:       # %bb.0:
7024 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
7025 ; X86-BMI1NOTBM-NEXT:    pushl %edi
7026 ; X86-BMI1NOTBM-NEXT:    pushl %esi
7027 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
7028 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
7029 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edx
7030 ; X86-BMI1NOTBM-NEXT:    movl %edx, %eax
7031 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %eax
7032 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edx, %edi
7033 ; X86-BMI1NOTBM-NEXT:    xorl %esi, %esi
7034 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7035 ; X86-BMI1NOTBM-NEXT:    je .LBB56_2
7036 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
7037 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
7038 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
7039 ; X86-BMI1NOTBM-NEXT:  .LBB56_2:
7040 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
7041 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
7042 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %edi, %eax
7043 ; X86-BMI1NOTBM-NEXT:    shll %cl, %edi
7044 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7045 ; X86-BMI1NOTBM-NEXT:    movl %edi, %ebx
7046 ; X86-BMI1NOTBM-NEXT:    jne .LBB56_4
7047 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
7048 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ebx
7049 ; X86-BMI1NOTBM-NEXT:  .LBB56_4:
7050 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %eax
7051 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %eax
7052 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7053 ; X86-BMI1NOTBM-NEXT:    movl $0, %edx
7054 ; X86-BMI1NOTBM-NEXT:    jne .LBB56_6
7055 ; X86-BMI1NOTBM-NEXT:  # %bb.5:
7056 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
7057 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edx
7058 ; X86-BMI1NOTBM-NEXT:  .LBB56_6:
7059 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %ebx, %esi
7060 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7061 ; X86-BMI1NOTBM-NEXT:    jne .LBB56_8
7062 ; X86-BMI1NOTBM-NEXT:  # %bb.7:
7063 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
7064 ; X86-BMI1NOTBM-NEXT:  .LBB56_8:
7065 ; X86-BMI1NOTBM-NEXT:    popl %esi
7066 ; X86-BMI1NOTBM-NEXT:    popl %edi
7067 ; X86-BMI1NOTBM-NEXT:    popl %ebx
7068 ; X86-BMI1NOTBM-NEXT:    retl
7070 ; X86-BMI1BMI2-LABEL: bextr64_d0:
7071 ; X86-BMI1BMI2:       # %bb.0:
7072 ; X86-BMI1BMI2-NEXT:    pushl %edi
7073 ; X86-BMI1BMI2-NEXT:    pushl %esi
7074 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
7075 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
7076 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
7077 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edx, %eax
7078 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edx, %esi
7079 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
7080 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7081 ; X86-BMI1BMI2-NEXT:    je .LBB56_2
7082 ; X86-BMI1BMI2-NEXT:  # %bb.1:
7083 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
7084 ; X86-BMI1BMI2-NEXT:    xorl %esi, %esi
7085 ; X86-BMI1BMI2-NEXT:  .LBB56_2:
7086 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
7087 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
7088 ; X86-BMI1BMI2-NEXT:    shldl %cl, %eax, %esi
7089 ; X86-BMI1BMI2-NEXT:    shlxl %ecx, %eax, %edi
7090 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7091 ; X86-BMI1BMI2-NEXT:    je .LBB56_4
7092 ; X86-BMI1BMI2-NEXT:  # %bb.3:
7093 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
7094 ; X86-BMI1BMI2-NEXT:    movl $0, %edi
7095 ; X86-BMI1BMI2-NEXT:  .LBB56_4:
7096 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %eax
7097 ; X86-BMI1BMI2-NEXT:    jne .LBB56_6
7098 ; X86-BMI1BMI2-NEXT:  # %bb.5:
7099 ; X86-BMI1BMI2-NEXT:    movl %eax, %edx
7100 ; X86-BMI1BMI2-NEXT:  .LBB56_6:
7101 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edi
7102 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7103 ; X86-BMI1BMI2-NEXT:    jne .LBB56_8
7104 ; X86-BMI1BMI2-NEXT:  # %bb.7:
7105 ; X86-BMI1BMI2-NEXT:    movl %edi, %eax
7106 ; X86-BMI1BMI2-NEXT:  .LBB56_8:
7107 ; X86-BMI1BMI2-NEXT:    popl %esi
7108 ; X86-BMI1BMI2-NEXT:    popl %edi
7109 ; X86-BMI1BMI2-NEXT:    retl
7111 ; X64-NOBMI-LABEL: bextr64_d0:
7112 ; X64-NOBMI:       # %bb.0:
7113 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
7114 ; X64-NOBMI-NEXT:    movq %rdi, %rax
7115 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
7116 ; X64-NOBMI-NEXT:    shrq %cl, %rax
7117 ; X64-NOBMI-NEXT:    negb %dl
7118 ; X64-NOBMI-NEXT:    movl %edx, %ecx
7119 ; X64-NOBMI-NEXT:    shlq %cl, %rax
7120 ; X64-NOBMI-NEXT:    shrq %cl, %rax
7121 ; X64-NOBMI-NEXT:    retq
7123 ; X64-BMI1NOTBM-LABEL: bextr64_d0:
7124 ; X64-BMI1NOTBM:       # %bb.0:
7125 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
7126 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
7127 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
7128 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
7129 ; X64-BMI1NOTBM-NEXT:    retq
7131 ; X64-BMI1BMI2-LABEL: bextr64_d0:
7132 ; X64-BMI1BMI2:       # %bb.0:
7133 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
7134 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
7135 ; X64-BMI1BMI2-NEXT:    retq
7136   %shifted = lshr i64 %val, %numskipbits
7137   %numhighbits = sub i64 64, %numlowbits
7138   %highbitscleared = shl i64 %shifted, %numhighbits
7139   %masked = lshr i64 %highbitscleared, %numhighbits
7140   ret i64 %masked
7143 define i64 @bextr64_d1_indexzext(i64 %val, i8 %numskipbits, i8 %numlowbits) nounwind {
7144 ; X86-NOBMI-LABEL: bextr64_d1_indexzext:
7145 ; X86-NOBMI:       # %bb.0:
7146 ; X86-NOBMI-NEXT:    pushl %ebx
7147 ; X86-NOBMI-NEXT:    pushl %edi
7148 ; X86-NOBMI-NEXT:    pushl %esi
7149 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
7150 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edi
7151 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx
7152 ; X86-NOBMI-NEXT:    movl %edx, %eax
7153 ; X86-NOBMI-NEXT:    shrl %cl, %eax
7154 ; X86-NOBMI-NEXT:    shrdl %cl, %edx, %edi
7155 ; X86-NOBMI-NEXT:    xorl %esi, %esi
7156 ; X86-NOBMI-NEXT:    testb $32, %cl
7157 ; X86-NOBMI-NEXT:    je .LBB57_2
7158 ; X86-NOBMI-NEXT:  # %bb.1:
7159 ; X86-NOBMI-NEXT:    movl %eax, %edi
7160 ; X86-NOBMI-NEXT:    xorl %eax, %eax
7161 ; X86-NOBMI-NEXT:  .LBB57_2:
7162 ; X86-NOBMI-NEXT:    movb $64, %cl
7163 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
7164 ; X86-NOBMI-NEXT:    shldl %cl, %edi, %eax
7165 ; X86-NOBMI-NEXT:    shll %cl, %edi
7166 ; X86-NOBMI-NEXT:    testb $32, %cl
7167 ; X86-NOBMI-NEXT:    movl %edi, %ebx
7168 ; X86-NOBMI-NEXT:    jne .LBB57_4
7169 ; X86-NOBMI-NEXT:  # %bb.3:
7170 ; X86-NOBMI-NEXT:    movl %eax, %ebx
7171 ; X86-NOBMI-NEXT:  .LBB57_4:
7172 ; X86-NOBMI-NEXT:    movl %ebx, %eax
7173 ; X86-NOBMI-NEXT:    shrl %cl, %eax
7174 ; X86-NOBMI-NEXT:    testb $32, %cl
7175 ; X86-NOBMI-NEXT:    movl $0, %edx
7176 ; X86-NOBMI-NEXT:    jne .LBB57_6
7177 ; X86-NOBMI-NEXT:  # %bb.5:
7178 ; X86-NOBMI-NEXT:    movl %edi, %esi
7179 ; X86-NOBMI-NEXT:    movl %eax, %edx
7180 ; X86-NOBMI-NEXT:  .LBB57_6:
7181 ; X86-NOBMI-NEXT:    shrdl %cl, %ebx, %esi
7182 ; X86-NOBMI-NEXT:    testb $32, %cl
7183 ; X86-NOBMI-NEXT:    jne .LBB57_8
7184 ; X86-NOBMI-NEXT:  # %bb.7:
7185 ; X86-NOBMI-NEXT:    movl %esi, %eax
7186 ; X86-NOBMI-NEXT:  .LBB57_8:
7187 ; X86-NOBMI-NEXT:    popl %esi
7188 ; X86-NOBMI-NEXT:    popl %edi
7189 ; X86-NOBMI-NEXT:    popl %ebx
7190 ; X86-NOBMI-NEXT:    retl
7192 ; X86-BMI1NOTBM-LABEL: bextr64_d1_indexzext:
7193 ; X86-BMI1NOTBM:       # %bb.0:
7194 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
7195 ; X86-BMI1NOTBM-NEXT:    pushl %edi
7196 ; X86-BMI1NOTBM-NEXT:    pushl %esi
7197 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
7198 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
7199 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edx
7200 ; X86-BMI1NOTBM-NEXT:    movl %edx, %eax
7201 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %eax
7202 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edx, %edi
7203 ; X86-BMI1NOTBM-NEXT:    xorl %esi, %esi
7204 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7205 ; X86-BMI1NOTBM-NEXT:    je .LBB57_2
7206 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
7207 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
7208 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
7209 ; X86-BMI1NOTBM-NEXT:  .LBB57_2:
7210 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
7211 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
7212 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %edi, %eax
7213 ; X86-BMI1NOTBM-NEXT:    shll %cl, %edi
7214 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7215 ; X86-BMI1NOTBM-NEXT:    movl %edi, %ebx
7216 ; X86-BMI1NOTBM-NEXT:    jne .LBB57_4
7217 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
7218 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ebx
7219 ; X86-BMI1NOTBM-NEXT:  .LBB57_4:
7220 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %eax
7221 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %eax
7222 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7223 ; X86-BMI1NOTBM-NEXT:    movl $0, %edx
7224 ; X86-BMI1NOTBM-NEXT:    jne .LBB57_6
7225 ; X86-BMI1NOTBM-NEXT:  # %bb.5:
7226 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
7227 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edx
7228 ; X86-BMI1NOTBM-NEXT:  .LBB57_6:
7229 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %ebx, %esi
7230 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7231 ; X86-BMI1NOTBM-NEXT:    jne .LBB57_8
7232 ; X86-BMI1NOTBM-NEXT:  # %bb.7:
7233 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
7234 ; X86-BMI1NOTBM-NEXT:  .LBB57_8:
7235 ; X86-BMI1NOTBM-NEXT:    popl %esi
7236 ; X86-BMI1NOTBM-NEXT:    popl %edi
7237 ; X86-BMI1NOTBM-NEXT:    popl %ebx
7238 ; X86-BMI1NOTBM-NEXT:    retl
7240 ; X86-BMI1BMI2-LABEL: bextr64_d1_indexzext:
7241 ; X86-BMI1BMI2:       # %bb.0:
7242 ; X86-BMI1BMI2-NEXT:    pushl %edi
7243 ; X86-BMI1BMI2-NEXT:    pushl %esi
7244 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
7245 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
7246 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
7247 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edx, %eax
7248 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edx, %esi
7249 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
7250 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7251 ; X86-BMI1BMI2-NEXT:    je .LBB57_2
7252 ; X86-BMI1BMI2-NEXT:  # %bb.1:
7253 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
7254 ; X86-BMI1BMI2-NEXT:    xorl %esi, %esi
7255 ; X86-BMI1BMI2-NEXT:  .LBB57_2:
7256 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
7257 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
7258 ; X86-BMI1BMI2-NEXT:    shldl %cl, %eax, %esi
7259 ; X86-BMI1BMI2-NEXT:    shlxl %ecx, %eax, %edi
7260 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7261 ; X86-BMI1BMI2-NEXT:    je .LBB57_4
7262 ; X86-BMI1BMI2-NEXT:  # %bb.3:
7263 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
7264 ; X86-BMI1BMI2-NEXT:    movl $0, %edi
7265 ; X86-BMI1BMI2-NEXT:  .LBB57_4:
7266 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %eax
7267 ; X86-BMI1BMI2-NEXT:    jne .LBB57_6
7268 ; X86-BMI1BMI2-NEXT:  # %bb.5:
7269 ; X86-BMI1BMI2-NEXT:    movl %eax, %edx
7270 ; X86-BMI1BMI2-NEXT:  .LBB57_6:
7271 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edi
7272 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7273 ; X86-BMI1BMI2-NEXT:    jne .LBB57_8
7274 ; X86-BMI1BMI2-NEXT:  # %bb.7:
7275 ; X86-BMI1BMI2-NEXT:    movl %edi, %eax
7276 ; X86-BMI1BMI2-NEXT:  .LBB57_8:
7277 ; X86-BMI1BMI2-NEXT:    popl %esi
7278 ; X86-BMI1BMI2-NEXT:    popl %edi
7279 ; X86-BMI1BMI2-NEXT:    retl
7281 ; X64-NOBMI-LABEL: bextr64_d1_indexzext:
7282 ; X64-NOBMI:       # %bb.0:
7283 ; X64-NOBMI-NEXT:    movl %esi, %ecx
7284 ; X64-NOBMI-NEXT:    movq %rdi, %rax
7285 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
7286 ; X64-NOBMI-NEXT:    shrq %cl, %rax
7287 ; X64-NOBMI-NEXT:    negb %dl
7288 ; X64-NOBMI-NEXT:    movl %edx, %ecx
7289 ; X64-NOBMI-NEXT:    shlq %cl, %rax
7290 ; X64-NOBMI-NEXT:    shrq %cl, %rax
7291 ; X64-NOBMI-NEXT:    retq
7293 ; X64-BMI1NOTBM-LABEL: bextr64_d1_indexzext:
7294 ; X64-BMI1NOTBM:       # %bb.0:
7295 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
7296 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
7297 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
7298 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
7299 ; X64-BMI1NOTBM-NEXT:    retq
7301 ; X64-BMI1BMI2-LABEL: bextr64_d1_indexzext:
7302 ; X64-BMI1BMI2:       # %bb.0:
7303 ; X64-BMI1BMI2-NEXT:    # kill: def $edx killed $edx def $rdx
7304 ; X64-BMI1BMI2-NEXT:    # kill: def $esi killed $esi def $rsi
7305 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
7306 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
7307 ; X64-BMI1BMI2-NEXT:    retq
7308   %skip = zext i8 %numskipbits to i64
7309   %shifted = lshr i64 %val, %skip
7310   %numhighbits = sub i8 64, %numlowbits
7311   %sh_prom = zext i8 %numhighbits to i64
7312   %highbitscleared = shl i64 %shifted, %sh_prom
7313   %masked = lshr i64 %highbitscleared, %sh_prom
7314   ret i64 %masked
7317 define i64 @bextr64_d2_load(i64* %w, i64 %numskipbits, i64 %numlowbits) nounwind {
7318 ; X86-NOBMI-LABEL: bextr64_d2_load:
7319 ; X86-NOBMI:       # %bb.0:
7320 ; X86-NOBMI-NEXT:    pushl %ebx
7321 ; X86-NOBMI-NEXT:    pushl %edi
7322 ; X86-NOBMI-NEXT:    pushl %esi
7323 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
7324 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
7325 ; X86-NOBMI-NEXT:    movl (%eax), %edi
7326 ; X86-NOBMI-NEXT:    movl 4(%eax), %edx
7327 ; X86-NOBMI-NEXT:    movl %edx, %eax
7328 ; X86-NOBMI-NEXT:    shrl %cl, %eax
7329 ; X86-NOBMI-NEXT:    shrdl %cl, %edx, %edi
7330 ; X86-NOBMI-NEXT:    xorl %esi, %esi
7331 ; X86-NOBMI-NEXT:    testb $32, %cl
7332 ; X86-NOBMI-NEXT:    je .LBB58_2
7333 ; X86-NOBMI-NEXT:  # %bb.1:
7334 ; X86-NOBMI-NEXT:    movl %eax, %edi
7335 ; X86-NOBMI-NEXT:    xorl %eax, %eax
7336 ; X86-NOBMI-NEXT:  .LBB58_2:
7337 ; X86-NOBMI-NEXT:    movb $64, %cl
7338 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
7339 ; X86-NOBMI-NEXT:    shldl %cl, %edi, %eax
7340 ; X86-NOBMI-NEXT:    shll %cl, %edi
7341 ; X86-NOBMI-NEXT:    testb $32, %cl
7342 ; X86-NOBMI-NEXT:    movl %edi, %ebx
7343 ; X86-NOBMI-NEXT:    jne .LBB58_4
7344 ; X86-NOBMI-NEXT:  # %bb.3:
7345 ; X86-NOBMI-NEXT:    movl %eax, %ebx
7346 ; X86-NOBMI-NEXT:  .LBB58_4:
7347 ; X86-NOBMI-NEXT:    movl %ebx, %eax
7348 ; X86-NOBMI-NEXT:    shrl %cl, %eax
7349 ; X86-NOBMI-NEXT:    testb $32, %cl
7350 ; X86-NOBMI-NEXT:    movl $0, %edx
7351 ; X86-NOBMI-NEXT:    jne .LBB58_6
7352 ; X86-NOBMI-NEXT:  # %bb.5:
7353 ; X86-NOBMI-NEXT:    movl %edi, %esi
7354 ; X86-NOBMI-NEXT:    movl %eax, %edx
7355 ; X86-NOBMI-NEXT:  .LBB58_6:
7356 ; X86-NOBMI-NEXT:    shrdl %cl, %ebx, %esi
7357 ; X86-NOBMI-NEXT:    testb $32, %cl
7358 ; X86-NOBMI-NEXT:    jne .LBB58_8
7359 ; X86-NOBMI-NEXT:  # %bb.7:
7360 ; X86-NOBMI-NEXT:    movl %esi, %eax
7361 ; X86-NOBMI-NEXT:  .LBB58_8:
7362 ; X86-NOBMI-NEXT:    popl %esi
7363 ; X86-NOBMI-NEXT:    popl %edi
7364 ; X86-NOBMI-NEXT:    popl %ebx
7365 ; X86-NOBMI-NEXT:    retl
7367 ; X86-BMI1NOTBM-LABEL: bextr64_d2_load:
7368 ; X86-BMI1NOTBM:       # %bb.0:
7369 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
7370 ; X86-BMI1NOTBM-NEXT:    pushl %edi
7371 ; X86-BMI1NOTBM-NEXT:    pushl %esi
7372 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
7373 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
7374 ; X86-BMI1NOTBM-NEXT:    movl (%eax), %edi
7375 ; X86-BMI1NOTBM-NEXT:    movl 4(%eax), %edx
7376 ; X86-BMI1NOTBM-NEXT:    movl %edx, %eax
7377 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %eax
7378 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edx, %edi
7379 ; X86-BMI1NOTBM-NEXT:    xorl %esi, %esi
7380 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7381 ; X86-BMI1NOTBM-NEXT:    je .LBB58_2
7382 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
7383 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
7384 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
7385 ; X86-BMI1NOTBM-NEXT:  .LBB58_2:
7386 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
7387 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
7388 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %edi, %eax
7389 ; X86-BMI1NOTBM-NEXT:    shll %cl, %edi
7390 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7391 ; X86-BMI1NOTBM-NEXT:    movl %edi, %ebx
7392 ; X86-BMI1NOTBM-NEXT:    jne .LBB58_4
7393 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
7394 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ebx
7395 ; X86-BMI1NOTBM-NEXT:  .LBB58_4:
7396 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %eax
7397 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %eax
7398 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7399 ; X86-BMI1NOTBM-NEXT:    movl $0, %edx
7400 ; X86-BMI1NOTBM-NEXT:    jne .LBB58_6
7401 ; X86-BMI1NOTBM-NEXT:  # %bb.5:
7402 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
7403 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edx
7404 ; X86-BMI1NOTBM-NEXT:  .LBB58_6:
7405 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %ebx, %esi
7406 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7407 ; X86-BMI1NOTBM-NEXT:    jne .LBB58_8
7408 ; X86-BMI1NOTBM-NEXT:  # %bb.7:
7409 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
7410 ; X86-BMI1NOTBM-NEXT:  .LBB58_8:
7411 ; X86-BMI1NOTBM-NEXT:    popl %esi
7412 ; X86-BMI1NOTBM-NEXT:    popl %edi
7413 ; X86-BMI1NOTBM-NEXT:    popl %ebx
7414 ; X86-BMI1NOTBM-NEXT:    retl
7416 ; X86-BMI1BMI2-LABEL: bextr64_d2_load:
7417 ; X86-BMI1BMI2:       # %bb.0:
7418 ; X86-BMI1BMI2-NEXT:    pushl %edi
7419 ; X86-BMI1BMI2-NEXT:    pushl %esi
7420 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
7421 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
7422 ; X86-BMI1BMI2-NEXT:    movl (%edx), %eax
7423 ; X86-BMI1BMI2-NEXT:    movl 4(%edx), %edx
7424 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edx, %esi
7425 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edx, %eax
7426 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
7427 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7428 ; X86-BMI1BMI2-NEXT:    je .LBB58_2
7429 ; X86-BMI1BMI2-NEXT:  # %bb.1:
7430 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
7431 ; X86-BMI1BMI2-NEXT:    xorl %esi, %esi
7432 ; X86-BMI1BMI2-NEXT:  .LBB58_2:
7433 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
7434 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
7435 ; X86-BMI1BMI2-NEXT:    shldl %cl, %eax, %esi
7436 ; X86-BMI1BMI2-NEXT:    shlxl %ecx, %eax, %edi
7437 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7438 ; X86-BMI1BMI2-NEXT:    je .LBB58_4
7439 ; X86-BMI1BMI2-NEXT:  # %bb.3:
7440 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
7441 ; X86-BMI1BMI2-NEXT:    movl $0, %edi
7442 ; X86-BMI1BMI2-NEXT:  .LBB58_4:
7443 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %eax
7444 ; X86-BMI1BMI2-NEXT:    jne .LBB58_6
7445 ; X86-BMI1BMI2-NEXT:  # %bb.5:
7446 ; X86-BMI1BMI2-NEXT:    movl %eax, %edx
7447 ; X86-BMI1BMI2-NEXT:  .LBB58_6:
7448 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edi
7449 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7450 ; X86-BMI1BMI2-NEXT:    jne .LBB58_8
7451 ; X86-BMI1BMI2-NEXT:  # %bb.7:
7452 ; X86-BMI1BMI2-NEXT:    movl %edi, %eax
7453 ; X86-BMI1BMI2-NEXT:  .LBB58_8:
7454 ; X86-BMI1BMI2-NEXT:    popl %esi
7455 ; X86-BMI1BMI2-NEXT:    popl %edi
7456 ; X86-BMI1BMI2-NEXT:    retl
7458 ; X64-NOBMI-LABEL: bextr64_d2_load:
7459 ; X64-NOBMI:       # %bb.0:
7460 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
7461 ; X64-NOBMI-NEXT:    movq (%rdi), %rax
7462 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
7463 ; X64-NOBMI-NEXT:    shrq %cl, %rax
7464 ; X64-NOBMI-NEXT:    negb %dl
7465 ; X64-NOBMI-NEXT:    movl %edx, %ecx
7466 ; X64-NOBMI-NEXT:    shlq %cl, %rax
7467 ; X64-NOBMI-NEXT:    shrq %cl, %rax
7468 ; X64-NOBMI-NEXT:    retq
7470 ; X64-BMI1NOTBM-LABEL: bextr64_d2_load:
7471 ; X64-BMI1NOTBM:       # %bb.0:
7472 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
7473 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
7474 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
7475 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, (%rdi), %rax
7476 ; X64-BMI1NOTBM-NEXT:    retq
7478 ; X64-BMI1BMI2-LABEL: bextr64_d2_load:
7479 ; X64-BMI1BMI2:       # %bb.0:
7480 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, (%rdi), %rax
7481 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
7482 ; X64-BMI1BMI2-NEXT:    retq
7483   %val = load i64, i64* %w
7484   %shifted = lshr i64 %val, %numskipbits
7485   %numhighbits = sub i64 64, %numlowbits
7486   %highbitscleared = shl i64 %shifted, %numhighbits
7487   %masked = lshr i64 %highbitscleared, %numhighbits
7488   ret i64 %masked
7491 define i64 @bextr64_d3_load_indexzext(i64* %w, i8 %numskipbits, i8 %numlowbits) nounwind {
7492 ; X86-NOBMI-LABEL: bextr64_d3_load_indexzext:
7493 ; X86-NOBMI:       # %bb.0:
7494 ; X86-NOBMI-NEXT:    pushl %ebx
7495 ; X86-NOBMI-NEXT:    pushl %edi
7496 ; X86-NOBMI-NEXT:    pushl %esi
7497 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
7498 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
7499 ; X86-NOBMI-NEXT:    movl (%eax), %edi
7500 ; X86-NOBMI-NEXT:    movl 4(%eax), %edx
7501 ; X86-NOBMI-NEXT:    movl %edx, %eax
7502 ; X86-NOBMI-NEXT:    shrl %cl, %eax
7503 ; X86-NOBMI-NEXT:    shrdl %cl, %edx, %edi
7504 ; X86-NOBMI-NEXT:    xorl %esi, %esi
7505 ; X86-NOBMI-NEXT:    testb $32, %cl
7506 ; X86-NOBMI-NEXT:    je .LBB59_2
7507 ; X86-NOBMI-NEXT:  # %bb.1:
7508 ; X86-NOBMI-NEXT:    movl %eax, %edi
7509 ; X86-NOBMI-NEXT:    xorl %eax, %eax
7510 ; X86-NOBMI-NEXT:  .LBB59_2:
7511 ; X86-NOBMI-NEXT:    movb $64, %cl
7512 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
7513 ; X86-NOBMI-NEXT:    shldl %cl, %edi, %eax
7514 ; X86-NOBMI-NEXT:    shll %cl, %edi
7515 ; X86-NOBMI-NEXT:    testb $32, %cl
7516 ; X86-NOBMI-NEXT:    movl %edi, %ebx
7517 ; X86-NOBMI-NEXT:    jne .LBB59_4
7518 ; X86-NOBMI-NEXT:  # %bb.3:
7519 ; X86-NOBMI-NEXT:    movl %eax, %ebx
7520 ; X86-NOBMI-NEXT:  .LBB59_4:
7521 ; X86-NOBMI-NEXT:    movl %ebx, %eax
7522 ; X86-NOBMI-NEXT:    shrl %cl, %eax
7523 ; X86-NOBMI-NEXT:    testb $32, %cl
7524 ; X86-NOBMI-NEXT:    movl $0, %edx
7525 ; X86-NOBMI-NEXT:    jne .LBB59_6
7526 ; X86-NOBMI-NEXT:  # %bb.5:
7527 ; X86-NOBMI-NEXT:    movl %edi, %esi
7528 ; X86-NOBMI-NEXT:    movl %eax, %edx
7529 ; X86-NOBMI-NEXT:  .LBB59_6:
7530 ; X86-NOBMI-NEXT:    shrdl %cl, %ebx, %esi
7531 ; X86-NOBMI-NEXT:    testb $32, %cl
7532 ; X86-NOBMI-NEXT:    jne .LBB59_8
7533 ; X86-NOBMI-NEXT:  # %bb.7:
7534 ; X86-NOBMI-NEXT:    movl %esi, %eax
7535 ; X86-NOBMI-NEXT:  .LBB59_8:
7536 ; X86-NOBMI-NEXT:    popl %esi
7537 ; X86-NOBMI-NEXT:    popl %edi
7538 ; X86-NOBMI-NEXT:    popl %ebx
7539 ; X86-NOBMI-NEXT:    retl
7541 ; X86-BMI1NOTBM-LABEL: bextr64_d3_load_indexzext:
7542 ; X86-BMI1NOTBM:       # %bb.0:
7543 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
7544 ; X86-BMI1NOTBM-NEXT:    pushl %edi
7545 ; X86-BMI1NOTBM-NEXT:    pushl %esi
7546 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
7547 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
7548 ; X86-BMI1NOTBM-NEXT:    movl (%eax), %edi
7549 ; X86-BMI1NOTBM-NEXT:    movl 4(%eax), %edx
7550 ; X86-BMI1NOTBM-NEXT:    movl %edx, %eax
7551 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %eax
7552 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edx, %edi
7553 ; X86-BMI1NOTBM-NEXT:    xorl %esi, %esi
7554 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7555 ; X86-BMI1NOTBM-NEXT:    je .LBB59_2
7556 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
7557 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edi
7558 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
7559 ; X86-BMI1NOTBM-NEXT:  .LBB59_2:
7560 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
7561 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
7562 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %edi, %eax
7563 ; X86-BMI1NOTBM-NEXT:    shll %cl, %edi
7564 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7565 ; X86-BMI1NOTBM-NEXT:    movl %edi, %ebx
7566 ; X86-BMI1NOTBM-NEXT:    jne .LBB59_4
7567 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
7568 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ebx
7569 ; X86-BMI1NOTBM-NEXT:  .LBB59_4:
7570 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %eax
7571 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %eax
7572 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7573 ; X86-BMI1NOTBM-NEXT:    movl $0, %edx
7574 ; X86-BMI1NOTBM-NEXT:    jne .LBB59_6
7575 ; X86-BMI1NOTBM-NEXT:  # %bb.5:
7576 ; X86-BMI1NOTBM-NEXT:    movl %edi, %esi
7577 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edx
7578 ; X86-BMI1NOTBM-NEXT:  .LBB59_6:
7579 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %ebx, %esi
7580 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7581 ; X86-BMI1NOTBM-NEXT:    jne .LBB59_8
7582 ; X86-BMI1NOTBM-NEXT:  # %bb.7:
7583 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
7584 ; X86-BMI1NOTBM-NEXT:  .LBB59_8:
7585 ; X86-BMI1NOTBM-NEXT:    popl %esi
7586 ; X86-BMI1NOTBM-NEXT:    popl %edi
7587 ; X86-BMI1NOTBM-NEXT:    popl %ebx
7588 ; X86-BMI1NOTBM-NEXT:    retl
7590 ; X86-BMI1BMI2-LABEL: bextr64_d3_load_indexzext:
7591 ; X86-BMI1BMI2:       # %bb.0:
7592 ; X86-BMI1BMI2-NEXT:    pushl %edi
7593 ; X86-BMI1BMI2-NEXT:    pushl %esi
7594 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
7595 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
7596 ; X86-BMI1BMI2-NEXT:    movl (%edx), %eax
7597 ; X86-BMI1BMI2-NEXT:    movl 4(%edx), %edx
7598 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edx, %esi
7599 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edx, %eax
7600 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
7601 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7602 ; X86-BMI1BMI2-NEXT:    je .LBB59_2
7603 ; X86-BMI1BMI2-NEXT:  # %bb.1:
7604 ; X86-BMI1BMI2-NEXT:    movl %esi, %eax
7605 ; X86-BMI1BMI2-NEXT:    xorl %esi, %esi
7606 ; X86-BMI1BMI2-NEXT:  .LBB59_2:
7607 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
7608 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
7609 ; X86-BMI1BMI2-NEXT:    shldl %cl, %eax, %esi
7610 ; X86-BMI1BMI2-NEXT:    shlxl %ecx, %eax, %edi
7611 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7612 ; X86-BMI1BMI2-NEXT:    je .LBB59_4
7613 ; X86-BMI1BMI2-NEXT:  # %bb.3:
7614 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
7615 ; X86-BMI1BMI2-NEXT:    movl $0, %edi
7616 ; X86-BMI1BMI2-NEXT:  .LBB59_4:
7617 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %eax
7618 ; X86-BMI1BMI2-NEXT:    jne .LBB59_6
7619 ; X86-BMI1BMI2-NEXT:  # %bb.5:
7620 ; X86-BMI1BMI2-NEXT:    movl %eax, %edx
7621 ; X86-BMI1BMI2-NEXT:  .LBB59_6:
7622 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edi
7623 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7624 ; X86-BMI1BMI2-NEXT:    jne .LBB59_8
7625 ; X86-BMI1BMI2-NEXT:  # %bb.7:
7626 ; X86-BMI1BMI2-NEXT:    movl %edi, %eax
7627 ; X86-BMI1BMI2-NEXT:  .LBB59_8:
7628 ; X86-BMI1BMI2-NEXT:    popl %esi
7629 ; X86-BMI1BMI2-NEXT:    popl %edi
7630 ; X86-BMI1BMI2-NEXT:    retl
7632 ; X64-NOBMI-LABEL: bextr64_d3_load_indexzext:
7633 ; X64-NOBMI:       # %bb.0:
7634 ; X64-NOBMI-NEXT:    movl %esi, %ecx
7635 ; X64-NOBMI-NEXT:    movq (%rdi), %rax
7636 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
7637 ; X64-NOBMI-NEXT:    shrq %cl, %rax
7638 ; X64-NOBMI-NEXT:    negb %dl
7639 ; X64-NOBMI-NEXT:    movl %edx, %ecx
7640 ; X64-NOBMI-NEXT:    shlq %cl, %rax
7641 ; X64-NOBMI-NEXT:    shrq %cl, %rax
7642 ; X64-NOBMI-NEXT:    retq
7644 ; X64-BMI1NOTBM-LABEL: bextr64_d3_load_indexzext:
7645 ; X64-BMI1NOTBM:       # %bb.0:
7646 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
7647 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
7648 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
7649 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, (%rdi), %rax
7650 ; X64-BMI1NOTBM-NEXT:    retq
7652 ; X64-BMI1BMI2-LABEL: bextr64_d3_load_indexzext:
7653 ; X64-BMI1BMI2:       # %bb.0:
7654 ; X64-BMI1BMI2-NEXT:    # kill: def $edx killed $edx def $rdx
7655 ; X64-BMI1BMI2-NEXT:    # kill: def $esi killed $esi def $rsi
7656 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, (%rdi), %rax
7657 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
7658 ; X64-BMI1BMI2-NEXT:    retq
7659   %val = load i64, i64* %w
7660   %skip = zext i8 %numskipbits to i64
7661   %shifted = lshr i64 %val, %skip
7662   %numhighbits = sub i8 64, %numlowbits
7663   %sh_prom = zext i8 %numhighbits to i64
7664   %highbitscleared = shl i64 %shifted, %sh_prom
7665   %masked = lshr i64 %highbitscleared, %sh_prom
7666   ret i64 %masked
7669 define i64 @bextr64_d5_skipextrauses(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
7670 ; X86-NOBMI-LABEL: bextr64_d5_skipextrauses:
7671 ; X86-NOBMI:       # %bb.0:
7672 ; X86-NOBMI-NEXT:    pushl %ebp
7673 ; X86-NOBMI-NEXT:    pushl %ebx
7674 ; X86-NOBMI-NEXT:    pushl %edi
7675 ; X86-NOBMI-NEXT:    pushl %esi
7676 ; X86-NOBMI-NEXT:    subl $12, %esp
7677 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ebx
7678 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx
7679 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
7680 ; X86-NOBMI-NEXT:    movl %edx, %esi
7681 ; X86-NOBMI-NEXT:    movl %eax, %ecx
7682 ; X86-NOBMI-NEXT:    shrl %cl, %esi
7683 ; X86-NOBMI-NEXT:    shrdl %cl, %edx, %ebx
7684 ; X86-NOBMI-NEXT:    xorl %edx, %edx
7685 ; X86-NOBMI-NEXT:    testb $32, %al
7686 ; X86-NOBMI-NEXT:    je .LBB60_2
7687 ; X86-NOBMI-NEXT:  # %bb.1:
7688 ; X86-NOBMI-NEXT:    movl %esi, %ebx
7689 ; X86-NOBMI-NEXT:    xorl %esi, %esi
7690 ; X86-NOBMI-NEXT:  .LBB60_2:
7691 ; X86-NOBMI-NEXT:    movb $64, %cl
7692 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
7693 ; X86-NOBMI-NEXT:    shldl %cl, %ebx, %esi
7694 ; X86-NOBMI-NEXT:    shll %cl, %ebx
7695 ; X86-NOBMI-NEXT:    testb $32, %cl
7696 ; X86-NOBMI-NEXT:    movl %ebx, %ebp
7697 ; X86-NOBMI-NEXT:    jne .LBB60_4
7698 ; X86-NOBMI-NEXT:  # %bb.3:
7699 ; X86-NOBMI-NEXT:    movl %esi, %ebp
7700 ; X86-NOBMI-NEXT:  .LBB60_4:
7701 ; X86-NOBMI-NEXT:    movl %ebp, %esi
7702 ; X86-NOBMI-NEXT:    shrl %cl, %esi
7703 ; X86-NOBMI-NEXT:    testb $32, %cl
7704 ; X86-NOBMI-NEXT:    movl $0, %edi
7705 ; X86-NOBMI-NEXT:    jne .LBB60_6
7706 ; X86-NOBMI-NEXT:  # %bb.5:
7707 ; X86-NOBMI-NEXT:    movl %ebx, %edx
7708 ; X86-NOBMI-NEXT:    movl %esi, %edi
7709 ; X86-NOBMI-NEXT:  .LBB60_6:
7710 ; X86-NOBMI-NEXT:    shrdl %cl, %ebp, %edx
7711 ; X86-NOBMI-NEXT:    testb $32, %cl
7712 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx
7713 ; X86-NOBMI-NEXT:    jne .LBB60_8
7714 ; X86-NOBMI-NEXT:  # %bb.7:
7715 ; X86-NOBMI-NEXT:    movl %edx, %esi
7716 ; X86-NOBMI-NEXT:  .LBB60_8:
7717 ; X86-NOBMI-NEXT:    subl $8, %esp
7718 ; X86-NOBMI-NEXT:    pushl %ecx
7719 ; X86-NOBMI-NEXT:    pushl %eax
7720 ; X86-NOBMI-NEXT:    calll use64
7721 ; X86-NOBMI-NEXT:    addl $16, %esp
7722 ; X86-NOBMI-NEXT:    movl %esi, %eax
7723 ; X86-NOBMI-NEXT:    movl %edi, %edx
7724 ; X86-NOBMI-NEXT:    addl $12, %esp
7725 ; X86-NOBMI-NEXT:    popl %esi
7726 ; X86-NOBMI-NEXT:    popl %edi
7727 ; X86-NOBMI-NEXT:    popl %ebx
7728 ; X86-NOBMI-NEXT:    popl %ebp
7729 ; X86-NOBMI-NEXT:    retl
7731 ; X86-BMI1NOTBM-LABEL: bextr64_d5_skipextrauses:
7732 ; X86-BMI1NOTBM:       # %bb.0:
7733 ; X86-BMI1NOTBM-NEXT:    pushl %ebp
7734 ; X86-BMI1NOTBM-NEXT:    pushl %ebx
7735 ; X86-BMI1NOTBM-NEXT:    pushl %edi
7736 ; X86-BMI1NOTBM-NEXT:    pushl %esi
7737 ; X86-BMI1NOTBM-NEXT:    subl $12, %esp
7738 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %ebx
7739 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edx
7740 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
7741 ; X86-BMI1NOTBM-NEXT:    movl %edx, %esi
7742 ; X86-BMI1NOTBM-NEXT:    movl %eax, %ecx
7743 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %esi
7744 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edx, %ebx
7745 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
7746 ; X86-BMI1NOTBM-NEXT:    testb $32, %al
7747 ; X86-BMI1NOTBM-NEXT:    je .LBB60_2
7748 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
7749 ; X86-BMI1NOTBM-NEXT:    movl %esi, %ebx
7750 ; X86-BMI1NOTBM-NEXT:    xorl %esi, %esi
7751 ; X86-BMI1NOTBM-NEXT:  .LBB60_2:
7752 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
7753 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
7754 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %ebx, %esi
7755 ; X86-BMI1NOTBM-NEXT:    shll %cl, %ebx
7756 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7757 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %ebp
7758 ; X86-BMI1NOTBM-NEXT:    jne .LBB60_4
7759 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
7760 ; X86-BMI1NOTBM-NEXT:    movl %esi, %ebp
7761 ; X86-BMI1NOTBM-NEXT:  .LBB60_4:
7762 ; X86-BMI1NOTBM-NEXT:    movl %ebp, %esi
7763 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %esi
7764 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7765 ; X86-BMI1NOTBM-NEXT:    movl $0, %edi
7766 ; X86-BMI1NOTBM-NEXT:    jne .LBB60_6
7767 ; X86-BMI1NOTBM-NEXT:  # %bb.5:
7768 ; X86-BMI1NOTBM-NEXT:    movl %ebx, %edx
7769 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edi
7770 ; X86-BMI1NOTBM-NEXT:  .LBB60_6:
7771 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %ebp, %edx
7772 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7773 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %ecx
7774 ; X86-BMI1NOTBM-NEXT:    jne .LBB60_8
7775 ; X86-BMI1NOTBM-NEXT:  # %bb.7:
7776 ; X86-BMI1NOTBM-NEXT:    movl %edx, %esi
7777 ; X86-BMI1NOTBM-NEXT:  .LBB60_8:
7778 ; X86-BMI1NOTBM-NEXT:    subl $8, %esp
7779 ; X86-BMI1NOTBM-NEXT:    pushl %ecx
7780 ; X86-BMI1NOTBM-NEXT:    pushl %eax
7781 ; X86-BMI1NOTBM-NEXT:    calll use64
7782 ; X86-BMI1NOTBM-NEXT:    addl $16, %esp
7783 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
7784 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
7785 ; X86-BMI1NOTBM-NEXT:    addl $12, %esp
7786 ; X86-BMI1NOTBM-NEXT:    popl %esi
7787 ; X86-BMI1NOTBM-NEXT:    popl %edi
7788 ; X86-BMI1NOTBM-NEXT:    popl %ebx
7789 ; X86-BMI1NOTBM-NEXT:    popl %ebp
7790 ; X86-BMI1NOTBM-NEXT:    retl
7792 ; X86-BMI1BMI2-LABEL: bextr64_d5_skipextrauses:
7793 ; X86-BMI1BMI2:       # %bb.0:
7794 ; X86-BMI1BMI2-NEXT:    pushl %ebx
7795 ; X86-BMI1BMI2-NEXT:    pushl %edi
7796 ; X86-BMI1BMI2-NEXT:    pushl %esi
7797 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edi
7798 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
7799 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
7800 ; X86-BMI1BMI2-NEXT:    movl %eax, %ecx
7801 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edx, %edi
7802 ; X86-BMI1BMI2-NEXT:    shrxl %eax, %edx, %edx
7803 ; X86-BMI1BMI2-NEXT:    xorl %esi, %esi
7804 ; X86-BMI1BMI2-NEXT:    testb $32, %al
7805 ; X86-BMI1BMI2-NEXT:    je .LBB60_2
7806 ; X86-BMI1BMI2-NEXT:  # %bb.1:
7807 ; X86-BMI1BMI2-NEXT:    movl %edx, %edi
7808 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
7809 ; X86-BMI1BMI2-NEXT:  .LBB60_2:
7810 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
7811 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
7812 ; X86-BMI1BMI2-NEXT:    shldl %cl, %edi, %edx
7813 ; X86-BMI1BMI2-NEXT:    shlxl %ecx, %edi, %ebx
7814 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7815 ; X86-BMI1BMI2-NEXT:    je .LBB60_4
7816 ; X86-BMI1BMI2-NEXT:  # %bb.3:
7817 ; X86-BMI1BMI2-NEXT:    movl %ebx, %edx
7818 ; X86-BMI1BMI2-NEXT:    movl $0, %ebx
7819 ; X86-BMI1BMI2-NEXT:  .LBB60_4:
7820 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edx, %edi
7821 ; X86-BMI1BMI2-NEXT:    jne .LBB60_6
7822 ; X86-BMI1BMI2-NEXT:  # %bb.5:
7823 ; X86-BMI1BMI2-NEXT:    movl %edi, %esi
7824 ; X86-BMI1BMI2-NEXT:  .LBB60_6:
7825 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edx, %ebx
7826 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7827 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
7828 ; X86-BMI1BMI2-NEXT:    jne .LBB60_8
7829 ; X86-BMI1BMI2-NEXT:  # %bb.7:
7830 ; X86-BMI1BMI2-NEXT:    movl %ebx, %edi
7831 ; X86-BMI1BMI2-NEXT:  .LBB60_8:
7832 ; X86-BMI1BMI2-NEXT:    subl $8, %esp
7833 ; X86-BMI1BMI2-NEXT:    pushl %ecx
7834 ; X86-BMI1BMI2-NEXT:    pushl %eax
7835 ; X86-BMI1BMI2-NEXT:    calll use64
7836 ; X86-BMI1BMI2-NEXT:    addl $16, %esp
7837 ; X86-BMI1BMI2-NEXT:    movl %edi, %eax
7838 ; X86-BMI1BMI2-NEXT:    movl %esi, %edx
7839 ; X86-BMI1BMI2-NEXT:    popl %esi
7840 ; X86-BMI1BMI2-NEXT:    popl %edi
7841 ; X86-BMI1BMI2-NEXT:    popl %ebx
7842 ; X86-BMI1BMI2-NEXT:    retl
7844 ; X64-NOBMI-LABEL: bextr64_d5_skipextrauses:
7845 ; X64-NOBMI:       # %bb.0:
7846 ; X64-NOBMI-NEXT:    pushq %rbx
7847 ; X64-NOBMI-NEXT:    movq %rdi, %rbx
7848 ; X64-NOBMI-NEXT:    movl %esi, %ecx
7849 ; X64-NOBMI-NEXT:    shrq %cl, %rbx
7850 ; X64-NOBMI-NEXT:    negb %dl
7851 ; X64-NOBMI-NEXT:    movl %edx, %ecx
7852 ; X64-NOBMI-NEXT:    shlq %cl, %rbx
7853 ; X64-NOBMI-NEXT:    shrq %cl, %rbx
7854 ; X64-NOBMI-NEXT:    movq %rsi, %rdi
7855 ; X64-NOBMI-NEXT:    callq use64
7856 ; X64-NOBMI-NEXT:    movq %rbx, %rax
7857 ; X64-NOBMI-NEXT:    popq %rbx
7858 ; X64-NOBMI-NEXT:    retq
7860 ; X64-BMI1NOTBM-LABEL: bextr64_d5_skipextrauses:
7861 ; X64-BMI1NOTBM:       # %bb.0:
7862 ; X64-BMI1NOTBM-NEXT:    pushq %rbx
7863 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
7864 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
7865 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
7866 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rbx
7867 ; X64-BMI1NOTBM-NEXT:    movq %rsi, %rdi
7868 ; X64-BMI1NOTBM-NEXT:    callq use64
7869 ; X64-BMI1NOTBM-NEXT:    movq %rbx, %rax
7870 ; X64-BMI1NOTBM-NEXT:    popq %rbx
7871 ; X64-BMI1NOTBM-NEXT:    retq
7873 ; X64-BMI1BMI2-LABEL: bextr64_d5_skipextrauses:
7874 ; X64-BMI1BMI2:       # %bb.0:
7875 ; X64-BMI1BMI2-NEXT:    pushq %rbx
7876 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
7877 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rbx
7878 ; X64-BMI1BMI2-NEXT:    movq %rsi, %rdi
7879 ; X64-BMI1BMI2-NEXT:    callq use64
7880 ; X64-BMI1BMI2-NEXT:    movq %rbx, %rax
7881 ; X64-BMI1BMI2-NEXT:    popq %rbx
7882 ; X64-BMI1BMI2-NEXT:    retq
7883   %shifted = lshr i64 %val, %numskipbits
7884   %numhighbits = sub i64 64, %numlowbits
7885   %highbitscleared = shl i64 %shifted, %numhighbits
7886   %masked = lshr i64 %highbitscleared, %numhighbits
7887   call void @use64(i64 %numskipbits)
7888   ret i64 %masked
7891 ; 64-bit, but with 32-bit output
7893 ; Everything done in 64-bit, truncation happens last.
7894 define i32 @bextr64_32_d0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
7895 ; X86-NOBMI-LABEL: bextr64_32_d0:
7896 ; X86-NOBMI:       # %bb.0:
7897 ; X86-NOBMI-NEXT:    pushl %esi
7898 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
7899 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx
7900 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
7901 ; X86-NOBMI-NEXT:    movl %esi, %eax
7902 ; X86-NOBMI-NEXT:    shrl %cl, %eax
7903 ; X86-NOBMI-NEXT:    shrdl %cl, %esi, %edx
7904 ; X86-NOBMI-NEXT:    testb $32, %cl
7905 ; X86-NOBMI-NEXT:    je .LBB61_2
7906 ; X86-NOBMI-NEXT:  # %bb.1:
7907 ; X86-NOBMI-NEXT:    movl %eax, %edx
7908 ; X86-NOBMI-NEXT:    xorl %eax, %eax
7909 ; X86-NOBMI-NEXT:  .LBB61_2:
7910 ; X86-NOBMI-NEXT:    movb $64, %cl
7911 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
7912 ; X86-NOBMI-NEXT:    shldl %cl, %edx, %eax
7913 ; X86-NOBMI-NEXT:    shll %cl, %edx
7914 ; X86-NOBMI-NEXT:    testb $32, %cl
7915 ; X86-NOBMI-NEXT:    je .LBB61_4
7916 ; X86-NOBMI-NEXT:  # %bb.3:
7917 ; X86-NOBMI-NEXT:    movl %edx, %eax
7918 ; X86-NOBMI-NEXT:    xorl %edx, %edx
7919 ; X86-NOBMI-NEXT:  .LBB61_4:
7920 ; X86-NOBMI-NEXT:    shrdl %cl, %eax, %edx
7921 ; X86-NOBMI-NEXT:    shrl %cl, %eax
7922 ; X86-NOBMI-NEXT:    testb $32, %cl
7923 ; X86-NOBMI-NEXT:    jne .LBB61_6
7924 ; X86-NOBMI-NEXT:  # %bb.5:
7925 ; X86-NOBMI-NEXT:    movl %edx, %eax
7926 ; X86-NOBMI-NEXT:  .LBB61_6:
7927 ; X86-NOBMI-NEXT:    popl %esi
7928 ; X86-NOBMI-NEXT:    retl
7930 ; X86-BMI1NOTBM-LABEL: bextr64_32_d0:
7931 ; X86-BMI1NOTBM:       # %bb.0:
7932 ; X86-BMI1NOTBM-NEXT:    pushl %esi
7933 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
7934 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edx
7935 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
7936 ; X86-BMI1NOTBM-NEXT:    movl %esi, %eax
7937 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %eax
7938 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %esi, %edx
7939 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7940 ; X86-BMI1NOTBM-NEXT:    je .LBB61_2
7941 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
7942 ; X86-BMI1NOTBM-NEXT:    movl %eax, %edx
7943 ; X86-BMI1NOTBM-NEXT:    xorl %eax, %eax
7944 ; X86-BMI1NOTBM-NEXT:  .LBB61_2:
7945 ; X86-BMI1NOTBM-NEXT:    movb $64, %cl
7946 ; X86-BMI1NOTBM-NEXT:    subb {{[0-9]+}}(%esp), %cl
7947 ; X86-BMI1NOTBM-NEXT:    shldl %cl, %edx, %eax
7948 ; X86-BMI1NOTBM-NEXT:    shll %cl, %edx
7949 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7950 ; X86-BMI1NOTBM-NEXT:    je .LBB61_4
7951 ; X86-BMI1NOTBM-NEXT:  # %bb.3:
7952 ; X86-BMI1NOTBM-NEXT:    movl %edx, %eax
7953 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
7954 ; X86-BMI1NOTBM-NEXT:  .LBB61_4:
7955 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %eax, %edx
7956 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %eax
7957 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
7958 ; X86-BMI1NOTBM-NEXT:    jne .LBB61_6
7959 ; X86-BMI1NOTBM-NEXT:  # %bb.5:
7960 ; X86-BMI1NOTBM-NEXT:    movl %edx, %eax
7961 ; X86-BMI1NOTBM-NEXT:  .LBB61_6:
7962 ; X86-BMI1NOTBM-NEXT:    popl %esi
7963 ; X86-BMI1NOTBM-NEXT:    retl
7965 ; X86-BMI1BMI2-LABEL: bextr64_32_d0:
7966 ; X86-BMI1BMI2:       # %bb.0:
7967 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
7968 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
7969 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
7970 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edx, %eax
7971 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edx, %edx
7972 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7973 ; X86-BMI1BMI2-NEXT:    je .LBB61_2
7974 ; X86-BMI1BMI2-NEXT:  # %bb.1:
7975 ; X86-BMI1BMI2-NEXT:    movl %edx, %eax
7976 ; X86-BMI1BMI2-NEXT:    xorl %edx, %edx
7977 ; X86-BMI1BMI2-NEXT:  .LBB61_2:
7978 ; X86-BMI1BMI2-NEXT:    movb $64, %cl
7979 ; X86-BMI1BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
7980 ; X86-BMI1BMI2-NEXT:    shldl %cl, %eax, %edx
7981 ; X86-BMI1BMI2-NEXT:    shlxl %ecx, %eax, %eax
7982 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7983 ; X86-BMI1BMI2-NEXT:    je .LBB61_4
7984 ; X86-BMI1BMI2-NEXT:  # %bb.3:
7985 ; X86-BMI1BMI2-NEXT:    movl %eax, %edx
7986 ; X86-BMI1BMI2-NEXT:    xorl %eax, %eax
7987 ; X86-BMI1BMI2-NEXT:  .LBB61_4:
7988 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %edx, %eax
7989 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
7990 ; X86-BMI1BMI2-NEXT:    je .LBB61_6
7991 ; X86-BMI1BMI2-NEXT:  # %bb.5:
7992 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %edx, %eax
7993 ; X86-BMI1BMI2-NEXT:  .LBB61_6:
7994 ; X86-BMI1BMI2-NEXT:    retl
7996 ; X64-NOBMI-LABEL: bextr64_32_d0:
7997 ; X64-NOBMI:       # %bb.0:
7998 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
7999 ; X64-NOBMI-NEXT:    movq %rdi, %rax
8000 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
8001 ; X64-NOBMI-NEXT:    shrq %cl, %rax
8002 ; X64-NOBMI-NEXT:    negb %dl
8003 ; X64-NOBMI-NEXT:    movl %edx, %ecx
8004 ; X64-NOBMI-NEXT:    shlq %cl, %rax
8005 ; X64-NOBMI-NEXT:    shrq %cl, %rax
8006 ; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax
8007 ; X64-NOBMI-NEXT:    retq
8009 ; X64-BMI1NOTBM-LABEL: bextr64_32_d0:
8010 ; X64-BMI1NOTBM:       # %bb.0:
8011 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
8012 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
8013 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
8014 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
8015 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
8016 ; X64-BMI1NOTBM-NEXT:    retq
8018 ; X64-BMI1BMI2-LABEL: bextr64_32_d0:
8019 ; X64-BMI1BMI2:       # %bb.0:
8020 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
8021 ; X64-BMI1BMI2-NEXT:    bzhiq %rdx, %rax, %rax
8022 ; X64-BMI1BMI2-NEXT:    # kill: def $eax killed $eax killed $rax
8023 ; X64-BMI1BMI2-NEXT:    retq
8024   %shifted = lshr i64 %val, %numskipbits
8025   %numhighbits = sub i64 64, %numlowbits
8026   %highbitscleared = shl i64 %shifted, %numhighbits
8027   %masked = lshr i64 %highbitscleared, %numhighbits
8028   %res = trunc i64 %masked to i32
8029   ret i32 %res
8032 ; Shifting happens in 64-bit, then truncation. Masking is 32-bit.
8033 define i32 @bextr64_32_d1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {
8034 ; X86-NOBMI-LABEL: bextr64_32_d1:
8035 ; X86-NOBMI:       # %bb.0:
8036 ; X86-NOBMI-NEXT:    pushl %esi
8037 ; X86-NOBMI-NEXT:    movb {{[0-9]+}}(%esp), %cl
8038 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %edx
8039 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %esi
8040 ; X86-NOBMI-NEXT:    movl %esi, %eax
8041 ; X86-NOBMI-NEXT:    shrl %cl, %eax
8042 ; X86-NOBMI-NEXT:    shrdl %cl, %esi, %edx
8043 ; X86-NOBMI-NEXT:    testb $32, %cl
8044 ; X86-NOBMI-NEXT:    jne .LBB62_2
8045 ; X86-NOBMI-NEXT:  # %bb.1:
8046 ; X86-NOBMI-NEXT:    movl %edx, %eax
8047 ; X86-NOBMI-NEXT:  .LBB62_2:
8048 ; X86-NOBMI-NEXT:    xorl %ecx, %ecx
8049 ; X86-NOBMI-NEXT:    subb {{[0-9]+}}(%esp), %cl
8050 ; X86-NOBMI-NEXT:    shll %cl, %eax
8051 ; X86-NOBMI-NEXT:    # kill: def $cl killed $cl killed $ecx
8052 ; X86-NOBMI-NEXT:    shrl %cl, %eax
8053 ; X86-NOBMI-NEXT:    popl %esi
8054 ; X86-NOBMI-NEXT:    retl
8056 ; X86-BMI1NOTBM-LABEL: bextr64_32_d1:
8057 ; X86-BMI1NOTBM:       # %bb.0:
8058 ; X86-BMI1NOTBM-NEXT:    pushl %edi
8059 ; X86-BMI1NOTBM-NEXT:    pushl %esi
8060 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %al
8061 ; X86-BMI1NOTBM-NEXT:    movb {{[0-9]+}}(%esp), %cl
8062 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %esi
8063 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %edi
8064 ; X86-BMI1NOTBM-NEXT:    movl %edi, %edx
8065 ; X86-BMI1NOTBM-NEXT:    shrl %cl, %edx
8066 ; X86-BMI1NOTBM-NEXT:    shrdl %cl, %edi, %esi
8067 ; X86-BMI1NOTBM-NEXT:    testb $32, %cl
8068 ; X86-BMI1NOTBM-NEXT:    jne .LBB62_2
8069 ; X86-BMI1NOTBM-NEXT:  # %bb.1:
8070 ; X86-BMI1NOTBM-NEXT:    movl %esi, %edx
8071 ; X86-BMI1NOTBM-NEXT:  .LBB62_2:
8072 ; X86-BMI1NOTBM-NEXT:    shll $8, %eax
8073 ; X86-BMI1NOTBM-NEXT:    bextrl %eax, %edx, %eax
8074 ; X86-BMI1NOTBM-NEXT:    popl %esi
8075 ; X86-BMI1NOTBM-NEXT:    popl %edi
8076 ; X86-BMI1NOTBM-NEXT:    retl
8078 ; X86-BMI1BMI2-LABEL: bextr64_32_d1:
8079 ; X86-BMI1BMI2:       # %bb.0:
8080 ; X86-BMI1BMI2-NEXT:    pushl %esi
8081 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %al
8082 ; X86-BMI1BMI2-NEXT:    movb {{[0-9]+}}(%esp), %cl
8083 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
8084 ; X86-BMI1BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
8085 ; X86-BMI1BMI2-NEXT:    shrdl %cl, %esi, %edx
8086 ; X86-BMI1BMI2-NEXT:    testb $32, %cl
8087 ; X86-BMI1BMI2-NEXT:    je .LBB62_2
8088 ; X86-BMI1BMI2-NEXT:  # %bb.1:
8089 ; X86-BMI1BMI2-NEXT:    shrxl %ecx, %esi, %edx
8090 ; X86-BMI1BMI2-NEXT:  .LBB62_2:
8091 ; X86-BMI1BMI2-NEXT:    bzhil %eax, %edx, %eax
8092 ; X86-BMI1BMI2-NEXT:    popl %esi
8093 ; X86-BMI1BMI2-NEXT:    retl
8095 ; X64-NOBMI-LABEL: bextr64_32_d1:
8096 ; X64-NOBMI:       # %bb.0:
8097 ; X64-NOBMI-NEXT:    movq %rsi, %rcx
8098 ; X64-NOBMI-NEXT:    movq %rdi, %rax
8099 ; X64-NOBMI-NEXT:    # kill: def $cl killed $cl killed $rcx
8100 ; X64-NOBMI-NEXT:    shrq %cl, %rax
8101 ; X64-NOBMI-NEXT:    negb %dl
8102 ; X64-NOBMI-NEXT:    movl %edx, %ecx
8103 ; X64-NOBMI-NEXT:    shll %cl, %eax
8104 ; X64-NOBMI-NEXT:    shrl %cl, %eax
8105 ; X64-NOBMI-NEXT:    # kill: def $eax killed $eax killed $rax
8106 ; X64-NOBMI-NEXT:    retq
8108 ; X64-BMI1NOTBM-LABEL: bextr64_32_d1:
8109 ; X64-BMI1NOTBM:       # %bb.0:
8110 ; X64-BMI1NOTBM-NEXT:    shll $8, %edx
8111 ; X64-BMI1NOTBM-NEXT:    movzbl %sil, %eax
8112 ; X64-BMI1NOTBM-NEXT:    orl %edx, %eax
8113 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
8114 ; X64-BMI1NOTBM-NEXT:    # kill: def $eax killed $eax killed $rax
8115 ; X64-BMI1NOTBM-NEXT:    retq
8117 ; X64-BMI1BMI2-LABEL: bextr64_32_d1:
8118 ; X64-BMI1BMI2:       # %bb.0:
8119 ; X64-BMI1BMI2-NEXT:    shrxq %rsi, %rdi, %rax
8120 ; X64-BMI1BMI2-NEXT:    bzhil %edx, %eax, %eax
8121 ; X64-BMI1BMI2-NEXT:    retq
8122   %shifted = lshr i64 %val, %numskipbits
8123   %truncshifted = trunc i64 %shifted to i32
8124   %numhighbits = sub i32 32, %numlowbits
8125   %highbitscleared = shl i32 %truncshifted, %numhighbits
8126   %masked = lshr i32 %highbitscleared, %numhighbits
8127   ret i32 %masked
8130 ; ---------------------------------------------------------------------------- ;
8131 ; Constant
8132 ; ---------------------------------------------------------------------------- ;
8134 ; https://bugs.llvm.org/show_bug.cgi?id=38938
8135 define void @pr38938(i32* %a0, i64* %a1) nounwind {
8136 ; X86-NOBMI-LABEL: pr38938:
8137 ; X86-NOBMI:       # %bb.0:
8138 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
8139 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx
8140 ; X86-NOBMI-NEXT:    movl (%ecx), %ecx
8141 ; X86-NOBMI-NEXT:    shrl $19, %ecx
8142 ; X86-NOBMI-NEXT:    andl $4092, %ecx # imm = 0xFFC
8143 ; X86-NOBMI-NEXT:    incl (%eax,%ecx)
8144 ; X86-NOBMI-NEXT:    retl
8146 ; X86-BMI1NOTBM-LABEL: pr38938:
8147 ; X86-BMI1NOTBM:       # %bb.0:
8148 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
8149 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %ecx
8150 ; X86-BMI1NOTBM-NEXT:    movl $2581, %edx # imm = 0xA15
8151 ; X86-BMI1NOTBM-NEXT:    bextrl %edx, (%ecx), %ecx
8152 ; X86-BMI1NOTBM-NEXT:    incl (%eax,%ecx,4)
8153 ; X86-BMI1NOTBM-NEXT:    retl
8155 ; X86-BMI1TBM-LABEL: pr38938:
8156 ; X86-BMI1TBM:       # %bb.0:
8157 ; X86-BMI1TBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
8158 ; X86-BMI1TBM-NEXT:    movl {{[0-9]+}}(%esp), %ecx
8159 ; X86-BMI1TBM-NEXT:    bextrl $2581, (%ecx), %ecx # imm = 0xA15
8160 ; X86-BMI1TBM-NEXT:    incl (%eax,%ecx,4)
8161 ; X86-BMI1TBM-NEXT:    retl
8163 ; X86-BMI1NOTBMBMI2-LABEL: pr38938:
8164 ; X86-BMI1NOTBMBMI2:       # %bb.0:
8165 ; X86-BMI1NOTBMBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
8166 ; X86-BMI1NOTBMBMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
8167 ; X86-BMI1NOTBMBMI2-NEXT:    movl $2581, %edx # imm = 0xA15
8168 ; X86-BMI1NOTBMBMI2-NEXT:    bextrl %edx, (%ecx), %ecx
8169 ; X86-BMI1NOTBMBMI2-NEXT:    incl (%eax,%ecx,4)
8170 ; X86-BMI1NOTBMBMI2-NEXT:    retl
8172 ; X64-NOBMI-LABEL: pr38938:
8173 ; X64-NOBMI:       # %bb.0:
8174 ; X64-NOBMI-NEXT:    movq (%rsi), %rax
8175 ; X64-NOBMI-NEXT:    shrq $19, %rax
8176 ; X64-NOBMI-NEXT:    andl $4092, %eax # imm = 0xFFC
8177 ; X64-NOBMI-NEXT:    incl (%rdi,%rax)
8178 ; X64-NOBMI-NEXT:    retq
8180 ; X64-BMI1NOTBM-LABEL: pr38938:
8181 ; X64-BMI1NOTBM:       # %bb.0:
8182 ; X64-BMI1NOTBM-NEXT:    movl $2581, %eax # imm = 0xA15
8183 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, (%rsi), %rax
8184 ; X64-BMI1NOTBM-NEXT:    incl (%rdi,%rax,4)
8185 ; X64-BMI1NOTBM-NEXT:    retq
8187 ; X64-BMI1TBM-LABEL: pr38938:
8188 ; X64-BMI1TBM:       # %bb.0:
8189 ; X64-BMI1TBM-NEXT:    bextrq $2581, (%rsi), %rax # imm = 0xA15
8190 ; X64-BMI1TBM-NEXT:    incl (%rdi,%rax,4)
8191 ; X64-BMI1TBM-NEXT:    retq
8193 ; X64-BMI1NOTBMBMI2-LABEL: pr38938:
8194 ; X64-BMI1NOTBMBMI2:       # %bb.0:
8195 ; X64-BMI1NOTBMBMI2-NEXT:    movl $2581, %eax # imm = 0xA15
8196 ; X64-BMI1NOTBMBMI2-NEXT:    bextrq %rax, (%rsi), %rax
8197 ; X64-BMI1NOTBMBMI2-NEXT:    incl (%rdi,%rax,4)
8198 ; X64-BMI1NOTBMBMI2-NEXT:    retq
8199   %tmp = load i64, i64* %a1, align 8
8200   %tmp1 = lshr i64 %tmp, 21
8201   %tmp2 = and i64 %tmp1, 1023
8202   %tmp3 = getelementptr inbounds i32, i32* %a0, i64 %tmp2
8203   %tmp4 = load i32, i32* %tmp3, align 4
8204   %tmp5 = add nsw i32 %tmp4, 1
8205   store i32 %tmp5, i32* %tmp3, align 4
8206   ret void
8209 ; The most canonical variant
8210 define i32 @c0_i32(i32 %arg) nounwind {
8211 ; X86-NOBMI-LABEL: c0_i32:
8212 ; X86-NOBMI:       # %bb.0:
8213 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
8214 ; X86-NOBMI-NEXT:    shrl $19, %eax
8215 ; X86-NOBMI-NEXT:    andl $1023, %eax # imm = 0x3FF
8216 ; X86-NOBMI-NEXT:    retl
8218 ; X86-BMI1NOTBM-LABEL: c0_i32:
8219 ; X86-BMI1NOTBM:       # %bb.0:
8220 ; X86-BMI1NOTBM-NEXT:    movl $2579, %eax # imm = 0xA13
8221 ; X86-BMI1NOTBM-NEXT:    bextrl %eax, {{[0-9]+}}(%esp), %eax
8222 ; X86-BMI1NOTBM-NEXT:    retl
8224 ; X86-BMI1TBM-LABEL: c0_i32:
8225 ; X86-BMI1TBM:       # %bb.0:
8226 ; X86-BMI1TBM-NEXT:    bextrl $2579, {{[0-9]+}}(%esp), %eax # imm = 0xA13
8227 ; X86-BMI1TBM-NEXT:    retl
8229 ; X86-BMI1NOTBMBMI2-LABEL: c0_i32:
8230 ; X86-BMI1NOTBMBMI2:       # %bb.0:
8231 ; X86-BMI1NOTBMBMI2-NEXT:    movl $2579, %eax # imm = 0xA13
8232 ; X86-BMI1NOTBMBMI2-NEXT:    bextrl %eax, {{[0-9]+}}(%esp), %eax
8233 ; X86-BMI1NOTBMBMI2-NEXT:    retl
8235 ; X64-NOBMI-LABEL: c0_i32:
8236 ; X64-NOBMI:       # %bb.0:
8237 ; X64-NOBMI-NEXT:    movl %edi, %eax
8238 ; X64-NOBMI-NEXT:    shrl $19, %eax
8239 ; X64-NOBMI-NEXT:    andl $1023, %eax # imm = 0x3FF
8240 ; X64-NOBMI-NEXT:    retq
8242 ; X64-BMI1NOTBM-LABEL: c0_i32:
8243 ; X64-BMI1NOTBM:       # %bb.0:
8244 ; X64-BMI1NOTBM-NEXT:    movl $2579, %eax # imm = 0xA13
8245 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %eax
8246 ; X64-BMI1NOTBM-NEXT:    retq
8248 ; X64-BMI1TBM-LABEL: c0_i32:
8249 ; X64-BMI1TBM:       # %bb.0:
8250 ; X64-BMI1TBM-NEXT:    bextrl $2579, %edi, %eax # imm = 0xA13
8251 ; X64-BMI1TBM-NEXT:    retq
8253 ; X64-BMI1NOTBMBMI2-LABEL: c0_i32:
8254 ; X64-BMI1NOTBMBMI2:       # %bb.0:
8255 ; X64-BMI1NOTBMBMI2-NEXT:    movl $2579, %eax # imm = 0xA13
8256 ; X64-BMI1NOTBMBMI2-NEXT:    bextrl %eax, %edi, %eax
8257 ; X64-BMI1NOTBMBMI2-NEXT:    retq
8258   %tmp0 = lshr i32 %arg, 19
8259   %tmp1 = and i32 %tmp0, 1023
8260   ret i32 %tmp1
8263 ; Should be still fine, but the mask is shifted
8264 define i32 @c1_i32(i32 %arg) nounwind {
8265 ; X86-LABEL: c1_i32:
8266 ; X86:       # %bb.0:
8267 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
8268 ; X86-NEXT:    shrl $19, %eax
8269 ; X86-NEXT:    andl $4092, %eax # imm = 0xFFC
8270 ; X86-NEXT:    retl
8272 ; X64-LABEL: c1_i32:
8273 ; X64:       # %bb.0:
8274 ; X64-NEXT:    movl %edi, %eax
8275 ; X64-NEXT:    shrl $19, %eax
8276 ; X64-NEXT:    andl $4092, %eax # imm = 0xFFC
8277 ; X64-NEXT:    retq
8278   %tmp0 = lshr i32 %arg, 19
8279   %tmp1 = and i32 %tmp0, 4092
8280   ret i32 %tmp1
8283 ; Should be still fine, but the result is shifted left afterwards
8284 define i32 @c2_i32(i32 %arg) nounwind {
8285 ; X86-LABEL: c2_i32:
8286 ; X86:       # %bb.0:
8287 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
8288 ; X86-NEXT:    shrl $17, %eax
8289 ; X86-NEXT:    andl $4092, %eax # imm = 0xFFC
8290 ; X86-NEXT:    retl
8292 ; X64-LABEL: c2_i32:
8293 ; X64:       # %bb.0:
8294 ; X64-NEXT:    movl %edi, %eax
8295 ; X64-NEXT:    shrl $17, %eax
8296 ; X64-NEXT:    andl $4092, %eax # imm = 0xFFC
8297 ; X64-NEXT:    retq
8298   %tmp0 = lshr i32 %arg, 19
8299   %tmp1 = and i32 %tmp0, 1023
8300   %tmp2 = shl i32 %tmp1, 2
8301   ret i32 %tmp2
8304 ; The mask covers newly shifted-in bit
8305 define i32 @c4_i32_bad(i32 %arg) nounwind {
8306 ; X86-LABEL: c4_i32_bad:
8307 ; X86:       # %bb.0:
8308 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
8309 ; X86-NEXT:    shrl $19, %eax
8310 ; X86-NEXT:    andl $-2, %eax
8311 ; X86-NEXT:    retl
8313 ; X64-LABEL: c4_i32_bad:
8314 ; X64:       # %bb.0:
8315 ; X64-NEXT:    movl %edi, %eax
8316 ; X64-NEXT:    shrl $19, %eax
8317 ; X64-NEXT:    andl $-2, %eax
8318 ; X64-NEXT:    retq
8319   %tmp0 = lshr i32 %arg, 19
8320   %tmp1 = and i32 %tmp0, 16382
8321   ret i32 %tmp1
8324 ; i64
8326 ; The most canonical variant
8327 define i64 @c0_i64(i64 %arg) nounwind {
8328 ; X86-NOBMI-LABEL: c0_i64:
8329 ; X86-NOBMI:       # %bb.0:
8330 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
8331 ; X86-NOBMI-NEXT:    shrl $19, %eax
8332 ; X86-NOBMI-NEXT:    andl $1023, %eax # imm = 0x3FF
8333 ; X86-NOBMI-NEXT:    xorl %edx, %edx
8334 ; X86-NOBMI-NEXT:    retl
8336 ; X86-BMI1NOTBM-LABEL: c0_i64:
8337 ; X86-BMI1NOTBM:       # %bb.0:
8338 ; X86-BMI1NOTBM-NEXT:    movl $2579, %eax # imm = 0xA13
8339 ; X86-BMI1NOTBM-NEXT:    bextrl %eax, {{[0-9]+}}(%esp), %eax
8340 ; X86-BMI1NOTBM-NEXT:    xorl %edx, %edx
8341 ; X86-BMI1NOTBM-NEXT:    retl
8343 ; X86-BMI1TBM-LABEL: c0_i64:
8344 ; X86-BMI1TBM:       # %bb.0:
8345 ; X86-BMI1TBM-NEXT:    bextrl $2579, {{[0-9]+}}(%esp), %eax # imm = 0xA13
8346 ; X86-BMI1TBM-NEXT:    xorl %edx, %edx
8347 ; X86-BMI1TBM-NEXT:    retl
8349 ; X86-BMI1NOTBMBMI2-LABEL: c0_i64:
8350 ; X86-BMI1NOTBMBMI2:       # %bb.0:
8351 ; X86-BMI1NOTBMBMI2-NEXT:    movl $2579, %eax # imm = 0xA13
8352 ; X86-BMI1NOTBMBMI2-NEXT:    bextrl %eax, {{[0-9]+}}(%esp), %eax
8353 ; X86-BMI1NOTBMBMI2-NEXT:    xorl %edx, %edx
8354 ; X86-BMI1NOTBMBMI2-NEXT:    retl
8356 ; X64-NOBMI-LABEL: c0_i64:
8357 ; X64-NOBMI:       # %bb.0:
8358 ; X64-NOBMI-NEXT:    movq %rdi, %rax
8359 ; X64-NOBMI-NEXT:    shrq $51, %rax
8360 ; X64-NOBMI-NEXT:    andl $1023, %eax # imm = 0x3FF
8361 ; X64-NOBMI-NEXT:    retq
8363 ; X64-BMI1NOTBM-LABEL: c0_i64:
8364 ; X64-BMI1NOTBM:       # %bb.0:
8365 ; X64-BMI1NOTBM-NEXT:    movl $2611, %eax # imm = 0xA33
8366 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
8367 ; X64-BMI1NOTBM-NEXT:    retq
8369 ; X64-BMI1TBM-LABEL: c0_i64:
8370 ; X64-BMI1TBM:       # %bb.0:
8371 ; X64-BMI1TBM-NEXT:    bextrq $2611, %rdi, %rax # imm = 0xA33
8372 ; X64-BMI1TBM-NEXT:    retq
8374 ; X64-BMI1NOTBMBMI2-LABEL: c0_i64:
8375 ; X64-BMI1NOTBMBMI2:       # %bb.0:
8376 ; X64-BMI1NOTBMBMI2-NEXT:    movl $2611, %eax # imm = 0xA33
8377 ; X64-BMI1NOTBMBMI2-NEXT:    bextrq %rax, %rdi, %rax
8378 ; X64-BMI1NOTBMBMI2-NEXT:    retq
8379   %tmp0 = lshr i64 %arg, 51
8380   %tmp1 = and i64 %tmp0, 1023
8381   ret i64 %tmp1
8384 ; Should be still fine, but the mask is shifted
8385 define i64 @c1_i64(i64 %arg) nounwind {
8386 ; X86-LABEL: c1_i64:
8387 ; X86:       # %bb.0:
8388 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
8389 ; X86-NEXT:    shrl $19, %eax
8390 ; X86-NEXT:    andl $4092, %eax # imm = 0xFFC
8391 ; X86-NEXT:    xorl %edx, %edx
8392 ; X86-NEXT:    retl
8394 ; X64-LABEL: c1_i64:
8395 ; X64:       # %bb.0:
8396 ; X64-NEXT:    movq %rdi, %rax
8397 ; X64-NEXT:    shrq $51, %rax
8398 ; X64-NEXT:    andl $4092, %eax # imm = 0xFFC
8399 ; X64-NEXT:    retq
8400   %tmp0 = lshr i64 %arg, 51
8401   %tmp1 = and i64 %tmp0, 4092
8402   ret i64 %tmp1
8405 ; Should be still fine, but the result is shifted left afterwards
8406 define i64 @c2_i64(i64 %arg) nounwind {
8407 ; X86-LABEL: c2_i64:
8408 ; X86:       # %bb.0:
8409 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
8410 ; X86-NEXT:    shrl $17, %eax
8411 ; X86-NEXT:    andl $4092, %eax # imm = 0xFFC
8412 ; X86-NEXT:    xorl %edx, %edx
8413 ; X86-NEXT:    retl
8415 ; X64-LABEL: c2_i64:
8416 ; X64:       # %bb.0:
8417 ; X64-NEXT:    movq %rdi, %rax
8418 ; X64-NEXT:    shrq $49, %rax
8419 ; X64-NEXT:    andl $4092, %eax # imm = 0xFFC
8420 ; X64-NEXT:    retq
8421   %tmp0 = lshr i64 %arg, 51
8422   %tmp1 = and i64 %tmp0, 1023
8423   %tmp2 = shl i64 %tmp1, 2
8424   ret i64 %tmp2
8427 ; The mask covers newly shifted-in bit
8428 define i64 @c4_i64_bad(i64 %arg) nounwind {
8429 ; X86-LABEL: c4_i64_bad:
8430 ; X86:       # %bb.0:
8431 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
8432 ; X86-NEXT:    shrl $19, %eax
8433 ; X86-NEXT:    andl $-2, %eax
8434 ; X86-NEXT:    xorl %edx, %edx
8435 ; X86-NEXT:    retl
8437 ; X64-LABEL: c4_i64_bad:
8438 ; X64:       # %bb.0:
8439 ; X64-NEXT:    movq %rdi, %rax
8440 ; X64-NEXT:    shrq $51, %rax
8441 ; X64-NEXT:    andl $-2, %eax
8442 ; X64-NEXT:    retq
8443   %tmp0 = lshr i64 %arg, 51
8444   %tmp1 = and i64 %tmp0, 16382
8445   ret i64 %tmp1
8448 ; ---------------------------------------------------------------------------- ;
8449 ; Constant, storing the result afterwards.
8450 ; ---------------------------------------------------------------------------- ;
8452 ; i32
8454 ; The most canonical variant
8455 define void @c5_i32(i32 %arg, i32* %ptr) nounwind {
8456 ; X86-NOBMI-LABEL: c5_i32:
8457 ; X86-NOBMI:       # %bb.0:
8458 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
8459 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx
8460 ; X86-NOBMI-NEXT:    shrl $19, %ecx
8461 ; X86-NOBMI-NEXT:    andl $1023, %ecx # imm = 0x3FF
8462 ; X86-NOBMI-NEXT:    movl %ecx, (%eax)
8463 ; X86-NOBMI-NEXT:    retl
8465 ; X86-BMI1NOTBM-LABEL: c5_i32:
8466 ; X86-BMI1NOTBM:       # %bb.0:
8467 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
8468 ; X86-BMI1NOTBM-NEXT:    movl $2579, %ecx # imm = 0xA13
8469 ; X86-BMI1NOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8470 ; X86-BMI1NOTBM-NEXT:    movl %ecx, (%eax)
8471 ; X86-BMI1NOTBM-NEXT:    retl
8473 ; X86-BMI1TBM-LABEL: c5_i32:
8474 ; X86-BMI1TBM:       # %bb.0:
8475 ; X86-BMI1TBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
8476 ; X86-BMI1TBM-NEXT:    bextrl $2579, {{[0-9]+}}(%esp), %ecx # imm = 0xA13
8477 ; X86-BMI1TBM-NEXT:    movl %ecx, (%eax)
8478 ; X86-BMI1TBM-NEXT:    retl
8480 ; X86-BMI1NOTBMBMI2-LABEL: c5_i32:
8481 ; X86-BMI1NOTBMBMI2:       # %bb.0:
8482 ; X86-BMI1NOTBMBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
8483 ; X86-BMI1NOTBMBMI2-NEXT:    movl $2579, %ecx # imm = 0xA13
8484 ; X86-BMI1NOTBMBMI2-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8485 ; X86-BMI1NOTBMBMI2-NEXT:    movl %ecx, (%eax)
8486 ; X86-BMI1NOTBMBMI2-NEXT:    retl
8488 ; X64-NOBMI-LABEL: c5_i32:
8489 ; X64-NOBMI:       # %bb.0:
8490 ; X64-NOBMI-NEXT:    shrl $19, %edi
8491 ; X64-NOBMI-NEXT:    andl $1023, %edi # imm = 0x3FF
8492 ; X64-NOBMI-NEXT:    movl %edi, (%rsi)
8493 ; X64-NOBMI-NEXT:    retq
8495 ; X64-BMI1NOTBM-LABEL: c5_i32:
8496 ; X64-BMI1NOTBM:       # %bb.0:
8497 ; X64-BMI1NOTBM-NEXT:    movl $2579, %eax # imm = 0xA13
8498 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %eax
8499 ; X64-BMI1NOTBM-NEXT:    movl %eax, (%rsi)
8500 ; X64-BMI1NOTBM-NEXT:    retq
8502 ; X64-BMI1TBM-LABEL: c5_i32:
8503 ; X64-BMI1TBM:       # %bb.0:
8504 ; X64-BMI1TBM-NEXT:    bextrl $2579, %edi, %eax # imm = 0xA13
8505 ; X64-BMI1TBM-NEXT:    movl %eax, (%rsi)
8506 ; X64-BMI1TBM-NEXT:    retq
8508 ; X64-BMI1NOTBMBMI2-LABEL: c5_i32:
8509 ; X64-BMI1NOTBMBMI2:       # %bb.0:
8510 ; X64-BMI1NOTBMBMI2-NEXT:    movl $2579, %eax # imm = 0xA13
8511 ; X64-BMI1NOTBMBMI2-NEXT:    bextrl %eax, %edi, %eax
8512 ; X64-BMI1NOTBMBMI2-NEXT:    movl %eax, (%rsi)
8513 ; X64-BMI1NOTBMBMI2-NEXT:    retq
8514   %tmp0 = lshr i32 %arg, 19
8515   %tmp1 = and i32 %tmp0, 1023
8516   store i32 %tmp1, i32* %ptr
8517   ret void
8520 ; Should be still fine, but the mask is shifted
8521 define void @c6_i32(i32 %arg, i32* %ptr) nounwind {
8522 ; X86-NOBMI-LABEL: c6_i32:
8523 ; X86-NOBMI:       # %bb.0:
8524 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
8525 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx
8526 ; X86-NOBMI-NEXT:    shrl $19, %ecx
8527 ; X86-NOBMI-NEXT:    andl $4095, %ecx # imm = 0xFFF
8528 ; X86-NOBMI-NEXT:    movl %ecx, (%eax)
8529 ; X86-NOBMI-NEXT:    retl
8531 ; X86-BMI1NOTBM-LABEL: c6_i32:
8532 ; X86-BMI1NOTBM:       # %bb.0:
8533 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
8534 ; X86-BMI1NOTBM-NEXT:    movl $3091, %ecx # imm = 0xC13
8535 ; X86-BMI1NOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8536 ; X86-BMI1NOTBM-NEXT:    movl %ecx, (%eax)
8537 ; X86-BMI1NOTBM-NEXT:    retl
8539 ; X86-BMI1TBM-LABEL: c6_i32:
8540 ; X86-BMI1TBM:       # %bb.0:
8541 ; X86-BMI1TBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
8542 ; X86-BMI1TBM-NEXT:    bextrl $3091, {{[0-9]+}}(%esp), %ecx # imm = 0xC13
8543 ; X86-BMI1TBM-NEXT:    movl %ecx, (%eax)
8544 ; X86-BMI1TBM-NEXT:    retl
8546 ; X86-BMI1NOTBMBMI2-LABEL: c6_i32:
8547 ; X86-BMI1NOTBMBMI2:       # %bb.0:
8548 ; X86-BMI1NOTBMBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
8549 ; X86-BMI1NOTBMBMI2-NEXT:    movl $3091, %ecx # imm = 0xC13
8550 ; X86-BMI1NOTBMBMI2-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8551 ; X86-BMI1NOTBMBMI2-NEXT:    movl %ecx, (%eax)
8552 ; X86-BMI1NOTBMBMI2-NEXT:    retl
8554 ; X64-NOBMI-LABEL: c6_i32:
8555 ; X64-NOBMI:       # %bb.0:
8556 ; X64-NOBMI-NEXT:    shrl $19, %edi
8557 ; X64-NOBMI-NEXT:    andl $4095, %edi # imm = 0xFFF
8558 ; X64-NOBMI-NEXT:    movl %edi, (%rsi)
8559 ; X64-NOBMI-NEXT:    retq
8561 ; X64-BMI1NOTBM-LABEL: c6_i32:
8562 ; X64-BMI1NOTBM:       # %bb.0:
8563 ; X64-BMI1NOTBM-NEXT:    movl $3091, %eax # imm = 0xC13
8564 ; X64-BMI1NOTBM-NEXT:    bextrl %eax, %edi, %eax
8565 ; X64-BMI1NOTBM-NEXT:    movl %eax, (%rsi)
8566 ; X64-BMI1NOTBM-NEXT:    retq
8568 ; X64-BMI1TBM-LABEL: c6_i32:
8569 ; X64-BMI1TBM:       # %bb.0:
8570 ; X64-BMI1TBM-NEXT:    bextrl $3091, %edi, %eax # imm = 0xC13
8571 ; X64-BMI1TBM-NEXT:    movl %eax, (%rsi)
8572 ; X64-BMI1TBM-NEXT:    retq
8574 ; X64-BMI1NOTBMBMI2-LABEL: c6_i32:
8575 ; X64-BMI1NOTBMBMI2:       # %bb.0:
8576 ; X64-BMI1NOTBMBMI2-NEXT:    movl $3091, %eax # imm = 0xC13
8577 ; X64-BMI1NOTBMBMI2-NEXT:    bextrl %eax, %edi, %eax
8578 ; X64-BMI1NOTBMBMI2-NEXT:    movl %eax, (%rsi)
8579 ; X64-BMI1NOTBMBMI2-NEXT:    retq
8580   %tmp0 = lshr i32 %arg, 19
8581   %tmp1 = and i32 %tmp0, 4095
8582   store i32 %tmp1, i32* %ptr
8583   ret void
8586 ; Should be still fine, but the result is shifted left afterwards
8587 define void @c7_i32(i32 %arg, i32* %ptr) nounwind {
8588 ; X86-LABEL: c7_i32:
8589 ; X86:       # %bb.0:
8590 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
8591 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
8592 ; X86-NEXT:    shrl $17, %ecx
8593 ; X86-NEXT:    andl $4092, %ecx # imm = 0xFFC
8594 ; X86-NEXT:    movl %ecx, (%eax)
8595 ; X86-NEXT:    retl
8597 ; X64-LABEL: c7_i32:
8598 ; X64:       # %bb.0:
8599 ; X64-NEXT:    shrl $17, %edi
8600 ; X64-NEXT:    andl $4092, %edi # imm = 0xFFC
8601 ; X64-NEXT:    movl %edi, (%rsi)
8602 ; X64-NEXT:    retq
8603   %tmp0 = lshr i32 %arg, 19
8604   %tmp1 = and i32 %tmp0, 1023
8605   %tmp2 = shl i32 %tmp1, 2
8606   store i32 %tmp2, i32* %ptr
8607   ret void
8610 ; i64
8612 ; The most canonical variant
8613 define void @c5_i64(i64 %arg, i64* %ptr) nounwind {
8614 ; X86-NOBMI-LABEL: c5_i64:
8615 ; X86-NOBMI:       # %bb.0:
8616 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
8617 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx
8618 ; X86-NOBMI-NEXT:    shrl $19, %ecx
8619 ; X86-NOBMI-NEXT:    andl $1023, %ecx # imm = 0x3FF
8620 ; X86-NOBMI-NEXT:    movl %ecx, (%eax)
8621 ; X86-NOBMI-NEXT:    movl $0, 4(%eax)
8622 ; X86-NOBMI-NEXT:    retl
8624 ; X86-BMI1NOTBM-LABEL: c5_i64:
8625 ; X86-BMI1NOTBM:       # %bb.0:
8626 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
8627 ; X86-BMI1NOTBM-NEXT:    movl $2579, %ecx # imm = 0xA13
8628 ; X86-BMI1NOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8629 ; X86-BMI1NOTBM-NEXT:    movl %ecx, (%eax)
8630 ; X86-BMI1NOTBM-NEXT:    movl $0, 4(%eax)
8631 ; X86-BMI1NOTBM-NEXT:    retl
8633 ; X86-BMI1TBM-LABEL: c5_i64:
8634 ; X86-BMI1TBM:       # %bb.0:
8635 ; X86-BMI1TBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
8636 ; X86-BMI1TBM-NEXT:    bextrl $2579, {{[0-9]+}}(%esp), %ecx # imm = 0xA13
8637 ; X86-BMI1TBM-NEXT:    movl %ecx, (%eax)
8638 ; X86-BMI1TBM-NEXT:    movl $0, 4(%eax)
8639 ; X86-BMI1TBM-NEXT:    retl
8641 ; X86-BMI1NOTBMBMI2-LABEL: c5_i64:
8642 ; X86-BMI1NOTBMBMI2:       # %bb.0:
8643 ; X86-BMI1NOTBMBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
8644 ; X86-BMI1NOTBMBMI2-NEXT:    movl $2579, %ecx # imm = 0xA13
8645 ; X86-BMI1NOTBMBMI2-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8646 ; X86-BMI1NOTBMBMI2-NEXT:    movl %ecx, (%eax)
8647 ; X86-BMI1NOTBMBMI2-NEXT:    movl $0, 4(%eax)
8648 ; X86-BMI1NOTBMBMI2-NEXT:    retl
8650 ; X64-NOBMI-LABEL: c5_i64:
8651 ; X64-NOBMI:       # %bb.0:
8652 ; X64-NOBMI-NEXT:    shrq $51, %rdi
8653 ; X64-NOBMI-NEXT:    andl $1023, %edi # imm = 0x3FF
8654 ; X64-NOBMI-NEXT:    movq %rdi, (%rsi)
8655 ; X64-NOBMI-NEXT:    retq
8657 ; X64-BMI1NOTBM-LABEL: c5_i64:
8658 ; X64-BMI1NOTBM:       # %bb.0:
8659 ; X64-BMI1NOTBM-NEXT:    movl $2611, %eax # imm = 0xA33
8660 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
8661 ; X64-BMI1NOTBM-NEXT:    movq %rax, (%rsi)
8662 ; X64-BMI1NOTBM-NEXT:    retq
8664 ; X64-BMI1TBM-LABEL: c5_i64:
8665 ; X64-BMI1TBM:       # %bb.0:
8666 ; X64-BMI1TBM-NEXT:    bextrq $2611, %rdi, %rax # imm = 0xA33
8667 ; X64-BMI1TBM-NEXT:    movq %rax, (%rsi)
8668 ; X64-BMI1TBM-NEXT:    retq
8670 ; X64-BMI1NOTBMBMI2-LABEL: c5_i64:
8671 ; X64-BMI1NOTBMBMI2:       # %bb.0:
8672 ; X64-BMI1NOTBMBMI2-NEXT:    movl $2611, %eax # imm = 0xA33
8673 ; X64-BMI1NOTBMBMI2-NEXT:    bextrq %rax, %rdi, %rax
8674 ; X64-BMI1NOTBMBMI2-NEXT:    movq %rax, (%rsi)
8675 ; X64-BMI1NOTBMBMI2-NEXT:    retq
8676   %tmp0 = lshr i64 %arg, 51
8677   %tmp1 = and i64 %tmp0, 1023
8678   store i64 %tmp1, i64* %ptr
8679   ret void
8682 ; Should be still fine, but the mask is shifted
8683 define void @c6_i64(i64 %arg, i64* %ptr) nounwind {
8684 ; X86-NOBMI-LABEL: c6_i64:
8685 ; X86-NOBMI:       # %bb.0:
8686 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %eax
8687 ; X86-NOBMI-NEXT:    movl {{[0-9]+}}(%esp), %ecx
8688 ; X86-NOBMI-NEXT:    shrl $19, %ecx
8689 ; X86-NOBMI-NEXT:    andl $4095, %ecx # imm = 0xFFF
8690 ; X86-NOBMI-NEXT:    movl %ecx, (%eax)
8691 ; X86-NOBMI-NEXT:    movl $0, 4(%eax)
8692 ; X86-NOBMI-NEXT:    retl
8694 ; X86-BMI1NOTBM-LABEL: c6_i64:
8695 ; X86-BMI1NOTBM:       # %bb.0:
8696 ; X86-BMI1NOTBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
8697 ; X86-BMI1NOTBM-NEXT:    movl $3091, %ecx # imm = 0xC13
8698 ; X86-BMI1NOTBM-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8699 ; X86-BMI1NOTBM-NEXT:    movl %ecx, (%eax)
8700 ; X86-BMI1NOTBM-NEXT:    movl $0, 4(%eax)
8701 ; X86-BMI1NOTBM-NEXT:    retl
8703 ; X86-BMI1TBM-LABEL: c6_i64:
8704 ; X86-BMI1TBM:       # %bb.0:
8705 ; X86-BMI1TBM-NEXT:    movl {{[0-9]+}}(%esp), %eax
8706 ; X86-BMI1TBM-NEXT:    bextrl $3091, {{[0-9]+}}(%esp), %ecx # imm = 0xC13
8707 ; X86-BMI1TBM-NEXT:    movl %ecx, (%eax)
8708 ; X86-BMI1TBM-NEXT:    movl $0, 4(%eax)
8709 ; X86-BMI1TBM-NEXT:    retl
8711 ; X86-BMI1NOTBMBMI2-LABEL: c6_i64:
8712 ; X86-BMI1NOTBMBMI2:       # %bb.0:
8713 ; X86-BMI1NOTBMBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
8714 ; X86-BMI1NOTBMBMI2-NEXT:    movl $3091, %ecx # imm = 0xC13
8715 ; X86-BMI1NOTBMBMI2-NEXT:    bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8716 ; X86-BMI1NOTBMBMI2-NEXT:    movl %ecx, (%eax)
8717 ; X86-BMI1NOTBMBMI2-NEXT:    movl $0, 4(%eax)
8718 ; X86-BMI1NOTBMBMI2-NEXT:    retl
8720 ; X64-NOBMI-LABEL: c6_i64:
8721 ; X64-NOBMI:       # %bb.0:
8722 ; X64-NOBMI-NEXT:    shrq $51, %rdi
8723 ; X64-NOBMI-NEXT:    andl $4095, %edi # imm = 0xFFF
8724 ; X64-NOBMI-NEXT:    movq %rdi, (%rsi)
8725 ; X64-NOBMI-NEXT:    retq
8727 ; X64-BMI1NOTBM-LABEL: c6_i64:
8728 ; X64-BMI1NOTBM:       # %bb.0:
8729 ; X64-BMI1NOTBM-NEXT:    movl $3123, %eax # imm = 0xC33
8730 ; X64-BMI1NOTBM-NEXT:    bextrq %rax, %rdi, %rax
8731 ; X64-BMI1NOTBM-NEXT:    movq %rax, (%rsi)
8732 ; X64-BMI1NOTBM-NEXT:    retq
8734 ; X64-BMI1TBM-LABEL: c6_i64:
8735 ; X64-BMI1TBM:       # %bb.0:
8736 ; X64-BMI1TBM-NEXT:    bextrq $3123, %rdi, %rax # imm = 0xC33
8737 ; X64-BMI1TBM-NEXT:    movq %rax, (%rsi)
8738 ; X64-BMI1TBM-NEXT:    retq
8740 ; X64-BMI1NOTBMBMI2-LABEL: c6_i64:
8741 ; X64-BMI1NOTBMBMI2:       # %bb.0:
8742 ; X64-BMI1NOTBMBMI2-NEXT:    movl $3123, %eax # imm = 0xC33
8743 ; X64-BMI1NOTBMBMI2-NEXT:    bextrq %rax, %rdi, %rax
8744 ; X64-BMI1NOTBMBMI2-NEXT:    movq %rax, (%rsi)
8745 ; X64-BMI1NOTBMBMI2-NEXT:    retq
8746   %tmp0 = lshr i64 %arg, 51
8747   %tmp1 = and i64 %tmp0, 4095
8748   store i64 %tmp1, i64* %ptr
8749   ret void
8752 ; Should be still fine, but the result is shifted left afterwards
8753 define void @c7_i64(i64 %arg, i64* %ptr) nounwind {
8754 ; X86-LABEL: c7_i64:
8755 ; X86:       # %bb.0:
8756 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
8757 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
8758 ; X86-NEXT:    shrl $17, %ecx
8759 ; X86-NEXT:    andl $4092, %ecx # imm = 0xFFC
8760 ; X86-NEXT:    movl %ecx, (%eax)
8761 ; X86-NEXT:    movl $0, 4(%eax)
8762 ; X86-NEXT:    retl
8764 ; X64-LABEL: c7_i64:
8765 ; X64:       # %bb.0:
8766 ; X64-NEXT:    shrq $49, %rdi
8767 ; X64-NEXT:    andl $4092, %edi # imm = 0xFFC
8768 ; X64-NEXT:    movq %rdi, (%rsi)
8769 ; X64-NEXT:    retq
8770   %tmp0 = lshr i64 %arg, 51
8771   %tmp1 = and i64 %tmp0, 1023
8772   %tmp2 = shl i64 %tmp1, 2
8773   store i64 %tmp2, i64* %ptr
8774   ret void