xref: /llvm-project/llvm/test/CodeGen/X86/apx/ror.ll (revision 5c68c6d70fc204b0efdb2af95dfb328d616129e3)
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
4define i8 @ror8m1(ptr %ptr) {
5; CHECK-LABEL: ror8m1:
6; CHECK:       # %bb.0: # %entry
7; CHECK-NEXT:    rorb (%rdi), %al # encoding: [0x62,0xf4,0x7c,0x18,0xd0,0x0f]
8; CHECK-NEXT:    retq # encoding: [0xc3]
9entry:
10  %a = load i8, ptr %ptr
11  %0 = lshr i8 %a, 1
12  %1 = shl i8 %a, 7
13  %ror = or i8 %0, %1
14  ret i8 %ror
15}
16
17define i16 @ror16m1(ptr %ptr) {
18; CHECK-LABEL: ror16m1:
19; CHECK:       # %bb.0: # %entry
20; CHECK-NEXT:    rorw (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd1,0x0f]
21; CHECK-NEXT:    retq # encoding: [0xc3]
22entry:
23  %a = load i16, ptr %ptr
24  %0 = lshr i16 %a, 1
25  %1 = shl i16 %a, 15
26  %ror = or i16 %0, %1
27  ret i16 %ror
28}
29
30define i32 @ror32m1(ptr %ptr) {
31; CHECK-LABEL: ror32m1:
32; CHECK:       # %bb.0: # %entry
33; CHECK-NEXT:    rorl (%rdi), %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd1,0x0f]
34; CHECK-NEXT:    retq # encoding: [0xc3]
35entry:
36  %a = load i32, ptr %ptr
37  %0 = lshr i32 %a, 1
38  %1 = shl i32 %a, 31
39  %ror = or i32 %0, %1
40  ret i32 %ror
41}
42
43define i64 @ror64m1(ptr %ptr) {
44; CHECK-LABEL: ror64m1:
45; CHECK:       # %bb.0: # %entry
46; CHECK-NEXT:    rorq (%rdi), %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd1,0x0f]
47; CHECK-NEXT:    retq # encoding: [0xc3]
48entry:
49  %a = load i64, ptr %ptr
50  %0 = lshr i64 %a, 1
51  %1 = shl i64 %a, 63
52  %ror = or i64 %0, %1
53  ret i64 %ror
54}
55
56define i8 @ror8mcl(ptr %ptr, i8 %cl) {
57; CHECK-LABEL: ror8mcl:
58; CHECK:       # %bb.0: # %entry
59; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
60; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
61; CHECK-NEXT:    rorb %cl, (%rdi), %al # encoding: [0x62,0xf4,0x7c,0x18,0xd2,0x0f]
62; CHECK-NEXT:    retq # encoding: [0xc3]
63entry:
64  %a = load i8, ptr %ptr
65  %0 = lshr i8 %a, %cl
66  %1 = sub i8 8, %cl
67  %2 = shl i8 %a, %1
68  %ror = or i8 %0, %2
69  ret i8 %ror
70}
71
72define i8 @ror8mcl_mask(ptr %ptr, i8 %cl) {
73; CHECK-LABEL: ror8mcl_mask:
74; CHECK:       # %bb.0: # %entry
75; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
76; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
77; CHECK-NEXT:    rorb %cl, (%rdi), %al # encoding: [0x62,0xf4,0x7c,0x18,0xd2,0x0f]
78; CHECK-NEXT:    retq # encoding: [0xc3]
79entry:
80  %shamt = and i8 %cl, 31
81  %a = load i8, ptr %ptr
82  %0 = lshr i8 %a, %shamt
83  %1 = sub i8 8, %shamt
84  %2 = shl i8 %a, %1
85  %ror = or i8 %0, %2
86  ret i8 %ror
87}
88
89define i16 @ror16mcl(ptr %ptr, i16 %cl) {
90; CHECK-LABEL: ror16mcl:
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:    rorw %cl, (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd3,0x0f]
95; CHECK-NEXT:    retq # encoding: [0xc3]
96entry:
97  %a = load i16, ptr %ptr
98  %0 = lshr i16 %a, %cl
99  %1 = sub i16 16, %cl
100  %2 = shl i16 %a, %1
101  %ror = or i16 %0, %2
102  ret i16 %ror
103}
104
105define i16 @ror16mcl_mask(ptr %ptr, i16 %cl) {
106; CHECK-LABEL: ror16mcl_mask:
107; CHECK:       # %bb.0: # %entry
108; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
109; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
110; CHECK-NEXT:    rorw %cl, (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd3,0x0f]
111; CHECK-NEXT:    retq # encoding: [0xc3]
112entry:
113  %shamt = and i16 %cl, 31
114  %a = load i16, ptr %ptr
115  %0 = lshr i16 %a, %shamt
116  %1 = sub i16 16, %shamt
117  %2 = shl i16 %a, %1
118  %ror = or i16 %0, %2
119  ret i16 %ror
120}
121
122define i32 @ror32mcl(ptr %ptr, i32 %cl) {
123; CHECK-LABEL: ror32mcl:
124; CHECK:       # %bb.0: # %entry
125; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
126; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
127; CHECK-NEXT:    rorl %cl, (%rdi), %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd3,0x0f]
128; CHECK-NEXT:    retq # encoding: [0xc3]
129entry:
130  %a = load i32, ptr %ptr
131  %0 = lshr i32 %a, %cl
132  %1 = sub i32 32, %cl
133  %2 = shl i32 %a, %1
134  %ror = or i32 %0, %2
135  ret i32 %ror
136}
137
138define i32 @ror32mcl_mask(ptr %ptr, i32 %cl) {
139; CHECK-LABEL: ror32mcl_mask:
140; CHECK:       # %bb.0: # %entry
141; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
142; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
143; CHECK-NEXT:    rorl %cl, (%rdi), %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd3,0x0f]
144; CHECK-NEXT:    retq # encoding: [0xc3]
145entry:
146  %shamt = and i32 %cl, 31
147  %a = load i32, ptr %ptr
148  %0 = lshr i32 %a, %shamt
149  %1 = sub i32 32, %shamt
150  %2 = shl i32 %a, %1
151  %ror = or i32 %0, %2
152  ret i32 %ror
153}
154
155define i64 @ror64mcl(ptr %ptr, i64 %cl) {
156; CHECK-LABEL: ror64mcl:
157; CHECK:       # %bb.0: # %entry
158; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
159; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
160; CHECK-NEXT:    rorq %cl, (%rdi), %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd3,0x0f]
161; CHECK-NEXT:    retq # encoding: [0xc3]
162entry:
163  %a = load i64, ptr %ptr
164  %0 = lshr i64 %a, %cl
165  %1 = sub i64 64, %cl
166  %2 = shl i64 %a, %1
167  %ror = or i64 %0, %2
168  ret i64 %ror
169}
170
171define i64 @ror64mcl_mask(ptr %ptr, i64 %cl) {
172; CHECK-LABEL: ror64mcl_mask:
173; CHECK:       # %bb.0: # %entry
174; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
175; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
176; CHECK-NEXT:    rorq %cl, (%rdi), %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd3,0x0f]
177; CHECK-NEXT:    retq # encoding: [0xc3]
178entry:
179  %shamt = and i64 %cl, 63
180  %a = load i64, ptr %ptr
181  %0 = lshr i64 %a, %shamt
182  %1 = sub i64 64, %shamt
183  %2 = shl i64 %a, %1
184  %ror = or i64 %0, %2
185  ret i64 %ror
186}
187
188define i8 @ror8mi(ptr %ptr) {
189; CHECK-LABEL: ror8mi:
190; CHECK:       # %bb.0: # %entry
191; CHECK-NEXT:    rolb $5, (%rdi), %al # encoding: [0x62,0xf4,0x7c,0x18,0xc0,0x07,0x05]
192; CHECK-NEXT:    retq # encoding: [0xc3]
193entry:
194  %a = load i8, ptr %ptr
195  %0 = lshr i8 %a, 3
196  %1 = shl i8 %a, 5
197  %ror = or i8 %0, %1
198  ret i8 %ror
199}
200
201define i16 @ror16mi(ptr %ptr) {
202; CHECK-LABEL: ror16mi:
203; CHECK:       # %bb.0: # %entry
204; CHECK-NEXT:    rolw $13, (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xc1,0x07,0x0d]
205; CHECK-NEXT:    retq # encoding: [0xc3]
206entry:
207  %a = load i16, ptr %ptr
208  %0 = lshr i16 %a, 3
209  %1 = shl i16 %a, 13
210  %ror = or i16 %0, %1
211  ret i16 %ror
212}
213
214define i32 @ror32mi(ptr %ptr) {
215; CHECK-LABEL: ror32mi:
216; CHECK:       # %bb.0: # %entry
217; CHECK-NEXT:    roll $29, (%rdi), %eax # encoding: [0x62,0xf4,0x7c,0x18,0xc1,0x07,0x1d]
218; CHECK-NEXT:    retq # encoding: [0xc3]
219entry:
220  %a = load i32, ptr %ptr
221  %0 = lshr i32 %a, 3
222  %1 = shl i32 %a, 29
223  %ror = or i32 %0, %1
224  ret i32 %ror
225}
226
227define i64 @ror64mi(ptr %ptr) {
228; CHECK-LABEL: ror64mi:
229; CHECK:       # %bb.0: # %entry
230; CHECK-NEXT:    rolq $61, (%rdi), %rax # encoding: [0x62,0xf4,0xfc,0x18,0xc1,0x07,0x3d]
231; CHECK-NEXT:    retq # encoding: [0xc3]
232entry:
233  %a = load i64, ptr %ptr
234  %0 = lshr i64 %a, 3
235  %1 = shl i64 %a, 61
236  %ror = or i64 %0, %1
237  ret i64 %ror
238}
239
240define i8 @ror8r1(i8 noundef %a) {
241; CHECK-LABEL: ror8r1:
242; CHECK:       # %bb.0: # %entry
243; CHECK-NEXT:    rorb %dil, %al # encoding: [0x62,0xf4,0x7c,0x18,0xd0,0xcf]
244; CHECK-NEXT:    retq # encoding: [0xc3]
245entry:
246  %0 = lshr i8 %a, 1
247  %1 = shl i8 %a, 7
248  %ror = or i8 %0, %1
249  ret i8 %ror
250}
251
252define i16 @ror16r1(i16 noundef %a) {
253; CHECK-LABEL: ror16r1:
254; CHECK:       # %bb.0: # %entry
255; CHECK-NEXT:    rorw %di, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd1,0xcf]
256; CHECK-NEXT:    retq # encoding: [0xc3]
257entry:
258  %0 = lshr i16 %a, 1
259  %1 = shl i16 %a, 15
260  %ror = or i16 %0, %1
261  ret i16 %ror
262}
263
264define i32 @ror32r1(i32 noundef %a) {
265; CHECK-LABEL: ror32r1:
266; CHECK:       # %bb.0: # %entry
267; CHECK-NEXT:    rorl %edi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd1,0xcf]
268; CHECK-NEXT:    retq # encoding: [0xc3]
269entry:
270  %0 = lshr i32 %a, 1
271  %1 = shl i32 %a, 31
272  %ror = or i32 %0, %1
273  ret i32 %ror
274}
275
276define i64 @ror64r1(i64 noundef %a) {
277; CHECK-LABEL: ror64r1:
278; CHECK:       # %bb.0: # %entry
279; CHECK-NEXT:    rorq %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd1,0xcf]
280; CHECK-NEXT:    retq # encoding: [0xc3]
281entry:
282  %0 = lshr i64 %a, 1
283  %1 = shl i64 %a, 63
284  %ror = or i64 %0, %1
285  ret i64 %ror
286}
287
288define i8 @ror8rcl(i8 noundef %a, i8 %cl) {
289; CHECK-LABEL: ror8rcl:
290; CHECK:       # %bb.0: # %entry
291; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
292; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
293; CHECK-NEXT:    rorb %cl, %dil, %al # encoding: [0x62,0xf4,0x7c,0x18,0xd2,0xcf]
294; CHECK-NEXT:    retq # encoding: [0xc3]
295entry:
296  %0 = lshr i8 %a, %cl
297  %1 = sub i8 8, %cl
298  %2 = shl i8 %a, %1
299  %ror = or i8 %0, %2
300  ret i8 %ror
301}
302
303define i8 @ror8rcl_mask(i8 noundef %a, i8 %cl) {
304; CHECK-LABEL: ror8rcl_mask:
305; CHECK:       # %bb.0: # %entry
306; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
307; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
308; CHECK-NEXT:    rorb %cl, %dil, %al # encoding: [0x62,0xf4,0x7c,0x18,0xd2,0xcf]
309; CHECK-NEXT:    retq # encoding: [0xc3]
310entry:
311  %shamt = and i8 %cl, 31
312  %0 = lshr i8 %a, %shamt
313  %1 = sub i8 8, %shamt
314  %2 = shl i8 %a, %1
315  %ror = or i8 %0, %2
316  ret i8 %ror
317}
318
319define i16 @ror16rcl(i16 noundef %a, i16 %cl) {
320; CHECK-LABEL: ror16rcl:
321; CHECK:       # %bb.0: # %entry
322; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
323; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
324; CHECK-NEXT:    rorw %cl, %di, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd3,0xcf]
325; CHECK-NEXT:    retq # encoding: [0xc3]
326entry:
327  %0 = lshr i16 %a, %cl
328  %1 = sub i16 16, %cl
329  %2 = shl i16 %a, %1
330  %ror = or i16 %0, %2
331  ret i16 %ror
332}
333
334define i16 @ror16rcl_mask(i16 noundef %a, i16 %cl) {
335; CHECK-LABEL: ror16rcl_mask:
336; CHECK:       # %bb.0: # %entry
337; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
338; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
339; CHECK-NEXT:    rorw %cl, %di, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd3,0xcf]
340; CHECK-NEXT:    retq # encoding: [0xc3]
341entry:
342  %shamt = and i16 %cl, 31
343  %0 = lshr i16 %a, %shamt
344  %1 = sub i16 16, %shamt
345  %2 = shl i16 %a, %1
346  %ror = or i16 %0, %2
347  ret i16 %ror
348}
349
350define i32 @ror32rcl(i32 noundef %a, i32 %cl) {
351; CHECK-LABEL: ror32rcl:
352; CHECK:       # %bb.0: # %entry
353; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
354; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
355; CHECK-NEXT:    rorl %cl, %edi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd3,0xcf]
356; CHECK-NEXT:    retq # encoding: [0xc3]
357entry:
358  %0 = lshr i32 %a, %cl
359  %1 = sub i32 32, %cl
360  %2 = shl i32 %a, %1
361  %ror = or i32 %0, %2
362  ret i32 %ror
363}
364
365define i32 @ror32rcl_mask(i32 noundef %a, i32 %cl) {
366; CHECK-LABEL: ror32rcl_mask:
367; CHECK:       # %bb.0: # %entry
368; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
369; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
370; CHECK-NEXT:    rorl %cl, %edi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd3,0xcf]
371; CHECK-NEXT:    retq # encoding: [0xc3]
372entry:
373  %shamt = and i32 %cl, 31
374  %0 = lshr i32 %a, %shamt
375  %1 = sub i32 32, %shamt
376  %2 = shl i32 %a, %1
377  %ror = or i32 %0, %2
378  ret i32 %ror
379}
380
381define i64 @ror64rcl(i64 noundef %a, i64 %cl) {
382; CHECK-LABEL: ror64rcl:
383; CHECK:       # %bb.0: # %entry
384; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
385; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
386; CHECK-NEXT:    rorq %cl, %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd3,0xcf]
387; CHECK-NEXT:    retq # encoding: [0xc3]
388entry:
389  %0 = lshr i64 %a, %cl
390  %1 = sub i64 64, %cl
391  %2 = shl i64 %a, %1
392  %ror = or i64 %0, %2
393  ret i64 %ror
394}
395
396define i64 @ror64rcl_mask(i64 noundef %a, i64 %cl) {
397; CHECK-LABEL: ror64rcl_mask:
398; CHECK:       # %bb.0: # %entry
399; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
400; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
401; CHECK-NEXT:    rorq %cl, %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd3,0xcf]
402; CHECK-NEXT:    retq # encoding: [0xc3]
403entry:
404  %shamt = and i64 %cl, 63
405  %0 = lshr i64 %a, %shamt
406  %1 = sub i64 64, %shamt
407  %2 = shl i64 %a, %1
408  %ror = or i64 %0, %2
409  ret i64 %ror
410}
411
412define i8 @ror8ri(i8 noundef %a) {
413; CHECK-LABEL: ror8ri:
414; CHECK:       # %bb.0: # %entry
415; CHECK-NEXT:    rolb $5, %dil, %al # encoding: [0x62,0xf4,0x7c,0x18,0xc0,0xc7,0x05]
416; CHECK-NEXT:    retq # encoding: [0xc3]
417entry:
418  %0 = lshr i8 %a, 3
419  %1 = shl i8 %a, 5
420  %ror = or i8 %0, %1
421  ret i8 %ror
422}
423
424define i16 @ror16ri(i16 noundef %a) {
425; CHECK-LABEL: ror16ri:
426; CHECK:       # %bb.0: # %entry
427; CHECK-NEXT:    rolw $13, %di, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xc1,0xc7,0x0d]
428; CHECK-NEXT:    retq # encoding: [0xc3]
429entry:
430  %0 = lshr i16 %a, 3
431  %1 = shl i16 %a, 13
432  %ror = or i16 %0, %1
433  ret i16 %ror
434}
435
436define i32 @ror32ri(i32 noundef %a) {
437; CHECK-LABEL: ror32ri:
438; CHECK:       # %bb.0: # %entry
439; CHECK-NEXT:    roll $29, %edi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0xc1,0xc7,0x1d]
440; CHECK-NEXT:    retq # encoding: [0xc3]
441entry:
442  %0 = lshr i32 %a, 3
443  %1 = shl i32 %a, 29
444  %ror = or i32 %0, %1
445  ret i32 %ror
446}
447
448define i64 @ror64ri(i64 noundef %a) {
449; CHECK-LABEL: ror64ri:
450; CHECK:       # %bb.0: # %entry
451; CHECK-NEXT:    rolq $61, %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0xc1,0xc7,0x3d]
452; CHECK-NEXT:    retq # encoding: [0xc3]
453entry:
454  %0 = lshr i64 %a, 3
455  %1 = shl i64 %a, 61
456  %ror = or i64 %0, %1
457  ret i64 %ror
458}
459
460define void @ror8m1_legacy(ptr %ptr) {
461; CHECK-LABEL: ror8m1_legacy:
462; CHECK:       # %bb.0: # %entry
463; CHECK-NEXT:    rorb (%rdi) # encoding: [0xd0,0x0f]
464; CHECK-NEXT:    retq # encoding: [0xc3]
465entry:
466  %a = load i8, ptr %ptr
467  %0 = lshr i8 %a, 1
468  %1 = shl i8 %a, 7
469  %ror = or i8 %0, %1
470  store i8 %ror, ptr %ptr
471  ret void
472}
473
474define void @ror16m1_legacy(ptr %ptr) {
475; CHECK-LABEL: ror16m1_legacy:
476; CHECK:       # %bb.0: # %entry
477; CHECK-NEXT:    rorw (%rdi) # encoding: [0x66,0xd1,0x0f]
478; CHECK-NEXT:    retq # encoding: [0xc3]
479entry:
480  %a = load i16, ptr %ptr
481  %0 = lshr i16 %a, 1
482  %1 = shl i16 %a, 15
483  %ror = or i16 %0, %1
484  store i16 %ror, ptr %ptr
485  ret void
486}
487
488define void @ror32m1_legacy(ptr %ptr) {
489; CHECK-LABEL: ror32m1_legacy:
490; CHECK:       # %bb.0: # %entry
491; CHECK-NEXT:    rorl (%rdi) # encoding: [0xd1,0x0f]
492; CHECK-NEXT:    retq # encoding: [0xc3]
493entry:
494  %a = load i32, ptr %ptr
495  %0 = lshr i32 %a, 1
496  %1 = shl i32 %a, 31
497  %ror = or i32 %0, %1
498  store i32 %ror, ptr %ptr
499  ret void
500}
501
502define void @ror64m1_legacy(ptr %ptr) {
503; CHECK-LABEL: ror64m1_legacy:
504; CHECK:       # %bb.0: # %entry
505; CHECK-NEXT:    rorq (%rdi) # encoding: [0x48,0xd1,0x0f]
506; CHECK-NEXT:    retq # encoding: [0xc3]
507entry:
508  %a = load i64, ptr %ptr
509  %0 = lshr i64 %a, 1
510  %1 = shl i64 %a, 63
511  %ror = or i64 %0, %1
512  store i64 %ror, ptr %ptr
513  ret void
514}
515
516define void @ror8mcl_legacy(ptr %ptr, i8 %cl) {
517; CHECK-LABEL: ror8mcl_legacy:
518; CHECK:       # %bb.0: # %entry
519; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
520; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
521; CHECK-NEXT:    rorb %cl, (%rdi) # encoding: [0xd2,0x0f]
522; CHECK-NEXT:    retq # encoding: [0xc3]
523entry:
524  %a = load i8, ptr %ptr
525  %0 = lshr i8 %a, %cl
526  %1 = sub i8 8, %cl
527  %2 = shl i8 %a, %1
528  %ror = or i8 %0, %2
529  store i8 %ror, ptr %ptr
530  ret void
531}
532
533define void @ror16mcl_legacy(ptr %ptr, i16 %cl) {
534; CHECK-LABEL: ror16mcl_legacy:
535; CHECK:       # %bb.0: # %entry
536; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
537; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
538; CHECK-NEXT:    rorw %cl, (%rdi) # encoding: [0x66,0xd3,0x0f]
539; CHECK-NEXT:    retq # encoding: [0xc3]
540entry:
541  %a = load i16, ptr %ptr
542  %0 = lshr i16 %a, %cl
543  %1 = sub i16 16, %cl
544  %2 = shl i16 %a, %1
545  %ror = or i16 %0, %2
546  store i16 %ror, ptr %ptr
547  ret void
548}
549
550define void @ror32mcl_legacy(ptr %ptr, i32 %cl) {
551; CHECK-LABEL: ror32mcl_legacy:
552; CHECK:       # %bb.0: # %entry
553; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
554; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
555; CHECK-NEXT:    rorl %cl, (%rdi) # encoding: [0xd3,0x0f]
556; CHECK-NEXT:    retq # encoding: [0xc3]
557entry:
558  %a = load i32, ptr %ptr
559  %0 = lshr i32 %a, %cl
560  %1 = sub i32 32, %cl
561  %2 = shl i32 %a, %1
562  %ror = or i32 %0, %2
563  store i32 %ror, ptr %ptr
564  ret void
565}
566
567define void @ror64mcl_legacy(ptr %ptr, i64 %cl) {
568; CHECK-LABEL: ror64mcl_legacy:
569; CHECK:       # %bb.0: # %entry
570; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
571; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
572; CHECK-NEXT:    rorq %cl, (%rdi) # encoding: [0x48,0xd3,0x0f]
573; CHECK-NEXT:    retq # encoding: [0xc3]
574entry:
575  %a = load i64, ptr %ptr
576  %0 = lshr i64 %a, %cl
577  %1 = sub i64 64, %cl
578  %2 = shl i64 %a, %1
579  %ror = or i64 %0, %2
580  store i64 %ror, ptr %ptr
581  ret void
582}
583
584define void @ror8mi_legacy(ptr %ptr) {
585; CHECK-LABEL: ror8mi_legacy:
586; CHECK:       # %bb.0: # %entry
587; CHECK-NEXT:    rolb $5, (%rdi) # encoding: [0xc0,0x07,0x05]
588; CHECK-NEXT:    retq # encoding: [0xc3]
589entry:
590  %a = load i8, ptr %ptr
591  %0 = lshr i8 %a, 3
592  %1 = shl i8 %a, 5
593  %ror = or i8 %0, %1
594  store i8 %ror, ptr %ptr
595  ret void
596}
597
598define void @ror16mi_legacy(ptr %ptr) {
599; CHECK-LABEL: ror16mi_legacy:
600; CHECK:       # %bb.0: # %entry
601; CHECK-NEXT:    rolw $13, (%rdi) # encoding: [0x66,0xc1,0x07,0x0d]
602; CHECK-NEXT:    retq # encoding: [0xc3]
603entry:
604  %a = load i16, ptr %ptr
605  %0 = lshr i16 %a, 3
606  %1 = shl i16 %a, 13
607  %ror = or i16 %0, %1
608  store i16 %ror, ptr %ptr
609  ret void
610}
611
612define void @ror32mi_legacy(ptr %ptr) {
613; CHECK-LABEL: ror32mi_legacy:
614; CHECK:       # %bb.0: # %entry
615; CHECK-NEXT:    roll $29, (%rdi) # encoding: [0xc1,0x07,0x1d]
616; CHECK-NEXT:    retq # encoding: [0xc3]
617entry:
618  %a = load i32, ptr %ptr
619  %0 = lshr i32 %a, 3
620  %1 = shl i32 %a, 29
621  %ror = or i32 %0, %1
622  store i32 %ror, ptr %ptr
623  ret void
624}
625
626define void @ror64mi_legacy(ptr %ptr) {
627; CHECK-LABEL: ror64mi_legacy:
628; CHECK:       # %bb.0: # %entry
629; CHECK-NEXT:    rolq $61, (%rdi) # encoding: [0x48,0xc1,0x07,0x3d]
630; CHECK-NEXT:    retq # encoding: [0xc3]
631entry:
632  %a = load i64, ptr %ptr
633  %0 = lshr i64 %a, 3
634  %1 = shl i64 %a, 61
635  %ror = or i64 %0, %1
636  store i64 %ror, ptr %ptr
637  ret void
638}
639