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