1*3234f2d9SSimon Pilgrim; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*3234f2d9SSimon Pilgrim; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
3*3234f2d9SSimon Pilgrim; RUN: llc -mtriple=thumbv7em -mcpu=cortex-m4 -O3 %s -o - | FileCheck %s --check-prefix=CHECK-LLC
4*3234f2d9SSimon Pilgrim; RUN: opt -S -mtriple=armv7-a -arm-parallel-dsp -dce %s -o - | FileCheck %s --check-prefix=CHECK-OPT
51c3ca612SSam Parker
617ea9b46SSam Parkerdefine dso_local arm_aapcscc void @complex_dot_prod(i16* nocapture readonly %pSrcA, i16* nocapture readonly %pSrcB, i32* nocapture %realResult, i32* nocapture %imagResult) {
7*3234f2d9SSimon Pilgrim; CHECK-LLC-LABEL: complex_dot_prod:
8*3234f2d9SSimon Pilgrim; CHECK-LLC:       @ %bb.0: @ %entry
9*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
10*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    ldr r5, [r0]
11*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    ldr r7, [r1]
12*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    ldr.w r10, [r0, #4]
13*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    ldr.w r8, [r0, #8]
14*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    ldr.w r12, [r0, #12]
15*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    ldr r4, [r1, #4]
16*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    ldr.w r9, [r1, #8]
17*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    ldr.w lr, [r1, #12]
18*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    movs r0, #0
19*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    movs r1, #0
20*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    smlaldx r0, r1, r5, r7
21*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    smulbb r6, r7, r5
22*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    smultt r5, r7, r5
23*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    asr.w r11, r6, #31
24*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    subs r6, r6, r5
25*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    sbc.w r5, r11, r5, asr #31
26*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    smlaldx r0, r1, r10, r4
27*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    smlalbb r6, r5, r4, r10
28*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    smultt r4, r4, r10
29*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    subs r6, r6, r4
30*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    sbc.w r4, r5, r4, asr #31
31*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    smlalbb r6, r4, r9, r8
32*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    smultt r5, r9, r8
33*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    subs r6, r6, r5
34*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    sbc.w r4, r4, r5, asr #31
35*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    smlaldx r0, r1, r8, r9
36*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    smlalbb r6, r4, lr, r12
37*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    smultt r7, lr, r12
38*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    smlaldx r0, r1, r12, lr
39*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    subs r6, r6, r7
40*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    sbc.w r7, r4, r7, asr #31
41*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    lsrs r6, r6, #6
42*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    lsrs r0, r0, #6
43*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    orr.w r7, r6, r7, lsl #26
44*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    orr.w r0, r0, r1, lsl #26
45*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    str r7, [r2]
46*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    str r0, [r3]
47*3234f2d9SSimon Pilgrim; CHECK-LLC-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
48*3234f2d9SSimon Pilgrim; CHECK-LCC: pop.w {r4, r5, r6, r7, r8, r9, r10, pc}
49*3234f2d9SSimon Pilgrim;
50*3234f2d9SSimon Pilgrim; CHECK-OPT-LABEL: @complex_dot_prod(
51*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:  entry:
52*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP0:%.*]] = bitcast i16* [[PSRCA:%.*]] to i32*
53*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 2
54*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
55*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP3:%.*]] = sext i16 [[TMP2]] to i32
56*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP4:%.*]] = lshr i32 [[TMP1]], 16
57*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP5:%.*]] = trunc i32 [[TMP4]] to i16
58*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP6:%.*]] = sext i16 [[TMP5]] to i32
59*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[INCDEC_PTR1:%.*]] = getelementptr inbounds i16, i16* [[PSRCA]], i32 2
60*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP7:%.*]] = bitcast i16* [[PSRCB:%.*]] to i32*
61*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 2
62*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP9:%.*]] = trunc i32 [[TMP8]] to i16
63*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP10:%.*]] = call i64 @llvm.arm.smlaldx(i32 [[TMP1]], i32 [[TMP8]], i64 0)
64*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP11:%.*]] = sext i16 [[TMP9]] to i32
65*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP12:%.*]] = lshr i32 [[TMP8]], 16
66*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP13:%.*]] = trunc i32 [[TMP12]] to i16
67*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP14:%.*]] = sext i16 [[TMP13]] to i32
68*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[INCDEC_PTR3:%.*]] = getelementptr inbounds i16, i16* [[PSRCB]], i32 2
69*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP11]], [[TMP3]]
70*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[CONV5:%.*]] = sext i32 [[MUL]] to i64
71*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[MUL13:%.*]] = mul nsw i32 [[TMP14]], [[TMP6]]
72*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[CONV14:%.*]] = sext i32 [[MUL13]] to i64
73*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[SUB:%.*]] = sub nsw i64 [[CONV5]], [[CONV14]]
74*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP15:%.*]] = bitcast i16* [[INCDEC_PTR1]] to i32*
75*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 2
76*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP17:%.*]] = trunc i32 [[TMP16]] to i16
77*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP18:%.*]] = sext i16 [[TMP17]] to i32
78*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP19:%.*]] = lshr i32 [[TMP16]], 16
79*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP20:%.*]] = trunc i32 [[TMP19]] to i16
80*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP21:%.*]] = sext i16 [[TMP20]] to i32
81*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[INCDEC_PTR21:%.*]] = getelementptr inbounds i16, i16* [[PSRCA]], i32 4
82*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP22:%.*]] = bitcast i16* [[INCDEC_PTR3]] to i32*
83*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP23:%.*]] = load i32, i32* [[TMP22]], align 2
84*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP24:%.*]] = trunc i32 [[TMP23]] to i16
85*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP25:%.*]] = call i64 @llvm.arm.smlaldx(i32 [[TMP16]], i32 [[TMP23]], i64 [[TMP10]])
86*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP26:%.*]] = sext i16 [[TMP24]] to i32
87*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP27:%.*]] = lshr i32 [[TMP23]], 16
88*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP28:%.*]] = trunc i32 [[TMP27]] to i16
89*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP29:%.*]] = sext i16 [[TMP28]] to i32
90*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[INCDEC_PTR23:%.*]] = getelementptr inbounds i16, i16* [[PSRCB]], i32 4
91*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[MUL26:%.*]] = mul nsw i32 [[TMP26]], [[TMP18]]
92*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[CONV27:%.*]] = sext i32 [[MUL26]] to i64
93*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[ADD28:%.*]] = add nsw i64 [[SUB]], [[CONV27]]
94*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[MUL36:%.*]] = mul nsw i32 [[TMP29]], [[TMP21]]
95*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[CONV37:%.*]] = sext i32 [[MUL36]] to i64
96*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[SUB38:%.*]] = sub nsw i64 [[ADD28]], [[CONV37]]
97*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP30:%.*]] = bitcast i16* [[INCDEC_PTR21]] to i32*
98*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP31:%.*]] = load i32, i32* [[TMP30]], align 2
99*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP32:%.*]] = trunc i32 [[TMP31]] to i16
100*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP33:%.*]] = sext i16 [[TMP32]] to i32
101*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP34:%.*]] = lshr i32 [[TMP31]], 16
102*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP35:%.*]] = trunc i32 [[TMP34]] to i16
103*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP36:%.*]] = sext i16 [[TMP35]] to i32
104*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[INCDEC_PTR45:%.*]] = getelementptr inbounds i16, i16* [[PSRCA]], i32 6
105*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP37:%.*]] = bitcast i16* [[INCDEC_PTR23]] to i32*
106*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP38:%.*]] = load i32, i32* [[TMP37]], align 2
107*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP39:%.*]] = trunc i32 [[TMP38]] to i16
108*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP40:%.*]] = call i64 @llvm.arm.smlaldx(i32 [[TMP31]], i32 [[TMP38]], i64 [[TMP25]])
109*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP41:%.*]] = sext i16 [[TMP39]] to i32
110*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP42:%.*]] = lshr i32 [[TMP38]], 16
111*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP43:%.*]] = trunc i32 [[TMP42]] to i16
112*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP44:%.*]] = sext i16 [[TMP43]] to i32
113*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[INCDEC_PTR47:%.*]] = getelementptr inbounds i16, i16* [[PSRCB]], i32 6
114*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[MUL50:%.*]] = mul nsw i32 [[TMP41]], [[TMP33]]
115*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[CONV51:%.*]] = sext i32 [[MUL50]] to i64
116*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[ADD52:%.*]] = add nsw i64 [[SUB38]], [[CONV51]]
117*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[MUL60:%.*]] = mul nsw i32 [[TMP44]], [[TMP36]]
118*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[CONV61:%.*]] = sext i32 [[MUL60]] to i64
119*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[SUB62:%.*]] = sub nsw i64 [[ADD52]], [[CONV61]]
120*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP45:%.*]] = bitcast i16* [[INCDEC_PTR45]] to i32*
121*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP46:%.*]] = load i32, i32* [[TMP45]], align 2
122*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP47:%.*]] = trunc i32 [[TMP46]] to i16
123*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP48:%.*]] = sext i16 [[TMP47]] to i32
124*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP49:%.*]] = lshr i32 [[TMP46]], 16
125*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP50:%.*]] = trunc i32 [[TMP49]] to i16
126*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP51:%.*]] = sext i16 [[TMP50]] to i32
127*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP52:%.*]] = bitcast i16* [[INCDEC_PTR47]] to i32*
128*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP53:%.*]] = load i32, i32* [[TMP52]], align 2
129*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP54:%.*]] = trunc i32 [[TMP53]] to i16
130*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP55:%.*]] = call i64 @llvm.arm.smlaldx(i32 [[TMP46]], i32 [[TMP53]], i64 [[TMP40]])
131*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP56:%.*]] = sext i16 [[TMP54]] to i32
132*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP57:%.*]] = lshr i32 [[TMP53]], 16
133*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP58:%.*]] = trunc i32 [[TMP57]] to i16
134*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP59:%.*]] = sext i16 [[TMP58]] to i32
135*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[MUL74:%.*]] = mul nsw i32 [[TMP56]], [[TMP48]]
136*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[CONV75:%.*]] = sext i32 [[MUL74]] to i64
137*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[ADD76:%.*]] = add nsw i64 [[SUB62]], [[CONV75]]
138*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[MUL84:%.*]] = mul nsw i32 [[TMP59]], [[TMP51]]
139*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[CONV85:%.*]] = sext i32 [[MUL84]] to i64
140*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[SUB86:%.*]] = sub nsw i64 [[ADD76]], [[CONV85]]
141*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP60:%.*]] = lshr i64 [[SUB86]], 6
142*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[CONV92:%.*]] = trunc i64 [[TMP60]] to i32
143*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    store i32 [[CONV92]], i32* [[REALRESULT:%.*]], align 4
144*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[TMP61:%.*]] = lshr i64 [[TMP55]], 6
145*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    [[CONV94:%.*]] = trunc i64 [[TMP61]] to i32
146*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    store i32 [[CONV94]], i32* [[IMAGRESULT:%.*]], align 4
147*3234f2d9SSimon Pilgrim; CHECK-OPT-NEXT:    ret void
14817ea9b46SSam Parkerentry:
14917ea9b46SSam Parker  %incdec.ptr = getelementptr inbounds i16, i16* %pSrcA, i32 1
15017ea9b46SSam Parker  %0 = load i16, i16* %pSrcA, align 2
15117ea9b46SSam Parker  %incdec.ptr1 = getelementptr inbounds i16, i16* %pSrcA, i32 2
15217ea9b46SSam Parker  %1 = load i16, i16* %incdec.ptr, align 2
15317ea9b46SSam Parker  %incdec.ptr2 = getelementptr inbounds i16, i16* %pSrcB, i32 1
15417ea9b46SSam Parker  %2 = load i16, i16* %pSrcB, align 2
15517ea9b46SSam Parker  %incdec.ptr3 = getelementptr inbounds i16, i16* %pSrcB, i32 2
15617ea9b46SSam Parker  %3 = load i16, i16* %incdec.ptr2, align 2
15717ea9b46SSam Parker  %conv = sext i16 %0 to i32
15817ea9b46SSam Parker  %conv4 = sext i16 %2 to i32
15917ea9b46SSam Parker  %mul = mul nsw i32 %conv4, %conv
16017ea9b46SSam Parker  %conv5 = sext i32 %mul to i64
16117ea9b46SSam Parker  %conv7 = sext i16 %3 to i32
16217ea9b46SSam Parker  %mul8 = mul nsw i32 %conv7, %conv
16317ea9b46SSam Parker  %conv9 = sext i32 %mul8 to i64
16417ea9b46SSam Parker  %conv11 = sext i16 %1 to i32
16517ea9b46SSam Parker  %mul13 = mul nsw i32 %conv7, %conv11
16617ea9b46SSam Parker  %conv14 = sext i32 %mul13 to i64
16717ea9b46SSam Parker  %sub = sub nsw i64 %conv5, %conv14
16817ea9b46SSam Parker  %mul17 = mul nsw i32 %conv4, %conv11
16917ea9b46SSam Parker  %conv18 = sext i32 %mul17 to i64
17017ea9b46SSam Parker  %add19 = add nsw i64 %conv9, %conv18
17117ea9b46SSam Parker  %incdec.ptr20 = getelementptr inbounds i16, i16* %pSrcA, i32 3
17217ea9b46SSam Parker  %4 = load i16, i16* %incdec.ptr1, align 2
17317ea9b46SSam Parker  %incdec.ptr21 = getelementptr inbounds i16, i16* %pSrcA, i32 4
17417ea9b46SSam Parker  %5 = load i16, i16* %incdec.ptr20, align 2
17517ea9b46SSam Parker  %incdec.ptr22 = getelementptr inbounds i16, i16* %pSrcB, i32 3
17617ea9b46SSam Parker  %6 = load i16, i16* %incdec.ptr3, align 2
17717ea9b46SSam Parker  %incdec.ptr23 = getelementptr inbounds i16, i16* %pSrcB, i32 4
17817ea9b46SSam Parker  %7 = load i16, i16* %incdec.ptr22, align 2
17917ea9b46SSam Parker  %conv24 = sext i16 %4 to i32
18017ea9b46SSam Parker  %conv25 = sext i16 %6 to i32
18117ea9b46SSam Parker  %mul26 = mul nsw i32 %conv25, %conv24
18217ea9b46SSam Parker  %conv27 = sext i32 %mul26 to i64
18317ea9b46SSam Parker  %add28 = add nsw i64 %sub, %conv27
18417ea9b46SSam Parker  %conv30 = sext i16 %7 to i32
18517ea9b46SSam Parker  %mul31 = mul nsw i32 %conv30, %conv24
18617ea9b46SSam Parker  %conv32 = sext i32 %mul31 to i64
18717ea9b46SSam Parker  %conv34 = sext i16 %5 to i32
18817ea9b46SSam Parker  %mul36 = mul nsw i32 %conv30, %conv34
18917ea9b46SSam Parker  %conv37 = sext i32 %mul36 to i64
19017ea9b46SSam Parker  %sub38 = sub nsw i64 %add28, %conv37
19117ea9b46SSam Parker  %mul41 = mul nsw i32 %conv25, %conv34
19217ea9b46SSam Parker  %conv42 = sext i32 %mul41 to i64
19317ea9b46SSam Parker  %add33 = add nsw i64 %add19, %conv42
19417ea9b46SSam Parker  %add43 = add nsw i64 %add33, %conv32
19517ea9b46SSam Parker  %incdec.ptr44 = getelementptr inbounds i16, i16* %pSrcA, i32 5
19617ea9b46SSam Parker  %8 = load i16, i16* %incdec.ptr21, align 2
19717ea9b46SSam Parker  %incdec.ptr45 = getelementptr inbounds i16, i16* %pSrcA, i32 6
19817ea9b46SSam Parker  %9 = load i16, i16* %incdec.ptr44, align 2
19917ea9b46SSam Parker  %incdec.ptr46 = getelementptr inbounds i16, i16* %pSrcB, i32 5
20017ea9b46SSam Parker  %10 = load i16, i16* %incdec.ptr23, align 2
20117ea9b46SSam Parker  %incdec.ptr47 = getelementptr inbounds i16, i16* %pSrcB, i32 6
20217ea9b46SSam Parker  %11 = load i16, i16* %incdec.ptr46, align 2
20317ea9b46SSam Parker  %conv48 = sext i16 %8 to i32
20417ea9b46SSam Parker  %conv49 = sext i16 %10 to i32
20517ea9b46SSam Parker  %mul50 = mul nsw i32 %conv49, %conv48
20617ea9b46SSam Parker  %conv51 = sext i32 %mul50 to i64
20717ea9b46SSam Parker  %add52 = add nsw i64 %sub38, %conv51
20817ea9b46SSam Parker  %conv54 = sext i16 %11 to i32
20917ea9b46SSam Parker  %mul55 = mul nsw i32 %conv54, %conv48
21017ea9b46SSam Parker  %conv56 = sext i32 %mul55 to i64
21117ea9b46SSam Parker  %conv58 = sext i16 %9 to i32
21217ea9b46SSam Parker  %mul60 = mul nsw i32 %conv54, %conv58
21317ea9b46SSam Parker  %conv61 = sext i32 %mul60 to i64
21417ea9b46SSam Parker  %sub62 = sub nsw i64 %add52, %conv61
21517ea9b46SSam Parker  %mul65 = mul nsw i32 %conv49, %conv58
21617ea9b46SSam Parker  %conv66 = sext i32 %mul65 to i64
21717ea9b46SSam Parker  %add57 = add nsw i64 %add43, %conv66
21817ea9b46SSam Parker  %add67 = add nsw i64 %add57, %conv56
21917ea9b46SSam Parker  %incdec.ptr68 = getelementptr inbounds i16, i16* %pSrcA, i32 7
22017ea9b46SSam Parker  %12 = load i16, i16* %incdec.ptr45, align 2
22117ea9b46SSam Parker  %13 = load i16, i16* %incdec.ptr68, align 2
22217ea9b46SSam Parker  %incdec.ptr70 = getelementptr inbounds i16, i16* %pSrcB, i32 7
22317ea9b46SSam Parker  %14 = load i16, i16* %incdec.ptr47, align 2
22417ea9b46SSam Parker  %15 = load i16, i16* %incdec.ptr70, align 2
22517ea9b46SSam Parker  %conv72 = sext i16 %12 to i32
22617ea9b46SSam Parker  %conv73 = sext i16 %14 to i32
22717ea9b46SSam Parker  %mul74 = mul nsw i32 %conv73, %conv72
22817ea9b46SSam Parker  %conv75 = sext i32 %mul74 to i64
22917ea9b46SSam Parker  %add76 = add nsw i64 %sub62, %conv75
23017ea9b46SSam Parker  %conv78 = sext i16 %15 to i32
23117ea9b46SSam Parker  %mul79 = mul nsw i32 %conv78, %conv72
23217ea9b46SSam Parker  %conv80 = sext i32 %mul79 to i64
23317ea9b46SSam Parker  %conv82 = sext i16 %13 to i32
23417ea9b46SSam Parker  %mul84 = mul nsw i32 %conv78, %conv82
23517ea9b46SSam Parker  %conv85 = sext i32 %mul84 to i64
23617ea9b46SSam Parker  %sub86 = sub nsw i64 %add76, %conv85
23717ea9b46SSam Parker  %mul89 = mul nsw i32 %conv73, %conv82
23817ea9b46SSam Parker  %conv90 = sext i32 %mul89 to i64
23917ea9b46SSam Parker  %add81 = add nsw i64 %add67, %conv90
24017ea9b46SSam Parker  %add91 = add nsw i64 %add81, %conv80
24117ea9b46SSam Parker  %16 = lshr i64 %sub86, 6
24217ea9b46SSam Parker  %conv92 = trunc i64 %16 to i32
24317ea9b46SSam Parker  store i32 %conv92, i32* %realResult, align 4
24417ea9b46SSam Parker  %17 = lshr i64 %add91, 6
24517ea9b46SSam Parker  %conv94 = trunc i64 %17 to i32
24617ea9b46SSam Parker  store i32 %conv94, i32* %imagResult, align 4
24717ea9b46SSam Parker  ret void
24817ea9b46SSam Parker}
249