xref: /llvm-project/llvm/test/CodeGen/X86/64-bit-shift-by-32-minus-y.ll (revision ce4459d5903fe53065f4c198cd71be6e514475c2)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown              | FileCheck %s --check-prefixes=X64-NOBMI2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi2 | FileCheck %s --check-prefixes=X64-BMI2
4; RUN: llc < %s -mtriple=i686-unknown-unknown                | FileCheck %s --check-prefixes=X86-NOBMI2
5; RUN: llc < %s -mtriple=i686-unknown-unknown   -mattr=+bmi2 | FileCheck %s --check-prefixes=X86-BMI2
6
7define i64 @t0(i64 %val, i64 %shamt) nounwind {
8; X64-NOBMI2-LABEL: t0:
9; X64-NOBMI2:       # %bb.0:
10; X64-NOBMI2-NEXT:    movq %rdi, %rax
11; X64-NOBMI2-NEXT:    leaq 32(%rsi), %rcx
12; X64-NOBMI2-NEXT:    negq %rcx
13; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx
14; X64-NOBMI2-NEXT:    shlq %cl, %rax
15; X64-NOBMI2-NEXT:    retq
16;
17; X64-BMI2-LABEL: t0:
18; X64-BMI2:       # %bb.0:
19; X64-BMI2-NEXT:    addq $32, %rsi
20; X64-BMI2-NEXT:    negq %rsi
21; X64-BMI2-NEXT:    shlxq %rsi, %rdi, %rax
22; X64-BMI2-NEXT:    retq
23;
24; X86-NOBMI2-LABEL: t0:
25; X86-NOBMI2:       # %bb.0:
26; X86-NOBMI2-NEXT:    pushl %esi
27; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
28; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
29; X86-NOBMI2-NEXT:    movb $32, %cl
30; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
31; X86-NOBMI2-NEXT:    movl %esi, %eax
32; X86-NOBMI2-NEXT:    shll %cl, %eax
33; X86-NOBMI2-NEXT:    shldl %cl, %esi, %edx
34; X86-NOBMI2-NEXT:    testb $32, %cl
35; X86-NOBMI2-NEXT:    je .LBB0_2
36; X86-NOBMI2-NEXT:  # %bb.1:
37; X86-NOBMI2-NEXT:    movl %eax, %edx
38; X86-NOBMI2-NEXT:    xorl %eax, %eax
39; X86-NOBMI2-NEXT:  .LBB0_2:
40; X86-NOBMI2-NEXT:    popl %esi
41; X86-NOBMI2-NEXT:    retl
42;
43; X86-BMI2-LABEL: t0:
44; X86-BMI2:       # %bb.0:
45; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
46; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
47; X86-BMI2-NEXT:    movb $32, %cl
48; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
49; X86-BMI2-NEXT:    shldl %cl, %eax, %edx
50; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax
51; X86-BMI2-NEXT:    testb $32, %cl
52; X86-BMI2-NEXT:    je .LBB0_2
53; X86-BMI2-NEXT:  # %bb.1:
54; X86-BMI2-NEXT:    movl %eax, %edx
55; X86-BMI2-NEXT:    xorl %eax, %eax
56; X86-BMI2-NEXT:  .LBB0_2:
57; X86-BMI2-NEXT:    retl
58  %negshamt = sub i64 32, %shamt
59  %shifted = shl i64 %val, %negshamt
60  ret i64 %shifted
61}
62
63; The constant we are subtracting from should be a multiple of 32.
64define i64 @n1(i64 %val, i64 %shamt) nounwind {
65; X64-NOBMI2-LABEL: n1:
66; X64-NOBMI2:       # %bb.0:
67; X64-NOBMI2-NEXT:    movq %rdi, %rax
68; X64-NOBMI2-NEXT:    movb $33, %cl
69; X64-NOBMI2-NEXT:    subb %sil, %cl
70; X64-NOBMI2-NEXT:    shlq %cl, %rax
71; X64-NOBMI2-NEXT:    retq
72;
73; X64-BMI2-LABEL: n1:
74; X64-BMI2:       # %bb.0:
75; X64-BMI2-NEXT:    movb $33, %al
76; X64-BMI2-NEXT:    subb %sil, %al
77; X64-BMI2-NEXT:    shlxq %rax, %rdi, %rax
78; X64-BMI2-NEXT:    retq
79;
80; X86-NOBMI2-LABEL: n1:
81; X86-NOBMI2:       # %bb.0:
82; X86-NOBMI2-NEXT:    pushl %esi
83; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
84; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
85; X86-NOBMI2-NEXT:    movb $33, %cl
86; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
87; X86-NOBMI2-NEXT:    movl %esi, %eax
88; X86-NOBMI2-NEXT:    shll %cl, %eax
89; X86-NOBMI2-NEXT:    shldl %cl, %esi, %edx
90; X86-NOBMI2-NEXT:    testb $32, %cl
91; X86-NOBMI2-NEXT:    je .LBB1_2
92; X86-NOBMI2-NEXT:  # %bb.1:
93; X86-NOBMI2-NEXT:    movl %eax, %edx
94; X86-NOBMI2-NEXT:    xorl %eax, %eax
95; X86-NOBMI2-NEXT:  .LBB1_2:
96; X86-NOBMI2-NEXT:    popl %esi
97; X86-NOBMI2-NEXT:    retl
98;
99; X86-BMI2-LABEL: n1:
100; X86-BMI2:       # %bb.0:
101; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
102; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
103; X86-BMI2-NEXT:    movb $33, %cl
104; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
105; X86-BMI2-NEXT:    shldl %cl, %eax, %edx
106; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax
107; X86-BMI2-NEXT:    testb $32, %cl
108; X86-BMI2-NEXT:    je .LBB1_2
109; X86-BMI2-NEXT:  # %bb.1:
110; X86-BMI2-NEXT:    movl %eax, %edx
111; X86-BMI2-NEXT:    xorl %eax, %eax
112; X86-BMI2-NEXT:  .LBB1_2:
113; X86-BMI2-NEXT:    retl
114  %negshamt = sub i64 33, %shamt
115  %shifted = shl i64 %val, %negshamt
116  ret i64 %shifted
117}
118define i64 @n2(i64 %val, i64 %shamt) nounwind {
119; X64-NOBMI2-LABEL: n2:
120; X64-NOBMI2:       # %bb.0:
121; X64-NOBMI2-NEXT:    movq %rdi, %rax
122; X64-NOBMI2-NEXT:    movb $31, %cl
123; X64-NOBMI2-NEXT:    subb %sil, %cl
124; X64-NOBMI2-NEXT:    shlq %cl, %rax
125; X64-NOBMI2-NEXT:    retq
126;
127; X64-BMI2-LABEL: n2:
128; X64-BMI2:       # %bb.0:
129; X64-BMI2-NEXT:    movb $31, %al
130; X64-BMI2-NEXT:    subb %sil, %al
131; X64-BMI2-NEXT:    shlxq %rax, %rdi, %rax
132; X64-BMI2-NEXT:    retq
133;
134; X86-NOBMI2-LABEL: n2:
135; X86-NOBMI2:       # %bb.0:
136; X86-NOBMI2-NEXT:    pushl %esi
137; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
138; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
139; X86-NOBMI2-NEXT:    movb $31, %cl
140; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
141; X86-NOBMI2-NEXT:    movl %esi, %eax
142; X86-NOBMI2-NEXT:    shll %cl, %eax
143; X86-NOBMI2-NEXT:    shldl %cl, %esi, %edx
144; X86-NOBMI2-NEXT:    testb $32, %cl
145; X86-NOBMI2-NEXT:    je .LBB2_2
146; X86-NOBMI2-NEXT:  # %bb.1:
147; X86-NOBMI2-NEXT:    movl %eax, %edx
148; X86-NOBMI2-NEXT:    xorl %eax, %eax
149; X86-NOBMI2-NEXT:  .LBB2_2:
150; X86-NOBMI2-NEXT:    popl %esi
151; X86-NOBMI2-NEXT:    retl
152;
153; X86-BMI2-LABEL: n2:
154; X86-BMI2:       # %bb.0:
155; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
156; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
157; X86-BMI2-NEXT:    movb $31, %cl
158; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
159; X86-BMI2-NEXT:    shldl %cl, %eax, %edx
160; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax
161; X86-BMI2-NEXT:    testb $32, %cl
162; X86-BMI2-NEXT:    je .LBB2_2
163; X86-BMI2-NEXT:  # %bb.1:
164; X86-BMI2-NEXT:    movl %eax, %edx
165; X86-BMI2-NEXT:    xorl %eax, %eax
166; X86-BMI2-NEXT:  .LBB2_2:
167; X86-BMI2-NEXT:    retl
168  %negshamt = sub i64 31, %shamt
169  %shifted = shl i64 %val, %negshamt
170  ret i64 %shifted
171}
172
173define i64 @t3(i64 %val, i64 %shamt) nounwind {
174; X64-NOBMI2-LABEL: t3:
175; X64-NOBMI2:       # %bb.0:
176; X64-NOBMI2-NEXT:    movq %rsi, %rcx
177; X64-NOBMI2-NEXT:    movq %rdi, %rax
178; X64-NOBMI2-NEXT:    negb %cl
179; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx
180; X64-NOBMI2-NEXT:    shlq %cl, %rax
181; X64-NOBMI2-NEXT:    retq
182;
183; X64-BMI2-LABEL: t3:
184; X64-BMI2:       # %bb.0:
185; X64-BMI2-NEXT:    negb %sil
186; X64-BMI2-NEXT:    shlxq %rsi, %rdi, %rax
187; X64-BMI2-NEXT:    retq
188;
189; X86-NOBMI2-LABEL: t3:
190; X86-NOBMI2:       # %bb.0:
191; X86-NOBMI2-NEXT:    pushl %esi
192; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
193; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
194; X86-NOBMI2-NEXT:    movb $64, %cl
195; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
196; X86-NOBMI2-NEXT:    movl %esi, %eax
197; X86-NOBMI2-NEXT:    shll %cl, %eax
198; X86-NOBMI2-NEXT:    shldl %cl, %esi, %edx
199; X86-NOBMI2-NEXT:    testb $32, %cl
200; X86-NOBMI2-NEXT:    je .LBB3_2
201; X86-NOBMI2-NEXT:  # %bb.1:
202; X86-NOBMI2-NEXT:    movl %eax, %edx
203; X86-NOBMI2-NEXT:    xorl %eax, %eax
204; X86-NOBMI2-NEXT:  .LBB3_2:
205; X86-NOBMI2-NEXT:    popl %esi
206; X86-NOBMI2-NEXT:    retl
207;
208; X86-BMI2-LABEL: t3:
209; X86-BMI2:       # %bb.0:
210; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
211; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
212; X86-BMI2-NEXT:    movb $64, %cl
213; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
214; X86-BMI2-NEXT:    shldl %cl, %eax, %edx
215; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax
216; X86-BMI2-NEXT:    testb $32, %cl
217; X86-BMI2-NEXT:    je .LBB3_2
218; X86-BMI2-NEXT:  # %bb.1:
219; X86-BMI2-NEXT:    movl %eax, %edx
220; X86-BMI2-NEXT:    xorl %eax, %eax
221; X86-BMI2-NEXT:  .LBB3_2:
222; X86-BMI2-NEXT:    retl
223  %negshamt = sub i64 64, %shamt
224  %shifted = shl i64 %val, %negshamt
225  ret i64 %shifted
226}
227
228define i64 @t4(i64 %val, i64 %shamt) nounwind {
229; X64-NOBMI2-LABEL: t4:
230; X64-NOBMI2:       # %bb.0:
231; X64-NOBMI2-NEXT:    movq %rdi, %rax
232; X64-NOBMI2-NEXT:    leaq 96(%rsi), %rcx
233; X64-NOBMI2-NEXT:    negq %rcx
234; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx
235; X64-NOBMI2-NEXT:    shlq %cl, %rax
236; X64-NOBMI2-NEXT:    retq
237;
238; X64-BMI2-LABEL: t4:
239; X64-BMI2:       # %bb.0:
240; X64-BMI2-NEXT:    addq $96, %rsi
241; X64-BMI2-NEXT:    negq %rsi
242; X64-BMI2-NEXT:    shlxq %rsi, %rdi, %rax
243; X64-BMI2-NEXT:    retq
244;
245; X86-NOBMI2-LABEL: t4:
246; X86-NOBMI2:       # %bb.0:
247; X86-NOBMI2-NEXT:    pushl %esi
248; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
249; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
250; X86-NOBMI2-NEXT:    movb $96, %cl
251; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
252; X86-NOBMI2-NEXT:    movl %esi, %eax
253; X86-NOBMI2-NEXT:    shll %cl, %eax
254; X86-NOBMI2-NEXT:    shldl %cl, %esi, %edx
255; X86-NOBMI2-NEXT:    testb $32, %cl
256; X86-NOBMI2-NEXT:    je .LBB4_2
257; X86-NOBMI2-NEXT:  # %bb.1:
258; X86-NOBMI2-NEXT:    movl %eax, %edx
259; X86-NOBMI2-NEXT:    xorl %eax, %eax
260; X86-NOBMI2-NEXT:  .LBB4_2:
261; X86-NOBMI2-NEXT:    popl %esi
262; X86-NOBMI2-NEXT:    retl
263;
264; X86-BMI2-LABEL: t4:
265; X86-BMI2:       # %bb.0:
266; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
267; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
268; X86-BMI2-NEXT:    movb $96, %cl
269; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
270; X86-BMI2-NEXT:    shldl %cl, %eax, %edx
271; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax
272; X86-BMI2-NEXT:    testb $32, %cl
273; X86-BMI2-NEXT:    je .LBB4_2
274; X86-BMI2-NEXT:  # %bb.1:
275; X86-BMI2-NEXT:    movl %eax, %edx
276; X86-BMI2-NEXT:    xorl %eax, %eax
277; X86-BMI2-NEXT:  .LBB4_2:
278; X86-BMI2-NEXT:    retl
279  %negshamt = sub i64 96, %shamt
280  %shifted = shl i64 %val, %negshamt
281  ret i64 %shifted
282}
283
284define i64 @t5_cse(i64 %val, i64 %shamt, ptr%dst) nounwind {
285; X64-NOBMI2-LABEL: t5_cse:
286; X64-NOBMI2:       # %bb.0:
287; X64-NOBMI2-NEXT:    movq %rdi, %rax
288; X64-NOBMI2-NEXT:    leaq 32(%rsi), %rcx
289; X64-NOBMI2-NEXT:    movq %rcx, (%rdx)
290; X64-NOBMI2-NEXT:    negq %rcx
291; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx
292; X64-NOBMI2-NEXT:    shlq %cl, %rax
293; X64-NOBMI2-NEXT:    retq
294;
295; X64-BMI2-LABEL: t5_cse:
296; X64-BMI2:       # %bb.0:
297; X64-BMI2-NEXT:    addq $32, %rsi
298; X64-BMI2-NEXT:    movq %rsi, (%rdx)
299; X64-BMI2-NEXT:    negq %rsi
300; X64-BMI2-NEXT:    shlxq %rsi, %rdi, %rax
301; X64-BMI2-NEXT:    retq
302;
303; X86-NOBMI2-LABEL: t5_cse:
304; X86-NOBMI2:       # %bb.0:
305; X86-NOBMI2-NEXT:    pushl %ebx
306; X86-NOBMI2-NEXT:    pushl %edi
307; X86-NOBMI2-NEXT:    pushl %esi
308; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
309; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
310; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
311; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
312; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edi
313; X86-NOBMI2-NEXT:    movl %eax, %ebx
314; X86-NOBMI2-NEXT:    addl $32, %ebx
315; X86-NOBMI2-NEXT:    adcl $0, %edi
316; X86-NOBMI2-NEXT:    movl %ebx, (%ecx)
317; X86-NOBMI2-NEXT:    movl %edi, 4(%ecx)
318; X86-NOBMI2-NEXT:    movb $32, %cl
319; X86-NOBMI2-NEXT:    subb %al, %cl
320; X86-NOBMI2-NEXT:    movl %esi, %eax
321; X86-NOBMI2-NEXT:    shll %cl, %eax
322; X86-NOBMI2-NEXT:    shldl %cl, %esi, %edx
323; X86-NOBMI2-NEXT:    testb $32, %cl
324; X86-NOBMI2-NEXT:    je .LBB5_2
325; X86-NOBMI2-NEXT:  # %bb.1:
326; X86-NOBMI2-NEXT:    movl %eax, %edx
327; X86-NOBMI2-NEXT:    xorl %eax, %eax
328; X86-NOBMI2-NEXT:  .LBB5_2:
329; X86-NOBMI2-NEXT:    popl %esi
330; X86-NOBMI2-NEXT:    popl %edi
331; X86-NOBMI2-NEXT:    popl %ebx
332; X86-NOBMI2-NEXT:    retl
333;
334; X86-BMI2-LABEL: t5_cse:
335; X86-BMI2:       # %bb.0:
336; X86-BMI2-NEXT:    pushl %ebx
337; X86-BMI2-NEXT:    pushl %edi
338; X86-BMI2-NEXT:    pushl %esi
339; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
340; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
341; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
342; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %ebx
343; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
344; X86-BMI2-NEXT:    movl %ebx, %edi
345; X86-BMI2-NEXT:    addl $32, %edi
346; X86-BMI2-NEXT:    adcl $0, %esi
347; X86-BMI2-NEXT:    movl %edi, (%ecx)
348; X86-BMI2-NEXT:    movl %esi, 4(%ecx)
349; X86-BMI2-NEXT:    movb $32, %cl
350; X86-BMI2-NEXT:    subb %bl, %cl
351; X86-BMI2-NEXT:    shldl %cl, %eax, %edx
352; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax
353; X86-BMI2-NEXT:    testb $32, %cl
354; X86-BMI2-NEXT:    je .LBB5_2
355; X86-BMI2-NEXT:  # %bb.1:
356; X86-BMI2-NEXT:    movl %eax, %edx
357; X86-BMI2-NEXT:    xorl %eax, %eax
358; X86-BMI2-NEXT:  .LBB5_2:
359; X86-BMI2-NEXT:    popl %esi
360; X86-BMI2-NEXT:    popl %edi
361; X86-BMI2-NEXT:    popl %ebx
362; X86-BMI2-NEXT:    retl
363  %incshamt = add i64 %shamt, 32
364  store i64 %incshamt, ptr %dst
365  %negshamt = sub i64 32, %shamt
366  %shifted = shl i64 %val, %negshamt
367  ret i64 %shifted
368}
369
370define i64 @t6_cse2(i64 %val, i64 %shamt, ptr%dst) nounwind {
371; X64-NOBMI2-LABEL: t6_cse2:
372; X64-NOBMI2:       # %bb.0:
373; X64-NOBMI2-NEXT:    movq %rdi, %rax
374; X64-NOBMI2-NEXT:    movl $32, %ecx
375; X64-NOBMI2-NEXT:    subq %rsi, %rcx
376; X64-NOBMI2-NEXT:    movq %rcx, (%rdx)
377; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx
378; X64-NOBMI2-NEXT:    shlq %cl, %rax
379; X64-NOBMI2-NEXT:    retq
380;
381; X64-BMI2-LABEL: t6_cse2:
382; X64-BMI2:       # %bb.0:
383; X64-BMI2-NEXT:    movl $32, %eax
384; X64-BMI2-NEXT:    subq %rsi, %rax
385; X64-BMI2-NEXT:    movq %rax, (%rdx)
386; X64-BMI2-NEXT:    shlxq %rax, %rdi, %rax
387; X64-BMI2-NEXT:    retq
388;
389; X86-NOBMI2-LABEL: t6_cse2:
390; X86-NOBMI2:       # %bb.0:
391; X86-NOBMI2-NEXT:    pushl %edi
392; X86-NOBMI2-NEXT:    pushl %esi
393; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
394; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
395; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
396; X86-NOBMI2-NEXT:    xorl %edi, %edi
397; X86-NOBMI2-NEXT:    movl $32, %ecx
398; X86-NOBMI2-NEXT:    subl {{[0-9]+}}(%esp), %ecx
399; X86-NOBMI2-NEXT:    sbbl {{[0-9]+}}(%esp), %edi
400; X86-NOBMI2-NEXT:    movl %ecx, (%eax)
401; X86-NOBMI2-NEXT:    movl %edi, 4(%eax)
402; X86-NOBMI2-NEXT:    movl %esi, %eax
403; X86-NOBMI2-NEXT:    shll %cl, %eax
404; X86-NOBMI2-NEXT:    shldl %cl, %esi, %edx
405; X86-NOBMI2-NEXT:    testb $32, %cl
406; X86-NOBMI2-NEXT:    je .LBB6_2
407; X86-NOBMI2-NEXT:  # %bb.1:
408; X86-NOBMI2-NEXT:    movl %eax, %edx
409; X86-NOBMI2-NEXT:    xorl %eax, %eax
410; X86-NOBMI2-NEXT:  .LBB6_2:
411; X86-NOBMI2-NEXT:    popl %esi
412; X86-NOBMI2-NEXT:    popl %edi
413; X86-NOBMI2-NEXT:    retl
414;
415; X86-BMI2-LABEL: t6_cse2:
416; X86-BMI2:       # %bb.0:
417; X86-BMI2-NEXT:    pushl %edi
418; X86-BMI2-NEXT:    pushl %esi
419; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
420; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
421; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
422; X86-BMI2-NEXT:    xorl %edi, %edi
423; X86-BMI2-NEXT:    movl $32, %ecx
424; X86-BMI2-NEXT:    subl {{[0-9]+}}(%esp), %ecx
425; X86-BMI2-NEXT:    sbbl {{[0-9]+}}(%esp), %edi
426; X86-BMI2-NEXT:    movl %ecx, (%esi)
427; X86-BMI2-NEXT:    movl %edi, 4(%esi)
428; X86-BMI2-NEXT:    shldl %cl, %eax, %edx
429; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax
430; X86-BMI2-NEXT:    testb $32, %cl
431; X86-BMI2-NEXT:    je .LBB6_2
432; X86-BMI2-NEXT:  # %bb.1:
433; X86-BMI2-NEXT:    movl %eax, %edx
434; X86-BMI2-NEXT:    xorl %eax, %eax
435; X86-BMI2-NEXT:  .LBB6_2:
436; X86-BMI2-NEXT:    popl %esi
437; X86-BMI2-NEXT:    popl %edi
438; X86-BMI2-NEXT:    retl
439  %negshamt = sub i64 32, %shamt
440  store i64 %negshamt, ptr %dst
441  %shifted = shl i64 %val, %negshamt
442  ret i64 %shifted
443}
444