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