269 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd -verify-machineinstrs | FileCheck %s3 4define i16 @shrd16rrcl(i16 noundef %a, i16 noundef %b, i8 %cl) {5; CHECK-LABEL: shrd16rrcl:6; CHECK: # %bb.0: # %entry7; CHECK-NEXT: andb $15, %dl, %cl8; CHECK-NEXT: shrdw %cl, %di, %si, %ax9; CHECK-NEXT: retq10entry:11 %clin = sext i8 %cl to i1612 %shrd = call i16 @llvm.fshr.i16(i16 %a, i16 %b, i16 %clin)13 ret i16 %shrd14}15 16define i16 @shrd16rrcl_mask(i16 noundef %a, i16 noundef %b, i8 %cl) {17; CHECK-LABEL: shrd16rrcl_mask:18; CHECK: # %bb.0: # %entry19; CHECK-NEXT: andb $15, %dl, %cl20; CHECK-NEXT: shrdw %cl, %di, %si, %ax21; CHECK-NEXT: retq22entry:23 %clin = sext i8 %cl to i1624 %shamt = and i16 %clin, 3125 %shrd = call i16 @llvm.fshr.i16(i16 %a, i16 %b, i16 %shamt)26 ret i16 %shrd27}28 29define i32 @shrd32rrcl(i32 noundef %a, i32 noundef %b, i8 %cl) {30; CHECK-LABEL: shrd32rrcl:31; CHECK: # %bb.0: # %entry32; CHECK-NEXT: movl %edx, %ecx33; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx34; CHECK-NEXT: shrdl %cl, %edi, %esi, %eax35; CHECK-NEXT: retq36entry:37 %clin = sext i8 %cl to i3238 %shrd = call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 %clin)39 ret i32 %shrd40}41 42define i32 @shrd32rrcl_mask(i32 noundef %a, i32 noundef %b, i8 %cl) {43; CHECK-LABEL: shrd32rrcl_mask:44; CHECK: # %bb.0: # %entry45; CHECK-NEXT: movl %edx, %ecx46; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx47; CHECK-NEXT: shrdl %cl, %edi, %esi, %eax48; CHECK-NEXT: retq49entry:50 %clin = sext i8 %cl to i3251 %shamt = and i32 %clin, 3152 %shrd = call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 %shamt)53 ret i32 %shrd54}55 56define i64 @shrd64rrcl(i64 noundef %a, i64 noundef %b, i8 %cl) {57; CHECK-LABEL: shrd64rrcl:58; CHECK: # %bb.0: # %entry59; CHECK-NEXT: movl %edx, %ecx60; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx61; CHECK-NEXT: shrdq %cl, %rdi, %rsi, %rax62; CHECK-NEXT: retq63entry:64 %clin = sext i8 %cl to i6465 %shrd = call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 %clin)66 ret i64 %shrd67}68 69define i64 @shrd64rrcl_mask(i64 noundef %a, i64 noundef %b, i8 %cl) {70; CHECK-LABEL: shrd64rrcl_mask:71; CHECK: # %bb.0: # %entry72; CHECK-NEXT: movl %edx, %ecx73; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx74; CHECK-NEXT: shrdq %cl, %rdi, %rsi, %rax75; CHECK-NEXT: retq76entry:77 %clin = sext i8 %cl to i6478 %shamt = and i64 %clin, 6379 %shrd = call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 %shamt)80 ret i64 %shrd81}82 83define i16 @shrd16rri8(i16 noundef %a, i16 noundef %b) {84; CHECK-LABEL: shrd16rri8:85; CHECK: # %bb.0: # %entry86; CHECK-NEXT: shrdw $12, %di, %si, %ax87; CHECK-NEXT: retq88entry:89 %shrd = call i16 @llvm.fshr.i16(i16 %a, i16 %b, i16 12)90 ret i16 %shrd91}92 93define i32 @shrd32rri8(i32 noundef %a, i32 noundef %b) {94; CHECK-LABEL: shrd32rri8:95; CHECK: # %bb.0: # %entry96; CHECK-NEXT: shrdl $12, %edi, %esi, %eax97; CHECK-NEXT: retq98entry:99 %shrd = call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 12)100 ret i32 %shrd101}102 103define i64 @shrd64rri8(i64 noundef %a, i64 noundef %b) {104; CHECK-LABEL: shrd64rri8:105; CHECK: # %bb.0: # %entry106; CHECK-NEXT: shrdq $12, %rdi, %rsi, %rax107; CHECK-NEXT: retq108entry:109 %shrd = call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 12)110 ret i64 %shrd111}112 113define i16 @shrd16mrcl(ptr %ptr, i16 noundef %b, i8 %cl) {114; CHECK-LABEL: shrd16mrcl:115; CHECK: # %bb.0: # %entry116; CHECK-NEXT: movzwl (%rdi), %eax117; CHECK-NEXT: andb $15, %dl, %cl118; CHECK-NEXT: shrdw %cl, %ax, %si, %ax119; CHECK-NEXT: retq120entry:121 %a = load i16, ptr %ptr122 %clin = sext i8 %cl to i16123 %shrd = call i16 @llvm.fshr.i16(i16 %a, i16 %b, i16 %clin)124 ret i16 %shrd125}126 127define i32 @shrd32mrcl(ptr %ptr, i32 noundef %b, i8 %cl) {128; CHECK-LABEL: shrd32mrcl:129; CHECK: # %bb.0: # %entry130; CHECK-NEXT: movl %edx, %ecx131; CHECK-NEXT: movl (%rdi), %eax132; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx133; CHECK-NEXT: shrdl %cl, %eax, %esi, %eax134; CHECK-NEXT: retq135entry:136 %a = load i32, ptr %ptr137 %clin = sext i8 %cl to i32138 %shrd = call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 %clin)139 ret i32 %shrd140}141 142define i64 @shrd64mrcl(ptr %ptr, i64 noundef %b, i8 %cl) {143; CHECK-LABEL: shrd64mrcl:144; CHECK: # %bb.0: # %entry145; CHECK-NEXT: movl %edx, %ecx146; CHECK-NEXT: movq (%rdi), %rax147; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx148; CHECK-NEXT: shrdq %cl, %rax, %rsi, %rax149; CHECK-NEXT: retq150entry:151 %a = load i64, ptr %ptr152 %clin = sext i8 %cl to i64153 %shrd = call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 %clin)154 ret i64 %shrd155}156 157define i16 @shrd16mri8(ptr %ptr, i16 noundef %b) {158; CHECK-LABEL: shrd16mri8:159; CHECK: # %bb.0: # %entry160; CHECK-NEXT: shldw $4, %si, (%rdi), %ax161; CHECK-NEXT: retq162entry:163 %a = load i16, ptr %ptr164 %shrd = call i16 @llvm.fshr.i16(i16 %a, i16 %b, i16 12)165 ret i16 %shrd166}167 168define i32 @shrd32mri8(ptr %ptr, i32 noundef %b) {169; CHECK-LABEL: shrd32mri8:170; CHECK: # %bb.0: # %entry171; CHECK-NEXT: shldl $20, %esi, (%rdi), %eax172; CHECK-NEXT: retq173entry:174 %a = load i32, ptr %ptr175 %shrd = call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 12)176 ret i32 %shrd177}178 179define i64 @shrd64mri8(ptr %ptr, i64 noundef %b) {180; CHECK-LABEL: shrd64mri8:181; CHECK: # %bb.0: # %entry182; CHECK-NEXT: shldq $52, %rsi, (%rdi), %rax183; CHECK-NEXT: retq184entry:185 %a = load i64, ptr %ptr186 %shrd = call i64 @llvm.fshr.i64(i64 %a, i64 %b, i64 12)187 ret i64 %shrd188}189 190define void @shrd16mrcl_legacy(ptr %ptr, i16 noundef %b, i8 %cl) {191; CHECK-LABEL: shrd16mrcl_legacy:192; CHECK: # %bb.0: # %entry193; CHECK-NEXT: andb $15, %dl, %cl194; CHECK-NEXT: shrdw %cl, %si, (%rdi)195; CHECK-NEXT: retq196entry:197 %a = load i16, ptr %ptr198 %clin = sext i8 %cl to i16199 %shrd = call i16 @llvm.fshr.i16(i16 %b, i16 %a, i16 %clin)200 store i16 %shrd, ptr %ptr201 ret void202}203 204define void @shrd32mrcl_legacy(ptr %ptr, i32 noundef %b, i8 %cl) {205; CHECK-LABEL: shrd32mrcl_legacy:206; CHECK: # %bb.0: # %entry207; CHECK-NEXT: movl %edx, %ecx208; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx209; CHECK-NEXT: shrdl %cl, %esi, (%rdi)210; CHECK-NEXT: retq211entry:212 %a = load i32, ptr %ptr213 %clin = sext i8 %cl to i32214 %shrd = call i32 @llvm.fshr.i32(i32 %b, i32 %a, i32 %clin)215 store i32 %shrd, ptr %ptr216 ret void217}218 219define void @shrd64mrcl_legacy(ptr %ptr, i64 noundef %b, i8 %cl) {220; CHECK-LABEL: shrd64mrcl_legacy:221; CHECK: # %bb.0: # %entry222; CHECK-NEXT: movl %edx, %ecx223; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx224; CHECK-NEXT: shrdq %cl, %rsi, (%rdi)225; CHECK-NEXT: retq226entry:227 %a = load i64, ptr %ptr228 %clin = sext i8 %cl to i64229 %shrd = call i64 @llvm.fshr.i64(i64 %b, i64 %a, i64 %clin)230 store i64 %shrd, ptr %ptr231 ret void232}233 234define void @shrd16mri8_legacy(ptr %ptr, i16 noundef %b) {235; CHECK-LABEL: shrd16mri8_legacy:236; CHECK: # %bb.0: # %entry237; CHECK-NEXT: shrdw $12, %si, (%rdi)238; CHECK-NEXT: retq239entry:240 %a = load i16, ptr %ptr241 %shrd = call i16 @llvm.fshr.i16(i16 %b, i16 %a, i16 12)242 store i16 %shrd, ptr %ptr243 ret void244}245 246define void @shrd32mri8_legacy(ptr %ptr, i32 noundef %b) {247; CHECK-LABEL: shrd32mri8_legacy:248; CHECK: # %bb.0: # %entry249; CHECK-NEXT: shrdl $12, %esi, (%rdi)250; CHECK-NEXT: retq251entry:252 %a = load i32, ptr %ptr253 %shrd = call i32 @llvm.fshr.i32(i32 %b, i32 %a, i32 12)254 store i32 %shrd, ptr %ptr255 ret void256}257 258define void @shrd64mri8_legacy(ptr %ptr, i64 noundef %b) {259; CHECK-LABEL: shrd64mri8_legacy:260; CHECK: # %bb.0: # %entry261; CHECK-NEXT: shrdq $12, %rsi, (%rdi)262; CHECK-NEXT: retq263entry:264 %a = load i64, ptr %ptr265 %shrd = call i64 @llvm.fshr.i64(i64 %b, i64 %a, i64 12)266 store i64 %shrd, ptr %ptr267 ret void268}269