xref: /llvm-project/llvm/test/CodeGen/X86/apx/shl.ll (revision 20683de70e43fa73536ac1e8ce4082604048d040)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd -verify-machineinstrs --show-mc-encoding | FileCheck %s
3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd,nf -verify-machineinstrs --show-mc-encoding | FileCheck --check-prefix=NF %s
4
5define i8 @shl8ri(i8 noundef %a) {
6; CHECK-LABEL: shl8ri:
7; CHECK:       # %bb.0: # %entry
8; CHECK-NEXT:    shlb $4, %dil, %al # encoding: [0x62,0xf4,0x7c,0x18,0xc0,0xe7,0x04]
9; CHECK-NEXT:    retq # encoding: [0xc3]
10;
11; NF-LABEL: shl8ri:
12; NF:       # %bb.0: # %entry
13; NF-NEXT:    {nf} shlb $4, %dil, %al # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0xc0,0xe7,0x04]
14; NF-NEXT:    retq # encoding: [0xc3]
15entry:
16  %shl = shl i8 %a, 4
17  ret i8 %shl
18}
19
20define i16 @shl16ri(i16 noundef %a) {
21; CHECK-LABEL: shl16ri:
22; CHECK:       # %bb.0: # %entry
23; CHECK-NEXT:    shlw $4, %di, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xc1,0xe7,0x04]
24; CHECK-NEXT:    retq # encoding: [0xc3]
25;
26; NF-LABEL: shl16ri:
27; NF:       # %bb.0: # %entry
28; NF-NEXT:    {nf} shlw $4, %di, %ax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7d,0x1c,0xc1,0xe7,0x04]
29; NF-NEXT:    retq # encoding: [0xc3]
30entry:
31  %shl = shl i16 %a, 4
32  ret i16 %shl
33}
34
35define i32 @shl32ri(i32 noundef %a) {
36; CHECK-LABEL: shl32ri:
37; CHECK:       # %bb.0: # %entry
38; CHECK-NEXT:    shll $4, %edi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0xc1,0xe7,0x04]
39; CHECK-NEXT:    retq # encoding: [0xc3]
40;
41; NF-LABEL: shl32ri:
42; NF:       # %bb.0: # %entry
43; NF-NEXT:    {nf} shll $4, %edi, %eax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0xc1,0xe7,0x04]
44; NF-NEXT:    retq # encoding: [0xc3]
45entry:
46  %shl = shl i32 %a, 4
47  ret i32 %shl
48}
49
50define i64 @shl64ri(i64 noundef %a) {
51; CHECK-LABEL: shl64ri:
52; CHECK:       # %bb.0: # %entry
53; CHECK-NEXT:    shlq $4, %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0xc1,0xe7,0x04]
54; CHECK-NEXT:    retq # encoding: [0xc3]
55;
56; NF-LABEL: shl64ri:
57; NF:       # %bb.0: # %entry
58; NF-NEXT:    {nf} shlq $4, %rdi, %rax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0xfc,0x1c,0xc1,0xe7,0x04]
59; NF-NEXT:    retq # encoding: [0xc3]
60entry:
61  %shl = shl i64 %a, 4
62  ret i64 %shl
63}
64
65define i8 @shl8m1(ptr %ptr) {
66; CHECK-LABEL: shl8m1:
67; CHECK:       # %bb.0: # %entry
68; CHECK-NEXT:    movzbl (%rdi), %eax # encoding: [0x0f,0xb6,0x07]
69; CHECK-NEXT:    addb %al, %al # EVEX TO LEGACY Compression encoding: [0x00,0xc0]
70; CHECK-NEXT:    retq # encoding: [0xc3]
71;
72; NF-LABEL: shl8m1:
73; NF:       # %bb.0: # %entry
74; NF-NEXT:    movzbl (%rdi), %eax # encoding: [0x0f,0xb6,0x07]
75; NF-NEXT:    addb %al, %al # EVEX TO LEGACY Compression encoding: [0x00,0xc0]
76; NF-NEXT:    retq # encoding: [0xc3]
77entry:
78  %a = load i8, ptr %ptr
79  %shl = shl i8 %a, 1
80  ret i8 %shl
81}
82
83define i16 @shl16m1(ptr %ptr) {
84; CHECK-LABEL: shl16m1:
85; CHECK:       # %bb.0: # %entry
86; CHECK-NEXT:    movzwl (%rdi), %eax # encoding: [0x0f,0xb7,0x07]
87; CHECK-NEXT:    addw %ax, %ax # EVEX TO LEGACY Compression encoding: [0x66,0x01,0xc0]
88; CHECK-NEXT:    retq # encoding: [0xc3]
89;
90; NF-LABEL: shl16m1:
91; NF:       # %bb.0: # %entry
92; NF-NEXT:    movzwl (%rdi), %eax # encoding: [0x0f,0xb7,0x07]
93; NF-NEXT:    addw %ax, %ax # EVEX TO LEGACY Compression encoding: [0x66,0x01,0xc0]
94; NF-NEXT:    retq # encoding: [0xc3]
95entry:
96  %a = load i16, ptr %ptr
97  %shl = shl i16 %a, 1
98  ret i16 %shl
99}
100
101define i32 @shl32m1(ptr %ptr) {
102; CHECK-LABEL: shl32m1:
103; CHECK:       # %bb.0: # %entry
104; CHECK-NEXT:    movl (%rdi), %eax # encoding: [0x8b,0x07]
105; CHECK-NEXT:    addl %eax, %eax # EVEX TO LEGACY Compression encoding: [0x01,0xc0]
106; CHECK-NEXT:    retq # encoding: [0xc3]
107;
108; NF-LABEL: shl32m1:
109; NF:       # %bb.0: # %entry
110; NF-NEXT:    movl (%rdi), %eax # encoding: [0x8b,0x07]
111; NF-NEXT:    addl %eax, %eax # EVEX TO LEGACY Compression encoding: [0x01,0xc0]
112; NF-NEXT:    retq # encoding: [0xc3]
113entry:
114  %a = load i32, ptr %ptr
115  %shl = shl i32 %a, 1
116  ret i32 %shl
117}
118
119define i64 @shl64m1(ptr %ptr) {
120; CHECK-LABEL: shl64m1:
121; CHECK:       # %bb.0: # %entry
122; CHECK-NEXT:    movq (%rdi), %rax # encoding: [0x48,0x8b,0x07]
123; CHECK-NEXT:    addq %rax, %rax # EVEX TO LEGACY Compression encoding: [0x48,0x01,0xc0]
124; CHECK-NEXT:    retq # encoding: [0xc3]
125;
126; NF-LABEL: shl64m1:
127; NF:       # %bb.0: # %entry
128; NF-NEXT:    movq (%rdi), %rax # encoding: [0x48,0x8b,0x07]
129; NF-NEXT:    addq %rax, %rax # EVEX TO LEGACY Compression encoding: [0x48,0x01,0xc0]
130; NF-NEXT:    retq # encoding: [0xc3]
131entry:
132  %a = load i64, ptr %ptr
133  %shl = shl i64 %a, 1
134  ret i64 %shl
135}
136
137define i8 @shl8mcl(ptr %ptr, i8 %cl) {
138; CHECK-LABEL: shl8mcl:
139; CHECK:       # %bb.0: # %entry
140; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
141; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
142; CHECK-NEXT:    shlb %cl, (%rdi), %al # encoding: [0x62,0xf4,0x7c,0x18,0xd2,0x27]
143; CHECK-NEXT:    retq # encoding: [0xc3]
144;
145; NF-LABEL: shl8mcl:
146; NF:       # %bb.0: # %entry
147; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
148; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
149; NF-NEXT:    {nf} shlb %cl, (%rdi), %al # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0xd2,0x27]
150; NF-NEXT:    retq # encoding: [0xc3]
151entry:
152  %a = load i8, ptr %ptr
153  %shl = shl i8 %a, %cl
154  ret i8 %shl
155}
156
157define i8 @shl8mcl_mask(ptr %ptr, i8 %cl) {
158; CHECK-LABEL: shl8mcl_mask:
159; CHECK:       # %bb.0: # %entry
160; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
161; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
162; CHECK-NEXT:    shlb %cl, (%rdi), %al # encoding: [0x62,0xf4,0x7c,0x18,0xd2,0x27]
163; CHECK-NEXT:    retq # encoding: [0xc3]
164;
165; NF-LABEL: shl8mcl_mask:
166; NF:       # %bb.0: # %entry
167; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
168; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
169; NF-NEXT:    {nf} shlb %cl, (%rdi), %al # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0xd2,0x27]
170; NF-NEXT:    retq # encoding: [0xc3]
171entry:
172  %a = load i8, ptr %ptr
173  %shamt = and i8 %cl, 31
174  %shl = shl i8 %a, %shamt
175  ret i8 %shl
176}
177
178define i16 @shl16mcl(ptr %ptr, i16 %cl) {
179; CHECK-LABEL: shl16mcl:
180; CHECK:       # %bb.0: # %entry
181; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
182; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
183; CHECK-NEXT:    shlw %cl, (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd3,0x27]
184; CHECK-NEXT:    retq # encoding: [0xc3]
185;
186; NF-LABEL: shl16mcl:
187; NF:       # %bb.0: # %entry
188; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
189; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
190; NF-NEXT:    {nf} shlw %cl, (%rdi), %ax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7d,0x1c,0xd3,0x27]
191; NF-NEXT:    retq # encoding: [0xc3]
192entry:
193  %a = load i16, ptr %ptr
194  %shl = shl i16 %a, %cl
195  ret i16 %shl
196}
197
198define i16 @shl16mcl_mask(ptr %ptr, i16 %cl) {
199; CHECK-LABEL: shl16mcl_mask:
200; CHECK:       # %bb.0: # %entry
201; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
202; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
203; CHECK-NEXT:    shlw %cl, (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd3,0x27]
204; CHECK-NEXT:    retq # encoding: [0xc3]
205;
206; NF-LABEL: shl16mcl_mask:
207; NF:       # %bb.0: # %entry
208; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
209; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
210; NF-NEXT:    {nf} shlw %cl, (%rdi), %ax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7d,0x1c,0xd3,0x27]
211; NF-NEXT:    retq # encoding: [0xc3]
212entry:
213  %a = load i16, ptr %ptr
214  %shamt = and i16 %cl, 31
215  %shl = shl i16 %a, %shamt
216  ret i16 %shl
217}
218
219define i32 @shl32mcl(ptr %ptr, i32 %cl) {
220; CHECK-LABEL: shl32mcl:
221; CHECK:       # %bb.0: # %entry
222; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
223; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
224; CHECK-NEXT:    shll %cl, (%rdi), %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd3,0x27]
225; CHECK-NEXT:    retq # encoding: [0xc3]
226;
227; NF-LABEL: shl32mcl:
228; NF:       # %bb.0: # %entry
229; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
230; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
231; NF-NEXT:    {nf} shll %cl, (%rdi), %eax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0xd3,0x27]
232; NF-NEXT:    retq # encoding: [0xc3]
233entry:
234  %a = load i32, ptr %ptr
235  %shl = shl i32 %a, %cl
236  ret i32 %shl
237}
238
239define i32 @shl32mcl_mask(ptr %ptr, i32 %cl) {
240; CHECK-LABEL: shl32mcl_mask:
241; CHECK:       # %bb.0: # %entry
242; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
243; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
244; CHECK-NEXT:    shll %cl, (%rdi), %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd3,0x27]
245; CHECK-NEXT:    retq # encoding: [0xc3]
246;
247; NF-LABEL: shl32mcl_mask:
248; NF:       # %bb.0: # %entry
249; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
250; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
251; NF-NEXT:    {nf} shll %cl, (%rdi), %eax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0xd3,0x27]
252; NF-NEXT:    retq # encoding: [0xc3]
253entry:
254  %a = load i32, ptr %ptr
255  %shamt = and i32 %cl, 31
256  %shl = shl i32 %a, %shamt
257  ret i32 %shl
258}
259
260define i64 @shl64mcl(ptr %ptr, i64 %cl) {
261; CHECK-LABEL: shl64mcl:
262; CHECK:       # %bb.0: # %entry
263; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
264; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
265; CHECK-NEXT:    shlq %cl, (%rdi), %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd3,0x27]
266; CHECK-NEXT:    retq # encoding: [0xc3]
267;
268; NF-LABEL: shl64mcl:
269; NF:       # %bb.0: # %entry
270; NF-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
271; NF-NEXT:    # kill: def $cl killed $cl killed $rcx
272; NF-NEXT:    {nf} shlq %cl, (%rdi), %rax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0xfc,0x1c,0xd3,0x27]
273; NF-NEXT:    retq # encoding: [0xc3]
274entry:
275  %a = load i64, ptr %ptr
276  %shl = shl i64 %a, %cl
277  ret i64 %shl
278}
279
280define i64 @shl64mcl_mask(ptr %ptr, i64 %cl) {
281; CHECK-LABEL: shl64mcl_mask:
282; CHECK:       # %bb.0: # %entry
283; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
284; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
285; CHECK-NEXT:    shlq %cl, (%rdi), %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd3,0x27]
286; CHECK-NEXT:    retq # encoding: [0xc3]
287;
288; NF-LABEL: shl64mcl_mask:
289; NF:       # %bb.0: # %entry
290; NF-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
291; NF-NEXT:    # kill: def $cl killed $cl killed $rcx
292; NF-NEXT:    {nf} shlq %cl, (%rdi), %rax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0xfc,0x1c,0xd3,0x27]
293; NF-NEXT:    retq # encoding: [0xc3]
294entry:
295  %a = load i64, ptr %ptr
296  %shamt = and i64 %cl, 63
297  %shl = shl i64 %a, %shamt
298  ret i64 %shl
299}
300
301define i8 @shl8mi(ptr %ptr) {
302; CHECK-LABEL: shl8mi:
303; CHECK:       # %bb.0: # %entry
304; CHECK-NEXT:    shlb $4, (%rdi), %al # encoding: [0x62,0xf4,0x7c,0x18,0xc0,0x27,0x04]
305; CHECK-NEXT:    retq # encoding: [0xc3]
306;
307; NF-LABEL: shl8mi:
308; NF:       # %bb.0: # %entry
309; NF-NEXT:    {nf} shlb $4, (%rdi), %al # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0xc0,0x27,0x04]
310; NF-NEXT:    retq # encoding: [0xc3]
311entry:
312  %a = load i8, ptr %ptr
313  %shl = shl i8 %a, 4
314  ret i8 %shl
315}
316
317define i16 @shl16mi(ptr %ptr) {
318; CHECK-LABEL: shl16mi:
319; CHECK:       # %bb.0: # %entry
320; CHECK-NEXT:    shlw $4, (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xc1,0x27,0x04]
321; CHECK-NEXT:    retq # encoding: [0xc3]
322;
323; NF-LABEL: shl16mi:
324; NF:       # %bb.0: # %entry
325; NF-NEXT:    {nf} shlw $4, (%rdi), %ax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7d,0x1c,0xc1,0x27,0x04]
326; NF-NEXT:    retq # encoding: [0xc3]
327entry:
328  %a = load i16, ptr %ptr
329  %shl = shl i16 %a, 4
330  ret i16 %shl
331}
332
333define i32 @shl32mi(ptr %ptr) {
334; CHECK-LABEL: shl32mi:
335; CHECK:       # %bb.0: # %entry
336; CHECK-NEXT:    shll $4, (%rdi), %eax # encoding: [0x62,0xf4,0x7c,0x18,0xc1,0x27,0x04]
337; CHECK-NEXT:    retq # encoding: [0xc3]
338;
339; NF-LABEL: shl32mi:
340; NF:       # %bb.0: # %entry
341; NF-NEXT:    {nf} shll $4, (%rdi), %eax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0xc1,0x27,0x04]
342; NF-NEXT:    retq # encoding: [0xc3]
343entry:
344  %a = load i32, ptr %ptr
345  %shl = shl i32 %a, 4
346  ret i32 %shl
347}
348
349define i64 @shl64mi(ptr %ptr) {
350; CHECK-LABEL: shl64mi:
351; CHECK:       # %bb.0: # %entry
352; CHECK-NEXT:    shlq $4, (%rdi), %rax # encoding: [0x62,0xf4,0xfc,0x18,0xc1,0x27,0x04]
353; CHECK-NEXT:    retq # encoding: [0xc3]
354;
355; NF-LABEL: shl64mi:
356; NF:       # %bb.0: # %entry
357; NF-NEXT:    {nf} shlq $4, (%rdi), %rax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0xfc,0x1c,0xc1,0x27,0x04]
358; NF-NEXT:    retq # encoding: [0xc3]
359entry:
360  %a = load i64, ptr %ptr
361  %shl = shl i64 %a, 4
362  ret i64 %shl
363}
364
365define i8 @shl8r1(i8 noundef %a) {
366; CHECK-LABEL: shl8r1:
367; CHECK:       # %bb.0: # %entry
368; CHECK-NEXT:    addb %dil, %dil, %al # encoding: [0x62,0xf4,0x7c,0x18,0x00,0xff]
369; CHECK-NEXT:    retq # encoding: [0xc3]
370;
371; NF-LABEL: shl8r1:
372; NF:       # %bb.0: # %entry
373; NF-NEXT:    {nf} addb %dil, %dil, %al # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0x00,0xff]
374; NF-NEXT:    retq # encoding: [0xc3]
375entry:
376  %shl = shl i8 %a, 1
377  ret i8 %shl
378}
379
380define i16 @shl16r1(i16 noundef %a) {
381; CHECK-LABEL: shl16r1:
382; CHECK:       # %bb.0: # %entry
383; CHECK-NEXT:    addw %di, %di, %ax # encoding: [0x62,0xf4,0x7d,0x18,0x01,0xff]
384; CHECK-NEXT:    retq # encoding: [0xc3]
385;
386; NF-LABEL: shl16r1:
387; NF:       # %bb.0: # %entry
388; NF-NEXT:    {nf} addw %di, %di, %ax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7d,0x1c,0x01,0xff]
389; NF-NEXT:    retq # encoding: [0xc3]
390entry:
391  %shl = shl i16 %a, 1
392  ret i16 %shl
393}
394
395define i32 @shl32r1(i32 noundef %a) {
396; CHECK-LABEL: shl32r1:
397; CHECK:       # %bb.0: # %entry
398; CHECK-NEXT:    addl %edi, %edi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0x01,0xff]
399; CHECK-NEXT:    retq # encoding: [0xc3]
400;
401; NF-LABEL: shl32r1:
402; NF:       # %bb.0: # %entry
403; NF-NEXT:    {nf} addl %edi, %edi, %eax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0x01,0xff]
404; NF-NEXT:    retq # encoding: [0xc3]
405entry:
406  %shl = shl i32 %a, 1
407  ret i32 %shl
408}
409
410define i64 @shl64r1(i64 noundef %a) {
411; CHECK-LABEL: shl64r1:
412; CHECK:       # %bb.0: # %entry
413; CHECK-NEXT:    addq %rdi, %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0x01,0xff]
414; CHECK-NEXT:    retq # encoding: [0xc3]
415;
416; NF-LABEL: shl64r1:
417; NF:       # %bb.0: # %entry
418; NF-NEXT:    {nf} addq %rdi, %rdi, %rax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0xfc,0x1c,0x01,0xff]
419; NF-NEXT:    retq # encoding: [0xc3]
420entry:
421  %shl = shl i64 %a, 1
422  ret i64 %shl
423}
424
425define i8 @shl8rcl(i8 noundef %a, i8 %cl) {
426; CHECK-LABEL: shl8rcl:
427; CHECK:       # %bb.0: # %entry
428; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
429; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
430; CHECK-NEXT:    shlb %cl, %dil, %al # encoding: [0x62,0xf4,0x7c,0x18,0xd2,0xe7]
431; CHECK-NEXT:    retq # encoding: [0xc3]
432;
433; NF-LABEL: shl8rcl:
434; NF:       # %bb.0: # %entry
435; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
436; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
437; NF-NEXT:    {nf} shlb %cl, %dil, %al # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0xd2,0xe7]
438; NF-NEXT:    retq # encoding: [0xc3]
439entry:
440  %shl = shl i8 %a, %cl
441  ret i8 %shl
442}
443
444define i8 @shl8rcl_mask(i8 noundef %a, i8 %cl) {
445; CHECK-LABEL: shl8rcl_mask:
446; CHECK:       # %bb.0: # %entry
447; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
448; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
449; CHECK-NEXT:    shlb %cl, %dil, %al # encoding: [0x62,0xf4,0x7c,0x18,0xd2,0xe7]
450; CHECK-NEXT:    retq # encoding: [0xc3]
451;
452; NF-LABEL: shl8rcl_mask:
453; NF:       # %bb.0: # %entry
454; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
455; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
456; NF-NEXT:    {nf} shlb %cl, %dil, %al # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0xd2,0xe7]
457; NF-NEXT:    retq # encoding: [0xc3]
458entry:
459  %shamt = and i8 %cl, 31
460  %shl = shl i8 %a, %shamt
461  ret i8 %shl
462}
463
464define i16 @shl16rcl(i16 noundef %a, i16 %cl) {
465; CHECK-LABEL: shl16rcl:
466; CHECK:       # %bb.0: # %entry
467; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
468; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
469; CHECK-NEXT:    shlw %cl, %di, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd3,0xe7]
470; CHECK-NEXT:    retq # encoding: [0xc3]
471;
472; NF-LABEL: shl16rcl:
473; NF:       # %bb.0: # %entry
474; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
475; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
476; NF-NEXT:    {nf} shlw %cl, %di, %ax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7d,0x1c,0xd3,0xe7]
477; NF-NEXT:    retq # encoding: [0xc3]
478entry:
479  %shl = shl i16 %a, %cl
480  ret i16 %shl
481}
482
483define i16 @shl16rcl_mask(i16 noundef %a, i16 %cl) {
484; CHECK-LABEL: shl16rcl_mask:
485; CHECK:       # %bb.0: # %entry
486; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
487; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
488; CHECK-NEXT:    shlw %cl, %di, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd3,0xe7]
489; CHECK-NEXT:    retq # encoding: [0xc3]
490;
491; NF-LABEL: shl16rcl_mask:
492; NF:       # %bb.0: # %entry
493; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
494; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
495; NF-NEXT:    {nf} shlw %cl, %di, %ax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7d,0x1c,0xd3,0xe7]
496; NF-NEXT:    retq # encoding: [0xc3]
497entry:
498  %shamt = and i16 %cl, 31
499  %shl = shl i16 %a, %shamt
500  ret i16 %shl
501}
502
503define i32 @shl32rcl(i32 noundef %a, i32 %cl) {
504; CHECK-LABEL: shl32rcl:
505; CHECK:       # %bb.0: # %entry
506; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
507; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
508; CHECK-NEXT:    shll %cl, %edi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd3,0xe7]
509; CHECK-NEXT:    retq # encoding: [0xc3]
510;
511; NF-LABEL: shl32rcl:
512; NF:       # %bb.0: # %entry
513; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
514; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
515; NF-NEXT:    {nf} shll %cl, %edi, %eax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0xd3,0xe7]
516; NF-NEXT:    retq # encoding: [0xc3]
517entry:
518  %shl = shl i32 %a, %cl
519  ret i32 %shl
520}
521
522define i32 @shl32rcl_mask(i32 noundef %a, i32 %cl) {
523; CHECK-LABEL: shl32rcl_mask:
524; CHECK:       # %bb.0: # %entry
525; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
526; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
527; CHECK-NEXT:    shll %cl, %edi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd3,0xe7]
528; CHECK-NEXT:    retq # encoding: [0xc3]
529;
530; NF-LABEL: shl32rcl_mask:
531; NF:       # %bb.0: # %entry
532; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
533; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
534; NF-NEXT:    {nf} shll %cl, %edi, %eax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0x7c,0x1c,0xd3,0xe7]
535; NF-NEXT:    retq # encoding: [0xc3]
536entry:
537  %shamt = and i32 %cl, 31
538  %shl = shl i32 %a, %shamt
539  ret i32 %shl
540}
541
542define i64 @shl64rcl(i64 noundef %a, i64 %cl) {
543; CHECK-LABEL: shl64rcl:
544; CHECK:       # %bb.0: # %entry
545; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
546; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
547; CHECK-NEXT:    shlq %cl, %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd3,0xe7]
548; CHECK-NEXT:    retq # encoding: [0xc3]
549;
550; NF-LABEL: shl64rcl:
551; NF:       # %bb.0: # %entry
552; NF-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
553; NF-NEXT:    # kill: def $cl killed $cl killed $rcx
554; NF-NEXT:    {nf} shlq %cl, %rdi, %rax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0xfc,0x1c,0xd3,0xe7]
555; NF-NEXT:    retq # encoding: [0xc3]
556entry:
557  %shl = shl i64 %a, %cl
558  ret i64 %shl
559}
560
561define i64 @shl64rcl_mask(i64 noundef %a, i64 %cl) {
562; CHECK-LABEL: shl64rcl_mask:
563; CHECK:       # %bb.0: # %entry
564; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
565; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
566; CHECK-NEXT:    shlq %cl, %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd3,0xe7]
567; CHECK-NEXT:    retq # encoding: [0xc3]
568;
569; NF-LABEL: shl64rcl_mask:
570; NF:       # %bb.0: # %entry
571; NF-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
572; NF-NEXT:    # kill: def $cl killed $cl killed $rcx
573; NF-NEXT:    {nf} shlq %cl, %rdi, %rax # EVEX TO EVEX Compression encoding: [0x62,0xf4,0xfc,0x1c,0xd3,0xe7]
574; NF-NEXT:    retq # encoding: [0xc3]
575entry:
576  %shamt = and i64 %cl, 63
577  %shl = shl i64 %a, %shamt
578  ret i64 %shl
579}
580
581define void @shl8m1_legacy(ptr %ptr) {
582; CHECK-LABEL: shl8m1_legacy:
583; CHECK:       # %bb.0: # %entry
584; CHECK-NEXT:    shlb (%rdi) # encoding: [0xd0,0x27]
585; CHECK-NEXT:    retq # encoding: [0xc3]
586;
587; NF-LABEL: shl8m1_legacy:
588; NF:       # %bb.0: # %entry
589; NF-NEXT:    shlb (%rdi) # encoding: [0xd0,0x27]
590; NF-NEXT:    retq # encoding: [0xc3]
591entry:
592  %a = load i8, ptr %ptr
593  %shl = shl i8 %a, 1
594  store i8 %shl, ptr %ptr
595  ret void
596}
597
598define void @shl16m1_legacy(ptr %ptr) {
599; CHECK-LABEL: shl16m1_legacy:
600; CHECK:       # %bb.0: # %entry
601; CHECK-NEXT:    shlw (%rdi) # encoding: [0x66,0xd1,0x27]
602; CHECK-NEXT:    retq # encoding: [0xc3]
603;
604; NF-LABEL: shl16m1_legacy:
605; NF:       # %bb.0: # %entry
606; NF-NEXT:    shlw (%rdi) # encoding: [0x66,0xd1,0x27]
607; NF-NEXT:    retq # encoding: [0xc3]
608entry:
609  %a = load i16, ptr %ptr
610  %shl = shl i16 %a, 1
611  store i16 %shl, ptr %ptr
612  ret void
613}
614
615define void @shl32m1_legacy(ptr %ptr) {
616; CHECK-LABEL: shl32m1_legacy:
617; CHECK:       # %bb.0: # %entry
618; CHECK-NEXT:    shll (%rdi) # encoding: [0xd1,0x27]
619; CHECK-NEXT:    retq # encoding: [0xc3]
620;
621; NF-LABEL: shl32m1_legacy:
622; NF:       # %bb.0: # %entry
623; NF-NEXT:    shll (%rdi) # encoding: [0xd1,0x27]
624; NF-NEXT:    retq # encoding: [0xc3]
625entry:
626  %a = load i32, ptr %ptr
627  %shl = shl i32 %a, 1
628  store i32 %shl, ptr %ptr
629  ret void
630}
631
632define void @shl64m1_legacy(ptr %ptr) {
633; CHECK-LABEL: shl64m1_legacy:
634; CHECK:       # %bb.0: # %entry
635; CHECK-NEXT:    shlq (%rdi) # encoding: [0x48,0xd1,0x27]
636; CHECK-NEXT:    retq # encoding: [0xc3]
637;
638; NF-LABEL: shl64m1_legacy:
639; NF:       # %bb.0: # %entry
640; NF-NEXT:    shlq (%rdi) # encoding: [0x48,0xd1,0x27]
641; NF-NEXT:    retq # encoding: [0xc3]
642entry:
643  %a = load i64, ptr %ptr
644  %shl = shl i64 %a, 1
645  store i64 %shl, ptr %ptr
646  ret void
647}
648
649define void @shl8mi_legacy(ptr %ptr) {
650; CHECK-LABEL: shl8mi_legacy:
651; CHECK:       # %bb.0: # %entry
652; CHECK-NEXT:    shlb $4, (%rdi) # encoding: [0xc0,0x27,0x04]
653; CHECK-NEXT:    retq # encoding: [0xc3]
654;
655; NF-LABEL: shl8mi_legacy:
656; NF:       # %bb.0: # %entry
657; NF-NEXT:    shlb $4, (%rdi) # encoding: [0xc0,0x27,0x04]
658; NF-NEXT:    retq # encoding: [0xc3]
659entry:
660  %a = load i8, ptr %ptr
661  %shl = shl i8 %a, 4
662  store i8 %shl, ptr %ptr
663  ret void
664}
665
666define void @shl16mi_legacy(ptr %ptr) {
667; CHECK-LABEL: shl16mi_legacy:
668; CHECK:       # %bb.0: # %entry
669; CHECK-NEXT:    shlw $4, (%rdi) # encoding: [0x66,0xc1,0x27,0x04]
670; CHECK-NEXT:    retq # encoding: [0xc3]
671;
672; NF-LABEL: shl16mi_legacy:
673; NF:       # %bb.0: # %entry
674; NF-NEXT:    shlw $4, (%rdi) # encoding: [0x66,0xc1,0x27,0x04]
675; NF-NEXT:    retq # encoding: [0xc3]
676entry:
677  %a = load i16, ptr %ptr
678  %shl = shl i16 %a, 4
679  store i16 %shl, ptr %ptr
680  ret void
681}
682
683define void @shl32mi_legacy(ptr %ptr) {
684; CHECK-LABEL: shl32mi_legacy:
685; CHECK:       # %bb.0: # %entry
686; CHECK-NEXT:    shll $4, (%rdi) # encoding: [0xc1,0x27,0x04]
687; CHECK-NEXT:    retq # encoding: [0xc3]
688;
689; NF-LABEL: shl32mi_legacy:
690; NF:       # %bb.0: # %entry
691; NF-NEXT:    shll $4, (%rdi) # encoding: [0xc1,0x27,0x04]
692; NF-NEXT:    retq # encoding: [0xc3]
693entry:
694  %a = load i32, ptr %ptr
695  %shl = shl i32 %a, 4
696  store i32 %shl, ptr %ptr
697  ret void
698}
699
700define void @shl64mi_legacy(ptr %ptr) {
701; CHECK-LABEL: shl64mi_legacy:
702; CHECK:       # %bb.0: # %entry
703; CHECK-NEXT:    shlq $4, (%rdi) # encoding: [0x48,0xc1,0x27,0x04]
704; CHECK-NEXT:    retq # encoding: [0xc3]
705;
706; NF-LABEL: shl64mi_legacy:
707; NF:       # %bb.0: # %entry
708; NF-NEXT:    shlq $4, (%rdi) # encoding: [0x48,0xc1,0x27,0x04]
709; NF-NEXT:    retq # encoding: [0xc3]
710entry:
711  %a = load i64, ptr %ptr
712  %shl = shl i64 %a, 4
713  store i64 %shl, ptr %ptr
714  ret void
715}
716
717define void @shl8mcl_legacy(ptr %ptr, i8 %cl) {
718; CHECK-LABEL: shl8mcl_legacy:
719; CHECK:       # %bb.0: # %entry
720; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
721; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
722; CHECK-NEXT:    shlb %cl, (%rdi) # encoding: [0xd2,0x27]
723; CHECK-NEXT:    retq # encoding: [0xc3]
724;
725; NF-LABEL: shl8mcl_legacy:
726; NF:       # %bb.0: # %entry
727; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
728; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
729; NF-NEXT:    shlb %cl, (%rdi) # encoding: [0xd2,0x27]
730; NF-NEXT:    retq # encoding: [0xc3]
731entry:
732  %a = load i8, ptr %ptr
733  %shl = shl i8 %a, %cl
734  store i8 %shl, ptr %ptr
735  ret void
736}
737
738define void @shl16mcl_legacy(ptr %ptr, i16 %cl) {
739; CHECK-LABEL: shl16mcl_legacy:
740; CHECK:       # %bb.0: # %entry
741; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
742; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
743; CHECK-NEXT:    shlw %cl, (%rdi) # encoding: [0x66,0xd3,0x27]
744; CHECK-NEXT:    retq # encoding: [0xc3]
745;
746; NF-LABEL: shl16mcl_legacy:
747; NF:       # %bb.0: # %entry
748; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
749; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
750; NF-NEXT:    shlw %cl, (%rdi) # encoding: [0x66,0xd3,0x27]
751; NF-NEXT:    retq # encoding: [0xc3]
752entry:
753  %a = load i16, ptr %ptr
754  %shl = shl i16 %a, %cl
755  store i16 %shl, ptr %ptr
756  ret void
757}
758
759define void @shl32mcl_legacy(ptr %ptr, i32 %cl) {
760; CHECK-LABEL: shl32mcl_legacy:
761; CHECK:       # %bb.0: # %entry
762; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
763; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
764; CHECK-NEXT:    shll %cl, (%rdi) # encoding: [0xd3,0x27]
765; CHECK-NEXT:    retq # encoding: [0xc3]
766;
767; NF-LABEL: shl32mcl_legacy:
768; NF:       # %bb.0: # %entry
769; NF-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
770; NF-NEXT:    # kill: def $cl killed $cl killed $ecx
771; NF-NEXT:    shll %cl, (%rdi) # encoding: [0xd3,0x27]
772; NF-NEXT:    retq # encoding: [0xc3]
773entry:
774  %a = load i32, ptr %ptr
775  %shl = shl i32 %a, %cl
776  store i32 %shl, ptr %ptr
777  ret void
778}
779
780define void @shl64mcl_legacy(ptr %ptr, i64 %cl) {
781; CHECK-LABEL: shl64mcl_legacy:
782; CHECK:       # %bb.0: # %entry
783; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
784; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
785; CHECK-NEXT:    shlq %cl, (%rdi) # encoding: [0x48,0xd3,0x27]
786; CHECK-NEXT:    retq # encoding: [0xc3]
787;
788; NF-LABEL: shl64mcl_legacy:
789; NF:       # %bb.0: # %entry
790; NF-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
791; NF-NEXT:    # kill: def $cl killed $cl killed $rcx
792; NF-NEXT:    shlq %cl, (%rdi) # encoding: [0x48,0xd3,0x27]
793; NF-NEXT:    retq # encoding: [0xc3]
794entry:
795  %a = load i64, ptr %ptr
796  %shl = shl i64 %a, %cl
797  store i64 %shl, ptr %ptr
798  ret void
799}
800