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