[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / X86 / apx / rol.ll
blob58ddc55ab6aba1dac159ac528a92e450fbd21fc8
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
4 define i8 @rol8m1(ptr %ptr) {
5 ; CHECK-LABEL: rol8m1:
6 ; CHECK:       # %bb.0: # %entry
7 ; CHECK-NEXT:    rolb (%rdi), %al # encoding: [0x62,0xf4,0x7c,0x18,0xd0,0x07]
8 ; CHECK-NEXT:    retq # encoding: [0xc3]
9 entry:
10   %a = load i8, ptr %ptr
11   %0 = shl i8 %a, 1
12   %1 = lshr i8 %a, 7
13   %rol = or i8 %0, %1
14   ret i8 %rol
17 define i8 @rol8m1_intrinsic(ptr %ptr)  {
18 ; CHECK-LABEL: rol8m1_intrinsic:
19 ; CHECK:       # %bb.0:
20 ; CHECK-NEXT:    rolb (%rdi), %al # encoding: [0x62,0xf4,0x7c,0x18,0xd0,0x07]
21 ; CHECK-NEXT:    retq # encoding: [0xc3]
22   %a = load i8, ptr %ptr
23   %f = call i8 @llvm.fshr.i8(i8 %a, i8 %a, i8 7)
24   ret i8 %f
27 define i16 @rol16m1(ptr %ptr) {
28 ; CHECK-LABEL: rol16m1:
29 ; CHECK:       # %bb.0: # %entry
30 ; CHECK-NEXT:    rolw (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd1,0x07]
31 ; CHECK-NEXT:    retq # encoding: [0xc3]
32 entry:
33   %a = load i16, ptr %ptr
34   %0 = shl i16 %a, 1
35   %1 = lshr i16 %a, 15
36   %rol = or i16 %0, %1
37   ret i16 %rol
40 define i16 @rol16m1_intrinsic(ptr %ptr)  {
41 ; CHECK-LABEL: rol16m1_intrinsic:
42 ; CHECK:       # %bb.0:
43 ; CHECK-NEXT:    rolw (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd1,0x07]
44 ; CHECK-NEXT:    retq # encoding: [0xc3]
45   %a = load i16, ptr %ptr
46   %f = call i16 @llvm.fshr.i16(i16 %a, i16 %a, i16 15)
47   ret i16 %f
50 define i32 @rol32m1(ptr %ptr) {
51 ; CHECK-LABEL: rol32m1:
52 ; CHECK:       # %bb.0: # %entry
53 ; CHECK-NEXT:    roll (%rdi), %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd1,0x07]
54 ; CHECK-NEXT:    retq # encoding: [0xc3]
55 entry:
56   %a = load i32, ptr %ptr
57   %0 = shl i32 %a, 1
58   %1 = lshr i32 %a, 31
59   %rol = or i32 %0, %1
60   ret i32 %rol
63 define i32 @rol32m1_intrinsic(ptr %ptr)  {
64 ; CHECK-LABEL: rol32m1_intrinsic:
65 ; CHECK:       # %bb.0:
66 ; CHECK-NEXT:    roll (%rdi), %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd1,0x07]
67 ; CHECK-NEXT:    retq # encoding: [0xc3]
68   %a = load i32, ptr %ptr
69   %f = call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 31)
70   ret i32 %f
73 define i64 @rol64m1(ptr %ptr) {
74 ; CHECK-LABEL: rol64m1:
75 ; CHECK:       # %bb.0: # %entry
76 ; CHECK-NEXT:    rolq (%rdi), %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd1,0x07]
77 ; CHECK-NEXT:    retq # encoding: [0xc3]
78 entry:
79   %a = load i64, ptr %ptr
80   %0 = shl i64 %a, 1
81   %1 = lshr i64 %a, 63
82   %rol = or i64 %0, %1
83   ret i64 %rol
86 define i64 @rol64m1_intrinsic(ptr %ptr)  {
87 ; CHECK-LABEL: rol64m1_intrinsic:
88 ; CHECK:       # %bb.0:
89 ; CHECK-NEXT:    rolq (%rdi), %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd1,0x07]
90 ; CHECK-NEXT:    retq # encoding: [0xc3]
91   %a = load i64, ptr %ptr
92   %f = call i64 @llvm.fshr.i64(i64 %a, i64 %a, i64 63)
93   ret i64 %f
96 define i8 @rol8mcl(ptr %ptr, i8 %cl) {
97 ; CHECK-LABEL: rol8mcl:
98 ; CHECK:       # %bb.0: # %entry
99 ; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
100 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
101 ; CHECK-NEXT:    rolb %cl, (%rdi), %al # encoding: [0x62,0xf4,0x7c,0x18,0xd2,0x07]
102 ; CHECK-NEXT:    retq # encoding: [0xc3]
103 entry:
104   %a = load i8, ptr %ptr
105   %0 = shl i8 %a, %cl
106   %1 = sub i8 8, %cl
107   %2 = lshr i8 %a, %1
108   %rol = or i8 %0, %2
109   ret i8 %rol
112 define i16 @rol16mcl(ptr %ptr, i16 %cl) {
113 ; CHECK-LABEL: rol16mcl:
114 ; CHECK:       # %bb.0: # %entry
115 ; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
116 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
117 ; CHECK-NEXT:    rolw %cl, (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd3,0x07]
118 ; CHECK-NEXT:    retq # encoding: [0xc3]
119 entry:
120   %a = load i16, ptr %ptr
121   %0 = shl i16 %a, %cl
122   %1 = sub i16 16, %cl
123   %2 = lshr i16 %a, %1
124   %rol = or i16 %0, %2
125   ret i16 %rol
128 define i32 @rol32mcl(ptr %ptr, i32 %cl) {
129 ; CHECK-LABEL: rol32mcl:
130 ; CHECK:       # %bb.0: # %entry
131 ; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
132 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
133 ; CHECK-NEXT:    roll %cl, (%rdi), %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd3,0x07]
134 ; CHECK-NEXT:    retq # encoding: [0xc3]
135 entry:
136   %a = load i32, ptr %ptr
137   %0 = shl i32 %a, %cl
138   %1 = sub i32 32, %cl
139   %2 = lshr i32 %a, %1
140   %rol = or i32 %0, %2
141   ret i32 %rol
144 define i64 @rol64mcl(ptr %ptr, i64 %cl) {
145 ; CHECK-LABEL: rol64mcl:
146 ; CHECK:       # %bb.0: # %entry
147 ; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
148 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
149 ; CHECK-NEXT:    rolq %cl, (%rdi), %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd3,0x07]
150 ; CHECK-NEXT:    retq # encoding: [0xc3]
151 entry:
152   %a = load i64, ptr %ptr
153   %0 = shl i64 %a, %cl
154   %1 = sub i64 64, %cl
155   %2 = lshr i64 %a, %1
156   %rol = or i64 %0, %2
157   ret i64 %rol
160 define i8 @rol8mi(ptr %ptr) {
161 ; CHECK-LABEL: rol8mi:
162 ; CHECK:       # %bb.0: # %entry
163 ; CHECK-NEXT:    rolb $3, (%rdi), %al # encoding: [0x62,0xf4,0x7c,0x18,0xc0,0x07,0x03]
164 ; CHECK-NEXT:    retq # encoding: [0xc3]
165 entry:
166   %a = load i8, ptr %ptr
167   %0 = shl i8 %a, 3
168   %1 = lshr i8 %a, 5
169   %rol = or i8 %0, %1
170   ret i8 %rol
173 define i16 @rol16mi(ptr %ptr) {
174 ; CHECK-LABEL: rol16mi:
175 ; CHECK:       # %bb.0: # %entry
176 ; CHECK-NEXT:    rolw $3, (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xc1,0x07,0x03]
177 ; CHECK-NEXT:    retq # encoding: [0xc3]
178 entry:
179   %a = load i16, ptr %ptr
180   %0 = shl i16 %a, 3
181   %1 = lshr i16 %a, 13
182   %rol = or i16 %0, %1
183   ret i16 %rol
186 define i32 @rol32mi(ptr %ptr) {
187 ; CHECK-LABEL: rol32mi:
188 ; CHECK:       # %bb.0: # %entry
189 ; CHECK-NEXT:    roll $3, (%rdi), %eax # encoding: [0x62,0xf4,0x7c,0x18,0xc1,0x07,0x03]
190 ; CHECK-NEXT:    retq # encoding: [0xc3]
191 entry:
192   %a = load i32, ptr %ptr
193   %0 = shl i32 %a, 3
194   %1 = lshr i32 %a, 29
195   %rol = or i32 %0, %1
196   ret i32 %rol
199 define i64 @rol64mi(ptr %ptr) {
200 ; CHECK-LABEL: rol64mi:
201 ; CHECK:       # %bb.0: # %entry
202 ; CHECK-NEXT:    rolq $3, (%rdi), %rax # encoding: [0x62,0xf4,0xfc,0x18,0xc1,0x07,0x03]
203 ; CHECK-NEXT:    retq # encoding: [0xc3]
204 entry:
205   %a = load i64, ptr %ptr
206   %0 = shl i64 %a, 3
207   %1 = lshr i64 %a, 61
208   %rol = or i64 %0, %1
209   ret i64 %rol
212 define i8 @rol8r1(i8 noundef %a) {
213 ; CHECK-LABEL: rol8r1:
214 ; CHECK:       # %bb.0: # %entry
215 ; CHECK-NEXT:    rolb %dil, %al # encoding: [0x62,0xf4,0x7c,0x18,0xd0,0xc7]
216 ; CHECK-NEXT:    retq # encoding: [0xc3]
217 entry:
218   %0 = shl i8 %a, 1
219   %1 = lshr i8 %a, 7
220   %rol = or i8 %0, %1
221   ret i8 %rol
224 define i8 @rol8r1_intrinsic(i8 noundef %a)  {
225 ; CHECK-LABEL: rol8r1_intrinsic:
226 ; CHECK:       # %bb.0:
227 ; CHECK-NEXT:    rolb %dil, %al # encoding: [0x62,0xf4,0x7c,0x18,0xd0,0xc7]
228 ; CHECK-NEXT:    retq # encoding: [0xc3]
229   %f = call i8 @llvm.fshr.i8(i8 %a, i8 %a, i8 7)
230   ret i8 %f
233 define i16 @rol16r1(i16 noundef %a) {
234 ; CHECK-LABEL: rol16r1:
235 ; CHECK:       # %bb.0: # %entry
236 ; CHECK-NEXT:    rolw %di, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd1,0xc7]
237 ; CHECK-NEXT:    retq # encoding: [0xc3]
238 entry:
239   %0 = shl i16 %a, 1
240   %1 = lshr i16 %a, 15
241   %rol = or i16 %0, %1
242   ret i16 %rol
245 define i16 @rol16r1_intrinsic(i16 noundef %a)  {
246 ; CHECK-LABEL: rol16r1_intrinsic:
247 ; CHECK:       # %bb.0:
248 ; CHECK-NEXT:    rolw %di, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd1,0xc7]
249 ; CHECK-NEXT:    retq # encoding: [0xc3]
250   %f = call i16 @llvm.fshr.i16(i16 %a, i16 %a, i16 15)
251   ret i16 %f
254 define i32 @rol32r1(i32 noundef %a) {
255 ; CHECK-LABEL: rol32r1:
256 ; CHECK:       # %bb.0: # %entry
257 ; CHECK-NEXT:    roll %edi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd1,0xc7]
258 ; CHECK-NEXT:    retq # encoding: [0xc3]
259 entry:
260   %0 = shl i32 %a, 1
261   %1 = lshr i32 %a, 31
262   %rol = or i32 %0, %1
263   ret i32 %rol
266 define i32 @rol32r1_intrinsic(i32 noundef %a)  {
267 ; CHECK-LABEL: rol32r1_intrinsic:
268 ; CHECK:       # %bb.0:
269 ; CHECK-NEXT:    roll %edi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd1,0xc7]
270 ; CHECK-NEXT:    retq # encoding: [0xc3]
271   %f = call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 31)
272   ret i32 %f
275 define i64 @rol64r1(i64 noundef %a) {
276 ; CHECK-LABEL: rol64r1:
277 ; CHECK:       # %bb.0: # %entry
278 ; CHECK-NEXT:    rolq %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd1,0xc7]
279 ; CHECK-NEXT:    retq # encoding: [0xc3]
280 entry:
281   %0 = shl i64 %a, 1
282   %1 = lshr i64 %a, 63
283   %rol = or i64 %0, %1
284   ret i64 %rol
287 define i64 @rol64r1_intrinsic(i64 noundef %a)  {
288 ; CHECK-LABEL: rol64r1_intrinsic:
289 ; CHECK:       # %bb.0:
290 ; CHECK-NEXT:    rolq %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd1,0xc7]
291 ; CHECK-NEXT:    retq # encoding: [0xc3]
292   %f = call i64 @llvm.fshr.i64(i64 %a, i64 %a, i64 63)
293   ret i64 %f
296 define i8 @rol8rcl(i8 noundef %a, i8 %cl) {
297 ; CHECK-LABEL: rol8rcl:
298 ; CHECK:       # %bb.0: # %entry
299 ; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
300 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
301 ; CHECK-NEXT:    rolb %cl, %dil, %al # encoding: [0x62,0xf4,0x7c,0x18,0xd2,0xc7]
302 ; CHECK-NEXT:    retq # encoding: [0xc3]
303 entry:
304   %0 = shl i8 %a, %cl
305   %1 = sub i8 8, %cl
306   %2 = lshr i8 %a, %1
307   %rol = or i8 %0, %2
308   ret i8 %rol
311 define i16 @rol16rcl(i16 noundef %a, i16 %cl) {
312 ; CHECK-LABEL: rol16rcl:
313 ; CHECK:       # %bb.0: # %entry
314 ; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
315 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
316 ; CHECK-NEXT:    rolw %cl, %di, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xd3,0xc7]
317 ; CHECK-NEXT:    retq # encoding: [0xc3]
318 entry:
319   %0 = shl i16 %a, %cl
320   %1 = sub i16 16, %cl
321   %2 = lshr i16 %a, %1
322   %rol = or i16 %0, %2
323   ret i16 %rol
326 define i32 @rol32rcl(i32 noundef %a, i32 %cl) {
327 ; CHECK-LABEL: rol32rcl:
328 ; CHECK:       # %bb.0: # %entry
329 ; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
330 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
331 ; CHECK-NEXT:    roll %cl, %edi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0xd3,0xc7]
332 ; CHECK-NEXT:    retq # encoding: [0xc3]
333 entry:
334   %0 = shl i32 %a, %cl
335   %1 = sub i32 32, %cl
336   %2 = lshr i32 %a, %1
337   %rol = or i32 %0, %2
338   ret i32 %rol
341 define i64 @rol64rcl(i64 noundef %a, i64 %cl) {
342 ; CHECK-LABEL: rol64rcl:
343 ; CHECK:       # %bb.0: # %entry
344 ; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
345 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
346 ; CHECK-NEXT:    rolq %cl, %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0xd3,0xc7]
347 ; CHECK-NEXT:    retq # encoding: [0xc3]
348 entry:
349   %0 = shl i64 %a, %cl
350   %1 = sub i64 64, %cl
351   %2 = lshr i64 %a, %1
352   %rol = or i64 %0, %2
353   ret i64 %rol
356 define i8 @rol8ri(i8 noundef %a) {
357 ; CHECK-LABEL: rol8ri:
358 ; CHECK:       # %bb.0: # %entry
359 ; CHECK-NEXT:    rolb $3, %dil, %al # encoding: [0x62,0xf4,0x7c,0x18,0xc0,0xc7,0x03]
360 ; CHECK-NEXT:    retq # encoding: [0xc3]
361 entry:
362   %0 = shl i8 %a, 3
363   %1 = lshr i8 %a, 5
364   %rol = or i8 %0, %1
365   ret i8 %rol
368 define i16 @rol16ri(i16 noundef %a) {
369 ; CHECK-LABEL: rol16ri:
370 ; CHECK:       # %bb.0: # %entry
371 ; CHECK-NEXT:    rolw $3, %di, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xc1,0xc7,0x03]
372 ; CHECK-NEXT:    retq # encoding: [0xc3]
373 entry:
374   %0 = shl i16 %a, 3
375   %1 = lshr i16 %a, 13
376   %rol = or i16 %0, %1
377   ret i16 %rol
380 define i32 @rol32ri(i32 noundef %a) {
381 ; CHECK-LABEL: rol32ri:
382 ; CHECK:       # %bb.0: # %entry
383 ; CHECK-NEXT:    roll $3, %edi, %eax # encoding: [0x62,0xf4,0x7c,0x18,0xc1,0xc7,0x03]
384 ; CHECK-NEXT:    retq # encoding: [0xc3]
385 entry:
386   %0 = shl i32 %a, 3
387   %1 = lshr i32 %a, 29
388   %rol = or i32 %0, %1
389   ret i32 %rol
392 define i64 @rol64ri(i64 noundef %a) {
393 ; CHECK-LABEL: rol64ri:
394 ; CHECK:       # %bb.0: # %entry
395 ; CHECK-NEXT:    rolq $3, %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0xc1,0xc7,0x03]
396 ; CHECK-NEXT:    retq # encoding: [0xc3]
397 entry:
398   %0 = shl i64 %a, 3
399   %1 = lshr i64 %a, 61
400   %rol = or i64 %0, %1
401   ret i64 %rol
404 define void @rol8m1_legacy(ptr %ptr) {
405 ; CHECK-LABEL: rol8m1_legacy:
406 ; CHECK:       # %bb.0: # %entry
407 ; CHECK-NEXT:    rolb (%rdi) # encoding: [0xd0,0x07]
408 ; CHECK-NEXT:    retq # encoding: [0xc3]
409 entry:
410   %a = load i8, ptr %ptr
411   %0 = shl i8 %a, 1
412   %1 = lshr i8 %a, 7
413   %rol = or i8 %0, %1
414   store i8 %rol, ptr %ptr
415   ret void
418 define void @rol16m1_legacy(ptr %ptr) {
419 ; CHECK-LABEL: rol16m1_legacy:
420 ; CHECK:       # %bb.0: # %entry
421 ; CHECK-NEXT:    rolw (%rdi) # encoding: [0x66,0xd1,0x07]
422 ; CHECK-NEXT:    retq # encoding: [0xc3]
423 entry:
424   %a = load i16, ptr %ptr
425   %0 = shl i16 %a, 1
426   %1 = lshr i16 %a, 15
427   %rol = or i16 %0, %1
428   store i16 %rol, ptr %ptr
429   ret void
432 define void @rol32m1_legacy(ptr %ptr) {
433 ; CHECK-LABEL: rol32m1_legacy:
434 ; CHECK:       # %bb.0: # %entry
435 ; CHECK-NEXT:    roll (%rdi) # encoding: [0xd1,0x07]
436 ; CHECK-NEXT:    retq # encoding: [0xc3]
437 entry:
438   %a = load i32, ptr %ptr
439   %0 = shl i32 %a, 1
440   %1 = lshr i32 %a, 31
441   %rol = or i32 %0, %1
442   store i32 %rol, ptr %ptr
443   ret void
446 define void @rol64m1_legacy(ptr %ptr) {
447 ; CHECK-LABEL: rol64m1_legacy:
448 ; CHECK:       # %bb.0: # %entry
449 ; CHECK-NEXT:    rolq (%rdi) # encoding: [0x48,0xd1,0x07]
450 ; CHECK-NEXT:    retq # encoding: [0xc3]
451 entry:
452   %a = load i64, ptr %ptr
453   %0 = shl i64 %a, 1
454   %1 = lshr i64 %a, 63
455   %rol = or i64 %0, %1
456   store i64 %rol, ptr %ptr
457   ret void
460 define void @rol8mcl_legacy(ptr %ptr, i8 %cl) {
461 ; CHECK-LABEL: rol8mcl_legacy:
462 ; CHECK:       # %bb.0: # %entry
463 ; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
464 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
465 ; CHECK-NEXT:    rolb %cl, (%rdi) # encoding: [0xd2,0x07]
466 ; CHECK-NEXT:    retq # encoding: [0xc3]
467 entry:
468   %a = load i8, ptr %ptr
469   %0 = shl i8 %a, %cl
470   %1 = sub i8 8, %cl
471   %2 = lshr i8 %a, %1
472   %rol = or i8 %0, %2
473   store i8 %rol, ptr %ptr
474   ret void
477 define void @rol16mcl_legacy(ptr %ptr, i16 %cl) {
478 ; CHECK-LABEL: rol16mcl_legacy:
479 ; CHECK:       # %bb.0: # %entry
480 ; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
481 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
482 ; CHECK-NEXT:    rolw %cl, (%rdi) # encoding: [0x66,0xd3,0x07]
483 ; CHECK-NEXT:    retq # encoding: [0xc3]
484 entry:
485   %a = load i16, ptr %ptr
486   %0 = shl i16 %a, %cl
487   %1 = sub i16 16, %cl
488   %2 = lshr i16 %a, %1
489   %rol = or i16 %0, %2
490   store i16 %rol, ptr %ptr
491   ret void
494 define void @rol32mcl_legacy(ptr %ptr, i32 %cl) {
495 ; CHECK-LABEL: rol32mcl_legacy:
496 ; CHECK:       # %bb.0: # %entry
497 ; CHECK-NEXT:    movl %esi, %ecx # encoding: [0x89,0xf1]
498 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
499 ; CHECK-NEXT:    roll %cl, (%rdi) # encoding: [0xd3,0x07]
500 ; CHECK-NEXT:    retq # encoding: [0xc3]
501 entry:
502   %a = load i32, ptr %ptr
503   %0 = shl i32 %a, %cl
504   %1 = sub i32 32, %cl
505   %2 = lshr i32 %a, %1
506   %rol = or i32 %0, %2
507   store i32 %rol, ptr %ptr
508   ret void
511 define void @rol64mcl_legacy(ptr %ptr, i64 %cl) {
512 ; CHECK-LABEL: rol64mcl_legacy:
513 ; CHECK:       # %bb.0: # %entry
514 ; CHECK-NEXT:    movq %rsi, %rcx # encoding: [0x48,0x89,0xf1]
515 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $rcx
516 ; CHECK-NEXT:    rolq %cl, (%rdi) # encoding: [0x48,0xd3,0x07]
517 ; CHECK-NEXT:    retq # encoding: [0xc3]
518 entry:
519   %a = load i64, ptr %ptr
520   %0 = shl i64 %a, %cl
521   %1 = sub i64 64, %cl
522   %2 = lshr i64 %a, %1
523   %rol = or i64 %0, %2
524   store i64 %rol, ptr %ptr
525   ret void
528 define void @rol8mi_legacy(ptr %ptr) {
529 ; CHECK-LABEL: rol8mi_legacy:
530 ; CHECK:       # %bb.0: # %entry
531 ; CHECK-NEXT:    rolb $3, (%rdi) # encoding: [0xc0,0x07,0x03]
532 ; CHECK-NEXT:    retq # encoding: [0xc3]
533 entry:
534   %a = load i8, ptr %ptr
535   %0 = shl i8 %a, 3
536   %1 = lshr i8 %a, 5
537   %rol = or i8 %0, %1
538   store i8 %rol, ptr %ptr
539   ret void
542 define void @rol16mi_legacy(ptr %ptr) {
543 ; CHECK-LABEL: rol16mi_legacy:
544 ; CHECK:       # %bb.0: # %entry
545 ; CHECK-NEXT:    rolw $3, (%rdi) # encoding: [0x66,0xc1,0x07,0x03]
546 ; CHECK-NEXT:    retq # encoding: [0xc3]
547 entry:
548   %a = load i16, ptr %ptr
549   %0 = shl i16 %a, 3
550   %1 = lshr i16 %a, 13
551   %rol = or i16 %0, %1
552   store i16 %rol, ptr %ptr
553   ret void
556 define void @rol32mi_legacy(ptr %ptr) {
557 ; CHECK-LABEL: rol32mi_legacy:
558 ; CHECK:       # %bb.0: # %entry
559 ; CHECK-NEXT:    roll $3, (%rdi) # encoding: [0xc1,0x07,0x03]
560 ; CHECK-NEXT:    retq # encoding: [0xc3]
561 entry:
562   %a = load i32, ptr %ptr
563   %0 = shl i32 %a, 3
564   %1 = lshr i32 %a, 29
565   %rol = or i32 %0, %1
566   store i32 %rol, ptr %ptr
567   ret void
570 define void @rol64mi_legacy(ptr %ptr) {
571 ; CHECK-LABEL: rol64mi_legacy:
572 ; CHECK:       # %bb.0: # %entry
573 ; CHECK-NEXT:    rolq $3, (%rdi) # encoding: [0x48,0xc1,0x07,0x03]
574 ; CHECK-NEXT:    retq # encoding: [0xc3]
575 entry:
576   %a = load i64, ptr %ptr
577   %0 = shl i64 %a, 3
578   %1 = lshr i64 %a, 61
579   %rol = or i64 %0, %1
580   store i64 %rol, ptr %ptr
581   ret void