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