xref: /llvm-project/llvm/test/CodeGen/X86/not-shift.ll (revision 4916523053d791e17d1cc2135f7a14de16ed1dcc)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=-bmi,-bmi2 < %s | FileCheck %s --check-prefixes=X86-NOBMI2
3; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,-bmi2 < %s | FileCheck %s --check-prefixes=X86-NOBMI2
4; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,-bmi2 < %s | FileCheck %s --check-prefixes=X86-NOBMI2
5; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,+bmi2 < %s | FileCheck %s --check-prefixes=X86-BMI2
6; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,+bmi2 < %s | FileCheck %s --check-prefixes=X86-BMI2
7; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=-bmi,-bmi2 < %s | FileCheck %s --check-prefixes=X64-NOBMI2
8; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,-bmi2 < %s | FileCheck %s --check-prefixes=X64-NOBMI2
9; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,-bmi2 < %s | FileCheck %s --check-prefixes=X64-NOBMI2
10; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,+bmi2 < %s | FileCheck %s --check-prefixes=X64-BMI2
11; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,+bmi2 < %s | FileCheck %s --check-prefixes=X64-BMI2
12
13
14
15define i64 @sub63_shiftl64(i64 %val, i64 %cnt) nounwind {
16; X86-NOBMI2-LABEL: sub63_shiftl64:
17; X86-NOBMI2:       # %bb.0:
18; X86-NOBMI2-NEXT:    pushl %esi
19; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
20; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
21; X86-NOBMI2-NEXT:    movb $63, %cl
22; X86-NOBMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
23; X86-NOBMI2-NEXT:    movl %esi, %eax
24; X86-NOBMI2-NEXT:    shll %cl, %eax
25; X86-NOBMI2-NEXT:    shldl %cl, %esi, %edx
26; X86-NOBMI2-NEXT:    testb $32, %cl
27; X86-NOBMI2-NEXT:    je .LBB0_2
28; X86-NOBMI2-NEXT:  # %bb.1:
29; X86-NOBMI2-NEXT:    movl %eax, %edx
30; X86-NOBMI2-NEXT:    xorl %eax, %eax
31; X86-NOBMI2-NEXT:  .LBB0_2:
32; X86-NOBMI2-NEXT:    popl %esi
33; X86-NOBMI2-NEXT:    retl
34;
35; X86-BMI2-LABEL: sub63_shiftl64:
36; X86-BMI2:       # %bb.0:
37; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
38; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
39; X86-BMI2-NEXT:    movb $63, %cl
40; X86-BMI2-NEXT:    subb {{[0-9]+}}(%esp), %cl
41; X86-BMI2-NEXT:    shldl %cl, %eax, %edx
42; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax
43; X86-BMI2-NEXT:    testb $32, %cl
44; X86-BMI2-NEXT:    je .LBB0_2
45; X86-BMI2-NEXT:  # %bb.1:
46; X86-BMI2-NEXT:    movl %eax, %edx
47; X86-BMI2-NEXT:    xorl %eax, %eax
48; X86-BMI2-NEXT:  .LBB0_2:
49; X86-BMI2-NEXT:    retl
50;
51; X64-NOBMI2-LABEL: sub63_shiftl64:
52; X64-NOBMI2:       # %bb.0:
53; X64-NOBMI2-NEXT:    movq %rsi, %rcx
54; X64-NOBMI2-NEXT:    movq %rdi, %rax
55; X64-NOBMI2-NEXT:    notb %cl
56; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx
57; X64-NOBMI2-NEXT:    shlq %cl, %rax
58; X64-NOBMI2-NEXT:    retq
59;
60; X64-BMI2-LABEL: sub63_shiftl64:
61; X64-BMI2:       # %bb.0:
62; X64-BMI2-NEXT:    notb %sil
63; X64-BMI2-NEXT:    shlxq %rsi, %rdi, %rax
64; X64-BMI2-NEXT:    retq
65  %adjcnt = sub i64 63, %cnt
66  %result = shl i64 %val, %adjcnt
67  ret i64 %result
68}
69
70define i64 @xor63_shiftr64(i64 %val, i64 %cnt) nounwind {
71; X86-NOBMI2-LABEL: xor63_shiftr64:
72; X86-NOBMI2:       # %bb.0:
73; X86-NOBMI2-NEXT:    pushl %esi
74; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
75; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
76; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
77; X86-NOBMI2-NEXT:    xorb $63, %cl
78; X86-NOBMI2-NEXT:    movl %esi, %edx
79; X86-NOBMI2-NEXT:    shrl %cl, %edx
80; X86-NOBMI2-NEXT:    shrdl %cl, %esi, %eax
81; X86-NOBMI2-NEXT:    testb $32, %cl
82; X86-NOBMI2-NEXT:    je .LBB1_2
83; X86-NOBMI2-NEXT:  # %bb.1:
84; X86-NOBMI2-NEXT:    movl %edx, %eax
85; X86-NOBMI2-NEXT:    xorl %edx, %edx
86; X86-NOBMI2-NEXT:  .LBB1_2:
87; X86-NOBMI2-NEXT:    popl %esi
88; X86-NOBMI2-NEXT:    retl
89;
90; X86-BMI2-LABEL: xor63_shiftr64:
91; X86-BMI2:       # %bb.0:
92; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
93; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
94; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
95; X86-BMI2-NEXT:    xorb $63, %cl
96; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax
97; X86-BMI2-NEXT:    shrxl %ecx, %edx, %edx
98; X86-BMI2-NEXT:    testb $32, %cl
99; X86-BMI2-NEXT:    je .LBB1_2
100; X86-BMI2-NEXT:  # %bb.1:
101; X86-BMI2-NEXT:    movl %edx, %eax
102; X86-BMI2-NEXT:    xorl %edx, %edx
103; X86-BMI2-NEXT:  .LBB1_2:
104; X86-BMI2-NEXT:    retl
105;
106; X64-NOBMI2-LABEL: xor63_shiftr64:
107; X64-NOBMI2:       # %bb.0:
108; X64-NOBMI2-NEXT:    movq %rsi, %rcx
109; X64-NOBMI2-NEXT:    movq %rdi, %rax
110; X64-NOBMI2-NEXT:    notb %cl
111; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx
112; X64-NOBMI2-NEXT:    shrq %cl, %rax
113; X64-NOBMI2-NEXT:    retq
114;
115; X64-BMI2-LABEL: xor63_shiftr64:
116; X64-BMI2:       # %bb.0:
117; X64-BMI2-NEXT:    notb %sil
118; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax
119; X64-BMI2-NEXT:    retq
120  %adjcnt = xor i64 %cnt, 63
121  %result = lshr i64 %val, %adjcnt
122  ret i64 %result
123}
124
125define i64 @sub127_shiftl64(i64 %val, i64 %cnt) nounwind {
126; X86-NOBMI2-LABEL: sub127_shiftl64:
127; X86-NOBMI2:       # %bb.0:
128; X86-NOBMI2-NEXT:    pushl %esi
129; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
130; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
131; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
132; X86-NOBMI2-NEXT:    xorb $127, %cl
133; X86-NOBMI2-NEXT:    movl %esi, %eax
134; X86-NOBMI2-NEXT:    shll %cl, %eax
135; X86-NOBMI2-NEXT:    shldl %cl, %esi, %edx
136; X86-NOBMI2-NEXT:    testb $32, %cl
137; X86-NOBMI2-NEXT:    je .LBB2_2
138; X86-NOBMI2-NEXT:  # %bb.1:
139; X86-NOBMI2-NEXT:    movl %eax, %edx
140; X86-NOBMI2-NEXT:    xorl %eax, %eax
141; X86-NOBMI2-NEXT:  .LBB2_2:
142; X86-NOBMI2-NEXT:    popl %esi
143; X86-NOBMI2-NEXT:    retl
144;
145; X86-BMI2-LABEL: sub127_shiftl64:
146; X86-BMI2:       # %bb.0:
147; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
148; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
149; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
150; X86-BMI2-NEXT:    xorb $127, %cl
151; X86-BMI2-NEXT:    shldl %cl, %eax, %edx
152; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax
153; X86-BMI2-NEXT:    testb $32, %cl
154; X86-BMI2-NEXT:    je .LBB2_2
155; X86-BMI2-NEXT:  # %bb.1:
156; X86-BMI2-NEXT:    movl %eax, %edx
157; X86-BMI2-NEXT:    xorl %eax, %eax
158; X86-BMI2-NEXT:  .LBB2_2:
159; X86-BMI2-NEXT:    retl
160;
161; X64-NOBMI2-LABEL: sub127_shiftl64:
162; X64-NOBMI2:       # %bb.0:
163; X64-NOBMI2-NEXT:    movq %rsi, %rcx
164; X64-NOBMI2-NEXT:    movq %rdi, %rax
165; X64-NOBMI2-NEXT:    notb %cl
166; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx
167; X64-NOBMI2-NEXT:    shlq %cl, %rax
168; X64-NOBMI2-NEXT:    retq
169;
170; X64-BMI2-LABEL: sub127_shiftl64:
171; X64-BMI2:       # %bb.0:
172; X64-BMI2-NEXT:    notb %sil
173; X64-BMI2-NEXT:    shlxq %rsi, %rdi, %rax
174; X64-BMI2-NEXT:    retq
175  %adjcnt = sub i64 127, %cnt
176  %result = shl i64 %val, %adjcnt
177  ret i64 %result
178}
179
180define i64 @xor127_shiftr64(i64 %val, i64 %cnt) nounwind {
181; X86-NOBMI2-LABEL: xor127_shiftr64:
182; X86-NOBMI2:       # %bb.0:
183; X86-NOBMI2-NEXT:    pushl %esi
184; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
185; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
186; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
187; X86-NOBMI2-NEXT:    xorb $127, %cl
188; X86-NOBMI2-NEXT:    movl %esi, %edx
189; X86-NOBMI2-NEXT:    shrl %cl, %edx
190; X86-NOBMI2-NEXT:    shrdl %cl, %esi, %eax
191; X86-NOBMI2-NEXT:    testb $32, %cl
192; X86-NOBMI2-NEXT:    je .LBB3_2
193; X86-NOBMI2-NEXT:  # %bb.1:
194; X86-NOBMI2-NEXT:    movl %edx, %eax
195; X86-NOBMI2-NEXT:    xorl %edx, %edx
196; X86-NOBMI2-NEXT:  .LBB3_2:
197; X86-NOBMI2-NEXT:    popl %esi
198; X86-NOBMI2-NEXT:    retl
199;
200; X86-BMI2-LABEL: xor127_shiftr64:
201; X86-BMI2:       # %bb.0:
202; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
203; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
204; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
205; X86-BMI2-NEXT:    xorb $127, %cl
206; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax
207; X86-BMI2-NEXT:    shrxl %ecx, %edx, %edx
208; X86-BMI2-NEXT:    testb $32, %cl
209; X86-BMI2-NEXT:    je .LBB3_2
210; X86-BMI2-NEXT:  # %bb.1:
211; X86-BMI2-NEXT:    movl %edx, %eax
212; X86-BMI2-NEXT:    xorl %edx, %edx
213; X86-BMI2-NEXT:  .LBB3_2:
214; X86-BMI2-NEXT:    retl
215;
216; X64-NOBMI2-LABEL: xor127_shiftr64:
217; X64-NOBMI2:       # %bb.0:
218; X64-NOBMI2-NEXT:    movq %rsi, %rcx
219; X64-NOBMI2-NEXT:    movq %rdi, %rax
220; X64-NOBMI2-NEXT:    notb %cl
221; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx
222; X64-NOBMI2-NEXT:    shrq %cl, %rax
223; X64-NOBMI2-NEXT:    retq
224;
225; X64-BMI2-LABEL: xor127_shiftr64:
226; X64-BMI2:       # %bb.0:
227; X64-BMI2-NEXT:    notb %sil
228; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax
229; X64-BMI2-NEXT:    retq
230  %adjcnt = xor i64 %cnt, 127
231  %result = lshr i64 %val, %adjcnt
232  ret i64 %result
233}
234
235define i64 @xor64_shiftl64(i64 %val, i64 %cnt) nounwind {
236; X86-NOBMI2-LABEL: xor64_shiftl64:
237; X86-NOBMI2:       # %bb.0:
238; X86-NOBMI2-NEXT:    pushl %esi
239; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
240; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
241; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
242; X86-NOBMI2-NEXT:    xorb $64, %cl
243; X86-NOBMI2-NEXT:    movl %esi, %eax
244; X86-NOBMI2-NEXT:    shll %cl, %eax
245; X86-NOBMI2-NEXT:    shldl %cl, %esi, %edx
246; X86-NOBMI2-NEXT:    testb $32, %cl
247; X86-NOBMI2-NEXT:    je .LBB4_2
248; X86-NOBMI2-NEXT:  # %bb.1:
249; X86-NOBMI2-NEXT:    movl %eax, %edx
250; X86-NOBMI2-NEXT:    xorl %eax, %eax
251; X86-NOBMI2-NEXT:  .LBB4_2:
252; X86-NOBMI2-NEXT:    popl %esi
253; X86-NOBMI2-NEXT:    retl
254;
255; X86-BMI2-LABEL: xor64_shiftl64:
256; X86-BMI2:       # %bb.0:
257; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
258; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
259; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
260; X86-BMI2-NEXT:    xorb $64, %cl
261; X86-BMI2-NEXT:    shldl %cl, %eax, %edx
262; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax
263; X86-BMI2-NEXT:    testb $32, %cl
264; X86-BMI2-NEXT:    je .LBB4_2
265; X86-BMI2-NEXT:  # %bb.1:
266; X86-BMI2-NEXT:    movl %eax, %edx
267; X86-BMI2-NEXT:    xorl %eax, %eax
268; X86-BMI2-NEXT:  .LBB4_2:
269; X86-BMI2-NEXT:    retl
270;
271; X64-NOBMI2-LABEL: xor64_shiftl64:
272; X64-NOBMI2:       # %bb.0:
273; X64-NOBMI2-NEXT:    movq %rsi, %rcx
274; X64-NOBMI2-NEXT:    movq %rdi, %rax
275; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx
276; X64-NOBMI2-NEXT:    shlq %cl, %rax
277; X64-NOBMI2-NEXT:    retq
278;
279; X64-BMI2-LABEL: xor64_shiftl64:
280; X64-BMI2:       # %bb.0:
281; X64-BMI2-NEXT:    shlxq %rsi, %rdi, %rax
282; X64-BMI2-NEXT:    retq
283  %adjcnt = xor i64 %cnt, 64
284  %result = shl i64 %val, %adjcnt
285  ret i64 %result
286}
287
288define i64 @sub1s_shiftr64(i64 %val, i64 %cnt) nounwind {
289; X86-NOBMI2-LABEL: sub1s_shiftr64:
290; X86-NOBMI2:       # %bb.0:
291; X86-NOBMI2-NEXT:    pushl %esi
292; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
293; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
294; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
295; X86-NOBMI2-NEXT:    notb %cl
296; X86-NOBMI2-NEXT:    movl %esi, %edx
297; X86-NOBMI2-NEXT:    shrl %cl, %edx
298; X86-NOBMI2-NEXT:    shrdl %cl, %esi, %eax
299; X86-NOBMI2-NEXT:    testb $32, %cl
300; X86-NOBMI2-NEXT:    je .LBB5_2
301; X86-NOBMI2-NEXT:  # %bb.1:
302; X86-NOBMI2-NEXT:    movl %edx, %eax
303; X86-NOBMI2-NEXT:    xorl %edx, %edx
304; X86-NOBMI2-NEXT:  .LBB5_2:
305; X86-NOBMI2-NEXT:    popl %esi
306; X86-NOBMI2-NEXT:    retl
307;
308; X86-BMI2-LABEL: sub1s_shiftr64:
309; X86-BMI2:       # %bb.0:
310; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
311; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
312; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
313; X86-BMI2-NEXT:    notb %cl
314; X86-BMI2-NEXT:    shrdl %cl, %edx, %eax
315; X86-BMI2-NEXT:    shrxl %ecx, %edx, %edx
316; X86-BMI2-NEXT:    testb $32, %cl
317; X86-BMI2-NEXT:    je .LBB5_2
318; X86-BMI2-NEXT:  # %bb.1:
319; X86-BMI2-NEXT:    movl %edx, %eax
320; X86-BMI2-NEXT:    xorl %edx, %edx
321; X86-BMI2-NEXT:  .LBB5_2:
322; X86-BMI2-NEXT:    retl
323;
324; X64-NOBMI2-LABEL: sub1s_shiftr64:
325; X64-NOBMI2:       # %bb.0:
326; X64-NOBMI2-NEXT:    movq %rsi, %rcx
327; X64-NOBMI2-NEXT:    movq %rdi, %rax
328; X64-NOBMI2-NEXT:    notb %cl
329; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx
330; X64-NOBMI2-NEXT:    shrq %cl, %rax
331; X64-NOBMI2-NEXT:    retq
332;
333; X64-BMI2-LABEL: sub1s_shiftr64:
334; X64-BMI2:       # %bb.0:
335; X64-BMI2-NEXT:    notb %sil
336; X64-BMI2-NEXT:    shrxq %rsi, %rdi, %rax
337; X64-BMI2-NEXT:    retq
338  %adjcnt = xor i64 %cnt, -1
339  %result = lshr i64 %val, %adjcnt
340  ret i64 %result
341}
342
343define i64 @xor1s_shiftl64(i64 %val, i64 %cnt) nounwind {
344; X86-NOBMI2-LABEL: xor1s_shiftl64:
345; X86-NOBMI2:       # %bb.0:
346; X86-NOBMI2-NEXT:    pushl %esi
347; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %esi
348; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
349; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
350; X86-NOBMI2-NEXT:    notb %cl
351; X86-NOBMI2-NEXT:    movl %esi, %eax
352; X86-NOBMI2-NEXT:    shll %cl, %eax
353; X86-NOBMI2-NEXT:    shldl %cl, %esi, %edx
354; X86-NOBMI2-NEXT:    testb $32, %cl
355; X86-NOBMI2-NEXT:    je .LBB6_2
356; X86-NOBMI2-NEXT:  # %bb.1:
357; X86-NOBMI2-NEXT:    movl %eax, %edx
358; X86-NOBMI2-NEXT:    xorl %eax, %eax
359; X86-NOBMI2-NEXT:  .LBB6_2:
360; X86-NOBMI2-NEXT:    popl %esi
361; X86-NOBMI2-NEXT:    retl
362;
363; X86-BMI2-LABEL: xor1s_shiftl64:
364; X86-BMI2:       # %bb.0:
365; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
366; X86-BMI2-NEXT:    movl {{[0-9]+}}(%esp), %edx
367; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
368; X86-BMI2-NEXT:    notb %cl
369; X86-BMI2-NEXT:    shldl %cl, %eax, %edx
370; X86-BMI2-NEXT:    shlxl %ecx, %eax, %eax
371; X86-BMI2-NEXT:    testb $32, %cl
372; X86-BMI2-NEXT:    je .LBB6_2
373; X86-BMI2-NEXT:  # %bb.1:
374; X86-BMI2-NEXT:    movl %eax, %edx
375; X86-BMI2-NEXT:    xorl %eax, %eax
376; X86-BMI2-NEXT:  .LBB6_2:
377; X86-BMI2-NEXT:    retl
378;
379; X64-NOBMI2-LABEL: xor1s_shiftl64:
380; X64-NOBMI2:       # %bb.0:
381; X64-NOBMI2-NEXT:    movq %rsi, %rcx
382; X64-NOBMI2-NEXT:    movq %rdi, %rax
383; X64-NOBMI2-NEXT:    notb %cl
384; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $rcx
385; X64-NOBMI2-NEXT:    shlq %cl, %rax
386; X64-NOBMI2-NEXT:    retq
387;
388; X64-BMI2-LABEL: xor1s_shiftl64:
389; X64-BMI2:       # %bb.0:
390; X64-BMI2-NEXT:    notb %sil
391; X64-BMI2-NEXT:    shlxq %rsi, %rdi, %rax
392; X64-BMI2-NEXT:    retq
393  %adjcnt = xor i64 %cnt, -1
394  %result = shl i64 %val, %adjcnt
395  ret i64 %result
396}
397
398define i32 @sub31_shiftr32(i32 %val, i32 %cnt) nounwind {
399; X86-NOBMI2-LABEL: sub31_shiftr32:
400; X86-NOBMI2:       # %bb.0:
401; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
402; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
403; X86-NOBMI2-NEXT:    notb %cl
404; X86-NOBMI2-NEXT:    shrl %cl, %eax
405; X86-NOBMI2-NEXT:    retl
406;
407; X86-BMI2-LABEL: sub31_shiftr32:
408; X86-BMI2:       # %bb.0:
409; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
410; X86-BMI2-NEXT:    notb %al
411; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %eax
412; X86-BMI2-NEXT:    retl
413;
414; X64-NOBMI2-LABEL: sub31_shiftr32:
415; X64-NOBMI2:       # %bb.0:
416; X64-NOBMI2-NEXT:    movl %esi, %ecx
417; X64-NOBMI2-NEXT:    movl %edi, %eax
418; X64-NOBMI2-NEXT:    notb %cl
419; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx
420; X64-NOBMI2-NEXT:    shrl %cl, %eax
421; X64-NOBMI2-NEXT:    retq
422;
423; X64-BMI2-LABEL: sub31_shiftr32:
424; X64-BMI2:       # %bb.0:
425; X64-BMI2-NEXT:    notb %sil
426; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax
427; X64-BMI2-NEXT:    retq
428  %adjcnt = sub i32 31, %cnt
429  %result = lshr i32 %val, %adjcnt
430  ret i32 %result
431}
432
433define i32 @xor31_shiftl32(i32 %val, i32 %cnt) nounwind {
434; X86-NOBMI2-LABEL: xor31_shiftl32:
435; X86-NOBMI2:       # %bb.0:
436; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
437; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
438; X86-NOBMI2-NEXT:    notb %cl
439; X86-NOBMI2-NEXT:    shll %cl, %eax
440; X86-NOBMI2-NEXT:    retl
441;
442; X86-BMI2-LABEL: xor31_shiftl32:
443; X86-BMI2:       # %bb.0:
444; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
445; X86-BMI2-NEXT:    notb %al
446; X86-BMI2-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax
447; X86-BMI2-NEXT:    retl
448;
449; X64-NOBMI2-LABEL: xor31_shiftl32:
450; X64-NOBMI2:       # %bb.0:
451; X64-NOBMI2-NEXT:    movl %esi, %ecx
452; X64-NOBMI2-NEXT:    movl %edi, %eax
453; X64-NOBMI2-NEXT:    notb %cl
454; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx
455; X64-NOBMI2-NEXT:    shll %cl, %eax
456; X64-NOBMI2-NEXT:    retq
457;
458; X64-BMI2-LABEL: xor31_shiftl32:
459; X64-BMI2:       # %bb.0:
460; X64-BMI2-NEXT:    notb %sil
461; X64-BMI2-NEXT:    shlxl %esi, %edi, %eax
462; X64-BMI2-NEXT:    retq
463  %adjcnt = xor i32 %cnt, 31
464  %result = shl i32 %val, %adjcnt
465  ret i32 %result
466}
467
468define i32 @sub63_shiftr32(i32 %val, i32 %cnt) nounwind {
469; X86-NOBMI2-LABEL: sub63_shiftr32:
470; X86-NOBMI2:       # %bb.0:
471; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
472; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
473; X86-NOBMI2-NEXT:    notb %cl
474; X86-NOBMI2-NEXT:    shrl %cl, %eax
475; X86-NOBMI2-NEXT:    retl
476;
477; X86-BMI2-LABEL: sub63_shiftr32:
478; X86-BMI2:       # %bb.0:
479; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
480; X86-BMI2-NEXT:    notb %al
481; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %eax
482; X86-BMI2-NEXT:    retl
483;
484; X64-NOBMI2-LABEL: sub63_shiftr32:
485; X64-NOBMI2:       # %bb.0:
486; X64-NOBMI2-NEXT:    movl %esi, %ecx
487; X64-NOBMI2-NEXT:    movl %edi, %eax
488; X64-NOBMI2-NEXT:    notb %cl
489; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx
490; X64-NOBMI2-NEXT:    shrl %cl, %eax
491; X64-NOBMI2-NEXT:    retq
492;
493; X64-BMI2-LABEL: sub63_shiftr32:
494; X64-BMI2:       # %bb.0:
495; X64-BMI2-NEXT:    notb %sil
496; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax
497; X64-BMI2-NEXT:    retq
498  %adjcnt = sub i32 63, %cnt
499  %result = lshr i32 %val, %adjcnt
500  ret i32 %result
501}
502
503define i32 @xor63_shiftl32(i32 %val, i32 %cnt) nounwind {
504; X86-NOBMI2-LABEL: xor63_shiftl32:
505; X86-NOBMI2:       # %bb.0:
506; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
507; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
508; X86-NOBMI2-NEXT:    notb %cl
509; X86-NOBMI2-NEXT:    shll %cl, %eax
510; X86-NOBMI2-NEXT:    retl
511;
512; X86-BMI2-LABEL: xor63_shiftl32:
513; X86-BMI2:       # %bb.0:
514; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
515; X86-BMI2-NEXT:    notb %al
516; X86-BMI2-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax
517; X86-BMI2-NEXT:    retl
518;
519; X64-NOBMI2-LABEL: xor63_shiftl32:
520; X64-NOBMI2:       # %bb.0:
521; X64-NOBMI2-NEXT:    movl %esi, %ecx
522; X64-NOBMI2-NEXT:    movl %edi, %eax
523; X64-NOBMI2-NEXT:    notb %cl
524; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx
525; X64-NOBMI2-NEXT:    shll %cl, %eax
526; X64-NOBMI2-NEXT:    retq
527;
528; X64-BMI2-LABEL: xor63_shiftl32:
529; X64-BMI2:       # %bb.0:
530; X64-BMI2-NEXT:    notb %sil
531; X64-BMI2-NEXT:    shlxl %esi, %edi, %eax
532; X64-BMI2-NEXT:    retq
533  %adjcnt = xor i32 %cnt, 63
534  %result = shl i32 %val, %adjcnt
535  ret i32 %result
536}
537
538define i32 @xor32_shiftr32(i32 %val, i32 %cnt) nounwind {
539; X86-NOBMI2-LABEL: xor32_shiftr32:
540; X86-NOBMI2:       # %bb.0:
541; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
542; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
543; X86-NOBMI2-NEXT:    shrl %cl, %eax
544; X86-NOBMI2-NEXT:    retl
545;
546; X86-BMI2-LABEL: xor32_shiftr32:
547; X86-BMI2:       # %bb.0:
548; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
549; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %eax
550; X86-BMI2-NEXT:    retl
551;
552; X64-NOBMI2-LABEL: xor32_shiftr32:
553; X64-NOBMI2:       # %bb.0:
554; X64-NOBMI2-NEXT:    movl %esi, %ecx
555; X64-NOBMI2-NEXT:    movl %edi, %eax
556; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx
557; X64-NOBMI2-NEXT:    shrl %cl, %eax
558; X64-NOBMI2-NEXT:    retq
559;
560; X64-BMI2-LABEL: xor32_shiftr32:
561; X64-BMI2:       # %bb.0:
562; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax
563; X64-BMI2-NEXT:    retq
564  %adjcnt = xor i32 %cnt, 32
565  %result = lshr i32 %val, %adjcnt
566  ret i32 %result
567}
568
569define i32 @sub1s_shiftl32(i32 %val, i32 %cnt) nounwind {
570; X86-NOBMI2-LABEL: sub1s_shiftl32:
571; X86-NOBMI2:       # %bb.0:
572; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
573; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
574; X86-NOBMI2-NEXT:    notb %cl
575; X86-NOBMI2-NEXT:    shll %cl, %eax
576; X86-NOBMI2-NEXT:    retl
577;
578; X86-BMI2-LABEL: sub1s_shiftl32:
579; X86-BMI2:       # %bb.0:
580; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
581; X86-BMI2-NEXT:    notb %al
582; X86-BMI2-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax
583; X86-BMI2-NEXT:    retl
584;
585; X64-NOBMI2-LABEL: sub1s_shiftl32:
586; X64-NOBMI2:       # %bb.0:
587; X64-NOBMI2-NEXT:    movl %esi, %ecx
588; X64-NOBMI2-NEXT:    movl %edi, %eax
589; X64-NOBMI2-NEXT:    notb %cl
590; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx
591; X64-NOBMI2-NEXT:    shll %cl, %eax
592; X64-NOBMI2-NEXT:    retq
593;
594; X64-BMI2-LABEL: sub1s_shiftl32:
595; X64-BMI2:       # %bb.0:
596; X64-BMI2-NEXT:    notb %sil
597; X64-BMI2-NEXT:    shlxl %esi, %edi, %eax
598; X64-BMI2-NEXT:    retq
599  %adjcnt = xor i32 %cnt, -1
600  %result = shl i32 %val, %adjcnt
601  ret i32 %result
602}
603
604define i32 @xor1s_shiftr32(i32 %val, i32 %cnt) nounwind {
605; X86-NOBMI2-LABEL: xor1s_shiftr32:
606; X86-NOBMI2:       # %bb.0:
607; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
608; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
609; X86-NOBMI2-NEXT:    notb %cl
610; X86-NOBMI2-NEXT:    shrl %cl, %eax
611; X86-NOBMI2-NEXT:    retl
612;
613; X86-BMI2-LABEL: xor1s_shiftr32:
614; X86-BMI2:       # %bb.0:
615; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
616; X86-BMI2-NEXT:    notb %al
617; X86-BMI2-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %eax
618; X86-BMI2-NEXT:    retl
619;
620; X64-NOBMI2-LABEL: xor1s_shiftr32:
621; X64-NOBMI2:       # %bb.0:
622; X64-NOBMI2-NEXT:    movl %esi, %ecx
623; X64-NOBMI2-NEXT:    movl %edi, %eax
624; X64-NOBMI2-NEXT:    notb %cl
625; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx
626; X64-NOBMI2-NEXT:    shrl %cl, %eax
627; X64-NOBMI2-NEXT:    retq
628;
629; X64-BMI2-LABEL: xor1s_shiftr32:
630; X64-BMI2:       # %bb.0:
631; X64-BMI2-NEXT:    notb %sil
632; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax
633; X64-BMI2-NEXT:    retq
634  %adjcnt = xor i32 %cnt, -1
635  %result = lshr i32 %val, %adjcnt
636  ret i32 %result
637}
638define i32 @invalid_sub31(i32 %val, i32 %cnt) nounwind {
639; X86-NOBMI2-LABEL: invalid_sub31:
640; X86-NOBMI2:       # %bb.0:
641; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
642; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
643; X86-NOBMI2-NEXT:    addb $-31, %cl
644; X86-NOBMI2-NEXT:    shll %cl, %eax
645; X86-NOBMI2-NEXT:    retl
646;
647; X86-BMI2-LABEL: invalid_sub31:
648; X86-BMI2:       # %bb.0:
649; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
650; X86-BMI2-NEXT:    addb $-31, %al
651; X86-BMI2-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax
652; X86-BMI2-NEXT:    retl
653;
654; X64-NOBMI2-LABEL: invalid_sub31:
655; X64-NOBMI2:       # %bb.0:
656; X64-NOBMI2-NEXT:    # kill: def $esi killed $esi def $rsi
657; X64-NOBMI2-NEXT:    movl %edi, %eax
658; X64-NOBMI2-NEXT:    leal -31(%rsi), %ecx
659; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx
660; X64-NOBMI2-NEXT:    shll %cl, %eax
661; X64-NOBMI2-NEXT:    retq
662;
663; X64-BMI2-LABEL: invalid_sub31:
664; X64-BMI2:       # %bb.0:
665; X64-BMI2-NEXT:    addb $-31, %sil
666; X64-BMI2-NEXT:    shlxl %esi, %edi, %eax
667; X64-BMI2-NEXT:    retq
668  %adjcnt = sub i32 %cnt, 31
669  %result = shl i32 %val, %adjcnt
670  ret i32 %result
671}
672
673define i32 @invalid_add31(i32 %val, i32 %cnt) nounwind {
674; X86-NOBMI2-LABEL: invalid_add31:
675; X86-NOBMI2:       # %bb.0:
676; X86-NOBMI2-NEXT:    movl {{[0-9]+}}(%esp), %eax
677; X86-NOBMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
678; X86-NOBMI2-NEXT:    addb $31, %cl
679; X86-NOBMI2-NEXT:    shll %cl, %eax
680; X86-NOBMI2-NEXT:    retl
681;
682; X86-BMI2-LABEL: invalid_add31:
683; X86-BMI2:       # %bb.0:
684; X86-BMI2-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
685; X86-BMI2-NEXT:    addb $31, %al
686; X86-BMI2-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax
687; X86-BMI2-NEXT:    retl
688;
689; X64-NOBMI2-LABEL: invalid_add31:
690; X64-NOBMI2:       # %bb.0:
691; X64-NOBMI2-NEXT:    # kill: def $esi killed $esi def $rsi
692; X64-NOBMI2-NEXT:    movl %edi, %eax
693; X64-NOBMI2-NEXT:    leal 31(%rsi), %ecx
694; X64-NOBMI2-NEXT:    # kill: def $cl killed $cl killed $ecx
695; X64-NOBMI2-NEXT:    shll %cl, %eax
696; X64-NOBMI2-NEXT:    retq
697;
698; X64-BMI2-LABEL: invalid_add31:
699; X64-BMI2:       # %bb.0:
700; X64-BMI2-NEXT:    addb $31, %sil
701; X64-BMI2-NEXT:    shlxl %esi, %edi, %eax
702; X64-BMI2-NEXT:    retq
703  %adjcnt = add i32 %cnt, 31
704  %result = shl i32 %val, %adjcnt
705  ret i32 %result
706}
707