203 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd -verify-machineinstrs | FileCheck %s3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd,nf -verify-machineinstrs | FileCheck --check-prefix=NF %s4; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd,nf -x86-enable-apx-for-relocation=true -verify-machineinstrs | FileCheck --check-prefix=NF %s5 6define i16 @mul16rr(i16 noundef %a, i16 noundef %b) {7; CHECK-LABEL: mul16rr:8; CHECK: # %bb.0: # %entry9; CHECK-NEXT: imull %esi, %edi, %eax10; CHECK-NEXT: # kill: def $ax killed $ax killed $eax11; CHECK-NEXT: retq12;13; NF-LABEL: mul16rr:14; NF: # %bb.0: # %entry15; NF-NEXT: {nf} imull %esi, %edi, %eax16; NF-NEXT: # kill: def $ax killed $ax killed $eax17; NF-NEXT: retq18entry:19 %mul = mul i16 %a, %b20 ret i16 %mul21}22 23define i32 @mul32rr(i32 noundef %a, i32 noundef %b) {24; CHECK-LABEL: mul32rr:25; CHECK: # %bb.0: # %entry26; CHECK-NEXT: imull %esi, %edi, %eax27; CHECK-NEXT: retq28;29; NF-LABEL: mul32rr:30; NF: # %bb.0: # %entry31; NF-NEXT: {nf} imull %esi, %edi, %eax32; NF-NEXT: retq33entry:34 %mul = mul i32 %a, %b35 ret i32 %mul36}37 38define i64 @mul64rr(i64 noundef %a, i64 noundef %b) {39; CHECK-LABEL: mul64rr:40; CHECK: # %bb.0: # %entry41; CHECK-NEXT: imulq %rsi, %rdi, %rax42; CHECK-NEXT: retq43;44; NF-LABEL: mul64rr:45; NF: # %bb.0: # %entry46; NF-NEXT: {nf} imulq %rsi, %rdi, %rax47; NF-NEXT: retq48entry:49 %mul = mul i64 %a, %b50 ret i64 %mul51}52 53define i16 @smul16rr(i16 noundef %a, i16 noundef %b) {54; CHECK-LABEL: smul16rr:55; CHECK: # %bb.0: # %entry56; CHECK-NEXT: imulw %si, %di, %ax57; CHECK-NEXT: retq58;59; NF-LABEL: smul16rr:60; NF: # %bb.0: # %entry61; NF-NEXT: {nf} imulw %si, %di, %ax62; NF-NEXT: retq63entry:64 %t = call {i16, i1} @llvm.smul.with.overflow.i16(i16 %a, i16 %b)65 %mul = extractvalue {i16, i1} %t, 066 ret i16 %mul67}68 69define i32 @smul32rr(i32 noundef %a, i32 noundef %b) {70; CHECK-LABEL: smul32rr:71; CHECK: # %bb.0: # %entry72; CHECK-NEXT: imull %esi, %edi, %eax73; CHECK-NEXT: retq74;75; NF-LABEL: smul32rr:76; NF: # %bb.0: # %entry77; NF-NEXT: {nf} imull %esi, %edi, %eax78; NF-NEXT: retq79entry:80 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %a, i32 %b)81 %mul = extractvalue {i32, i1} %t, 082 ret i32 %mul83}84 85define i64 @smul64rr(i64 noundef %a, i64 noundef %b) {86; CHECK-LABEL: smul64rr:87; CHECK: # %bb.0: # %entry88; CHECK-NEXT: imulq %rsi, %rdi, %rax89; CHECK-NEXT: retq90;91; NF-LABEL: smul64rr:92; NF: # %bb.0: # %entry93; NF-NEXT: {nf} imulq %rsi, %rdi, %rax94; NF-NEXT: retq95entry:96 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %a, i64 %b)97 %mul = extractvalue {i64, i1} %t, 098 ret i64 %mul99}100 101define i16 @mul16rm(i16 noundef %a, ptr %ptr) {102; CHECK-LABEL: mul16rm:103; CHECK: # %bb.0: # %entry104; CHECK-NEXT: imulw (%rsi), %di, %ax105; CHECK-NEXT: retq106;107; NF-LABEL: mul16rm:108; NF: # %bb.0: # %entry109; NF-NEXT: {nf} imulw (%rsi), %di, %ax110; NF-NEXT: retq111entry:112 %b = load i16, ptr %ptr113 %mul = mul i16 %a, %b114 ret i16 %mul115}116 117define i32 @mul32rm(i32 noundef %a, ptr %ptr) {118; CHECK-LABEL: mul32rm:119; CHECK: # %bb.0: # %entry120; CHECK-NEXT: imull (%rsi), %edi, %eax121; CHECK-NEXT: retq122;123; NF-LABEL: mul32rm:124; NF: # %bb.0: # %entry125; NF-NEXT: {nf} imull (%rsi), %edi, %eax126; NF-NEXT: retq127entry:128 %b = load i32, ptr %ptr129 %mul = mul i32 %a, %b130 ret i32 %mul131}132 133define i64 @mul64rm(i64 noundef %a, ptr %ptr) {134; CHECK-LABEL: mul64rm:135; CHECK: # %bb.0: # %entry136; CHECK-NEXT: imulq (%rsi), %rdi, %rax137; CHECK-NEXT: retq138;139; NF-LABEL: mul64rm:140; NF: # %bb.0: # %entry141; NF-NEXT: {nf} imulq (%rsi), %rdi, %rax142; NF-NEXT: retq143entry:144 %b = load i64, ptr %ptr145 %mul = mul i64 %a, %b146 ret i64 %mul147}148 149define i16 @smul16rm(i16 noundef %a, ptr %ptr) {150; CHECK-LABEL: smul16rm:151; CHECK: # %bb.0: # %entry152; CHECK-NEXT: imulw (%rsi), %di, %ax153; CHECK-NEXT: retq154;155; NF-LABEL: smul16rm:156; NF: # %bb.0: # %entry157; NF-NEXT: {nf} imulw (%rsi), %di, %ax158; NF-NEXT: retq159entry:160 %b = load i16, ptr %ptr161 %t = call {i16, i1} @llvm.smul.with.overflow.i16(i16 %a, i16 %b)162 %mul = extractvalue {i16, i1} %t, 0163 ret i16 %mul164}165 166define i32 @smul32rm(i32 noundef %a, ptr %ptr) {167; CHECK-LABEL: smul32rm:168; CHECK: # %bb.0: # %entry169; CHECK-NEXT: imull (%rsi), %edi, %eax170; CHECK-NEXT: retq171;172; NF-LABEL: smul32rm:173; NF: # %bb.0: # %entry174; NF-NEXT: {nf} imull (%rsi), %edi, %eax175; NF-NEXT: retq176entry:177 %b = load i32, ptr %ptr178 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %a, i32 %b)179 %mul = extractvalue {i32, i1} %t, 0180 ret i32 %mul181}182 183define i64 @smul64rm(i64 noundef %a, ptr %ptr) {184; CHECK-LABEL: smul64rm:185; CHECK: # %bb.0: # %entry186; CHECK-NEXT: imulq (%rsi), %rdi, %rax187; CHECK-NEXT: retq188;189; NF-LABEL: smul64rm:190; NF: # %bb.0: # %entry191; NF-NEXT: {nf} imulq (%rsi), %rdi, %rax192; NF-NEXT: retq193entry:194 %b = load i64, ptr %ptr195 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %a, i64 %b)196 %mul = extractvalue {i64, i1} %t, 0197 ret i64 %mul198}199 200declare { i16, i1 } @llvm.smul.with.overflow.i16(i16, i16) nounwind readnone201declare { i32, i1 } @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone202declare { i64, i1 } @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone203