Revert 374373: [Codegen] Alter the default promotion for saturating adds and subs
[llvm-core.git] / test / CodeGen / ARM / ParallelDSP / complex_dot_prod.ll
blob68702b722c759f971676887cdd431154c9e95836
1 ; RUN: llc -mtriple=thumbv7em -mcpu=cortex-m4 -O3 %s -o - | FileCheck %s
3 ; TODO: Think we should be able to use smlsdx/smlsldx here.
5 ; CHECK-LABEL: complex_dot_prod
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}
19 define dso_local arm_aapcscc void @complex_dot_prod(i16* nocapture readonly %pSrcA, i16* nocapture readonly %pSrcB, i32* nocapture %realResult, i32* nocapture %imagResult) {
20 entry:
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