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
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)
26 declare void @use32(i32)
27 declare void @use64(i64)
29 ; ---------------------------------------------------------------------------- ;
31 ; ---------------------------------------------------------------------------- ;
33 define i32 @bextr32_a0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
34 ; X86-NOBMI-LABEL: bextr32_a0:
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:
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
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
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
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
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
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
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)
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
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
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
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
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
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
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)
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: movq %rsi, %rcx
1722 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx
1723 ; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi
1724 ; X64-BMI1NOTBM-NEXT: movl $1, %eax
1725 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
1726 ; X64-BMI1NOTBM-NEXT: shlq %cl, %rax
1727 ; X64-BMI1NOTBM-NEXT: decl %eax
1728 ; X64-BMI1NOTBM-NEXT: andl %edi, %eax
1729 ; X64-BMI1NOTBM-NEXT: # kill: def $eax killed $eax killed $rax
1730 ; X64-BMI1NOTBM-NEXT: retq
1732 ; X64-BMI1BMI2-LABEL: bextr64_32_a0:
1733 ; X64-BMI1BMI2: # %bb.0:
1734 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
1735 ; X64-BMI1BMI2-NEXT: movl $1, %ecx
1736 ; X64-BMI1BMI2-NEXT: shlxq %rdx, %rcx, %rcx
1737 ; X64-BMI1BMI2-NEXT: decl %ecx
1738 ; X64-BMI1BMI2-NEXT: andl %ecx, %eax
1739 ; X64-BMI1BMI2-NEXT: # kill: def $eax killed $eax killed $rax
1740 ; X64-BMI1BMI2-NEXT: retq
1741 %shifted = lshr i64 %val, %numskipbits
1742 %onebit = shl i64 1, %numlowbits
1743 %mask = add nsw i64 %onebit, -1
1744 %masked = and i64 %mask, %shifted
1745 %res = trunc i64 %masked to i32
1749 ; Shifting happens in 64-bit, then truncation. Masking is 32-bit.
1750 define i32 @bextr64_32_a1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {
1751 ; X86-NOBMI-LABEL: bextr64_32_a1:
1752 ; X86-NOBMI: # %bb.0:
1753 ; X86-NOBMI-NEXT: pushl %edi
1754 ; X86-NOBMI-NEXT: pushl %esi
1755 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %dl
1756 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
1757 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
1758 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edi
1759 ; X86-NOBMI-NEXT: movl %edi, %esi
1760 ; X86-NOBMI-NEXT: shrl %cl, %esi
1761 ; X86-NOBMI-NEXT: shrdl %cl, %edi, %eax
1762 ; X86-NOBMI-NEXT: testb $32, %cl
1763 ; X86-NOBMI-NEXT: jne .LBB15_2
1764 ; X86-NOBMI-NEXT: # %bb.1:
1765 ; X86-NOBMI-NEXT: movl %eax, %esi
1766 ; X86-NOBMI-NEXT: .LBB15_2:
1767 ; X86-NOBMI-NEXT: movl $1, %eax
1768 ; X86-NOBMI-NEXT: movl %edx, %ecx
1769 ; X86-NOBMI-NEXT: shll %cl, %eax
1770 ; X86-NOBMI-NEXT: decl %eax
1771 ; X86-NOBMI-NEXT: andl %esi, %eax
1772 ; X86-NOBMI-NEXT: popl %esi
1773 ; X86-NOBMI-NEXT: popl %edi
1774 ; X86-NOBMI-NEXT: retl
1776 ; X86-BMI1NOTBM-LABEL: bextr64_32_a1:
1777 ; X86-BMI1NOTBM: # %bb.0:
1778 ; X86-BMI1NOTBM-NEXT: pushl %edi
1779 ; X86-BMI1NOTBM-NEXT: pushl %esi
1780 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
1781 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
1782 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
1783 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
1784 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
1785 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
1786 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
1787 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
1788 ; X86-BMI1NOTBM-NEXT: jne .LBB15_2
1789 ; X86-BMI1NOTBM-NEXT: # %bb.1:
1790 ; X86-BMI1NOTBM-NEXT: movl %esi, %edx
1791 ; X86-BMI1NOTBM-NEXT: .LBB15_2:
1792 ; X86-BMI1NOTBM-NEXT: shll $8, %eax
1793 ; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax
1794 ; X86-BMI1NOTBM-NEXT: popl %esi
1795 ; X86-BMI1NOTBM-NEXT: popl %edi
1796 ; X86-BMI1NOTBM-NEXT: retl
1798 ; X86-BMI1BMI2-LABEL: bextr64_32_a1:
1799 ; X86-BMI1BMI2: # %bb.0:
1800 ; X86-BMI1BMI2-NEXT: pushl %esi
1801 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
1802 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
1803 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
1804 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
1805 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edx
1806 ; X86-BMI1BMI2-NEXT: testb $32, %cl
1807 ; X86-BMI1BMI2-NEXT: je .LBB15_2
1808 ; X86-BMI1BMI2-NEXT: # %bb.1:
1809 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %edx
1810 ; X86-BMI1BMI2-NEXT: .LBB15_2:
1811 ; X86-BMI1BMI2-NEXT: bzhil %eax, %edx, %eax
1812 ; X86-BMI1BMI2-NEXT: popl %esi
1813 ; X86-BMI1BMI2-NEXT: retl
1815 ; X64-NOBMI-LABEL: bextr64_32_a1:
1816 ; X64-NOBMI: # %bb.0:
1817 ; X64-NOBMI-NEXT: movq %rsi, %rcx
1818 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
1819 ; X64-NOBMI-NEXT: shrq %cl, %rdi
1820 ; X64-NOBMI-NEXT: movl $1, %eax
1821 ; X64-NOBMI-NEXT: movl %edx, %ecx
1822 ; X64-NOBMI-NEXT: shll %cl, %eax
1823 ; X64-NOBMI-NEXT: decl %eax
1824 ; X64-NOBMI-NEXT: andl %edi, %eax
1825 ; X64-NOBMI-NEXT: retq
1827 ; X64-BMI1NOTBM-LABEL: bextr64_32_a1:
1828 ; X64-BMI1NOTBM: # %bb.0:
1829 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
1830 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
1831 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
1832 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
1833 ; X64-BMI1NOTBM-NEXT: # kill: def $eax killed $eax killed $rax
1834 ; X64-BMI1NOTBM-NEXT: retq
1836 ; X64-BMI1BMI2-LABEL: bextr64_32_a1:
1837 ; X64-BMI1BMI2: # %bb.0:
1838 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
1839 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
1840 ; X64-BMI1BMI2-NEXT: retq
1841 %shifted = lshr i64 %val, %numskipbits
1842 %truncshifted = trunc i64 %shifted to i32
1843 %onebit = shl i32 1, %numlowbits
1844 %mask = add nsw i32 %onebit, -1
1845 %masked = and i32 %mask, %truncshifted
1849 ; Shifting happens in 64-bit, then truncation (with extra use).
1850 ; Masking is 32-bit.
1851 define i32 @bextr64_32_a1_trunc_extrause(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {
1852 ; X86-NOBMI-LABEL: bextr64_32_a1_trunc_extrause:
1853 ; X86-NOBMI: # %bb.0:
1854 ; X86-NOBMI-NEXT: pushl %ebx
1855 ; X86-NOBMI-NEXT: pushl %esi
1856 ; X86-NOBMI-NEXT: pushl %eax
1857 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %bl
1858 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
1859 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
1860 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edx
1861 ; X86-NOBMI-NEXT: movl %edx, %esi
1862 ; X86-NOBMI-NEXT: shrl %cl, %esi
1863 ; X86-NOBMI-NEXT: shrdl %cl, %edx, %eax
1864 ; X86-NOBMI-NEXT: testb $32, %cl
1865 ; X86-NOBMI-NEXT: jne .LBB16_2
1866 ; X86-NOBMI-NEXT: # %bb.1:
1867 ; X86-NOBMI-NEXT: movl %eax, %esi
1868 ; X86-NOBMI-NEXT: .LBB16_2:
1869 ; X86-NOBMI-NEXT: movl %esi, (%esp)
1870 ; X86-NOBMI-NEXT: calll use32
1871 ; X86-NOBMI-NEXT: movl $1, %eax
1872 ; X86-NOBMI-NEXT: movl %ebx, %ecx
1873 ; X86-NOBMI-NEXT: shll %cl, %eax
1874 ; X86-NOBMI-NEXT: decl %eax
1875 ; X86-NOBMI-NEXT: andl %esi, %eax
1876 ; X86-NOBMI-NEXT: addl $4, %esp
1877 ; X86-NOBMI-NEXT: popl %esi
1878 ; X86-NOBMI-NEXT: popl %ebx
1879 ; X86-NOBMI-NEXT: retl
1881 ; X86-BMI1NOTBM-LABEL: bextr64_32_a1_trunc_extrause:
1882 ; X86-BMI1NOTBM: # %bb.0:
1883 ; X86-BMI1NOTBM-NEXT: pushl %ebx
1884 ; X86-BMI1NOTBM-NEXT: pushl %esi
1885 ; X86-BMI1NOTBM-NEXT: pushl %eax
1886 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %bl
1887 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
1888 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
1889 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx
1890 ; X86-BMI1NOTBM-NEXT: movl %edx, %esi
1891 ; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
1892 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edx, %eax
1893 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
1894 ; X86-BMI1NOTBM-NEXT: jne .LBB16_2
1895 ; X86-BMI1NOTBM-NEXT: # %bb.1:
1896 ; X86-BMI1NOTBM-NEXT: movl %eax, %esi
1897 ; X86-BMI1NOTBM-NEXT: .LBB16_2:
1898 ; X86-BMI1NOTBM-NEXT: movl %esi, (%esp)
1899 ; X86-BMI1NOTBM-NEXT: calll use32
1900 ; X86-BMI1NOTBM-NEXT: shll $8, %ebx
1901 ; X86-BMI1NOTBM-NEXT: bextrl %ebx, %esi, %eax
1902 ; X86-BMI1NOTBM-NEXT: addl $4, %esp
1903 ; X86-BMI1NOTBM-NEXT: popl %esi
1904 ; X86-BMI1NOTBM-NEXT: popl %ebx
1905 ; X86-BMI1NOTBM-NEXT: retl
1907 ; X86-BMI1BMI2-LABEL: bextr64_32_a1_trunc_extrause:
1908 ; X86-BMI1BMI2: # %bb.0:
1909 ; X86-BMI1BMI2-NEXT: pushl %ebx
1910 ; X86-BMI1BMI2-NEXT: pushl %esi
1911 ; X86-BMI1BMI2-NEXT: pushl %eax
1912 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %bl
1913 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
1914 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
1915 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
1916 ; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %esi
1917 ; X86-BMI1BMI2-NEXT: testb $32, %cl
1918 ; X86-BMI1BMI2-NEXT: je .LBB16_2
1919 ; X86-BMI1BMI2-NEXT: # %bb.1:
1920 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %esi
1921 ; X86-BMI1BMI2-NEXT: .LBB16_2:
1922 ; X86-BMI1BMI2-NEXT: movl %esi, (%esp)
1923 ; X86-BMI1BMI2-NEXT: calll use32
1924 ; X86-BMI1BMI2-NEXT: bzhil %ebx, %esi, %eax
1925 ; X86-BMI1BMI2-NEXT: addl $4, %esp
1926 ; X86-BMI1BMI2-NEXT: popl %esi
1927 ; X86-BMI1BMI2-NEXT: popl %ebx
1928 ; X86-BMI1BMI2-NEXT: retl
1930 ; X64-NOBMI-LABEL: bextr64_32_a1_trunc_extrause:
1931 ; X64-NOBMI: # %bb.0:
1932 ; X64-NOBMI-NEXT: pushq %rbp
1933 ; X64-NOBMI-NEXT: pushq %rbx
1934 ; X64-NOBMI-NEXT: pushq %rax
1935 ; X64-NOBMI-NEXT: movl %edx, %ebp
1936 ; X64-NOBMI-NEXT: movq %rsi, %rcx
1937 ; X64-NOBMI-NEXT: movq %rdi, %rbx
1938 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
1939 ; X64-NOBMI-NEXT: shrq %cl, %rbx
1940 ; X64-NOBMI-NEXT: movl %ebx, %edi
1941 ; X64-NOBMI-NEXT: callq use32
1942 ; X64-NOBMI-NEXT: movl $1, %eax
1943 ; X64-NOBMI-NEXT: movl %ebp, %ecx
1944 ; X64-NOBMI-NEXT: shll %cl, %eax
1945 ; X64-NOBMI-NEXT: decl %eax
1946 ; X64-NOBMI-NEXT: andl %ebx, %eax
1947 ; X64-NOBMI-NEXT: addq $8, %rsp
1948 ; X64-NOBMI-NEXT: popq %rbx
1949 ; X64-NOBMI-NEXT: popq %rbp
1950 ; X64-NOBMI-NEXT: retq
1952 ; X64-BMI1NOTBM-LABEL: bextr64_32_a1_trunc_extrause:
1953 ; X64-BMI1NOTBM: # %bb.0:
1954 ; X64-BMI1NOTBM-NEXT: pushq %rbp
1955 ; X64-BMI1NOTBM-NEXT: pushq %rbx
1956 ; X64-BMI1NOTBM-NEXT: pushq %rax
1957 ; X64-BMI1NOTBM-NEXT: movl %edx, %ebp
1958 ; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx
1959 ; X64-BMI1NOTBM-NEXT: movq %rdi, %rbx
1960 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx
1961 ; X64-BMI1NOTBM-NEXT: shrq %cl, %rbx
1962 ; X64-BMI1NOTBM-NEXT: movl %ebx, %edi
1963 ; X64-BMI1NOTBM-NEXT: callq use32
1964 ; X64-BMI1NOTBM-NEXT: shll $8, %ebp
1965 ; X64-BMI1NOTBM-NEXT: bextrl %ebp, %ebx, %eax
1966 ; X64-BMI1NOTBM-NEXT: addq $8, %rsp
1967 ; X64-BMI1NOTBM-NEXT: popq %rbx
1968 ; X64-BMI1NOTBM-NEXT: popq %rbp
1969 ; X64-BMI1NOTBM-NEXT: retq
1971 ; X64-BMI1BMI2-LABEL: bextr64_32_a1_trunc_extrause:
1972 ; X64-BMI1BMI2: # %bb.0:
1973 ; X64-BMI1BMI2-NEXT: pushq %rbp
1974 ; X64-BMI1BMI2-NEXT: pushq %rbx
1975 ; X64-BMI1BMI2-NEXT: pushq %rax
1976 ; X64-BMI1BMI2-NEXT: movl %edx, %ebp
1977 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rbx
1978 ; X64-BMI1BMI2-NEXT: movl %ebx, %edi
1979 ; X64-BMI1BMI2-NEXT: callq use32
1980 ; X64-BMI1BMI2-NEXT: bzhil %ebp, %ebx, %eax
1981 ; X64-BMI1BMI2-NEXT: addq $8, %rsp
1982 ; X64-BMI1BMI2-NEXT: popq %rbx
1983 ; X64-BMI1BMI2-NEXT: popq %rbp
1984 ; X64-BMI1BMI2-NEXT: retq
1985 %shifted = lshr i64 %val, %numskipbits
1986 %truncshifted = trunc i64 %shifted to i32
1987 call void @use32(i32 %truncshifted)
1988 %onebit = shl i32 1, %numlowbits
1989 %mask = add nsw i32 %onebit, -1
1990 %masked = and i32 %mask, %truncshifted
1994 ; Shifting happens in 64-bit. Mask is 32-bit, but extended to 64-bit.
1995 ; Masking is 64-bit. Then truncation.
1996 define i32 @bextr64_32_a2(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {
1997 ; X86-NOBMI-LABEL: bextr64_32_a2:
1998 ; X86-NOBMI: # %bb.0:
1999 ; X86-NOBMI-NEXT: pushl %edi
2000 ; X86-NOBMI-NEXT: pushl %esi
2001 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %dl
2002 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
2003 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
2004 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edi
2005 ; X86-NOBMI-NEXT: movl %edi, %esi
2006 ; X86-NOBMI-NEXT: shrl %cl, %esi
2007 ; X86-NOBMI-NEXT: shrdl %cl, %edi, %eax
2008 ; X86-NOBMI-NEXT: testb $32, %cl
2009 ; X86-NOBMI-NEXT: jne .LBB17_2
2010 ; X86-NOBMI-NEXT: # %bb.1:
2011 ; X86-NOBMI-NEXT: movl %eax, %esi
2012 ; X86-NOBMI-NEXT: .LBB17_2:
2013 ; X86-NOBMI-NEXT: movl $1, %eax
2014 ; X86-NOBMI-NEXT: movl %edx, %ecx
2015 ; X86-NOBMI-NEXT: shll %cl, %eax
2016 ; X86-NOBMI-NEXT: decl %eax
2017 ; X86-NOBMI-NEXT: andl %esi, %eax
2018 ; X86-NOBMI-NEXT: popl %esi
2019 ; X86-NOBMI-NEXT: popl %edi
2020 ; X86-NOBMI-NEXT: retl
2022 ; X86-BMI1NOTBM-LABEL: bextr64_32_a2:
2023 ; X86-BMI1NOTBM: # %bb.0:
2024 ; X86-BMI1NOTBM-NEXT: pushl %edi
2025 ; X86-BMI1NOTBM-NEXT: pushl %esi
2026 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
2027 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
2028 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
2029 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
2030 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
2031 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
2032 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
2033 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
2034 ; X86-BMI1NOTBM-NEXT: jne .LBB17_2
2035 ; X86-BMI1NOTBM-NEXT: # %bb.1:
2036 ; X86-BMI1NOTBM-NEXT: movl %esi, %edx
2037 ; X86-BMI1NOTBM-NEXT: .LBB17_2:
2038 ; X86-BMI1NOTBM-NEXT: shll $8, %eax
2039 ; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax
2040 ; X86-BMI1NOTBM-NEXT: popl %esi
2041 ; X86-BMI1NOTBM-NEXT: popl %edi
2042 ; X86-BMI1NOTBM-NEXT: retl
2044 ; X86-BMI1BMI2-LABEL: bextr64_32_a2:
2045 ; X86-BMI1BMI2: # %bb.0:
2046 ; X86-BMI1BMI2-NEXT: pushl %esi
2047 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
2048 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
2049 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
2050 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
2051 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edx
2052 ; X86-BMI1BMI2-NEXT: testb $32, %cl
2053 ; X86-BMI1BMI2-NEXT: je .LBB17_2
2054 ; X86-BMI1BMI2-NEXT: # %bb.1:
2055 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %edx
2056 ; X86-BMI1BMI2-NEXT: .LBB17_2:
2057 ; X86-BMI1BMI2-NEXT: bzhil %eax, %edx, %eax
2058 ; X86-BMI1BMI2-NEXT: popl %esi
2059 ; X86-BMI1BMI2-NEXT: retl
2061 ; X64-NOBMI-LABEL: bextr64_32_a2:
2062 ; X64-NOBMI: # %bb.0:
2063 ; X64-NOBMI-NEXT: movq %rsi, %rcx
2064 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
2065 ; X64-NOBMI-NEXT: shrq %cl, %rdi
2066 ; X64-NOBMI-NEXT: movl $1, %eax
2067 ; X64-NOBMI-NEXT: movl %edx, %ecx
2068 ; X64-NOBMI-NEXT: shll %cl, %eax
2069 ; X64-NOBMI-NEXT: decl %eax
2070 ; X64-NOBMI-NEXT: andl %edi, %eax
2071 ; X64-NOBMI-NEXT: retq
2073 ; X64-BMI1NOTBM-LABEL: bextr64_32_a2:
2074 ; X64-BMI1NOTBM: # %bb.0:
2075 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
2076 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
2077 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
2078 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
2079 ; X64-BMI1NOTBM-NEXT: # kill: def $eax killed $eax killed $rax
2080 ; X64-BMI1NOTBM-NEXT: retq
2082 ; X64-BMI1BMI2-LABEL: bextr64_32_a2:
2083 ; X64-BMI1BMI2: # %bb.0:
2084 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
2085 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
2086 ; X64-BMI1BMI2-NEXT: retq
2087 %shifted = lshr i64 %val, %numskipbits
2088 %onebit = shl i32 1, %numlowbits
2089 %mask = add nsw i32 %onebit, -1
2090 %zextmask = zext i32 %mask to i64
2091 %masked = and i64 %zextmask, %shifted
2092 %truncmasked = trunc i64 %masked to i32
2093 ret i32 %truncmasked
2096 ; ---------------------------------------------------------------------------- ;
2098 ; ---------------------------------------------------------------------------- ;
2100 define i32 @bextr32_b0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
2101 ; X86-NOBMI-LABEL: bextr32_b0:
2102 ; X86-NOBMI: # %bb.0:
2103 ; X86-NOBMI-NEXT: pushl %esi
2104 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %dl
2105 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
2106 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
2107 ; X86-NOBMI-NEXT: shrl %cl, %esi
2108 ; X86-NOBMI-NEXT: movl $-1, %eax
2109 ; X86-NOBMI-NEXT: movl %edx, %ecx
2110 ; X86-NOBMI-NEXT: shll %cl, %eax
2111 ; X86-NOBMI-NEXT: notl %eax
2112 ; X86-NOBMI-NEXT: andl %esi, %eax
2113 ; X86-NOBMI-NEXT: popl %esi
2114 ; X86-NOBMI-NEXT: retl
2116 ; X86-BMI1NOTBM-LABEL: bextr32_b0:
2117 ; X86-BMI1NOTBM: # %bb.0:
2118 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
2119 ; X86-BMI1NOTBM-NEXT: shll $8, %eax
2120 ; X86-BMI1NOTBM-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
2121 ; X86-BMI1NOTBM-NEXT: orl %eax, %ecx
2122 ; X86-BMI1NOTBM-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %eax
2123 ; X86-BMI1NOTBM-NEXT: retl
2125 ; X86-BMI1BMI2-LABEL: bextr32_b0:
2126 ; X86-BMI1BMI2: # %bb.0:
2127 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
2128 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
2129 ; X86-BMI1BMI2-NEXT: shrxl %ecx, {{[0-9]+}}(%esp), %ecx
2130 ; X86-BMI1BMI2-NEXT: bzhil %eax, %ecx, %eax
2131 ; X86-BMI1BMI2-NEXT: retl
2133 ; X64-NOBMI-LABEL: bextr32_b0:
2134 ; X64-NOBMI: # %bb.0:
2135 ; X64-NOBMI-NEXT: movl %esi, %ecx
2136 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
2137 ; X64-NOBMI-NEXT: shrl %cl, %edi
2138 ; X64-NOBMI-NEXT: movl $-1, %eax
2139 ; X64-NOBMI-NEXT: movl %edx, %ecx
2140 ; X64-NOBMI-NEXT: shll %cl, %eax
2141 ; X64-NOBMI-NEXT: notl %eax
2142 ; X64-NOBMI-NEXT: andl %edi, %eax
2143 ; X64-NOBMI-NEXT: retq
2145 ; X64-BMI1NOTBM-LABEL: bextr32_b0:
2146 ; X64-BMI1NOTBM: # %bb.0:
2147 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
2148 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
2149 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
2150 ; X64-BMI1NOTBM-NEXT: bextrl %eax, %edi, %eax
2151 ; X64-BMI1NOTBM-NEXT: retq
2153 ; X64-BMI1BMI2-LABEL: bextr32_b0:
2154 ; X64-BMI1BMI2: # %bb.0:
2155 ; X64-BMI1BMI2-NEXT: shrxl %esi, %edi, %eax
2156 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
2157 ; X64-BMI1BMI2-NEXT: retq
2158 %shifted = lshr i32 %val, %numskipbits
2159 %notmask = shl i32 -1, %numlowbits
2160 %mask = xor i32 %notmask, -1
2161 %masked = and i32 %mask, %shifted
2165 define i32 @bextr32_b1_indexzext(i32 %val, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {
2166 ; X86-NOBMI-LABEL: bextr32_b1_indexzext:
2167 ; X86-NOBMI: # %bb.0:
2168 ; X86-NOBMI-NEXT: pushl %esi
2169 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %dl
2170 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
2171 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
2172 ; X86-NOBMI-NEXT: shrl %cl, %esi
2173 ; X86-NOBMI-NEXT: movl $-1, %eax
2174 ; X86-NOBMI-NEXT: movl %edx, %ecx
2175 ; X86-NOBMI-NEXT: shll %cl, %eax
2176 ; X86-NOBMI-NEXT: notl %eax
2177 ; X86-NOBMI-NEXT: andl %esi, %eax
2178 ; X86-NOBMI-NEXT: popl %esi
2179 ; X86-NOBMI-NEXT: retl
2181 ; X86-BMI1NOTBM-LABEL: bextr32_b1_indexzext:
2182 ; X86-BMI1NOTBM: # %bb.0:
2183 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
2184 ; X86-BMI1NOTBM-NEXT: shll $8, %eax
2185 ; X86-BMI1NOTBM-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
2186 ; X86-BMI1NOTBM-NEXT: orl %eax, %ecx
2187 ; X86-BMI1NOTBM-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %eax
2188 ; X86-BMI1NOTBM-NEXT: retl
2190 ; X86-BMI1BMI2-LABEL: bextr32_b1_indexzext:
2191 ; X86-BMI1BMI2: # %bb.0:
2192 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
2193 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
2194 ; X86-BMI1BMI2-NEXT: shrxl %ecx, {{[0-9]+}}(%esp), %ecx
2195 ; X86-BMI1BMI2-NEXT: bzhil %eax, %ecx, %eax
2196 ; X86-BMI1BMI2-NEXT: retl
2198 ; X64-NOBMI-LABEL: bextr32_b1_indexzext:
2199 ; X64-NOBMI: # %bb.0:
2200 ; X64-NOBMI-NEXT: movl %esi, %ecx
2201 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
2202 ; X64-NOBMI-NEXT: shrl %cl, %edi
2203 ; X64-NOBMI-NEXT: movl $-1, %eax
2204 ; X64-NOBMI-NEXT: movl %edx, %ecx
2205 ; X64-NOBMI-NEXT: shll %cl, %eax
2206 ; X64-NOBMI-NEXT: notl %eax
2207 ; X64-NOBMI-NEXT: andl %edi, %eax
2208 ; X64-NOBMI-NEXT: retq
2210 ; X64-BMI1NOTBM-LABEL: bextr32_b1_indexzext:
2211 ; X64-BMI1NOTBM: # %bb.0:
2212 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
2213 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
2214 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
2215 ; X64-BMI1NOTBM-NEXT: bextrl %eax, %edi, %eax
2216 ; X64-BMI1NOTBM-NEXT: retq
2218 ; X64-BMI1BMI2-LABEL: bextr32_b1_indexzext:
2219 ; X64-BMI1BMI2: # %bb.0:
2220 ; X64-BMI1BMI2-NEXT: shrxl %esi, %edi, %eax
2221 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
2222 ; X64-BMI1BMI2-NEXT: retq
2223 %skip = zext i8 %numskipbits to i32
2224 %shifted = lshr i32 %val, %skip
2225 %conv = zext i8 %numlowbits to i32
2226 %notmask = shl i32 -1, %conv
2227 %mask = xor i32 %notmask, -1
2228 %masked = and i32 %mask, %shifted
2232 define i32 @bextr32_b2_load(i32* %w, i32 %numskipbits, i32 %numlowbits) nounwind {
2233 ; X86-NOBMI-LABEL: bextr32_b2_load:
2234 ; X86-NOBMI: # %bb.0:
2235 ; X86-NOBMI-NEXT: pushl %esi
2236 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %dl
2237 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
2238 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
2239 ; X86-NOBMI-NEXT: movl (%eax), %esi
2240 ; X86-NOBMI-NEXT: shrl %cl, %esi
2241 ; X86-NOBMI-NEXT: movl $-1, %eax
2242 ; X86-NOBMI-NEXT: movl %edx, %ecx
2243 ; X86-NOBMI-NEXT: shll %cl, %eax
2244 ; X86-NOBMI-NEXT: notl %eax
2245 ; X86-NOBMI-NEXT: andl %esi, %eax
2246 ; X86-NOBMI-NEXT: popl %esi
2247 ; X86-NOBMI-NEXT: retl
2249 ; X86-BMI1NOTBM-LABEL: bextr32_b2_load:
2250 ; X86-BMI1NOTBM: # %bb.0:
2251 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
2252 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
2253 ; X86-BMI1NOTBM-NEXT: shll $8, %ecx
2254 ; X86-BMI1NOTBM-NEXT: movzbl {{[0-9]+}}(%esp), %edx
2255 ; X86-BMI1NOTBM-NEXT: orl %ecx, %edx
2256 ; X86-BMI1NOTBM-NEXT: bextrl %edx, (%eax), %eax
2257 ; X86-BMI1NOTBM-NEXT: retl
2259 ; X86-BMI1BMI2-LABEL: bextr32_b2_load:
2260 ; X86-BMI1BMI2: # %bb.0:
2261 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
2262 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %ecx
2263 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %dl
2264 ; X86-BMI1BMI2-NEXT: shrxl %edx, (%ecx), %ecx
2265 ; X86-BMI1BMI2-NEXT: bzhil %eax, %ecx, %eax
2266 ; X86-BMI1BMI2-NEXT: retl
2268 ; X64-NOBMI-LABEL: bextr32_b2_load:
2269 ; X64-NOBMI: # %bb.0:
2270 ; X64-NOBMI-NEXT: movl %esi, %ecx
2271 ; X64-NOBMI-NEXT: movl (%rdi), %esi
2272 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
2273 ; X64-NOBMI-NEXT: shrl %cl, %esi
2274 ; X64-NOBMI-NEXT: movl $-1, %eax
2275 ; X64-NOBMI-NEXT: movl %edx, %ecx
2276 ; X64-NOBMI-NEXT: shll %cl, %eax
2277 ; X64-NOBMI-NEXT: notl %eax
2278 ; X64-NOBMI-NEXT: andl %esi, %eax
2279 ; X64-NOBMI-NEXT: retq
2281 ; X64-BMI1NOTBM-LABEL: bextr32_b2_load:
2282 ; X64-BMI1NOTBM: # %bb.0:
2283 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
2284 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
2285 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
2286 ; X64-BMI1NOTBM-NEXT: bextrl %eax, (%rdi), %eax
2287 ; X64-BMI1NOTBM-NEXT: retq
2289 ; X64-BMI1BMI2-LABEL: bextr32_b2_load:
2290 ; X64-BMI1BMI2: # %bb.0:
2291 ; X64-BMI1BMI2-NEXT: shrxl %esi, (%rdi), %eax
2292 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
2293 ; X64-BMI1BMI2-NEXT: retq
2294 %val = load i32, i32* %w
2295 %shifted = lshr i32 %val, %numskipbits
2296 %notmask = shl i32 -1, %numlowbits
2297 %mask = xor i32 %notmask, -1
2298 %masked = and i32 %mask, %shifted
2302 define i32 @bextr32_b3_load_indexzext(i32* %w, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {
2303 ; X86-NOBMI-LABEL: bextr32_b3_load_indexzext:
2304 ; X86-NOBMI: # %bb.0:
2305 ; X86-NOBMI-NEXT: pushl %esi
2306 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %dl
2307 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
2308 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
2309 ; X86-NOBMI-NEXT: movl (%eax), %esi
2310 ; X86-NOBMI-NEXT: shrl %cl, %esi
2311 ; X86-NOBMI-NEXT: movl $-1, %eax
2312 ; X86-NOBMI-NEXT: movl %edx, %ecx
2313 ; X86-NOBMI-NEXT: shll %cl, %eax
2314 ; X86-NOBMI-NEXT: notl %eax
2315 ; X86-NOBMI-NEXT: andl %esi, %eax
2316 ; X86-NOBMI-NEXT: popl %esi
2317 ; X86-NOBMI-NEXT: retl
2319 ; X86-BMI1NOTBM-LABEL: bextr32_b3_load_indexzext:
2320 ; X86-BMI1NOTBM: # %bb.0:
2321 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
2322 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
2323 ; X86-BMI1NOTBM-NEXT: shll $8, %ecx
2324 ; X86-BMI1NOTBM-NEXT: movzbl {{[0-9]+}}(%esp), %edx
2325 ; X86-BMI1NOTBM-NEXT: orl %ecx, %edx
2326 ; X86-BMI1NOTBM-NEXT: bextrl %edx, (%eax), %eax
2327 ; X86-BMI1NOTBM-NEXT: retl
2329 ; X86-BMI1BMI2-LABEL: bextr32_b3_load_indexzext:
2330 ; X86-BMI1BMI2: # %bb.0:
2331 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
2332 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %ecx
2333 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %dl
2334 ; X86-BMI1BMI2-NEXT: shrxl %edx, (%ecx), %ecx
2335 ; X86-BMI1BMI2-NEXT: bzhil %eax, %ecx, %eax
2336 ; X86-BMI1BMI2-NEXT: retl
2338 ; X64-NOBMI-LABEL: bextr32_b3_load_indexzext:
2339 ; X64-NOBMI: # %bb.0:
2340 ; X64-NOBMI-NEXT: movl %esi, %ecx
2341 ; X64-NOBMI-NEXT: movl (%rdi), %esi
2342 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
2343 ; X64-NOBMI-NEXT: shrl %cl, %esi
2344 ; X64-NOBMI-NEXT: movl $-1, %eax
2345 ; X64-NOBMI-NEXT: movl %edx, %ecx
2346 ; X64-NOBMI-NEXT: shll %cl, %eax
2347 ; X64-NOBMI-NEXT: notl %eax
2348 ; X64-NOBMI-NEXT: andl %esi, %eax
2349 ; X64-NOBMI-NEXT: retq
2351 ; X64-BMI1NOTBM-LABEL: bextr32_b3_load_indexzext:
2352 ; X64-BMI1NOTBM: # %bb.0:
2353 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
2354 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
2355 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
2356 ; X64-BMI1NOTBM-NEXT: bextrl %eax, (%rdi), %eax
2357 ; X64-BMI1NOTBM-NEXT: retq
2359 ; X64-BMI1BMI2-LABEL: bextr32_b3_load_indexzext:
2360 ; X64-BMI1BMI2: # %bb.0:
2361 ; X64-BMI1BMI2-NEXT: shrxl %esi, (%rdi), %eax
2362 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
2363 ; X64-BMI1BMI2-NEXT: retq
2364 %val = load i32, i32* %w
2365 %skip = zext i8 %numskipbits to i32
2366 %shifted = lshr i32 %val, %skip
2367 %conv = zext i8 %numlowbits to i32
2368 %notmask = shl i32 -1, %conv
2369 %mask = xor i32 %notmask, -1
2370 %masked = and i32 %mask, %shifted
2374 define i32 @bextr32_b4_commutative(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
2375 ; X86-NOBMI-LABEL: bextr32_b4_commutative:
2376 ; X86-NOBMI: # %bb.0:
2377 ; X86-NOBMI-NEXT: pushl %esi
2378 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %dl
2379 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
2380 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
2381 ; X86-NOBMI-NEXT: shrl %cl, %esi
2382 ; X86-NOBMI-NEXT: movl $-1, %eax
2383 ; X86-NOBMI-NEXT: movl %edx, %ecx
2384 ; X86-NOBMI-NEXT: shll %cl, %eax
2385 ; X86-NOBMI-NEXT: notl %eax
2386 ; X86-NOBMI-NEXT: andl %esi, %eax
2387 ; X86-NOBMI-NEXT: popl %esi
2388 ; X86-NOBMI-NEXT: retl
2390 ; X86-BMI1NOTBM-LABEL: bextr32_b4_commutative:
2391 ; X86-BMI1NOTBM: # %bb.0:
2392 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
2393 ; X86-BMI1NOTBM-NEXT: shll $8, %eax
2394 ; X86-BMI1NOTBM-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
2395 ; X86-BMI1NOTBM-NEXT: orl %eax, %ecx
2396 ; X86-BMI1NOTBM-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %eax
2397 ; X86-BMI1NOTBM-NEXT: retl
2399 ; X86-BMI1BMI2-LABEL: bextr32_b4_commutative:
2400 ; X86-BMI1BMI2: # %bb.0:
2401 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
2402 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
2403 ; X86-BMI1BMI2-NEXT: shrxl %ecx, {{[0-9]+}}(%esp), %ecx
2404 ; X86-BMI1BMI2-NEXT: bzhil %eax, %ecx, %eax
2405 ; X86-BMI1BMI2-NEXT: retl
2407 ; X64-NOBMI-LABEL: bextr32_b4_commutative:
2408 ; X64-NOBMI: # %bb.0:
2409 ; X64-NOBMI-NEXT: movl %esi, %ecx
2410 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
2411 ; X64-NOBMI-NEXT: shrl %cl, %edi
2412 ; X64-NOBMI-NEXT: movl $-1, %eax
2413 ; X64-NOBMI-NEXT: movl %edx, %ecx
2414 ; X64-NOBMI-NEXT: shll %cl, %eax
2415 ; X64-NOBMI-NEXT: notl %eax
2416 ; X64-NOBMI-NEXT: andl %edi, %eax
2417 ; X64-NOBMI-NEXT: retq
2419 ; X64-BMI1NOTBM-LABEL: bextr32_b4_commutative:
2420 ; X64-BMI1NOTBM: # %bb.0:
2421 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
2422 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
2423 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
2424 ; X64-BMI1NOTBM-NEXT: bextrl %eax, %edi, %eax
2425 ; X64-BMI1NOTBM-NEXT: retq
2427 ; X64-BMI1BMI2-LABEL: bextr32_b4_commutative:
2428 ; X64-BMI1BMI2: # %bb.0:
2429 ; X64-BMI1BMI2-NEXT: shrxl %esi, %edi, %eax
2430 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
2431 ; X64-BMI1BMI2-NEXT: retq
2432 %shifted = lshr i32 %val, %numskipbits
2433 %notmask = shl i32 -1, %numlowbits
2434 %mask = xor i32 %notmask, -1
2435 %masked = and i32 %shifted, %mask ; swapped order
2439 define i32 @bextr32_b5_skipextrauses(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
2440 ; X86-NOBMI-LABEL: bextr32_b5_skipextrauses:
2441 ; X86-NOBMI: # %bb.0:
2442 ; X86-NOBMI-NEXT: pushl %edi
2443 ; X86-NOBMI-NEXT: pushl %esi
2444 ; X86-NOBMI-NEXT: pushl %eax
2445 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %dl
2446 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edi
2447 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
2448 ; X86-NOBMI-NEXT: movl %eax, %ecx
2449 ; X86-NOBMI-NEXT: shrl %cl, %edi
2450 ; X86-NOBMI-NEXT: movl $-1, %esi
2451 ; X86-NOBMI-NEXT: movl %edx, %ecx
2452 ; X86-NOBMI-NEXT: shll %cl, %esi
2453 ; X86-NOBMI-NEXT: notl %esi
2454 ; X86-NOBMI-NEXT: andl %edi, %esi
2455 ; X86-NOBMI-NEXT: movl %eax, (%esp)
2456 ; X86-NOBMI-NEXT: calll use32
2457 ; X86-NOBMI-NEXT: movl %esi, %eax
2458 ; X86-NOBMI-NEXT: addl $4, %esp
2459 ; X86-NOBMI-NEXT: popl %esi
2460 ; X86-NOBMI-NEXT: popl %edi
2461 ; X86-NOBMI-NEXT: retl
2463 ; X86-BMI1NOTBM-LABEL: bextr32_b5_skipextrauses:
2464 ; X86-BMI1NOTBM: # %bb.0:
2465 ; X86-BMI1NOTBM-NEXT: pushl %esi
2466 ; X86-BMI1NOTBM-NEXT: subl $8, %esp
2467 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
2468 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
2469 ; X86-BMI1NOTBM-NEXT: shll $8, %ecx
2470 ; X86-BMI1NOTBM-NEXT: movzbl %al, %edx
2471 ; X86-BMI1NOTBM-NEXT: orl %ecx, %edx
2472 ; X86-BMI1NOTBM-NEXT: bextrl %edx, {{[0-9]+}}(%esp), %esi
2473 ; X86-BMI1NOTBM-NEXT: movl %eax, (%esp)
2474 ; X86-BMI1NOTBM-NEXT: calll use32
2475 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
2476 ; X86-BMI1NOTBM-NEXT: addl $8, %esp
2477 ; X86-BMI1NOTBM-NEXT: popl %esi
2478 ; X86-BMI1NOTBM-NEXT: retl
2480 ; X86-BMI1BMI2-LABEL: bextr32_b5_skipextrauses:
2481 ; X86-BMI1BMI2: # %bb.0:
2482 ; X86-BMI1BMI2-NEXT: pushl %esi
2483 ; X86-BMI1BMI2-NEXT: subl $8, %esp
2484 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
2485 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %ecx
2486 ; X86-BMI1BMI2-NEXT: shrxl %ecx, {{[0-9]+}}(%esp), %edx
2487 ; X86-BMI1BMI2-NEXT: bzhil %eax, %edx, %esi
2488 ; X86-BMI1BMI2-NEXT: movl %ecx, (%esp)
2489 ; X86-BMI1BMI2-NEXT: calll use32
2490 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
2491 ; X86-BMI1BMI2-NEXT: addl $8, %esp
2492 ; X86-BMI1BMI2-NEXT: popl %esi
2493 ; X86-BMI1BMI2-NEXT: retl
2495 ; X64-NOBMI-LABEL: bextr32_b5_skipextrauses:
2496 ; X64-NOBMI: # %bb.0:
2497 ; X64-NOBMI-NEXT: pushq %rbx
2498 ; X64-NOBMI-NEXT: movl %esi, %ecx
2499 ; X64-NOBMI-NEXT: shrl %cl, %edi
2500 ; X64-NOBMI-NEXT: movl $-1, %ebx
2501 ; X64-NOBMI-NEXT: movl %edx, %ecx
2502 ; X64-NOBMI-NEXT: shll %cl, %ebx
2503 ; X64-NOBMI-NEXT: notl %ebx
2504 ; X64-NOBMI-NEXT: andl %edi, %ebx
2505 ; X64-NOBMI-NEXT: movl %esi, %edi
2506 ; X64-NOBMI-NEXT: callq use32
2507 ; X64-NOBMI-NEXT: movl %ebx, %eax
2508 ; X64-NOBMI-NEXT: popq %rbx
2509 ; X64-NOBMI-NEXT: retq
2511 ; X64-BMI1NOTBM-LABEL: bextr32_b5_skipextrauses:
2512 ; X64-BMI1NOTBM: # %bb.0:
2513 ; X64-BMI1NOTBM-NEXT: pushq %rbx
2514 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
2515 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
2516 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
2517 ; X64-BMI1NOTBM-NEXT: bextrl %eax, %edi, %ebx
2518 ; X64-BMI1NOTBM-NEXT: movl %esi, %edi
2519 ; X64-BMI1NOTBM-NEXT: callq use32
2520 ; X64-BMI1NOTBM-NEXT: movl %ebx, %eax
2521 ; X64-BMI1NOTBM-NEXT: popq %rbx
2522 ; X64-BMI1NOTBM-NEXT: retq
2524 ; X64-BMI1BMI2-LABEL: bextr32_b5_skipextrauses:
2525 ; X64-BMI1BMI2: # %bb.0:
2526 ; X64-BMI1BMI2-NEXT: pushq %rbx
2527 ; X64-BMI1BMI2-NEXT: shrxl %esi, %edi, %eax
2528 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %ebx
2529 ; X64-BMI1BMI2-NEXT: movl %esi, %edi
2530 ; X64-BMI1BMI2-NEXT: callq use32
2531 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
2532 ; X64-BMI1BMI2-NEXT: popq %rbx
2533 ; X64-BMI1BMI2-NEXT: retq
2534 %shifted = lshr i32 %val, %numskipbits
2535 %notmask = shl i32 -1, %numlowbits
2536 %mask = xor i32 %notmask, -1
2537 %masked = and i32 %mask, %shifted
2538 call void @use32(i32 %numskipbits)
2544 define i64 @bextr64_b0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
2545 ; X86-NOBMI-LABEL: bextr64_b0:
2546 ; X86-NOBMI: # %bb.0:
2547 ; X86-NOBMI-NEXT: pushl %edi
2548 ; X86-NOBMI-NEXT: pushl %esi
2549 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %ch
2550 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
2551 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
2552 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
2553 ; X86-NOBMI-NEXT: movl %eax, %edi
2554 ; X86-NOBMI-NEXT: shrl %cl, %edi
2555 ; X86-NOBMI-NEXT: shrdl %cl, %eax, %esi
2556 ; X86-NOBMI-NEXT: testb $32, %cl
2557 ; X86-NOBMI-NEXT: je .LBB24_2
2558 ; X86-NOBMI-NEXT: # %bb.1:
2559 ; X86-NOBMI-NEXT: movl %edi, %esi
2560 ; X86-NOBMI-NEXT: xorl %edi, %edi
2561 ; X86-NOBMI-NEXT: .LBB24_2:
2562 ; X86-NOBMI-NEXT: movl $-1, %edx
2563 ; X86-NOBMI-NEXT: movl $-1, %eax
2564 ; X86-NOBMI-NEXT: movb %ch, %cl
2565 ; X86-NOBMI-NEXT: shll %cl, %eax
2566 ; X86-NOBMI-NEXT: shldl %cl, %edx, %edx
2567 ; X86-NOBMI-NEXT: testb $32, %ch
2568 ; X86-NOBMI-NEXT: je .LBB24_4
2569 ; X86-NOBMI-NEXT: # %bb.3:
2570 ; X86-NOBMI-NEXT: movl %eax, %edx
2571 ; X86-NOBMI-NEXT: xorl %eax, %eax
2572 ; X86-NOBMI-NEXT: .LBB24_4:
2573 ; X86-NOBMI-NEXT: notl %edx
2574 ; X86-NOBMI-NEXT: andl %edi, %edx
2575 ; X86-NOBMI-NEXT: notl %eax
2576 ; X86-NOBMI-NEXT: andl %esi, %eax
2577 ; X86-NOBMI-NEXT: popl %esi
2578 ; X86-NOBMI-NEXT: popl %edi
2579 ; X86-NOBMI-NEXT: retl
2581 ; X86-BMI1NOTBM-LABEL: bextr64_b0:
2582 ; X86-BMI1NOTBM: # %bb.0:
2583 ; X86-BMI1NOTBM-NEXT: pushl %ebx
2584 ; X86-BMI1NOTBM-NEXT: pushl %edi
2585 ; X86-BMI1NOTBM-NEXT: pushl %esi
2586 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
2587 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
2588 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
2589 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
2590 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
2591 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
2592 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
2593 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
2594 ; X86-BMI1NOTBM-NEXT: je .LBB24_2
2595 ; X86-BMI1NOTBM-NEXT: # %bb.1:
2596 ; X86-BMI1NOTBM-NEXT: movl %edx, %esi
2597 ; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
2598 ; X86-BMI1NOTBM-NEXT: .LBB24_2:
2599 ; X86-BMI1NOTBM-NEXT: movl $-1, %edi
2600 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
2601 ; X86-BMI1NOTBM-NEXT: movl %eax, %ecx
2602 ; X86-BMI1NOTBM-NEXT: shll %cl, %ebx
2603 ; X86-BMI1NOTBM-NEXT: shldl %cl, %edi, %edi
2604 ; X86-BMI1NOTBM-NEXT: testb $32, %al
2605 ; X86-BMI1NOTBM-NEXT: je .LBB24_4
2606 ; X86-BMI1NOTBM-NEXT: # %bb.3:
2607 ; X86-BMI1NOTBM-NEXT: movl %ebx, %edi
2608 ; X86-BMI1NOTBM-NEXT: xorl %ebx, %ebx
2609 ; X86-BMI1NOTBM-NEXT: .LBB24_4:
2610 ; X86-BMI1NOTBM-NEXT: andnl %edx, %edi, %edx
2611 ; X86-BMI1NOTBM-NEXT: andnl %esi, %ebx, %eax
2612 ; X86-BMI1NOTBM-NEXT: popl %esi
2613 ; X86-BMI1NOTBM-NEXT: popl %edi
2614 ; X86-BMI1NOTBM-NEXT: popl %ebx
2615 ; X86-BMI1NOTBM-NEXT: retl
2617 ; X86-BMI1BMI2-LABEL: bextr64_b0:
2618 ; X86-BMI1BMI2: # %bb.0:
2619 ; X86-BMI1BMI2-NEXT: pushl %ebx
2620 ; X86-BMI1BMI2-NEXT: pushl %edi
2621 ; X86-BMI1BMI2-NEXT: pushl %esi
2622 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
2623 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
2624 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
2625 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
2626 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edx, %esi
2627 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %edx, %edx
2628 ; X86-BMI1BMI2-NEXT: testb $32, %cl
2629 ; X86-BMI1BMI2-NEXT: je .LBB24_2
2630 ; X86-BMI1BMI2-NEXT: # %bb.1:
2631 ; X86-BMI1BMI2-NEXT: movl %edx, %esi
2632 ; X86-BMI1BMI2-NEXT: xorl %edx, %edx
2633 ; X86-BMI1BMI2-NEXT: .LBB24_2:
2634 ; X86-BMI1BMI2-NEXT: movl $-1, %edi
2635 ; X86-BMI1BMI2-NEXT: shlxl %eax, %edi, %ebx
2636 ; X86-BMI1BMI2-NEXT: movl %eax, %ecx
2637 ; X86-BMI1BMI2-NEXT: shldl %cl, %edi, %edi
2638 ; X86-BMI1BMI2-NEXT: testb $32, %al
2639 ; X86-BMI1BMI2-NEXT: je .LBB24_4
2640 ; X86-BMI1BMI2-NEXT: # %bb.3:
2641 ; X86-BMI1BMI2-NEXT: movl %ebx, %edi
2642 ; X86-BMI1BMI2-NEXT: xorl %ebx, %ebx
2643 ; X86-BMI1BMI2-NEXT: .LBB24_4:
2644 ; X86-BMI1BMI2-NEXT: andnl %edx, %edi, %edx
2645 ; X86-BMI1BMI2-NEXT: andnl %esi, %ebx, %eax
2646 ; X86-BMI1BMI2-NEXT: popl %esi
2647 ; X86-BMI1BMI2-NEXT: popl %edi
2648 ; X86-BMI1BMI2-NEXT: popl %ebx
2649 ; X86-BMI1BMI2-NEXT: retl
2651 ; X64-NOBMI-LABEL: bextr64_b0:
2652 ; X64-NOBMI: # %bb.0:
2653 ; X64-NOBMI-NEXT: movq %rsi, %rcx
2654 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
2655 ; X64-NOBMI-NEXT: shrq %cl, %rdi
2656 ; X64-NOBMI-NEXT: movq $-1, %rax
2657 ; X64-NOBMI-NEXT: movl %edx, %ecx
2658 ; X64-NOBMI-NEXT: shlq %cl, %rax
2659 ; X64-NOBMI-NEXT: notq %rax
2660 ; X64-NOBMI-NEXT: andq %rdi, %rax
2661 ; X64-NOBMI-NEXT: retq
2663 ; X64-BMI1NOTBM-LABEL: bextr64_b0:
2664 ; X64-BMI1NOTBM: # %bb.0:
2665 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
2666 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
2667 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
2668 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
2669 ; X64-BMI1NOTBM-NEXT: retq
2671 ; X64-BMI1BMI2-LABEL: bextr64_b0:
2672 ; X64-BMI1BMI2: # %bb.0:
2673 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
2674 ; X64-BMI1BMI2-NEXT: bzhiq %rdx, %rax, %rax
2675 ; X64-BMI1BMI2-NEXT: retq
2676 %shifted = lshr i64 %val, %numskipbits
2677 %notmask = shl i64 -1, %numlowbits
2678 %mask = xor i64 %notmask, -1
2679 %masked = and i64 %mask, %shifted
2683 define i64 @bextr64_b1_indexzext(i64 %val, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {
2684 ; X86-NOBMI-LABEL: bextr64_b1_indexzext:
2685 ; X86-NOBMI: # %bb.0:
2686 ; X86-NOBMI-NEXT: pushl %edi
2687 ; X86-NOBMI-NEXT: pushl %esi
2688 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %ch
2689 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
2690 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
2691 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
2692 ; X86-NOBMI-NEXT: movl %eax, %edi
2693 ; X86-NOBMI-NEXT: shrl %cl, %edi
2694 ; X86-NOBMI-NEXT: shrdl %cl, %eax, %esi
2695 ; X86-NOBMI-NEXT: testb $32, %cl
2696 ; X86-NOBMI-NEXT: je .LBB25_2
2697 ; X86-NOBMI-NEXT: # %bb.1:
2698 ; X86-NOBMI-NEXT: movl %edi, %esi
2699 ; X86-NOBMI-NEXT: xorl %edi, %edi
2700 ; X86-NOBMI-NEXT: .LBB25_2:
2701 ; X86-NOBMI-NEXT: movl $-1, %edx
2702 ; X86-NOBMI-NEXT: movl $-1, %eax
2703 ; X86-NOBMI-NEXT: movb %ch, %cl
2704 ; X86-NOBMI-NEXT: shll %cl, %eax
2705 ; X86-NOBMI-NEXT: shldl %cl, %edx, %edx
2706 ; X86-NOBMI-NEXT: testb $32, %ch
2707 ; X86-NOBMI-NEXT: je .LBB25_4
2708 ; X86-NOBMI-NEXT: # %bb.3:
2709 ; X86-NOBMI-NEXT: movl %eax, %edx
2710 ; X86-NOBMI-NEXT: xorl %eax, %eax
2711 ; X86-NOBMI-NEXT: .LBB25_4:
2712 ; X86-NOBMI-NEXT: notl %edx
2713 ; X86-NOBMI-NEXT: andl %edi, %edx
2714 ; X86-NOBMI-NEXT: notl %eax
2715 ; X86-NOBMI-NEXT: andl %esi, %eax
2716 ; X86-NOBMI-NEXT: popl %esi
2717 ; X86-NOBMI-NEXT: popl %edi
2718 ; X86-NOBMI-NEXT: retl
2720 ; X86-BMI1NOTBM-LABEL: bextr64_b1_indexzext:
2721 ; X86-BMI1NOTBM: # %bb.0:
2722 ; X86-BMI1NOTBM-NEXT: pushl %ebx
2723 ; X86-BMI1NOTBM-NEXT: pushl %edi
2724 ; X86-BMI1NOTBM-NEXT: pushl %esi
2725 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
2726 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
2727 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
2728 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
2729 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
2730 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
2731 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
2732 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
2733 ; X86-BMI1NOTBM-NEXT: je .LBB25_2
2734 ; X86-BMI1NOTBM-NEXT: # %bb.1:
2735 ; X86-BMI1NOTBM-NEXT: movl %edx, %esi
2736 ; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
2737 ; X86-BMI1NOTBM-NEXT: .LBB25_2:
2738 ; X86-BMI1NOTBM-NEXT: movl $-1, %edi
2739 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
2740 ; X86-BMI1NOTBM-NEXT: movl %eax, %ecx
2741 ; X86-BMI1NOTBM-NEXT: shll %cl, %ebx
2742 ; X86-BMI1NOTBM-NEXT: shldl %cl, %edi, %edi
2743 ; X86-BMI1NOTBM-NEXT: testb $32, %al
2744 ; X86-BMI1NOTBM-NEXT: je .LBB25_4
2745 ; X86-BMI1NOTBM-NEXT: # %bb.3:
2746 ; X86-BMI1NOTBM-NEXT: movl %ebx, %edi
2747 ; X86-BMI1NOTBM-NEXT: xorl %ebx, %ebx
2748 ; X86-BMI1NOTBM-NEXT: .LBB25_4:
2749 ; X86-BMI1NOTBM-NEXT: andnl %edx, %edi, %edx
2750 ; X86-BMI1NOTBM-NEXT: andnl %esi, %ebx, %eax
2751 ; X86-BMI1NOTBM-NEXT: popl %esi
2752 ; X86-BMI1NOTBM-NEXT: popl %edi
2753 ; X86-BMI1NOTBM-NEXT: popl %ebx
2754 ; X86-BMI1NOTBM-NEXT: retl
2756 ; X86-BMI1BMI2-LABEL: bextr64_b1_indexzext:
2757 ; X86-BMI1BMI2: # %bb.0:
2758 ; X86-BMI1BMI2-NEXT: pushl %ebx
2759 ; X86-BMI1BMI2-NEXT: pushl %edi
2760 ; X86-BMI1BMI2-NEXT: pushl %esi
2761 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
2762 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
2763 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
2764 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
2765 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edx, %esi
2766 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %edx, %edx
2767 ; X86-BMI1BMI2-NEXT: testb $32, %cl
2768 ; X86-BMI1BMI2-NEXT: je .LBB25_2
2769 ; X86-BMI1BMI2-NEXT: # %bb.1:
2770 ; X86-BMI1BMI2-NEXT: movl %edx, %esi
2771 ; X86-BMI1BMI2-NEXT: xorl %edx, %edx
2772 ; X86-BMI1BMI2-NEXT: .LBB25_2:
2773 ; X86-BMI1BMI2-NEXT: movl $-1, %edi
2774 ; X86-BMI1BMI2-NEXT: shlxl %eax, %edi, %ebx
2775 ; X86-BMI1BMI2-NEXT: movl %eax, %ecx
2776 ; X86-BMI1BMI2-NEXT: shldl %cl, %edi, %edi
2777 ; X86-BMI1BMI2-NEXT: testb $32, %al
2778 ; X86-BMI1BMI2-NEXT: je .LBB25_4
2779 ; X86-BMI1BMI2-NEXT: # %bb.3:
2780 ; X86-BMI1BMI2-NEXT: movl %ebx, %edi
2781 ; X86-BMI1BMI2-NEXT: xorl %ebx, %ebx
2782 ; X86-BMI1BMI2-NEXT: .LBB25_4:
2783 ; X86-BMI1BMI2-NEXT: andnl %edx, %edi, %edx
2784 ; X86-BMI1BMI2-NEXT: andnl %esi, %ebx, %eax
2785 ; X86-BMI1BMI2-NEXT: popl %esi
2786 ; X86-BMI1BMI2-NEXT: popl %edi
2787 ; X86-BMI1BMI2-NEXT: popl %ebx
2788 ; X86-BMI1BMI2-NEXT: retl
2790 ; X64-NOBMI-LABEL: bextr64_b1_indexzext:
2791 ; X64-NOBMI: # %bb.0:
2792 ; X64-NOBMI-NEXT: movl %esi, %ecx
2793 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
2794 ; X64-NOBMI-NEXT: shrq %cl, %rdi
2795 ; X64-NOBMI-NEXT: movq $-1, %rax
2796 ; X64-NOBMI-NEXT: movl %edx, %ecx
2797 ; X64-NOBMI-NEXT: shlq %cl, %rax
2798 ; X64-NOBMI-NEXT: notq %rax
2799 ; X64-NOBMI-NEXT: andq %rdi, %rax
2800 ; X64-NOBMI-NEXT: retq
2802 ; X64-BMI1NOTBM-LABEL: bextr64_b1_indexzext:
2803 ; X64-BMI1NOTBM: # %bb.0:
2804 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
2805 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
2806 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
2807 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
2808 ; X64-BMI1NOTBM-NEXT: retq
2810 ; X64-BMI1BMI2-LABEL: bextr64_b1_indexzext:
2811 ; X64-BMI1BMI2: # %bb.0:
2812 ; X64-BMI1BMI2-NEXT: # kill: def $edx killed $edx def $rdx
2813 ; X64-BMI1BMI2-NEXT: # kill: def $esi killed $esi def $rsi
2814 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
2815 ; X64-BMI1BMI2-NEXT: bzhiq %rdx, %rax, %rax
2816 ; X64-BMI1BMI2-NEXT: retq
2817 %skip = zext i8 %numskipbits to i64
2818 %shifted = lshr i64 %val, %skip
2819 %conv = zext i8 %numlowbits to i64
2820 %notmask = shl i64 -1, %conv
2821 %mask = xor i64 %notmask, -1
2822 %masked = and i64 %mask, %shifted
2826 define i64 @bextr64_b2_load(i64* %w, i64 %numskipbits, i64 %numlowbits) nounwind {
2827 ; X86-NOBMI-LABEL: bextr64_b2_load:
2828 ; X86-NOBMI: # %bb.0:
2829 ; X86-NOBMI-NEXT: pushl %edi
2830 ; X86-NOBMI-NEXT: pushl %esi
2831 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %ch
2832 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
2833 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
2834 ; X86-NOBMI-NEXT: movl (%eax), %esi
2835 ; X86-NOBMI-NEXT: movl 4(%eax), %eax
2836 ; X86-NOBMI-NEXT: movl %eax, %edi
2837 ; X86-NOBMI-NEXT: shrl %cl, %edi
2838 ; X86-NOBMI-NEXT: shrdl %cl, %eax, %esi
2839 ; X86-NOBMI-NEXT: testb $32, %cl
2840 ; X86-NOBMI-NEXT: je .LBB26_2
2841 ; X86-NOBMI-NEXT: # %bb.1:
2842 ; X86-NOBMI-NEXT: movl %edi, %esi
2843 ; X86-NOBMI-NEXT: xorl %edi, %edi
2844 ; X86-NOBMI-NEXT: .LBB26_2:
2845 ; X86-NOBMI-NEXT: movl $-1, %edx
2846 ; X86-NOBMI-NEXT: movl $-1, %eax
2847 ; X86-NOBMI-NEXT: movb %ch, %cl
2848 ; X86-NOBMI-NEXT: shll %cl, %eax
2849 ; X86-NOBMI-NEXT: shldl %cl, %edx, %edx
2850 ; X86-NOBMI-NEXT: testb $32, %ch
2851 ; X86-NOBMI-NEXT: je .LBB26_4
2852 ; X86-NOBMI-NEXT: # %bb.3:
2853 ; X86-NOBMI-NEXT: movl %eax, %edx
2854 ; X86-NOBMI-NEXT: xorl %eax, %eax
2855 ; X86-NOBMI-NEXT: .LBB26_4:
2856 ; X86-NOBMI-NEXT: notl %edx
2857 ; X86-NOBMI-NEXT: andl %edi, %edx
2858 ; X86-NOBMI-NEXT: notl %eax
2859 ; X86-NOBMI-NEXT: andl %esi, %eax
2860 ; X86-NOBMI-NEXT: popl %esi
2861 ; X86-NOBMI-NEXT: popl %edi
2862 ; X86-NOBMI-NEXT: retl
2864 ; X86-BMI1NOTBM-LABEL: bextr64_b2_load:
2865 ; X86-BMI1NOTBM: # %bb.0:
2866 ; X86-BMI1NOTBM-NEXT: pushl %ebx
2867 ; X86-BMI1NOTBM-NEXT: pushl %edi
2868 ; X86-BMI1NOTBM-NEXT: pushl %esi
2869 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
2870 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
2871 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx
2872 ; X86-BMI1NOTBM-NEXT: movl (%edx), %esi
2873 ; X86-BMI1NOTBM-NEXT: movl 4(%edx), %edi
2874 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
2875 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
2876 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
2877 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
2878 ; X86-BMI1NOTBM-NEXT: je .LBB26_2
2879 ; X86-BMI1NOTBM-NEXT: # %bb.1:
2880 ; X86-BMI1NOTBM-NEXT: movl %edx, %esi
2881 ; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
2882 ; X86-BMI1NOTBM-NEXT: .LBB26_2:
2883 ; X86-BMI1NOTBM-NEXT: movl $-1, %edi
2884 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
2885 ; X86-BMI1NOTBM-NEXT: movl %eax, %ecx
2886 ; X86-BMI1NOTBM-NEXT: shll %cl, %ebx
2887 ; X86-BMI1NOTBM-NEXT: shldl %cl, %edi, %edi
2888 ; X86-BMI1NOTBM-NEXT: testb $32, %al
2889 ; X86-BMI1NOTBM-NEXT: je .LBB26_4
2890 ; X86-BMI1NOTBM-NEXT: # %bb.3:
2891 ; X86-BMI1NOTBM-NEXT: movl %ebx, %edi
2892 ; X86-BMI1NOTBM-NEXT: xorl %ebx, %ebx
2893 ; X86-BMI1NOTBM-NEXT: .LBB26_4:
2894 ; X86-BMI1NOTBM-NEXT: andnl %edx, %edi, %edx
2895 ; X86-BMI1NOTBM-NEXT: andnl %esi, %ebx, %eax
2896 ; X86-BMI1NOTBM-NEXT: popl %esi
2897 ; X86-BMI1NOTBM-NEXT: popl %edi
2898 ; X86-BMI1NOTBM-NEXT: popl %ebx
2899 ; X86-BMI1NOTBM-NEXT: retl
2901 ; X86-BMI1BMI2-LABEL: bextr64_b2_load:
2902 ; X86-BMI1BMI2: # %bb.0:
2903 ; X86-BMI1BMI2-NEXT: pushl %ebx
2904 ; X86-BMI1BMI2-NEXT: pushl %edi
2905 ; X86-BMI1BMI2-NEXT: pushl %esi
2906 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
2907 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
2908 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
2909 ; X86-BMI1BMI2-NEXT: movl (%edx), %esi
2910 ; X86-BMI1BMI2-NEXT: movl 4(%edx), %edi
2911 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %edi, %edx
2912 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edi, %esi
2913 ; X86-BMI1BMI2-NEXT: testb $32, %cl
2914 ; X86-BMI1BMI2-NEXT: je .LBB26_2
2915 ; X86-BMI1BMI2-NEXT: # %bb.1:
2916 ; X86-BMI1BMI2-NEXT: movl %edx, %esi
2917 ; X86-BMI1BMI2-NEXT: xorl %edx, %edx
2918 ; X86-BMI1BMI2-NEXT: .LBB26_2:
2919 ; X86-BMI1BMI2-NEXT: movl $-1, %edi
2920 ; X86-BMI1BMI2-NEXT: shlxl %eax, %edi, %ebx
2921 ; X86-BMI1BMI2-NEXT: movl %eax, %ecx
2922 ; X86-BMI1BMI2-NEXT: shldl %cl, %edi, %edi
2923 ; X86-BMI1BMI2-NEXT: testb $32, %al
2924 ; X86-BMI1BMI2-NEXT: je .LBB26_4
2925 ; X86-BMI1BMI2-NEXT: # %bb.3:
2926 ; X86-BMI1BMI2-NEXT: movl %ebx, %edi
2927 ; X86-BMI1BMI2-NEXT: xorl %ebx, %ebx
2928 ; X86-BMI1BMI2-NEXT: .LBB26_4:
2929 ; X86-BMI1BMI2-NEXT: andnl %edx, %edi, %edx
2930 ; X86-BMI1BMI2-NEXT: andnl %esi, %ebx, %eax
2931 ; X86-BMI1BMI2-NEXT: popl %esi
2932 ; X86-BMI1BMI2-NEXT: popl %edi
2933 ; X86-BMI1BMI2-NEXT: popl %ebx
2934 ; X86-BMI1BMI2-NEXT: retl
2936 ; X64-NOBMI-LABEL: bextr64_b2_load:
2937 ; X64-NOBMI: # %bb.0:
2938 ; X64-NOBMI-NEXT: movq %rsi, %rcx
2939 ; X64-NOBMI-NEXT: movq (%rdi), %rsi
2940 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
2941 ; X64-NOBMI-NEXT: shrq %cl, %rsi
2942 ; X64-NOBMI-NEXT: movq $-1, %rax
2943 ; X64-NOBMI-NEXT: movl %edx, %ecx
2944 ; X64-NOBMI-NEXT: shlq %cl, %rax
2945 ; X64-NOBMI-NEXT: notq %rax
2946 ; X64-NOBMI-NEXT: andq %rsi, %rax
2947 ; X64-NOBMI-NEXT: retq
2949 ; X64-BMI1NOTBM-LABEL: bextr64_b2_load:
2950 ; X64-BMI1NOTBM: # %bb.0:
2951 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
2952 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
2953 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
2954 ; X64-BMI1NOTBM-NEXT: bextrq %rax, (%rdi), %rax
2955 ; X64-BMI1NOTBM-NEXT: retq
2957 ; X64-BMI1BMI2-LABEL: bextr64_b2_load:
2958 ; X64-BMI1BMI2: # %bb.0:
2959 ; X64-BMI1BMI2-NEXT: shrxq %rsi, (%rdi), %rax
2960 ; X64-BMI1BMI2-NEXT: bzhiq %rdx, %rax, %rax
2961 ; X64-BMI1BMI2-NEXT: retq
2962 %val = load i64, i64* %w
2963 %shifted = lshr i64 %val, %numskipbits
2964 %notmask = shl i64 -1, %numlowbits
2965 %mask = xor i64 %notmask, -1
2966 %masked = and i64 %mask, %shifted
2970 define i64 @bextr64_b3_load_indexzext(i64* %w, i8 zeroext %numskipbits, i8 zeroext %numlowbits) nounwind {
2971 ; X86-NOBMI-LABEL: bextr64_b3_load_indexzext:
2972 ; X86-NOBMI: # %bb.0:
2973 ; X86-NOBMI-NEXT: pushl %edi
2974 ; X86-NOBMI-NEXT: pushl %esi
2975 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %ch
2976 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
2977 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
2978 ; X86-NOBMI-NEXT: movl (%eax), %esi
2979 ; X86-NOBMI-NEXT: movl 4(%eax), %eax
2980 ; X86-NOBMI-NEXT: movl %eax, %edi
2981 ; X86-NOBMI-NEXT: shrl %cl, %edi
2982 ; X86-NOBMI-NEXT: shrdl %cl, %eax, %esi
2983 ; X86-NOBMI-NEXT: testb $32, %cl
2984 ; X86-NOBMI-NEXT: je .LBB27_2
2985 ; X86-NOBMI-NEXT: # %bb.1:
2986 ; X86-NOBMI-NEXT: movl %edi, %esi
2987 ; X86-NOBMI-NEXT: xorl %edi, %edi
2988 ; X86-NOBMI-NEXT: .LBB27_2:
2989 ; X86-NOBMI-NEXT: movl $-1, %edx
2990 ; X86-NOBMI-NEXT: movl $-1, %eax
2991 ; X86-NOBMI-NEXT: movb %ch, %cl
2992 ; X86-NOBMI-NEXT: shll %cl, %eax
2993 ; X86-NOBMI-NEXT: shldl %cl, %edx, %edx
2994 ; X86-NOBMI-NEXT: testb $32, %ch
2995 ; X86-NOBMI-NEXT: je .LBB27_4
2996 ; X86-NOBMI-NEXT: # %bb.3:
2997 ; X86-NOBMI-NEXT: movl %eax, %edx
2998 ; X86-NOBMI-NEXT: xorl %eax, %eax
2999 ; X86-NOBMI-NEXT: .LBB27_4:
3000 ; X86-NOBMI-NEXT: notl %edx
3001 ; X86-NOBMI-NEXT: andl %edi, %edx
3002 ; X86-NOBMI-NEXT: notl %eax
3003 ; X86-NOBMI-NEXT: andl %esi, %eax
3004 ; X86-NOBMI-NEXT: popl %esi
3005 ; X86-NOBMI-NEXT: popl %edi
3006 ; X86-NOBMI-NEXT: retl
3008 ; X86-BMI1NOTBM-LABEL: bextr64_b3_load_indexzext:
3009 ; X86-BMI1NOTBM: # %bb.0:
3010 ; X86-BMI1NOTBM-NEXT: pushl %ebx
3011 ; X86-BMI1NOTBM-NEXT: pushl %edi
3012 ; X86-BMI1NOTBM-NEXT: pushl %esi
3013 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
3014 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
3015 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx
3016 ; X86-BMI1NOTBM-NEXT: movl (%edx), %esi
3017 ; X86-BMI1NOTBM-NEXT: movl 4(%edx), %edi
3018 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
3019 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
3020 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
3021 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
3022 ; X86-BMI1NOTBM-NEXT: je .LBB27_2
3023 ; X86-BMI1NOTBM-NEXT: # %bb.1:
3024 ; X86-BMI1NOTBM-NEXT: movl %edx, %esi
3025 ; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
3026 ; X86-BMI1NOTBM-NEXT: .LBB27_2:
3027 ; X86-BMI1NOTBM-NEXT: movl $-1, %edi
3028 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
3029 ; X86-BMI1NOTBM-NEXT: movl %eax, %ecx
3030 ; X86-BMI1NOTBM-NEXT: shll %cl, %ebx
3031 ; X86-BMI1NOTBM-NEXT: shldl %cl, %edi, %edi
3032 ; X86-BMI1NOTBM-NEXT: testb $32, %al
3033 ; X86-BMI1NOTBM-NEXT: je .LBB27_4
3034 ; X86-BMI1NOTBM-NEXT: # %bb.3:
3035 ; X86-BMI1NOTBM-NEXT: movl %ebx, %edi
3036 ; X86-BMI1NOTBM-NEXT: xorl %ebx, %ebx
3037 ; X86-BMI1NOTBM-NEXT: .LBB27_4:
3038 ; X86-BMI1NOTBM-NEXT: andnl %edx, %edi, %edx
3039 ; X86-BMI1NOTBM-NEXT: andnl %esi, %ebx, %eax
3040 ; X86-BMI1NOTBM-NEXT: popl %esi
3041 ; X86-BMI1NOTBM-NEXT: popl %edi
3042 ; X86-BMI1NOTBM-NEXT: popl %ebx
3043 ; X86-BMI1NOTBM-NEXT: retl
3045 ; X86-BMI1BMI2-LABEL: bextr64_b3_load_indexzext:
3046 ; X86-BMI1BMI2: # %bb.0:
3047 ; X86-BMI1BMI2-NEXT: pushl %ebx
3048 ; X86-BMI1BMI2-NEXT: pushl %edi
3049 ; X86-BMI1BMI2-NEXT: pushl %esi
3050 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
3051 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
3052 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
3053 ; X86-BMI1BMI2-NEXT: movl (%edx), %esi
3054 ; X86-BMI1BMI2-NEXT: movl 4(%edx), %edi
3055 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %edi, %edx
3056 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edi, %esi
3057 ; X86-BMI1BMI2-NEXT: testb $32, %cl
3058 ; X86-BMI1BMI2-NEXT: je .LBB27_2
3059 ; X86-BMI1BMI2-NEXT: # %bb.1:
3060 ; X86-BMI1BMI2-NEXT: movl %edx, %esi
3061 ; X86-BMI1BMI2-NEXT: xorl %edx, %edx
3062 ; X86-BMI1BMI2-NEXT: .LBB27_2:
3063 ; X86-BMI1BMI2-NEXT: movl $-1, %edi
3064 ; X86-BMI1BMI2-NEXT: shlxl %eax, %edi, %ebx
3065 ; X86-BMI1BMI2-NEXT: movl %eax, %ecx
3066 ; X86-BMI1BMI2-NEXT: shldl %cl, %edi, %edi
3067 ; X86-BMI1BMI2-NEXT: testb $32, %al
3068 ; X86-BMI1BMI2-NEXT: je .LBB27_4
3069 ; X86-BMI1BMI2-NEXT: # %bb.3:
3070 ; X86-BMI1BMI2-NEXT: movl %ebx, %edi
3071 ; X86-BMI1BMI2-NEXT: xorl %ebx, %ebx
3072 ; X86-BMI1BMI2-NEXT: .LBB27_4:
3073 ; X86-BMI1BMI2-NEXT: andnl %edx, %edi, %edx
3074 ; X86-BMI1BMI2-NEXT: andnl %esi, %ebx, %eax
3075 ; X86-BMI1BMI2-NEXT: popl %esi
3076 ; X86-BMI1BMI2-NEXT: popl %edi
3077 ; X86-BMI1BMI2-NEXT: popl %ebx
3078 ; X86-BMI1BMI2-NEXT: retl
3080 ; X64-NOBMI-LABEL: bextr64_b3_load_indexzext:
3081 ; X64-NOBMI: # %bb.0:
3082 ; X64-NOBMI-NEXT: movl %esi, %ecx
3083 ; X64-NOBMI-NEXT: movq (%rdi), %rsi
3084 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
3085 ; X64-NOBMI-NEXT: shrq %cl, %rsi
3086 ; X64-NOBMI-NEXT: movq $-1, %rax
3087 ; X64-NOBMI-NEXT: movl %edx, %ecx
3088 ; X64-NOBMI-NEXT: shlq %cl, %rax
3089 ; X64-NOBMI-NEXT: notq %rax
3090 ; X64-NOBMI-NEXT: andq %rsi, %rax
3091 ; X64-NOBMI-NEXT: retq
3093 ; X64-BMI1NOTBM-LABEL: bextr64_b3_load_indexzext:
3094 ; X64-BMI1NOTBM: # %bb.0:
3095 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
3096 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
3097 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
3098 ; X64-BMI1NOTBM-NEXT: bextrq %rax, (%rdi), %rax
3099 ; X64-BMI1NOTBM-NEXT: retq
3101 ; X64-BMI1BMI2-LABEL: bextr64_b3_load_indexzext:
3102 ; X64-BMI1BMI2: # %bb.0:
3103 ; X64-BMI1BMI2-NEXT: # kill: def $edx killed $edx def $rdx
3104 ; X64-BMI1BMI2-NEXT: # kill: def $esi killed $esi def $rsi
3105 ; X64-BMI1BMI2-NEXT: shrxq %rsi, (%rdi), %rax
3106 ; X64-BMI1BMI2-NEXT: bzhiq %rdx, %rax, %rax
3107 ; X64-BMI1BMI2-NEXT: retq
3108 %val = load i64, i64* %w
3109 %skip = zext i8 %numskipbits to i64
3110 %shifted = lshr i64 %val, %skip
3111 %conv = zext i8 %numlowbits to i64
3112 %notmask = shl i64 -1, %conv
3113 %mask = xor i64 %notmask, -1
3114 %masked = and i64 %mask, %shifted
3118 define i64 @bextr64_b4_commutative(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
3119 ; X86-NOBMI-LABEL: bextr64_b4_commutative:
3120 ; X86-NOBMI: # %bb.0:
3121 ; X86-NOBMI-NEXT: pushl %edi
3122 ; X86-NOBMI-NEXT: pushl %esi
3123 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %ch
3124 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
3125 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
3126 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
3127 ; X86-NOBMI-NEXT: movl %esi, %edx
3128 ; X86-NOBMI-NEXT: shrl %cl, %edx
3129 ; X86-NOBMI-NEXT: shrdl %cl, %esi, %eax
3130 ; X86-NOBMI-NEXT: testb $32, %cl
3131 ; X86-NOBMI-NEXT: je .LBB28_2
3132 ; X86-NOBMI-NEXT: # %bb.1:
3133 ; X86-NOBMI-NEXT: movl %edx, %eax
3134 ; X86-NOBMI-NEXT: xorl %edx, %edx
3135 ; X86-NOBMI-NEXT: .LBB28_2:
3136 ; X86-NOBMI-NEXT: movl $-1, %edi
3137 ; X86-NOBMI-NEXT: movl $-1, %esi
3138 ; X86-NOBMI-NEXT: movb %ch, %cl
3139 ; X86-NOBMI-NEXT: shll %cl, %esi
3140 ; X86-NOBMI-NEXT: shldl %cl, %edi, %edi
3141 ; X86-NOBMI-NEXT: testb $32, %ch
3142 ; X86-NOBMI-NEXT: je .LBB28_4
3143 ; X86-NOBMI-NEXT: # %bb.3:
3144 ; X86-NOBMI-NEXT: movl %esi, %edi
3145 ; X86-NOBMI-NEXT: xorl %esi, %esi
3146 ; X86-NOBMI-NEXT: .LBB28_4:
3147 ; X86-NOBMI-NEXT: notl %edi
3148 ; X86-NOBMI-NEXT: andl %edi, %edx
3149 ; X86-NOBMI-NEXT: notl %esi
3150 ; X86-NOBMI-NEXT: andl %esi, %eax
3151 ; X86-NOBMI-NEXT: popl %esi
3152 ; X86-NOBMI-NEXT: popl %edi
3153 ; X86-NOBMI-NEXT: retl
3155 ; X86-BMI1NOTBM-LABEL: bextr64_b4_commutative:
3156 ; X86-BMI1NOTBM: # %bb.0:
3157 ; X86-BMI1NOTBM-NEXT: pushl %ebx
3158 ; X86-BMI1NOTBM-NEXT: pushl %edi
3159 ; X86-BMI1NOTBM-NEXT: pushl %esi
3160 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
3161 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
3162 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
3163 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
3164 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
3165 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
3166 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
3167 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
3168 ; X86-BMI1NOTBM-NEXT: je .LBB28_2
3169 ; X86-BMI1NOTBM-NEXT: # %bb.1:
3170 ; X86-BMI1NOTBM-NEXT: movl %edx, %esi
3171 ; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
3172 ; X86-BMI1NOTBM-NEXT: .LBB28_2:
3173 ; X86-BMI1NOTBM-NEXT: movl $-1, %edi
3174 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
3175 ; X86-BMI1NOTBM-NEXT: movl %eax, %ecx
3176 ; X86-BMI1NOTBM-NEXT: shll %cl, %ebx
3177 ; X86-BMI1NOTBM-NEXT: shldl %cl, %edi, %edi
3178 ; X86-BMI1NOTBM-NEXT: testb $32, %al
3179 ; X86-BMI1NOTBM-NEXT: je .LBB28_4
3180 ; X86-BMI1NOTBM-NEXT: # %bb.3:
3181 ; X86-BMI1NOTBM-NEXT: movl %ebx, %edi
3182 ; X86-BMI1NOTBM-NEXT: xorl %ebx, %ebx
3183 ; X86-BMI1NOTBM-NEXT: .LBB28_4:
3184 ; X86-BMI1NOTBM-NEXT: andnl %edx, %edi, %edx
3185 ; X86-BMI1NOTBM-NEXT: andnl %esi, %ebx, %eax
3186 ; X86-BMI1NOTBM-NEXT: popl %esi
3187 ; X86-BMI1NOTBM-NEXT: popl %edi
3188 ; X86-BMI1NOTBM-NEXT: popl %ebx
3189 ; X86-BMI1NOTBM-NEXT: retl
3191 ; X86-BMI1BMI2-LABEL: bextr64_b4_commutative:
3192 ; X86-BMI1BMI2: # %bb.0:
3193 ; X86-BMI1BMI2-NEXT: pushl %ebx
3194 ; X86-BMI1BMI2-NEXT: pushl %edi
3195 ; X86-BMI1BMI2-NEXT: pushl %esi
3196 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
3197 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
3198 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
3199 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
3200 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edx, %esi
3201 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %edx, %edx
3202 ; X86-BMI1BMI2-NEXT: testb $32, %cl
3203 ; X86-BMI1BMI2-NEXT: je .LBB28_2
3204 ; X86-BMI1BMI2-NEXT: # %bb.1:
3205 ; X86-BMI1BMI2-NEXT: movl %edx, %esi
3206 ; X86-BMI1BMI2-NEXT: xorl %edx, %edx
3207 ; X86-BMI1BMI2-NEXT: .LBB28_2:
3208 ; X86-BMI1BMI2-NEXT: movl $-1, %edi
3209 ; X86-BMI1BMI2-NEXT: shlxl %eax, %edi, %ebx
3210 ; X86-BMI1BMI2-NEXT: movl %eax, %ecx
3211 ; X86-BMI1BMI2-NEXT: shldl %cl, %edi, %edi
3212 ; X86-BMI1BMI2-NEXT: testb $32, %al
3213 ; X86-BMI1BMI2-NEXT: je .LBB28_4
3214 ; X86-BMI1BMI2-NEXT: # %bb.3:
3215 ; X86-BMI1BMI2-NEXT: movl %ebx, %edi
3216 ; X86-BMI1BMI2-NEXT: xorl %ebx, %ebx
3217 ; X86-BMI1BMI2-NEXT: .LBB28_4:
3218 ; X86-BMI1BMI2-NEXT: andnl %edx, %edi, %edx
3219 ; X86-BMI1BMI2-NEXT: andnl %esi, %ebx, %eax
3220 ; X86-BMI1BMI2-NEXT: popl %esi
3221 ; X86-BMI1BMI2-NEXT: popl %edi
3222 ; X86-BMI1BMI2-NEXT: popl %ebx
3223 ; X86-BMI1BMI2-NEXT: retl
3225 ; X64-NOBMI-LABEL: bextr64_b4_commutative:
3226 ; X64-NOBMI: # %bb.0:
3227 ; X64-NOBMI-NEXT: movq %rsi, %rcx
3228 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
3229 ; X64-NOBMI-NEXT: shrq %cl, %rdi
3230 ; X64-NOBMI-NEXT: movq $-1, %rax
3231 ; X64-NOBMI-NEXT: movl %edx, %ecx
3232 ; X64-NOBMI-NEXT: shlq %cl, %rax
3233 ; X64-NOBMI-NEXT: notq %rax
3234 ; X64-NOBMI-NEXT: andq %rdi, %rax
3235 ; X64-NOBMI-NEXT: retq
3237 ; X64-BMI1NOTBM-LABEL: bextr64_b4_commutative:
3238 ; X64-BMI1NOTBM: # %bb.0:
3239 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
3240 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
3241 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
3242 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
3243 ; X64-BMI1NOTBM-NEXT: retq
3245 ; X64-BMI1BMI2-LABEL: bextr64_b4_commutative:
3246 ; X64-BMI1BMI2: # %bb.0:
3247 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
3248 ; X64-BMI1BMI2-NEXT: bzhiq %rdx, %rax, %rax
3249 ; X64-BMI1BMI2-NEXT: retq
3250 %shifted = lshr i64 %val, %numskipbits
3251 %notmask = shl i64 -1, %numlowbits
3252 %mask = xor i64 %notmask, -1
3253 %masked = and i64 %shifted, %mask ; swapped order
3257 define i64 @bextr64_b5_skipextrauses(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
3258 ; X86-NOBMI-LABEL: bextr64_b5_skipextrauses:
3259 ; X86-NOBMI: # %bb.0:
3260 ; X86-NOBMI-NEXT: pushl %ebp
3261 ; X86-NOBMI-NEXT: pushl %ebx
3262 ; X86-NOBMI-NEXT: pushl %edi
3263 ; X86-NOBMI-NEXT: pushl %esi
3264 ; X86-NOBMI-NEXT: subl $12, %esp
3265 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %dl
3266 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ebx
3267 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
3268 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
3269 ; X86-NOBMI-NEXT: movl %esi, %ebp
3270 ; X86-NOBMI-NEXT: movl %eax, %ecx
3271 ; X86-NOBMI-NEXT: shrl %cl, %ebp
3272 ; X86-NOBMI-NEXT: shrdl %cl, %esi, %ebx
3273 ; X86-NOBMI-NEXT: testb $32, %al
3274 ; X86-NOBMI-NEXT: je .LBB29_2
3275 ; X86-NOBMI-NEXT: # %bb.1:
3276 ; X86-NOBMI-NEXT: movl %ebp, %ebx
3277 ; X86-NOBMI-NEXT: xorl %ebp, %ebp
3278 ; X86-NOBMI-NEXT: .LBB29_2:
3279 ; X86-NOBMI-NEXT: movl $-1, %esi
3280 ; X86-NOBMI-NEXT: movl $-1, %edi
3281 ; X86-NOBMI-NEXT: movl %edx, %ecx
3282 ; X86-NOBMI-NEXT: shll %cl, %edi
3283 ; X86-NOBMI-NEXT: shldl %cl, %esi, %esi
3284 ; X86-NOBMI-NEXT: testb $32, %dl
3285 ; X86-NOBMI-NEXT: je .LBB29_4
3286 ; X86-NOBMI-NEXT: # %bb.3:
3287 ; X86-NOBMI-NEXT: movl %edi, %esi
3288 ; X86-NOBMI-NEXT: xorl %edi, %edi
3289 ; X86-NOBMI-NEXT: .LBB29_4:
3290 ; X86-NOBMI-NEXT: notl %esi
3291 ; X86-NOBMI-NEXT: andl %ebp, %esi
3292 ; X86-NOBMI-NEXT: notl %edi
3293 ; X86-NOBMI-NEXT: andl %ebx, %edi
3294 ; X86-NOBMI-NEXT: subl $8, %esp
3295 ; X86-NOBMI-NEXT: pushl {{[0-9]+}}(%esp)
3296 ; X86-NOBMI-NEXT: pushl %eax
3297 ; X86-NOBMI-NEXT: calll use64
3298 ; X86-NOBMI-NEXT: addl $16, %esp
3299 ; X86-NOBMI-NEXT: movl %edi, %eax
3300 ; X86-NOBMI-NEXT: movl %esi, %edx
3301 ; X86-NOBMI-NEXT: addl $12, %esp
3302 ; X86-NOBMI-NEXT: popl %esi
3303 ; X86-NOBMI-NEXT: popl %edi
3304 ; X86-NOBMI-NEXT: popl %ebx
3305 ; X86-NOBMI-NEXT: popl %ebp
3306 ; X86-NOBMI-NEXT: retl
3308 ; X86-BMI1NOTBM-LABEL: bextr64_b5_skipextrauses:
3309 ; X86-BMI1NOTBM: # %bb.0:
3310 ; X86-BMI1NOTBM-NEXT: pushl %ebp
3311 ; X86-BMI1NOTBM-NEXT: pushl %ebx
3312 ; X86-BMI1NOTBM-NEXT: pushl %edi
3313 ; X86-BMI1NOTBM-NEXT: pushl %esi
3314 ; X86-BMI1NOTBM-NEXT: subl $12, %esp
3315 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %dl
3316 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
3317 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %ebx
3318 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
3319 ; X86-BMI1NOTBM-NEXT: movl %ebx, %esi
3320 ; X86-BMI1NOTBM-NEXT: movl %eax, %ecx
3321 ; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
3322 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %ebx, %edi
3323 ; X86-BMI1NOTBM-NEXT: testb $32, %al
3324 ; X86-BMI1NOTBM-NEXT: je .LBB29_2
3325 ; X86-BMI1NOTBM-NEXT: # %bb.1:
3326 ; X86-BMI1NOTBM-NEXT: movl %esi, %edi
3327 ; X86-BMI1NOTBM-NEXT: xorl %esi, %esi
3328 ; X86-BMI1NOTBM-NEXT: .LBB29_2:
3329 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
3330 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebp
3331 ; X86-BMI1NOTBM-NEXT: movl %edx, %ecx
3332 ; X86-BMI1NOTBM-NEXT: shll %cl, %ebp
3333 ; X86-BMI1NOTBM-NEXT: shldl %cl, %ebx, %ebx
3334 ; X86-BMI1NOTBM-NEXT: testb $32, %dl
3335 ; X86-BMI1NOTBM-NEXT: je .LBB29_4
3336 ; X86-BMI1NOTBM-NEXT: # %bb.3:
3337 ; X86-BMI1NOTBM-NEXT: movl %ebp, %ebx
3338 ; X86-BMI1NOTBM-NEXT: xorl %ebp, %ebp
3339 ; X86-BMI1NOTBM-NEXT: .LBB29_4:
3340 ; X86-BMI1NOTBM-NEXT: andnl %esi, %ebx, %esi
3341 ; X86-BMI1NOTBM-NEXT: andnl %edi, %ebp, %edi
3342 ; X86-BMI1NOTBM-NEXT: subl $8, %esp
3343 ; X86-BMI1NOTBM-NEXT: pushl {{[0-9]+}}(%esp)
3344 ; X86-BMI1NOTBM-NEXT: pushl %eax
3345 ; X86-BMI1NOTBM-NEXT: calll use64
3346 ; X86-BMI1NOTBM-NEXT: addl $16, %esp
3347 ; X86-BMI1NOTBM-NEXT: movl %edi, %eax
3348 ; X86-BMI1NOTBM-NEXT: movl %esi, %edx
3349 ; X86-BMI1NOTBM-NEXT: addl $12, %esp
3350 ; X86-BMI1NOTBM-NEXT: popl %esi
3351 ; X86-BMI1NOTBM-NEXT: popl %edi
3352 ; X86-BMI1NOTBM-NEXT: popl %ebx
3353 ; X86-BMI1NOTBM-NEXT: popl %ebp
3354 ; X86-BMI1NOTBM-NEXT: retl
3356 ; X86-BMI1BMI2-LABEL: bextr64_b5_skipextrauses:
3357 ; X86-BMI1BMI2: # %bb.0:
3358 ; X86-BMI1BMI2-NEXT: pushl %ebp
3359 ; X86-BMI1BMI2-NEXT: pushl %ebx
3360 ; X86-BMI1BMI2-NEXT: pushl %edi
3361 ; X86-BMI1BMI2-NEXT: pushl %esi
3362 ; X86-BMI1BMI2-NEXT: subl $12, %esp
3363 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %dl
3364 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edi
3365 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
3366 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
3367 ; X86-BMI1BMI2-NEXT: movl %eax, %ecx
3368 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edi
3369 ; X86-BMI1BMI2-NEXT: shrxl %eax, %esi, %esi
3370 ; X86-BMI1BMI2-NEXT: testb $32, %al
3371 ; X86-BMI1BMI2-NEXT: je .LBB29_2
3372 ; X86-BMI1BMI2-NEXT: # %bb.1:
3373 ; X86-BMI1BMI2-NEXT: movl %esi, %edi
3374 ; X86-BMI1BMI2-NEXT: xorl %esi, %esi
3375 ; X86-BMI1BMI2-NEXT: .LBB29_2:
3376 ; X86-BMI1BMI2-NEXT: movl $-1, %ebp
3377 ; X86-BMI1BMI2-NEXT: shlxl %edx, %ebp, %ebx
3378 ; X86-BMI1BMI2-NEXT: movl %edx, %ecx
3379 ; X86-BMI1BMI2-NEXT: shldl %cl, %ebp, %ebp
3380 ; X86-BMI1BMI2-NEXT: testb $32, %dl
3381 ; X86-BMI1BMI2-NEXT: je .LBB29_4
3382 ; X86-BMI1BMI2-NEXT: # %bb.3:
3383 ; X86-BMI1BMI2-NEXT: movl %ebx, %ebp
3384 ; X86-BMI1BMI2-NEXT: xorl %ebx, %ebx
3385 ; X86-BMI1BMI2-NEXT: .LBB29_4:
3386 ; X86-BMI1BMI2-NEXT: andnl %esi, %ebp, %esi
3387 ; X86-BMI1BMI2-NEXT: andnl %edi, %ebx, %edi
3388 ; X86-BMI1BMI2-NEXT: subl $8, %esp
3389 ; X86-BMI1BMI2-NEXT: pushl {{[0-9]+}}(%esp)
3390 ; X86-BMI1BMI2-NEXT: pushl %eax
3391 ; X86-BMI1BMI2-NEXT: calll use64
3392 ; X86-BMI1BMI2-NEXT: addl $16, %esp
3393 ; X86-BMI1BMI2-NEXT: movl %edi, %eax
3394 ; X86-BMI1BMI2-NEXT: movl %esi, %edx
3395 ; X86-BMI1BMI2-NEXT: addl $12, %esp
3396 ; X86-BMI1BMI2-NEXT: popl %esi
3397 ; X86-BMI1BMI2-NEXT: popl %edi
3398 ; X86-BMI1BMI2-NEXT: popl %ebx
3399 ; X86-BMI1BMI2-NEXT: popl %ebp
3400 ; X86-BMI1BMI2-NEXT: retl
3402 ; X64-NOBMI-LABEL: bextr64_b5_skipextrauses:
3403 ; X64-NOBMI: # %bb.0:
3404 ; X64-NOBMI-NEXT: pushq %rbx
3405 ; X64-NOBMI-NEXT: movl %esi, %ecx
3406 ; X64-NOBMI-NEXT: shrq %cl, %rdi
3407 ; X64-NOBMI-NEXT: movq $-1, %rbx
3408 ; X64-NOBMI-NEXT: movl %edx, %ecx
3409 ; X64-NOBMI-NEXT: shlq %cl, %rbx
3410 ; X64-NOBMI-NEXT: notq %rbx
3411 ; X64-NOBMI-NEXT: andq %rdi, %rbx
3412 ; X64-NOBMI-NEXT: movq %rsi, %rdi
3413 ; X64-NOBMI-NEXT: callq use64
3414 ; X64-NOBMI-NEXT: movq %rbx, %rax
3415 ; X64-NOBMI-NEXT: popq %rbx
3416 ; X64-NOBMI-NEXT: retq
3418 ; X64-BMI1NOTBM-LABEL: bextr64_b5_skipextrauses:
3419 ; X64-BMI1NOTBM: # %bb.0:
3420 ; X64-BMI1NOTBM-NEXT: pushq %rbx
3421 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
3422 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
3423 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
3424 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rbx
3425 ; X64-BMI1NOTBM-NEXT: movq %rsi, %rdi
3426 ; X64-BMI1NOTBM-NEXT: callq use64
3427 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
3428 ; X64-BMI1NOTBM-NEXT: popq %rbx
3429 ; X64-BMI1NOTBM-NEXT: retq
3431 ; X64-BMI1BMI2-LABEL: bextr64_b5_skipextrauses:
3432 ; X64-BMI1BMI2: # %bb.0:
3433 ; X64-BMI1BMI2-NEXT: pushq %rbx
3434 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
3435 ; X64-BMI1BMI2-NEXT: bzhiq %rdx, %rax, %rbx
3436 ; X64-BMI1BMI2-NEXT: movq %rsi, %rdi
3437 ; X64-BMI1BMI2-NEXT: callq use64
3438 ; X64-BMI1BMI2-NEXT: movq %rbx, %rax
3439 ; X64-BMI1BMI2-NEXT: popq %rbx
3440 ; X64-BMI1BMI2-NEXT: retq
3441 %shifted = lshr i64 %val, %numskipbits
3442 %notmask = shl i64 -1, %numlowbits
3443 %mask = xor i64 %notmask, -1
3444 %masked = and i64 %mask, %shifted
3445 call void @use64(i64 %numskipbits)
3449 ; 64-bit, but with 32-bit output
3451 ; Everything done in 64-bit, truncation happens last.
3452 define i32 @bextr64_32_b0(i64 %val, i64 %numskipbits, i8 %numlowbits) nounwind {
3453 ; X86-NOBMI-LABEL: bextr64_32_b0:
3454 ; X86-NOBMI: # %bb.0:
3455 ; X86-NOBMI-NEXT: pushl %edi
3456 ; X86-NOBMI-NEXT: pushl %esi
3457 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %dl
3458 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
3459 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
3460 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edi
3461 ; X86-NOBMI-NEXT: movl %edi, %eax
3462 ; X86-NOBMI-NEXT: shrl %cl, %eax
3463 ; X86-NOBMI-NEXT: shrdl %cl, %edi, %esi
3464 ; X86-NOBMI-NEXT: testb $32, %cl
3465 ; X86-NOBMI-NEXT: jne .LBB30_2
3466 ; X86-NOBMI-NEXT: # %bb.1:
3467 ; X86-NOBMI-NEXT: movl %esi, %eax
3468 ; X86-NOBMI-NEXT: .LBB30_2:
3469 ; X86-NOBMI-NEXT: movl $-1, %esi
3470 ; X86-NOBMI-NEXT: movl %edx, %ecx
3471 ; X86-NOBMI-NEXT: shll %cl, %esi
3472 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
3473 ; X86-NOBMI-NEXT: testb $32, %dl
3474 ; X86-NOBMI-NEXT: jne .LBB30_4
3475 ; X86-NOBMI-NEXT: # %bb.3:
3476 ; X86-NOBMI-NEXT: movl %esi, %ecx
3477 ; X86-NOBMI-NEXT: .LBB30_4:
3478 ; X86-NOBMI-NEXT: notl %ecx
3479 ; X86-NOBMI-NEXT: andl %ecx, %eax
3480 ; X86-NOBMI-NEXT: popl %esi
3481 ; X86-NOBMI-NEXT: popl %edi
3482 ; X86-NOBMI-NEXT: retl
3484 ; X86-BMI1NOTBM-LABEL: bextr64_32_b0:
3485 ; X86-BMI1NOTBM: # %bb.0:
3486 ; X86-BMI1NOTBM-NEXT: pushl %edi
3487 ; X86-BMI1NOTBM-NEXT: pushl %esi
3488 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
3489 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
3490 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
3491 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
3492 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
3493 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
3494 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
3495 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
3496 ; X86-BMI1NOTBM-NEXT: jne .LBB30_2
3497 ; X86-BMI1NOTBM-NEXT: # %bb.1:
3498 ; X86-BMI1NOTBM-NEXT: movl %esi, %edx
3499 ; X86-BMI1NOTBM-NEXT: .LBB30_2:
3500 ; X86-BMI1NOTBM-NEXT: movl $-1, %esi
3501 ; X86-BMI1NOTBM-NEXT: movl %eax, %ecx
3502 ; X86-BMI1NOTBM-NEXT: shll %cl, %esi
3503 ; X86-BMI1NOTBM-NEXT: xorl %ecx, %ecx
3504 ; X86-BMI1NOTBM-NEXT: testb $32, %al
3505 ; X86-BMI1NOTBM-NEXT: jne .LBB30_4
3506 ; X86-BMI1NOTBM-NEXT: # %bb.3:
3507 ; X86-BMI1NOTBM-NEXT: movl %esi, %ecx
3508 ; X86-BMI1NOTBM-NEXT: .LBB30_4:
3509 ; X86-BMI1NOTBM-NEXT: andnl %edx, %ecx, %eax
3510 ; X86-BMI1NOTBM-NEXT: popl %esi
3511 ; X86-BMI1NOTBM-NEXT: popl %edi
3512 ; X86-BMI1NOTBM-NEXT: retl
3514 ; X86-BMI1BMI2-LABEL: bextr64_32_b0:
3515 ; X86-BMI1BMI2: # %bb.0:
3516 ; X86-BMI1BMI2-NEXT: pushl %esi
3517 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
3518 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
3519 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
3520 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
3521 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edx
3522 ; X86-BMI1BMI2-NEXT: testb $32, %cl
3523 ; X86-BMI1BMI2-NEXT: je .LBB30_2
3524 ; X86-BMI1BMI2-NEXT: # %bb.1:
3525 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %edx
3526 ; X86-BMI1BMI2-NEXT: .LBB30_2:
3527 ; X86-BMI1BMI2-NEXT: xorl %ecx, %ecx
3528 ; X86-BMI1BMI2-NEXT: testb $32, %al
3529 ; X86-BMI1BMI2-NEXT: jne .LBB30_4
3530 ; X86-BMI1BMI2-NEXT: # %bb.3:
3531 ; X86-BMI1BMI2-NEXT: movl $-1, %ecx
3532 ; X86-BMI1BMI2-NEXT: shlxl %eax, %ecx, %ecx
3533 ; X86-BMI1BMI2-NEXT: .LBB30_4:
3534 ; X86-BMI1BMI2-NEXT: andnl %edx, %ecx, %eax
3535 ; X86-BMI1BMI2-NEXT: popl %esi
3536 ; X86-BMI1BMI2-NEXT: retl
3538 ; X64-NOBMI-LABEL: bextr64_32_b0:
3539 ; X64-NOBMI: # %bb.0:
3540 ; X64-NOBMI-NEXT: movq %rsi, %rcx
3541 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
3542 ; X64-NOBMI-NEXT: shrq %cl, %rdi
3543 ; X64-NOBMI-NEXT: movq $-1, %rax
3544 ; X64-NOBMI-NEXT: movl %edx, %ecx
3545 ; X64-NOBMI-NEXT: shlq %cl, %rax
3546 ; X64-NOBMI-NEXT: notl %eax
3547 ; X64-NOBMI-NEXT: andl %edi, %eax
3548 ; X64-NOBMI-NEXT: # kill: def $eax killed $eax killed $rax
3549 ; X64-NOBMI-NEXT: retq
3551 ; X64-BMI1NOTBM-LABEL: bextr64_32_b0:
3552 ; X64-BMI1NOTBM: # %bb.0:
3553 ; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx
3554 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx
3555 ; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi
3556 ; X64-BMI1NOTBM-NEXT: movq $-1, %rax
3557 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
3558 ; X64-BMI1NOTBM-NEXT: shlq %cl, %rax
3559 ; X64-BMI1NOTBM-NEXT: andnl %edi, %eax, %eax
3560 ; X64-BMI1NOTBM-NEXT: retq
3562 ; X64-BMI1BMI2-LABEL: bextr64_32_b0:
3563 ; X64-BMI1BMI2: # %bb.0:
3564 ; X64-BMI1BMI2-NEXT: # kill: def $edx killed $edx def $rdx
3565 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
3566 ; X64-BMI1BMI2-NEXT: movq $-1, %rcx
3567 ; X64-BMI1BMI2-NEXT: shlxq %rdx, %rcx, %rcx
3568 ; X64-BMI1BMI2-NEXT: andnl %eax, %ecx, %eax
3569 ; X64-BMI1BMI2-NEXT: retq
3570 %shiftedval = lshr i64 %val, %numskipbits
3571 %widenumlowbits = zext i8 %numlowbits to i64
3572 %notmask = shl nsw i64 -1, %widenumlowbits
3573 %mask = xor i64 %notmask, -1
3574 %wideres = and i64 %shiftedval, %mask
3575 %res = trunc i64 %wideres to i32
3579 ; Shifting happens in 64-bit, then truncation. Masking is 32-bit.
3580 define i32 @bextr64_32_b1(i64 %val, i64 %numskipbits, i8 %numlowbits) nounwind {
3581 ; X86-NOBMI-LABEL: bextr64_32_b1:
3582 ; X86-NOBMI: # %bb.0:
3583 ; X86-NOBMI-NEXT: pushl %edi
3584 ; X86-NOBMI-NEXT: pushl %esi
3585 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %dl
3586 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
3587 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
3588 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edi
3589 ; X86-NOBMI-NEXT: movl %edi, %esi
3590 ; X86-NOBMI-NEXT: shrl %cl, %esi
3591 ; X86-NOBMI-NEXT: shrdl %cl, %edi, %eax
3592 ; X86-NOBMI-NEXT: testb $32, %cl
3593 ; X86-NOBMI-NEXT: jne .LBB31_2
3594 ; X86-NOBMI-NEXT: # %bb.1:
3595 ; X86-NOBMI-NEXT: movl %eax, %esi
3596 ; X86-NOBMI-NEXT: .LBB31_2:
3597 ; X86-NOBMI-NEXT: movl $-1, %eax
3598 ; X86-NOBMI-NEXT: movl %edx, %ecx
3599 ; X86-NOBMI-NEXT: shll %cl, %eax
3600 ; X86-NOBMI-NEXT: notl %eax
3601 ; X86-NOBMI-NEXT: andl %esi, %eax
3602 ; X86-NOBMI-NEXT: popl %esi
3603 ; X86-NOBMI-NEXT: popl %edi
3604 ; X86-NOBMI-NEXT: retl
3606 ; X86-BMI1NOTBM-LABEL: bextr64_32_b1:
3607 ; X86-BMI1NOTBM: # %bb.0:
3608 ; X86-BMI1NOTBM-NEXT: pushl %edi
3609 ; X86-BMI1NOTBM-NEXT: pushl %esi
3610 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
3611 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
3612 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
3613 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
3614 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
3615 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
3616 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
3617 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
3618 ; X86-BMI1NOTBM-NEXT: jne .LBB31_2
3619 ; X86-BMI1NOTBM-NEXT: # %bb.1:
3620 ; X86-BMI1NOTBM-NEXT: movl %esi, %edx
3621 ; X86-BMI1NOTBM-NEXT: .LBB31_2:
3622 ; X86-BMI1NOTBM-NEXT: shll $8, %eax
3623 ; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax
3624 ; X86-BMI1NOTBM-NEXT: popl %esi
3625 ; X86-BMI1NOTBM-NEXT: popl %edi
3626 ; X86-BMI1NOTBM-NEXT: retl
3628 ; X86-BMI1BMI2-LABEL: bextr64_32_b1:
3629 ; X86-BMI1BMI2: # %bb.0:
3630 ; X86-BMI1BMI2-NEXT: pushl %esi
3631 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
3632 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
3633 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
3634 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
3635 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edx
3636 ; X86-BMI1BMI2-NEXT: testb $32, %cl
3637 ; X86-BMI1BMI2-NEXT: je .LBB31_2
3638 ; X86-BMI1BMI2-NEXT: # %bb.1:
3639 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %edx
3640 ; X86-BMI1BMI2-NEXT: .LBB31_2:
3641 ; X86-BMI1BMI2-NEXT: bzhil %eax, %edx, %eax
3642 ; X86-BMI1BMI2-NEXT: popl %esi
3643 ; X86-BMI1BMI2-NEXT: retl
3645 ; X64-NOBMI-LABEL: bextr64_32_b1:
3646 ; X64-NOBMI: # %bb.0:
3647 ; X64-NOBMI-NEXT: movq %rsi, %rcx
3648 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
3649 ; X64-NOBMI-NEXT: shrq %cl, %rdi
3650 ; X64-NOBMI-NEXT: movl $-1, %eax
3651 ; X64-NOBMI-NEXT: movl %edx, %ecx
3652 ; X64-NOBMI-NEXT: shll %cl, %eax
3653 ; X64-NOBMI-NEXT: notl %eax
3654 ; X64-NOBMI-NEXT: andl %edi, %eax
3655 ; X64-NOBMI-NEXT: retq
3657 ; X64-BMI1NOTBM-LABEL: bextr64_32_b1:
3658 ; X64-BMI1NOTBM: # %bb.0:
3659 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
3660 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
3661 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
3662 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
3663 ; X64-BMI1NOTBM-NEXT: # kill: def $eax killed $eax killed $rax
3664 ; X64-BMI1NOTBM-NEXT: retq
3666 ; X64-BMI1BMI2-LABEL: bextr64_32_b1:
3667 ; X64-BMI1BMI2: # %bb.0:
3668 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
3669 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
3670 ; X64-BMI1BMI2-NEXT: retq
3671 %shiftedval = lshr i64 %val, %numskipbits
3672 %truncshiftedval = trunc i64 %shiftedval to i32
3673 %widenumlowbits = zext i8 %numlowbits to i32
3674 %notmask = shl nsw i32 -1, %widenumlowbits
3675 %mask = xor i32 %notmask, -1
3676 %res = and i32 %truncshiftedval, %mask
3680 ; Shifting happens in 64-bit. Mask is 32-bit, but extended to 64-bit.
3681 ; Masking is 64-bit. Then truncation.
3682 define i32 @bextr64_32_b2(i64 %val, i64 %numskipbits, i8 %numlowbits) nounwind {
3683 ; X86-NOBMI-LABEL: bextr64_32_b2:
3684 ; X86-NOBMI: # %bb.0:
3685 ; X86-NOBMI-NEXT: pushl %edi
3686 ; X86-NOBMI-NEXT: pushl %esi
3687 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %dl
3688 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
3689 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
3690 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edi
3691 ; X86-NOBMI-NEXT: movl %edi, %esi
3692 ; X86-NOBMI-NEXT: shrl %cl, %esi
3693 ; X86-NOBMI-NEXT: shrdl %cl, %edi, %eax
3694 ; X86-NOBMI-NEXT: testb $32, %cl
3695 ; X86-NOBMI-NEXT: jne .LBB32_2
3696 ; X86-NOBMI-NEXT: # %bb.1:
3697 ; X86-NOBMI-NEXT: movl %eax, %esi
3698 ; X86-NOBMI-NEXT: .LBB32_2:
3699 ; X86-NOBMI-NEXT: movl $-1, %eax
3700 ; X86-NOBMI-NEXT: movl %edx, %ecx
3701 ; X86-NOBMI-NEXT: shll %cl, %eax
3702 ; X86-NOBMI-NEXT: notl %eax
3703 ; X86-NOBMI-NEXT: andl %esi, %eax
3704 ; X86-NOBMI-NEXT: popl %esi
3705 ; X86-NOBMI-NEXT: popl %edi
3706 ; X86-NOBMI-NEXT: retl
3708 ; X86-BMI1NOTBM-LABEL: bextr64_32_b2:
3709 ; X86-BMI1NOTBM: # %bb.0:
3710 ; X86-BMI1NOTBM-NEXT: pushl %edi
3711 ; X86-BMI1NOTBM-NEXT: pushl %esi
3712 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
3713 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
3714 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
3715 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
3716 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
3717 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
3718 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
3719 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
3720 ; X86-BMI1NOTBM-NEXT: jne .LBB32_2
3721 ; X86-BMI1NOTBM-NEXT: # %bb.1:
3722 ; X86-BMI1NOTBM-NEXT: movl %esi, %edx
3723 ; X86-BMI1NOTBM-NEXT: .LBB32_2:
3724 ; X86-BMI1NOTBM-NEXT: shll $8, %eax
3725 ; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax
3726 ; X86-BMI1NOTBM-NEXT: popl %esi
3727 ; X86-BMI1NOTBM-NEXT: popl %edi
3728 ; X86-BMI1NOTBM-NEXT: retl
3730 ; X86-BMI1BMI2-LABEL: bextr64_32_b2:
3731 ; X86-BMI1BMI2: # %bb.0:
3732 ; X86-BMI1BMI2-NEXT: pushl %esi
3733 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
3734 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
3735 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
3736 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
3737 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edx
3738 ; X86-BMI1BMI2-NEXT: testb $32, %cl
3739 ; X86-BMI1BMI2-NEXT: je .LBB32_2
3740 ; X86-BMI1BMI2-NEXT: # %bb.1:
3741 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %edx
3742 ; X86-BMI1BMI2-NEXT: .LBB32_2:
3743 ; X86-BMI1BMI2-NEXT: bzhil %eax, %edx, %eax
3744 ; X86-BMI1BMI2-NEXT: popl %esi
3745 ; X86-BMI1BMI2-NEXT: retl
3747 ; X64-NOBMI-LABEL: bextr64_32_b2:
3748 ; X64-NOBMI: # %bb.0:
3749 ; X64-NOBMI-NEXT: movq %rsi, %rcx
3750 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
3751 ; X64-NOBMI-NEXT: shrq %cl, %rdi
3752 ; X64-NOBMI-NEXT: movl $-1, %eax
3753 ; X64-NOBMI-NEXT: movl %edx, %ecx
3754 ; X64-NOBMI-NEXT: shll %cl, %eax
3755 ; X64-NOBMI-NEXT: notl %eax
3756 ; X64-NOBMI-NEXT: andl %edi, %eax
3757 ; X64-NOBMI-NEXT: retq
3759 ; X64-BMI1NOTBM-LABEL: bextr64_32_b2:
3760 ; X64-BMI1NOTBM: # %bb.0:
3761 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
3762 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
3763 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
3764 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
3765 ; X64-BMI1NOTBM-NEXT: # kill: def $eax killed $eax killed $rax
3766 ; X64-BMI1NOTBM-NEXT: retq
3768 ; X64-BMI1BMI2-LABEL: bextr64_32_b2:
3769 ; X64-BMI1BMI2: # %bb.0:
3770 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
3771 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
3772 ; X64-BMI1BMI2-NEXT: retq
3773 %shiftedval = lshr i64 %val, %numskipbits
3774 %widenumlowbits = zext i8 %numlowbits to i32
3775 %notmask = shl nsw i32 -1, %widenumlowbits
3776 %mask = xor i32 %notmask, -1
3777 %zextmask = zext i32 %mask to i64
3778 %wideres = and i64 %shiftedval, %zextmask
3779 %res = trunc i64 %wideres to i32
3783 ; ---------------------------------------------------------------------------- ;
3785 ; ---------------------------------------------------------------------------- ;
3787 define i32 @bextr32_c0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
3788 ; X86-NOBMI-LABEL: bextr32_c0:
3789 ; X86-NOBMI: # %bb.0:
3790 ; X86-NOBMI-NEXT: pushl %edi
3791 ; X86-NOBMI-NEXT: pushl %esi
3792 ; X86-NOBMI-NEXT: pushl %eax
3793 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
3794 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edi
3795 ; X86-NOBMI-NEXT: shrl %cl, %edi
3796 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
3797 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
3798 ; X86-NOBMI-NEXT: movl $-1, %esi
3799 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
3800 ; X86-NOBMI-NEXT: shrl %cl, %esi
3801 ; X86-NOBMI-NEXT: movl %esi, (%esp)
3802 ; X86-NOBMI-NEXT: calll use32
3803 ; X86-NOBMI-NEXT: andl %edi, %esi
3804 ; X86-NOBMI-NEXT: movl %esi, %eax
3805 ; X86-NOBMI-NEXT: addl $4, %esp
3806 ; X86-NOBMI-NEXT: popl %esi
3807 ; X86-NOBMI-NEXT: popl %edi
3808 ; X86-NOBMI-NEXT: retl
3810 ; X86-BMI1NOTBM-LABEL: bextr32_c0:
3811 ; X86-BMI1NOTBM: # %bb.0:
3812 ; X86-BMI1NOTBM-NEXT: pushl %edi
3813 ; X86-BMI1NOTBM-NEXT: pushl %esi
3814 ; X86-BMI1NOTBM-NEXT: pushl %eax
3815 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
3816 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
3817 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
3818 ; X86-BMI1NOTBM-NEXT: xorl %ecx, %ecx
3819 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
3820 ; X86-BMI1NOTBM-NEXT: movl $-1, %esi
3821 ; X86-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
3822 ; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
3823 ; X86-BMI1NOTBM-NEXT: movl %esi, (%esp)
3824 ; X86-BMI1NOTBM-NEXT: calll use32
3825 ; X86-BMI1NOTBM-NEXT: andl %edi, %esi
3826 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
3827 ; X86-BMI1NOTBM-NEXT: addl $4, %esp
3828 ; X86-BMI1NOTBM-NEXT: popl %esi
3829 ; X86-BMI1NOTBM-NEXT: popl %edi
3830 ; X86-BMI1NOTBM-NEXT: retl
3832 ; X86-BMI1BMI2-LABEL: bextr32_c0:
3833 ; X86-BMI1BMI2: # %bb.0:
3834 ; X86-BMI1BMI2-NEXT: pushl %ebx
3835 ; X86-BMI1BMI2-NEXT: pushl %esi
3836 ; X86-BMI1BMI2-NEXT: pushl %eax
3837 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %bl
3838 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
3839 ; X86-BMI1BMI2-NEXT: shrxl %eax, {{[0-9]+}}(%esp), %esi
3840 ; X86-BMI1BMI2-NEXT: movl %ebx, %eax
3841 ; X86-BMI1BMI2-NEXT: negb %al
3842 ; X86-BMI1BMI2-NEXT: movl $-1, %ecx
3843 ; X86-BMI1BMI2-NEXT: shrxl %eax, %ecx, %eax
3844 ; X86-BMI1BMI2-NEXT: movl %eax, (%esp)
3845 ; X86-BMI1BMI2-NEXT: calll use32
3846 ; X86-BMI1BMI2-NEXT: bzhil %ebx, %esi, %eax
3847 ; X86-BMI1BMI2-NEXT: addl $4, %esp
3848 ; X86-BMI1BMI2-NEXT: popl %esi
3849 ; X86-BMI1BMI2-NEXT: popl %ebx
3850 ; X86-BMI1BMI2-NEXT: retl
3852 ; X64-NOBMI-LABEL: bextr32_c0:
3853 ; X64-NOBMI: # %bb.0:
3854 ; X64-NOBMI-NEXT: pushq %rbp
3855 ; X64-NOBMI-NEXT: pushq %rbx
3856 ; X64-NOBMI-NEXT: pushq %rax
3857 ; X64-NOBMI-NEXT: movl %esi, %ecx
3858 ; X64-NOBMI-NEXT: movl %edi, %ebx
3859 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
3860 ; X64-NOBMI-NEXT: shrl %cl, %ebx
3861 ; X64-NOBMI-NEXT: negb %dl
3862 ; X64-NOBMI-NEXT: movl $-1, %ebp
3863 ; X64-NOBMI-NEXT: movl %edx, %ecx
3864 ; X64-NOBMI-NEXT: shrl %cl, %ebp
3865 ; X64-NOBMI-NEXT: movl %ebp, %edi
3866 ; X64-NOBMI-NEXT: callq use32
3867 ; X64-NOBMI-NEXT: andl %ebx, %ebp
3868 ; X64-NOBMI-NEXT: movl %ebp, %eax
3869 ; X64-NOBMI-NEXT: addq $8, %rsp
3870 ; X64-NOBMI-NEXT: popq %rbx
3871 ; X64-NOBMI-NEXT: popq %rbp
3872 ; X64-NOBMI-NEXT: retq
3874 ; X64-BMI1NOTBM-LABEL: bextr32_c0:
3875 ; X64-BMI1NOTBM: # %bb.0:
3876 ; X64-BMI1NOTBM-NEXT: pushq %rbp
3877 ; X64-BMI1NOTBM-NEXT: pushq %rbx
3878 ; X64-BMI1NOTBM-NEXT: pushq %rax
3879 ; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
3880 ; X64-BMI1NOTBM-NEXT: movl %edi, %ebx
3881 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
3882 ; X64-BMI1NOTBM-NEXT: shrl %cl, %ebx
3883 ; X64-BMI1NOTBM-NEXT: negb %dl
3884 ; X64-BMI1NOTBM-NEXT: movl $-1, %ebp
3885 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
3886 ; X64-BMI1NOTBM-NEXT: shrl %cl, %ebp
3887 ; X64-BMI1NOTBM-NEXT: movl %ebp, %edi
3888 ; X64-BMI1NOTBM-NEXT: callq use32
3889 ; X64-BMI1NOTBM-NEXT: andl %ebx, %ebp
3890 ; X64-BMI1NOTBM-NEXT: movl %ebp, %eax
3891 ; X64-BMI1NOTBM-NEXT: addq $8, %rsp
3892 ; X64-BMI1NOTBM-NEXT: popq %rbx
3893 ; X64-BMI1NOTBM-NEXT: popq %rbp
3894 ; X64-BMI1NOTBM-NEXT: retq
3896 ; X64-BMI1BMI2-LABEL: bextr32_c0:
3897 ; X64-BMI1BMI2: # %bb.0:
3898 ; X64-BMI1BMI2-NEXT: pushq %rbp
3899 ; X64-BMI1BMI2-NEXT: pushq %rbx
3900 ; X64-BMI1BMI2-NEXT: pushq %rax
3901 ; X64-BMI1BMI2-NEXT: movl %edx, %ebx
3902 ; X64-BMI1BMI2-NEXT: shrxl %esi, %edi, %ebp
3903 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
3904 ; X64-BMI1BMI2-NEXT: negb %al
3905 ; X64-BMI1BMI2-NEXT: movl $-1, %ecx
3906 ; X64-BMI1BMI2-NEXT: shrxl %eax, %ecx, %edi
3907 ; X64-BMI1BMI2-NEXT: callq use32
3908 ; X64-BMI1BMI2-NEXT: bzhil %ebx, %ebp, %eax
3909 ; X64-BMI1BMI2-NEXT: addq $8, %rsp
3910 ; X64-BMI1BMI2-NEXT: popq %rbx
3911 ; X64-BMI1BMI2-NEXT: popq %rbp
3912 ; X64-BMI1BMI2-NEXT: retq
3913 %shifted = lshr i32 %val, %numskipbits
3914 %numhighbits = sub i32 32, %numlowbits
3915 %mask = lshr i32 -1, %numhighbits
3916 call void @use32(i32 %mask)
3917 %masked = and i32 %mask, %shifted
3921 define i32 @bextr32_c1_indexzext(i32 %val, i8 %numskipbits, i8 %numlowbits) nounwind {
3922 ; X86-NOBMI-LABEL: bextr32_c1_indexzext:
3923 ; X86-NOBMI: # %bb.0:
3924 ; X86-NOBMI-NEXT: pushl %edi
3925 ; X86-NOBMI-NEXT: pushl %esi
3926 ; X86-NOBMI-NEXT: pushl %eax
3927 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
3928 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edi
3929 ; X86-NOBMI-NEXT: shrl %cl, %edi
3930 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
3931 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
3932 ; X86-NOBMI-NEXT: movl $-1, %esi
3933 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
3934 ; X86-NOBMI-NEXT: shrl %cl, %esi
3935 ; X86-NOBMI-NEXT: movl %esi, (%esp)
3936 ; X86-NOBMI-NEXT: calll use32
3937 ; X86-NOBMI-NEXT: andl %edi, %esi
3938 ; X86-NOBMI-NEXT: movl %esi, %eax
3939 ; X86-NOBMI-NEXT: addl $4, %esp
3940 ; X86-NOBMI-NEXT: popl %esi
3941 ; X86-NOBMI-NEXT: popl %edi
3942 ; X86-NOBMI-NEXT: retl
3944 ; X86-BMI1NOTBM-LABEL: bextr32_c1_indexzext:
3945 ; X86-BMI1NOTBM: # %bb.0:
3946 ; X86-BMI1NOTBM-NEXT: pushl %edi
3947 ; X86-BMI1NOTBM-NEXT: pushl %esi
3948 ; X86-BMI1NOTBM-NEXT: pushl %eax
3949 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
3950 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
3951 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
3952 ; X86-BMI1NOTBM-NEXT: xorl %ecx, %ecx
3953 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
3954 ; X86-BMI1NOTBM-NEXT: movl $-1, %esi
3955 ; X86-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
3956 ; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
3957 ; X86-BMI1NOTBM-NEXT: movl %esi, (%esp)
3958 ; X86-BMI1NOTBM-NEXT: calll use32
3959 ; X86-BMI1NOTBM-NEXT: andl %edi, %esi
3960 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
3961 ; X86-BMI1NOTBM-NEXT: addl $4, %esp
3962 ; X86-BMI1NOTBM-NEXT: popl %esi
3963 ; X86-BMI1NOTBM-NEXT: popl %edi
3964 ; X86-BMI1NOTBM-NEXT: retl
3966 ; X86-BMI1BMI2-LABEL: bextr32_c1_indexzext:
3967 ; X86-BMI1BMI2: # %bb.0:
3968 ; X86-BMI1BMI2-NEXT: pushl %ebx
3969 ; X86-BMI1BMI2-NEXT: pushl %esi
3970 ; X86-BMI1BMI2-NEXT: pushl %eax
3971 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %bl
3972 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
3973 ; X86-BMI1BMI2-NEXT: shrxl %eax, {{[0-9]+}}(%esp), %esi
3974 ; X86-BMI1BMI2-NEXT: movl %ebx, %eax
3975 ; X86-BMI1BMI2-NEXT: negb %al
3976 ; X86-BMI1BMI2-NEXT: movl $-1, %ecx
3977 ; X86-BMI1BMI2-NEXT: shrxl %eax, %ecx, %eax
3978 ; X86-BMI1BMI2-NEXT: movl %eax, (%esp)
3979 ; X86-BMI1BMI2-NEXT: calll use32
3980 ; X86-BMI1BMI2-NEXT: bzhil %ebx, %esi, %eax
3981 ; X86-BMI1BMI2-NEXT: addl $4, %esp
3982 ; X86-BMI1BMI2-NEXT: popl %esi
3983 ; X86-BMI1BMI2-NEXT: popl %ebx
3984 ; X86-BMI1BMI2-NEXT: retl
3986 ; X64-NOBMI-LABEL: bextr32_c1_indexzext:
3987 ; X64-NOBMI: # %bb.0:
3988 ; X64-NOBMI-NEXT: pushq %rbp
3989 ; X64-NOBMI-NEXT: pushq %rbx
3990 ; X64-NOBMI-NEXT: pushq %rax
3991 ; X64-NOBMI-NEXT: movl %esi, %ecx
3992 ; X64-NOBMI-NEXT: movl %edi, %ebx
3993 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
3994 ; X64-NOBMI-NEXT: shrl %cl, %ebx
3995 ; X64-NOBMI-NEXT: negb %dl
3996 ; X64-NOBMI-NEXT: movl $-1, %ebp
3997 ; X64-NOBMI-NEXT: movl %edx, %ecx
3998 ; X64-NOBMI-NEXT: shrl %cl, %ebp
3999 ; X64-NOBMI-NEXT: movl %ebp, %edi
4000 ; X64-NOBMI-NEXT: callq use32
4001 ; X64-NOBMI-NEXT: andl %ebx, %ebp
4002 ; X64-NOBMI-NEXT: movl %ebp, %eax
4003 ; X64-NOBMI-NEXT: addq $8, %rsp
4004 ; X64-NOBMI-NEXT: popq %rbx
4005 ; X64-NOBMI-NEXT: popq %rbp
4006 ; X64-NOBMI-NEXT: retq
4008 ; X64-BMI1NOTBM-LABEL: bextr32_c1_indexzext:
4009 ; X64-BMI1NOTBM: # %bb.0:
4010 ; X64-BMI1NOTBM-NEXT: pushq %rbp
4011 ; X64-BMI1NOTBM-NEXT: pushq %rbx
4012 ; X64-BMI1NOTBM-NEXT: pushq %rax
4013 ; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
4014 ; X64-BMI1NOTBM-NEXT: movl %edi, %ebx
4015 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
4016 ; X64-BMI1NOTBM-NEXT: shrl %cl, %ebx
4017 ; X64-BMI1NOTBM-NEXT: negb %dl
4018 ; X64-BMI1NOTBM-NEXT: movl $-1, %ebp
4019 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
4020 ; X64-BMI1NOTBM-NEXT: shrl %cl, %ebp
4021 ; X64-BMI1NOTBM-NEXT: movl %ebp, %edi
4022 ; X64-BMI1NOTBM-NEXT: callq use32
4023 ; X64-BMI1NOTBM-NEXT: andl %ebx, %ebp
4024 ; X64-BMI1NOTBM-NEXT: movl %ebp, %eax
4025 ; X64-BMI1NOTBM-NEXT: addq $8, %rsp
4026 ; X64-BMI1NOTBM-NEXT: popq %rbx
4027 ; X64-BMI1NOTBM-NEXT: popq %rbp
4028 ; X64-BMI1NOTBM-NEXT: retq
4030 ; X64-BMI1BMI2-LABEL: bextr32_c1_indexzext:
4031 ; X64-BMI1BMI2: # %bb.0:
4032 ; X64-BMI1BMI2-NEXT: pushq %rbp
4033 ; X64-BMI1BMI2-NEXT: pushq %rbx
4034 ; X64-BMI1BMI2-NEXT: pushq %rax
4035 ; X64-BMI1BMI2-NEXT: movl %edx, %ebx
4036 ; X64-BMI1BMI2-NEXT: shrxl %esi, %edi, %ebp
4037 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
4038 ; X64-BMI1BMI2-NEXT: negb %al
4039 ; X64-BMI1BMI2-NEXT: movl $-1, %ecx
4040 ; X64-BMI1BMI2-NEXT: shrxl %eax, %ecx, %edi
4041 ; X64-BMI1BMI2-NEXT: callq use32
4042 ; X64-BMI1BMI2-NEXT: bzhil %ebx, %ebp, %eax
4043 ; X64-BMI1BMI2-NEXT: addq $8, %rsp
4044 ; X64-BMI1BMI2-NEXT: popq %rbx
4045 ; X64-BMI1BMI2-NEXT: popq %rbp
4046 ; X64-BMI1BMI2-NEXT: retq
4047 %skip = zext i8 %numskipbits to i32
4048 %shifted = lshr i32 %val, %skip
4049 %numhighbits = sub i8 32, %numlowbits
4050 %sh_prom = zext i8 %numhighbits to i32
4051 %mask = lshr i32 -1, %sh_prom
4052 call void @use32(i32 %mask)
4053 %masked = and i32 %mask, %shifted
4057 define i32 @bextr32_c2_load(i32* %w, i32 %numskipbits, i32 %numlowbits) nounwind {
4058 ; X86-NOBMI-LABEL: bextr32_c2_load:
4059 ; X86-NOBMI: # %bb.0:
4060 ; X86-NOBMI-NEXT: pushl %edi
4061 ; X86-NOBMI-NEXT: pushl %esi
4062 ; X86-NOBMI-NEXT: pushl %eax
4063 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
4064 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
4065 ; X86-NOBMI-NEXT: movl (%eax), %edi
4066 ; X86-NOBMI-NEXT: shrl %cl, %edi
4067 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
4068 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
4069 ; X86-NOBMI-NEXT: movl $-1, %esi
4070 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
4071 ; X86-NOBMI-NEXT: shrl %cl, %esi
4072 ; X86-NOBMI-NEXT: movl %esi, (%esp)
4073 ; X86-NOBMI-NEXT: calll use32
4074 ; X86-NOBMI-NEXT: andl %edi, %esi
4075 ; X86-NOBMI-NEXT: movl %esi, %eax
4076 ; X86-NOBMI-NEXT: addl $4, %esp
4077 ; X86-NOBMI-NEXT: popl %esi
4078 ; X86-NOBMI-NEXT: popl %edi
4079 ; X86-NOBMI-NEXT: retl
4081 ; X86-BMI1NOTBM-LABEL: bextr32_c2_load:
4082 ; X86-BMI1NOTBM: # %bb.0:
4083 ; X86-BMI1NOTBM-NEXT: pushl %edi
4084 ; X86-BMI1NOTBM-NEXT: pushl %esi
4085 ; X86-BMI1NOTBM-NEXT: pushl %eax
4086 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
4087 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
4088 ; X86-BMI1NOTBM-NEXT: movl (%eax), %edi
4089 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
4090 ; X86-BMI1NOTBM-NEXT: xorl %ecx, %ecx
4091 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
4092 ; X86-BMI1NOTBM-NEXT: movl $-1, %esi
4093 ; X86-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
4094 ; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
4095 ; X86-BMI1NOTBM-NEXT: movl %esi, (%esp)
4096 ; X86-BMI1NOTBM-NEXT: calll use32
4097 ; X86-BMI1NOTBM-NEXT: andl %edi, %esi
4098 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
4099 ; X86-BMI1NOTBM-NEXT: addl $4, %esp
4100 ; X86-BMI1NOTBM-NEXT: popl %esi
4101 ; X86-BMI1NOTBM-NEXT: popl %edi
4102 ; X86-BMI1NOTBM-NEXT: retl
4104 ; X86-BMI1BMI2-LABEL: bextr32_c2_load:
4105 ; X86-BMI1BMI2: # %bb.0:
4106 ; X86-BMI1BMI2-NEXT: pushl %ebx
4107 ; X86-BMI1BMI2-NEXT: pushl %esi
4108 ; X86-BMI1BMI2-NEXT: pushl %eax
4109 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %bl
4110 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
4111 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
4112 ; X86-BMI1BMI2-NEXT: shrxl %ecx, (%eax), %esi
4113 ; X86-BMI1BMI2-NEXT: movl %ebx, %eax
4114 ; X86-BMI1BMI2-NEXT: negb %al
4115 ; X86-BMI1BMI2-NEXT: movl $-1, %ecx
4116 ; X86-BMI1BMI2-NEXT: shrxl %eax, %ecx, %eax
4117 ; X86-BMI1BMI2-NEXT: movl %eax, (%esp)
4118 ; X86-BMI1BMI2-NEXT: calll use32
4119 ; X86-BMI1BMI2-NEXT: bzhil %ebx, %esi, %eax
4120 ; X86-BMI1BMI2-NEXT: addl $4, %esp
4121 ; X86-BMI1BMI2-NEXT: popl %esi
4122 ; X86-BMI1BMI2-NEXT: popl %ebx
4123 ; X86-BMI1BMI2-NEXT: retl
4125 ; X64-NOBMI-LABEL: bextr32_c2_load:
4126 ; X64-NOBMI: # %bb.0:
4127 ; X64-NOBMI-NEXT: pushq %rbp
4128 ; X64-NOBMI-NEXT: pushq %rbx
4129 ; X64-NOBMI-NEXT: pushq %rax
4130 ; X64-NOBMI-NEXT: movl %esi, %ecx
4131 ; X64-NOBMI-NEXT: movl (%rdi), %ebp
4132 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
4133 ; X64-NOBMI-NEXT: shrl %cl, %ebp
4134 ; X64-NOBMI-NEXT: negb %dl
4135 ; X64-NOBMI-NEXT: movl $-1, %ebx
4136 ; X64-NOBMI-NEXT: movl %edx, %ecx
4137 ; X64-NOBMI-NEXT: shrl %cl, %ebx
4138 ; X64-NOBMI-NEXT: movl %ebx, %edi
4139 ; X64-NOBMI-NEXT: callq use32
4140 ; X64-NOBMI-NEXT: andl %ebp, %ebx
4141 ; X64-NOBMI-NEXT: movl %ebx, %eax
4142 ; X64-NOBMI-NEXT: addq $8, %rsp
4143 ; X64-NOBMI-NEXT: popq %rbx
4144 ; X64-NOBMI-NEXT: popq %rbp
4145 ; X64-NOBMI-NEXT: retq
4147 ; X64-BMI1NOTBM-LABEL: bextr32_c2_load:
4148 ; X64-BMI1NOTBM: # %bb.0:
4149 ; X64-BMI1NOTBM-NEXT: pushq %rbp
4150 ; X64-BMI1NOTBM-NEXT: pushq %rbx
4151 ; X64-BMI1NOTBM-NEXT: pushq %rax
4152 ; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
4153 ; X64-BMI1NOTBM-NEXT: movl (%rdi), %ebp
4154 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
4155 ; X64-BMI1NOTBM-NEXT: shrl %cl, %ebp
4156 ; X64-BMI1NOTBM-NEXT: negb %dl
4157 ; X64-BMI1NOTBM-NEXT: movl $-1, %ebx
4158 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
4159 ; X64-BMI1NOTBM-NEXT: shrl %cl, %ebx
4160 ; X64-BMI1NOTBM-NEXT: movl %ebx, %edi
4161 ; X64-BMI1NOTBM-NEXT: callq use32
4162 ; X64-BMI1NOTBM-NEXT: andl %ebp, %ebx
4163 ; X64-BMI1NOTBM-NEXT: movl %ebx, %eax
4164 ; X64-BMI1NOTBM-NEXT: addq $8, %rsp
4165 ; X64-BMI1NOTBM-NEXT: popq %rbx
4166 ; X64-BMI1NOTBM-NEXT: popq %rbp
4167 ; X64-BMI1NOTBM-NEXT: retq
4169 ; X64-BMI1BMI2-LABEL: bextr32_c2_load:
4170 ; X64-BMI1BMI2: # %bb.0:
4171 ; X64-BMI1BMI2-NEXT: pushq %rbp
4172 ; X64-BMI1BMI2-NEXT: pushq %rbx
4173 ; X64-BMI1BMI2-NEXT: pushq %rax
4174 ; X64-BMI1BMI2-NEXT: movl %edx, %ebx
4175 ; X64-BMI1BMI2-NEXT: shrxl %esi, (%rdi), %ebp
4176 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
4177 ; X64-BMI1BMI2-NEXT: negb %al
4178 ; X64-BMI1BMI2-NEXT: movl $-1, %ecx
4179 ; X64-BMI1BMI2-NEXT: shrxl %eax, %ecx, %edi
4180 ; X64-BMI1BMI2-NEXT: callq use32
4181 ; X64-BMI1BMI2-NEXT: bzhil %ebx, %ebp, %eax
4182 ; X64-BMI1BMI2-NEXT: addq $8, %rsp
4183 ; X64-BMI1BMI2-NEXT: popq %rbx
4184 ; X64-BMI1BMI2-NEXT: popq %rbp
4185 ; X64-BMI1BMI2-NEXT: retq
4186 %val = load i32, i32* %w
4187 %shifted = lshr i32 %val, %numskipbits
4188 %numhighbits = sub i32 32, %numlowbits
4189 %mask = lshr i32 -1, %numhighbits
4190 call void @use32(i32 %mask)
4191 %masked = and i32 %mask, %shifted
4195 define i32 @bextr32_c3_load_indexzext(i32* %w, i8 %numskipbits, i8 %numlowbits) nounwind {
4196 ; X86-NOBMI-LABEL: bextr32_c3_load_indexzext:
4197 ; X86-NOBMI: # %bb.0:
4198 ; X86-NOBMI-NEXT: pushl %edi
4199 ; X86-NOBMI-NEXT: pushl %esi
4200 ; X86-NOBMI-NEXT: pushl %eax
4201 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
4202 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
4203 ; X86-NOBMI-NEXT: movl (%eax), %edi
4204 ; X86-NOBMI-NEXT: shrl %cl, %edi
4205 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
4206 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
4207 ; X86-NOBMI-NEXT: movl $-1, %esi
4208 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
4209 ; X86-NOBMI-NEXT: shrl %cl, %esi
4210 ; X86-NOBMI-NEXT: movl %esi, (%esp)
4211 ; X86-NOBMI-NEXT: calll use32
4212 ; X86-NOBMI-NEXT: andl %edi, %esi
4213 ; X86-NOBMI-NEXT: movl %esi, %eax
4214 ; X86-NOBMI-NEXT: addl $4, %esp
4215 ; X86-NOBMI-NEXT: popl %esi
4216 ; X86-NOBMI-NEXT: popl %edi
4217 ; X86-NOBMI-NEXT: retl
4219 ; X86-BMI1NOTBM-LABEL: bextr32_c3_load_indexzext:
4220 ; X86-BMI1NOTBM: # %bb.0:
4221 ; X86-BMI1NOTBM-NEXT: pushl %edi
4222 ; X86-BMI1NOTBM-NEXT: pushl %esi
4223 ; X86-BMI1NOTBM-NEXT: pushl %eax
4224 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
4225 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
4226 ; X86-BMI1NOTBM-NEXT: movl (%eax), %edi
4227 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
4228 ; X86-BMI1NOTBM-NEXT: xorl %ecx, %ecx
4229 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
4230 ; X86-BMI1NOTBM-NEXT: movl $-1, %esi
4231 ; X86-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
4232 ; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
4233 ; X86-BMI1NOTBM-NEXT: movl %esi, (%esp)
4234 ; X86-BMI1NOTBM-NEXT: calll use32
4235 ; X86-BMI1NOTBM-NEXT: andl %edi, %esi
4236 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
4237 ; X86-BMI1NOTBM-NEXT: addl $4, %esp
4238 ; X86-BMI1NOTBM-NEXT: popl %esi
4239 ; X86-BMI1NOTBM-NEXT: popl %edi
4240 ; X86-BMI1NOTBM-NEXT: retl
4242 ; X86-BMI1BMI2-LABEL: bextr32_c3_load_indexzext:
4243 ; X86-BMI1BMI2: # %bb.0:
4244 ; X86-BMI1BMI2-NEXT: pushl %ebx
4245 ; X86-BMI1BMI2-NEXT: pushl %esi
4246 ; X86-BMI1BMI2-NEXT: pushl %eax
4247 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %bl
4248 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
4249 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
4250 ; X86-BMI1BMI2-NEXT: shrxl %ecx, (%eax), %esi
4251 ; X86-BMI1BMI2-NEXT: movl %ebx, %eax
4252 ; X86-BMI1BMI2-NEXT: negb %al
4253 ; X86-BMI1BMI2-NEXT: movl $-1, %ecx
4254 ; X86-BMI1BMI2-NEXT: shrxl %eax, %ecx, %eax
4255 ; X86-BMI1BMI2-NEXT: movl %eax, (%esp)
4256 ; X86-BMI1BMI2-NEXT: calll use32
4257 ; X86-BMI1BMI2-NEXT: bzhil %ebx, %esi, %eax
4258 ; X86-BMI1BMI2-NEXT: addl $4, %esp
4259 ; X86-BMI1BMI2-NEXT: popl %esi
4260 ; X86-BMI1BMI2-NEXT: popl %ebx
4261 ; X86-BMI1BMI2-NEXT: retl
4263 ; X64-NOBMI-LABEL: bextr32_c3_load_indexzext:
4264 ; X64-NOBMI: # %bb.0:
4265 ; X64-NOBMI-NEXT: pushq %rbp
4266 ; X64-NOBMI-NEXT: pushq %rbx
4267 ; X64-NOBMI-NEXT: pushq %rax
4268 ; X64-NOBMI-NEXT: movl %esi, %ecx
4269 ; X64-NOBMI-NEXT: movl (%rdi), %ebp
4270 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
4271 ; X64-NOBMI-NEXT: shrl %cl, %ebp
4272 ; X64-NOBMI-NEXT: negb %dl
4273 ; X64-NOBMI-NEXT: movl $-1, %ebx
4274 ; X64-NOBMI-NEXT: movl %edx, %ecx
4275 ; X64-NOBMI-NEXT: shrl %cl, %ebx
4276 ; X64-NOBMI-NEXT: movl %ebx, %edi
4277 ; X64-NOBMI-NEXT: callq use32
4278 ; X64-NOBMI-NEXT: andl %ebp, %ebx
4279 ; X64-NOBMI-NEXT: movl %ebx, %eax
4280 ; X64-NOBMI-NEXT: addq $8, %rsp
4281 ; X64-NOBMI-NEXT: popq %rbx
4282 ; X64-NOBMI-NEXT: popq %rbp
4283 ; X64-NOBMI-NEXT: retq
4285 ; X64-BMI1NOTBM-LABEL: bextr32_c3_load_indexzext:
4286 ; X64-BMI1NOTBM: # %bb.0:
4287 ; X64-BMI1NOTBM-NEXT: pushq %rbp
4288 ; X64-BMI1NOTBM-NEXT: pushq %rbx
4289 ; X64-BMI1NOTBM-NEXT: pushq %rax
4290 ; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
4291 ; X64-BMI1NOTBM-NEXT: movl (%rdi), %ebp
4292 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
4293 ; X64-BMI1NOTBM-NEXT: shrl %cl, %ebp
4294 ; X64-BMI1NOTBM-NEXT: negb %dl
4295 ; X64-BMI1NOTBM-NEXT: movl $-1, %ebx
4296 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
4297 ; X64-BMI1NOTBM-NEXT: shrl %cl, %ebx
4298 ; X64-BMI1NOTBM-NEXT: movl %ebx, %edi
4299 ; X64-BMI1NOTBM-NEXT: callq use32
4300 ; X64-BMI1NOTBM-NEXT: andl %ebp, %ebx
4301 ; X64-BMI1NOTBM-NEXT: movl %ebx, %eax
4302 ; X64-BMI1NOTBM-NEXT: addq $8, %rsp
4303 ; X64-BMI1NOTBM-NEXT: popq %rbx
4304 ; X64-BMI1NOTBM-NEXT: popq %rbp
4305 ; X64-BMI1NOTBM-NEXT: retq
4307 ; X64-BMI1BMI2-LABEL: bextr32_c3_load_indexzext:
4308 ; X64-BMI1BMI2: # %bb.0:
4309 ; X64-BMI1BMI2-NEXT: pushq %rbp
4310 ; X64-BMI1BMI2-NEXT: pushq %rbx
4311 ; X64-BMI1BMI2-NEXT: pushq %rax
4312 ; X64-BMI1BMI2-NEXT: movl %edx, %ebx
4313 ; X64-BMI1BMI2-NEXT: shrxl %esi, (%rdi), %ebp
4314 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
4315 ; X64-BMI1BMI2-NEXT: negb %al
4316 ; X64-BMI1BMI2-NEXT: movl $-1, %ecx
4317 ; X64-BMI1BMI2-NEXT: shrxl %eax, %ecx, %edi
4318 ; X64-BMI1BMI2-NEXT: callq use32
4319 ; X64-BMI1BMI2-NEXT: bzhil %ebx, %ebp, %eax
4320 ; X64-BMI1BMI2-NEXT: addq $8, %rsp
4321 ; X64-BMI1BMI2-NEXT: popq %rbx
4322 ; X64-BMI1BMI2-NEXT: popq %rbp
4323 ; X64-BMI1BMI2-NEXT: retq
4324 %val = load i32, i32* %w
4325 %skip = zext i8 %numskipbits to i32
4326 %shifted = lshr i32 %val, %skip
4327 %numhighbits = sub i8 32, %numlowbits
4328 %sh_prom = zext i8 %numhighbits to i32
4329 %mask = lshr i32 -1, %sh_prom
4330 call void @use32(i32 %mask)
4331 %masked = and i32 %mask, %shifted
4335 define i32 @bextr32_c4_commutative(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
4336 ; X86-NOBMI-LABEL: bextr32_c4_commutative:
4337 ; X86-NOBMI: # %bb.0:
4338 ; X86-NOBMI-NEXT: pushl %edi
4339 ; X86-NOBMI-NEXT: pushl %esi
4340 ; X86-NOBMI-NEXT: pushl %eax
4341 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
4342 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edi
4343 ; X86-NOBMI-NEXT: shrl %cl, %edi
4344 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
4345 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
4346 ; X86-NOBMI-NEXT: movl $-1, %esi
4347 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
4348 ; X86-NOBMI-NEXT: shrl %cl, %esi
4349 ; X86-NOBMI-NEXT: movl %esi, (%esp)
4350 ; X86-NOBMI-NEXT: calll use32
4351 ; X86-NOBMI-NEXT: andl %edi, %esi
4352 ; X86-NOBMI-NEXT: movl %esi, %eax
4353 ; X86-NOBMI-NEXT: addl $4, %esp
4354 ; X86-NOBMI-NEXT: popl %esi
4355 ; X86-NOBMI-NEXT: popl %edi
4356 ; X86-NOBMI-NEXT: retl
4358 ; X86-BMI1NOTBM-LABEL: bextr32_c4_commutative:
4359 ; X86-BMI1NOTBM: # %bb.0:
4360 ; X86-BMI1NOTBM-NEXT: pushl %edi
4361 ; X86-BMI1NOTBM-NEXT: pushl %esi
4362 ; X86-BMI1NOTBM-NEXT: pushl %eax
4363 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
4364 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
4365 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
4366 ; X86-BMI1NOTBM-NEXT: xorl %ecx, %ecx
4367 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
4368 ; X86-BMI1NOTBM-NEXT: movl $-1, %esi
4369 ; X86-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
4370 ; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
4371 ; X86-BMI1NOTBM-NEXT: movl %esi, (%esp)
4372 ; X86-BMI1NOTBM-NEXT: calll use32
4373 ; X86-BMI1NOTBM-NEXT: andl %edi, %esi
4374 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
4375 ; X86-BMI1NOTBM-NEXT: addl $4, %esp
4376 ; X86-BMI1NOTBM-NEXT: popl %esi
4377 ; X86-BMI1NOTBM-NEXT: popl %edi
4378 ; X86-BMI1NOTBM-NEXT: retl
4380 ; X86-BMI1BMI2-LABEL: bextr32_c4_commutative:
4381 ; X86-BMI1BMI2: # %bb.0:
4382 ; X86-BMI1BMI2-NEXT: pushl %ebx
4383 ; X86-BMI1BMI2-NEXT: pushl %esi
4384 ; X86-BMI1BMI2-NEXT: pushl %eax
4385 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %bl
4386 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
4387 ; X86-BMI1BMI2-NEXT: shrxl %eax, {{[0-9]+}}(%esp), %esi
4388 ; X86-BMI1BMI2-NEXT: movl %ebx, %eax
4389 ; X86-BMI1BMI2-NEXT: negb %al
4390 ; X86-BMI1BMI2-NEXT: movl $-1, %ecx
4391 ; X86-BMI1BMI2-NEXT: shrxl %eax, %ecx, %eax
4392 ; X86-BMI1BMI2-NEXT: movl %eax, (%esp)
4393 ; X86-BMI1BMI2-NEXT: calll use32
4394 ; X86-BMI1BMI2-NEXT: bzhil %ebx, %esi, %eax
4395 ; X86-BMI1BMI2-NEXT: addl $4, %esp
4396 ; X86-BMI1BMI2-NEXT: popl %esi
4397 ; X86-BMI1BMI2-NEXT: popl %ebx
4398 ; X86-BMI1BMI2-NEXT: retl
4400 ; X64-NOBMI-LABEL: bextr32_c4_commutative:
4401 ; X64-NOBMI: # %bb.0:
4402 ; X64-NOBMI-NEXT: pushq %rbp
4403 ; X64-NOBMI-NEXT: pushq %rbx
4404 ; X64-NOBMI-NEXT: pushq %rax
4405 ; X64-NOBMI-NEXT: movl %esi, %ecx
4406 ; X64-NOBMI-NEXT: movl %edi, %ebx
4407 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
4408 ; X64-NOBMI-NEXT: shrl %cl, %ebx
4409 ; X64-NOBMI-NEXT: negb %dl
4410 ; X64-NOBMI-NEXT: movl $-1, %ebp
4411 ; X64-NOBMI-NEXT: movl %edx, %ecx
4412 ; X64-NOBMI-NEXT: shrl %cl, %ebp
4413 ; X64-NOBMI-NEXT: movl %ebp, %edi
4414 ; X64-NOBMI-NEXT: callq use32
4415 ; X64-NOBMI-NEXT: andl %ebx, %ebp
4416 ; X64-NOBMI-NEXT: movl %ebp, %eax
4417 ; X64-NOBMI-NEXT: addq $8, %rsp
4418 ; X64-NOBMI-NEXT: popq %rbx
4419 ; X64-NOBMI-NEXT: popq %rbp
4420 ; X64-NOBMI-NEXT: retq
4422 ; X64-BMI1NOTBM-LABEL: bextr32_c4_commutative:
4423 ; X64-BMI1NOTBM: # %bb.0:
4424 ; X64-BMI1NOTBM-NEXT: pushq %rbp
4425 ; X64-BMI1NOTBM-NEXT: pushq %rbx
4426 ; X64-BMI1NOTBM-NEXT: pushq %rax
4427 ; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
4428 ; X64-BMI1NOTBM-NEXT: movl %edi, %ebx
4429 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
4430 ; X64-BMI1NOTBM-NEXT: shrl %cl, %ebx
4431 ; X64-BMI1NOTBM-NEXT: negb %dl
4432 ; X64-BMI1NOTBM-NEXT: movl $-1, %ebp
4433 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
4434 ; X64-BMI1NOTBM-NEXT: shrl %cl, %ebp
4435 ; X64-BMI1NOTBM-NEXT: movl %ebp, %edi
4436 ; X64-BMI1NOTBM-NEXT: callq use32
4437 ; X64-BMI1NOTBM-NEXT: andl %ebx, %ebp
4438 ; X64-BMI1NOTBM-NEXT: movl %ebp, %eax
4439 ; X64-BMI1NOTBM-NEXT: addq $8, %rsp
4440 ; X64-BMI1NOTBM-NEXT: popq %rbx
4441 ; X64-BMI1NOTBM-NEXT: popq %rbp
4442 ; X64-BMI1NOTBM-NEXT: retq
4444 ; X64-BMI1BMI2-LABEL: bextr32_c4_commutative:
4445 ; X64-BMI1BMI2: # %bb.0:
4446 ; X64-BMI1BMI2-NEXT: pushq %rbp
4447 ; X64-BMI1BMI2-NEXT: pushq %rbx
4448 ; X64-BMI1BMI2-NEXT: pushq %rax
4449 ; X64-BMI1BMI2-NEXT: movl %edx, %ebx
4450 ; X64-BMI1BMI2-NEXT: shrxl %esi, %edi, %ebp
4451 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
4452 ; X64-BMI1BMI2-NEXT: negb %al
4453 ; X64-BMI1BMI2-NEXT: movl $-1, %ecx
4454 ; X64-BMI1BMI2-NEXT: shrxl %eax, %ecx, %edi
4455 ; X64-BMI1BMI2-NEXT: callq use32
4456 ; X64-BMI1BMI2-NEXT: bzhil %ebx, %ebp, %eax
4457 ; X64-BMI1BMI2-NEXT: addq $8, %rsp
4458 ; X64-BMI1BMI2-NEXT: popq %rbx
4459 ; X64-BMI1BMI2-NEXT: popq %rbp
4460 ; X64-BMI1BMI2-NEXT: retq
4461 %shifted = lshr i32 %val, %numskipbits
4462 %numhighbits = sub i32 32, %numlowbits
4463 %mask = lshr i32 -1, %numhighbits
4464 call void @use32(i32 %mask)
4465 %masked = and i32 %shifted, %mask ; swapped order
4469 define i32 @bextr32_c5_skipextrauses(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
4470 ; X86-NOBMI-LABEL: bextr32_c5_skipextrauses:
4471 ; X86-NOBMI: # %bb.0:
4472 ; X86-NOBMI-NEXT: pushl %ebx
4473 ; X86-NOBMI-NEXT: pushl %edi
4474 ; X86-NOBMI-NEXT: pushl %esi
4475 ; X86-NOBMI-NEXT: subl $16, %esp
4476 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edi
4477 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ebx
4478 ; X86-NOBMI-NEXT: movl %ebx, %ecx
4479 ; X86-NOBMI-NEXT: shrl %cl, %edi
4480 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
4481 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
4482 ; X86-NOBMI-NEXT: movl $-1, %esi
4483 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
4484 ; X86-NOBMI-NEXT: shrl %cl, %esi
4485 ; X86-NOBMI-NEXT: movl %esi, (%esp)
4486 ; X86-NOBMI-NEXT: calll use32
4487 ; X86-NOBMI-NEXT: andl %edi, %esi
4488 ; X86-NOBMI-NEXT: movl %ebx, (%esp)
4489 ; X86-NOBMI-NEXT: calll use32
4490 ; X86-NOBMI-NEXT: movl %esi, %eax
4491 ; X86-NOBMI-NEXT: addl $16, %esp
4492 ; X86-NOBMI-NEXT: popl %esi
4493 ; X86-NOBMI-NEXT: popl %edi
4494 ; X86-NOBMI-NEXT: popl %ebx
4495 ; X86-NOBMI-NEXT: retl
4497 ; X86-BMI1NOTBM-LABEL: bextr32_c5_skipextrauses:
4498 ; X86-BMI1NOTBM: # %bb.0:
4499 ; X86-BMI1NOTBM-NEXT: pushl %ebx
4500 ; X86-BMI1NOTBM-NEXT: pushl %edi
4501 ; X86-BMI1NOTBM-NEXT: pushl %esi
4502 ; X86-BMI1NOTBM-NEXT: subl $16, %esp
4503 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
4504 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %ebx
4505 ; X86-BMI1NOTBM-NEXT: movl %ebx, %ecx
4506 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
4507 ; X86-BMI1NOTBM-NEXT: xorl %ecx, %ecx
4508 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
4509 ; X86-BMI1NOTBM-NEXT: movl $-1, %esi
4510 ; X86-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
4511 ; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
4512 ; X86-BMI1NOTBM-NEXT: movl %esi, (%esp)
4513 ; X86-BMI1NOTBM-NEXT: calll use32
4514 ; X86-BMI1NOTBM-NEXT: andl %edi, %esi
4515 ; X86-BMI1NOTBM-NEXT: movl %ebx, (%esp)
4516 ; X86-BMI1NOTBM-NEXT: calll use32
4517 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
4518 ; X86-BMI1NOTBM-NEXT: addl $16, %esp
4519 ; X86-BMI1NOTBM-NEXT: popl %esi
4520 ; X86-BMI1NOTBM-NEXT: popl %edi
4521 ; X86-BMI1NOTBM-NEXT: popl %ebx
4522 ; X86-BMI1NOTBM-NEXT: retl
4524 ; X86-BMI1BMI2-LABEL: bextr32_c5_skipextrauses:
4525 ; X86-BMI1BMI2: # %bb.0:
4526 ; X86-BMI1BMI2-NEXT: pushl %ebx
4527 ; X86-BMI1BMI2-NEXT: pushl %edi
4528 ; X86-BMI1BMI2-NEXT: pushl %esi
4529 ; X86-BMI1BMI2-NEXT: subl $16, %esp
4530 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %bl
4531 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edi
4532 ; X86-BMI1BMI2-NEXT: shrxl %edi, {{[0-9]+}}(%esp), %esi
4533 ; X86-BMI1BMI2-NEXT: movl %ebx, %eax
4534 ; X86-BMI1BMI2-NEXT: negb %al
4535 ; X86-BMI1BMI2-NEXT: movl $-1, %ecx
4536 ; X86-BMI1BMI2-NEXT: shrxl %eax, %ecx, %eax
4537 ; X86-BMI1BMI2-NEXT: movl %eax, (%esp)
4538 ; X86-BMI1BMI2-NEXT: calll use32
4539 ; X86-BMI1BMI2-NEXT: bzhil %ebx, %esi, %esi
4540 ; X86-BMI1BMI2-NEXT: movl %edi, (%esp)
4541 ; X86-BMI1BMI2-NEXT: calll use32
4542 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
4543 ; X86-BMI1BMI2-NEXT: addl $16, %esp
4544 ; X86-BMI1BMI2-NEXT: popl %esi
4545 ; X86-BMI1BMI2-NEXT: popl %edi
4546 ; X86-BMI1BMI2-NEXT: popl %ebx
4547 ; X86-BMI1BMI2-NEXT: retl
4549 ; X64-NOBMI-LABEL: bextr32_c5_skipextrauses:
4550 ; X64-NOBMI: # %bb.0:
4551 ; X64-NOBMI-NEXT: pushq %rbp
4552 ; X64-NOBMI-NEXT: pushq %r14
4553 ; X64-NOBMI-NEXT: pushq %rbx
4554 ; X64-NOBMI-NEXT: movl %esi, %r14d
4555 ; X64-NOBMI-NEXT: movl %edi, %ebp
4556 ; X64-NOBMI-NEXT: movl %r14d, %ecx
4557 ; X64-NOBMI-NEXT: shrl %cl, %ebp
4558 ; X64-NOBMI-NEXT: negb %dl
4559 ; X64-NOBMI-NEXT: movl $-1, %ebx
4560 ; X64-NOBMI-NEXT: movl %edx, %ecx
4561 ; X64-NOBMI-NEXT: shrl %cl, %ebx
4562 ; X64-NOBMI-NEXT: movl %ebx, %edi
4563 ; X64-NOBMI-NEXT: callq use32
4564 ; X64-NOBMI-NEXT: andl %ebp, %ebx
4565 ; X64-NOBMI-NEXT: movl %r14d, %edi
4566 ; X64-NOBMI-NEXT: callq use32
4567 ; X64-NOBMI-NEXT: movl %ebx, %eax
4568 ; X64-NOBMI-NEXT: popq %rbx
4569 ; X64-NOBMI-NEXT: popq %r14
4570 ; X64-NOBMI-NEXT: popq %rbp
4571 ; X64-NOBMI-NEXT: retq
4573 ; X64-BMI1NOTBM-LABEL: bextr32_c5_skipextrauses:
4574 ; X64-BMI1NOTBM: # %bb.0:
4575 ; X64-BMI1NOTBM-NEXT: pushq %rbp
4576 ; X64-BMI1NOTBM-NEXT: pushq %r14
4577 ; X64-BMI1NOTBM-NEXT: pushq %rbx
4578 ; X64-BMI1NOTBM-NEXT: movl %esi, %r14d
4579 ; X64-BMI1NOTBM-NEXT: movl %edi, %ebp
4580 ; X64-BMI1NOTBM-NEXT: movl %r14d, %ecx
4581 ; X64-BMI1NOTBM-NEXT: shrl %cl, %ebp
4582 ; X64-BMI1NOTBM-NEXT: negb %dl
4583 ; X64-BMI1NOTBM-NEXT: movl $-1, %ebx
4584 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
4585 ; X64-BMI1NOTBM-NEXT: shrl %cl, %ebx
4586 ; X64-BMI1NOTBM-NEXT: movl %ebx, %edi
4587 ; X64-BMI1NOTBM-NEXT: callq use32
4588 ; X64-BMI1NOTBM-NEXT: andl %ebp, %ebx
4589 ; X64-BMI1NOTBM-NEXT: movl %r14d, %edi
4590 ; X64-BMI1NOTBM-NEXT: callq use32
4591 ; X64-BMI1NOTBM-NEXT: movl %ebx, %eax
4592 ; X64-BMI1NOTBM-NEXT: popq %rbx
4593 ; X64-BMI1NOTBM-NEXT: popq %r14
4594 ; X64-BMI1NOTBM-NEXT: popq %rbp
4595 ; X64-BMI1NOTBM-NEXT: retq
4597 ; X64-BMI1BMI2-LABEL: bextr32_c5_skipextrauses:
4598 ; X64-BMI1BMI2: # %bb.0:
4599 ; X64-BMI1BMI2-NEXT: pushq %rbp
4600 ; X64-BMI1BMI2-NEXT: pushq %r14
4601 ; X64-BMI1BMI2-NEXT: pushq %rbx
4602 ; X64-BMI1BMI2-NEXT: movl %edx, %ebx
4603 ; X64-BMI1BMI2-NEXT: movl %esi, %ebp
4604 ; X64-BMI1BMI2-NEXT: shrxl %esi, %edi, %r14d
4605 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
4606 ; X64-BMI1BMI2-NEXT: negb %al
4607 ; X64-BMI1BMI2-NEXT: movl $-1, %ecx
4608 ; X64-BMI1BMI2-NEXT: shrxl %eax, %ecx, %edi
4609 ; X64-BMI1BMI2-NEXT: callq use32
4610 ; X64-BMI1BMI2-NEXT: bzhil %ebx, %r14d, %ebx
4611 ; X64-BMI1BMI2-NEXT: movl %ebp, %edi
4612 ; X64-BMI1BMI2-NEXT: callq use32
4613 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
4614 ; X64-BMI1BMI2-NEXT: popq %rbx
4615 ; X64-BMI1BMI2-NEXT: popq %r14
4616 ; X64-BMI1BMI2-NEXT: popq %rbp
4617 ; X64-BMI1BMI2-NEXT: retq
4618 %shifted = lshr i32 %val, %numskipbits
4619 %numhighbits = sub i32 32, %numlowbits
4620 %mask = lshr i32 -1, %numhighbits
4621 call void @use32(i32 %mask)
4622 %masked = and i32 %mask, %shifted
4623 call void @use32(i32 %numskipbits)
4629 define i64 @bextr64_c0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
4630 ; X86-NOBMI-LABEL: bextr64_c0:
4631 ; X86-NOBMI: # %bb.0:
4632 ; X86-NOBMI-NEXT: pushl %ebp
4633 ; X86-NOBMI-NEXT: pushl %ebx
4634 ; X86-NOBMI-NEXT: pushl %edi
4635 ; X86-NOBMI-NEXT: pushl %esi
4636 ; X86-NOBMI-NEXT: subl $12, %esp
4637 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
4638 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
4639 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
4640 ; X86-NOBMI-NEXT: movl %eax, %edi
4641 ; X86-NOBMI-NEXT: shrl %cl, %edi
4642 ; X86-NOBMI-NEXT: shrdl %cl, %eax, %esi
4643 ; X86-NOBMI-NEXT: testb $32, %cl
4644 ; X86-NOBMI-NEXT: je .LBB39_2
4645 ; X86-NOBMI-NEXT: # %bb.1:
4646 ; X86-NOBMI-NEXT: movl %edi, %esi
4647 ; X86-NOBMI-NEXT: xorl %edi, %edi
4648 ; X86-NOBMI-NEXT: .LBB39_2:
4649 ; X86-NOBMI-NEXT: movb $64, %cl
4650 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
4651 ; X86-NOBMI-NEXT: movl $-1, %ebp
4652 ; X86-NOBMI-NEXT: movl $-1, %ebx
4653 ; X86-NOBMI-NEXT: shrl %cl, %ebx
4654 ; X86-NOBMI-NEXT: shrdl %cl, %ebp, %ebp
4655 ; X86-NOBMI-NEXT: testb $32, %cl
4656 ; X86-NOBMI-NEXT: je .LBB39_4
4657 ; X86-NOBMI-NEXT: # %bb.3:
4658 ; X86-NOBMI-NEXT: movl %ebx, %ebp
4659 ; X86-NOBMI-NEXT: xorl %ebx, %ebx
4660 ; X86-NOBMI-NEXT: .LBB39_4:
4661 ; X86-NOBMI-NEXT: subl $8, %esp
4662 ; X86-NOBMI-NEXT: pushl %ebx
4663 ; X86-NOBMI-NEXT: pushl %ebp
4664 ; X86-NOBMI-NEXT: calll use64
4665 ; X86-NOBMI-NEXT: addl $16, %esp
4666 ; X86-NOBMI-NEXT: andl %ebp, %esi
4667 ; X86-NOBMI-NEXT: andl %ebx, %edi
4668 ; X86-NOBMI-NEXT: movl %esi, %eax
4669 ; X86-NOBMI-NEXT: movl %edi, %edx
4670 ; X86-NOBMI-NEXT: addl $12, %esp
4671 ; X86-NOBMI-NEXT: popl %esi
4672 ; X86-NOBMI-NEXT: popl %edi
4673 ; X86-NOBMI-NEXT: popl %ebx
4674 ; X86-NOBMI-NEXT: popl %ebp
4675 ; X86-NOBMI-NEXT: retl
4677 ; X86-BMI1NOTBM-LABEL: bextr64_c0:
4678 ; X86-BMI1NOTBM: # %bb.0:
4679 ; X86-BMI1NOTBM-NEXT: pushl %ebp
4680 ; X86-BMI1NOTBM-NEXT: pushl %ebx
4681 ; X86-BMI1NOTBM-NEXT: pushl %edi
4682 ; X86-BMI1NOTBM-NEXT: pushl %esi
4683 ; X86-BMI1NOTBM-NEXT: subl $12, %esp
4684 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
4685 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
4686 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
4687 ; X86-BMI1NOTBM-NEXT: movl %eax, %edi
4688 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
4689 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %eax, %esi
4690 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
4691 ; X86-BMI1NOTBM-NEXT: je .LBB39_2
4692 ; X86-BMI1NOTBM-NEXT: # %bb.1:
4693 ; X86-BMI1NOTBM-NEXT: movl %edi, %esi
4694 ; X86-BMI1NOTBM-NEXT: xorl %edi, %edi
4695 ; X86-BMI1NOTBM-NEXT: .LBB39_2:
4696 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
4697 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
4698 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebp
4699 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
4700 ; X86-BMI1NOTBM-NEXT: shrl %cl, %ebx
4701 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %ebp, %ebp
4702 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
4703 ; X86-BMI1NOTBM-NEXT: je .LBB39_4
4704 ; X86-BMI1NOTBM-NEXT: # %bb.3:
4705 ; X86-BMI1NOTBM-NEXT: movl %ebx, %ebp
4706 ; X86-BMI1NOTBM-NEXT: xorl %ebx, %ebx
4707 ; X86-BMI1NOTBM-NEXT: .LBB39_4:
4708 ; X86-BMI1NOTBM-NEXT: subl $8, %esp
4709 ; X86-BMI1NOTBM-NEXT: pushl %ebx
4710 ; X86-BMI1NOTBM-NEXT: pushl %ebp
4711 ; X86-BMI1NOTBM-NEXT: calll use64
4712 ; X86-BMI1NOTBM-NEXT: addl $16, %esp
4713 ; X86-BMI1NOTBM-NEXT: andl %ebp, %esi
4714 ; X86-BMI1NOTBM-NEXT: andl %ebx, %edi
4715 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
4716 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
4717 ; X86-BMI1NOTBM-NEXT: addl $12, %esp
4718 ; X86-BMI1NOTBM-NEXT: popl %esi
4719 ; X86-BMI1NOTBM-NEXT: popl %edi
4720 ; X86-BMI1NOTBM-NEXT: popl %ebx
4721 ; X86-BMI1NOTBM-NEXT: popl %ebp
4722 ; X86-BMI1NOTBM-NEXT: retl
4724 ; X86-BMI1BMI2-LABEL: bextr64_c0:
4725 ; X86-BMI1BMI2: # %bb.0:
4726 ; X86-BMI1BMI2-NEXT: pushl %ebp
4727 ; X86-BMI1BMI2-NEXT: pushl %ebx
4728 ; X86-BMI1BMI2-NEXT: pushl %edi
4729 ; X86-BMI1BMI2-NEXT: pushl %esi
4730 ; X86-BMI1BMI2-NEXT: subl $12, %esp
4731 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
4732 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
4733 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
4734 ; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %esi
4735 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %edi
4736 ; X86-BMI1BMI2-NEXT: testb $32, %cl
4737 ; X86-BMI1BMI2-NEXT: je .LBB39_2
4738 ; X86-BMI1BMI2-NEXT: # %bb.1:
4739 ; X86-BMI1BMI2-NEXT: movl %edi, %esi
4740 ; X86-BMI1BMI2-NEXT: xorl %edi, %edi
4741 ; X86-BMI1BMI2-NEXT: .LBB39_2:
4742 ; X86-BMI1BMI2-NEXT: movb $64, %cl
4743 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
4744 ; X86-BMI1BMI2-NEXT: movl $-1, %ebx
4745 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %ebx, %ebp
4746 ; X86-BMI1BMI2-NEXT: shrdl %cl, %ebx, %ebx
4747 ; X86-BMI1BMI2-NEXT: testb $32, %cl
4748 ; X86-BMI1BMI2-NEXT: je .LBB39_4
4749 ; X86-BMI1BMI2-NEXT: # %bb.3:
4750 ; X86-BMI1BMI2-NEXT: movl %ebp, %ebx
4751 ; X86-BMI1BMI2-NEXT: xorl %ebp, %ebp
4752 ; X86-BMI1BMI2-NEXT: .LBB39_4:
4753 ; X86-BMI1BMI2-NEXT: subl $8, %esp
4754 ; X86-BMI1BMI2-NEXT: pushl %ebp
4755 ; X86-BMI1BMI2-NEXT: pushl %ebx
4756 ; X86-BMI1BMI2-NEXT: calll use64
4757 ; X86-BMI1BMI2-NEXT: addl $16, %esp
4758 ; X86-BMI1BMI2-NEXT: andl %ebx, %esi
4759 ; X86-BMI1BMI2-NEXT: andl %ebp, %edi
4760 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
4761 ; X86-BMI1BMI2-NEXT: movl %edi, %edx
4762 ; X86-BMI1BMI2-NEXT: addl $12, %esp
4763 ; X86-BMI1BMI2-NEXT: popl %esi
4764 ; X86-BMI1BMI2-NEXT: popl %edi
4765 ; X86-BMI1BMI2-NEXT: popl %ebx
4766 ; X86-BMI1BMI2-NEXT: popl %ebp
4767 ; X86-BMI1BMI2-NEXT: retl
4769 ; X64-NOBMI-LABEL: bextr64_c0:
4770 ; X64-NOBMI: # %bb.0:
4771 ; X64-NOBMI-NEXT: pushq %r14
4772 ; X64-NOBMI-NEXT: pushq %rbx
4773 ; X64-NOBMI-NEXT: pushq %rax
4774 ; X64-NOBMI-NEXT: movq %rsi, %rcx
4775 ; X64-NOBMI-NEXT: movq %rdi, %r14
4776 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
4777 ; X64-NOBMI-NEXT: shrq %cl, %r14
4778 ; X64-NOBMI-NEXT: negb %dl
4779 ; X64-NOBMI-NEXT: movq $-1, %rbx
4780 ; X64-NOBMI-NEXT: movl %edx, %ecx
4781 ; X64-NOBMI-NEXT: shrq %cl, %rbx
4782 ; X64-NOBMI-NEXT: movq %rbx, %rdi
4783 ; X64-NOBMI-NEXT: callq use64
4784 ; X64-NOBMI-NEXT: andq %r14, %rbx
4785 ; X64-NOBMI-NEXT: movq %rbx, %rax
4786 ; X64-NOBMI-NEXT: addq $8, %rsp
4787 ; X64-NOBMI-NEXT: popq %rbx
4788 ; X64-NOBMI-NEXT: popq %r14
4789 ; X64-NOBMI-NEXT: retq
4791 ; X64-BMI1NOTBM-LABEL: bextr64_c0:
4792 ; X64-BMI1NOTBM: # %bb.0:
4793 ; X64-BMI1NOTBM-NEXT: pushq %r14
4794 ; X64-BMI1NOTBM-NEXT: pushq %rbx
4795 ; X64-BMI1NOTBM-NEXT: pushq %rax
4796 ; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx
4797 ; X64-BMI1NOTBM-NEXT: movq %rdi, %r14
4798 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx
4799 ; X64-BMI1NOTBM-NEXT: shrq %cl, %r14
4800 ; X64-BMI1NOTBM-NEXT: negb %dl
4801 ; X64-BMI1NOTBM-NEXT: movq $-1, %rbx
4802 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
4803 ; X64-BMI1NOTBM-NEXT: shrq %cl, %rbx
4804 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rdi
4805 ; X64-BMI1NOTBM-NEXT: callq use64
4806 ; X64-BMI1NOTBM-NEXT: andq %r14, %rbx
4807 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
4808 ; X64-BMI1NOTBM-NEXT: addq $8, %rsp
4809 ; X64-BMI1NOTBM-NEXT: popq %rbx
4810 ; X64-BMI1NOTBM-NEXT: popq %r14
4811 ; X64-BMI1NOTBM-NEXT: retq
4813 ; X64-BMI1BMI2-LABEL: bextr64_c0:
4814 ; X64-BMI1BMI2: # %bb.0:
4815 ; X64-BMI1BMI2-NEXT: pushq %r14
4816 ; X64-BMI1BMI2-NEXT: pushq %rbx
4817 ; X64-BMI1BMI2-NEXT: pushq %rax
4818 ; X64-BMI1BMI2-NEXT: movq %rdx, %rbx
4819 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %r14
4820 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
4821 ; X64-BMI1BMI2-NEXT: negb %al
4822 ; X64-BMI1BMI2-NEXT: movq $-1, %rcx
4823 ; X64-BMI1BMI2-NEXT: shrxq %rax, %rcx, %rdi
4824 ; X64-BMI1BMI2-NEXT: callq use64
4825 ; X64-BMI1BMI2-NEXT: bzhiq %rbx, %r14, %rax
4826 ; X64-BMI1BMI2-NEXT: addq $8, %rsp
4827 ; X64-BMI1BMI2-NEXT: popq %rbx
4828 ; X64-BMI1BMI2-NEXT: popq %r14
4829 ; X64-BMI1BMI2-NEXT: retq
4830 %shifted = lshr i64 %val, %numskipbits
4831 %numhighbits = sub i64 64, %numlowbits
4832 %mask = lshr i64 -1, %numhighbits
4833 call void @use64(i64 %mask)
4834 %masked = and i64 %mask, %shifted
4838 define i64 @bextr64_c1_indexzext(i64 %val, i8 %numskipbits, i8 %numlowbits) nounwind {
4839 ; X86-NOBMI-LABEL: bextr64_c1_indexzext:
4840 ; X86-NOBMI: # %bb.0:
4841 ; X86-NOBMI-NEXT: pushl %ebp
4842 ; X86-NOBMI-NEXT: pushl %ebx
4843 ; X86-NOBMI-NEXT: pushl %edi
4844 ; X86-NOBMI-NEXT: pushl %esi
4845 ; X86-NOBMI-NEXT: subl $12, %esp
4846 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
4847 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
4848 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
4849 ; X86-NOBMI-NEXT: movl %eax, %edi
4850 ; X86-NOBMI-NEXT: shrl %cl, %edi
4851 ; X86-NOBMI-NEXT: shrdl %cl, %eax, %esi
4852 ; X86-NOBMI-NEXT: testb $32, %cl
4853 ; X86-NOBMI-NEXT: je .LBB40_2
4854 ; X86-NOBMI-NEXT: # %bb.1:
4855 ; X86-NOBMI-NEXT: movl %edi, %esi
4856 ; X86-NOBMI-NEXT: xorl %edi, %edi
4857 ; X86-NOBMI-NEXT: .LBB40_2:
4858 ; X86-NOBMI-NEXT: movb $64, %cl
4859 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
4860 ; X86-NOBMI-NEXT: movl $-1, %ebp
4861 ; X86-NOBMI-NEXT: movl $-1, %ebx
4862 ; X86-NOBMI-NEXT: shrl %cl, %ebx
4863 ; X86-NOBMI-NEXT: shrdl %cl, %ebp, %ebp
4864 ; X86-NOBMI-NEXT: testb $32, %cl
4865 ; X86-NOBMI-NEXT: je .LBB40_4
4866 ; X86-NOBMI-NEXT: # %bb.3:
4867 ; X86-NOBMI-NEXT: movl %ebx, %ebp
4868 ; X86-NOBMI-NEXT: xorl %ebx, %ebx
4869 ; X86-NOBMI-NEXT: .LBB40_4:
4870 ; X86-NOBMI-NEXT: subl $8, %esp
4871 ; X86-NOBMI-NEXT: pushl %ebx
4872 ; X86-NOBMI-NEXT: pushl %ebp
4873 ; X86-NOBMI-NEXT: calll use64
4874 ; X86-NOBMI-NEXT: addl $16, %esp
4875 ; X86-NOBMI-NEXT: andl %ebp, %esi
4876 ; X86-NOBMI-NEXT: andl %ebx, %edi
4877 ; X86-NOBMI-NEXT: movl %esi, %eax
4878 ; X86-NOBMI-NEXT: movl %edi, %edx
4879 ; X86-NOBMI-NEXT: addl $12, %esp
4880 ; X86-NOBMI-NEXT: popl %esi
4881 ; X86-NOBMI-NEXT: popl %edi
4882 ; X86-NOBMI-NEXT: popl %ebx
4883 ; X86-NOBMI-NEXT: popl %ebp
4884 ; X86-NOBMI-NEXT: retl
4886 ; X86-BMI1NOTBM-LABEL: bextr64_c1_indexzext:
4887 ; X86-BMI1NOTBM: # %bb.0:
4888 ; X86-BMI1NOTBM-NEXT: pushl %ebp
4889 ; X86-BMI1NOTBM-NEXT: pushl %ebx
4890 ; X86-BMI1NOTBM-NEXT: pushl %edi
4891 ; X86-BMI1NOTBM-NEXT: pushl %esi
4892 ; X86-BMI1NOTBM-NEXT: subl $12, %esp
4893 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
4894 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
4895 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
4896 ; X86-BMI1NOTBM-NEXT: movl %eax, %edi
4897 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
4898 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %eax, %esi
4899 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
4900 ; X86-BMI1NOTBM-NEXT: je .LBB40_2
4901 ; X86-BMI1NOTBM-NEXT: # %bb.1:
4902 ; X86-BMI1NOTBM-NEXT: movl %edi, %esi
4903 ; X86-BMI1NOTBM-NEXT: xorl %edi, %edi
4904 ; X86-BMI1NOTBM-NEXT: .LBB40_2:
4905 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
4906 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
4907 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebp
4908 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
4909 ; X86-BMI1NOTBM-NEXT: shrl %cl, %ebx
4910 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %ebp, %ebp
4911 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
4912 ; X86-BMI1NOTBM-NEXT: je .LBB40_4
4913 ; X86-BMI1NOTBM-NEXT: # %bb.3:
4914 ; X86-BMI1NOTBM-NEXT: movl %ebx, %ebp
4915 ; X86-BMI1NOTBM-NEXT: xorl %ebx, %ebx
4916 ; X86-BMI1NOTBM-NEXT: .LBB40_4:
4917 ; X86-BMI1NOTBM-NEXT: subl $8, %esp
4918 ; X86-BMI1NOTBM-NEXT: pushl %ebx
4919 ; X86-BMI1NOTBM-NEXT: pushl %ebp
4920 ; X86-BMI1NOTBM-NEXT: calll use64
4921 ; X86-BMI1NOTBM-NEXT: addl $16, %esp
4922 ; X86-BMI1NOTBM-NEXT: andl %ebp, %esi
4923 ; X86-BMI1NOTBM-NEXT: andl %ebx, %edi
4924 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
4925 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
4926 ; X86-BMI1NOTBM-NEXT: addl $12, %esp
4927 ; X86-BMI1NOTBM-NEXT: popl %esi
4928 ; X86-BMI1NOTBM-NEXT: popl %edi
4929 ; X86-BMI1NOTBM-NEXT: popl %ebx
4930 ; X86-BMI1NOTBM-NEXT: popl %ebp
4931 ; X86-BMI1NOTBM-NEXT: retl
4933 ; X86-BMI1BMI2-LABEL: bextr64_c1_indexzext:
4934 ; X86-BMI1BMI2: # %bb.0:
4935 ; X86-BMI1BMI2-NEXT: pushl %ebp
4936 ; X86-BMI1BMI2-NEXT: pushl %ebx
4937 ; X86-BMI1BMI2-NEXT: pushl %edi
4938 ; X86-BMI1BMI2-NEXT: pushl %esi
4939 ; X86-BMI1BMI2-NEXT: subl $12, %esp
4940 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
4941 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
4942 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
4943 ; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %esi
4944 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %edi
4945 ; X86-BMI1BMI2-NEXT: testb $32, %cl
4946 ; X86-BMI1BMI2-NEXT: je .LBB40_2
4947 ; X86-BMI1BMI2-NEXT: # %bb.1:
4948 ; X86-BMI1BMI2-NEXT: movl %edi, %esi
4949 ; X86-BMI1BMI2-NEXT: xorl %edi, %edi
4950 ; X86-BMI1BMI2-NEXT: .LBB40_2:
4951 ; X86-BMI1BMI2-NEXT: movb $64, %cl
4952 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
4953 ; X86-BMI1BMI2-NEXT: movl $-1, %ebx
4954 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %ebx, %ebp
4955 ; X86-BMI1BMI2-NEXT: shrdl %cl, %ebx, %ebx
4956 ; X86-BMI1BMI2-NEXT: testb $32, %cl
4957 ; X86-BMI1BMI2-NEXT: je .LBB40_4
4958 ; X86-BMI1BMI2-NEXT: # %bb.3:
4959 ; X86-BMI1BMI2-NEXT: movl %ebp, %ebx
4960 ; X86-BMI1BMI2-NEXT: xorl %ebp, %ebp
4961 ; X86-BMI1BMI2-NEXT: .LBB40_4:
4962 ; X86-BMI1BMI2-NEXT: subl $8, %esp
4963 ; X86-BMI1BMI2-NEXT: pushl %ebp
4964 ; X86-BMI1BMI2-NEXT: pushl %ebx
4965 ; X86-BMI1BMI2-NEXT: calll use64
4966 ; X86-BMI1BMI2-NEXT: addl $16, %esp
4967 ; X86-BMI1BMI2-NEXT: andl %ebx, %esi
4968 ; X86-BMI1BMI2-NEXT: andl %ebp, %edi
4969 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
4970 ; X86-BMI1BMI2-NEXT: movl %edi, %edx
4971 ; X86-BMI1BMI2-NEXT: addl $12, %esp
4972 ; X86-BMI1BMI2-NEXT: popl %esi
4973 ; X86-BMI1BMI2-NEXT: popl %edi
4974 ; X86-BMI1BMI2-NEXT: popl %ebx
4975 ; X86-BMI1BMI2-NEXT: popl %ebp
4976 ; X86-BMI1BMI2-NEXT: retl
4978 ; X64-NOBMI-LABEL: bextr64_c1_indexzext:
4979 ; X64-NOBMI: # %bb.0:
4980 ; X64-NOBMI-NEXT: pushq %r14
4981 ; X64-NOBMI-NEXT: pushq %rbx
4982 ; X64-NOBMI-NEXT: pushq %rax
4983 ; X64-NOBMI-NEXT: movl %esi, %ecx
4984 ; X64-NOBMI-NEXT: movq %rdi, %r14
4985 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
4986 ; X64-NOBMI-NEXT: shrq %cl, %r14
4987 ; X64-NOBMI-NEXT: negb %dl
4988 ; X64-NOBMI-NEXT: movq $-1, %rbx
4989 ; X64-NOBMI-NEXT: movl %edx, %ecx
4990 ; X64-NOBMI-NEXT: shrq %cl, %rbx
4991 ; X64-NOBMI-NEXT: movq %rbx, %rdi
4992 ; X64-NOBMI-NEXT: callq use64
4993 ; X64-NOBMI-NEXT: andq %r14, %rbx
4994 ; X64-NOBMI-NEXT: movq %rbx, %rax
4995 ; X64-NOBMI-NEXT: addq $8, %rsp
4996 ; X64-NOBMI-NEXT: popq %rbx
4997 ; X64-NOBMI-NEXT: popq %r14
4998 ; X64-NOBMI-NEXT: retq
5000 ; X64-BMI1NOTBM-LABEL: bextr64_c1_indexzext:
5001 ; X64-BMI1NOTBM: # %bb.0:
5002 ; X64-BMI1NOTBM-NEXT: pushq %r14
5003 ; X64-BMI1NOTBM-NEXT: pushq %rbx
5004 ; X64-BMI1NOTBM-NEXT: pushq %rax
5005 ; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
5006 ; X64-BMI1NOTBM-NEXT: movq %rdi, %r14
5007 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
5008 ; X64-BMI1NOTBM-NEXT: shrq %cl, %r14
5009 ; X64-BMI1NOTBM-NEXT: negb %dl
5010 ; X64-BMI1NOTBM-NEXT: movq $-1, %rbx
5011 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
5012 ; X64-BMI1NOTBM-NEXT: shrq %cl, %rbx
5013 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rdi
5014 ; X64-BMI1NOTBM-NEXT: callq use64
5015 ; X64-BMI1NOTBM-NEXT: andq %r14, %rbx
5016 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
5017 ; X64-BMI1NOTBM-NEXT: addq $8, %rsp
5018 ; X64-BMI1NOTBM-NEXT: popq %rbx
5019 ; X64-BMI1NOTBM-NEXT: popq %r14
5020 ; X64-BMI1NOTBM-NEXT: retq
5022 ; X64-BMI1BMI2-LABEL: bextr64_c1_indexzext:
5023 ; X64-BMI1BMI2: # %bb.0:
5024 ; X64-BMI1BMI2-NEXT: pushq %r14
5025 ; X64-BMI1BMI2-NEXT: pushq %rbx
5026 ; X64-BMI1BMI2-NEXT: pushq %rax
5027 ; X64-BMI1BMI2-NEXT: movl %edx, %ebx
5028 ; X64-BMI1BMI2-NEXT: # kill: def $esi killed $esi def $rsi
5029 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %r14
5030 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
5031 ; X64-BMI1BMI2-NEXT: negb %al
5032 ; X64-BMI1BMI2-NEXT: movq $-1, %rcx
5033 ; X64-BMI1BMI2-NEXT: shrxq %rax, %rcx, %rdi
5034 ; X64-BMI1BMI2-NEXT: callq use64
5035 ; X64-BMI1BMI2-NEXT: bzhiq %rbx, %r14, %rax
5036 ; X64-BMI1BMI2-NEXT: addq $8, %rsp
5037 ; X64-BMI1BMI2-NEXT: popq %rbx
5038 ; X64-BMI1BMI2-NEXT: popq %r14
5039 ; X64-BMI1BMI2-NEXT: retq
5040 %skip = zext i8 %numskipbits to i64
5041 %shifted = lshr i64 %val, %skip
5042 %numhighbits = sub i8 64, %numlowbits
5043 %sh_prom = zext i8 %numhighbits to i64
5044 %mask = lshr i64 -1, %sh_prom
5045 call void @use64(i64 %mask)
5046 %masked = and i64 %mask, %shifted
5050 define i64 @bextr64_c2_load(i64* %w, i64 %numskipbits, i64 %numlowbits) nounwind {
5051 ; X86-NOBMI-LABEL: bextr64_c2_load:
5052 ; X86-NOBMI: # %bb.0:
5053 ; X86-NOBMI-NEXT: pushl %ebp
5054 ; X86-NOBMI-NEXT: pushl %ebx
5055 ; X86-NOBMI-NEXT: pushl %edi
5056 ; X86-NOBMI-NEXT: pushl %esi
5057 ; X86-NOBMI-NEXT: subl $12, %esp
5058 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
5059 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
5060 ; X86-NOBMI-NEXT: movl (%eax), %esi
5061 ; X86-NOBMI-NEXT: movl 4(%eax), %eax
5062 ; X86-NOBMI-NEXT: movl %eax, %edi
5063 ; X86-NOBMI-NEXT: shrl %cl, %edi
5064 ; X86-NOBMI-NEXT: shrdl %cl, %eax, %esi
5065 ; X86-NOBMI-NEXT: testb $32, %cl
5066 ; X86-NOBMI-NEXT: je .LBB41_2
5067 ; X86-NOBMI-NEXT: # %bb.1:
5068 ; X86-NOBMI-NEXT: movl %edi, %esi
5069 ; X86-NOBMI-NEXT: xorl %edi, %edi
5070 ; X86-NOBMI-NEXT: .LBB41_2:
5071 ; X86-NOBMI-NEXT: movb $64, %cl
5072 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
5073 ; X86-NOBMI-NEXT: movl $-1, %ebp
5074 ; X86-NOBMI-NEXT: movl $-1, %ebx
5075 ; X86-NOBMI-NEXT: shrl %cl, %ebx
5076 ; X86-NOBMI-NEXT: shrdl %cl, %ebp, %ebp
5077 ; X86-NOBMI-NEXT: testb $32, %cl
5078 ; X86-NOBMI-NEXT: je .LBB41_4
5079 ; X86-NOBMI-NEXT: # %bb.3:
5080 ; X86-NOBMI-NEXT: movl %ebx, %ebp
5081 ; X86-NOBMI-NEXT: xorl %ebx, %ebx
5082 ; X86-NOBMI-NEXT: .LBB41_4:
5083 ; X86-NOBMI-NEXT: subl $8, %esp
5084 ; X86-NOBMI-NEXT: pushl %ebx
5085 ; X86-NOBMI-NEXT: pushl %ebp
5086 ; X86-NOBMI-NEXT: calll use64
5087 ; X86-NOBMI-NEXT: addl $16, %esp
5088 ; X86-NOBMI-NEXT: andl %ebp, %esi
5089 ; X86-NOBMI-NEXT: andl %ebx, %edi
5090 ; X86-NOBMI-NEXT: movl %esi, %eax
5091 ; X86-NOBMI-NEXT: movl %edi, %edx
5092 ; X86-NOBMI-NEXT: addl $12, %esp
5093 ; X86-NOBMI-NEXT: popl %esi
5094 ; X86-NOBMI-NEXT: popl %edi
5095 ; X86-NOBMI-NEXT: popl %ebx
5096 ; X86-NOBMI-NEXT: popl %ebp
5097 ; X86-NOBMI-NEXT: retl
5099 ; X86-BMI1NOTBM-LABEL: bextr64_c2_load:
5100 ; X86-BMI1NOTBM: # %bb.0:
5101 ; X86-BMI1NOTBM-NEXT: pushl %ebp
5102 ; X86-BMI1NOTBM-NEXT: pushl %ebx
5103 ; X86-BMI1NOTBM-NEXT: pushl %edi
5104 ; X86-BMI1NOTBM-NEXT: pushl %esi
5105 ; X86-BMI1NOTBM-NEXT: subl $12, %esp
5106 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
5107 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
5108 ; X86-BMI1NOTBM-NEXT: movl (%eax), %esi
5109 ; X86-BMI1NOTBM-NEXT: movl 4(%eax), %eax
5110 ; X86-BMI1NOTBM-NEXT: movl %eax, %edi
5111 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
5112 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %eax, %esi
5113 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
5114 ; X86-BMI1NOTBM-NEXT: je .LBB41_2
5115 ; X86-BMI1NOTBM-NEXT: # %bb.1:
5116 ; X86-BMI1NOTBM-NEXT: movl %edi, %esi
5117 ; X86-BMI1NOTBM-NEXT: xorl %edi, %edi
5118 ; X86-BMI1NOTBM-NEXT: .LBB41_2:
5119 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
5120 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
5121 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebp
5122 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
5123 ; X86-BMI1NOTBM-NEXT: shrl %cl, %ebx
5124 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %ebp, %ebp
5125 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
5126 ; X86-BMI1NOTBM-NEXT: je .LBB41_4
5127 ; X86-BMI1NOTBM-NEXT: # %bb.3:
5128 ; X86-BMI1NOTBM-NEXT: movl %ebx, %ebp
5129 ; X86-BMI1NOTBM-NEXT: xorl %ebx, %ebx
5130 ; X86-BMI1NOTBM-NEXT: .LBB41_4:
5131 ; X86-BMI1NOTBM-NEXT: subl $8, %esp
5132 ; X86-BMI1NOTBM-NEXT: pushl %ebx
5133 ; X86-BMI1NOTBM-NEXT: pushl %ebp
5134 ; X86-BMI1NOTBM-NEXT: calll use64
5135 ; X86-BMI1NOTBM-NEXT: addl $16, %esp
5136 ; X86-BMI1NOTBM-NEXT: andl %ebp, %esi
5137 ; X86-BMI1NOTBM-NEXT: andl %ebx, %edi
5138 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
5139 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
5140 ; X86-BMI1NOTBM-NEXT: addl $12, %esp
5141 ; X86-BMI1NOTBM-NEXT: popl %esi
5142 ; X86-BMI1NOTBM-NEXT: popl %edi
5143 ; X86-BMI1NOTBM-NEXT: popl %ebx
5144 ; X86-BMI1NOTBM-NEXT: popl %ebp
5145 ; X86-BMI1NOTBM-NEXT: retl
5147 ; X86-BMI1BMI2-LABEL: bextr64_c2_load:
5148 ; X86-BMI1BMI2: # %bb.0:
5149 ; X86-BMI1BMI2-NEXT: pushl %ebp
5150 ; X86-BMI1BMI2-NEXT: pushl %ebx
5151 ; X86-BMI1BMI2-NEXT: pushl %edi
5152 ; X86-BMI1BMI2-NEXT: pushl %esi
5153 ; X86-BMI1BMI2-NEXT: subl $12, %esp
5154 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
5155 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
5156 ; X86-BMI1BMI2-NEXT: movl (%eax), %esi
5157 ; X86-BMI1BMI2-NEXT: movl 4(%eax), %eax
5158 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %edi
5159 ; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %esi
5160 ; X86-BMI1BMI2-NEXT: testb $32, %cl
5161 ; X86-BMI1BMI2-NEXT: je .LBB41_2
5162 ; X86-BMI1BMI2-NEXT: # %bb.1:
5163 ; X86-BMI1BMI2-NEXT: movl %edi, %esi
5164 ; X86-BMI1BMI2-NEXT: xorl %edi, %edi
5165 ; X86-BMI1BMI2-NEXT: .LBB41_2:
5166 ; X86-BMI1BMI2-NEXT: movb $64, %cl
5167 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
5168 ; X86-BMI1BMI2-NEXT: movl $-1, %ebx
5169 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %ebx, %ebp
5170 ; X86-BMI1BMI2-NEXT: shrdl %cl, %ebx, %ebx
5171 ; X86-BMI1BMI2-NEXT: testb $32, %cl
5172 ; X86-BMI1BMI2-NEXT: je .LBB41_4
5173 ; X86-BMI1BMI2-NEXT: # %bb.3:
5174 ; X86-BMI1BMI2-NEXT: movl %ebp, %ebx
5175 ; X86-BMI1BMI2-NEXT: xorl %ebp, %ebp
5176 ; X86-BMI1BMI2-NEXT: .LBB41_4:
5177 ; X86-BMI1BMI2-NEXT: subl $8, %esp
5178 ; X86-BMI1BMI2-NEXT: pushl %ebp
5179 ; X86-BMI1BMI2-NEXT: pushl %ebx
5180 ; X86-BMI1BMI2-NEXT: calll use64
5181 ; X86-BMI1BMI2-NEXT: addl $16, %esp
5182 ; X86-BMI1BMI2-NEXT: andl %ebx, %esi
5183 ; X86-BMI1BMI2-NEXT: andl %ebp, %edi
5184 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
5185 ; X86-BMI1BMI2-NEXT: movl %edi, %edx
5186 ; X86-BMI1BMI2-NEXT: addl $12, %esp
5187 ; X86-BMI1BMI2-NEXT: popl %esi
5188 ; X86-BMI1BMI2-NEXT: popl %edi
5189 ; X86-BMI1BMI2-NEXT: popl %ebx
5190 ; X86-BMI1BMI2-NEXT: popl %ebp
5191 ; X86-BMI1BMI2-NEXT: retl
5193 ; X64-NOBMI-LABEL: bextr64_c2_load:
5194 ; X64-NOBMI: # %bb.0:
5195 ; X64-NOBMI-NEXT: pushq %r14
5196 ; X64-NOBMI-NEXT: pushq %rbx
5197 ; X64-NOBMI-NEXT: pushq %rax
5198 ; X64-NOBMI-NEXT: movq %rsi, %rcx
5199 ; X64-NOBMI-NEXT: movq (%rdi), %r14
5200 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
5201 ; X64-NOBMI-NEXT: shrq %cl, %r14
5202 ; X64-NOBMI-NEXT: negb %dl
5203 ; X64-NOBMI-NEXT: movq $-1, %rbx
5204 ; X64-NOBMI-NEXT: movl %edx, %ecx
5205 ; X64-NOBMI-NEXT: shrq %cl, %rbx
5206 ; X64-NOBMI-NEXT: movq %rbx, %rdi
5207 ; X64-NOBMI-NEXT: callq use64
5208 ; X64-NOBMI-NEXT: andq %r14, %rbx
5209 ; X64-NOBMI-NEXT: movq %rbx, %rax
5210 ; X64-NOBMI-NEXT: addq $8, %rsp
5211 ; X64-NOBMI-NEXT: popq %rbx
5212 ; X64-NOBMI-NEXT: popq %r14
5213 ; X64-NOBMI-NEXT: retq
5215 ; X64-BMI1NOTBM-LABEL: bextr64_c2_load:
5216 ; X64-BMI1NOTBM: # %bb.0:
5217 ; X64-BMI1NOTBM-NEXT: pushq %r14
5218 ; X64-BMI1NOTBM-NEXT: pushq %rbx
5219 ; X64-BMI1NOTBM-NEXT: pushq %rax
5220 ; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx
5221 ; X64-BMI1NOTBM-NEXT: movq (%rdi), %r14
5222 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx
5223 ; X64-BMI1NOTBM-NEXT: shrq %cl, %r14
5224 ; X64-BMI1NOTBM-NEXT: negb %dl
5225 ; X64-BMI1NOTBM-NEXT: movq $-1, %rbx
5226 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
5227 ; X64-BMI1NOTBM-NEXT: shrq %cl, %rbx
5228 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rdi
5229 ; X64-BMI1NOTBM-NEXT: callq use64
5230 ; X64-BMI1NOTBM-NEXT: andq %r14, %rbx
5231 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
5232 ; X64-BMI1NOTBM-NEXT: addq $8, %rsp
5233 ; X64-BMI1NOTBM-NEXT: popq %rbx
5234 ; X64-BMI1NOTBM-NEXT: popq %r14
5235 ; X64-BMI1NOTBM-NEXT: retq
5237 ; X64-BMI1BMI2-LABEL: bextr64_c2_load:
5238 ; X64-BMI1BMI2: # %bb.0:
5239 ; X64-BMI1BMI2-NEXT: pushq %r14
5240 ; X64-BMI1BMI2-NEXT: pushq %rbx
5241 ; X64-BMI1BMI2-NEXT: pushq %rax
5242 ; X64-BMI1BMI2-NEXT: movq %rdx, %rbx
5243 ; X64-BMI1BMI2-NEXT: shrxq %rsi, (%rdi), %r14
5244 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
5245 ; X64-BMI1BMI2-NEXT: negb %al
5246 ; X64-BMI1BMI2-NEXT: movq $-1, %rcx
5247 ; X64-BMI1BMI2-NEXT: shrxq %rax, %rcx, %rdi
5248 ; X64-BMI1BMI2-NEXT: callq use64
5249 ; X64-BMI1BMI2-NEXT: bzhiq %rbx, %r14, %rax
5250 ; X64-BMI1BMI2-NEXT: addq $8, %rsp
5251 ; X64-BMI1BMI2-NEXT: popq %rbx
5252 ; X64-BMI1BMI2-NEXT: popq %r14
5253 ; X64-BMI1BMI2-NEXT: retq
5254 %val = load i64, i64* %w
5255 %shifted = lshr i64 %val, %numskipbits
5256 %numhighbits = sub i64 64, %numlowbits
5257 %mask = lshr i64 -1, %numhighbits
5258 call void @use64(i64 %mask)
5259 %masked = and i64 %mask, %shifted
5263 define i64 @bextr64_c3_load_indexzext(i64* %w, i8 %numskipbits, i8 %numlowbits) nounwind {
5264 ; X86-NOBMI-LABEL: bextr64_c3_load_indexzext:
5265 ; X86-NOBMI: # %bb.0:
5266 ; X86-NOBMI-NEXT: pushl %ebp
5267 ; X86-NOBMI-NEXT: pushl %ebx
5268 ; X86-NOBMI-NEXT: pushl %edi
5269 ; X86-NOBMI-NEXT: pushl %esi
5270 ; X86-NOBMI-NEXT: subl $12, %esp
5271 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
5272 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
5273 ; X86-NOBMI-NEXT: movl (%eax), %esi
5274 ; X86-NOBMI-NEXT: movl 4(%eax), %eax
5275 ; X86-NOBMI-NEXT: movl %eax, %edi
5276 ; X86-NOBMI-NEXT: shrl %cl, %edi
5277 ; X86-NOBMI-NEXT: shrdl %cl, %eax, %esi
5278 ; X86-NOBMI-NEXT: testb $32, %cl
5279 ; X86-NOBMI-NEXT: je .LBB42_2
5280 ; X86-NOBMI-NEXT: # %bb.1:
5281 ; X86-NOBMI-NEXT: movl %edi, %esi
5282 ; X86-NOBMI-NEXT: xorl %edi, %edi
5283 ; X86-NOBMI-NEXT: .LBB42_2:
5284 ; X86-NOBMI-NEXT: movb $64, %cl
5285 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
5286 ; X86-NOBMI-NEXT: movl $-1, %ebp
5287 ; X86-NOBMI-NEXT: movl $-1, %ebx
5288 ; X86-NOBMI-NEXT: shrl %cl, %ebx
5289 ; X86-NOBMI-NEXT: shrdl %cl, %ebp, %ebp
5290 ; X86-NOBMI-NEXT: testb $32, %cl
5291 ; X86-NOBMI-NEXT: je .LBB42_4
5292 ; X86-NOBMI-NEXT: # %bb.3:
5293 ; X86-NOBMI-NEXT: movl %ebx, %ebp
5294 ; X86-NOBMI-NEXT: xorl %ebx, %ebx
5295 ; X86-NOBMI-NEXT: .LBB42_4:
5296 ; X86-NOBMI-NEXT: subl $8, %esp
5297 ; X86-NOBMI-NEXT: pushl %ebx
5298 ; X86-NOBMI-NEXT: pushl %ebp
5299 ; X86-NOBMI-NEXT: calll use64
5300 ; X86-NOBMI-NEXT: addl $16, %esp
5301 ; X86-NOBMI-NEXT: andl %ebp, %esi
5302 ; X86-NOBMI-NEXT: andl %ebx, %edi
5303 ; X86-NOBMI-NEXT: movl %esi, %eax
5304 ; X86-NOBMI-NEXT: movl %edi, %edx
5305 ; X86-NOBMI-NEXT: addl $12, %esp
5306 ; X86-NOBMI-NEXT: popl %esi
5307 ; X86-NOBMI-NEXT: popl %edi
5308 ; X86-NOBMI-NEXT: popl %ebx
5309 ; X86-NOBMI-NEXT: popl %ebp
5310 ; X86-NOBMI-NEXT: retl
5312 ; X86-BMI1NOTBM-LABEL: bextr64_c3_load_indexzext:
5313 ; X86-BMI1NOTBM: # %bb.0:
5314 ; X86-BMI1NOTBM-NEXT: pushl %ebp
5315 ; X86-BMI1NOTBM-NEXT: pushl %ebx
5316 ; X86-BMI1NOTBM-NEXT: pushl %edi
5317 ; X86-BMI1NOTBM-NEXT: pushl %esi
5318 ; X86-BMI1NOTBM-NEXT: subl $12, %esp
5319 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
5320 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
5321 ; X86-BMI1NOTBM-NEXT: movl (%eax), %esi
5322 ; X86-BMI1NOTBM-NEXT: movl 4(%eax), %eax
5323 ; X86-BMI1NOTBM-NEXT: movl %eax, %edi
5324 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
5325 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %eax, %esi
5326 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
5327 ; X86-BMI1NOTBM-NEXT: je .LBB42_2
5328 ; X86-BMI1NOTBM-NEXT: # %bb.1:
5329 ; X86-BMI1NOTBM-NEXT: movl %edi, %esi
5330 ; X86-BMI1NOTBM-NEXT: xorl %edi, %edi
5331 ; X86-BMI1NOTBM-NEXT: .LBB42_2:
5332 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
5333 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
5334 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebp
5335 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
5336 ; X86-BMI1NOTBM-NEXT: shrl %cl, %ebx
5337 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %ebp, %ebp
5338 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
5339 ; X86-BMI1NOTBM-NEXT: je .LBB42_4
5340 ; X86-BMI1NOTBM-NEXT: # %bb.3:
5341 ; X86-BMI1NOTBM-NEXT: movl %ebx, %ebp
5342 ; X86-BMI1NOTBM-NEXT: xorl %ebx, %ebx
5343 ; X86-BMI1NOTBM-NEXT: .LBB42_4:
5344 ; X86-BMI1NOTBM-NEXT: subl $8, %esp
5345 ; X86-BMI1NOTBM-NEXT: pushl %ebx
5346 ; X86-BMI1NOTBM-NEXT: pushl %ebp
5347 ; X86-BMI1NOTBM-NEXT: calll use64
5348 ; X86-BMI1NOTBM-NEXT: addl $16, %esp
5349 ; X86-BMI1NOTBM-NEXT: andl %ebp, %esi
5350 ; X86-BMI1NOTBM-NEXT: andl %ebx, %edi
5351 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
5352 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
5353 ; X86-BMI1NOTBM-NEXT: addl $12, %esp
5354 ; X86-BMI1NOTBM-NEXT: popl %esi
5355 ; X86-BMI1NOTBM-NEXT: popl %edi
5356 ; X86-BMI1NOTBM-NEXT: popl %ebx
5357 ; X86-BMI1NOTBM-NEXT: popl %ebp
5358 ; X86-BMI1NOTBM-NEXT: retl
5360 ; X86-BMI1BMI2-LABEL: bextr64_c3_load_indexzext:
5361 ; X86-BMI1BMI2: # %bb.0:
5362 ; X86-BMI1BMI2-NEXT: pushl %ebp
5363 ; X86-BMI1BMI2-NEXT: pushl %ebx
5364 ; X86-BMI1BMI2-NEXT: pushl %edi
5365 ; X86-BMI1BMI2-NEXT: pushl %esi
5366 ; X86-BMI1BMI2-NEXT: subl $12, %esp
5367 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
5368 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
5369 ; X86-BMI1BMI2-NEXT: movl (%eax), %esi
5370 ; X86-BMI1BMI2-NEXT: movl 4(%eax), %eax
5371 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %edi
5372 ; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %esi
5373 ; X86-BMI1BMI2-NEXT: testb $32, %cl
5374 ; X86-BMI1BMI2-NEXT: je .LBB42_2
5375 ; X86-BMI1BMI2-NEXT: # %bb.1:
5376 ; X86-BMI1BMI2-NEXT: movl %edi, %esi
5377 ; X86-BMI1BMI2-NEXT: xorl %edi, %edi
5378 ; X86-BMI1BMI2-NEXT: .LBB42_2:
5379 ; X86-BMI1BMI2-NEXT: movb $64, %cl
5380 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
5381 ; X86-BMI1BMI2-NEXT: movl $-1, %ebx
5382 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %ebx, %ebp
5383 ; X86-BMI1BMI2-NEXT: shrdl %cl, %ebx, %ebx
5384 ; X86-BMI1BMI2-NEXT: testb $32, %cl
5385 ; X86-BMI1BMI2-NEXT: je .LBB42_4
5386 ; X86-BMI1BMI2-NEXT: # %bb.3:
5387 ; X86-BMI1BMI2-NEXT: movl %ebp, %ebx
5388 ; X86-BMI1BMI2-NEXT: xorl %ebp, %ebp
5389 ; X86-BMI1BMI2-NEXT: .LBB42_4:
5390 ; X86-BMI1BMI2-NEXT: subl $8, %esp
5391 ; X86-BMI1BMI2-NEXT: pushl %ebp
5392 ; X86-BMI1BMI2-NEXT: pushl %ebx
5393 ; X86-BMI1BMI2-NEXT: calll use64
5394 ; X86-BMI1BMI2-NEXT: addl $16, %esp
5395 ; X86-BMI1BMI2-NEXT: andl %ebx, %esi
5396 ; X86-BMI1BMI2-NEXT: andl %ebp, %edi
5397 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
5398 ; X86-BMI1BMI2-NEXT: movl %edi, %edx
5399 ; X86-BMI1BMI2-NEXT: addl $12, %esp
5400 ; X86-BMI1BMI2-NEXT: popl %esi
5401 ; X86-BMI1BMI2-NEXT: popl %edi
5402 ; X86-BMI1BMI2-NEXT: popl %ebx
5403 ; X86-BMI1BMI2-NEXT: popl %ebp
5404 ; X86-BMI1BMI2-NEXT: retl
5406 ; X64-NOBMI-LABEL: bextr64_c3_load_indexzext:
5407 ; X64-NOBMI: # %bb.0:
5408 ; X64-NOBMI-NEXT: pushq %r14
5409 ; X64-NOBMI-NEXT: pushq %rbx
5410 ; X64-NOBMI-NEXT: pushq %rax
5411 ; X64-NOBMI-NEXT: movl %esi, %ecx
5412 ; X64-NOBMI-NEXT: movq (%rdi), %r14
5413 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
5414 ; X64-NOBMI-NEXT: shrq %cl, %r14
5415 ; X64-NOBMI-NEXT: negb %dl
5416 ; X64-NOBMI-NEXT: movq $-1, %rbx
5417 ; X64-NOBMI-NEXT: movl %edx, %ecx
5418 ; X64-NOBMI-NEXT: shrq %cl, %rbx
5419 ; X64-NOBMI-NEXT: movq %rbx, %rdi
5420 ; X64-NOBMI-NEXT: callq use64
5421 ; X64-NOBMI-NEXT: andq %r14, %rbx
5422 ; X64-NOBMI-NEXT: movq %rbx, %rax
5423 ; X64-NOBMI-NEXT: addq $8, %rsp
5424 ; X64-NOBMI-NEXT: popq %rbx
5425 ; X64-NOBMI-NEXT: popq %r14
5426 ; X64-NOBMI-NEXT: retq
5428 ; X64-BMI1NOTBM-LABEL: bextr64_c3_load_indexzext:
5429 ; X64-BMI1NOTBM: # %bb.0:
5430 ; X64-BMI1NOTBM-NEXT: pushq %r14
5431 ; X64-BMI1NOTBM-NEXT: pushq %rbx
5432 ; X64-BMI1NOTBM-NEXT: pushq %rax
5433 ; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
5434 ; X64-BMI1NOTBM-NEXT: movq (%rdi), %r14
5435 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
5436 ; X64-BMI1NOTBM-NEXT: shrq %cl, %r14
5437 ; X64-BMI1NOTBM-NEXT: negb %dl
5438 ; X64-BMI1NOTBM-NEXT: movq $-1, %rbx
5439 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
5440 ; X64-BMI1NOTBM-NEXT: shrq %cl, %rbx
5441 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rdi
5442 ; X64-BMI1NOTBM-NEXT: callq use64
5443 ; X64-BMI1NOTBM-NEXT: andq %r14, %rbx
5444 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
5445 ; X64-BMI1NOTBM-NEXT: addq $8, %rsp
5446 ; X64-BMI1NOTBM-NEXT: popq %rbx
5447 ; X64-BMI1NOTBM-NEXT: popq %r14
5448 ; X64-BMI1NOTBM-NEXT: retq
5450 ; X64-BMI1BMI2-LABEL: bextr64_c3_load_indexzext:
5451 ; X64-BMI1BMI2: # %bb.0:
5452 ; X64-BMI1BMI2-NEXT: pushq %r14
5453 ; X64-BMI1BMI2-NEXT: pushq %rbx
5454 ; X64-BMI1BMI2-NEXT: pushq %rax
5455 ; X64-BMI1BMI2-NEXT: movl %edx, %ebx
5456 ; X64-BMI1BMI2-NEXT: # kill: def $esi killed $esi def $rsi
5457 ; X64-BMI1BMI2-NEXT: shrxq %rsi, (%rdi), %r14
5458 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
5459 ; X64-BMI1BMI2-NEXT: negb %al
5460 ; X64-BMI1BMI2-NEXT: movq $-1, %rcx
5461 ; X64-BMI1BMI2-NEXT: shrxq %rax, %rcx, %rdi
5462 ; X64-BMI1BMI2-NEXT: callq use64
5463 ; X64-BMI1BMI2-NEXT: bzhiq %rbx, %r14, %rax
5464 ; X64-BMI1BMI2-NEXT: addq $8, %rsp
5465 ; X64-BMI1BMI2-NEXT: popq %rbx
5466 ; X64-BMI1BMI2-NEXT: popq %r14
5467 ; X64-BMI1BMI2-NEXT: retq
5468 %val = load i64, i64* %w
5469 %skip = zext i8 %numskipbits to i64
5470 %shifted = lshr i64 %val, %skip
5471 %numhighbits = sub i8 64, %numlowbits
5472 %sh_prom = zext i8 %numhighbits to i64
5473 %mask = lshr i64 -1, %sh_prom
5474 call void @use64(i64 %mask)
5475 %masked = and i64 %mask, %shifted
5479 define i64 @bextr64_c4_commutative(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
5480 ; X86-NOBMI-LABEL: bextr64_c4_commutative:
5481 ; X86-NOBMI: # %bb.0:
5482 ; X86-NOBMI-NEXT: pushl %ebp
5483 ; X86-NOBMI-NEXT: pushl %ebx
5484 ; X86-NOBMI-NEXT: pushl %edi
5485 ; X86-NOBMI-NEXT: pushl %esi
5486 ; X86-NOBMI-NEXT: subl $12, %esp
5487 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
5488 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
5489 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
5490 ; X86-NOBMI-NEXT: movl %eax, %edi
5491 ; X86-NOBMI-NEXT: shrl %cl, %edi
5492 ; X86-NOBMI-NEXT: shrdl %cl, %eax, %esi
5493 ; X86-NOBMI-NEXT: testb $32, %cl
5494 ; X86-NOBMI-NEXT: je .LBB43_2
5495 ; X86-NOBMI-NEXT: # %bb.1:
5496 ; X86-NOBMI-NEXT: movl %edi, %esi
5497 ; X86-NOBMI-NEXT: xorl %edi, %edi
5498 ; X86-NOBMI-NEXT: .LBB43_2:
5499 ; X86-NOBMI-NEXT: movb $64, %cl
5500 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
5501 ; X86-NOBMI-NEXT: movl $-1, %ebp
5502 ; X86-NOBMI-NEXT: movl $-1, %ebx
5503 ; X86-NOBMI-NEXT: shrl %cl, %ebx
5504 ; X86-NOBMI-NEXT: shrdl %cl, %ebp, %ebp
5505 ; X86-NOBMI-NEXT: testb $32, %cl
5506 ; X86-NOBMI-NEXT: je .LBB43_4
5507 ; X86-NOBMI-NEXT: # %bb.3:
5508 ; X86-NOBMI-NEXT: movl %ebx, %ebp
5509 ; X86-NOBMI-NEXT: xorl %ebx, %ebx
5510 ; X86-NOBMI-NEXT: .LBB43_4:
5511 ; X86-NOBMI-NEXT: subl $8, %esp
5512 ; X86-NOBMI-NEXT: pushl %ebx
5513 ; X86-NOBMI-NEXT: pushl %ebp
5514 ; X86-NOBMI-NEXT: calll use64
5515 ; X86-NOBMI-NEXT: addl $16, %esp
5516 ; X86-NOBMI-NEXT: andl %ebp, %esi
5517 ; X86-NOBMI-NEXT: andl %ebx, %edi
5518 ; X86-NOBMI-NEXT: movl %esi, %eax
5519 ; X86-NOBMI-NEXT: movl %edi, %edx
5520 ; X86-NOBMI-NEXT: addl $12, %esp
5521 ; X86-NOBMI-NEXT: popl %esi
5522 ; X86-NOBMI-NEXT: popl %edi
5523 ; X86-NOBMI-NEXT: popl %ebx
5524 ; X86-NOBMI-NEXT: popl %ebp
5525 ; X86-NOBMI-NEXT: retl
5527 ; X86-BMI1NOTBM-LABEL: bextr64_c4_commutative:
5528 ; X86-BMI1NOTBM: # %bb.0:
5529 ; X86-BMI1NOTBM-NEXT: pushl %ebp
5530 ; X86-BMI1NOTBM-NEXT: pushl %ebx
5531 ; X86-BMI1NOTBM-NEXT: pushl %edi
5532 ; X86-BMI1NOTBM-NEXT: pushl %esi
5533 ; X86-BMI1NOTBM-NEXT: subl $12, %esp
5534 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
5535 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
5536 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
5537 ; X86-BMI1NOTBM-NEXT: movl %eax, %edi
5538 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
5539 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %eax, %esi
5540 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
5541 ; X86-BMI1NOTBM-NEXT: je .LBB43_2
5542 ; X86-BMI1NOTBM-NEXT: # %bb.1:
5543 ; X86-BMI1NOTBM-NEXT: movl %edi, %esi
5544 ; X86-BMI1NOTBM-NEXT: xorl %edi, %edi
5545 ; X86-BMI1NOTBM-NEXT: .LBB43_2:
5546 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
5547 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
5548 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebp
5549 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
5550 ; X86-BMI1NOTBM-NEXT: shrl %cl, %ebx
5551 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %ebp, %ebp
5552 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
5553 ; X86-BMI1NOTBM-NEXT: je .LBB43_4
5554 ; X86-BMI1NOTBM-NEXT: # %bb.3:
5555 ; X86-BMI1NOTBM-NEXT: movl %ebx, %ebp
5556 ; X86-BMI1NOTBM-NEXT: xorl %ebx, %ebx
5557 ; X86-BMI1NOTBM-NEXT: .LBB43_4:
5558 ; X86-BMI1NOTBM-NEXT: subl $8, %esp
5559 ; X86-BMI1NOTBM-NEXT: pushl %ebx
5560 ; X86-BMI1NOTBM-NEXT: pushl %ebp
5561 ; X86-BMI1NOTBM-NEXT: calll use64
5562 ; X86-BMI1NOTBM-NEXT: addl $16, %esp
5563 ; X86-BMI1NOTBM-NEXT: andl %ebp, %esi
5564 ; X86-BMI1NOTBM-NEXT: andl %ebx, %edi
5565 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
5566 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
5567 ; X86-BMI1NOTBM-NEXT: addl $12, %esp
5568 ; X86-BMI1NOTBM-NEXT: popl %esi
5569 ; X86-BMI1NOTBM-NEXT: popl %edi
5570 ; X86-BMI1NOTBM-NEXT: popl %ebx
5571 ; X86-BMI1NOTBM-NEXT: popl %ebp
5572 ; X86-BMI1NOTBM-NEXT: retl
5574 ; X86-BMI1BMI2-LABEL: bextr64_c4_commutative:
5575 ; X86-BMI1BMI2: # %bb.0:
5576 ; X86-BMI1BMI2-NEXT: pushl %ebp
5577 ; X86-BMI1BMI2-NEXT: pushl %ebx
5578 ; X86-BMI1BMI2-NEXT: pushl %edi
5579 ; X86-BMI1BMI2-NEXT: pushl %esi
5580 ; X86-BMI1BMI2-NEXT: subl $12, %esp
5581 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
5582 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
5583 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
5584 ; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %esi
5585 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %edi
5586 ; X86-BMI1BMI2-NEXT: testb $32, %cl
5587 ; X86-BMI1BMI2-NEXT: je .LBB43_2
5588 ; X86-BMI1BMI2-NEXT: # %bb.1:
5589 ; X86-BMI1BMI2-NEXT: movl %edi, %esi
5590 ; X86-BMI1BMI2-NEXT: xorl %edi, %edi
5591 ; X86-BMI1BMI2-NEXT: .LBB43_2:
5592 ; X86-BMI1BMI2-NEXT: movb $64, %cl
5593 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
5594 ; X86-BMI1BMI2-NEXT: movl $-1, %ebx
5595 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %ebx, %ebp
5596 ; X86-BMI1BMI2-NEXT: shrdl %cl, %ebx, %ebx
5597 ; X86-BMI1BMI2-NEXT: testb $32, %cl
5598 ; X86-BMI1BMI2-NEXT: je .LBB43_4
5599 ; X86-BMI1BMI2-NEXT: # %bb.3:
5600 ; X86-BMI1BMI2-NEXT: movl %ebp, %ebx
5601 ; X86-BMI1BMI2-NEXT: xorl %ebp, %ebp
5602 ; X86-BMI1BMI2-NEXT: .LBB43_4:
5603 ; X86-BMI1BMI2-NEXT: subl $8, %esp
5604 ; X86-BMI1BMI2-NEXT: pushl %ebp
5605 ; X86-BMI1BMI2-NEXT: pushl %ebx
5606 ; X86-BMI1BMI2-NEXT: calll use64
5607 ; X86-BMI1BMI2-NEXT: addl $16, %esp
5608 ; X86-BMI1BMI2-NEXT: andl %ebx, %esi
5609 ; X86-BMI1BMI2-NEXT: andl %ebp, %edi
5610 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
5611 ; X86-BMI1BMI2-NEXT: movl %edi, %edx
5612 ; X86-BMI1BMI2-NEXT: addl $12, %esp
5613 ; X86-BMI1BMI2-NEXT: popl %esi
5614 ; X86-BMI1BMI2-NEXT: popl %edi
5615 ; X86-BMI1BMI2-NEXT: popl %ebx
5616 ; X86-BMI1BMI2-NEXT: popl %ebp
5617 ; X86-BMI1BMI2-NEXT: retl
5619 ; X64-NOBMI-LABEL: bextr64_c4_commutative:
5620 ; X64-NOBMI: # %bb.0:
5621 ; X64-NOBMI-NEXT: pushq %r14
5622 ; X64-NOBMI-NEXT: pushq %rbx
5623 ; X64-NOBMI-NEXT: pushq %rax
5624 ; X64-NOBMI-NEXT: movq %rsi, %rcx
5625 ; X64-NOBMI-NEXT: movq %rdi, %r14
5626 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
5627 ; X64-NOBMI-NEXT: shrq %cl, %r14
5628 ; X64-NOBMI-NEXT: negb %dl
5629 ; X64-NOBMI-NEXT: movq $-1, %rbx
5630 ; X64-NOBMI-NEXT: movl %edx, %ecx
5631 ; X64-NOBMI-NEXT: shrq %cl, %rbx
5632 ; X64-NOBMI-NEXT: movq %rbx, %rdi
5633 ; X64-NOBMI-NEXT: callq use64
5634 ; X64-NOBMI-NEXT: andq %r14, %rbx
5635 ; X64-NOBMI-NEXT: movq %rbx, %rax
5636 ; X64-NOBMI-NEXT: addq $8, %rsp
5637 ; X64-NOBMI-NEXT: popq %rbx
5638 ; X64-NOBMI-NEXT: popq %r14
5639 ; X64-NOBMI-NEXT: retq
5641 ; X64-BMI1NOTBM-LABEL: bextr64_c4_commutative:
5642 ; X64-BMI1NOTBM: # %bb.0:
5643 ; X64-BMI1NOTBM-NEXT: pushq %r14
5644 ; X64-BMI1NOTBM-NEXT: pushq %rbx
5645 ; X64-BMI1NOTBM-NEXT: pushq %rax
5646 ; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx
5647 ; X64-BMI1NOTBM-NEXT: movq %rdi, %r14
5648 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx
5649 ; X64-BMI1NOTBM-NEXT: shrq %cl, %r14
5650 ; X64-BMI1NOTBM-NEXT: negb %dl
5651 ; X64-BMI1NOTBM-NEXT: movq $-1, %rbx
5652 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
5653 ; X64-BMI1NOTBM-NEXT: shrq %cl, %rbx
5654 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rdi
5655 ; X64-BMI1NOTBM-NEXT: callq use64
5656 ; X64-BMI1NOTBM-NEXT: andq %r14, %rbx
5657 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
5658 ; X64-BMI1NOTBM-NEXT: addq $8, %rsp
5659 ; X64-BMI1NOTBM-NEXT: popq %rbx
5660 ; X64-BMI1NOTBM-NEXT: popq %r14
5661 ; X64-BMI1NOTBM-NEXT: retq
5663 ; X64-BMI1BMI2-LABEL: bextr64_c4_commutative:
5664 ; X64-BMI1BMI2: # %bb.0:
5665 ; X64-BMI1BMI2-NEXT: pushq %r14
5666 ; X64-BMI1BMI2-NEXT: pushq %rbx
5667 ; X64-BMI1BMI2-NEXT: pushq %rax
5668 ; X64-BMI1BMI2-NEXT: movq %rdx, %rbx
5669 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %r14
5670 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
5671 ; X64-BMI1BMI2-NEXT: negb %al
5672 ; X64-BMI1BMI2-NEXT: movq $-1, %rcx
5673 ; X64-BMI1BMI2-NEXT: shrxq %rax, %rcx, %rdi
5674 ; X64-BMI1BMI2-NEXT: callq use64
5675 ; X64-BMI1BMI2-NEXT: bzhiq %rbx, %r14, %rax
5676 ; X64-BMI1BMI2-NEXT: addq $8, %rsp
5677 ; X64-BMI1BMI2-NEXT: popq %rbx
5678 ; X64-BMI1BMI2-NEXT: popq %r14
5679 ; X64-BMI1BMI2-NEXT: retq
5680 %shifted = lshr i64 %val, %numskipbits
5681 %numhighbits = sub i64 64, %numlowbits
5682 %mask = lshr i64 -1, %numhighbits
5683 call void @use64(i64 %mask)
5684 %masked = and i64 %shifted, %mask ; swapped order
5688 define i64 @bextr64_c5_skipextrauses(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
5689 ; X86-NOBMI-LABEL: bextr64_c5_skipextrauses:
5690 ; X86-NOBMI: # %bb.0:
5691 ; X86-NOBMI-NEXT: pushl %ebp
5692 ; X86-NOBMI-NEXT: pushl %ebx
5693 ; X86-NOBMI-NEXT: pushl %edi
5694 ; X86-NOBMI-NEXT: pushl %esi
5695 ; X86-NOBMI-NEXT: subl $12, %esp
5696 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
5697 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
5698 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
5699 ; X86-NOBMI-NEXT: movl %eax, %edi
5700 ; X86-NOBMI-NEXT: shrl %cl, %edi
5701 ; X86-NOBMI-NEXT: shrdl %cl, %eax, %esi
5702 ; X86-NOBMI-NEXT: testb $32, %cl
5703 ; X86-NOBMI-NEXT: je .LBB44_2
5704 ; X86-NOBMI-NEXT: # %bb.1:
5705 ; X86-NOBMI-NEXT: movl %edi, %esi
5706 ; X86-NOBMI-NEXT: xorl %edi, %edi
5707 ; X86-NOBMI-NEXT: .LBB44_2:
5708 ; X86-NOBMI-NEXT: movb $64, %cl
5709 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
5710 ; X86-NOBMI-NEXT: movl $-1, %ebx
5711 ; X86-NOBMI-NEXT: movl $-1, %ebp
5712 ; X86-NOBMI-NEXT: shrl %cl, %ebp
5713 ; X86-NOBMI-NEXT: shrdl %cl, %ebx, %ebx
5714 ; X86-NOBMI-NEXT: testb $32, %cl
5715 ; X86-NOBMI-NEXT: je .LBB44_4
5716 ; X86-NOBMI-NEXT: # %bb.3:
5717 ; X86-NOBMI-NEXT: movl %ebp, %ebx
5718 ; X86-NOBMI-NEXT: xorl %ebp, %ebp
5719 ; X86-NOBMI-NEXT: .LBB44_4:
5720 ; X86-NOBMI-NEXT: subl $8, %esp
5721 ; X86-NOBMI-NEXT: pushl %ebp
5722 ; X86-NOBMI-NEXT: pushl %ebx
5723 ; X86-NOBMI-NEXT: calll use64
5724 ; X86-NOBMI-NEXT: addl $16, %esp
5725 ; X86-NOBMI-NEXT: andl %ebx, %esi
5726 ; X86-NOBMI-NEXT: andl %ebp, %edi
5727 ; X86-NOBMI-NEXT: subl $8, %esp
5728 ; X86-NOBMI-NEXT: pushl {{[0-9]+}}(%esp)
5729 ; X86-NOBMI-NEXT: pushl {{[0-9]+}}(%esp)
5730 ; X86-NOBMI-NEXT: calll use64
5731 ; X86-NOBMI-NEXT: addl $16, %esp
5732 ; X86-NOBMI-NEXT: movl %esi, %eax
5733 ; X86-NOBMI-NEXT: movl %edi, %edx
5734 ; X86-NOBMI-NEXT: addl $12, %esp
5735 ; X86-NOBMI-NEXT: popl %esi
5736 ; X86-NOBMI-NEXT: popl %edi
5737 ; X86-NOBMI-NEXT: popl %ebx
5738 ; X86-NOBMI-NEXT: popl %ebp
5739 ; X86-NOBMI-NEXT: retl
5741 ; X86-BMI1NOTBM-LABEL: bextr64_c5_skipextrauses:
5742 ; X86-BMI1NOTBM: # %bb.0:
5743 ; X86-BMI1NOTBM-NEXT: pushl %ebp
5744 ; X86-BMI1NOTBM-NEXT: pushl %ebx
5745 ; X86-BMI1NOTBM-NEXT: pushl %edi
5746 ; X86-BMI1NOTBM-NEXT: pushl %esi
5747 ; X86-BMI1NOTBM-NEXT: subl $12, %esp
5748 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
5749 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
5750 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %ecx
5751 ; X86-BMI1NOTBM-NEXT: movl %eax, %edi
5752 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
5753 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %eax, %esi
5754 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
5755 ; X86-BMI1NOTBM-NEXT: je .LBB44_2
5756 ; X86-BMI1NOTBM-NEXT: # %bb.1:
5757 ; X86-BMI1NOTBM-NEXT: movl %edi, %esi
5758 ; X86-BMI1NOTBM-NEXT: xorl %edi, %edi
5759 ; X86-BMI1NOTBM-NEXT: .LBB44_2:
5760 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
5761 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
5762 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
5763 ; X86-BMI1NOTBM-NEXT: movl $-1, %ebp
5764 ; X86-BMI1NOTBM-NEXT: shrl %cl, %ebp
5765 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %ebx, %ebx
5766 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
5767 ; X86-BMI1NOTBM-NEXT: je .LBB44_4
5768 ; X86-BMI1NOTBM-NEXT: # %bb.3:
5769 ; X86-BMI1NOTBM-NEXT: movl %ebp, %ebx
5770 ; X86-BMI1NOTBM-NEXT: xorl %ebp, %ebp
5771 ; X86-BMI1NOTBM-NEXT: .LBB44_4:
5772 ; X86-BMI1NOTBM-NEXT: subl $8, %esp
5773 ; X86-BMI1NOTBM-NEXT: pushl %ebp
5774 ; X86-BMI1NOTBM-NEXT: pushl %ebx
5775 ; X86-BMI1NOTBM-NEXT: calll use64
5776 ; X86-BMI1NOTBM-NEXT: addl $16, %esp
5777 ; X86-BMI1NOTBM-NEXT: andl %ebx, %esi
5778 ; X86-BMI1NOTBM-NEXT: andl %ebp, %edi
5779 ; X86-BMI1NOTBM-NEXT: subl $8, %esp
5780 ; X86-BMI1NOTBM-NEXT: pushl {{[0-9]+}}(%esp)
5781 ; X86-BMI1NOTBM-NEXT: pushl {{[0-9]+}}(%esp)
5782 ; X86-BMI1NOTBM-NEXT: calll use64
5783 ; X86-BMI1NOTBM-NEXT: addl $16, %esp
5784 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
5785 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
5786 ; X86-BMI1NOTBM-NEXT: addl $12, %esp
5787 ; X86-BMI1NOTBM-NEXT: popl %esi
5788 ; X86-BMI1NOTBM-NEXT: popl %edi
5789 ; X86-BMI1NOTBM-NEXT: popl %ebx
5790 ; X86-BMI1NOTBM-NEXT: popl %ebp
5791 ; X86-BMI1NOTBM-NEXT: retl
5793 ; X86-BMI1BMI2-LABEL: bextr64_c5_skipextrauses:
5794 ; X86-BMI1BMI2: # %bb.0:
5795 ; X86-BMI1BMI2-NEXT: pushl %ebp
5796 ; X86-BMI1BMI2-NEXT: pushl %ebx
5797 ; X86-BMI1BMI2-NEXT: pushl %edi
5798 ; X86-BMI1BMI2-NEXT: pushl %esi
5799 ; X86-BMI1BMI2-NEXT: subl $12, %esp
5800 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
5801 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
5802 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %ecx
5803 ; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %esi
5804 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %edi
5805 ; X86-BMI1BMI2-NEXT: testb $32, %cl
5806 ; X86-BMI1BMI2-NEXT: je .LBB44_2
5807 ; X86-BMI1BMI2-NEXT: # %bb.1:
5808 ; X86-BMI1BMI2-NEXT: movl %edi, %esi
5809 ; X86-BMI1BMI2-NEXT: xorl %edi, %edi
5810 ; X86-BMI1BMI2-NEXT: .LBB44_2:
5811 ; X86-BMI1BMI2-NEXT: movb $64, %cl
5812 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
5813 ; X86-BMI1BMI2-NEXT: movl $-1, %ebp
5814 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %ebp, %ebx
5815 ; X86-BMI1BMI2-NEXT: shrdl %cl, %ebp, %ebp
5816 ; X86-BMI1BMI2-NEXT: testb $32, %cl
5817 ; X86-BMI1BMI2-NEXT: je .LBB44_4
5818 ; X86-BMI1BMI2-NEXT: # %bb.3:
5819 ; X86-BMI1BMI2-NEXT: movl %ebx, %ebp
5820 ; X86-BMI1BMI2-NEXT: xorl %ebx, %ebx
5821 ; X86-BMI1BMI2-NEXT: .LBB44_4:
5822 ; X86-BMI1BMI2-NEXT: subl $8, %esp
5823 ; X86-BMI1BMI2-NEXT: pushl %ebx
5824 ; X86-BMI1BMI2-NEXT: pushl %ebp
5825 ; X86-BMI1BMI2-NEXT: calll use64
5826 ; X86-BMI1BMI2-NEXT: addl $16, %esp
5827 ; X86-BMI1BMI2-NEXT: andl %ebp, %esi
5828 ; X86-BMI1BMI2-NEXT: andl %ebx, %edi
5829 ; X86-BMI1BMI2-NEXT: subl $8, %esp
5830 ; X86-BMI1BMI2-NEXT: pushl {{[0-9]+}}(%esp)
5831 ; X86-BMI1BMI2-NEXT: pushl {{[0-9]+}}(%esp)
5832 ; X86-BMI1BMI2-NEXT: calll use64
5833 ; X86-BMI1BMI2-NEXT: addl $16, %esp
5834 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
5835 ; X86-BMI1BMI2-NEXT: movl %edi, %edx
5836 ; X86-BMI1BMI2-NEXT: addl $12, %esp
5837 ; X86-BMI1BMI2-NEXT: popl %esi
5838 ; X86-BMI1BMI2-NEXT: popl %edi
5839 ; X86-BMI1BMI2-NEXT: popl %ebx
5840 ; X86-BMI1BMI2-NEXT: popl %ebp
5841 ; X86-BMI1BMI2-NEXT: retl
5843 ; X64-NOBMI-LABEL: bextr64_c5_skipextrauses:
5844 ; X64-NOBMI: # %bb.0:
5845 ; X64-NOBMI-NEXT: pushq %r15
5846 ; X64-NOBMI-NEXT: pushq %r14
5847 ; X64-NOBMI-NEXT: pushq %rbx
5848 ; X64-NOBMI-NEXT: movq %rsi, %r14
5849 ; X64-NOBMI-NEXT: movq %rdi, %r15
5850 ; X64-NOBMI-NEXT: movl %r14d, %ecx
5851 ; X64-NOBMI-NEXT: shrq %cl, %r15
5852 ; X64-NOBMI-NEXT: negb %dl
5853 ; X64-NOBMI-NEXT: movq $-1, %rbx
5854 ; X64-NOBMI-NEXT: movl %edx, %ecx
5855 ; X64-NOBMI-NEXT: shrq %cl, %rbx
5856 ; X64-NOBMI-NEXT: movq %rbx, %rdi
5857 ; X64-NOBMI-NEXT: callq use64
5858 ; X64-NOBMI-NEXT: andq %r15, %rbx
5859 ; X64-NOBMI-NEXT: movq %r14, %rdi
5860 ; X64-NOBMI-NEXT: callq use64
5861 ; X64-NOBMI-NEXT: movq %rbx, %rax
5862 ; X64-NOBMI-NEXT: popq %rbx
5863 ; X64-NOBMI-NEXT: popq %r14
5864 ; X64-NOBMI-NEXT: popq %r15
5865 ; X64-NOBMI-NEXT: retq
5867 ; X64-BMI1NOTBM-LABEL: bextr64_c5_skipextrauses:
5868 ; X64-BMI1NOTBM: # %bb.0:
5869 ; X64-BMI1NOTBM-NEXT: pushq %r15
5870 ; X64-BMI1NOTBM-NEXT: pushq %r14
5871 ; X64-BMI1NOTBM-NEXT: pushq %rbx
5872 ; X64-BMI1NOTBM-NEXT: movq %rsi, %r14
5873 ; X64-BMI1NOTBM-NEXT: movq %rdi, %r15
5874 ; X64-BMI1NOTBM-NEXT: movl %r14d, %ecx
5875 ; X64-BMI1NOTBM-NEXT: shrq %cl, %r15
5876 ; X64-BMI1NOTBM-NEXT: negb %dl
5877 ; X64-BMI1NOTBM-NEXT: movq $-1, %rbx
5878 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
5879 ; X64-BMI1NOTBM-NEXT: shrq %cl, %rbx
5880 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rdi
5881 ; X64-BMI1NOTBM-NEXT: callq use64
5882 ; X64-BMI1NOTBM-NEXT: andq %r15, %rbx
5883 ; X64-BMI1NOTBM-NEXT: movq %r14, %rdi
5884 ; X64-BMI1NOTBM-NEXT: callq use64
5885 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
5886 ; X64-BMI1NOTBM-NEXT: popq %rbx
5887 ; X64-BMI1NOTBM-NEXT: popq %r14
5888 ; X64-BMI1NOTBM-NEXT: popq %r15
5889 ; X64-BMI1NOTBM-NEXT: retq
5891 ; X64-BMI1BMI2-LABEL: bextr64_c5_skipextrauses:
5892 ; X64-BMI1BMI2: # %bb.0:
5893 ; X64-BMI1BMI2-NEXT: pushq %r15
5894 ; X64-BMI1BMI2-NEXT: pushq %r14
5895 ; X64-BMI1BMI2-NEXT: pushq %rbx
5896 ; X64-BMI1BMI2-NEXT: movq %rdx, %rbx
5897 ; X64-BMI1BMI2-NEXT: movq %rsi, %r14
5898 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %r15
5899 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
5900 ; X64-BMI1BMI2-NEXT: negb %al
5901 ; X64-BMI1BMI2-NEXT: movq $-1, %rcx
5902 ; X64-BMI1BMI2-NEXT: shrxq %rax, %rcx, %rdi
5903 ; X64-BMI1BMI2-NEXT: callq use64
5904 ; X64-BMI1BMI2-NEXT: bzhiq %rbx, %r15, %rbx
5905 ; X64-BMI1BMI2-NEXT: movq %r14, %rdi
5906 ; X64-BMI1BMI2-NEXT: callq use64
5907 ; X64-BMI1BMI2-NEXT: movq %rbx, %rax
5908 ; X64-BMI1BMI2-NEXT: popq %rbx
5909 ; X64-BMI1BMI2-NEXT: popq %r14
5910 ; X64-BMI1BMI2-NEXT: popq %r15
5911 ; X64-BMI1BMI2-NEXT: retq
5912 %shifted = lshr i64 %val, %numskipbits
5913 %numhighbits = sub i64 64, %numlowbits
5914 %mask = lshr i64 -1, %numhighbits
5915 call void @use64(i64 %mask)
5916 %masked = and i64 %mask, %shifted
5917 call void @use64(i64 %numskipbits)
5921 ; 64-bit, but with 32-bit output
5923 ; Everything done in 64-bit, truncation happens last.
5924 define i32 @bextr64_32_c0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
5925 ; X86-NOBMI-LABEL: bextr64_32_c0:
5926 ; X86-NOBMI: # %bb.0:
5927 ; X86-NOBMI-NEXT: pushl %esi
5928 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
5929 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
5930 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
5931 ; X86-NOBMI-NEXT: movl %esi, %edx
5932 ; X86-NOBMI-NEXT: shrl %cl, %edx
5933 ; X86-NOBMI-NEXT: shrdl %cl, %esi, %eax
5934 ; X86-NOBMI-NEXT: testb $32, %cl
5935 ; X86-NOBMI-NEXT: jne .LBB45_2
5936 ; X86-NOBMI-NEXT: # %bb.1:
5937 ; X86-NOBMI-NEXT: movl %eax, %edx
5938 ; X86-NOBMI-NEXT: .LBB45_2:
5939 ; X86-NOBMI-NEXT: movb $64, %cl
5940 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
5941 ; X86-NOBMI-NEXT: movl $-1, %esi
5942 ; X86-NOBMI-NEXT: movl $-1, %eax
5943 ; X86-NOBMI-NEXT: shrl %cl, %eax
5944 ; X86-NOBMI-NEXT: shrdl %cl, %esi, %esi
5945 ; X86-NOBMI-NEXT: testb $32, %cl
5946 ; X86-NOBMI-NEXT: jne .LBB45_4
5947 ; X86-NOBMI-NEXT: # %bb.3:
5948 ; X86-NOBMI-NEXT: movl %esi, %eax
5949 ; X86-NOBMI-NEXT: .LBB45_4:
5950 ; X86-NOBMI-NEXT: andl %edx, %eax
5951 ; X86-NOBMI-NEXT: popl %esi
5952 ; X86-NOBMI-NEXT: retl
5954 ; X86-BMI1NOTBM-LABEL: bextr64_32_c0:
5955 ; X86-BMI1NOTBM: # %bb.0:
5956 ; X86-BMI1NOTBM-NEXT: pushl %esi
5957 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
5958 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
5959 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
5960 ; X86-BMI1NOTBM-NEXT: movl %esi, %edx
5961 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
5962 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %esi, %eax
5963 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
5964 ; X86-BMI1NOTBM-NEXT: jne .LBB45_2
5965 ; X86-BMI1NOTBM-NEXT: # %bb.1:
5966 ; X86-BMI1NOTBM-NEXT: movl %eax, %edx
5967 ; X86-BMI1NOTBM-NEXT: .LBB45_2:
5968 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
5969 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
5970 ; X86-BMI1NOTBM-NEXT: movl $-1, %esi
5971 ; X86-BMI1NOTBM-NEXT: movl $-1, %eax
5972 ; X86-BMI1NOTBM-NEXT: shrl %cl, %eax
5973 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %esi, %esi
5974 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
5975 ; X86-BMI1NOTBM-NEXT: jne .LBB45_4
5976 ; X86-BMI1NOTBM-NEXT: # %bb.3:
5977 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
5978 ; X86-BMI1NOTBM-NEXT: .LBB45_4:
5979 ; X86-BMI1NOTBM-NEXT: andl %edx, %eax
5980 ; X86-BMI1NOTBM-NEXT: popl %esi
5981 ; X86-BMI1NOTBM-NEXT: retl
5983 ; X86-BMI1BMI2-LABEL: bextr64_32_c0:
5984 ; X86-BMI1BMI2: # %bb.0:
5985 ; X86-BMI1BMI2-NEXT: pushl %esi
5986 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
5987 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
5988 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
5989 ; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %edx
5990 ; X86-BMI1BMI2-NEXT: testb $32, %cl
5991 ; X86-BMI1BMI2-NEXT: je .LBB45_2
5992 ; X86-BMI1BMI2-NEXT: # %bb.1:
5993 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %edx
5994 ; X86-BMI1BMI2-NEXT: .LBB45_2:
5995 ; X86-BMI1BMI2-NEXT: movb $64, %cl
5996 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
5997 ; X86-BMI1BMI2-NEXT: movl $-1, %esi
5998 ; X86-BMI1BMI2-NEXT: movl $-1, %eax
5999 ; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %eax
6000 ; X86-BMI1BMI2-NEXT: testb $32, %cl
6001 ; X86-BMI1BMI2-NEXT: je .LBB45_4
6002 ; X86-BMI1BMI2-NEXT: # %bb.3:
6003 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %eax
6004 ; X86-BMI1BMI2-NEXT: .LBB45_4:
6005 ; X86-BMI1BMI2-NEXT: andl %edx, %eax
6006 ; X86-BMI1BMI2-NEXT: popl %esi
6007 ; X86-BMI1BMI2-NEXT: retl
6009 ; X64-NOBMI-LABEL: bextr64_32_c0:
6010 ; X64-NOBMI: # %bb.0:
6011 ; X64-NOBMI-NEXT: movq %rsi, %rcx
6012 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
6013 ; X64-NOBMI-NEXT: shrq %cl, %rdi
6014 ; X64-NOBMI-NEXT: negb %dl
6015 ; X64-NOBMI-NEXT: movq $-1, %rax
6016 ; X64-NOBMI-NEXT: movl %edx, %ecx
6017 ; X64-NOBMI-NEXT: shrq %cl, %rax
6018 ; X64-NOBMI-NEXT: andl %edi, %eax
6019 ; X64-NOBMI-NEXT: # kill: def $eax killed $eax killed $rax
6020 ; X64-NOBMI-NEXT: retq
6022 ; X64-BMI1NOTBM-LABEL: bextr64_32_c0:
6023 ; X64-BMI1NOTBM: # %bb.0:
6024 ; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx
6025 ; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx
6026 ; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi
6027 ; X64-BMI1NOTBM-NEXT: negb %dl
6028 ; X64-BMI1NOTBM-NEXT: movq $-1, %rax
6029 ; X64-BMI1NOTBM-NEXT: movl %edx, %ecx
6030 ; X64-BMI1NOTBM-NEXT: shrq %cl, %rax
6031 ; X64-BMI1NOTBM-NEXT: andl %edi, %eax
6032 ; X64-BMI1NOTBM-NEXT: # kill: def $eax killed $eax killed $rax
6033 ; X64-BMI1NOTBM-NEXT: retq
6035 ; X64-BMI1BMI2-LABEL: bextr64_32_c0:
6036 ; X64-BMI1BMI2: # %bb.0:
6037 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rcx
6038 ; X64-BMI1BMI2-NEXT: negb %dl
6039 ; X64-BMI1BMI2-NEXT: movq $-1, %rax
6040 ; X64-BMI1BMI2-NEXT: shrxq %rdx, %rax, %rax
6041 ; X64-BMI1BMI2-NEXT: andl %ecx, %eax
6042 ; X64-BMI1BMI2-NEXT: # kill: def $eax killed $eax killed $rax
6043 ; X64-BMI1BMI2-NEXT: retq
6044 %shifted = lshr i64 %val, %numskipbits
6045 %numhighbits = sub i64 64, %numlowbits
6046 %mask = lshr i64 -1, %numhighbits
6047 %masked = and i64 %mask, %shifted
6048 %res = trunc i64 %masked to i32
6052 ; Shifting happens in 64-bit, then truncation. Masking is 32-bit.
6053 define i32 @bextr64_32_c1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {
6054 ; X86-NOBMI-LABEL: bextr64_32_c1:
6055 ; X86-NOBMI: # %bb.0:
6056 ; X86-NOBMI-NEXT: pushl %esi
6057 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
6058 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edx
6059 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
6060 ; X86-NOBMI-NEXT: movl %esi, %eax
6061 ; X86-NOBMI-NEXT: shrl %cl, %eax
6062 ; X86-NOBMI-NEXT: shrdl %cl, %esi, %edx
6063 ; X86-NOBMI-NEXT: testb $32, %cl
6064 ; X86-NOBMI-NEXT: jne .LBB46_2
6065 ; X86-NOBMI-NEXT: # %bb.1:
6066 ; X86-NOBMI-NEXT: movl %edx, %eax
6067 ; X86-NOBMI-NEXT: .LBB46_2:
6068 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
6069 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
6070 ; X86-NOBMI-NEXT: shll %cl, %eax
6071 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
6072 ; X86-NOBMI-NEXT: shrl %cl, %eax
6073 ; X86-NOBMI-NEXT: popl %esi
6074 ; X86-NOBMI-NEXT: retl
6076 ; X86-BMI1NOTBM-LABEL: bextr64_32_c1:
6077 ; X86-BMI1NOTBM: # %bb.0:
6078 ; X86-BMI1NOTBM-NEXT: pushl %edi
6079 ; X86-BMI1NOTBM-NEXT: pushl %esi
6080 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
6081 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
6082 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
6083 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
6084 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
6085 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
6086 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
6087 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
6088 ; X86-BMI1NOTBM-NEXT: jne .LBB46_2
6089 ; X86-BMI1NOTBM-NEXT: # %bb.1:
6090 ; X86-BMI1NOTBM-NEXT: movl %esi, %edx
6091 ; X86-BMI1NOTBM-NEXT: .LBB46_2:
6092 ; X86-BMI1NOTBM-NEXT: shll $8, %eax
6093 ; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax
6094 ; X86-BMI1NOTBM-NEXT: popl %esi
6095 ; X86-BMI1NOTBM-NEXT: popl %edi
6096 ; X86-BMI1NOTBM-NEXT: retl
6098 ; X86-BMI1BMI2-LABEL: bextr64_32_c1:
6099 ; X86-BMI1BMI2: # %bb.0:
6100 ; X86-BMI1BMI2-NEXT: pushl %esi
6101 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
6102 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
6103 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
6104 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
6105 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edx
6106 ; X86-BMI1BMI2-NEXT: testb $32, %cl
6107 ; X86-BMI1BMI2-NEXT: je .LBB46_2
6108 ; X86-BMI1BMI2-NEXT: # %bb.1:
6109 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %edx
6110 ; X86-BMI1BMI2-NEXT: .LBB46_2:
6111 ; X86-BMI1BMI2-NEXT: bzhil %eax, %edx, %eax
6112 ; X86-BMI1BMI2-NEXT: popl %esi
6113 ; X86-BMI1BMI2-NEXT: retl
6115 ; X64-NOBMI-LABEL: bextr64_32_c1:
6116 ; X64-NOBMI: # %bb.0:
6117 ; X64-NOBMI-NEXT: movq %rsi, %rcx
6118 ; X64-NOBMI-NEXT: movq %rdi, %rax
6119 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
6120 ; X64-NOBMI-NEXT: shrq %cl, %rax
6121 ; X64-NOBMI-NEXT: negb %dl
6122 ; X64-NOBMI-NEXT: movl %edx, %ecx
6123 ; X64-NOBMI-NEXT: shll %cl, %eax
6124 ; X64-NOBMI-NEXT: shrl %cl, %eax
6125 ; X64-NOBMI-NEXT: # kill: def $eax killed $eax killed $rax
6126 ; X64-NOBMI-NEXT: retq
6128 ; X64-BMI1NOTBM-LABEL: bextr64_32_c1:
6129 ; X64-BMI1NOTBM: # %bb.0:
6130 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
6131 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
6132 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
6133 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
6134 ; X64-BMI1NOTBM-NEXT: # kill: def $eax killed $eax killed $rax
6135 ; X64-BMI1NOTBM-NEXT: retq
6137 ; X64-BMI1BMI2-LABEL: bextr64_32_c1:
6138 ; X64-BMI1BMI2: # %bb.0:
6139 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
6140 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
6141 ; X64-BMI1BMI2-NEXT: retq
6142 %shifted = lshr i64 %val, %numskipbits
6143 %truncshifted = trunc i64 %shifted to i32
6144 %numhighbits = sub i32 32, %numlowbits
6145 %mask = lshr i32 -1, %numhighbits
6146 %masked = and i32 %mask, %truncshifted
6150 ; Shifting happens in 64-bit. Mask is 32-bit, but extended to 64-bit.
6151 ; Masking is 64-bit. Then truncation.
6152 define i32 @bextr64_32_c2(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {
6153 ; X86-NOBMI-LABEL: bextr64_32_c2:
6154 ; X86-NOBMI: # %bb.0:
6155 ; X86-NOBMI-NEXT: pushl %esi
6156 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
6157 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edx
6158 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
6159 ; X86-NOBMI-NEXT: movl %esi, %eax
6160 ; X86-NOBMI-NEXT: shrl %cl, %eax
6161 ; X86-NOBMI-NEXT: shrdl %cl, %esi, %edx
6162 ; X86-NOBMI-NEXT: testb $32, %cl
6163 ; X86-NOBMI-NEXT: jne .LBB47_2
6164 ; X86-NOBMI-NEXT: # %bb.1:
6165 ; X86-NOBMI-NEXT: movl %edx, %eax
6166 ; X86-NOBMI-NEXT: .LBB47_2:
6167 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
6168 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
6169 ; X86-NOBMI-NEXT: shll %cl, %eax
6170 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
6171 ; X86-NOBMI-NEXT: shrl %cl, %eax
6172 ; X86-NOBMI-NEXT: popl %esi
6173 ; X86-NOBMI-NEXT: retl
6175 ; X86-BMI1NOTBM-LABEL: bextr64_32_c2:
6176 ; X86-BMI1NOTBM: # %bb.0:
6177 ; X86-BMI1NOTBM-NEXT: pushl %edi
6178 ; X86-BMI1NOTBM-NEXT: pushl %esi
6179 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
6180 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
6181 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
6182 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
6183 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
6184 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
6185 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
6186 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
6187 ; X86-BMI1NOTBM-NEXT: jne .LBB47_2
6188 ; X86-BMI1NOTBM-NEXT: # %bb.1:
6189 ; X86-BMI1NOTBM-NEXT: movl %esi, %edx
6190 ; X86-BMI1NOTBM-NEXT: .LBB47_2:
6191 ; X86-BMI1NOTBM-NEXT: shll $8, %eax
6192 ; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax
6193 ; X86-BMI1NOTBM-NEXT: popl %esi
6194 ; X86-BMI1NOTBM-NEXT: popl %edi
6195 ; X86-BMI1NOTBM-NEXT: retl
6197 ; X86-BMI1BMI2-LABEL: bextr64_32_c2:
6198 ; X86-BMI1BMI2: # %bb.0:
6199 ; X86-BMI1BMI2-NEXT: pushl %esi
6200 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
6201 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
6202 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
6203 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
6204 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edx
6205 ; X86-BMI1BMI2-NEXT: testb $32, %cl
6206 ; X86-BMI1BMI2-NEXT: je .LBB47_2
6207 ; X86-BMI1BMI2-NEXT: # %bb.1:
6208 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %edx
6209 ; X86-BMI1BMI2-NEXT: .LBB47_2:
6210 ; X86-BMI1BMI2-NEXT: bzhil %eax, %edx, %eax
6211 ; X86-BMI1BMI2-NEXT: popl %esi
6212 ; X86-BMI1BMI2-NEXT: retl
6214 ; X64-NOBMI-LABEL: bextr64_32_c2:
6215 ; X64-NOBMI: # %bb.0:
6216 ; X64-NOBMI-NEXT: movq %rsi, %rcx
6217 ; X64-NOBMI-NEXT: movq %rdi, %rax
6218 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
6219 ; X64-NOBMI-NEXT: shrq %cl, %rax
6220 ; X64-NOBMI-NEXT: negb %dl
6221 ; X64-NOBMI-NEXT: movl %edx, %ecx
6222 ; X64-NOBMI-NEXT: shll %cl, %eax
6223 ; X64-NOBMI-NEXT: shrl %cl, %eax
6224 ; X64-NOBMI-NEXT: # kill: def $eax killed $eax killed $rax
6225 ; X64-NOBMI-NEXT: retq
6227 ; X64-BMI1NOTBM-LABEL: bextr64_32_c2:
6228 ; X64-BMI1NOTBM: # %bb.0:
6229 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
6230 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
6231 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
6232 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
6233 ; X64-BMI1NOTBM-NEXT: # kill: def $eax killed $eax killed $rax
6234 ; X64-BMI1NOTBM-NEXT: retq
6236 ; X64-BMI1BMI2-LABEL: bextr64_32_c2:
6237 ; X64-BMI1BMI2: # %bb.0:
6238 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
6239 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
6240 ; X64-BMI1BMI2-NEXT: retq
6241 %shifted = lshr i64 %val, %numskipbits
6242 %numhighbits = sub i32 32, %numlowbits
6243 %mask = lshr i32 -1, %numhighbits
6244 %zextmask = zext i32 %mask to i64
6245 %masked = and i64 %zextmask, %shifted
6246 %truncmasked = trunc i64 %masked to i32
6247 ret i32 %truncmasked
6250 ; ---------------------------------------------------------------------------- ;
6251 ; Pattern d. 32-bit.
6252 ; ---------------------------------------------------------------------------- ;
6254 define i32 @bextr32_d0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
6255 ; X86-NOBMI-LABEL: bextr32_d0:
6256 ; X86-NOBMI: # %bb.0:
6257 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
6258 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
6259 ; X86-NOBMI-NEXT: shrl %cl, %eax
6260 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
6261 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
6262 ; X86-NOBMI-NEXT: shll %cl, %eax
6263 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
6264 ; X86-NOBMI-NEXT: shrl %cl, %eax
6265 ; X86-NOBMI-NEXT: retl
6267 ; X86-BMI1NOTBM-LABEL: bextr32_d0:
6268 ; X86-BMI1NOTBM: # %bb.0:
6269 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
6270 ; X86-BMI1NOTBM-NEXT: shll $8, %eax
6271 ; X86-BMI1NOTBM-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
6272 ; X86-BMI1NOTBM-NEXT: orl %eax, %ecx
6273 ; X86-BMI1NOTBM-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %eax
6274 ; X86-BMI1NOTBM-NEXT: retl
6276 ; X86-BMI1BMI2-LABEL: bextr32_d0:
6277 ; X86-BMI1BMI2: # %bb.0:
6278 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
6279 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
6280 ; X86-BMI1BMI2-NEXT: shrxl %ecx, {{[0-9]+}}(%esp), %ecx
6281 ; X86-BMI1BMI2-NEXT: bzhil %eax, %ecx, %eax
6282 ; X86-BMI1BMI2-NEXT: retl
6284 ; X64-NOBMI-LABEL: bextr32_d0:
6285 ; X64-NOBMI: # %bb.0:
6286 ; X64-NOBMI-NEXT: movl %esi, %ecx
6287 ; X64-NOBMI-NEXT: movl %edi, %eax
6288 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
6289 ; X64-NOBMI-NEXT: shrl %cl, %eax
6290 ; X64-NOBMI-NEXT: negb %dl
6291 ; X64-NOBMI-NEXT: movl %edx, %ecx
6292 ; X64-NOBMI-NEXT: shll %cl, %eax
6293 ; X64-NOBMI-NEXT: shrl %cl, %eax
6294 ; X64-NOBMI-NEXT: retq
6296 ; X64-BMI1NOTBM-LABEL: bextr32_d0:
6297 ; X64-BMI1NOTBM: # %bb.0:
6298 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
6299 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
6300 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
6301 ; X64-BMI1NOTBM-NEXT: bextrl %eax, %edi, %eax
6302 ; X64-BMI1NOTBM-NEXT: retq
6304 ; X64-BMI1BMI2-LABEL: bextr32_d0:
6305 ; X64-BMI1BMI2: # %bb.0:
6306 ; X64-BMI1BMI2-NEXT: shrxl %esi, %edi, %eax
6307 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
6308 ; X64-BMI1BMI2-NEXT: retq
6309 %shifted = lshr i32 %val, %numskipbits
6310 %numhighbits = sub i32 32, %numlowbits
6311 %highbitscleared = shl i32 %shifted, %numhighbits
6312 %masked = lshr i32 %highbitscleared, %numhighbits
6316 define i32 @bextr32_d1_indexzext(i32 %val, i8 %numskipbits, i8 %numlowbits) nounwind {
6317 ; X86-NOBMI-LABEL: bextr32_d1_indexzext:
6318 ; X86-NOBMI: # %bb.0:
6319 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
6320 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
6321 ; X86-NOBMI-NEXT: shrl %cl, %eax
6322 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
6323 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
6324 ; X86-NOBMI-NEXT: shll %cl, %eax
6325 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
6326 ; X86-NOBMI-NEXT: shrl %cl, %eax
6327 ; X86-NOBMI-NEXT: retl
6329 ; X86-BMI1NOTBM-LABEL: bextr32_d1_indexzext:
6330 ; X86-BMI1NOTBM: # %bb.0:
6331 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
6332 ; X86-BMI1NOTBM-NEXT: shll $8, %eax
6333 ; X86-BMI1NOTBM-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
6334 ; X86-BMI1NOTBM-NEXT: orl %eax, %ecx
6335 ; X86-BMI1NOTBM-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %eax
6336 ; X86-BMI1NOTBM-NEXT: retl
6338 ; X86-BMI1BMI2-LABEL: bextr32_d1_indexzext:
6339 ; X86-BMI1BMI2: # %bb.0:
6340 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
6341 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
6342 ; X86-BMI1BMI2-NEXT: shrxl %ecx, {{[0-9]+}}(%esp), %ecx
6343 ; X86-BMI1BMI2-NEXT: bzhil %eax, %ecx, %eax
6344 ; X86-BMI1BMI2-NEXT: retl
6346 ; X64-NOBMI-LABEL: bextr32_d1_indexzext:
6347 ; X64-NOBMI: # %bb.0:
6348 ; X64-NOBMI-NEXT: movl %esi, %ecx
6349 ; X64-NOBMI-NEXT: movl %edi, %eax
6350 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
6351 ; X64-NOBMI-NEXT: shrl %cl, %eax
6352 ; X64-NOBMI-NEXT: negb %dl
6353 ; X64-NOBMI-NEXT: movl %edx, %ecx
6354 ; X64-NOBMI-NEXT: shll %cl, %eax
6355 ; X64-NOBMI-NEXT: shrl %cl, %eax
6356 ; X64-NOBMI-NEXT: retq
6358 ; X64-BMI1NOTBM-LABEL: bextr32_d1_indexzext:
6359 ; X64-BMI1NOTBM: # %bb.0:
6360 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
6361 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
6362 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
6363 ; X64-BMI1NOTBM-NEXT: bextrl %eax, %edi, %eax
6364 ; X64-BMI1NOTBM-NEXT: retq
6366 ; X64-BMI1BMI2-LABEL: bextr32_d1_indexzext:
6367 ; X64-BMI1BMI2: # %bb.0:
6368 ; X64-BMI1BMI2-NEXT: shrxl %esi, %edi, %eax
6369 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
6370 ; X64-BMI1BMI2-NEXT: retq
6371 %skip = zext i8 %numskipbits to i32
6372 %shifted = lshr i32 %val, %skip
6373 %numhighbits = sub i8 32, %numlowbits
6374 %sh_prom = zext i8 %numhighbits to i32
6375 %highbitscleared = shl i32 %shifted, %sh_prom
6376 %masked = lshr i32 %highbitscleared, %sh_prom
6380 define i32 @bextr32_d2_load(i32* %w, i32 %numskipbits, i32 %numlowbits) nounwind {
6381 ; X86-NOBMI-LABEL: bextr32_d2_load:
6382 ; X86-NOBMI: # %bb.0:
6383 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
6384 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
6385 ; X86-NOBMI-NEXT: movl (%eax), %eax
6386 ; X86-NOBMI-NEXT: shrl %cl, %eax
6387 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
6388 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
6389 ; X86-NOBMI-NEXT: shll %cl, %eax
6390 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
6391 ; X86-NOBMI-NEXT: shrl %cl, %eax
6392 ; X86-NOBMI-NEXT: retl
6394 ; X86-BMI1NOTBM-LABEL: bextr32_d2_load:
6395 ; X86-BMI1NOTBM: # %bb.0:
6396 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
6397 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
6398 ; X86-BMI1NOTBM-NEXT: shll $8, %ecx
6399 ; X86-BMI1NOTBM-NEXT: movzbl {{[0-9]+}}(%esp), %edx
6400 ; X86-BMI1NOTBM-NEXT: orl %ecx, %edx
6401 ; X86-BMI1NOTBM-NEXT: bextrl %edx, (%eax), %eax
6402 ; X86-BMI1NOTBM-NEXT: retl
6404 ; X86-BMI1BMI2-LABEL: bextr32_d2_load:
6405 ; X86-BMI1BMI2: # %bb.0:
6406 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
6407 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %ecx
6408 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %dl
6409 ; X86-BMI1BMI2-NEXT: shrxl %edx, (%ecx), %ecx
6410 ; X86-BMI1BMI2-NEXT: bzhil %eax, %ecx, %eax
6411 ; X86-BMI1BMI2-NEXT: retl
6413 ; X64-NOBMI-LABEL: bextr32_d2_load:
6414 ; X64-NOBMI: # %bb.0:
6415 ; X64-NOBMI-NEXT: movl %esi, %ecx
6416 ; X64-NOBMI-NEXT: movl (%rdi), %eax
6417 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
6418 ; X64-NOBMI-NEXT: shrl %cl, %eax
6419 ; X64-NOBMI-NEXT: negb %dl
6420 ; X64-NOBMI-NEXT: movl %edx, %ecx
6421 ; X64-NOBMI-NEXT: shll %cl, %eax
6422 ; X64-NOBMI-NEXT: shrl %cl, %eax
6423 ; X64-NOBMI-NEXT: retq
6425 ; X64-BMI1NOTBM-LABEL: bextr32_d2_load:
6426 ; X64-BMI1NOTBM: # %bb.0:
6427 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
6428 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
6429 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
6430 ; X64-BMI1NOTBM-NEXT: bextrl %eax, (%rdi), %eax
6431 ; X64-BMI1NOTBM-NEXT: retq
6433 ; X64-BMI1BMI2-LABEL: bextr32_d2_load:
6434 ; X64-BMI1BMI2: # %bb.0:
6435 ; X64-BMI1BMI2-NEXT: shrxl %esi, (%rdi), %eax
6436 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
6437 ; X64-BMI1BMI2-NEXT: retq
6438 %val = load i32, i32* %w
6439 %shifted = lshr i32 %val, %numskipbits
6440 %numhighbits = sub i32 32, %numlowbits
6441 %highbitscleared = shl i32 %shifted, %numhighbits
6442 %masked = lshr i32 %highbitscleared, %numhighbits
6446 define i32 @bextr32_d3_load_indexzext(i32* %w, i8 %numskipbits, i8 %numlowbits) nounwind {
6447 ; X86-NOBMI-LABEL: bextr32_d3_load_indexzext:
6448 ; X86-NOBMI: # %bb.0:
6449 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
6450 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
6451 ; X86-NOBMI-NEXT: movl (%eax), %eax
6452 ; X86-NOBMI-NEXT: shrl %cl, %eax
6453 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
6454 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
6455 ; X86-NOBMI-NEXT: shll %cl, %eax
6456 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
6457 ; X86-NOBMI-NEXT: shrl %cl, %eax
6458 ; X86-NOBMI-NEXT: retl
6460 ; X86-BMI1NOTBM-LABEL: bextr32_d3_load_indexzext:
6461 ; X86-BMI1NOTBM: # %bb.0:
6462 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
6463 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
6464 ; X86-BMI1NOTBM-NEXT: shll $8, %ecx
6465 ; X86-BMI1NOTBM-NEXT: movzbl {{[0-9]+}}(%esp), %edx
6466 ; X86-BMI1NOTBM-NEXT: orl %ecx, %edx
6467 ; X86-BMI1NOTBM-NEXT: bextrl %edx, (%eax), %eax
6468 ; X86-BMI1NOTBM-NEXT: retl
6470 ; X86-BMI1BMI2-LABEL: bextr32_d3_load_indexzext:
6471 ; X86-BMI1BMI2: # %bb.0:
6472 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
6473 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %ecx
6474 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %dl
6475 ; X86-BMI1BMI2-NEXT: shrxl %edx, (%ecx), %ecx
6476 ; X86-BMI1BMI2-NEXT: bzhil %eax, %ecx, %eax
6477 ; X86-BMI1BMI2-NEXT: retl
6479 ; X64-NOBMI-LABEL: bextr32_d3_load_indexzext:
6480 ; X64-NOBMI: # %bb.0:
6481 ; X64-NOBMI-NEXT: movl %esi, %ecx
6482 ; X64-NOBMI-NEXT: movl (%rdi), %eax
6483 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
6484 ; X64-NOBMI-NEXT: shrl %cl, %eax
6485 ; X64-NOBMI-NEXT: negb %dl
6486 ; X64-NOBMI-NEXT: movl %edx, %ecx
6487 ; X64-NOBMI-NEXT: shll %cl, %eax
6488 ; X64-NOBMI-NEXT: shrl %cl, %eax
6489 ; X64-NOBMI-NEXT: retq
6491 ; X64-BMI1NOTBM-LABEL: bextr32_d3_load_indexzext:
6492 ; X64-BMI1NOTBM: # %bb.0:
6493 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
6494 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
6495 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
6496 ; X64-BMI1NOTBM-NEXT: bextrl %eax, (%rdi), %eax
6497 ; X64-BMI1NOTBM-NEXT: retq
6499 ; X64-BMI1BMI2-LABEL: bextr32_d3_load_indexzext:
6500 ; X64-BMI1BMI2: # %bb.0:
6501 ; X64-BMI1BMI2-NEXT: shrxl %esi, (%rdi), %eax
6502 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
6503 ; X64-BMI1BMI2-NEXT: retq
6504 %val = load i32, i32* %w
6505 %skip = zext i8 %numskipbits to i32
6506 %shifted = lshr i32 %val, %skip
6507 %numhighbits = sub i8 32, %numlowbits
6508 %sh_prom = zext i8 %numhighbits to i32
6509 %highbitscleared = shl i32 %shifted, %sh_prom
6510 %masked = lshr i32 %highbitscleared, %sh_prom
6514 define i32 @bextr32_d5_skipextrauses(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
6515 ; X86-NOBMI-LABEL: bextr32_d5_skipextrauses:
6516 ; X86-NOBMI: # %bb.0:
6517 ; X86-NOBMI-NEXT: pushl %esi
6518 ; X86-NOBMI-NEXT: subl $8, %esp
6519 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
6520 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
6521 ; X86-NOBMI-NEXT: movl %eax, %ecx
6522 ; X86-NOBMI-NEXT: shrl %cl, %esi
6523 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
6524 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
6525 ; X86-NOBMI-NEXT: shll %cl, %esi
6526 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
6527 ; X86-NOBMI-NEXT: shrl %cl, %esi
6528 ; X86-NOBMI-NEXT: movl %eax, (%esp)
6529 ; X86-NOBMI-NEXT: calll use32
6530 ; X86-NOBMI-NEXT: movl %esi, %eax
6531 ; X86-NOBMI-NEXT: addl $8, %esp
6532 ; X86-NOBMI-NEXT: popl %esi
6533 ; X86-NOBMI-NEXT: retl
6535 ; X86-BMI1NOTBM-LABEL: bextr32_d5_skipextrauses:
6536 ; X86-BMI1NOTBM: # %bb.0:
6537 ; X86-BMI1NOTBM-NEXT: pushl %esi
6538 ; X86-BMI1NOTBM-NEXT: subl $8, %esp
6539 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
6540 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
6541 ; X86-BMI1NOTBM-NEXT: shll $8, %ecx
6542 ; X86-BMI1NOTBM-NEXT: movzbl %al, %edx
6543 ; X86-BMI1NOTBM-NEXT: orl %ecx, %edx
6544 ; X86-BMI1NOTBM-NEXT: bextrl %edx, {{[0-9]+}}(%esp), %esi
6545 ; X86-BMI1NOTBM-NEXT: movl %eax, (%esp)
6546 ; X86-BMI1NOTBM-NEXT: calll use32
6547 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
6548 ; X86-BMI1NOTBM-NEXT: addl $8, %esp
6549 ; X86-BMI1NOTBM-NEXT: popl %esi
6550 ; X86-BMI1NOTBM-NEXT: retl
6552 ; X86-BMI1BMI2-LABEL: bextr32_d5_skipextrauses:
6553 ; X86-BMI1BMI2: # %bb.0:
6554 ; X86-BMI1BMI2-NEXT: pushl %esi
6555 ; X86-BMI1BMI2-NEXT: subl $8, %esp
6556 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
6557 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %ecx
6558 ; X86-BMI1BMI2-NEXT: shrxl %ecx, {{[0-9]+}}(%esp), %edx
6559 ; X86-BMI1BMI2-NEXT: bzhil %eax, %edx, %esi
6560 ; X86-BMI1BMI2-NEXT: movl %ecx, (%esp)
6561 ; X86-BMI1BMI2-NEXT: calll use32
6562 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
6563 ; X86-BMI1BMI2-NEXT: addl $8, %esp
6564 ; X86-BMI1BMI2-NEXT: popl %esi
6565 ; X86-BMI1BMI2-NEXT: retl
6567 ; X64-NOBMI-LABEL: bextr32_d5_skipextrauses:
6568 ; X64-NOBMI: # %bb.0:
6569 ; X64-NOBMI-NEXT: pushq %rbx
6570 ; X64-NOBMI-NEXT: movl %edi, %ebx
6571 ; X64-NOBMI-NEXT: movl %esi, %ecx
6572 ; X64-NOBMI-NEXT: shrl %cl, %ebx
6573 ; X64-NOBMI-NEXT: negb %dl
6574 ; X64-NOBMI-NEXT: movl %edx, %ecx
6575 ; X64-NOBMI-NEXT: shll %cl, %ebx
6576 ; X64-NOBMI-NEXT: shrl %cl, %ebx
6577 ; X64-NOBMI-NEXT: movl %esi, %edi
6578 ; X64-NOBMI-NEXT: callq use32
6579 ; X64-NOBMI-NEXT: movl %ebx, %eax
6580 ; X64-NOBMI-NEXT: popq %rbx
6581 ; X64-NOBMI-NEXT: retq
6583 ; X64-BMI1NOTBM-LABEL: bextr32_d5_skipextrauses:
6584 ; X64-BMI1NOTBM: # %bb.0:
6585 ; X64-BMI1NOTBM-NEXT: pushq %rbx
6586 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
6587 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
6588 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
6589 ; X64-BMI1NOTBM-NEXT: bextrl %eax, %edi, %ebx
6590 ; X64-BMI1NOTBM-NEXT: movl %esi, %edi
6591 ; X64-BMI1NOTBM-NEXT: callq use32
6592 ; X64-BMI1NOTBM-NEXT: movl %ebx, %eax
6593 ; X64-BMI1NOTBM-NEXT: popq %rbx
6594 ; X64-BMI1NOTBM-NEXT: retq
6596 ; X64-BMI1BMI2-LABEL: bextr32_d5_skipextrauses:
6597 ; X64-BMI1BMI2: # %bb.0:
6598 ; X64-BMI1BMI2-NEXT: pushq %rbx
6599 ; X64-BMI1BMI2-NEXT: shrxl %esi, %edi, %eax
6600 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %ebx
6601 ; X64-BMI1BMI2-NEXT: movl %esi, %edi
6602 ; X64-BMI1BMI2-NEXT: callq use32
6603 ; X64-BMI1BMI2-NEXT: movl %ebx, %eax
6604 ; X64-BMI1BMI2-NEXT: popq %rbx
6605 ; X64-BMI1BMI2-NEXT: retq
6606 %shifted = lshr i32 %val, %numskipbits
6607 %numhighbits = sub i32 32, %numlowbits
6608 %highbitscleared = shl i32 %shifted, %numhighbits
6609 %masked = lshr i32 %highbitscleared, %numhighbits
6610 call void @use32(i32 %numskipbits)
6616 define i64 @bextr64_d0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
6617 ; X86-NOBMI-LABEL: bextr64_d0:
6618 ; X86-NOBMI: # %bb.0:
6619 ; X86-NOBMI-NEXT: pushl %ebx
6620 ; X86-NOBMI-NEXT: pushl %edi
6621 ; X86-NOBMI-NEXT: pushl %esi
6622 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
6623 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edi
6624 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edx
6625 ; X86-NOBMI-NEXT: movl %edx, %eax
6626 ; X86-NOBMI-NEXT: shrl %cl, %eax
6627 ; X86-NOBMI-NEXT: shrdl %cl, %edx, %edi
6628 ; X86-NOBMI-NEXT: xorl %esi, %esi
6629 ; X86-NOBMI-NEXT: testb $32, %cl
6630 ; X86-NOBMI-NEXT: je .LBB53_2
6631 ; X86-NOBMI-NEXT: # %bb.1:
6632 ; X86-NOBMI-NEXT: movl %eax, %edi
6633 ; X86-NOBMI-NEXT: xorl %eax, %eax
6634 ; X86-NOBMI-NEXT: .LBB53_2:
6635 ; X86-NOBMI-NEXT: movb $64, %cl
6636 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
6637 ; X86-NOBMI-NEXT: shldl %cl, %edi, %eax
6638 ; X86-NOBMI-NEXT: shll %cl, %edi
6639 ; X86-NOBMI-NEXT: testb $32, %cl
6640 ; X86-NOBMI-NEXT: movl %edi, %ebx
6641 ; X86-NOBMI-NEXT: jne .LBB53_4
6642 ; X86-NOBMI-NEXT: # %bb.3:
6643 ; X86-NOBMI-NEXT: movl %eax, %ebx
6644 ; X86-NOBMI-NEXT: .LBB53_4:
6645 ; X86-NOBMI-NEXT: movl %ebx, %eax
6646 ; X86-NOBMI-NEXT: shrl %cl, %eax
6647 ; X86-NOBMI-NEXT: testb $32, %cl
6648 ; X86-NOBMI-NEXT: movl $0, %edx
6649 ; X86-NOBMI-NEXT: jne .LBB53_6
6650 ; X86-NOBMI-NEXT: # %bb.5:
6651 ; X86-NOBMI-NEXT: movl %edi, %esi
6652 ; X86-NOBMI-NEXT: movl %eax, %edx
6653 ; X86-NOBMI-NEXT: .LBB53_6:
6654 ; X86-NOBMI-NEXT: shrdl %cl, %ebx, %esi
6655 ; X86-NOBMI-NEXT: testb $32, %cl
6656 ; X86-NOBMI-NEXT: jne .LBB53_8
6657 ; X86-NOBMI-NEXT: # %bb.7:
6658 ; X86-NOBMI-NEXT: movl %esi, %eax
6659 ; X86-NOBMI-NEXT: .LBB53_8:
6660 ; X86-NOBMI-NEXT: popl %esi
6661 ; X86-NOBMI-NEXT: popl %edi
6662 ; X86-NOBMI-NEXT: popl %ebx
6663 ; X86-NOBMI-NEXT: retl
6665 ; X86-BMI1NOTBM-LABEL: bextr64_d0:
6666 ; X86-BMI1NOTBM: # %bb.0:
6667 ; X86-BMI1NOTBM-NEXT: pushl %ebx
6668 ; X86-BMI1NOTBM-NEXT: pushl %edi
6669 ; X86-BMI1NOTBM-NEXT: pushl %esi
6670 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
6671 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
6672 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx
6673 ; X86-BMI1NOTBM-NEXT: movl %edx, %eax
6674 ; X86-BMI1NOTBM-NEXT: shrl %cl, %eax
6675 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edx, %edi
6676 ; X86-BMI1NOTBM-NEXT: xorl %esi, %esi
6677 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
6678 ; X86-BMI1NOTBM-NEXT: je .LBB53_2
6679 ; X86-BMI1NOTBM-NEXT: # %bb.1:
6680 ; X86-BMI1NOTBM-NEXT: movl %eax, %edi
6681 ; X86-BMI1NOTBM-NEXT: xorl %eax, %eax
6682 ; X86-BMI1NOTBM-NEXT: .LBB53_2:
6683 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
6684 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
6685 ; X86-BMI1NOTBM-NEXT: shldl %cl, %edi, %eax
6686 ; X86-BMI1NOTBM-NEXT: shll %cl, %edi
6687 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
6688 ; X86-BMI1NOTBM-NEXT: movl %edi, %ebx
6689 ; X86-BMI1NOTBM-NEXT: jne .LBB53_4
6690 ; X86-BMI1NOTBM-NEXT: # %bb.3:
6691 ; X86-BMI1NOTBM-NEXT: movl %eax, %ebx
6692 ; X86-BMI1NOTBM-NEXT: .LBB53_4:
6693 ; X86-BMI1NOTBM-NEXT: movl %ebx, %eax
6694 ; X86-BMI1NOTBM-NEXT: shrl %cl, %eax
6695 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
6696 ; X86-BMI1NOTBM-NEXT: movl $0, %edx
6697 ; X86-BMI1NOTBM-NEXT: jne .LBB53_6
6698 ; X86-BMI1NOTBM-NEXT: # %bb.5:
6699 ; X86-BMI1NOTBM-NEXT: movl %edi, %esi
6700 ; X86-BMI1NOTBM-NEXT: movl %eax, %edx
6701 ; X86-BMI1NOTBM-NEXT: .LBB53_6:
6702 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %ebx, %esi
6703 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
6704 ; X86-BMI1NOTBM-NEXT: jne .LBB53_8
6705 ; X86-BMI1NOTBM-NEXT: # %bb.7:
6706 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
6707 ; X86-BMI1NOTBM-NEXT: .LBB53_8:
6708 ; X86-BMI1NOTBM-NEXT: popl %esi
6709 ; X86-BMI1NOTBM-NEXT: popl %edi
6710 ; X86-BMI1NOTBM-NEXT: popl %ebx
6711 ; X86-BMI1NOTBM-NEXT: retl
6713 ; X86-BMI1BMI2-LABEL: bextr64_d0:
6714 ; X86-BMI1BMI2: # %bb.0:
6715 ; X86-BMI1BMI2-NEXT: pushl %edi
6716 ; X86-BMI1BMI2-NEXT: pushl %esi
6717 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
6718 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
6719 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
6720 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edx, %eax
6721 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %edx, %esi
6722 ; X86-BMI1BMI2-NEXT: xorl %edx, %edx
6723 ; X86-BMI1BMI2-NEXT: testb $32, %cl
6724 ; X86-BMI1BMI2-NEXT: je .LBB53_2
6725 ; X86-BMI1BMI2-NEXT: # %bb.1:
6726 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
6727 ; X86-BMI1BMI2-NEXT: xorl %esi, %esi
6728 ; X86-BMI1BMI2-NEXT: .LBB53_2:
6729 ; X86-BMI1BMI2-NEXT: movb $64, %cl
6730 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
6731 ; X86-BMI1BMI2-NEXT: shldl %cl, %eax, %esi
6732 ; X86-BMI1BMI2-NEXT: shlxl %ecx, %eax, %edi
6733 ; X86-BMI1BMI2-NEXT: testb $32, %cl
6734 ; X86-BMI1BMI2-NEXT: je .LBB53_4
6735 ; X86-BMI1BMI2-NEXT: # %bb.3:
6736 ; X86-BMI1BMI2-NEXT: movl %edi, %esi
6737 ; X86-BMI1BMI2-NEXT: movl $0, %edi
6738 ; X86-BMI1BMI2-NEXT: .LBB53_4:
6739 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %eax
6740 ; X86-BMI1BMI2-NEXT: jne .LBB53_6
6741 ; X86-BMI1BMI2-NEXT: # %bb.5:
6742 ; X86-BMI1BMI2-NEXT: movl %eax, %edx
6743 ; X86-BMI1BMI2-NEXT: .LBB53_6:
6744 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edi
6745 ; X86-BMI1BMI2-NEXT: testb $32, %cl
6746 ; X86-BMI1BMI2-NEXT: jne .LBB53_8
6747 ; X86-BMI1BMI2-NEXT: # %bb.7:
6748 ; X86-BMI1BMI2-NEXT: movl %edi, %eax
6749 ; X86-BMI1BMI2-NEXT: .LBB53_8:
6750 ; X86-BMI1BMI2-NEXT: popl %esi
6751 ; X86-BMI1BMI2-NEXT: popl %edi
6752 ; X86-BMI1BMI2-NEXT: retl
6754 ; X64-NOBMI-LABEL: bextr64_d0:
6755 ; X64-NOBMI: # %bb.0:
6756 ; X64-NOBMI-NEXT: movq %rsi, %rcx
6757 ; X64-NOBMI-NEXT: movq %rdi, %rax
6758 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
6759 ; X64-NOBMI-NEXT: shrq %cl, %rax
6760 ; X64-NOBMI-NEXT: negb %dl
6761 ; X64-NOBMI-NEXT: movl %edx, %ecx
6762 ; X64-NOBMI-NEXT: shlq %cl, %rax
6763 ; X64-NOBMI-NEXT: shrq %cl, %rax
6764 ; X64-NOBMI-NEXT: retq
6766 ; X64-BMI1NOTBM-LABEL: bextr64_d0:
6767 ; X64-BMI1NOTBM: # %bb.0:
6768 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
6769 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
6770 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
6771 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
6772 ; X64-BMI1NOTBM-NEXT: retq
6774 ; X64-BMI1BMI2-LABEL: bextr64_d0:
6775 ; X64-BMI1BMI2: # %bb.0:
6776 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
6777 ; X64-BMI1BMI2-NEXT: bzhiq %rdx, %rax, %rax
6778 ; X64-BMI1BMI2-NEXT: retq
6779 %shifted = lshr i64 %val, %numskipbits
6780 %numhighbits = sub i64 64, %numlowbits
6781 %highbitscleared = shl i64 %shifted, %numhighbits
6782 %masked = lshr i64 %highbitscleared, %numhighbits
6786 define i64 @bextr64_d1_indexzext(i64 %val, i8 %numskipbits, i8 %numlowbits) nounwind {
6787 ; X86-NOBMI-LABEL: bextr64_d1_indexzext:
6788 ; X86-NOBMI: # %bb.0:
6789 ; X86-NOBMI-NEXT: pushl %ebx
6790 ; X86-NOBMI-NEXT: pushl %edi
6791 ; X86-NOBMI-NEXT: pushl %esi
6792 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
6793 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edi
6794 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edx
6795 ; X86-NOBMI-NEXT: movl %edx, %eax
6796 ; X86-NOBMI-NEXT: shrl %cl, %eax
6797 ; X86-NOBMI-NEXT: shrdl %cl, %edx, %edi
6798 ; X86-NOBMI-NEXT: xorl %esi, %esi
6799 ; X86-NOBMI-NEXT: testb $32, %cl
6800 ; X86-NOBMI-NEXT: je .LBB54_2
6801 ; X86-NOBMI-NEXT: # %bb.1:
6802 ; X86-NOBMI-NEXT: movl %eax, %edi
6803 ; X86-NOBMI-NEXT: xorl %eax, %eax
6804 ; X86-NOBMI-NEXT: .LBB54_2:
6805 ; X86-NOBMI-NEXT: movb $64, %cl
6806 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
6807 ; X86-NOBMI-NEXT: shldl %cl, %edi, %eax
6808 ; X86-NOBMI-NEXT: shll %cl, %edi
6809 ; X86-NOBMI-NEXT: testb $32, %cl
6810 ; X86-NOBMI-NEXT: movl %edi, %ebx
6811 ; X86-NOBMI-NEXT: jne .LBB54_4
6812 ; X86-NOBMI-NEXT: # %bb.3:
6813 ; X86-NOBMI-NEXT: movl %eax, %ebx
6814 ; X86-NOBMI-NEXT: .LBB54_4:
6815 ; X86-NOBMI-NEXT: movl %ebx, %eax
6816 ; X86-NOBMI-NEXT: shrl %cl, %eax
6817 ; X86-NOBMI-NEXT: testb $32, %cl
6818 ; X86-NOBMI-NEXT: movl $0, %edx
6819 ; X86-NOBMI-NEXT: jne .LBB54_6
6820 ; X86-NOBMI-NEXT: # %bb.5:
6821 ; X86-NOBMI-NEXT: movl %edi, %esi
6822 ; X86-NOBMI-NEXT: movl %eax, %edx
6823 ; X86-NOBMI-NEXT: .LBB54_6:
6824 ; X86-NOBMI-NEXT: shrdl %cl, %ebx, %esi
6825 ; X86-NOBMI-NEXT: testb $32, %cl
6826 ; X86-NOBMI-NEXT: jne .LBB54_8
6827 ; X86-NOBMI-NEXT: # %bb.7:
6828 ; X86-NOBMI-NEXT: movl %esi, %eax
6829 ; X86-NOBMI-NEXT: .LBB54_8:
6830 ; X86-NOBMI-NEXT: popl %esi
6831 ; X86-NOBMI-NEXT: popl %edi
6832 ; X86-NOBMI-NEXT: popl %ebx
6833 ; X86-NOBMI-NEXT: retl
6835 ; X86-BMI1NOTBM-LABEL: bextr64_d1_indexzext:
6836 ; X86-BMI1NOTBM: # %bb.0:
6837 ; X86-BMI1NOTBM-NEXT: pushl %ebx
6838 ; X86-BMI1NOTBM-NEXT: pushl %edi
6839 ; X86-BMI1NOTBM-NEXT: pushl %esi
6840 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
6841 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
6842 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx
6843 ; X86-BMI1NOTBM-NEXT: movl %edx, %eax
6844 ; X86-BMI1NOTBM-NEXT: shrl %cl, %eax
6845 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edx, %edi
6846 ; X86-BMI1NOTBM-NEXT: xorl %esi, %esi
6847 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
6848 ; X86-BMI1NOTBM-NEXT: je .LBB54_2
6849 ; X86-BMI1NOTBM-NEXT: # %bb.1:
6850 ; X86-BMI1NOTBM-NEXT: movl %eax, %edi
6851 ; X86-BMI1NOTBM-NEXT: xorl %eax, %eax
6852 ; X86-BMI1NOTBM-NEXT: .LBB54_2:
6853 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
6854 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
6855 ; X86-BMI1NOTBM-NEXT: shldl %cl, %edi, %eax
6856 ; X86-BMI1NOTBM-NEXT: shll %cl, %edi
6857 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
6858 ; X86-BMI1NOTBM-NEXT: movl %edi, %ebx
6859 ; X86-BMI1NOTBM-NEXT: jne .LBB54_4
6860 ; X86-BMI1NOTBM-NEXT: # %bb.3:
6861 ; X86-BMI1NOTBM-NEXT: movl %eax, %ebx
6862 ; X86-BMI1NOTBM-NEXT: .LBB54_4:
6863 ; X86-BMI1NOTBM-NEXT: movl %ebx, %eax
6864 ; X86-BMI1NOTBM-NEXT: shrl %cl, %eax
6865 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
6866 ; X86-BMI1NOTBM-NEXT: movl $0, %edx
6867 ; X86-BMI1NOTBM-NEXT: jne .LBB54_6
6868 ; X86-BMI1NOTBM-NEXT: # %bb.5:
6869 ; X86-BMI1NOTBM-NEXT: movl %edi, %esi
6870 ; X86-BMI1NOTBM-NEXT: movl %eax, %edx
6871 ; X86-BMI1NOTBM-NEXT: .LBB54_6:
6872 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %ebx, %esi
6873 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
6874 ; X86-BMI1NOTBM-NEXT: jne .LBB54_8
6875 ; X86-BMI1NOTBM-NEXT: # %bb.7:
6876 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
6877 ; X86-BMI1NOTBM-NEXT: .LBB54_8:
6878 ; X86-BMI1NOTBM-NEXT: popl %esi
6879 ; X86-BMI1NOTBM-NEXT: popl %edi
6880 ; X86-BMI1NOTBM-NEXT: popl %ebx
6881 ; X86-BMI1NOTBM-NEXT: retl
6883 ; X86-BMI1BMI2-LABEL: bextr64_d1_indexzext:
6884 ; X86-BMI1BMI2: # %bb.0:
6885 ; X86-BMI1BMI2-NEXT: pushl %edi
6886 ; X86-BMI1BMI2-NEXT: pushl %esi
6887 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
6888 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
6889 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
6890 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edx, %eax
6891 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %edx, %esi
6892 ; X86-BMI1BMI2-NEXT: xorl %edx, %edx
6893 ; X86-BMI1BMI2-NEXT: testb $32, %cl
6894 ; X86-BMI1BMI2-NEXT: je .LBB54_2
6895 ; X86-BMI1BMI2-NEXT: # %bb.1:
6896 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
6897 ; X86-BMI1BMI2-NEXT: xorl %esi, %esi
6898 ; X86-BMI1BMI2-NEXT: .LBB54_2:
6899 ; X86-BMI1BMI2-NEXT: movb $64, %cl
6900 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
6901 ; X86-BMI1BMI2-NEXT: shldl %cl, %eax, %esi
6902 ; X86-BMI1BMI2-NEXT: shlxl %ecx, %eax, %edi
6903 ; X86-BMI1BMI2-NEXT: testb $32, %cl
6904 ; X86-BMI1BMI2-NEXT: je .LBB54_4
6905 ; X86-BMI1BMI2-NEXT: # %bb.3:
6906 ; X86-BMI1BMI2-NEXT: movl %edi, %esi
6907 ; X86-BMI1BMI2-NEXT: movl $0, %edi
6908 ; X86-BMI1BMI2-NEXT: .LBB54_4:
6909 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %eax
6910 ; X86-BMI1BMI2-NEXT: jne .LBB54_6
6911 ; X86-BMI1BMI2-NEXT: # %bb.5:
6912 ; X86-BMI1BMI2-NEXT: movl %eax, %edx
6913 ; X86-BMI1BMI2-NEXT: .LBB54_6:
6914 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edi
6915 ; X86-BMI1BMI2-NEXT: testb $32, %cl
6916 ; X86-BMI1BMI2-NEXT: jne .LBB54_8
6917 ; X86-BMI1BMI2-NEXT: # %bb.7:
6918 ; X86-BMI1BMI2-NEXT: movl %edi, %eax
6919 ; X86-BMI1BMI2-NEXT: .LBB54_8:
6920 ; X86-BMI1BMI2-NEXT: popl %esi
6921 ; X86-BMI1BMI2-NEXT: popl %edi
6922 ; X86-BMI1BMI2-NEXT: retl
6924 ; X64-NOBMI-LABEL: bextr64_d1_indexzext:
6925 ; X64-NOBMI: # %bb.0:
6926 ; X64-NOBMI-NEXT: movl %esi, %ecx
6927 ; X64-NOBMI-NEXT: movq %rdi, %rax
6928 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
6929 ; X64-NOBMI-NEXT: shrq %cl, %rax
6930 ; X64-NOBMI-NEXT: negb %dl
6931 ; X64-NOBMI-NEXT: movl %edx, %ecx
6932 ; X64-NOBMI-NEXT: shlq %cl, %rax
6933 ; X64-NOBMI-NEXT: shrq %cl, %rax
6934 ; X64-NOBMI-NEXT: retq
6936 ; X64-BMI1NOTBM-LABEL: bextr64_d1_indexzext:
6937 ; X64-BMI1NOTBM: # %bb.0:
6938 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
6939 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
6940 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
6941 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
6942 ; X64-BMI1NOTBM-NEXT: retq
6944 ; X64-BMI1BMI2-LABEL: bextr64_d1_indexzext:
6945 ; X64-BMI1BMI2: # %bb.0:
6946 ; X64-BMI1BMI2-NEXT: # kill: def $edx killed $edx def $rdx
6947 ; X64-BMI1BMI2-NEXT: # kill: def $esi killed $esi def $rsi
6948 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
6949 ; X64-BMI1BMI2-NEXT: bzhiq %rdx, %rax, %rax
6950 ; X64-BMI1BMI2-NEXT: retq
6951 %skip = zext i8 %numskipbits to i64
6952 %shifted = lshr i64 %val, %skip
6953 %numhighbits = sub i8 64, %numlowbits
6954 %sh_prom = zext i8 %numhighbits to i64
6955 %highbitscleared = shl i64 %shifted, %sh_prom
6956 %masked = lshr i64 %highbitscleared, %sh_prom
6960 define i64 @bextr64_d2_load(i64* %w, i64 %numskipbits, i64 %numlowbits) nounwind {
6961 ; X86-NOBMI-LABEL: bextr64_d2_load:
6962 ; X86-NOBMI: # %bb.0:
6963 ; X86-NOBMI-NEXT: pushl %ebx
6964 ; X86-NOBMI-NEXT: pushl %edi
6965 ; X86-NOBMI-NEXT: pushl %esi
6966 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
6967 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
6968 ; X86-NOBMI-NEXT: movl (%eax), %edi
6969 ; X86-NOBMI-NEXT: movl 4(%eax), %edx
6970 ; X86-NOBMI-NEXT: movl %edx, %eax
6971 ; X86-NOBMI-NEXT: shrl %cl, %eax
6972 ; X86-NOBMI-NEXT: shrdl %cl, %edx, %edi
6973 ; X86-NOBMI-NEXT: xorl %esi, %esi
6974 ; X86-NOBMI-NEXT: testb $32, %cl
6975 ; X86-NOBMI-NEXT: je .LBB55_2
6976 ; X86-NOBMI-NEXT: # %bb.1:
6977 ; X86-NOBMI-NEXT: movl %eax, %edi
6978 ; X86-NOBMI-NEXT: xorl %eax, %eax
6979 ; X86-NOBMI-NEXT: .LBB55_2:
6980 ; X86-NOBMI-NEXT: movb $64, %cl
6981 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
6982 ; X86-NOBMI-NEXT: shldl %cl, %edi, %eax
6983 ; X86-NOBMI-NEXT: shll %cl, %edi
6984 ; X86-NOBMI-NEXT: testb $32, %cl
6985 ; X86-NOBMI-NEXT: movl %edi, %ebx
6986 ; X86-NOBMI-NEXT: jne .LBB55_4
6987 ; X86-NOBMI-NEXT: # %bb.3:
6988 ; X86-NOBMI-NEXT: movl %eax, %ebx
6989 ; X86-NOBMI-NEXT: .LBB55_4:
6990 ; X86-NOBMI-NEXT: movl %ebx, %eax
6991 ; X86-NOBMI-NEXT: shrl %cl, %eax
6992 ; X86-NOBMI-NEXT: testb $32, %cl
6993 ; X86-NOBMI-NEXT: movl $0, %edx
6994 ; X86-NOBMI-NEXT: jne .LBB55_6
6995 ; X86-NOBMI-NEXT: # %bb.5:
6996 ; X86-NOBMI-NEXT: movl %edi, %esi
6997 ; X86-NOBMI-NEXT: movl %eax, %edx
6998 ; X86-NOBMI-NEXT: .LBB55_6:
6999 ; X86-NOBMI-NEXT: shrdl %cl, %ebx, %esi
7000 ; X86-NOBMI-NEXT: testb $32, %cl
7001 ; X86-NOBMI-NEXT: jne .LBB55_8
7002 ; X86-NOBMI-NEXT: # %bb.7:
7003 ; X86-NOBMI-NEXT: movl %esi, %eax
7004 ; X86-NOBMI-NEXT: .LBB55_8:
7005 ; X86-NOBMI-NEXT: popl %esi
7006 ; X86-NOBMI-NEXT: popl %edi
7007 ; X86-NOBMI-NEXT: popl %ebx
7008 ; X86-NOBMI-NEXT: retl
7010 ; X86-BMI1NOTBM-LABEL: bextr64_d2_load:
7011 ; X86-BMI1NOTBM: # %bb.0:
7012 ; X86-BMI1NOTBM-NEXT: pushl %ebx
7013 ; X86-BMI1NOTBM-NEXT: pushl %edi
7014 ; X86-BMI1NOTBM-NEXT: pushl %esi
7015 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
7016 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
7017 ; X86-BMI1NOTBM-NEXT: movl (%eax), %edi
7018 ; X86-BMI1NOTBM-NEXT: movl 4(%eax), %edx
7019 ; X86-BMI1NOTBM-NEXT: movl %edx, %eax
7020 ; X86-BMI1NOTBM-NEXT: shrl %cl, %eax
7021 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edx, %edi
7022 ; X86-BMI1NOTBM-NEXT: xorl %esi, %esi
7023 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7024 ; X86-BMI1NOTBM-NEXT: je .LBB55_2
7025 ; X86-BMI1NOTBM-NEXT: # %bb.1:
7026 ; X86-BMI1NOTBM-NEXT: movl %eax, %edi
7027 ; X86-BMI1NOTBM-NEXT: xorl %eax, %eax
7028 ; X86-BMI1NOTBM-NEXT: .LBB55_2:
7029 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
7030 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
7031 ; X86-BMI1NOTBM-NEXT: shldl %cl, %edi, %eax
7032 ; X86-BMI1NOTBM-NEXT: shll %cl, %edi
7033 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7034 ; X86-BMI1NOTBM-NEXT: movl %edi, %ebx
7035 ; X86-BMI1NOTBM-NEXT: jne .LBB55_4
7036 ; X86-BMI1NOTBM-NEXT: # %bb.3:
7037 ; X86-BMI1NOTBM-NEXT: movl %eax, %ebx
7038 ; X86-BMI1NOTBM-NEXT: .LBB55_4:
7039 ; X86-BMI1NOTBM-NEXT: movl %ebx, %eax
7040 ; X86-BMI1NOTBM-NEXT: shrl %cl, %eax
7041 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7042 ; X86-BMI1NOTBM-NEXT: movl $0, %edx
7043 ; X86-BMI1NOTBM-NEXT: jne .LBB55_6
7044 ; X86-BMI1NOTBM-NEXT: # %bb.5:
7045 ; X86-BMI1NOTBM-NEXT: movl %edi, %esi
7046 ; X86-BMI1NOTBM-NEXT: movl %eax, %edx
7047 ; X86-BMI1NOTBM-NEXT: .LBB55_6:
7048 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %ebx, %esi
7049 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7050 ; X86-BMI1NOTBM-NEXT: jne .LBB55_8
7051 ; X86-BMI1NOTBM-NEXT: # %bb.7:
7052 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
7053 ; X86-BMI1NOTBM-NEXT: .LBB55_8:
7054 ; X86-BMI1NOTBM-NEXT: popl %esi
7055 ; X86-BMI1NOTBM-NEXT: popl %edi
7056 ; X86-BMI1NOTBM-NEXT: popl %ebx
7057 ; X86-BMI1NOTBM-NEXT: retl
7059 ; X86-BMI1BMI2-LABEL: bextr64_d2_load:
7060 ; X86-BMI1BMI2: # %bb.0:
7061 ; X86-BMI1BMI2-NEXT: pushl %edi
7062 ; X86-BMI1BMI2-NEXT: pushl %esi
7063 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
7064 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
7065 ; X86-BMI1BMI2-NEXT: movl (%edx), %eax
7066 ; X86-BMI1BMI2-NEXT: movl 4(%edx), %edx
7067 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %edx, %esi
7068 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edx, %eax
7069 ; X86-BMI1BMI2-NEXT: xorl %edx, %edx
7070 ; X86-BMI1BMI2-NEXT: testb $32, %cl
7071 ; X86-BMI1BMI2-NEXT: je .LBB55_2
7072 ; X86-BMI1BMI2-NEXT: # %bb.1:
7073 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
7074 ; X86-BMI1BMI2-NEXT: xorl %esi, %esi
7075 ; X86-BMI1BMI2-NEXT: .LBB55_2:
7076 ; X86-BMI1BMI2-NEXT: movb $64, %cl
7077 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
7078 ; X86-BMI1BMI2-NEXT: shldl %cl, %eax, %esi
7079 ; X86-BMI1BMI2-NEXT: shlxl %ecx, %eax, %edi
7080 ; X86-BMI1BMI2-NEXT: testb $32, %cl
7081 ; X86-BMI1BMI2-NEXT: je .LBB55_4
7082 ; X86-BMI1BMI2-NEXT: # %bb.3:
7083 ; X86-BMI1BMI2-NEXT: movl %edi, %esi
7084 ; X86-BMI1BMI2-NEXT: movl $0, %edi
7085 ; X86-BMI1BMI2-NEXT: .LBB55_4:
7086 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %eax
7087 ; X86-BMI1BMI2-NEXT: jne .LBB55_6
7088 ; X86-BMI1BMI2-NEXT: # %bb.5:
7089 ; X86-BMI1BMI2-NEXT: movl %eax, %edx
7090 ; X86-BMI1BMI2-NEXT: .LBB55_6:
7091 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edi
7092 ; X86-BMI1BMI2-NEXT: testb $32, %cl
7093 ; X86-BMI1BMI2-NEXT: jne .LBB55_8
7094 ; X86-BMI1BMI2-NEXT: # %bb.7:
7095 ; X86-BMI1BMI2-NEXT: movl %edi, %eax
7096 ; X86-BMI1BMI2-NEXT: .LBB55_8:
7097 ; X86-BMI1BMI2-NEXT: popl %esi
7098 ; X86-BMI1BMI2-NEXT: popl %edi
7099 ; X86-BMI1BMI2-NEXT: retl
7101 ; X64-NOBMI-LABEL: bextr64_d2_load:
7102 ; X64-NOBMI: # %bb.0:
7103 ; X64-NOBMI-NEXT: movq %rsi, %rcx
7104 ; X64-NOBMI-NEXT: movq (%rdi), %rax
7105 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
7106 ; X64-NOBMI-NEXT: shrq %cl, %rax
7107 ; X64-NOBMI-NEXT: negb %dl
7108 ; X64-NOBMI-NEXT: movl %edx, %ecx
7109 ; X64-NOBMI-NEXT: shlq %cl, %rax
7110 ; X64-NOBMI-NEXT: shrq %cl, %rax
7111 ; X64-NOBMI-NEXT: retq
7113 ; X64-BMI1NOTBM-LABEL: bextr64_d2_load:
7114 ; X64-BMI1NOTBM: # %bb.0:
7115 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
7116 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
7117 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
7118 ; X64-BMI1NOTBM-NEXT: bextrq %rax, (%rdi), %rax
7119 ; X64-BMI1NOTBM-NEXT: retq
7121 ; X64-BMI1BMI2-LABEL: bextr64_d2_load:
7122 ; X64-BMI1BMI2: # %bb.0:
7123 ; X64-BMI1BMI2-NEXT: shrxq %rsi, (%rdi), %rax
7124 ; X64-BMI1BMI2-NEXT: bzhiq %rdx, %rax, %rax
7125 ; X64-BMI1BMI2-NEXT: retq
7126 %val = load i64, i64* %w
7127 %shifted = lshr i64 %val, %numskipbits
7128 %numhighbits = sub i64 64, %numlowbits
7129 %highbitscleared = shl i64 %shifted, %numhighbits
7130 %masked = lshr i64 %highbitscleared, %numhighbits
7134 define i64 @bextr64_d3_load_indexzext(i64* %w, i8 %numskipbits, i8 %numlowbits) nounwind {
7135 ; X86-NOBMI-LABEL: bextr64_d3_load_indexzext:
7136 ; X86-NOBMI: # %bb.0:
7137 ; X86-NOBMI-NEXT: pushl %ebx
7138 ; X86-NOBMI-NEXT: pushl %edi
7139 ; X86-NOBMI-NEXT: pushl %esi
7140 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
7141 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
7142 ; X86-NOBMI-NEXT: movl (%eax), %edi
7143 ; X86-NOBMI-NEXT: movl 4(%eax), %edx
7144 ; X86-NOBMI-NEXT: movl %edx, %eax
7145 ; X86-NOBMI-NEXT: shrl %cl, %eax
7146 ; X86-NOBMI-NEXT: shrdl %cl, %edx, %edi
7147 ; X86-NOBMI-NEXT: xorl %esi, %esi
7148 ; X86-NOBMI-NEXT: testb $32, %cl
7149 ; X86-NOBMI-NEXT: je .LBB56_2
7150 ; X86-NOBMI-NEXT: # %bb.1:
7151 ; X86-NOBMI-NEXT: movl %eax, %edi
7152 ; X86-NOBMI-NEXT: xorl %eax, %eax
7153 ; X86-NOBMI-NEXT: .LBB56_2:
7154 ; X86-NOBMI-NEXT: movb $64, %cl
7155 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
7156 ; X86-NOBMI-NEXT: shldl %cl, %edi, %eax
7157 ; X86-NOBMI-NEXT: shll %cl, %edi
7158 ; X86-NOBMI-NEXT: testb $32, %cl
7159 ; X86-NOBMI-NEXT: movl %edi, %ebx
7160 ; X86-NOBMI-NEXT: jne .LBB56_4
7161 ; X86-NOBMI-NEXT: # %bb.3:
7162 ; X86-NOBMI-NEXT: movl %eax, %ebx
7163 ; X86-NOBMI-NEXT: .LBB56_4:
7164 ; X86-NOBMI-NEXT: movl %ebx, %eax
7165 ; X86-NOBMI-NEXT: shrl %cl, %eax
7166 ; X86-NOBMI-NEXT: testb $32, %cl
7167 ; X86-NOBMI-NEXT: movl $0, %edx
7168 ; X86-NOBMI-NEXT: jne .LBB56_6
7169 ; X86-NOBMI-NEXT: # %bb.5:
7170 ; X86-NOBMI-NEXT: movl %edi, %esi
7171 ; X86-NOBMI-NEXT: movl %eax, %edx
7172 ; X86-NOBMI-NEXT: .LBB56_6:
7173 ; X86-NOBMI-NEXT: shrdl %cl, %ebx, %esi
7174 ; X86-NOBMI-NEXT: testb $32, %cl
7175 ; X86-NOBMI-NEXT: jne .LBB56_8
7176 ; X86-NOBMI-NEXT: # %bb.7:
7177 ; X86-NOBMI-NEXT: movl %esi, %eax
7178 ; X86-NOBMI-NEXT: .LBB56_8:
7179 ; X86-NOBMI-NEXT: popl %esi
7180 ; X86-NOBMI-NEXT: popl %edi
7181 ; X86-NOBMI-NEXT: popl %ebx
7182 ; X86-NOBMI-NEXT: retl
7184 ; X86-BMI1NOTBM-LABEL: bextr64_d3_load_indexzext:
7185 ; X86-BMI1NOTBM: # %bb.0:
7186 ; X86-BMI1NOTBM-NEXT: pushl %ebx
7187 ; X86-BMI1NOTBM-NEXT: pushl %edi
7188 ; X86-BMI1NOTBM-NEXT: pushl %esi
7189 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
7190 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
7191 ; X86-BMI1NOTBM-NEXT: movl (%eax), %edi
7192 ; X86-BMI1NOTBM-NEXT: movl 4(%eax), %edx
7193 ; X86-BMI1NOTBM-NEXT: movl %edx, %eax
7194 ; X86-BMI1NOTBM-NEXT: shrl %cl, %eax
7195 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edx, %edi
7196 ; X86-BMI1NOTBM-NEXT: xorl %esi, %esi
7197 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7198 ; X86-BMI1NOTBM-NEXT: je .LBB56_2
7199 ; X86-BMI1NOTBM-NEXT: # %bb.1:
7200 ; X86-BMI1NOTBM-NEXT: movl %eax, %edi
7201 ; X86-BMI1NOTBM-NEXT: xorl %eax, %eax
7202 ; X86-BMI1NOTBM-NEXT: .LBB56_2:
7203 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
7204 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
7205 ; X86-BMI1NOTBM-NEXT: shldl %cl, %edi, %eax
7206 ; X86-BMI1NOTBM-NEXT: shll %cl, %edi
7207 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7208 ; X86-BMI1NOTBM-NEXT: movl %edi, %ebx
7209 ; X86-BMI1NOTBM-NEXT: jne .LBB56_4
7210 ; X86-BMI1NOTBM-NEXT: # %bb.3:
7211 ; X86-BMI1NOTBM-NEXT: movl %eax, %ebx
7212 ; X86-BMI1NOTBM-NEXT: .LBB56_4:
7213 ; X86-BMI1NOTBM-NEXT: movl %ebx, %eax
7214 ; X86-BMI1NOTBM-NEXT: shrl %cl, %eax
7215 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7216 ; X86-BMI1NOTBM-NEXT: movl $0, %edx
7217 ; X86-BMI1NOTBM-NEXT: jne .LBB56_6
7218 ; X86-BMI1NOTBM-NEXT: # %bb.5:
7219 ; X86-BMI1NOTBM-NEXT: movl %edi, %esi
7220 ; X86-BMI1NOTBM-NEXT: movl %eax, %edx
7221 ; X86-BMI1NOTBM-NEXT: .LBB56_6:
7222 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %ebx, %esi
7223 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7224 ; X86-BMI1NOTBM-NEXT: jne .LBB56_8
7225 ; X86-BMI1NOTBM-NEXT: # %bb.7:
7226 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
7227 ; X86-BMI1NOTBM-NEXT: .LBB56_8:
7228 ; X86-BMI1NOTBM-NEXT: popl %esi
7229 ; X86-BMI1NOTBM-NEXT: popl %edi
7230 ; X86-BMI1NOTBM-NEXT: popl %ebx
7231 ; X86-BMI1NOTBM-NEXT: retl
7233 ; X86-BMI1BMI2-LABEL: bextr64_d3_load_indexzext:
7234 ; X86-BMI1BMI2: # %bb.0:
7235 ; X86-BMI1BMI2-NEXT: pushl %edi
7236 ; X86-BMI1BMI2-NEXT: pushl %esi
7237 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
7238 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
7239 ; X86-BMI1BMI2-NEXT: movl (%edx), %eax
7240 ; X86-BMI1BMI2-NEXT: movl 4(%edx), %edx
7241 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %edx, %esi
7242 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edx, %eax
7243 ; X86-BMI1BMI2-NEXT: xorl %edx, %edx
7244 ; X86-BMI1BMI2-NEXT: testb $32, %cl
7245 ; X86-BMI1BMI2-NEXT: je .LBB56_2
7246 ; X86-BMI1BMI2-NEXT: # %bb.1:
7247 ; X86-BMI1BMI2-NEXT: movl %esi, %eax
7248 ; X86-BMI1BMI2-NEXT: xorl %esi, %esi
7249 ; X86-BMI1BMI2-NEXT: .LBB56_2:
7250 ; X86-BMI1BMI2-NEXT: movb $64, %cl
7251 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
7252 ; X86-BMI1BMI2-NEXT: shldl %cl, %eax, %esi
7253 ; X86-BMI1BMI2-NEXT: shlxl %ecx, %eax, %edi
7254 ; X86-BMI1BMI2-NEXT: testb $32, %cl
7255 ; X86-BMI1BMI2-NEXT: je .LBB56_4
7256 ; X86-BMI1BMI2-NEXT: # %bb.3:
7257 ; X86-BMI1BMI2-NEXT: movl %edi, %esi
7258 ; X86-BMI1BMI2-NEXT: movl $0, %edi
7259 ; X86-BMI1BMI2-NEXT: .LBB56_4:
7260 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %eax
7261 ; X86-BMI1BMI2-NEXT: jne .LBB56_6
7262 ; X86-BMI1BMI2-NEXT: # %bb.5:
7263 ; X86-BMI1BMI2-NEXT: movl %eax, %edx
7264 ; X86-BMI1BMI2-NEXT: .LBB56_6:
7265 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edi
7266 ; X86-BMI1BMI2-NEXT: testb $32, %cl
7267 ; X86-BMI1BMI2-NEXT: jne .LBB56_8
7268 ; X86-BMI1BMI2-NEXT: # %bb.7:
7269 ; X86-BMI1BMI2-NEXT: movl %edi, %eax
7270 ; X86-BMI1BMI2-NEXT: .LBB56_8:
7271 ; X86-BMI1BMI2-NEXT: popl %esi
7272 ; X86-BMI1BMI2-NEXT: popl %edi
7273 ; X86-BMI1BMI2-NEXT: retl
7275 ; X64-NOBMI-LABEL: bextr64_d3_load_indexzext:
7276 ; X64-NOBMI: # %bb.0:
7277 ; X64-NOBMI-NEXT: movl %esi, %ecx
7278 ; X64-NOBMI-NEXT: movq (%rdi), %rax
7279 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
7280 ; X64-NOBMI-NEXT: shrq %cl, %rax
7281 ; X64-NOBMI-NEXT: negb %dl
7282 ; X64-NOBMI-NEXT: movl %edx, %ecx
7283 ; X64-NOBMI-NEXT: shlq %cl, %rax
7284 ; X64-NOBMI-NEXT: shrq %cl, %rax
7285 ; X64-NOBMI-NEXT: retq
7287 ; X64-BMI1NOTBM-LABEL: bextr64_d3_load_indexzext:
7288 ; X64-BMI1NOTBM: # %bb.0:
7289 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
7290 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
7291 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
7292 ; X64-BMI1NOTBM-NEXT: bextrq %rax, (%rdi), %rax
7293 ; X64-BMI1NOTBM-NEXT: retq
7295 ; X64-BMI1BMI2-LABEL: bextr64_d3_load_indexzext:
7296 ; X64-BMI1BMI2: # %bb.0:
7297 ; X64-BMI1BMI2-NEXT: # kill: def $edx killed $edx def $rdx
7298 ; X64-BMI1BMI2-NEXT: # kill: def $esi killed $esi def $rsi
7299 ; X64-BMI1BMI2-NEXT: shrxq %rsi, (%rdi), %rax
7300 ; X64-BMI1BMI2-NEXT: bzhiq %rdx, %rax, %rax
7301 ; X64-BMI1BMI2-NEXT: retq
7302 %val = load i64, i64* %w
7303 %skip = zext i8 %numskipbits to i64
7304 %shifted = lshr i64 %val, %skip
7305 %numhighbits = sub i8 64, %numlowbits
7306 %sh_prom = zext i8 %numhighbits to i64
7307 %highbitscleared = shl i64 %shifted, %sh_prom
7308 %masked = lshr i64 %highbitscleared, %sh_prom
7312 define i64 @bextr64_d5_skipextrauses(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
7313 ; X86-NOBMI-LABEL: bextr64_d5_skipextrauses:
7314 ; X86-NOBMI: # %bb.0:
7315 ; X86-NOBMI-NEXT: pushl %ebp
7316 ; X86-NOBMI-NEXT: pushl %ebx
7317 ; X86-NOBMI-NEXT: pushl %edi
7318 ; X86-NOBMI-NEXT: pushl %esi
7319 ; X86-NOBMI-NEXT: subl $12, %esp
7320 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ebx
7321 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edx
7322 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
7323 ; X86-NOBMI-NEXT: movl %edx, %esi
7324 ; X86-NOBMI-NEXT: movl %eax, %ecx
7325 ; X86-NOBMI-NEXT: shrl %cl, %esi
7326 ; X86-NOBMI-NEXT: shrdl %cl, %edx, %ebx
7327 ; X86-NOBMI-NEXT: xorl %edx, %edx
7328 ; X86-NOBMI-NEXT: testb $32, %al
7329 ; X86-NOBMI-NEXT: je .LBB57_2
7330 ; X86-NOBMI-NEXT: # %bb.1:
7331 ; X86-NOBMI-NEXT: movl %esi, %ebx
7332 ; X86-NOBMI-NEXT: xorl %esi, %esi
7333 ; X86-NOBMI-NEXT: .LBB57_2:
7334 ; X86-NOBMI-NEXT: movb $64, %cl
7335 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
7336 ; X86-NOBMI-NEXT: shldl %cl, %ebx, %esi
7337 ; X86-NOBMI-NEXT: shll %cl, %ebx
7338 ; X86-NOBMI-NEXT: testb $32, %cl
7339 ; X86-NOBMI-NEXT: movl %ebx, %ebp
7340 ; X86-NOBMI-NEXT: jne .LBB57_4
7341 ; X86-NOBMI-NEXT: # %bb.3:
7342 ; X86-NOBMI-NEXT: movl %esi, %ebp
7343 ; X86-NOBMI-NEXT: .LBB57_4:
7344 ; X86-NOBMI-NEXT: movl %ebp, %esi
7345 ; X86-NOBMI-NEXT: shrl %cl, %esi
7346 ; X86-NOBMI-NEXT: testb $32, %cl
7347 ; X86-NOBMI-NEXT: movl $0, %edi
7348 ; X86-NOBMI-NEXT: jne .LBB57_6
7349 ; X86-NOBMI-NEXT: # %bb.5:
7350 ; X86-NOBMI-NEXT: movl %ebx, %edx
7351 ; X86-NOBMI-NEXT: movl %esi, %edi
7352 ; X86-NOBMI-NEXT: .LBB57_6:
7353 ; X86-NOBMI-NEXT: shrdl %cl, %ebp, %edx
7354 ; X86-NOBMI-NEXT: testb $32, %cl
7355 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
7356 ; X86-NOBMI-NEXT: jne .LBB57_8
7357 ; X86-NOBMI-NEXT: # %bb.7:
7358 ; X86-NOBMI-NEXT: movl %edx, %esi
7359 ; X86-NOBMI-NEXT: .LBB57_8:
7360 ; X86-NOBMI-NEXT: subl $8, %esp
7361 ; X86-NOBMI-NEXT: pushl %ecx
7362 ; X86-NOBMI-NEXT: pushl %eax
7363 ; X86-NOBMI-NEXT: calll use64
7364 ; X86-NOBMI-NEXT: addl $16, %esp
7365 ; X86-NOBMI-NEXT: movl %esi, %eax
7366 ; X86-NOBMI-NEXT: movl %edi, %edx
7367 ; X86-NOBMI-NEXT: addl $12, %esp
7368 ; X86-NOBMI-NEXT: popl %esi
7369 ; X86-NOBMI-NEXT: popl %edi
7370 ; X86-NOBMI-NEXT: popl %ebx
7371 ; X86-NOBMI-NEXT: popl %ebp
7372 ; X86-NOBMI-NEXT: retl
7374 ; X86-BMI1NOTBM-LABEL: bextr64_d5_skipextrauses:
7375 ; X86-BMI1NOTBM: # %bb.0:
7376 ; X86-BMI1NOTBM-NEXT: pushl %ebp
7377 ; X86-BMI1NOTBM-NEXT: pushl %ebx
7378 ; X86-BMI1NOTBM-NEXT: pushl %edi
7379 ; X86-BMI1NOTBM-NEXT: pushl %esi
7380 ; X86-BMI1NOTBM-NEXT: subl $12, %esp
7381 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %ebx
7382 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx
7383 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
7384 ; X86-BMI1NOTBM-NEXT: movl %edx, %esi
7385 ; X86-BMI1NOTBM-NEXT: movl %eax, %ecx
7386 ; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
7387 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edx, %ebx
7388 ; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
7389 ; X86-BMI1NOTBM-NEXT: testb $32, %al
7390 ; X86-BMI1NOTBM-NEXT: je .LBB57_2
7391 ; X86-BMI1NOTBM-NEXT: # %bb.1:
7392 ; X86-BMI1NOTBM-NEXT: movl %esi, %ebx
7393 ; X86-BMI1NOTBM-NEXT: xorl %esi, %esi
7394 ; X86-BMI1NOTBM-NEXT: .LBB57_2:
7395 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
7396 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
7397 ; X86-BMI1NOTBM-NEXT: shldl %cl, %ebx, %esi
7398 ; X86-BMI1NOTBM-NEXT: shll %cl, %ebx
7399 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7400 ; X86-BMI1NOTBM-NEXT: movl %ebx, %ebp
7401 ; X86-BMI1NOTBM-NEXT: jne .LBB57_4
7402 ; X86-BMI1NOTBM-NEXT: # %bb.3:
7403 ; X86-BMI1NOTBM-NEXT: movl %esi, %ebp
7404 ; X86-BMI1NOTBM-NEXT: .LBB57_4:
7405 ; X86-BMI1NOTBM-NEXT: movl %ebp, %esi
7406 ; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
7407 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7408 ; X86-BMI1NOTBM-NEXT: movl $0, %edi
7409 ; X86-BMI1NOTBM-NEXT: jne .LBB57_6
7410 ; X86-BMI1NOTBM-NEXT: # %bb.5:
7411 ; X86-BMI1NOTBM-NEXT: movl %ebx, %edx
7412 ; X86-BMI1NOTBM-NEXT: movl %esi, %edi
7413 ; X86-BMI1NOTBM-NEXT: .LBB57_6:
7414 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %ebp, %edx
7415 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7416 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %ecx
7417 ; X86-BMI1NOTBM-NEXT: jne .LBB57_8
7418 ; X86-BMI1NOTBM-NEXT: # %bb.7:
7419 ; X86-BMI1NOTBM-NEXT: movl %edx, %esi
7420 ; X86-BMI1NOTBM-NEXT: .LBB57_8:
7421 ; X86-BMI1NOTBM-NEXT: subl $8, %esp
7422 ; X86-BMI1NOTBM-NEXT: pushl %ecx
7423 ; X86-BMI1NOTBM-NEXT: pushl %eax
7424 ; X86-BMI1NOTBM-NEXT: calll use64
7425 ; X86-BMI1NOTBM-NEXT: addl $16, %esp
7426 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
7427 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
7428 ; X86-BMI1NOTBM-NEXT: addl $12, %esp
7429 ; X86-BMI1NOTBM-NEXT: popl %esi
7430 ; X86-BMI1NOTBM-NEXT: popl %edi
7431 ; X86-BMI1NOTBM-NEXT: popl %ebx
7432 ; X86-BMI1NOTBM-NEXT: popl %ebp
7433 ; X86-BMI1NOTBM-NEXT: retl
7435 ; X86-BMI1BMI2-LABEL: bextr64_d5_skipextrauses:
7436 ; X86-BMI1BMI2: # %bb.0:
7437 ; X86-BMI1BMI2-NEXT: pushl %ebx
7438 ; X86-BMI1BMI2-NEXT: pushl %edi
7439 ; X86-BMI1BMI2-NEXT: pushl %esi
7440 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edi
7441 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
7442 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
7443 ; X86-BMI1BMI2-NEXT: movl %eax, %ecx
7444 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edx, %edi
7445 ; X86-BMI1BMI2-NEXT: shrxl %eax, %edx, %edx
7446 ; X86-BMI1BMI2-NEXT: xorl %esi, %esi
7447 ; X86-BMI1BMI2-NEXT: testb $32, %al
7448 ; X86-BMI1BMI2-NEXT: je .LBB57_2
7449 ; X86-BMI1BMI2-NEXT: # %bb.1:
7450 ; X86-BMI1BMI2-NEXT: movl %edx, %edi
7451 ; X86-BMI1BMI2-NEXT: xorl %edx, %edx
7452 ; X86-BMI1BMI2-NEXT: .LBB57_2:
7453 ; X86-BMI1BMI2-NEXT: movb $64, %cl
7454 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
7455 ; X86-BMI1BMI2-NEXT: shldl %cl, %edi, %edx
7456 ; X86-BMI1BMI2-NEXT: shlxl %ecx, %edi, %ebx
7457 ; X86-BMI1BMI2-NEXT: testb $32, %cl
7458 ; X86-BMI1BMI2-NEXT: je .LBB57_4
7459 ; X86-BMI1BMI2-NEXT: # %bb.3:
7460 ; X86-BMI1BMI2-NEXT: movl %ebx, %edx
7461 ; X86-BMI1BMI2-NEXT: movl $0, %ebx
7462 ; X86-BMI1BMI2-NEXT: .LBB57_4:
7463 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %edx, %edi
7464 ; X86-BMI1BMI2-NEXT: jne .LBB57_6
7465 ; X86-BMI1BMI2-NEXT: # %bb.5:
7466 ; X86-BMI1BMI2-NEXT: movl %edi, %esi
7467 ; X86-BMI1BMI2-NEXT: .LBB57_6:
7468 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edx, %ebx
7469 ; X86-BMI1BMI2-NEXT: testb $32, %cl
7470 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %ecx
7471 ; X86-BMI1BMI2-NEXT: jne .LBB57_8
7472 ; X86-BMI1BMI2-NEXT: # %bb.7:
7473 ; X86-BMI1BMI2-NEXT: movl %ebx, %edi
7474 ; X86-BMI1BMI2-NEXT: .LBB57_8:
7475 ; X86-BMI1BMI2-NEXT: subl $8, %esp
7476 ; X86-BMI1BMI2-NEXT: pushl %ecx
7477 ; X86-BMI1BMI2-NEXT: pushl %eax
7478 ; X86-BMI1BMI2-NEXT: calll use64
7479 ; X86-BMI1BMI2-NEXT: addl $16, %esp
7480 ; X86-BMI1BMI2-NEXT: movl %edi, %eax
7481 ; X86-BMI1BMI2-NEXT: movl %esi, %edx
7482 ; X86-BMI1BMI2-NEXT: popl %esi
7483 ; X86-BMI1BMI2-NEXT: popl %edi
7484 ; X86-BMI1BMI2-NEXT: popl %ebx
7485 ; X86-BMI1BMI2-NEXT: retl
7487 ; X64-NOBMI-LABEL: bextr64_d5_skipextrauses:
7488 ; X64-NOBMI: # %bb.0:
7489 ; X64-NOBMI-NEXT: pushq %rbx
7490 ; X64-NOBMI-NEXT: movq %rdi, %rbx
7491 ; X64-NOBMI-NEXT: movl %esi, %ecx
7492 ; X64-NOBMI-NEXT: shrq %cl, %rbx
7493 ; X64-NOBMI-NEXT: negb %dl
7494 ; X64-NOBMI-NEXT: movl %edx, %ecx
7495 ; X64-NOBMI-NEXT: shlq %cl, %rbx
7496 ; X64-NOBMI-NEXT: shrq %cl, %rbx
7497 ; X64-NOBMI-NEXT: movq %rsi, %rdi
7498 ; X64-NOBMI-NEXT: callq use64
7499 ; X64-NOBMI-NEXT: movq %rbx, %rax
7500 ; X64-NOBMI-NEXT: popq %rbx
7501 ; X64-NOBMI-NEXT: retq
7503 ; X64-BMI1NOTBM-LABEL: bextr64_d5_skipextrauses:
7504 ; X64-BMI1NOTBM: # %bb.0:
7505 ; X64-BMI1NOTBM-NEXT: pushq %rbx
7506 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
7507 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
7508 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
7509 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rbx
7510 ; X64-BMI1NOTBM-NEXT: movq %rsi, %rdi
7511 ; X64-BMI1NOTBM-NEXT: callq use64
7512 ; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
7513 ; X64-BMI1NOTBM-NEXT: popq %rbx
7514 ; X64-BMI1NOTBM-NEXT: retq
7516 ; X64-BMI1BMI2-LABEL: bextr64_d5_skipextrauses:
7517 ; X64-BMI1BMI2: # %bb.0:
7518 ; X64-BMI1BMI2-NEXT: pushq %rbx
7519 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
7520 ; X64-BMI1BMI2-NEXT: bzhiq %rdx, %rax, %rbx
7521 ; X64-BMI1BMI2-NEXT: movq %rsi, %rdi
7522 ; X64-BMI1BMI2-NEXT: callq use64
7523 ; X64-BMI1BMI2-NEXT: movq %rbx, %rax
7524 ; X64-BMI1BMI2-NEXT: popq %rbx
7525 ; X64-BMI1BMI2-NEXT: retq
7526 %shifted = lshr i64 %val, %numskipbits
7527 %numhighbits = sub i64 64, %numlowbits
7528 %highbitscleared = shl i64 %shifted, %numhighbits
7529 %masked = lshr i64 %highbitscleared, %numhighbits
7530 call void @use64(i64 %numskipbits)
7534 ; 64-bit, but with 32-bit output
7536 ; Everything done in 64-bit, truncation happens last.
7537 define i32 @bextr64_32_d0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
7538 ; X86-NOBMI-LABEL: bextr64_32_d0:
7539 ; X86-NOBMI: # %bb.0:
7540 ; X86-NOBMI-NEXT: pushl %esi
7541 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
7542 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edx
7543 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
7544 ; X86-NOBMI-NEXT: movl %esi, %eax
7545 ; X86-NOBMI-NEXT: shrl %cl, %eax
7546 ; X86-NOBMI-NEXT: shrdl %cl, %esi, %edx
7547 ; X86-NOBMI-NEXT: testb $32, %cl
7548 ; X86-NOBMI-NEXT: je .LBB58_2
7549 ; X86-NOBMI-NEXT: # %bb.1:
7550 ; X86-NOBMI-NEXT: movl %eax, %edx
7551 ; X86-NOBMI-NEXT: xorl %eax, %eax
7552 ; X86-NOBMI-NEXT: .LBB58_2:
7553 ; X86-NOBMI-NEXT: movb $64, %cl
7554 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
7555 ; X86-NOBMI-NEXT: shldl %cl, %edx, %eax
7556 ; X86-NOBMI-NEXT: shll %cl, %edx
7557 ; X86-NOBMI-NEXT: testb $32, %cl
7558 ; X86-NOBMI-NEXT: je .LBB58_4
7559 ; X86-NOBMI-NEXT: # %bb.3:
7560 ; X86-NOBMI-NEXT: movl %edx, %eax
7561 ; X86-NOBMI-NEXT: xorl %edx, %edx
7562 ; X86-NOBMI-NEXT: .LBB58_4:
7563 ; X86-NOBMI-NEXT: shrdl %cl, %eax, %edx
7564 ; X86-NOBMI-NEXT: shrl %cl, %eax
7565 ; X86-NOBMI-NEXT: testb $32, %cl
7566 ; X86-NOBMI-NEXT: jne .LBB58_6
7567 ; X86-NOBMI-NEXT: # %bb.5:
7568 ; X86-NOBMI-NEXT: movl %edx, %eax
7569 ; X86-NOBMI-NEXT: .LBB58_6:
7570 ; X86-NOBMI-NEXT: popl %esi
7571 ; X86-NOBMI-NEXT: retl
7573 ; X86-BMI1NOTBM-LABEL: bextr64_32_d0:
7574 ; X86-BMI1NOTBM: # %bb.0:
7575 ; X86-BMI1NOTBM-NEXT: pushl %esi
7576 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
7577 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx
7578 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
7579 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax
7580 ; X86-BMI1NOTBM-NEXT: shrl %cl, %eax
7581 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %esi, %edx
7582 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7583 ; X86-BMI1NOTBM-NEXT: je .LBB58_2
7584 ; X86-BMI1NOTBM-NEXT: # %bb.1:
7585 ; X86-BMI1NOTBM-NEXT: movl %eax, %edx
7586 ; X86-BMI1NOTBM-NEXT: xorl %eax, %eax
7587 ; X86-BMI1NOTBM-NEXT: .LBB58_2:
7588 ; X86-BMI1NOTBM-NEXT: movb $64, %cl
7589 ; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
7590 ; X86-BMI1NOTBM-NEXT: shldl %cl, %edx, %eax
7591 ; X86-BMI1NOTBM-NEXT: shll %cl, %edx
7592 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7593 ; X86-BMI1NOTBM-NEXT: je .LBB58_4
7594 ; X86-BMI1NOTBM-NEXT: # %bb.3:
7595 ; X86-BMI1NOTBM-NEXT: movl %edx, %eax
7596 ; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
7597 ; X86-BMI1NOTBM-NEXT: .LBB58_4:
7598 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %eax, %edx
7599 ; X86-BMI1NOTBM-NEXT: shrl %cl, %eax
7600 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7601 ; X86-BMI1NOTBM-NEXT: jne .LBB58_6
7602 ; X86-BMI1NOTBM-NEXT: # %bb.5:
7603 ; X86-BMI1NOTBM-NEXT: movl %edx, %eax
7604 ; X86-BMI1NOTBM-NEXT: .LBB58_6:
7605 ; X86-BMI1NOTBM-NEXT: popl %esi
7606 ; X86-BMI1NOTBM-NEXT: retl
7608 ; X86-BMI1BMI2-LABEL: bextr64_32_d0:
7609 ; X86-BMI1BMI2: # %bb.0:
7610 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
7611 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
7612 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
7613 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edx, %eax
7614 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %edx, %edx
7615 ; X86-BMI1BMI2-NEXT: testb $32, %cl
7616 ; X86-BMI1BMI2-NEXT: je .LBB58_2
7617 ; X86-BMI1BMI2-NEXT: # %bb.1:
7618 ; X86-BMI1BMI2-NEXT: movl %edx, %eax
7619 ; X86-BMI1BMI2-NEXT: xorl %edx, %edx
7620 ; X86-BMI1BMI2-NEXT: .LBB58_2:
7621 ; X86-BMI1BMI2-NEXT: movb $64, %cl
7622 ; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
7623 ; X86-BMI1BMI2-NEXT: shldl %cl, %eax, %edx
7624 ; X86-BMI1BMI2-NEXT: shlxl %ecx, %eax, %eax
7625 ; X86-BMI1BMI2-NEXT: testb $32, %cl
7626 ; X86-BMI1BMI2-NEXT: je .LBB58_4
7627 ; X86-BMI1BMI2-NEXT: # %bb.3:
7628 ; X86-BMI1BMI2-NEXT: movl %eax, %edx
7629 ; X86-BMI1BMI2-NEXT: xorl %eax, %eax
7630 ; X86-BMI1BMI2-NEXT: .LBB58_4:
7631 ; X86-BMI1BMI2-NEXT: shrdl %cl, %edx, %eax
7632 ; X86-BMI1BMI2-NEXT: testb $32, %cl
7633 ; X86-BMI1BMI2-NEXT: je .LBB58_6
7634 ; X86-BMI1BMI2-NEXT: # %bb.5:
7635 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %edx, %eax
7636 ; X86-BMI1BMI2-NEXT: .LBB58_6:
7637 ; X86-BMI1BMI2-NEXT: retl
7639 ; X64-NOBMI-LABEL: bextr64_32_d0:
7640 ; X64-NOBMI: # %bb.0:
7641 ; X64-NOBMI-NEXT: movq %rsi, %rcx
7642 ; X64-NOBMI-NEXT: movq %rdi, %rax
7643 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
7644 ; X64-NOBMI-NEXT: shrq %cl, %rax
7645 ; X64-NOBMI-NEXT: negb %dl
7646 ; X64-NOBMI-NEXT: movl %edx, %ecx
7647 ; X64-NOBMI-NEXT: shlq %cl, %rax
7648 ; X64-NOBMI-NEXT: shrq %cl, %rax
7649 ; X64-NOBMI-NEXT: # kill: def $eax killed $eax killed $rax
7650 ; X64-NOBMI-NEXT: retq
7652 ; X64-BMI1NOTBM-LABEL: bextr64_32_d0:
7653 ; X64-BMI1NOTBM: # %bb.0:
7654 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
7655 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
7656 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
7657 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
7658 ; X64-BMI1NOTBM-NEXT: # kill: def $eax killed $eax killed $rax
7659 ; X64-BMI1NOTBM-NEXT: retq
7661 ; X64-BMI1BMI2-LABEL: bextr64_32_d0:
7662 ; X64-BMI1BMI2: # %bb.0:
7663 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
7664 ; X64-BMI1BMI2-NEXT: bzhiq %rdx, %rax, %rax
7665 ; X64-BMI1BMI2-NEXT: # kill: def $eax killed $eax killed $rax
7666 ; X64-BMI1BMI2-NEXT: retq
7667 %shifted = lshr i64 %val, %numskipbits
7668 %numhighbits = sub i64 64, %numlowbits
7669 %highbitscleared = shl i64 %shifted, %numhighbits
7670 %masked = lshr i64 %highbitscleared, %numhighbits
7671 %res = trunc i64 %masked to i32
7675 ; Shifting happens in 64-bit, then truncation. Masking is 32-bit.
7676 define i32 @bextr64_32_d1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind {
7677 ; X86-NOBMI-LABEL: bextr64_32_d1:
7678 ; X86-NOBMI: # %bb.0:
7679 ; X86-NOBMI-NEXT: pushl %esi
7680 ; X86-NOBMI-NEXT: movb {{[0-9]+}}(%esp), %cl
7681 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edx
7682 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
7683 ; X86-NOBMI-NEXT: movl %esi, %eax
7684 ; X86-NOBMI-NEXT: shrl %cl, %eax
7685 ; X86-NOBMI-NEXT: shrdl %cl, %esi, %edx
7686 ; X86-NOBMI-NEXT: testb $32, %cl
7687 ; X86-NOBMI-NEXT: jne .LBB59_2
7688 ; X86-NOBMI-NEXT: # %bb.1:
7689 ; X86-NOBMI-NEXT: movl %edx, %eax
7690 ; X86-NOBMI-NEXT: .LBB59_2:
7691 ; X86-NOBMI-NEXT: xorl %ecx, %ecx
7692 ; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
7693 ; X86-NOBMI-NEXT: shll %cl, %eax
7694 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
7695 ; X86-NOBMI-NEXT: shrl %cl, %eax
7696 ; X86-NOBMI-NEXT: popl %esi
7697 ; X86-NOBMI-NEXT: retl
7699 ; X86-BMI1NOTBM-LABEL: bextr64_32_d1:
7700 ; X86-BMI1NOTBM: # %bb.0:
7701 ; X86-BMI1NOTBM-NEXT: pushl %edi
7702 ; X86-BMI1NOTBM-NEXT: pushl %esi
7703 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
7704 ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
7705 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
7706 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edi
7707 ; X86-BMI1NOTBM-NEXT: movl %edi, %edx
7708 ; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
7709 ; X86-BMI1NOTBM-NEXT: shrdl %cl, %edi, %esi
7710 ; X86-BMI1NOTBM-NEXT: testb $32, %cl
7711 ; X86-BMI1NOTBM-NEXT: jne .LBB59_2
7712 ; X86-BMI1NOTBM-NEXT: # %bb.1:
7713 ; X86-BMI1NOTBM-NEXT: movl %esi, %edx
7714 ; X86-BMI1NOTBM-NEXT: .LBB59_2:
7715 ; X86-BMI1NOTBM-NEXT: shll $8, %eax
7716 ; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax
7717 ; X86-BMI1NOTBM-NEXT: popl %esi
7718 ; X86-BMI1NOTBM-NEXT: popl %edi
7719 ; X86-BMI1NOTBM-NEXT: retl
7721 ; X86-BMI1BMI2-LABEL: bextr64_32_d1:
7722 ; X86-BMI1BMI2: # %bb.0:
7723 ; X86-BMI1BMI2-NEXT: pushl %esi
7724 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
7725 ; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
7726 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
7727 ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
7728 ; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %edx
7729 ; X86-BMI1BMI2-NEXT: testb $32, %cl
7730 ; X86-BMI1BMI2-NEXT: je .LBB59_2
7731 ; X86-BMI1BMI2-NEXT: # %bb.1:
7732 ; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %edx
7733 ; X86-BMI1BMI2-NEXT: .LBB59_2:
7734 ; X86-BMI1BMI2-NEXT: bzhil %eax, %edx, %eax
7735 ; X86-BMI1BMI2-NEXT: popl %esi
7736 ; X86-BMI1BMI2-NEXT: retl
7738 ; X64-NOBMI-LABEL: bextr64_32_d1:
7739 ; X64-NOBMI: # %bb.0:
7740 ; X64-NOBMI-NEXT: movq %rsi, %rcx
7741 ; X64-NOBMI-NEXT: movq %rdi, %rax
7742 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
7743 ; X64-NOBMI-NEXT: shrq %cl, %rax
7744 ; X64-NOBMI-NEXT: negb %dl
7745 ; X64-NOBMI-NEXT: movl %edx, %ecx
7746 ; X64-NOBMI-NEXT: shll %cl, %eax
7747 ; X64-NOBMI-NEXT: shrl %cl, %eax
7748 ; X64-NOBMI-NEXT: # kill: def $eax killed $eax killed $rax
7749 ; X64-NOBMI-NEXT: retq
7751 ; X64-BMI1NOTBM-LABEL: bextr64_32_d1:
7752 ; X64-BMI1NOTBM: # %bb.0:
7753 ; X64-BMI1NOTBM-NEXT: shll $8, %edx
7754 ; X64-BMI1NOTBM-NEXT: movzbl %sil, %eax
7755 ; X64-BMI1NOTBM-NEXT: orl %edx, %eax
7756 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
7757 ; X64-BMI1NOTBM-NEXT: # kill: def $eax killed $eax killed $rax
7758 ; X64-BMI1NOTBM-NEXT: retq
7760 ; X64-BMI1BMI2-LABEL: bextr64_32_d1:
7761 ; X64-BMI1BMI2: # %bb.0:
7762 ; X64-BMI1BMI2-NEXT: shrxq %rsi, %rdi, %rax
7763 ; X64-BMI1BMI2-NEXT: bzhil %edx, %eax, %eax
7764 ; X64-BMI1BMI2-NEXT: retq
7765 %shifted = lshr i64 %val, %numskipbits
7766 %truncshifted = trunc i64 %shifted to i32
7767 %numhighbits = sub i32 32, %numlowbits
7768 %highbitscleared = shl i32 %truncshifted, %numhighbits
7769 %masked = lshr i32 %highbitscleared, %numhighbits
7773 ; ---------------------------------------------------------------------------- ;
7775 ; ---------------------------------------------------------------------------- ;
7777 ; https://bugs.llvm.org/show_bug.cgi?id=38938
7778 define void @pr38938(i32* %a0, i64* %a1) nounwind {
7779 ; X86-NOBMI-LABEL: pr38938:
7780 ; X86-NOBMI: # %bb.0:
7781 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
7782 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
7783 ; X86-NOBMI-NEXT: movl (%ecx), %ecx
7784 ; X86-NOBMI-NEXT: shrl $19, %ecx
7785 ; X86-NOBMI-NEXT: andl $4092, %ecx # imm = 0xFFC
7786 ; X86-NOBMI-NEXT: incl (%eax,%ecx)
7787 ; X86-NOBMI-NEXT: retl
7789 ; X86-BMI1NOTBM-LABEL: pr38938:
7790 ; X86-BMI1NOTBM: # %bb.0:
7791 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
7792 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %ecx
7793 ; X86-BMI1NOTBM-NEXT: movl $2581, %edx # imm = 0xA15
7794 ; X86-BMI1NOTBM-NEXT: bextrl %edx, (%ecx), %ecx
7795 ; X86-BMI1NOTBM-NEXT: incl (%eax,%ecx,4)
7796 ; X86-BMI1NOTBM-NEXT: retl
7798 ; X86-BMI1TBM-LABEL: pr38938:
7799 ; X86-BMI1TBM: # %bb.0:
7800 ; X86-BMI1TBM-NEXT: movl {{[0-9]+}}(%esp), %eax
7801 ; X86-BMI1TBM-NEXT: movl {{[0-9]+}}(%esp), %ecx
7802 ; X86-BMI1TBM-NEXT: bextrl $2581, (%ecx), %ecx # imm = 0xA15
7803 ; X86-BMI1TBM-NEXT: incl (%eax,%ecx,4)
7804 ; X86-BMI1TBM-NEXT: retl
7806 ; X86-BMI1NOTBMBMI2-LABEL: pr38938:
7807 ; X86-BMI1NOTBMBMI2: # %bb.0:
7808 ; X86-BMI1NOTBMBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
7809 ; X86-BMI1NOTBMBMI2-NEXT: movl {{[0-9]+}}(%esp), %ecx
7810 ; X86-BMI1NOTBMBMI2-NEXT: movl $2581, %edx # imm = 0xA15
7811 ; X86-BMI1NOTBMBMI2-NEXT: bextrl %edx, (%ecx), %ecx
7812 ; X86-BMI1NOTBMBMI2-NEXT: incl (%eax,%ecx,4)
7813 ; X86-BMI1NOTBMBMI2-NEXT: retl
7815 ; X64-NOBMI-LABEL: pr38938:
7816 ; X64-NOBMI: # %bb.0:
7817 ; X64-NOBMI-NEXT: movq (%rsi), %rax
7818 ; X64-NOBMI-NEXT: shrq $19, %rax
7819 ; X64-NOBMI-NEXT: andl $4092, %eax # imm = 0xFFC
7820 ; X64-NOBMI-NEXT: incl (%rdi,%rax)
7821 ; X64-NOBMI-NEXT: retq
7823 ; X64-BMI1NOTBM-LABEL: pr38938:
7824 ; X64-BMI1NOTBM: # %bb.0:
7825 ; X64-BMI1NOTBM-NEXT: movl $2581, %eax # imm = 0xA15
7826 ; X64-BMI1NOTBM-NEXT: bextrq %rax, (%rsi), %rax
7827 ; X64-BMI1NOTBM-NEXT: incl (%rdi,%rax,4)
7828 ; X64-BMI1NOTBM-NEXT: retq
7830 ; X64-BMI1TBM-LABEL: pr38938:
7831 ; X64-BMI1TBM: # %bb.0:
7832 ; X64-BMI1TBM-NEXT: bextrq $2581, (%rsi), %rax # imm = 0xA15
7833 ; X64-BMI1TBM-NEXT: incl (%rdi,%rax,4)
7834 ; X64-BMI1TBM-NEXT: retq
7836 ; X64-BMI1NOTBMBMI2-LABEL: pr38938:
7837 ; X64-BMI1NOTBMBMI2: # %bb.0:
7838 ; X64-BMI1NOTBMBMI2-NEXT: movl $2581, %eax # imm = 0xA15
7839 ; X64-BMI1NOTBMBMI2-NEXT: bextrq %rax, (%rsi), %rax
7840 ; X64-BMI1NOTBMBMI2-NEXT: incl (%rdi,%rax,4)
7841 ; X64-BMI1NOTBMBMI2-NEXT: retq
7842 %tmp = load i64, i64* %a1, align 8
7843 %tmp1 = lshr i64 %tmp, 21
7844 %tmp2 = and i64 %tmp1, 1023
7845 %tmp3 = getelementptr inbounds i32, i32* %a0, i64 %tmp2
7846 %tmp4 = load i32, i32* %tmp3, align 4
7847 %tmp5 = add nsw i32 %tmp4, 1
7848 store i32 %tmp5, i32* %tmp3, align 4
7852 ; The most canonical variant
7853 define i32 @c0_i32(i32 %arg) nounwind {
7854 ; X86-NOBMI-LABEL: c0_i32:
7855 ; X86-NOBMI: # %bb.0:
7856 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
7857 ; X86-NOBMI-NEXT: shrl $19, %eax
7858 ; X86-NOBMI-NEXT: andl $1023, %eax # imm = 0x3FF
7859 ; X86-NOBMI-NEXT: retl
7861 ; X86-BMI1NOTBM-LABEL: c0_i32:
7862 ; X86-BMI1NOTBM: # %bb.0:
7863 ; X86-BMI1NOTBM-NEXT: movl $2579, %eax # imm = 0xA13
7864 ; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax
7865 ; X86-BMI1NOTBM-NEXT: retl
7867 ; X86-BMI1TBM-LABEL: c0_i32:
7868 ; X86-BMI1TBM: # %bb.0:
7869 ; X86-BMI1TBM-NEXT: bextrl $2579, {{[0-9]+}}(%esp), %eax # imm = 0xA13
7870 ; X86-BMI1TBM-NEXT: retl
7872 ; X86-BMI1NOTBMBMI2-LABEL: c0_i32:
7873 ; X86-BMI1NOTBMBMI2: # %bb.0:
7874 ; X86-BMI1NOTBMBMI2-NEXT: movl $2579, %eax # imm = 0xA13
7875 ; X86-BMI1NOTBMBMI2-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax
7876 ; X86-BMI1NOTBMBMI2-NEXT: retl
7878 ; X64-NOBMI-LABEL: c0_i32:
7879 ; X64-NOBMI: # %bb.0:
7880 ; X64-NOBMI-NEXT: movl %edi, %eax
7881 ; X64-NOBMI-NEXT: shrl $19, %eax
7882 ; X64-NOBMI-NEXT: andl $1023, %eax # imm = 0x3FF
7883 ; X64-NOBMI-NEXT: retq
7885 ; X64-BMI1NOTBM-LABEL: c0_i32:
7886 ; X64-BMI1NOTBM: # %bb.0:
7887 ; X64-BMI1NOTBM-NEXT: movl $2579, %eax # imm = 0xA13
7888 ; X64-BMI1NOTBM-NEXT: bextrl %eax, %edi, %eax
7889 ; X64-BMI1NOTBM-NEXT: retq
7891 ; X64-BMI1TBM-LABEL: c0_i32:
7892 ; X64-BMI1TBM: # %bb.0:
7893 ; X64-BMI1TBM-NEXT: bextrl $2579, %edi, %eax # imm = 0xA13
7894 ; X64-BMI1TBM-NEXT: retq
7896 ; X64-BMI1NOTBMBMI2-LABEL: c0_i32:
7897 ; X64-BMI1NOTBMBMI2: # %bb.0:
7898 ; X64-BMI1NOTBMBMI2-NEXT: movl $2579, %eax # imm = 0xA13
7899 ; X64-BMI1NOTBMBMI2-NEXT: bextrl %eax, %edi, %eax
7900 ; X64-BMI1NOTBMBMI2-NEXT: retq
7901 %tmp0 = lshr i32 %arg, 19
7902 %tmp1 = and i32 %tmp0, 1023
7906 ; Should be still fine, but the mask is shifted
7907 define i32 @c1_i32(i32 %arg) nounwind {
7908 ; X86-LABEL: c1_i32:
7910 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
7911 ; X86-NEXT: shrl $19, %eax
7912 ; X86-NEXT: andl $4092, %eax # imm = 0xFFC
7915 ; X64-LABEL: c1_i32:
7917 ; X64-NEXT: movl %edi, %eax
7918 ; X64-NEXT: shrl $19, %eax
7919 ; X64-NEXT: andl $4092, %eax # imm = 0xFFC
7921 %tmp0 = lshr i32 %arg, 19
7922 %tmp1 = and i32 %tmp0, 4092
7926 ; Should be still fine, but the result is shifted left afterwards
7927 define i32 @c2_i32(i32 %arg) nounwind {
7928 ; X86-LABEL: c2_i32:
7930 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
7931 ; X86-NEXT: shrl $17, %eax
7932 ; X86-NEXT: andl $4092, %eax # imm = 0xFFC
7935 ; X64-LABEL: c2_i32:
7937 ; X64-NEXT: movl %edi, %eax
7938 ; X64-NEXT: shrl $17, %eax
7939 ; X64-NEXT: andl $4092, %eax # imm = 0xFFC
7941 %tmp0 = lshr i32 %arg, 19
7942 %tmp1 = and i32 %tmp0, 1023
7943 %tmp2 = shl i32 %tmp1, 2
7947 ; The mask covers newly shifted-in bit
7948 define i32 @c4_i32_bad(i32 %arg) nounwind {
7949 ; X86-LABEL: c4_i32_bad:
7951 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
7952 ; X86-NEXT: shrl $19, %eax
7953 ; X86-NEXT: andl $-2, %eax
7956 ; X64-LABEL: c4_i32_bad:
7958 ; X64-NEXT: movl %edi, %eax
7959 ; X64-NEXT: shrl $19, %eax
7960 ; X64-NEXT: andl $-2, %eax
7962 %tmp0 = lshr i32 %arg, 19
7963 %tmp1 = and i32 %tmp0, 16382
7969 ; The most canonical variant
7970 define i64 @c0_i64(i64 %arg) nounwind {
7971 ; X86-NOBMI-LABEL: c0_i64:
7972 ; X86-NOBMI: # %bb.0:
7973 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
7974 ; X86-NOBMI-NEXT: shrl $19, %eax
7975 ; X86-NOBMI-NEXT: andl $1023, %eax # imm = 0x3FF
7976 ; X86-NOBMI-NEXT: xorl %edx, %edx
7977 ; X86-NOBMI-NEXT: retl
7979 ; X86-BMI1NOTBM-LABEL: c0_i64:
7980 ; X86-BMI1NOTBM: # %bb.0:
7981 ; X86-BMI1NOTBM-NEXT: movl $2579, %eax # imm = 0xA13
7982 ; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax
7983 ; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
7984 ; X86-BMI1NOTBM-NEXT: retl
7986 ; X86-BMI1TBM-LABEL: c0_i64:
7987 ; X86-BMI1TBM: # %bb.0:
7988 ; X86-BMI1TBM-NEXT: bextrl $2579, {{[0-9]+}}(%esp), %eax # imm = 0xA13
7989 ; X86-BMI1TBM-NEXT: xorl %edx, %edx
7990 ; X86-BMI1TBM-NEXT: retl
7992 ; X86-BMI1NOTBMBMI2-LABEL: c0_i64:
7993 ; X86-BMI1NOTBMBMI2: # %bb.0:
7994 ; X86-BMI1NOTBMBMI2-NEXT: movl $2579, %eax # imm = 0xA13
7995 ; X86-BMI1NOTBMBMI2-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax
7996 ; X86-BMI1NOTBMBMI2-NEXT: xorl %edx, %edx
7997 ; X86-BMI1NOTBMBMI2-NEXT: retl
7999 ; X64-NOBMI-LABEL: c0_i64:
8000 ; X64-NOBMI: # %bb.0:
8001 ; X64-NOBMI-NEXT: movq %rdi, %rax
8002 ; X64-NOBMI-NEXT: shrq $51, %rax
8003 ; X64-NOBMI-NEXT: andl $1023, %eax # imm = 0x3FF
8004 ; X64-NOBMI-NEXT: retq
8006 ; X64-BMI1NOTBM-LABEL: c0_i64:
8007 ; X64-BMI1NOTBM: # %bb.0:
8008 ; X64-BMI1NOTBM-NEXT: movl $2611, %eax # imm = 0xA33
8009 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
8010 ; X64-BMI1NOTBM-NEXT: retq
8012 ; X64-BMI1TBM-LABEL: c0_i64:
8013 ; X64-BMI1TBM: # %bb.0:
8014 ; X64-BMI1TBM-NEXT: bextrq $2611, %rdi, %rax # imm = 0xA33
8015 ; X64-BMI1TBM-NEXT: retq
8017 ; X64-BMI1NOTBMBMI2-LABEL: c0_i64:
8018 ; X64-BMI1NOTBMBMI2: # %bb.0:
8019 ; X64-BMI1NOTBMBMI2-NEXT: movl $2611, %eax # imm = 0xA33
8020 ; X64-BMI1NOTBMBMI2-NEXT: bextrq %rax, %rdi, %rax
8021 ; X64-BMI1NOTBMBMI2-NEXT: retq
8022 %tmp0 = lshr i64 %arg, 51
8023 %tmp1 = and i64 %tmp0, 1023
8027 ; Should be still fine, but the mask is shifted
8028 define i64 @c1_i64(i64 %arg) nounwind {
8029 ; X86-LABEL: c1_i64:
8031 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
8032 ; X86-NEXT: shrl $19, %eax
8033 ; X86-NEXT: andl $4092, %eax # imm = 0xFFC
8034 ; X86-NEXT: xorl %edx, %edx
8037 ; X64-LABEL: c1_i64:
8039 ; X64-NEXT: movq %rdi, %rax
8040 ; X64-NEXT: shrq $51, %rax
8041 ; X64-NEXT: andl $4092, %eax # imm = 0xFFC
8043 %tmp0 = lshr i64 %arg, 51
8044 %tmp1 = and i64 %tmp0, 4092
8048 ; Should be still fine, but the result is shifted left afterwards
8049 define i64 @c2_i64(i64 %arg) nounwind {
8050 ; X86-LABEL: c2_i64:
8052 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
8053 ; X86-NEXT: shrl $17, %eax
8054 ; X86-NEXT: andl $4092, %eax # imm = 0xFFC
8055 ; X86-NEXT: xorl %edx, %edx
8058 ; X64-LABEL: c2_i64:
8060 ; X64-NEXT: movq %rdi, %rax
8061 ; X64-NEXT: shrq $49, %rax
8062 ; X64-NEXT: andl $4092, %eax # imm = 0xFFC
8064 %tmp0 = lshr i64 %arg, 51
8065 %tmp1 = and i64 %tmp0, 1023
8066 %tmp2 = shl i64 %tmp1, 2
8070 ; The mask covers newly shifted-in bit
8071 define i64 @c4_i64_bad(i64 %arg) nounwind {
8072 ; X86-LABEL: c4_i64_bad:
8074 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
8075 ; X86-NEXT: shrl $19, %eax
8076 ; X86-NEXT: andl $-2, %eax
8077 ; X86-NEXT: xorl %edx, %edx
8080 ; X64-LABEL: c4_i64_bad:
8082 ; X64-NEXT: movq %rdi, %rax
8083 ; X64-NEXT: shrq $51, %rax
8084 ; X64-NEXT: andl $-2, %eax
8086 %tmp0 = lshr i64 %arg, 51
8087 %tmp1 = and i64 %tmp0, 16382
8091 ; ---------------------------------------------------------------------------- ;
8092 ; Constant, storing the result afterwards.
8093 ; ---------------------------------------------------------------------------- ;
8097 ; The most canonical variant
8098 define void @c5_i32(i32 %arg, i32* %ptr) nounwind {
8099 ; X86-NOBMI-LABEL: c5_i32:
8100 ; X86-NOBMI: # %bb.0:
8101 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
8102 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
8103 ; X86-NOBMI-NEXT: shrl $19, %ecx
8104 ; X86-NOBMI-NEXT: andl $1023, %ecx # imm = 0x3FF
8105 ; X86-NOBMI-NEXT: movl %ecx, (%eax)
8106 ; X86-NOBMI-NEXT: retl
8108 ; X86-BMI1NOTBM-LABEL: c5_i32:
8109 ; X86-BMI1NOTBM: # %bb.0:
8110 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
8111 ; X86-BMI1NOTBM-NEXT: movl $2579, %ecx # imm = 0xA13
8112 ; X86-BMI1NOTBM-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8113 ; X86-BMI1NOTBM-NEXT: movl %ecx, (%eax)
8114 ; X86-BMI1NOTBM-NEXT: retl
8116 ; X86-BMI1TBM-LABEL: c5_i32:
8117 ; X86-BMI1TBM: # %bb.0:
8118 ; X86-BMI1TBM-NEXT: movl {{[0-9]+}}(%esp), %eax
8119 ; X86-BMI1TBM-NEXT: bextrl $2579, {{[0-9]+}}(%esp), %ecx # imm = 0xA13
8120 ; X86-BMI1TBM-NEXT: movl %ecx, (%eax)
8121 ; X86-BMI1TBM-NEXT: retl
8123 ; X86-BMI1NOTBMBMI2-LABEL: c5_i32:
8124 ; X86-BMI1NOTBMBMI2: # %bb.0:
8125 ; X86-BMI1NOTBMBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
8126 ; X86-BMI1NOTBMBMI2-NEXT: movl $2579, %ecx # imm = 0xA13
8127 ; X86-BMI1NOTBMBMI2-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8128 ; X86-BMI1NOTBMBMI2-NEXT: movl %ecx, (%eax)
8129 ; X86-BMI1NOTBMBMI2-NEXT: retl
8131 ; X64-NOBMI-LABEL: c5_i32:
8132 ; X64-NOBMI: # %bb.0:
8133 ; X64-NOBMI-NEXT: shrl $19, %edi
8134 ; X64-NOBMI-NEXT: andl $1023, %edi # imm = 0x3FF
8135 ; X64-NOBMI-NEXT: movl %edi, (%rsi)
8136 ; X64-NOBMI-NEXT: retq
8138 ; X64-BMI1NOTBM-LABEL: c5_i32:
8139 ; X64-BMI1NOTBM: # %bb.0:
8140 ; X64-BMI1NOTBM-NEXT: movl $2579, %eax # imm = 0xA13
8141 ; X64-BMI1NOTBM-NEXT: bextrl %eax, %edi, %eax
8142 ; X64-BMI1NOTBM-NEXT: movl %eax, (%rsi)
8143 ; X64-BMI1NOTBM-NEXT: retq
8145 ; X64-BMI1TBM-LABEL: c5_i32:
8146 ; X64-BMI1TBM: # %bb.0:
8147 ; X64-BMI1TBM-NEXT: bextrl $2579, %edi, %eax # imm = 0xA13
8148 ; X64-BMI1TBM-NEXT: movl %eax, (%rsi)
8149 ; X64-BMI1TBM-NEXT: retq
8151 ; X64-BMI1NOTBMBMI2-LABEL: c5_i32:
8152 ; X64-BMI1NOTBMBMI2: # %bb.0:
8153 ; X64-BMI1NOTBMBMI2-NEXT: movl $2579, %eax # imm = 0xA13
8154 ; X64-BMI1NOTBMBMI2-NEXT: bextrl %eax, %edi, %eax
8155 ; X64-BMI1NOTBMBMI2-NEXT: movl %eax, (%rsi)
8156 ; X64-BMI1NOTBMBMI2-NEXT: retq
8157 %tmp0 = lshr i32 %arg, 19
8158 %tmp1 = and i32 %tmp0, 1023
8159 store i32 %tmp1, i32* %ptr
8163 ; Should be still fine, but the mask is shifted
8164 define void @c6_i32(i32 %arg, i32* %ptr) nounwind {
8165 ; X86-NOBMI-LABEL: c6_i32:
8166 ; X86-NOBMI: # %bb.0:
8167 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
8168 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
8169 ; X86-NOBMI-NEXT: shrl $19, %ecx
8170 ; X86-NOBMI-NEXT: andl $4095, %ecx # imm = 0xFFF
8171 ; X86-NOBMI-NEXT: movl %ecx, (%eax)
8172 ; X86-NOBMI-NEXT: retl
8174 ; X86-BMI1NOTBM-LABEL: c6_i32:
8175 ; X86-BMI1NOTBM: # %bb.0:
8176 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
8177 ; X86-BMI1NOTBM-NEXT: movl $3091, %ecx # imm = 0xC13
8178 ; X86-BMI1NOTBM-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8179 ; X86-BMI1NOTBM-NEXT: movl %ecx, (%eax)
8180 ; X86-BMI1NOTBM-NEXT: retl
8182 ; X86-BMI1TBM-LABEL: c6_i32:
8183 ; X86-BMI1TBM: # %bb.0:
8184 ; X86-BMI1TBM-NEXT: movl {{[0-9]+}}(%esp), %eax
8185 ; X86-BMI1TBM-NEXT: bextrl $3091, {{[0-9]+}}(%esp), %ecx # imm = 0xC13
8186 ; X86-BMI1TBM-NEXT: movl %ecx, (%eax)
8187 ; X86-BMI1TBM-NEXT: retl
8189 ; X86-BMI1NOTBMBMI2-LABEL: c6_i32:
8190 ; X86-BMI1NOTBMBMI2: # %bb.0:
8191 ; X86-BMI1NOTBMBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
8192 ; X86-BMI1NOTBMBMI2-NEXT: movl $3091, %ecx # imm = 0xC13
8193 ; X86-BMI1NOTBMBMI2-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8194 ; X86-BMI1NOTBMBMI2-NEXT: movl %ecx, (%eax)
8195 ; X86-BMI1NOTBMBMI2-NEXT: retl
8197 ; X64-NOBMI-LABEL: c6_i32:
8198 ; X64-NOBMI: # %bb.0:
8199 ; X64-NOBMI-NEXT: shrl $19, %edi
8200 ; X64-NOBMI-NEXT: andl $4095, %edi # imm = 0xFFF
8201 ; X64-NOBMI-NEXT: movl %edi, (%rsi)
8202 ; X64-NOBMI-NEXT: retq
8204 ; X64-BMI1NOTBM-LABEL: c6_i32:
8205 ; X64-BMI1NOTBM: # %bb.0:
8206 ; X64-BMI1NOTBM-NEXT: movl $3091, %eax # imm = 0xC13
8207 ; X64-BMI1NOTBM-NEXT: bextrl %eax, %edi, %eax
8208 ; X64-BMI1NOTBM-NEXT: movl %eax, (%rsi)
8209 ; X64-BMI1NOTBM-NEXT: retq
8211 ; X64-BMI1TBM-LABEL: c6_i32:
8212 ; X64-BMI1TBM: # %bb.0:
8213 ; X64-BMI1TBM-NEXT: bextrl $3091, %edi, %eax # imm = 0xC13
8214 ; X64-BMI1TBM-NEXT: movl %eax, (%rsi)
8215 ; X64-BMI1TBM-NEXT: retq
8217 ; X64-BMI1NOTBMBMI2-LABEL: c6_i32:
8218 ; X64-BMI1NOTBMBMI2: # %bb.0:
8219 ; X64-BMI1NOTBMBMI2-NEXT: movl $3091, %eax # imm = 0xC13
8220 ; X64-BMI1NOTBMBMI2-NEXT: bextrl %eax, %edi, %eax
8221 ; X64-BMI1NOTBMBMI2-NEXT: movl %eax, (%rsi)
8222 ; X64-BMI1NOTBMBMI2-NEXT: retq
8223 %tmp0 = lshr i32 %arg, 19
8224 %tmp1 = and i32 %tmp0, 4095
8225 store i32 %tmp1, i32* %ptr
8229 ; Should be still fine, but the result is shifted left afterwards
8230 define void @c7_i32(i32 %arg, i32* %ptr) nounwind {
8231 ; X86-LABEL: c7_i32:
8233 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
8234 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
8235 ; X86-NEXT: shrl $17, %ecx
8236 ; X86-NEXT: andl $4092, %ecx # imm = 0xFFC
8237 ; X86-NEXT: movl %ecx, (%eax)
8240 ; X64-LABEL: c7_i32:
8242 ; X64-NEXT: shrl $17, %edi
8243 ; X64-NEXT: andl $4092, %edi # imm = 0xFFC
8244 ; X64-NEXT: movl %edi, (%rsi)
8246 %tmp0 = lshr i32 %arg, 19
8247 %tmp1 = and i32 %tmp0, 1023
8248 %tmp2 = shl i32 %tmp1, 2
8249 store i32 %tmp2, i32* %ptr
8255 ; The most canonical variant
8256 define void @c5_i64(i64 %arg, i64* %ptr) nounwind {
8257 ; X86-NOBMI-LABEL: c5_i64:
8258 ; X86-NOBMI: # %bb.0:
8259 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
8260 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
8261 ; X86-NOBMI-NEXT: shrl $19, %ecx
8262 ; X86-NOBMI-NEXT: andl $1023, %ecx # imm = 0x3FF
8263 ; X86-NOBMI-NEXT: movl %ecx, (%eax)
8264 ; X86-NOBMI-NEXT: movl $0, 4(%eax)
8265 ; X86-NOBMI-NEXT: retl
8267 ; X86-BMI1NOTBM-LABEL: c5_i64:
8268 ; X86-BMI1NOTBM: # %bb.0:
8269 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
8270 ; X86-BMI1NOTBM-NEXT: movl $2579, %ecx # imm = 0xA13
8271 ; X86-BMI1NOTBM-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8272 ; X86-BMI1NOTBM-NEXT: movl %ecx, (%eax)
8273 ; X86-BMI1NOTBM-NEXT: movl $0, 4(%eax)
8274 ; X86-BMI1NOTBM-NEXT: retl
8276 ; X86-BMI1TBM-LABEL: c5_i64:
8277 ; X86-BMI1TBM: # %bb.0:
8278 ; X86-BMI1TBM-NEXT: movl {{[0-9]+}}(%esp), %eax
8279 ; X86-BMI1TBM-NEXT: bextrl $2579, {{[0-9]+}}(%esp), %ecx # imm = 0xA13
8280 ; X86-BMI1TBM-NEXT: movl %ecx, (%eax)
8281 ; X86-BMI1TBM-NEXT: movl $0, 4(%eax)
8282 ; X86-BMI1TBM-NEXT: retl
8284 ; X86-BMI1NOTBMBMI2-LABEL: c5_i64:
8285 ; X86-BMI1NOTBMBMI2: # %bb.0:
8286 ; X86-BMI1NOTBMBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
8287 ; X86-BMI1NOTBMBMI2-NEXT: movl $2579, %ecx # imm = 0xA13
8288 ; X86-BMI1NOTBMBMI2-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8289 ; X86-BMI1NOTBMBMI2-NEXT: movl %ecx, (%eax)
8290 ; X86-BMI1NOTBMBMI2-NEXT: movl $0, 4(%eax)
8291 ; X86-BMI1NOTBMBMI2-NEXT: retl
8293 ; X64-NOBMI-LABEL: c5_i64:
8294 ; X64-NOBMI: # %bb.0:
8295 ; X64-NOBMI-NEXT: shrq $51, %rdi
8296 ; X64-NOBMI-NEXT: andl $1023, %edi # imm = 0x3FF
8297 ; X64-NOBMI-NEXT: movq %rdi, (%rsi)
8298 ; X64-NOBMI-NEXT: retq
8300 ; X64-BMI1NOTBM-LABEL: c5_i64:
8301 ; X64-BMI1NOTBM: # %bb.0:
8302 ; X64-BMI1NOTBM-NEXT: movl $2611, %eax # imm = 0xA33
8303 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
8304 ; X64-BMI1NOTBM-NEXT: movq %rax, (%rsi)
8305 ; X64-BMI1NOTBM-NEXT: retq
8307 ; X64-BMI1TBM-LABEL: c5_i64:
8308 ; X64-BMI1TBM: # %bb.0:
8309 ; X64-BMI1TBM-NEXT: bextrq $2611, %rdi, %rax # imm = 0xA33
8310 ; X64-BMI1TBM-NEXT: movq %rax, (%rsi)
8311 ; X64-BMI1TBM-NEXT: retq
8313 ; X64-BMI1NOTBMBMI2-LABEL: c5_i64:
8314 ; X64-BMI1NOTBMBMI2: # %bb.0:
8315 ; X64-BMI1NOTBMBMI2-NEXT: movl $2611, %eax # imm = 0xA33
8316 ; X64-BMI1NOTBMBMI2-NEXT: bextrq %rax, %rdi, %rax
8317 ; X64-BMI1NOTBMBMI2-NEXT: movq %rax, (%rsi)
8318 ; X64-BMI1NOTBMBMI2-NEXT: retq
8319 %tmp0 = lshr i64 %arg, 51
8320 %tmp1 = and i64 %tmp0, 1023
8321 store i64 %tmp1, i64* %ptr
8325 ; Should be still fine, but the mask is shifted
8326 define void @c6_i64(i64 %arg, i64* %ptr) nounwind {
8327 ; X86-NOBMI-LABEL: c6_i64:
8328 ; X86-NOBMI: # %bb.0:
8329 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
8330 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
8331 ; X86-NOBMI-NEXT: shrl $19, %ecx
8332 ; X86-NOBMI-NEXT: andl $4095, %ecx # imm = 0xFFF
8333 ; X86-NOBMI-NEXT: movl %ecx, (%eax)
8334 ; X86-NOBMI-NEXT: movl $0, 4(%eax)
8335 ; X86-NOBMI-NEXT: retl
8337 ; X86-BMI1NOTBM-LABEL: c6_i64:
8338 ; X86-BMI1NOTBM: # %bb.0:
8339 ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
8340 ; X86-BMI1NOTBM-NEXT: movl $3091, %ecx # imm = 0xC13
8341 ; X86-BMI1NOTBM-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8342 ; X86-BMI1NOTBM-NEXT: movl %ecx, (%eax)
8343 ; X86-BMI1NOTBM-NEXT: movl $0, 4(%eax)
8344 ; X86-BMI1NOTBM-NEXT: retl
8346 ; X86-BMI1TBM-LABEL: c6_i64:
8347 ; X86-BMI1TBM: # %bb.0:
8348 ; X86-BMI1TBM-NEXT: movl {{[0-9]+}}(%esp), %eax
8349 ; X86-BMI1TBM-NEXT: bextrl $3091, {{[0-9]+}}(%esp), %ecx # imm = 0xC13
8350 ; X86-BMI1TBM-NEXT: movl %ecx, (%eax)
8351 ; X86-BMI1TBM-NEXT: movl $0, 4(%eax)
8352 ; X86-BMI1TBM-NEXT: retl
8354 ; X86-BMI1NOTBMBMI2-LABEL: c6_i64:
8355 ; X86-BMI1NOTBMBMI2: # %bb.0:
8356 ; X86-BMI1NOTBMBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
8357 ; X86-BMI1NOTBMBMI2-NEXT: movl $3091, %ecx # imm = 0xC13
8358 ; X86-BMI1NOTBMBMI2-NEXT: bextrl %ecx, {{[0-9]+}}(%esp), %ecx
8359 ; X86-BMI1NOTBMBMI2-NEXT: movl %ecx, (%eax)
8360 ; X86-BMI1NOTBMBMI2-NEXT: movl $0, 4(%eax)
8361 ; X86-BMI1NOTBMBMI2-NEXT: retl
8363 ; X64-NOBMI-LABEL: c6_i64:
8364 ; X64-NOBMI: # %bb.0:
8365 ; X64-NOBMI-NEXT: shrq $51, %rdi
8366 ; X64-NOBMI-NEXT: andl $4095, %edi # imm = 0xFFF
8367 ; X64-NOBMI-NEXT: movq %rdi, (%rsi)
8368 ; X64-NOBMI-NEXT: retq
8370 ; X64-BMI1NOTBM-LABEL: c6_i64:
8371 ; X64-BMI1NOTBM: # %bb.0:
8372 ; X64-BMI1NOTBM-NEXT: movl $3123, %eax # imm = 0xC33
8373 ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rdi, %rax
8374 ; X64-BMI1NOTBM-NEXT: movq %rax, (%rsi)
8375 ; X64-BMI1NOTBM-NEXT: retq
8377 ; X64-BMI1TBM-LABEL: c6_i64:
8378 ; X64-BMI1TBM: # %bb.0:
8379 ; X64-BMI1TBM-NEXT: bextrq $3123, %rdi, %rax # imm = 0xC33
8380 ; X64-BMI1TBM-NEXT: movq %rax, (%rsi)
8381 ; X64-BMI1TBM-NEXT: retq
8383 ; X64-BMI1NOTBMBMI2-LABEL: c6_i64:
8384 ; X64-BMI1NOTBMBMI2: # %bb.0:
8385 ; X64-BMI1NOTBMBMI2-NEXT: movl $3123, %eax # imm = 0xC33
8386 ; X64-BMI1NOTBMBMI2-NEXT: bextrq %rax, %rdi, %rax
8387 ; X64-BMI1NOTBMBMI2-NEXT: movq %rax, (%rsi)
8388 ; X64-BMI1NOTBMBMI2-NEXT: retq
8389 %tmp0 = lshr i64 %arg, 51
8390 %tmp1 = and i64 %tmp0, 4095
8391 store i64 %tmp1, i64* %ptr
8395 ; Should be still fine, but the result is shifted left afterwards
8396 define void @c7_i64(i64 %arg, i64* %ptr) nounwind {
8397 ; X86-LABEL: c7_i64:
8399 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
8400 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
8401 ; X86-NEXT: shrl $17, %ecx
8402 ; X86-NEXT: andl $4092, %ecx # imm = 0xFFC
8403 ; X86-NEXT: movl %ecx, (%eax)
8404 ; X86-NEXT: movl $0, 4(%eax)
8407 ; X64-LABEL: c7_i64:
8409 ; X64-NEXT: shrq $49, %rdi
8410 ; X64-NEXT: andl $4092, %edi # imm = 0xFFC
8411 ; X64-NEXT: movq %rdi, (%rsi)
8413 %tmp0 = lshr i64 %arg, 51
8414 %tmp1 = and i64 %tmp0, 1023
8415 %tmp2 = shl i64 %tmp1, 2
8416 store i64 %tmp2, i64* %ptr