Use Align for TFL::TransientStackAlignment
[llvm-core.git] / test / CodeGen / X86 / const-shift-of-constmasked.ll
blob08ef7403af8ab02e58e240c53badfc3adaa7beaf
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefixes=ALL,X32
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=ALL,X64
5 ; The mask is all-ones, potentially shifted.
7 ;------------------------------------------------------------------------------;
8 ; 8-bit
9 ;------------------------------------------------------------------------------;
11 ; lshr
13 define i8 @test_i8_7_mask_lshr_1(i8 %a0) {
14 ; X32-LABEL: test_i8_7_mask_lshr_1:
15 ; X32:       # %bb.0:
16 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
17 ; X32-NEXT:    andb $6, %al
18 ; X32-NEXT:    shrb %al
19 ; X32-NEXT:    retl
21 ; X64-LABEL: test_i8_7_mask_lshr_1:
22 ; X64:       # %bb.0:
23 ; X64-NEXT:    movl %edi, %eax
24 ; X64-NEXT:    andb $6, %al
25 ; X64-NEXT:    shrb %al
26 ; X64-NEXT:    # kill: def $al killed $al killed $eax
27 ; X64-NEXT:    retq
28   %t0 = and i8 %a0, 7
29   %t1 = lshr i8 %t0, 1
30   ret i8 %t1
33 define i8 @test_i8_28_mask_lshr_1(i8 %a0) {
34 ; X32-LABEL: test_i8_28_mask_lshr_1:
35 ; X32:       # %bb.0:
36 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
37 ; X32-NEXT:    andb $28, %al
38 ; X32-NEXT:    shrb %al
39 ; X32-NEXT:    retl
41 ; X64-LABEL: test_i8_28_mask_lshr_1:
42 ; X64:       # %bb.0:
43 ; X64-NEXT:    movl %edi, %eax
44 ; X64-NEXT:    andb $28, %al
45 ; X64-NEXT:    shrb %al
46 ; X64-NEXT:    # kill: def $al killed $al killed $eax
47 ; X64-NEXT:    retq
48   %t0 = and i8 %a0, 28
49   %t1 = lshr i8 %t0, 1
50   ret i8 %t1
52 define i8 @test_i8_28_mask_lshr_2(i8 %a0) {
53 ; X32-LABEL: test_i8_28_mask_lshr_2:
54 ; X32:       # %bb.0:
55 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
56 ; X32-NEXT:    andb $28, %al
57 ; X32-NEXT:    shrb $2, %al
58 ; X32-NEXT:    retl
60 ; X64-LABEL: test_i8_28_mask_lshr_2:
61 ; X64:       # %bb.0:
62 ; X64-NEXT:    movl %edi, %eax
63 ; X64-NEXT:    andb $28, %al
64 ; X64-NEXT:    shrb $2, %al
65 ; X64-NEXT:    # kill: def $al killed $al killed $eax
66 ; X64-NEXT:    retq
67   %t0 = and i8 %a0, 28
68   %t1 = lshr i8 %t0, 2
69   ret i8 %t1
71 define i8 @test_i8_28_mask_lshr_3(i8 %a0) {
72 ; X32-LABEL: test_i8_28_mask_lshr_3:
73 ; X32:       # %bb.0:
74 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
75 ; X32-NEXT:    andb $24, %al
76 ; X32-NEXT:    shrb $3, %al
77 ; X32-NEXT:    retl
79 ; X64-LABEL: test_i8_28_mask_lshr_3:
80 ; X64:       # %bb.0:
81 ; X64-NEXT:    movl %edi, %eax
82 ; X64-NEXT:    andb $24, %al
83 ; X64-NEXT:    shrb $3, %al
84 ; X64-NEXT:    # kill: def $al killed $al killed $eax
85 ; X64-NEXT:    retq
86   %t0 = and i8 %a0, 28
87   %t1 = lshr i8 %t0, 3
88   ret i8 %t1
90 define i8 @test_i8_28_mask_lshr_4(i8 %a0) {
91 ; X32-LABEL: test_i8_28_mask_lshr_4:
92 ; X32:       # %bb.0:
93 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
94 ; X32-NEXT:    andb $16, %al
95 ; X32-NEXT:    shrb $4, %al
96 ; X32-NEXT:    retl
98 ; X64-LABEL: test_i8_28_mask_lshr_4:
99 ; X64:       # %bb.0:
100 ; X64-NEXT:    movl %edi, %eax
101 ; X64-NEXT:    andb $16, %al
102 ; X64-NEXT:    shrb $4, %al
103 ; X64-NEXT:    # kill: def $al killed $al killed $eax
104 ; X64-NEXT:    retq
105   %t0 = and i8 %a0, 28
106   %t1 = lshr i8 %t0, 4
107   ret i8 %t1
110 define i8 @test_i8_224_mask_lshr_1(i8 %a0) {
111 ; X32-LABEL: test_i8_224_mask_lshr_1:
112 ; X32:       # %bb.0:
113 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
114 ; X32-NEXT:    andb $-32, %al
115 ; X32-NEXT:    shrb %al
116 ; X32-NEXT:    retl
118 ; X64-LABEL: test_i8_224_mask_lshr_1:
119 ; X64:       # %bb.0:
120 ; X64-NEXT:    movl %edi, %eax
121 ; X64-NEXT:    andb $-32, %al
122 ; X64-NEXT:    shrb %al
123 ; X64-NEXT:    # kill: def $al killed $al killed $eax
124 ; X64-NEXT:    retq
125   %t0 = and i8 %a0, 224
126   %t1 = lshr i8 %t0, 1
127   ret i8 %t1
129 define i8 @test_i8_224_mask_lshr_4(i8 %a0) {
130 ; X32-LABEL: test_i8_224_mask_lshr_4:
131 ; X32:       # %bb.0:
132 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
133 ; X32-NEXT:    andb $-32, %al
134 ; X32-NEXT:    shrb $4, %al
135 ; X32-NEXT:    retl
137 ; X64-LABEL: test_i8_224_mask_lshr_4:
138 ; X64:       # %bb.0:
139 ; X64-NEXT:    movl %edi, %eax
140 ; X64-NEXT:    andb $-32, %al
141 ; X64-NEXT:    shrb $4, %al
142 ; X64-NEXT:    # kill: def $al killed $al killed $eax
143 ; X64-NEXT:    retq
144   %t0 = and i8 %a0, 224
145   %t1 = lshr i8 %t0, 4
146   ret i8 %t1
148 define i8 @test_i8_224_mask_lshr_5(i8 %a0) {
149 ; X32-LABEL: test_i8_224_mask_lshr_5:
150 ; X32:       # %bb.0:
151 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
152 ; X32-NEXT:    shrb $5, %al
153 ; X32-NEXT:    retl
155 ; X64-LABEL: test_i8_224_mask_lshr_5:
156 ; X64:       # %bb.0:
157 ; X64-NEXT:    movl %edi, %eax
158 ; X64-NEXT:    shrb $5, %al
159 ; X64-NEXT:    # kill: def $al killed $al killed $eax
160 ; X64-NEXT:    retq
161   %t0 = and i8 %a0, 224
162   %t1 = lshr i8 %t0, 5
163   ret i8 %t1
165 define i8 @test_i8_224_mask_lshr_6(i8 %a0) {
166 ; X32-LABEL: test_i8_224_mask_lshr_6:
167 ; X32:       # %bb.0:
168 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
169 ; X32-NEXT:    shrb $6, %al
170 ; X32-NEXT:    retl
172 ; X64-LABEL: test_i8_224_mask_lshr_6:
173 ; X64:       # %bb.0:
174 ; X64-NEXT:    movl %edi, %eax
175 ; X64-NEXT:    shrb $6, %al
176 ; X64-NEXT:    # kill: def $al killed $al killed $eax
177 ; X64-NEXT:    retq
178   %t0 = and i8 %a0, 224
179   %t1 = lshr i8 %t0, 6
180   ret i8 %t1
183 ; ashr
185 define i8 @test_i8_7_mask_ashr_1(i8 %a0) {
186 ; X32-LABEL: test_i8_7_mask_ashr_1:
187 ; X32:       # %bb.0:
188 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
189 ; X32-NEXT:    andb $6, %al
190 ; X32-NEXT:    shrb %al
191 ; X32-NEXT:    retl
193 ; X64-LABEL: test_i8_7_mask_ashr_1:
194 ; X64:       # %bb.0:
195 ; X64-NEXT:    movl %edi, %eax
196 ; X64-NEXT:    andb $6, %al
197 ; X64-NEXT:    shrb %al
198 ; X64-NEXT:    # kill: def $al killed $al killed $eax
199 ; X64-NEXT:    retq
200   %t0 = and i8 %a0, 7
201   %t1 = ashr i8 %t0, 1
202   ret i8 %t1
205 define i8 @test_i8_28_mask_ashr_1(i8 %a0) {
206 ; X32-LABEL: test_i8_28_mask_ashr_1:
207 ; X32:       # %bb.0:
208 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
209 ; X32-NEXT:    andb $28, %al
210 ; X32-NEXT:    shrb %al
211 ; X32-NEXT:    retl
213 ; X64-LABEL: test_i8_28_mask_ashr_1:
214 ; X64:       # %bb.0:
215 ; X64-NEXT:    movl %edi, %eax
216 ; X64-NEXT:    andb $28, %al
217 ; X64-NEXT:    shrb %al
218 ; X64-NEXT:    # kill: def $al killed $al killed $eax
219 ; X64-NEXT:    retq
220   %t0 = and i8 %a0, 28
221   %t1 = ashr i8 %t0, 1
222   ret i8 %t1
224 define i8 @test_i8_28_mask_ashr_2(i8 %a0) {
225 ; X32-LABEL: test_i8_28_mask_ashr_2:
226 ; X32:       # %bb.0:
227 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
228 ; X32-NEXT:    andb $28, %al
229 ; X32-NEXT:    shrb $2, %al
230 ; X32-NEXT:    retl
232 ; X64-LABEL: test_i8_28_mask_ashr_2:
233 ; X64:       # %bb.0:
234 ; X64-NEXT:    movl %edi, %eax
235 ; X64-NEXT:    andb $28, %al
236 ; X64-NEXT:    shrb $2, %al
237 ; X64-NEXT:    # kill: def $al killed $al killed $eax
238 ; X64-NEXT:    retq
239   %t0 = and i8 %a0, 28
240   %t1 = ashr i8 %t0, 2
241   ret i8 %t1
243 define i8 @test_i8_28_mask_ashr_3(i8 %a0) {
244 ; X32-LABEL: test_i8_28_mask_ashr_3:
245 ; X32:       # %bb.0:
246 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
247 ; X32-NEXT:    andb $24, %al
248 ; X32-NEXT:    shrb $3, %al
249 ; X32-NEXT:    retl
251 ; X64-LABEL: test_i8_28_mask_ashr_3:
252 ; X64:       # %bb.0:
253 ; X64-NEXT:    movl %edi, %eax
254 ; X64-NEXT:    andb $24, %al
255 ; X64-NEXT:    shrb $3, %al
256 ; X64-NEXT:    # kill: def $al killed $al killed $eax
257 ; X64-NEXT:    retq
258   %t0 = and i8 %a0, 28
259   %t1 = ashr i8 %t0, 3
260   ret i8 %t1
262 define i8 @test_i8_28_mask_ashr_4(i8 %a0) {
263 ; X32-LABEL: test_i8_28_mask_ashr_4:
264 ; X32:       # %bb.0:
265 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
266 ; X32-NEXT:    andb $16, %al
267 ; X32-NEXT:    shrb $4, %al
268 ; X32-NEXT:    retl
270 ; X64-LABEL: test_i8_28_mask_ashr_4:
271 ; X64:       # %bb.0:
272 ; X64-NEXT:    movl %edi, %eax
273 ; X64-NEXT:    andb $16, %al
274 ; X64-NEXT:    shrb $4, %al
275 ; X64-NEXT:    # kill: def $al killed $al killed $eax
276 ; X64-NEXT:    retq
277   %t0 = and i8 %a0, 28
278   %t1 = ashr i8 %t0, 4
279   ret i8 %t1
282 define i8 @test_i8_224_mask_ashr_1(i8 %a0) {
283 ; X32-LABEL: test_i8_224_mask_ashr_1:
284 ; X32:       # %bb.0:
285 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
286 ; X32-NEXT:    andb $-32, %al
287 ; X32-NEXT:    sarb %al
288 ; X32-NEXT:    retl
290 ; X64-LABEL: test_i8_224_mask_ashr_1:
291 ; X64:       # %bb.0:
292 ; X64-NEXT:    movl %edi, %eax
293 ; X64-NEXT:    andb $-32, %al
294 ; X64-NEXT:    sarb %al
295 ; X64-NEXT:    # kill: def $al killed $al killed $eax
296 ; X64-NEXT:    retq
297   %t0 = and i8 %a0, 224
298   %t1 = ashr i8 %t0, 1
299   ret i8 %t1
301 define i8 @test_i8_224_mask_ashr_4(i8 %a0) {
302 ; X32-LABEL: test_i8_224_mask_ashr_4:
303 ; X32:       # %bb.0:
304 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
305 ; X32-NEXT:    andb $-32, %al
306 ; X32-NEXT:    sarb $4, %al
307 ; X32-NEXT:    retl
309 ; X64-LABEL: test_i8_224_mask_ashr_4:
310 ; X64:       # %bb.0:
311 ; X64-NEXT:    movl %edi, %eax
312 ; X64-NEXT:    andb $-32, %al
313 ; X64-NEXT:    sarb $4, %al
314 ; X64-NEXT:    # kill: def $al killed $al killed $eax
315 ; X64-NEXT:    retq
316   %t0 = and i8 %a0, 224
317   %t1 = ashr i8 %t0, 4
318   ret i8 %t1
320 define i8 @test_i8_224_mask_ashr_5(i8 %a0) {
321 ; X32-LABEL: test_i8_224_mask_ashr_5:
322 ; X32:       # %bb.0:
323 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
324 ; X32-NEXT:    sarb $5, %al
325 ; X32-NEXT:    retl
327 ; X64-LABEL: test_i8_224_mask_ashr_5:
328 ; X64:       # %bb.0:
329 ; X64-NEXT:    movl %edi, %eax
330 ; X64-NEXT:    sarb $5, %al
331 ; X64-NEXT:    # kill: def $al killed $al killed $eax
332 ; X64-NEXT:    retq
333   %t0 = and i8 %a0, 224
334   %t1 = ashr i8 %t0, 5
335   ret i8 %t1
337 define i8 @test_i8_224_mask_ashr_6(i8 %a0) {
338 ; X32-LABEL: test_i8_224_mask_ashr_6:
339 ; X32:       # %bb.0:
340 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
341 ; X32-NEXT:    sarb $6, %al
342 ; X32-NEXT:    retl
344 ; X64-LABEL: test_i8_224_mask_ashr_6:
345 ; X64:       # %bb.0:
346 ; X64-NEXT:    movl %edi, %eax
347 ; X64-NEXT:    sarb $6, %al
348 ; X64-NEXT:    # kill: def $al killed $al killed $eax
349 ; X64-NEXT:    retq
350   %t0 = and i8 %a0, 224
351   %t1 = ashr i8 %t0, 6
352   ret i8 %t1
355 ; shl
357 define i8 @test_i8_7_mask_shl_1(i8 %a0) {
358 ; X32-LABEL: test_i8_7_mask_shl_1:
359 ; X32:       # %bb.0:
360 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
361 ; X32-NEXT:    andb $7, %al
362 ; X32-NEXT:    addb %al, %al
363 ; X32-NEXT:    retl
365 ; X64-LABEL: test_i8_7_mask_shl_1:
366 ; X64:       # %bb.0:
367 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
368 ; X64-NEXT:    andb $7, %dil
369 ; X64-NEXT:    leal (%rdi,%rdi), %eax
370 ; X64-NEXT:    # kill: def $al killed $al killed $eax
371 ; X64-NEXT:    retq
372   %t0 = and i8 %a0, 7
373   %t1 = shl i8 %t0, 1
374   ret i8 %t1
376 define i8 @test_i8_7_mask_shl_4(i8 %a0) {
377 ; X32-LABEL: test_i8_7_mask_shl_4:
378 ; X32:       # %bb.0:
379 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
380 ; X32-NEXT:    andb $7, %al
381 ; X32-NEXT:    shlb $4, %al
382 ; X32-NEXT:    retl
384 ; X64-LABEL: test_i8_7_mask_shl_4:
385 ; X64:       # %bb.0:
386 ; X64-NEXT:    movl %edi, %eax
387 ; X64-NEXT:    andb $7, %al
388 ; X64-NEXT:    shlb $4, %al
389 ; X64-NEXT:    # kill: def $al killed $al killed $eax
390 ; X64-NEXT:    retq
391   %t0 = and i8 %a0, 7
392   %t1 = shl i8 %t0, 4
393   ret i8 %t1
395 define i8 @test_i8_7_mask_shl_5(i8 %a0) {
396 ; X32-LABEL: test_i8_7_mask_shl_5:
397 ; X32:       # %bb.0:
398 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
399 ; X32-NEXT:    shlb $5, %al
400 ; X32-NEXT:    retl
402 ; X64-LABEL: test_i8_7_mask_shl_5:
403 ; X64:       # %bb.0:
404 ; X64-NEXT:    movl %edi, %eax
405 ; X64-NEXT:    shlb $5, %al
406 ; X64-NEXT:    # kill: def $al killed $al killed $eax
407 ; X64-NEXT:    retq
408   %t0 = and i8 %a0, 7
409   %t1 = shl i8 %t0, 5
410   ret i8 %t1
412 define i8 @test_i8_7_mask_shl_6(i8 %a0) {
413 ; X32-LABEL: test_i8_7_mask_shl_6:
414 ; X32:       # %bb.0:
415 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
416 ; X32-NEXT:    shlb $6, %al
417 ; X32-NEXT:    retl
419 ; X64-LABEL: test_i8_7_mask_shl_6:
420 ; X64:       # %bb.0:
421 ; X64-NEXT:    movl %edi, %eax
422 ; X64-NEXT:    shlb $6, %al
423 ; X64-NEXT:    # kill: def $al killed $al killed $eax
424 ; X64-NEXT:    retq
425   %t0 = and i8 %a0, 7
426   %t1 = shl i8 %t0, 6
427   ret i8 %t1
430 define i8 @test_i8_28_mask_shl_1(i8 %a0) {
431 ; X32-LABEL: test_i8_28_mask_shl_1:
432 ; X32:       # %bb.0:
433 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
434 ; X32-NEXT:    andb $28, %al
435 ; X32-NEXT:    addb %al, %al
436 ; X32-NEXT:    retl
438 ; X64-LABEL: test_i8_28_mask_shl_1:
439 ; X64:       # %bb.0:
440 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
441 ; X64-NEXT:    andb $28, %dil
442 ; X64-NEXT:    leal (%rdi,%rdi), %eax
443 ; X64-NEXT:    # kill: def $al killed $al killed $eax
444 ; X64-NEXT:    retq
445   %t0 = and i8 %a0, 28
446   %t1 = shl i8 %t0, 1
447   ret i8 %t1
449 define i8 @test_i8_28_mask_shl_2(i8 %a0) {
450 ; X32-LABEL: test_i8_28_mask_shl_2:
451 ; X32:       # %bb.0:
452 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
453 ; X32-NEXT:    andb $28, %al
454 ; X32-NEXT:    shlb $2, %al
455 ; X32-NEXT:    retl
457 ; X64-LABEL: test_i8_28_mask_shl_2:
458 ; X64:       # %bb.0:
459 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
460 ; X64-NEXT:    andb $28, %dil
461 ; X64-NEXT:    leal (,%rdi,4), %eax
462 ; X64-NEXT:    # kill: def $al killed $al killed $eax
463 ; X64-NEXT:    retq
464   %t0 = and i8 %a0, 28
465   %t1 = shl i8 %t0, 2
466   ret i8 %t1
468 define i8 @test_i8_28_mask_shl_3(i8 %a0) {
469 ; X32-LABEL: test_i8_28_mask_shl_3:
470 ; X32:       # %bb.0:
471 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
472 ; X32-NEXT:    andb $28, %al
473 ; X32-NEXT:    shlb $3, %al
474 ; X32-NEXT:    retl
476 ; X64-LABEL: test_i8_28_mask_shl_3:
477 ; X64:       # %bb.0:
478 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
479 ; X64-NEXT:    andb $28, %dil
480 ; X64-NEXT:    leal (,%rdi,8), %eax
481 ; X64-NEXT:    # kill: def $al killed $al killed $eax
482 ; X64-NEXT:    retq
483   %t0 = and i8 %a0, 28
484   %t1 = shl i8 %t0, 3
485   ret i8 %t1
487 define i8 @test_i8_28_mask_shl_4(i8 %a0) {
488 ; X32-LABEL: test_i8_28_mask_shl_4:
489 ; X32:       # %bb.0:
490 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
491 ; X32-NEXT:    andb $12, %al
492 ; X32-NEXT:    shlb $4, %al
493 ; X32-NEXT:    retl
495 ; X64-LABEL: test_i8_28_mask_shl_4:
496 ; X64:       # %bb.0:
497 ; X64-NEXT:    movl %edi, %eax
498 ; X64-NEXT:    andb $12, %al
499 ; X64-NEXT:    shlb $4, %al
500 ; X64-NEXT:    # kill: def $al killed $al killed $eax
501 ; X64-NEXT:    retq
502   %t0 = and i8 %a0, 28
503   %t1 = shl i8 %t0, 4
504   ret i8 %t1
507 define i8 @test_i8_224_mask_shl_1(i8 %a0) {
508 ; X32-LABEL: test_i8_224_mask_shl_1:
509 ; X32:       # %bb.0:
510 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
511 ; X32-NEXT:    andb $96, %al
512 ; X32-NEXT:    addb %al, %al
513 ; X32-NEXT:    retl
515 ; X64-LABEL: test_i8_224_mask_shl_1:
516 ; X64:       # %bb.0:
517 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
518 ; X64-NEXT:    andb $96, %dil
519 ; X64-NEXT:    leal (%rdi,%rdi), %eax
520 ; X64-NEXT:    # kill: def $al killed $al killed $eax
521 ; X64-NEXT:    retq
522   %t0 = and i8 %a0, 224
523   %t1 = shl i8 %t0, 1
524   ret i8 %t1
527 ;------------------------------------------------------------------------------;
528 ; 16-bit
529 ;------------------------------------------------------------------------------;
531 ; lshr
533 define i16 @test_i16_127_mask_lshr_1(i16 %a0) {
534 ; X32-LABEL: test_i16_127_mask_lshr_1:
535 ; X32:       # %bb.0:
536 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
537 ; X32-NEXT:    andl $126, %eax
538 ; X32-NEXT:    shrl %eax
539 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
540 ; X32-NEXT:    retl
542 ; X64-LABEL: test_i16_127_mask_lshr_1:
543 ; X64:       # %bb.0:
544 ; X64-NEXT:    movl %edi, %eax
545 ; X64-NEXT:    andl $126, %eax
546 ; X64-NEXT:    shrl %eax
547 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
548 ; X64-NEXT:    retq
549   %t0 = and i16 %a0, 127
550   %t1 = lshr i16 %t0, 1
551   ret i16 %t1
554 define i16 @test_i16_2032_mask_lshr_3(i16 %a0) {
555 ; X32-LABEL: test_i16_2032_mask_lshr_3:
556 ; X32:       # %bb.0:
557 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
558 ; X32-NEXT:    andl $2032, %eax # imm = 0x7F0
559 ; X32-NEXT:    shrl $3, %eax
560 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
561 ; X32-NEXT:    retl
563 ; X64-LABEL: test_i16_2032_mask_lshr_3:
564 ; X64:       # %bb.0:
565 ; X64-NEXT:    movl %edi, %eax
566 ; X64-NEXT:    andl $2032, %eax # imm = 0x7F0
567 ; X64-NEXT:    shrl $3, %eax
568 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
569 ; X64-NEXT:    retq
570   %t0 = and i16 %a0, 2032
571   %t1 = lshr i16 %t0, 3
572   ret i16 %t1
574 define i16 @test_i16_2032_mask_lshr_4(i16 %a0) {
575 ; X32-LABEL: test_i16_2032_mask_lshr_4:
576 ; X32:       # %bb.0:
577 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
578 ; X32-NEXT:    shrl $4, %eax
579 ; X32-NEXT:    andl $127, %eax
580 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
581 ; X32-NEXT:    retl
583 ; X64-LABEL: test_i16_2032_mask_lshr_4:
584 ; X64:       # %bb.0:
585 ; X64-NEXT:    movl %edi, %eax
586 ; X64-NEXT:    shrl $4, %eax
587 ; X64-NEXT:    andl $127, %eax
588 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
589 ; X64-NEXT:    retq
590   %t0 = and i16 %a0, 2032
591   %t1 = lshr i16 %t0, 4
592   ret i16 %t1
594 define i16 @test_i16_2032_mask_lshr_5(i16 %a0) {
595 ; X32-LABEL: test_i16_2032_mask_lshr_5:
596 ; X32:       # %bb.0:
597 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
598 ; X32-NEXT:    shrl $5, %eax
599 ; X32-NEXT:    andl $63, %eax
600 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
601 ; X32-NEXT:    retl
603 ; X64-LABEL: test_i16_2032_mask_lshr_5:
604 ; X64:       # %bb.0:
605 ; X64-NEXT:    movl %edi, %eax
606 ; X64-NEXT:    shrl $5, %eax
607 ; X64-NEXT:    andl $63, %eax
608 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
609 ; X64-NEXT:    retq
610   %t0 = and i16 %a0, 2032
611   %t1 = lshr i16 %t0, 5
612   ret i16 %t1
614 define i16 @test_i16_2032_mask_lshr_6(i16 %a0) {
615 ; X32-LABEL: test_i16_2032_mask_lshr_6:
616 ; X32:       # %bb.0:
617 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
618 ; X32-NEXT:    shrl $6, %eax
619 ; X32-NEXT:    andl $31, %eax
620 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
621 ; X32-NEXT:    retl
623 ; X64-LABEL: test_i16_2032_mask_lshr_6:
624 ; X64:       # %bb.0:
625 ; X64-NEXT:    movl %edi, %eax
626 ; X64-NEXT:    shrl $6, %eax
627 ; X64-NEXT:    andl $31, %eax
628 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
629 ; X64-NEXT:    retq
630   %t0 = and i16 %a0, 2032
631   %t1 = lshr i16 %t0, 6
632   ret i16 %t1
635 define i16 @test_i16_65024_mask_lshr_1(i16 %a0) {
636 ; X32-LABEL: test_i16_65024_mask_lshr_1:
637 ; X32:       # %bb.0:
638 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
639 ; X32-NEXT:    andl $65024, %eax # imm = 0xFE00
640 ; X32-NEXT:    shrl %eax
641 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
642 ; X32-NEXT:    retl
644 ; X64-LABEL: test_i16_65024_mask_lshr_1:
645 ; X64:       # %bb.0:
646 ; X64-NEXT:    movl %edi, %eax
647 ; X64-NEXT:    andl $65024, %eax # imm = 0xFE00
648 ; X64-NEXT:    shrl %eax
649 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
650 ; X64-NEXT:    retq
651   %t0 = and i16 %a0, 65024
652   %t1 = lshr i16 %t0, 1
653   ret i16 %t1
655 define i16 @test_i16_65024_mask_lshr_8(i16 %a0) {
656 ; X32-LABEL: test_i16_65024_mask_lshr_8:
657 ; X32:       # %bb.0:
658 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
659 ; X32-NEXT:    andl $65024, %eax # imm = 0xFE00
660 ; X32-NEXT:    shrl $8, %eax
661 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
662 ; X32-NEXT:    retl
664 ; X64-LABEL: test_i16_65024_mask_lshr_8:
665 ; X64:       # %bb.0:
666 ; X64-NEXT:    movl %edi, %eax
667 ; X64-NEXT:    andl $65024, %eax # imm = 0xFE00
668 ; X64-NEXT:    shrl $8, %eax
669 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
670 ; X64-NEXT:    retq
671   %t0 = and i16 %a0, 65024
672   %t1 = lshr i16 %t0, 8
673   ret i16 %t1
675 define i16 @test_i16_65024_mask_lshr_9(i16 %a0) {
676 ; X32-LABEL: test_i16_65024_mask_lshr_9:
677 ; X32:       # %bb.0:
678 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
679 ; X32-NEXT:    shrl $9, %eax
680 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
681 ; X32-NEXT:    retl
683 ; X64-LABEL: test_i16_65024_mask_lshr_9:
684 ; X64:       # %bb.0:
685 ; X64-NEXT:    movzwl %di, %eax
686 ; X64-NEXT:    shrl $9, %eax
687 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
688 ; X64-NEXT:    retq
689   %t0 = and i16 %a0, 65024
690   %t1 = lshr i16 %t0, 9
691   ret i16 %t1
693 define i16 @test_i16_65024_mask_lshr_10(i16 %a0) {
694 ; X32-LABEL: test_i16_65024_mask_lshr_10:
695 ; X32:       # %bb.0:
696 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
697 ; X32-NEXT:    shrl $10, %eax
698 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
699 ; X32-NEXT:    retl
701 ; X64-LABEL: test_i16_65024_mask_lshr_10:
702 ; X64:       # %bb.0:
703 ; X64-NEXT:    movzwl %di, %eax
704 ; X64-NEXT:    shrl $10, %eax
705 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
706 ; X64-NEXT:    retq
707   %t0 = and i16 %a0, 65024
708   %t1 = lshr i16 %t0, 10
709   ret i16 %t1
712 ; ashr
714 define i16 @test_i16_127_mask_ashr_1(i16 %a0) {
715 ; X32-LABEL: test_i16_127_mask_ashr_1:
716 ; X32:       # %bb.0:
717 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
718 ; X32-NEXT:    andl $126, %eax
719 ; X32-NEXT:    shrl %eax
720 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
721 ; X32-NEXT:    retl
723 ; X64-LABEL: test_i16_127_mask_ashr_1:
724 ; X64:       # %bb.0:
725 ; X64-NEXT:    movl %edi, %eax
726 ; X64-NEXT:    andl $126, %eax
727 ; X64-NEXT:    shrl %eax
728 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
729 ; X64-NEXT:    retq
730   %t0 = and i16 %a0, 127
731   %t1 = ashr i16 %t0, 1
732   ret i16 %t1
735 define i16 @test_i16_2032_mask_ashr_3(i16 %a0) {
736 ; X32-LABEL: test_i16_2032_mask_ashr_3:
737 ; X32:       # %bb.0:
738 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
739 ; X32-NEXT:    andl $2032, %eax # imm = 0x7F0
740 ; X32-NEXT:    shrl $3, %eax
741 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
742 ; X32-NEXT:    retl
744 ; X64-LABEL: test_i16_2032_mask_ashr_3:
745 ; X64:       # %bb.0:
746 ; X64-NEXT:    movl %edi, %eax
747 ; X64-NEXT:    andl $2032, %eax # imm = 0x7F0
748 ; X64-NEXT:    shrl $3, %eax
749 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
750 ; X64-NEXT:    retq
751   %t0 = and i16 %a0, 2032
752   %t1 = ashr i16 %t0, 3
753   ret i16 %t1
755 define i16 @test_i16_2032_mask_ashr_4(i16 %a0) {
756 ; X32-LABEL: test_i16_2032_mask_ashr_4:
757 ; X32:       # %bb.0:
758 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
759 ; X32-NEXT:    shrl $4, %eax
760 ; X32-NEXT:    andl $127, %eax
761 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
762 ; X32-NEXT:    retl
764 ; X64-LABEL: test_i16_2032_mask_ashr_4:
765 ; X64:       # %bb.0:
766 ; X64-NEXT:    movl %edi, %eax
767 ; X64-NEXT:    shrl $4, %eax
768 ; X64-NEXT:    andl $127, %eax
769 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
770 ; X64-NEXT:    retq
771   %t0 = and i16 %a0, 2032
772   %t1 = ashr i16 %t0, 4
773   ret i16 %t1
775 define i16 @test_i16_2032_mask_ashr_5(i16 %a0) {
776 ; X32-LABEL: test_i16_2032_mask_ashr_5:
777 ; X32:       # %bb.0:
778 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
779 ; X32-NEXT:    shrl $5, %eax
780 ; X32-NEXT:    andl $63, %eax
781 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
782 ; X32-NEXT:    retl
784 ; X64-LABEL: test_i16_2032_mask_ashr_5:
785 ; X64:       # %bb.0:
786 ; X64-NEXT:    movl %edi, %eax
787 ; X64-NEXT:    shrl $5, %eax
788 ; X64-NEXT:    andl $63, %eax
789 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
790 ; X64-NEXT:    retq
791   %t0 = and i16 %a0, 2032
792   %t1 = ashr i16 %t0, 5
793   ret i16 %t1
795 define i16 @test_i16_2032_mask_ashr_6(i16 %a0) {
796 ; X32-LABEL: test_i16_2032_mask_ashr_6:
797 ; X32:       # %bb.0:
798 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
799 ; X32-NEXT:    shrl $6, %eax
800 ; X32-NEXT:    andl $31, %eax
801 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
802 ; X32-NEXT:    retl
804 ; X64-LABEL: test_i16_2032_mask_ashr_6:
805 ; X64:       # %bb.0:
806 ; X64-NEXT:    movl %edi, %eax
807 ; X64-NEXT:    shrl $6, %eax
808 ; X64-NEXT:    andl $31, %eax
809 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
810 ; X64-NEXT:    retq
811   %t0 = and i16 %a0, 2032
812   %t1 = ashr i16 %t0, 6
813   ret i16 %t1
816 define i16 @test_i16_65024_mask_ashr_1(i16 %a0) {
817 ; X32-LABEL: test_i16_65024_mask_ashr_1:
818 ; X32:       # %bb.0:
819 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
820 ; X32-NEXT:    andl $65024, %eax # imm = 0xFE00
821 ; X32-NEXT:    cwtl
822 ; X32-NEXT:    shrl %eax
823 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
824 ; X32-NEXT:    retl
826 ; X64-LABEL: test_i16_65024_mask_ashr_1:
827 ; X64:       # %bb.0:
828 ; X64-NEXT:    andl $65024, %edi # imm = 0xFE00
829 ; X64-NEXT:    movswl %di, %eax
830 ; X64-NEXT:    shrl %eax
831 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
832 ; X64-NEXT:    retq
833   %t0 = and i16 %a0, 65024
834   %t1 = ashr i16 %t0, 1
835   ret i16 %t1
837 define i16 @test_i16_65024_mask_ashr_8(i16 %a0) {
838 ; X32-LABEL: test_i16_65024_mask_ashr_8:
839 ; X32:       # %bb.0:
840 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
841 ; X32-NEXT:    andl $65024, %eax # imm = 0xFE00
842 ; X32-NEXT:    cwtl
843 ; X32-NEXT:    shrl $8, %eax
844 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
845 ; X32-NEXT:    retl
847 ; X64-LABEL: test_i16_65024_mask_ashr_8:
848 ; X64:       # %bb.0:
849 ; X64-NEXT:    andl $65024, %edi # imm = 0xFE00
850 ; X64-NEXT:    movswl %di, %eax
851 ; X64-NEXT:    shrl $8, %eax
852 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
853 ; X64-NEXT:    retq
854   %t0 = and i16 %a0, 65024
855   %t1 = ashr i16 %t0, 8
856   ret i16 %t1
858 define i16 @test_i16_65024_mask_ashr_9(i16 %a0) {
859 ; X32-LABEL: test_i16_65024_mask_ashr_9:
860 ; X32:       # %bb.0:
861 ; X32-NEXT:    movswl {{[0-9]+}}(%esp), %eax
862 ; X32-NEXT:    shrl $9, %eax
863 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
864 ; X32-NEXT:    retl
866 ; X64-LABEL: test_i16_65024_mask_ashr_9:
867 ; X64:       # %bb.0:
868 ; X64-NEXT:    movswl %di, %eax
869 ; X64-NEXT:    shrl $9, %eax
870 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
871 ; X64-NEXT:    retq
872   %t0 = and i16 %a0, 65024
873   %t1 = ashr i16 %t0, 9
874   ret i16 %t1
876 define i16 @test_i16_65024_mask_ashr_10(i16 %a0) {
877 ; X32-LABEL: test_i16_65024_mask_ashr_10:
878 ; X32:       # %bb.0:
879 ; X32-NEXT:    movswl {{[0-9]+}}(%esp), %eax
880 ; X32-NEXT:    shrl $10, %eax
881 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
882 ; X32-NEXT:    retl
884 ; X64-LABEL: test_i16_65024_mask_ashr_10:
885 ; X64:       # %bb.0:
886 ; X64-NEXT:    movswl %di, %eax
887 ; X64-NEXT:    shrl $10, %eax
888 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
889 ; X64-NEXT:    retq
890   %t0 = and i16 %a0, 65024
891   %t1 = ashr i16 %t0, 10
892   ret i16 %t1
895 ; shl
897 define i16 @test_i16_127_mask_shl_1(i16 %a0) {
898 ; X32-LABEL: test_i16_127_mask_shl_1:
899 ; X32:       # %bb.0:
900 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
901 ; X32-NEXT:    andl $127, %eax
902 ; X32-NEXT:    addl %eax, %eax
903 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
904 ; X32-NEXT:    retl
906 ; X64-LABEL: test_i16_127_mask_shl_1:
907 ; X64:       # %bb.0:
908 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
909 ; X64-NEXT:    andl $127, %edi
910 ; X64-NEXT:    leal (%rdi,%rdi), %eax
911 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
912 ; X64-NEXT:    retq
913   %t0 = and i16 %a0, 127
914   %t1 = shl i16 %t0, 1
915   ret i16 %t1
917 define i16 @test_i16_127_mask_shl_8(i16 %a0) {
918 ; X32-LABEL: test_i16_127_mask_shl_8:
919 ; X32:       # %bb.0:
920 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
921 ; X32-NEXT:    andl $127, %eax
922 ; X32-NEXT:    shll $8, %eax
923 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
924 ; X32-NEXT:    retl
926 ; X64-LABEL: test_i16_127_mask_shl_8:
927 ; X64:       # %bb.0:
928 ; X64-NEXT:    movl %edi, %eax
929 ; X64-NEXT:    andl $127, %eax
930 ; X64-NEXT:    shll $8, %eax
931 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
932 ; X64-NEXT:    retq
933   %t0 = and i16 %a0, 127
934   %t1 = shl i16 %t0, 8
935   ret i16 %t1
937 define i16 @test_i16_127_mask_shl_9(i16 %a0) {
938 ; X32-LABEL: test_i16_127_mask_shl_9:
939 ; X32:       # %bb.0:
940 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
941 ; X32-NEXT:    shll $9, %eax
942 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
943 ; X32-NEXT:    retl
945 ; X64-LABEL: test_i16_127_mask_shl_9:
946 ; X64:       # %bb.0:
947 ; X64-NEXT:    movl %edi, %eax
948 ; X64-NEXT:    shll $9, %eax
949 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
950 ; X64-NEXT:    retq
951   %t0 = and i16 %a0, 127
952   %t1 = shl i16 %t0, 9
953   ret i16 %t1
955 define i16 @test_i16_127_mask_shl_10(i16 %a0) {
956 ; X32-LABEL: test_i16_127_mask_shl_10:
957 ; X32:       # %bb.0:
958 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
959 ; X32-NEXT:    shll $10, %eax
960 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
961 ; X32-NEXT:    retl
963 ; X64-LABEL: test_i16_127_mask_shl_10:
964 ; X64:       # %bb.0:
965 ; X64-NEXT:    movl %edi, %eax
966 ; X64-NEXT:    shll $10, %eax
967 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
968 ; X64-NEXT:    retq
969   %t0 = and i16 %a0, 127
970   %t1 = shl i16 %t0, 10
971   ret i16 %t1
974 define i16 @test_i16_2032_mask_shl_3(i16 %a0) {
975 ; X32-LABEL: test_i16_2032_mask_shl_3:
976 ; X32:       # %bb.0:
977 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
978 ; X32-NEXT:    andl $2032, %eax # imm = 0x7F0
979 ; X32-NEXT:    shll $3, %eax
980 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
981 ; X32-NEXT:    retl
983 ; X64-LABEL: test_i16_2032_mask_shl_3:
984 ; X64:       # %bb.0:
985 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
986 ; X64-NEXT:    andl $2032, %edi # imm = 0x7F0
987 ; X64-NEXT:    leal (,%rdi,8), %eax
988 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
989 ; X64-NEXT:    retq
990   %t0 = and i16 %a0, 2032
991   %t1 = shl i16 %t0, 3
992   ret i16 %t1
994 define i16 @test_i16_2032_mask_shl_4(i16 %a0) {
995 ; X32-LABEL: test_i16_2032_mask_shl_4:
996 ; X32:       # %bb.0:
997 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
998 ; X32-NEXT:    andl $2032, %eax # imm = 0x7F0
999 ; X32-NEXT:    shll $4, %eax
1000 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
1001 ; X32-NEXT:    retl
1003 ; X64-LABEL: test_i16_2032_mask_shl_4:
1004 ; X64:       # %bb.0:
1005 ; X64-NEXT:    movl %edi, %eax
1006 ; X64-NEXT:    andl $2032, %eax # imm = 0x7F0
1007 ; X64-NEXT:    shll $4, %eax
1008 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
1009 ; X64-NEXT:    retq
1010   %t0 = and i16 %a0, 2032
1011   %t1 = shl i16 %t0, 4
1012   ret i16 %t1
1014 define i16 @test_i16_2032_mask_shl_5(i16 %a0) {
1015 ; X32-LABEL: test_i16_2032_mask_shl_5:
1016 ; X32:       # %bb.0:
1017 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1018 ; X32-NEXT:    andl $2032, %eax # imm = 0x7F0
1019 ; X32-NEXT:    shll $5, %eax
1020 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
1021 ; X32-NEXT:    retl
1023 ; X64-LABEL: test_i16_2032_mask_shl_5:
1024 ; X64:       # %bb.0:
1025 ; X64-NEXT:    movl %edi, %eax
1026 ; X64-NEXT:    andl $2032, %eax # imm = 0x7F0
1027 ; X64-NEXT:    shll $5, %eax
1028 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
1029 ; X64-NEXT:    retq
1030   %t0 = and i16 %a0, 2032
1031   %t1 = shl i16 %t0, 5
1032   ret i16 %t1
1034 define i16 @test_i16_2032_mask_shl_6(i16 %a0) {
1035 ; X32-LABEL: test_i16_2032_mask_shl_6:
1036 ; X32:       # %bb.0:
1037 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1038 ; X32-NEXT:    andl $1008, %eax # imm = 0x3F0
1039 ; X32-NEXT:    shll $6, %eax
1040 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
1041 ; X32-NEXT:    retl
1043 ; X64-LABEL: test_i16_2032_mask_shl_6:
1044 ; X64:       # %bb.0:
1045 ; X64-NEXT:    movl %edi, %eax
1046 ; X64-NEXT:    andl $1008, %eax # imm = 0x3F0
1047 ; X64-NEXT:    shll $6, %eax
1048 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
1049 ; X64-NEXT:    retq
1050   %t0 = and i16 %a0, 2032
1051   %t1 = shl i16 %t0, 6
1052   ret i16 %t1
1055 define i16 @test_i16_65024_mask_shl_1(i16 %a0) {
1056 ; X32-LABEL: test_i16_65024_mask_shl_1:
1057 ; X32:       # %bb.0:
1058 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1059 ; X32-NEXT:    andl $32256, %eax # imm = 0x7E00
1060 ; X32-NEXT:    addl %eax, %eax
1061 ; X32-NEXT:    # kill: def $ax killed $ax killed $eax
1062 ; X32-NEXT:    retl
1064 ; X64-LABEL: test_i16_65024_mask_shl_1:
1065 ; X64:       # %bb.0:
1066 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
1067 ; X64-NEXT:    andl $32256, %edi # imm = 0x7E00
1068 ; X64-NEXT:    leal (%rdi,%rdi), %eax
1069 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
1070 ; X64-NEXT:    retq
1071   %t0 = and i16 %a0, 65024
1072   %t1 = shl i16 %t0, 1
1073   ret i16 %t1
1076 ;------------------------------------------------------------------------------;
1077 ; 32-bit
1078 ;------------------------------------------------------------------------------;
1080 ; lshr
1082 define i32 @test_i32_32767_mask_lshr_1(i32 %a0) {
1083 ; X32-LABEL: test_i32_32767_mask_lshr_1:
1084 ; X32:       # %bb.0:
1085 ; X32-NEXT:    movl $32766, %eax # imm = 0x7FFE
1086 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1087 ; X32-NEXT:    shrl %eax
1088 ; X32-NEXT:    retl
1090 ; X64-LABEL: test_i32_32767_mask_lshr_1:
1091 ; X64:       # %bb.0:
1092 ; X64-NEXT:    movl %edi, %eax
1093 ; X64-NEXT:    andl $32766, %eax # imm = 0x7FFE
1094 ; X64-NEXT:    shrl %eax
1095 ; X64-NEXT:    retq
1096   %t0 = and i32 %a0, 32767
1097   %t1 = lshr i32 %t0, 1
1098   ret i32 %t1
1101 define i32 @test_i32_8388352_mask_lshr_7(i32 %a0) {
1102 ; X32-LABEL: test_i32_8388352_mask_lshr_7:
1103 ; X32:       # %bb.0:
1104 ; X32-NEXT:    movl $8388352, %eax # imm = 0x7FFF00
1105 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1106 ; X32-NEXT:    shrl $7, %eax
1107 ; X32-NEXT:    retl
1109 ; X64-LABEL: test_i32_8388352_mask_lshr_7:
1110 ; X64:       # %bb.0:
1111 ; X64-NEXT:    movl %edi, %eax
1112 ; X64-NEXT:    andl $8388352, %eax # imm = 0x7FFF00
1113 ; X64-NEXT:    shrl $7, %eax
1114 ; X64-NEXT:    retq
1115   %t0 = and i32 %a0, 8388352
1116   %t1 = lshr i32 %t0, 7
1117   ret i32 %t1
1119 define i32 @test_i32_8388352_mask_lshr_8(i32 %a0) {
1120 ; X32-LABEL: test_i32_8388352_mask_lshr_8:
1121 ; X32:       # %bb.0:
1122 ; X32-NEXT:    movl $8388352, %eax # imm = 0x7FFF00
1123 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1124 ; X32-NEXT:    shrl $8, %eax
1125 ; X32-NEXT:    retl
1127 ; X64-LABEL: test_i32_8388352_mask_lshr_8:
1128 ; X64:       # %bb.0:
1129 ; X64-NEXT:    movl %edi, %eax
1130 ; X64-NEXT:    andl $8388352, %eax # imm = 0x7FFF00
1131 ; X64-NEXT:    shrl $8, %eax
1132 ; X64-NEXT:    retq
1133   %t0 = and i32 %a0, 8388352
1134   %t1 = lshr i32 %t0, 8
1135   ret i32 %t1
1137 define i32 @test_i32_8388352_mask_lshr_9(i32 %a0) {
1138 ; X32-LABEL: test_i32_8388352_mask_lshr_9:
1139 ; X32:       # %bb.0:
1140 ; X32-NEXT:    movl $8388096, %eax # imm = 0x7FFE00
1141 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1142 ; X32-NEXT:    shrl $9, %eax
1143 ; X32-NEXT:    retl
1145 ; X64-LABEL: test_i32_8388352_mask_lshr_9:
1146 ; X64:       # %bb.0:
1147 ; X64-NEXT:    movl %edi, %eax
1148 ; X64-NEXT:    andl $8388096, %eax # imm = 0x7FFE00
1149 ; X64-NEXT:    shrl $9, %eax
1150 ; X64-NEXT:    retq
1151   %t0 = and i32 %a0, 8388352
1152   %t1 = lshr i32 %t0, 9
1153   ret i32 %t1
1155 define i32 @test_i32_8388352_mask_lshr_10(i32 %a0) {
1156 ; X32-LABEL: test_i32_8388352_mask_lshr_10:
1157 ; X32:       # %bb.0:
1158 ; X32-NEXT:    movl $8387584, %eax # imm = 0x7FFC00
1159 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1160 ; X32-NEXT:    shrl $10, %eax
1161 ; X32-NEXT:    retl
1163 ; X64-LABEL: test_i32_8388352_mask_lshr_10:
1164 ; X64:       # %bb.0:
1165 ; X64-NEXT:    movl %edi, %eax
1166 ; X64-NEXT:    andl $8387584, %eax # imm = 0x7FFC00
1167 ; X64-NEXT:    shrl $10, %eax
1168 ; X64-NEXT:    retq
1169   %t0 = and i32 %a0, 8388352
1170   %t1 = lshr i32 %t0, 10
1171   ret i32 %t1
1174 define i32 @test_i32_4294836224_mask_lshr_1(i32 %a0) {
1175 ; X32-LABEL: test_i32_4294836224_mask_lshr_1:
1176 ; X32:       # %bb.0:
1177 ; X32-NEXT:    movl $-131072, %eax # imm = 0xFFFE0000
1178 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1179 ; X32-NEXT:    shrl %eax
1180 ; X32-NEXT:    retl
1182 ; X64-LABEL: test_i32_4294836224_mask_lshr_1:
1183 ; X64:       # %bb.0:
1184 ; X64-NEXT:    movl %edi, %eax
1185 ; X64-NEXT:    andl $-131072, %eax # imm = 0xFFFE0000
1186 ; X64-NEXT:    shrl %eax
1187 ; X64-NEXT:    retq
1188   %t0 = and i32 %a0, 4294836224
1189   %t1 = lshr i32 %t0, 1
1190   ret i32 %t1
1192 define i32 @test_i32_4294836224_mask_lshr_16(i32 %a0) {
1193 ; X32-LABEL: test_i32_4294836224_mask_lshr_16:
1194 ; X32:       # %bb.0:
1195 ; X32-NEXT:    movl $-131072, %eax # imm = 0xFFFE0000
1196 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1197 ; X32-NEXT:    shrl $16, %eax
1198 ; X32-NEXT:    retl
1200 ; X64-LABEL: test_i32_4294836224_mask_lshr_16:
1201 ; X64:       # %bb.0:
1202 ; X64-NEXT:    movl %edi, %eax
1203 ; X64-NEXT:    andl $-131072, %eax # imm = 0xFFFE0000
1204 ; X64-NEXT:    shrl $16, %eax
1205 ; X64-NEXT:    retq
1206   %t0 = and i32 %a0, 4294836224
1207   %t1 = lshr i32 %t0, 16
1208   ret i32 %t1
1210 define i32 @test_i32_4294836224_mask_lshr_17(i32 %a0) {
1211 ; X32-LABEL: test_i32_4294836224_mask_lshr_17:
1212 ; X32:       # %bb.0:
1213 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1214 ; X32-NEXT:    shrl $17, %eax
1215 ; X32-NEXT:    retl
1217 ; X64-LABEL: test_i32_4294836224_mask_lshr_17:
1218 ; X64:       # %bb.0:
1219 ; X64-NEXT:    movl %edi, %eax
1220 ; X64-NEXT:    shrl $17, %eax
1221 ; X64-NEXT:    retq
1222   %t0 = and i32 %a0, 4294836224
1223   %t1 = lshr i32 %t0, 17
1224   ret i32 %t1
1226 define i32 @test_i32_4294836224_mask_lshr_18(i32 %a0) {
1227 ; X32-LABEL: test_i32_4294836224_mask_lshr_18:
1228 ; X32:       # %bb.0:
1229 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1230 ; X32-NEXT:    shrl $18, %eax
1231 ; X32-NEXT:    retl
1233 ; X64-LABEL: test_i32_4294836224_mask_lshr_18:
1234 ; X64:       # %bb.0:
1235 ; X64-NEXT:    movl %edi, %eax
1236 ; X64-NEXT:    shrl $18, %eax
1237 ; X64-NEXT:    retq
1238   %t0 = and i32 %a0, 4294836224
1239   %t1 = lshr i32 %t0, 18
1240   ret i32 %t1
1243 ; ashr
1245 define i32 @test_i32_32767_mask_ashr_1(i32 %a0) {
1246 ; X32-LABEL: test_i32_32767_mask_ashr_1:
1247 ; X32:       # %bb.0:
1248 ; X32-NEXT:    movl $32766, %eax # imm = 0x7FFE
1249 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1250 ; X32-NEXT:    shrl %eax
1251 ; X32-NEXT:    retl
1253 ; X64-LABEL: test_i32_32767_mask_ashr_1:
1254 ; X64:       # %bb.0:
1255 ; X64-NEXT:    movl %edi, %eax
1256 ; X64-NEXT:    andl $32766, %eax # imm = 0x7FFE
1257 ; X64-NEXT:    shrl %eax
1258 ; X64-NEXT:    retq
1259   %t0 = and i32 %a0, 32767
1260   %t1 = ashr i32 %t0, 1
1261   ret i32 %t1
1264 define i32 @test_i32_8388352_mask_ashr_7(i32 %a0) {
1265 ; X32-LABEL: test_i32_8388352_mask_ashr_7:
1266 ; X32:       # %bb.0:
1267 ; X32-NEXT:    movl $8388352, %eax # imm = 0x7FFF00
1268 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1269 ; X32-NEXT:    shrl $7, %eax
1270 ; X32-NEXT:    retl
1272 ; X64-LABEL: test_i32_8388352_mask_ashr_7:
1273 ; X64:       # %bb.0:
1274 ; X64-NEXT:    movl %edi, %eax
1275 ; X64-NEXT:    andl $8388352, %eax # imm = 0x7FFF00
1276 ; X64-NEXT:    shrl $7, %eax
1277 ; X64-NEXT:    retq
1278   %t0 = and i32 %a0, 8388352
1279   %t1 = ashr i32 %t0, 7
1280   ret i32 %t1
1282 define i32 @test_i32_8388352_mask_ashr_8(i32 %a0) {
1283 ; X32-LABEL: test_i32_8388352_mask_ashr_8:
1284 ; X32:       # %bb.0:
1285 ; X32-NEXT:    movl $8388352, %eax # imm = 0x7FFF00
1286 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1287 ; X32-NEXT:    shrl $8, %eax
1288 ; X32-NEXT:    retl
1290 ; X64-LABEL: test_i32_8388352_mask_ashr_8:
1291 ; X64:       # %bb.0:
1292 ; X64-NEXT:    movl %edi, %eax
1293 ; X64-NEXT:    andl $8388352, %eax # imm = 0x7FFF00
1294 ; X64-NEXT:    shrl $8, %eax
1295 ; X64-NEXT:    retq
1296   %t0 = and i32 %a0, 8388352
1297   %t1 = ashr i32 %t0, 8
1298   ret i32 %t1
1300 define i32 @test_i32_8388352_mask_ashr_9(i32 %a0) {
1301 ; X32-LABEL: test_i32_8388352_mask_ashr_9:
1302 ; X32:       # %bb.0:
1303 ; X32-NEXT:    movl $8388096, %eax # imm = 0x7FFE00
1304 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1305 ; X32-NEXT:    shrl $9, %eax
1306 ; X32-NEXT:    retl
1308 ; X64-LABEL: test_i32_8388352_mask_ashr_9:
1309 ; X64:       # %bb.0:
1310 ; X64-NEXT:    movl %edi, %eax
1311 ; X64-NEXT:    andl $8388096, %eax # imm = 0x7FFE00
1312 ; X64-NEXT:    shrl $9, %eax
1313 ; X64-NEXT:    retq
1314   %t0 = and i32 %a0, 8388352
1315   %t1 = ashr i32 %t0, 9
1316   ret i32 %t1
1318 define i32 @test_i32_8388352_mask_ashr_10(i32 %a0) {
1319 ; X32-LABEL: test_i32_8388352_mask_ashr_10:
1320 ; X32:       # %bb.0:
1321 ; X32-NEXT:    movl $8387584, %eax # imm = 0x7FFC00
1322 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1323 ; X32-NEXT:    shrl $10, %eax
1324 ; X32-NEXT:    retl
1326 ; X64-LABEL: test_i32_8388352_mask_ashr_10:
1327 ; X64:       # %bb.0:
1328 ; X64-NEXT:    movl %edi, %eax
1329 ; X64-NEXT:    andl $8387584, %eax # imm = 0x7FFC00
1330 ; X64-NEXT:    shrl $10, %eax
1331 ; X64-NEXT:    retq
1332   %t0 = and i32 %a0, 8388352
1333   %t1 = ashr i32 %t0, 10
1334   ret i32 %t1
1337 define i32 @test_i32_4294836224_mask_ashr_1(i32 %a0) {
1338 ; X32-LABEL: test_i32_4294836224_mask_ashr_1:
1339 ; X32:       # %bb.0:
1340 ; X32-NEXT:    movl $-131072, %eax # imm = 0xFFFE0000
1341 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1342 ; X32-NEXT:    sarl %eax
1343 ; X32-NEXT:    retl
1345 ; X64-LABEL: test_i32_4294836224_mask_ashr_1:
1346 ; X64:       # %bb.0:
1347 ; X64-NEXT:    movl %edi, %eax
1348 ; X64-NEXT:    andl $-131072, %eax # imm = 0xFFFE0000
1349 ; X64-NEXT:    sarl %eax
1350 ; X64-NEXT:    retq
1351   %t0 = and i32 %a0, 4294836224
1352   %t1 = ashr i32 %t0, 1
1353   ret i32 %t1
1355 define i32 @test_i32_4294836224_mask_ashr_16(i32 %a0) {
1356 ; X32-LABEL: test_i32_4294836224_mask_ashr_16:
1357 ; X32:       # %bb.0:
1358 ; X32-NEXT:    movl $-131072, %eax # imm = 0xFFFE0000
1359 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1360 ; X32-NEXT:    sarl $16, %eax
1361 ; X32-NEXT:    retl
1363 ; X64-LABEL: test_i32_4294836224_mask_ashr_16:
1364 ; X64:       # %bb.0:
1365 ; X64-NEXT:    movl %edi, %eax
1366 ; X64-NEXT:    andl $-131072, %eax # imm = 0xFFFE0000
1367 ; X64-NEXT:    sarl $16, %eax
1368 ; X64-NEXT:    retq
1369   %t0 = and i32 %a0, 4294836224
1370   %t1 = ashr i32 %t0, 16
1371   ret i32 %t1
1373 define i32 @test_i32_4294836224_mask_ashr_17(i32 %a0) {
1374 ; X32-LABEL: test_i32_4294836224_mask_ashr_17:
1375 ; X32:       # %bb.0:
1376 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1377 ; X32-NEXT:    sarl $17, %eax
1378 ; X32-NEXT:    retl
1380 ; X64-LABEL: test_i32_4294836224_mask_ashr_17:
1381 ; X64:       # %bb.0:
1382 ; X64-NEXT:    movl %edi, %eax
1383 ; X64-NEXT:    sarl $17, %eax
1384 ; X64-NEXT:    retq
1385   %t0 = and i32 %a0, 4294836224
1386   %t1 = ashr i32 %t0, 17
1387   ret i32 %t1
1389 define i32 @test_i32_4294836224_mask_ashr_18(i32 %a0) {
1390 ; X32-LABEL: test_i32_4294836224_mask_ashr_18:
1391 ; X32:       # %bb.0:
1392 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1393 ; X32-NEXT:    sarl $18, %eax
1394 ; X32-NEXT:    retl
1396 ; X64-LABEL: test_i32_4294836224_mask_ashr_18:
1397 ; X64:       # %bb.0:
1398 ; X64-NEXT:    movl %edi, %eax
1399 ; X64-NEXT:    sarl $18, %eax
1400 ; X64-NEXT:    retq
1401   %t0 = and i32 %a0, 4294836224
1402   %t1 = ashr i32 %t0, 18
1403   ret i32 %t1
1406 ; shl
1408 define i32 @test_i32_32767_mask_shl_1(i32 %a0) {
1409 ; X32-LABEL: test_i32_32767_mask_shl_1:
1410 ; X32:       # %bb.0:
1411 ; X32-NEXT:    movl $32767, %eax # imm = 0x7FFF
1412 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1413 ; X32-NEXT:    addl %eax, %eax
1414 ; X32-NEXT:    retl
1416 ; X64-LABEL: test_i32_32767_mask_shl_1:
1417 ; X64:       # %bb.0:
1418 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
1419 ; X64-NEXT:    andl $32767, %edi # imm = 0x7FFF
1420 ; X64-NEXT:    leal (%rdi,%rdi), %eax
1421 ; X64-NEXT:    retq
1422   %t0 = and i32 %a0, 32767
1423   %t1 = shl i32 %t0, 1
1424   ret i32 %t1
1426 define i32 @test_i32_32767_mask_shl_16(i32 %a0) {
1427 ; X32-LABEL: test_i32_32767_mask_shl_16:
1428 ; X32:       # %bb.0:
1429 ; X32-NEXT:    movl $32767, %eax # imm = 0x7FFF
1430 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1431 ; X32-NEXT:    shll $16, %eax
1432 ; X32-NEXT:    retl
1434 ; X64-LABEL: test_i32_32767_mask_shl_16:
1435 ; X64:       # %bb.0:
1436 ; X64-NEXT:    movl %edi, %eax
1437 ; X64-NEXT:    andl $32767, %eax # imm = 0x7FFF
1438 ; X64-NEXT:    shll $16, %eax
1439 ; X64-NEXT:    retq
1440   %t0 = and i32 %a0, 32767
1441   %t1 = shl i32 %t0, 16
1442   ret i32 %t1
1444 define i32 @test_i32_32767_mask_shl_17(i32 %a0) {
1445 ; X32-LABEL: test_i32_32767_mask_shl_17:
1446 ; X32:       # %bb.0:
1447 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1448 ; X32-NEXT:    shll $17, %eax
1449 ; X32-NEXT:    retl
1451 ; X64-LABEL: test_i32_32767_mask_shl_17:
1452 ; X64:       # %bb.0:
1453 ; X64-NEXT:    movl %edi, %eax
1454 ; X64-NEXT:    shll $17, %eax
1455 ; X64-NEXT:    retq
1456   %t0 = and i32 %a0, 32767
1457   %t1 = shl i32 %t0, 17
1458   ret i32 %t1
1460 define i32 @test_i32_32767_mask_shl_18(i32 %a0) {
1461 ; X32-LABEL: test_i32_32767_mask_shl_18:
1462 ; X32:       # %bb.0:
1463 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1464 ; X32-NEXT:    shll $18, %eax
1465 ; X32-NEXT:    retl
1467 ; X64-LABEL: test_i32_32767_mask_shl_18:
1468 ; X64:       # %bb.0:
1469 ; X64-NEXT:    movl %edi, %eax
1470 ; X64-NEXT:    shll $18, %eax
1471 ; X64-NEXT:    retq
1472   %t0 = and i32 %a0, 32767
1473   %t1 = shl i32 %t0, 18
1474   ret i32 %t1
1477 define i32 @test_i32_8388352_mask_shl_7(i32 %a0) {
1478 ; X32-LABEL: test_i32_8388352_mask_shl_7:
1479 ; X32:       # %bb.0:
1480 ; X32-NEXT:    movl $8388352, %eax # imm = 0x7FFF00
1481 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1482 ; X32-NEXT:    shll $7, %eax
1483 ; X32-NEXT:    retl
1485 ; X64-LABEL: test_i32_8388352_mask_shl_7:
1486 ; X64:       # %bb.0:
1487 ; X64-NEXT:    movl %edi, %eax
1488 ; X64-NEXT:    andl $8388352, %eax # imm = 0x7FFF00
1489 ; X64-NEXT:    shll $7, %eax
1490 ; X64-NEXT:    retq
1491   %t0 = and i32 %a0, 8388352
1492   %t1 = shl i32 %t0, 7
1493   ret i32 %t1
1495 define i32 @test_i32_8388352_mask_shl_8(i32 %a0) {
1496 ; X32-LABEL: test_i32_8388352_mask_shl_8:
1497 ; X32:       # %bb.0:
1498 ; X32-NEXT:    movl $8388352, %eax # imm = 0x7FFF00
1499 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1500 ; X32-NEXT:    shll $8, %eax
1501 ; X32-NEXT:    retl
1503 ; X64-LABEL: test_i32_8388352_mask_shl_8:
1504 ; X64:       # %bb.0:
1505 ; X64-NEXT:    movl %edi, %eax
1506 ; X64-NEXT:    andl $8388352, %eax # imm = 0x7FFF00
1507 ; X64-NEXT:    shll $8, %eax
1508 ; X64-NEXT:    retq
1509   %t0 = and i32 %a0, 8388352
1510   %t1 = shl i32 %t0, 8
1511   ret i32 %t1
1513 define i32 @test_i32_8388352_mask_shl_9(i32 %a0) {
1514 ; X32-LABEL: test_i32_8388352_mask_shl_9:
1515 ; X32:       # %bb.0:
1516 ; X32-NEXT:    movl $8388352, %eax # imm = 0x7FFF00
1517 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1518 ; X32-NEXT:    shll $9, %eax
1519 ; X32-NEXT:    retl
1521 ; X64-LABEL: test_i32_8388352_mask_shl_9:
1522 ; X64:       # %bb.0:
1523 ; X64-NEXT:    movl %edi, %eax
1524 ; X64-NEXT:    andl $8388352, %eax # imm = 0x7FFF00
1525 ; X64-NEXT:    shll $9, %eax
1526 ; X64-NEXT:    retq
1527   %t0 = and i32 %a0, 8388352
1528   %t1 = shl i32 %t0, 9
1529   ret i32 %t1
1531 define i32 @test_i32_8388352_mask_shl_10(i32 %a0) {
1532 ; X32-LABEL: test_i32_8388352_mask_shl_10:
1533 ; X32:       # %bb.0:
1534 ; X32-NEXT:    movl $4194048, %eax # imm = 0x3FFF00
1535 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1536 ; X32-NEXT:    shll $10, %eax
1537 ; X32-NEXT:    retl
1539 ; X64-LABEL: test_i32_8388352_mask_shl_10:
1540 ; X64:       # %bb.0:
1541 ; X64-NEXT:    movl %edi, %eax
1542 ; X64-NEXT:    andl $4194048, %eax # imm = 0x3FFF00
1543 ; X64-NEXT:    shll $10, %eax
1544 ; X64-NEXT:    retq
1545   %t0 = and i32 %a0, 8388352
1546   %t1 = shl i32 %t0, 10
1547   ret i32 %t1
1550 define i32 @test_i32_4294836224_mask_shl_1(i32 %a0) {
1551 ; X32-LABEL: test_i32_4294836224_mask_shl_1:
1552 ; X32:       # %bb.0:
1553 ; X32-NEXT:    movl $2147352576, %eax # imm = 0x7FFE0000
1554 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1555 ; X32-NEXT:    addl %eax, %eax
1556 ; X32-NEXT:    retl
1558 ; X64-LABEL: test_i32_4294836224_mask_shl_1:
1559 ; X64:       # %bb.0:
1560 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
1561 ; X64-NEXT:    andl $2147352576, %edi # imm = 0x7FFE0000
1562 ; X64-NEXT:    leal (%rdi,%rdi), %eax
1563 ; X64-NEXT:    retq
1564   %t0 = and i32 %a0, 4294836224
1565   %t1 = shl i32 %t0, 1
1566   ret i32 %t1
1569 ;------------------------------------------------------------------------------;
1570 ; 64-bit
1571 ;------------------------------------------------------------------------------;
1573 ; lshr
1575 define i64 @test_i64_2147483647_mask_lshr_1(i64 %a0) {
1576 ; X32-LABEL: test_i64_2147483647_mask_lshr_1:
1577 ; X32:       # %bb.0:
1578 ; X32-NEXT:    movl $2147483646, %eax # imm = 0x7FFFFFFE
1579 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1580 ; X32-NEXT:    shrl %eax
1581 ; X32-NEXT:    xorl %edx, %edx
1582 ; X32-NEXT:    retl
1584 ; X64-LABEL: test_i64_2147483647_mask_lshr_1:
1585 ; X64:       # %bb.0:
1586 ; X64-NEXT:    movq %rdi, %rax
1587 ; X64-NEXT:    andl $2147483646, %eax # imm = 0x7FFFFFFE
1588 ; X64-NEXT:    shrq %rax
1589 ; X64-NEXT:    retq
1590   %t0 = and i64 %a0, 2147483647
1591   %t1 = lshr i64 %t0, 1
1592   ret i64 %t1
1595 define i64 @test_i64_140737488289792_mask_lshr_15(i64 %a0) {
1596 ; X32-LABEL: test_i64_140737488289792_mask_lshr_15:
1597 ; X32:       # %bb.0:
1598 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
1599 ; X32-NEXT:    shll $16, %ecx
1600 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1601 ; X32-NEXT:    shldl $17, %ecx, %eax
1602 ; X32-NEXT:    xorl %edx, %edx
1603 ; X32-NEXT:    retl
1605 ; X64-LABEL: test_i64_140737488289792_mask_lshr_15:
1606 ; X64:       # %bb.0:
1607 ; X64-NEXT:    movabsq $140737488289792, %rax # imm = 0x7FFFFFFF0000
1608 ; X64-NEXT:    andq %rdi, %rax
1609 ; X64-NEXT:    shrq $15, %rax
1610 ; X64-NEXT:    retq
1611   %t0 = and i64 %a0, 140737488289792
1612   %t1 = lshr i64 %t0, 15
1613   ret i64 %t1
1615 define i64 @test_i64_140737488289792_mask_lshr_16(i64 %a0) {
1616 ; X32-LABEL: test_i64_140737488289792_mask_lshr_16:
1617 ; X32:       # %bb.0:
1618 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
1619 ; X32-NEXT:    movl $32767, %eax # imm = 0x7FFF
1620 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1621 ; X32-NEXT:    shll $16, %eax
1622 ; X32-NEXT:    orl %ecx, %eax
1623 ; X32-NEXT:    xorl %edx, %edx
1624 ; X32-NEXT:    retl
1626 ; X64-LABEL: test_i64_140737488289792_mask_lshr_16:
1627 ; X64:       # %bb.0:
1628 ; X64-NEXT:    movq %rdi, %rax
1629 ; X64-NEXT:    shrq $16, %rax
1630 ; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1631 ; X64-NEXT:    retq
1632   %t0 = and i64 %a0, 140737488289792
1633   %t1 = lshr i64 %t0, 16
1634   ret i64 %t1
1636 define i64 @test_i64_140737488289792_mask_lshr_17(i64 %a0) {
1637 ; X32-LABEL: test_i64_140737488289792_mask_lshr_17:
1638 ; X32:       # %bb.0:
1639 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1640 ; X32-NEXT:    movl $32767, %eax # imm = 0x7FFF
1641 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1642 ; X32-NEXT:    shldl $15, %ecx, %eax
1643 ; X32-NEXT:    xorl %edx, %edx
1644 ; X32-NEXT:    retl
1646 ; X64-LABEL: test_i64_140737488289792_mask_lshr_17:
1647 ; X64:       # %bb.0:
1648 ; X64-NEXT:    movq %rdi, %rax
1649 ; X64-NEXT:    shrq $17, %rax
1650 ; X64-NEXT:    andl $1073741823, %eax # imm = 0x3FFFFFFF
1651 ; X64-NEXT:    retq
1652   %t0 = and i64 %a0, 140737488289792
1653   %t1 = lshr i64 %t0, 17
1654   ret i64 %t1
1656 define i64 @test_i64_140737488289792_mask_lshr_18(i64 %a0) {
1657 ; X32-LABEL: test_i64_140737488289792_mask_lshr_18:
1658 ; X32:       # %bb.0:
1659 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1660 ; X32-NEXT:    movl $32767, %eax # imm = 0x7FFF
1661 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1662 ; X32-NEXT:    shldl $14, %ecx, %eax
1663 ; X32-NEXT:    xorl %edx, %edx
1664 ; X32-NEXT:    retl
1666 ; X64-LABEL: test_i64_140737488289792_mask_lshr_18:
1667 ; X64:       # %bb.0:
1668 ; X64-NEXT:    movq %rdi, %rax
1669 ; X64-NEXT:    shrq $18, %rax
1670 ; X64-NEXT:    andl $536870911, %eax # imm = 0x1FFFFFFF
1671 ; X64-NEXT:    retq
1672   %t0 = and i64 %a0, 140737488289792
1673   %t1 = lshr i64 %t0, 18
1674   ret i64 %t1
1677 define i64 @test_i64_18446744065119617024_mask_lshr_1(i64 %a0) {
1678 ; X32-LABEL: test_i64_18446744065119617024_mask_lshr_1:
1679 ; X32:       # %bb.0:
1680 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
1681 ; X32-NEXT:    shrl %edx
1682 ; X32-NEXT:    xorl %eax, %eax
1683 ; X32-NEXT:    retl
1685 ; X64-LABEL: test_i64_18446744065119617024_mask_lshr_1:
1686 ; X64:       # %bb.0:
1687 ; X64-NEXT:    movabsq $-8589934592, %rax # imm = 0xFFFFFFFE00000000
1688 ; X64-NEXT:    andq %rdi, %rax
1689 ; X64-NEXT:    shrq %rax
1690 ; X64-NEXT:    retq
1691   %t0 = and i64 %a0, 18446744065119617024
1692   %t1 = lshr i64 %t0, 1
1693   ret i64 %t1
1695 define i64 @test_i64_18446744065119617024_mask_lshr_32(i64 %a0) {
1696 ; X32-LABEL: test_i64_18446744065119617024_mask_lshr_32:
1697 ; X32:       # %bb.0:
1698 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1699 ; X32-NEXT:    andl $-2, %eax
1700 ; X32-NEXT:    xorl %edx, %edx
1701 ; X32-NEXT:    retl
1703 ; X64-LABEL: test_i64_18446744065119617024_mask_lshr_32:
1704 ; X64:       # %bb.0:
1705 ; X64-NEXT:    movabsq $-8589934592, %rax # imm = 0xFFFFFFFE00000000
1706 ; X64-NEXT:    andq %rdi, %rax
1707 ; X64-NEXT:    shrq $32, %rax
1708 ; X64-NEXT:    retq
1709   %t0 = and i64 %a0, 18446744065119617024
1710   %t1 = lshr i64 %t0, 32
1711   ret i64 %t1
1713 define i64 @test_i64_18446744065119617024_mask_lshr_33(i64 %a0) {
1714 ; X32-LABEL: test_i64_18446744065119617024_mask_lshr_33:
1715 ; X32:       # %bb.0:
1716 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1717 ; X32-NEXT:    shrl %eax
1718 ; X32-NEXT:    xorl %edx, %edx
1719 ; X32-NEXT:    retl
1721 ; X64-LABEL: test_i64_18446744065119617024_mask_lshr_33:
1722 ; X64:       # %bb.0:
1723 ; X64-NEXT:    movq %rdi, %rax
1724 ; X64-NEXT:    shrq $33, %rax
1725 ; X64-NEXT:    retq
1726   %t0 = and i64 %a0, 18446744065119617024
1727   %t1 = lshr i64 %t0, 33
1728   ret i64 %t1
1730 define i64 @test_i64_18446744065119617024_mask_lshr_34(i64 %a0) {
1731 ; X32-LABEL: test_i64_18446744065119617024_mask_lshr_34:
1732 ; X32:       # %bb.0:
1733 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1734 ; X32-NEXT:    shrl $2, %eax
1735 ; X32-NEXT:    xorl %edx, %edx
1736 ; X32-NEXT:    retl
1738 ; X64-LABEL: test_i64_18446744065119617024_mask_lshr_34:
1739 ; X64:       # %bb.0:
1740 ; X64-NEXT:    movq %rdi, %rax
1741 ; X64-NEXT:    shrq $34, %rax
1742 ; X64-NEXT:    retq
1743   %t0 = and i64 %a0, 18446744065119617024
1744   %t1 = lshr i64 %t0, 34
1745   ret i64 %t1
1748 ; ashr
1750 define i64 @test_i64_2147483647_mask_ashr_1(i64 %a0) {
1751 ; X32-LABEL: test_i64_2147483647_mask_ashr_1:
1752 ; X32:       # %bb.0:
1753 ; X32-NEXT:    movl $2147483646, %eax # imm = 0x7FFFFFFE
1754 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1755 ; X32-NEXT:    shrl %eax
1756 ; X32-NEXT:    xorl %edx, %edx
1757 ; X32-NEXT:    retl
1759 ; X64-LABEL: test_i64_2147483647_mask_ashr_1:
1760 ; X64:       # %bb.0:
1761 ; X64-NEXT:    movq %rdi, %rax
1762 ; X64-NEXT:    andl $2147483646, %eax # imm = 0x7FFFFFFE
1763 ; X64-NEXT:    shrq %rax
1764 ; X64-NEXT:    retq
1765   %t0 = and i64 %a0, 2147483647
1766   %t1 = ashr i64 %t0, 1
1767   ret i64 %t1
1770 define i64 @test_i64_140737488289792_mask_ashr_15(i64 %a0) {
1771 ; X32-LABEL: test_i64_140737488289792_mask_ashr_15:
1772 ; X32:       # %bb.0:
1773 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
1774 ; X32-NEXT:    shll $16, %ecx
1775 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1776 ; X32-NEXT:    shldl $17, %ecx, %eax
1777 ; X32-NEXT:    xorl %edx, %edx
1778 ; X32-NEXT:    retl
1780 ; X64-LABEL: test_i64_140737488289792_mask_ashr_15:
1781 ; X64:       # %bb.0:
1782 ; X64-NEXT:    movabsq $140737488289792, %rax # imm = 0x7FFFFFFF0000
1783 ; X64-NEXT:    andq %rdi, %rax
1784 ; X64-NEXT:    shrq $15, %rax
1785 ; X64-NEXT:    retq
1786   %t0 = and i64 %a0, 140737488289792
1787   %t1 = ashr i64 %t0, 15
1788   ret i64 %t1
1790 define i64 @test_i64_140737488289792_mask_ashr_16(i64 %a0) {
1791 ; X32-LABEL: test_i64_140737488289792_mask_ashr_16:
1792 ; X32:       # %bb.0:
1793 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
1794 ; X32-NEXT:    movl $32767, %eax # imm = 0x7FFF
1795 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1796 ; X32-NEXT:    shll $16, %eax
1797 ; X32-NEXT:    orl %ecx, %eax
1798 ; X32-NEXT:    xorl %edx, %edx
1799 ; X32-NEXT:    retl
1801 ; X64-LABEL: test_i64_140737488289792_mask_ashr_16:
1802 ; X64:       # %bb.0:
1803 ; X64-NEXT:    movq %rdi, %rax
1804 ; X64-NEXT:    shrq $16, %rax
1805 ; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1806 ; X64-NEXT:    retq
1807   %t0 = and i64 %a0, 140737488289792
1808   %t1 = ashr i64 %t0, 16
1809   ret i64 %t1
1811 define i64 @test_i64_140737488289792_mask_ashr_17(i64 %a0) {
1812 ; X32-LABEL: test_i64_140737488289792_mask_ashr_17:
1813 ; X32:       # %bb.0:
1814 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1815 ; X32-NEXT:    movl $32767, %eax # imm = 0x7FFF
1816 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1817 ; X32-NEXT:    shldl $15, %ecx, %eax
1818 ; X32-NEXT:    xorl %edx, %edx
1819 ; X32-NEXT:    retl
1821 ; X64-LABEL: test_i64_140737488289792_mask_ashr_17:
1822 ; X64:       # %bb.0:
1823 ; X64-NEXT:    movq %rdi, %rax
1824 ; X64-NEXT:    shrq $17, %rax
1825 ; X64-NEXT:    andl $1073741823, %eax # imm = 0x3FFFFFFF
1826 ; X64-NEXT:    retq
1827   %t0 = and i64 %a0, 140737488289792
1828   %t1 = ashr i64 %t0, 17
1829   ret i64 %t1
1831 define i64 @test_i64_140737488289792_mask_ashr_18(i64 %a0) {
1832 ; X32-LABEL: test_i64_140737488289792_mask_ashr_18:
1833 ; X32:       # %bb.0:
1834 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1835 ; X32-NEXT:    movl $32767, %eax # imm = 0x7FFF
1836 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
1837 ; X32-NEXT:    shldl $14, %ecx, %eax
1838 ; X32-NEXT:    xorl %edx, %edx
1839 ; X32-NEXT:    retl
1841 ; X64-LABEL: test_i64_140737488289792_mask_ashr_18:
1842 ; X64:       # %bb.0:
1843 ; X64-NEXT:    movq %rdi, %rax
1844 ; X64-NEXT:    shrq $18, %rax
1845 ; X64-NEXT:    andl $536870911, %eax # imm = 0x1FFFFFFF
1846 ; X64-NEXT:    retq
1847   %t0 = and i64 %a0, 140737488289792
1848   %t1 = ashr i64 %t0, 18
1849   ret i64 %t1
1852 define i64 @test_i64_18446744065119617024_mask_ashr_1(i64 %a0) {
1853 ; X32-LABEL: test_i64_18446744065119617024_mask_ashr_1:
1854 ; X32:       # %bb.0:
1855 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
1856 ; X32-NEXT:    sarl %edx
1857 ; X32-NEXT:    xorl %eax, %eax
1858 ; X32-NEXT:    retl
1860 ; X64-LABEL: test_i64_18446744065119617024_mask_ashr_1:
1861 ; X64:       # %bb.0:
1862 ; X64-NEXT:    movabsq $-8589934592, %rax # imm = 0xFFFFFFFE00000000
1863 ; X64-NEXT:    andq %rdi, %rax
1864 ; X64-NEXT:    sarq %rax
1865 ; X64-NEXT:    retq
1866   %t0 = and i64 %a0, 18446744065119617024
1867   %t1 = ashr i64 %t0, 1
1868   ret i64 %t1
1870 define i64 @test_i64_18446744065119617024_mask_ashr_32(i64 %a0) {
1871 ; X32-LABEL: test_i64_18446744065119617024_mask_ashr_32:
1872 ; X32:       # %bb.0:
1873 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1874 ; X32-NEXT:    andl $-2, %eax
1875 ; X32-NEXT:    movl %eax, %edx
1876 ; X32-NEXT:    sarl $31, %edx
1877 ; X32-NEXT:    retl
1879 ; X64-LABEL: test_i64_18446744065119617024_mask_ashr_32:
1880 ; X64:       # %bb.0:
1881 ; X64-NEXT:    movabsq $-8589934592, %rax # imm = 0xFFFFFFFE00000000
1882 ; X64-NEXT:    andq %rdi, %rax
1883 ; X64-NEXT:    sarq $32, %rax
1884 ; X64-NEXT:    retq
1885   %t0 = and i64 %a0, 18446744065119617024
1886   %t1 = ashr i64 %t0, 32
1887   ret i64 %t1
1889 define i64 @test_i64_18446744065119617024_mask_ashr_33(i64 %a0) {
1890 ; X32-LABEL: test_i64_18446744065119617024_mask_ashr_33:
1891 ; X32:       # %bb.0:
1892 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
1893 ; X32-NEXT:    movl %edx, %eax
1894 ; X32-NEXT:    sarl %eax
1895 ; X32-NEXT:    sarl $31, %edx
1896 ; X32-NEXT:    retl
1898 ; X64-LABEL: test_i64_18446744065119617024_mask_ashr_33:
1899 ; X64:       # %bb.0:
1900 ; X64-NEXT:    movq %rdi, %rax
1901 ; X64-NEXT:    sarq $33, %rax
1902 ; X64-NEXT:    retq
1903   %t0 = and i64 %a0, 18446744065119617024
1904   %t1 = ashr i64 %t0, 33
1905   ret i64 %t1
1907 define i64 @test_i64_18446744065119617024_mask_ashr_34(i64 %a0) {
1908 ; X32-LABEL: test_i64_18446744065119617024_mask_ashr_34:
1909 ; X32:       # %bb.0:
1910 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
1911 ; X32-NEXT:    movl %edx, %eax
1912 ; X32-NEXT:    sarl $2, %eax
1913 ; X32-NEXT:    sarl $31, %edx
1914 ; X32-NEXT:    retl
1916 ; X64-LABEL: test_i64_18446744065119617024_mask_ashr_34:
1917 ; X64:       # %bb.0:
1918 ; X64-NEXT:    movq %rdi, %rax
1919 ; X64-NEXT:    sarq $34, %rax
1920 ; X64-NEXT:    retq
1921   %t0 = and i64 %a0, 18446744065119617024
1922   %t1 = ashr i64 %t0, 34
1923   ret i64 %t1
1926 ; shl
1928 define i64 @test_i64_2147483647_mask_shl_1(i64 %a0) {
1929 ; X32-LABEL: test_i64_2147483647_mask_shl_1:
1930 ; X32:       # %bb.0:
1931 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
1932 ; X32-NEXT:    addl %eax, %eax
1933 ; X32-NEXT:    xorl %edx, %edx
1934 ; X32-NEXT:    retl
1936 ; X64-LABEL: test_i64_2147483647_mask_shl_1:
1937 ; X64:       # %bb.0:
1938 ; X64-NEXT:    andl $2147483647, %edi # imm = 0x7FFFFFFF
1939 ; X64-NEXT:    leaq (%rdi,%rdi), %rax
1940 ; X64-NEXT:    retq
1941   %t0 = and i64 %a0, 2147483647
1942   %t1 = shl i64 %t0, 1
1943   ret i64 %t1
1945 define i64 @test_i64_2147483647_mask_shl_32(i64 %a0) {
1946 ; X32-LABEL: test_i64_2147483647_mask_shl_32:
1947 ; X32:       # %bb.0:
1948 ; X32-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
1949 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %edx
1950 ; X32-NEXT:    xorl %eax, %eax
1951 ; X32-NEXT:    retl
1953 ; X64-LABEL: test_i64_2147483647_mask_shl_32:
1954 ; X64:       # %bb.0:
1955 ; X64-NEXT:    movq %rdi, %rax
1956 ; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1957 ; X64-NEXT:    shlq $32, %rax
1958 ; X64-NEXT:    retq
1959   %t0 = and i64 %a0, 2147483647
1960   %t1 = shl i64 %t0, 32
1961   ret i64 %t1
1963 define i64 @test_i64_2147483647_mask_shl_33(i64 %a0) {
1964 ; X32-LABEL: test_i64_2147483647_mask_shl_33:
1965 ; X32:       # %bb.0:
1966 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
1967 ; X32-NEXT:    addl %edx, %edx
1968 ; X32-NEXT:    xorl %eax, %eax
1969 ; X32-NEXT:    retl
1971 ; X64-LABEL: test_i64_2147483647_mask_shl_33:
1972 ; X64:       # %bb.0:
1973 ; X64-NEXT:    movq %rdi, %rax
1974 ; X64-NEXT:    shlq $33, %rax
1975 ; X64-NEXT:    retq
1976   %t0 = and i64 %a0, 2147483647
1977   %t1 = shl i64 %t0, 33
1978   ret i64 %t1
1980 define i64 @test_i64_2147483647_mask_shl_34(i64 %a0) {
1981 ; X32-LABEL: test_i64_2147483647_mask_shl_34:
1982 ; X32:       # %bb.0:
1983 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
1984 ; X32-NEXT:    shll $2, %edx
1985 ; X32-NEXT:    xorl %eax, %eax
1986 ; X32-NEXT:    retl
1988 ; X64-LABEL: test_i64_2147483647_mask_shl_34:
1989 ; X64:       # %bb.0:
1990 ; X64-NEXT:    movq %rdi, %rax
1991 ; X64-NEXT:    shlq $34, %rax
1992 ; X64-NEXT:    retq
1993   %t0 = and i64 %a0, 2147483647
1994   %t1 = shl i64 %t0, 34
1995   ret i64 %t1
1998 define i64 @test_i64_140737488289792_mask_shl_15(i64 %a0) {
1999 ; X32-LABEL: test_i64_140737488289792_mask_shl_15:
2000 ; X32:       # %bb.0:
2001 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2002 ; X32-NEXT:    movl %eax, %ecx
2003 ; X32-NEXT:    shll $16, %ecx
2004 ; X32-NEXT:    movl $32767, %edx # imm = 0x7FFF
2005 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %edx
2006 ; X32-NEXT:    shldl $15, %ecx, %edx
2007 ; X32-NEXT:    shll $31, %eax
2008 ; X32-NEXT:    retl
2010 ; X64-LABEL: test_i64_140737488289792_mask_shl_15:
2011 ; X64:       # %bb.0:
2012 ; X64-NEXT:    movabsq $140737488289792, %rax # imm = 0x7FFFFFFF0000
2013 ; X64-NEXT:    andq %rdi, %rax
2014 ; X64-NEXT:    shlq $15, %rax
2015 ; X64-NEXT:    retq
2016   %t0 = and i64 %a0, 140737488289792
2017   %t1 = shl i64 %t0, 15
2018   ret i64 %t1
2020 define i64 @test_i64_140737488289792_mask_shl_16(i64 %a0) {
2021 ; X32-LABEL: test_i64_140737488289792_mask_shl_16:
2022 ; X32:       # %bb.0:
2023 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2024 ; X32-NEXT:    shll $16, %eax
2025 ; X32-NEXT:    movl $32767, %edx # imm = 0x7FFF
2026 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %edx
2027 ; X32-NEXT:    shldl $16, %eax, %edx
2028 ; X32-NEXT:    xorl %eax, %eax
2029 ; X32-NEXT:    retl
2031 ; X64-LABEL: test_i64_140737488289792_mask_shl_16:
2032 ; X64:       # %bb.0:
2033 ; X64-NEXT:    movabsq $140737488289792, %rax # imm = 0x7FFFFFFF0000
2034 ; X64-NEXT:    andq %rdi, %rax
2035 ; X64-NEXT:    shlq $16, %rax
2036 ; X64-NEXT:    retq
2037   %t0 = and i64 %a0, 140737488289792
2038   %t1 = shl i64 %t0, 16
2039   ret i64 %t1
2041 define i64 @test_i64_140737488289792_mask_shl_17(i64 %a0) {
2042 ; X32-LABEL: test_i64_140737488289792_mask_shl_17:
2043 ; X32:       # %bb.0:
2044 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2045 ; X32-NEXT:    shll $16, %eax
2046 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
2047 ; X32-NEXT:    shldl $17, %eax, %edx
2048 ; X32-NEXT:    xorl %eax, %eax
2049 ; X32-NEXT:    retl
2051 ; X64-LABEL: test_i64_140737488289792_mask_shl_17:
2052 ; X64:       # %bb.0:
2053 ; X64-NEXT:    movabsq $140737488289792, %rax # imm = 0x7FFFFFFF0000
2054 ; X64-NEXT:    andq %rdi, %rax
2055 ; X64-NEXT:    shlq $17, %rax
2056 ; X64-NEXT:    retq
2057   %t0 = and i64 %a0, 140737488289792
2058   %t1 = shl i64 %t0, 17
2059   ret i64 %t1
2061 define i64 @test_i64_140737488289792_mask_shl_18(i64 %a0) {
2062 ; X32-LABEL: test_i64_140737488289792_mask_shl_18:
2063 ; X32:       # %bb.0:
2064 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2065 ; X32-NEXT:    shll $16, %eax
2066 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
2067 ; X32-NEXT:    shldl $18, %eax, %edx
2068 ; X32-NEXT:    xorl %eax, %eax
2069 ; X32-NEXT:    retl
2071 ; X64-LABEL: test_i64_140737488289792_mask_shl_18:
2072 ; X64:       # %bb.0:
2073 ; X64-NEXT:    movabsq $70368744112128, %rax # imm = 0x3FFFFFFF0000
2074 ; X64-NEXT:    andq %rdi, %rax
2075 ; X64-NEXT:    shlq $18, %rax
2076 ; X64-NEXT:    retq
2077   %t0 = and i64 %a0, 140737488289792
2078   %t1 = shl i64 %t0, 18
2079   ret i64 %t1
2082 define i64 @test_i64_18446744065119617024_mask_shl_1(i64 %a0) {
2083 ; X32-LABEL: test_i64_18446744065119617024_mask_shl_1:
2084 ; X32:       # %bb.0:
2085 ; X32-NEXT:    movl $2147483646, %edx # imm = 0x7FFFFFFE
2086 ; X32-NEXT:    andl {{[0-9]+}}(%esp), %edx
2087 ; X32-NEXT:    addl %edx, %edx
2088 ; X32-NEXT:    xorl %eax, %eax
2089 ; X32-NEXT:    retl
2091 ; X64-LABEL: test_i64_18446744065119617024_mask_shl_1:
2092 ; X64:       # %bb.0:
2093 ; X64-NEXT:    movabsq $9223372028264841216, %rax # imm = 0x7FFFFFFE00000000
2094 ; X64-NEXT:    andq %rdi, %rax
2095 ; X64-NEXT:    addq %rax, %rax
2096 ; X64-NEXT:    retq
2097   %t0 = and i64 %a0, 18446744065119617024
2098   %t1 = shl i64 %t0, 1
2099   ret i64 %t1