1; RUN: llc -mtriple=thumbv7em -mcpu=cortex-m4 -O3 %s -o - | FileCheck %s 2 3; TODO: Think we should be able to use smlsdx/smlsldx here. 4 5; CHECK-LABEL: complex_dot_prod 6 7; CHECK: smulbb 8; CHECK: smultt 9; CHECK: smlalbb 10; CHECK: smultt 11; CHECK: smlalbb 12; CHECK: smultt 13; CHECK: smlalbb 14; CHECK: smultt 15; CHECK: smlaldx 16; CHECK: smlaldx 17; CHECK: smlaldx 18; CHECK: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc} 19define dso_local arm_aapcscc void @complex_dot_prod(i16* nocapture readonly %pSrcA, i16* nocapture readonly %pSrcB, i32* nocapture %realResult, i32* nocapture %imagResult) { 20entry: 21 %incdec.ptr = getelementptr inbounds i16, i16* %pSrcA, i32 1 22 %0 = load i16, i16* %pSrcA, align 2 23 %incdec.ptr1 = getelementptr inbounds i16, i16* %pSrcA, i32 2 24 %1 = load i16, i16* %incdec.ptr, align 2 25 %incdec.ptr2 = getelementptr inbounds i16, i16* %pSrcB, i32 1 26 %2 = load i16, i16* %pSrcB, align 2 27 %incdec.ptr3 = getelementptr inbounds i16, i16* %pSrcB, i32 2 28 %3 = load i16, i16* %incdec.ptr2, align 2 29 %conv = sext i16 %0 to i32 30 %conv4 = sext i16 %2 to i32 31 %mul = mul nsw i32 %conv4, %conv 32 %conv5 = sext i32 %mul to i64 33 %conv7 = sext i16 %3 to i32 34 %mul8 = mul nsw i32 %conv7, %conv 35 %conv9 = sext i32 %mul8 to i64 36 %conv11 = sext i16 %1 to i32 37 %mul13 = mul nsw i32 %conv7, %conv11 38 %conv14 = sext i32 %mul13 to i64 39 %sub = sub nsw i64 %conv5, %conv14 40 %mul17 = mul nsw i32 %conv4, %conv11 41 %conv18 = sext i32 %mul17 to i64 42 %add19 = add nsw i64 %conv9, %conv18 43 %incdec.ptr20 = getelementptr inbounds i16, i16* %pSrcA, i32 3 44 %4 = load i16, i16* %incdec.ptr1, align 2 45 %incdec.ptr21 = getelementptr inbounds i16, i16* %pSrcA, i32 4 46 %5 = load i16, i16* %incdec.ptr20, align 2 47 %incdec.ptr22 = getelementptr inbounds i16, i16* %pSrcB, i32 3 48 %6 = load i16, i16* %incdec.ptr3, align 2 49 %incdec.ptr23 = getelementptr inbounds i16, i16* %pSrcB, i32 4 50 %7 = load i16, i16* %incdec.ptr22, align 2 51 %conv24 = sext i16 %4 to i32 52 %conv25 = sext i16 %6 to i32 53 %mul26 = mul nsw i32 %conv25, %conv24 54 %conv27 = sext i32 %mul26 to i64 55 %add28 = add nsw i64 %sub, %conv27 56 %conv30 = sext i16 %7 to i32 57 %mul31 = mul nsw i32 %conv30, %conv24 58 %conv32 = sext i32 %mul31 to i64 59 %conv34 = sext i16 %5 to i32 60 %mul36 = mul nsw i32 %conv30, %conv34 61 %conv37 = sext i32 %mul36 to i64 62 %sub38 = sub nsw i64 %add28, %conv37 63 %mul41 = mul nsw i32 %conv25, %conv34 64 %conv42 = sext i32 %mul41 to i64 65 %add33 = add nsw i64 %add19, %conv42 66 %add43 = add nsw i64 %add33, %conv32 67 %incdec.ptr44 = getelementptr inbounds i16, i16* %pSrcA, i32 5 68 %8 = load i16, i16* %incdec.ptr21, align 2 69 %incdec.ptr45 = getelementptr inbounds i16, i16* %pSrcA, i32 6 70 %9 = load i16, i16* %incdec.ptr44, align 2 71 %incdec.ptr46 = getelementptr inbounds i16, i16* %pSrcB, i32 5 72 %10 = load i16, i16* %incdec.ptr23, align 2 73 %incdec.ptr47 = getelementptr inbounds i16, i16* %pSrcB, i32 6 74 %11 = load i16, i16* %incdec.ptr46, align 2 75 %conv48 = sext i16 %8 to i32 76 %conv49 = sext i16 %10 to i32 77 %mul50 = mul nsw i32 %conv49, %conv48 78 %conv51 = sext i32 %mul50 to i64 79 %add52 = add nsw i64 %sub38, %conv51 80 %conv54 = sext i16 %11 to i32 81 %mul55 = mul nsw i32 %conv54, %conv48 82 %conv56 = sext i32 %mul55 to i64 83 %conv58 = sext i16 %9 to i32 84 %mul60 = mul nsw i32 %conv54, %conv58 85 %conv61 = sext i32 %mul60 to i64 86 %sub62 = sub nsw i64 %add52, %conv61 87 %mul65 = mul nsw i32 %conv49, %conv58 88 %conv66 = sext i32 %mul65 to i64 89 %add57 = add nsw i64 %add43, %conv66 90 %add67 = add nsw i64 %add57, %conv56 91 %incdec.ptr68 = getelementptr inbounds i16, i16* %pSrcA, i32 7 92 %12 = load i16, i16* %incdec.ptr45, align 2 93 %13 = load i16, i16* %incdec.ptr68, align 2 94 %incdec.ptr70 = getelementptr inbounds i16, i16* %pSrcB, i32 7 95 %14 = load i16, i16* %incdec.ptr47, align 2 96 %15 = load i16, i16* %incdec.ptr70, align 2 97 %conv72 = sext i16 %12 to i32 98 %conv73 = sext i16 %14 to i32 99 %mul74 = mul nsw i32 %conv73, %conv72 100 %conv75 = sext i32 %mul74 to i64 101 %add76 = add nsw i64 %sub62, %conv75 102 %conv78 = sext i16 %15 to i32 103 %mul79 = mul nsw i32 %conv78, %conv72 104 %conv80 = sext i32 %mul79 to i64 105 %conv82 = sext i16 %13 to i32 106 %mul84 = mul nsw i32 %conv78, %conv82 107 %conv85 = sext i32 %mul84 to i64 108 %sub86 = sub nsw i64 %add76, %conv85 109 %mul89 = mul nsw i32 %conv73, %conv82 110 %conv90 = sext i32 %mul89 to i64 111 %add81 = add nsw i64 %add67, %conv90 112 %add91 = add nsw i64 %add81, %conv80 113 %16 = lshr i64 %sub86, 6 114 %conv92 = trunc i64 %16 to i32 115 store i32 %conv92, i32* %realResult, align 4 116 %17 = lshr i64 %add91, 6 117 %conv94 = trunc i64 %17 to i32 118 store i32 %conv94, i32* %imagResult, align 4 119 ret void 120} 121