void SKP_Silk_biquad_alt(const short *in, const int *B_Q28, const int *A_Q28,
                         int *S, short *out, const int len) {
  int k;
  int inval, A0_U_Q28, A0_L_Q28, A1_U_Q28, A1_L_Q28, out32_Q14;
  A0_L_Q28 = (-A_Q28[0]) & 0x00003FFF;
  A0_U_Q28 = ((-A_Q28[0]) >> (14));
  A1_L_Q28 = (-A_Q28[1]) & 0x00003FFF;
  A1_U_Q28 = ((-A_Q28[1]) >> (14));
  for (k = 0; k < len; k++) {
    inval = in[k];
    out32_Q14 =
        ((((S[0]) +
           ((((B_Q28[0]) >> 16) * (int)((short)(inval))) +
            ((((B_Q28[0]) & 0x0000FFFF) * (int)((short)(inval))) >> 16))))
         << (2));
    S[0] = S[1] +
           ((((((out32_Q14) >> 16) * (int)((short)(A0_L_Q28))) +
              ((((out32_Q14)&0x0000FFFF) * (int)((short)(A0_L_Q28))) >> 16))) >>
            (14));
    S[0] = ((S[0]) +
            ((((out32_Q14) >> 16) * (int)((short)(A0_U_Q28))) +
             ((((out32_Q14)&0x0000FFFF) * (int)((short)(A0_U_Q28))) >> 16)));
    S[0] = ((S[0]) +
            ((((B_Q28[1]) >> 16) * (int)((short)(inval))) +
             ((((B_Q28[1]) & 0x0000FFFF) * (int)((short)(inval))) >> 16)));
    S[1] = ((((((out32_Q14) >> 16) * (int)((short)(A1_L_Q28))) +
              ((((out32_Q14)&0x0000FFFF) * (int)((short)(A1_L_Q28))) >> 16))) >>
            (14));
    S[1] = ((S[1]) +
            ((((out32_Q14) >> 16) * (int)((short)(A1_U_Q28))) +
             ((((out32_Q14)&0x0000FFFF) * (int)((short)(A1_U_Q28))) >> 16)));
    S[1] = ((S[1]) +
            ((((B_Q28[2]) >> 16) * (int)((short)(inval))) +
             ((((B_Q28[2]) & 0x0000FFFF) * (int)((short)(inval))) >> 16)));
    out[k] = (short)((((out32_Q14) >> (14)) + 2) > 0x7FFF
                         ? 0x7FFF
                         : ((((out32_Q14) >> (14)) + 2) < ((short)0x8000)
                                ? ((short)0x8000)
                                : (((out32_Q14) >> (14)) + 2)));
  }
}


x86 assembly (clang, -O0):
<SKP_Silk_biquad_alt>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
mov    -0x18(%rbp),%rcx
xor    %eax,%eax
sub    (%rcx),%eax
and    $0x3fff,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x18(%rbp),%rcx
xor    %eax,%eax
sub    (%rcx),%eax
sar    $0xe,%eax
mov    %eax,-0x38(%rbp)
mov    -0x18(%rbp),%rcx
xor    %eax,%eax
sub    0x4(%rcx),%eax
and    $0x3fff,%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rcx
xor    %eax,%eax
sub    0x4(%rcx),%eax
sar    $0xe,%eax
mov    %eax,-0x40(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1373 <SKP_Silk_biquad_alt+0x273>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x34(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    -0x10(%rbp),%rcx
mov    (%rcx),%ecx
sar    $0x10,%ecx
mov    -0x34(%rbp),%edx
movswl %dx,%edx
imul   %edx,%ecx
mov    -0x10(%rbp),%rdx
mov    (%rdx),%edx
and    $0xffff,%edx
mov    -0x34(%rbp),%esi
movswl %si,%esi
imul   %esi,%edx
sar    $0x10,%edx
add    %edx,%ecx
add    %ecx,%eax
shl    $0x2,%eax
mov    %eax,-0x48(%rbp)
mov    -0x20(%rbp),%rax
mov    0x4(%rax),%ecx
mov    -0x48(%rbp),%eax
sar    $0x10,%eax
mov    -0x3c(%rbp),%edx
movswl %dx,%edx
imul   %edx,%eax
mov    -0x48(%rbp),%edx
and    $0xffff,%edx
mov    -0x3c(%rbp),%esi
movswl %si,%esi
imul   %esi,%edx
sar    $0x10,%edx
add    %edx,%eax
sar    $0xe,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
mov    -0x48(%rbp),%eax
sar    $0x10,%eax
mov    -0x38(%rbp),%edx
movswl %dx,%edx
imul   %edx,%eax
mov    -0x48(%rbp),%edx
and    $0xffff,%edx
mov    -0x38(%rbp),%esi
movswl %si,%esi
imul   %esi,%edx
sar    $0x10,%edx
add    %edx,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
sar    $0x10,%eax
mov    -0x34(%rbp),%edx
movswl %dx,%edx
imul   %edx,%eax
mov    -0x10(%rbp),%rdx
mov    0x4(%rdx),%edx
and    $0xffff,%edx
mov    -0x34(%rbp),%esi
movswl %si,%esi
imul   %esi,%edx
sar    $0x10,%edx
add    %edx,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x48(%rbp),%ecx
sar    $0x10,%ecx
mov    -0x44(%rbp),%eax
cwtl
imul   %eax,%ecx
mov    -0x48(%rbp),%eax
and    $0xffff,%eax
mov    -0x44(%rbp),%edx
movswl %dx,%edx
imul   %edx,%eax
sar    $0x10,%eax
add    %eax,%ecx
sar    $0xe,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x20(%rbp),%rax
mov    0x4(%rax),%ecx
mov    -0x48(%rbp),%eax
sar    $0x10,%eax
mov    -0x40(%rbp),%edx
movswl %dx,%edx
imul   %edx,%eax
mov    -0x48(%rbp),%edx
and    $0xffff,%edx
mov    -0x40(%rbp),%esi
movswl %si,%esi
imul   %esi,%edx
sar    $0x10,%edx
add    %edx,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x20(%rbp),%rax
mov    0x4(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%eax
sar    $0x10,%eax
mov    -0x34(%rbp),%edx
movswl %dx,%edx
imul   %edx,%eax
mov    -0x10(%rbp),%rdx
mov    0x8(%rdx),%edx
and    $0xffff,%edx
mov    -0x34(%rbp),%esi
movswl %si,%esi
imul   %esi,%edx
sar    $0x10,%edx
add    %edx,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x48(%rbp),%eax
sar    $0xe,%eax
add    $0x2,%eax
cmp    $0x7fff,%eax
jle    1320 <SKP_Silk_biquad_alt+0x220>
mov    $0x7fff,%eax
mov    %eax,-0x4c(%rbp)
jmp    1353 <SKP_Silk_biquad_alt+0x253>
mov    -0x48(%rbp),%eax
sar    $0xe,%eax
add    $0x2,%eax
cmp    $0xffff8000,%eax
jge    1341 <SKP_Silk_biquad_alt+0x241>
mov    $0xffff8000,%eax
mov    %eax,-0x50(%rbp)
jmp    134d <SKP_Silk_biquad_alt+0x24d>
mov    -0x48(%rbp),%eax
sar    $0xe,%eax
add    $0x2,%eax
mov    %eax,-0x50(%rbp)
mov    -0x50(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
mov    %ax,%dx
mov    -0x28(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1161 <SKP_Silk_biquad_alt+0x61>
pop    %rbp
ret

x86 assembly (clang, -O2):
<SKP_Silk_biquad_alt>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %r9d,%r9d
jle    1266 <SKP_Silk_biquad_alt+0x166>
xor    %eax,%eax
xor    %ebp,%ebp
sub    (%rdx),%ebp
sub    0x4(%rdx),%eax
mov    %ebp,%edx
and    $0x3fff,%edx
mov    %edx,-0xc(%rsp)
shr    $0xe,%ebp
movswl %bp,%edx
mov    %edx,-0x10(%rsp)
mov    %eax,%r13d
and    $0x3fff,%r13d
shr    $0xe,%eax
cwtl
mov    %eax,-0x14(%rsp)
mov    %r9d,%eax
mov    %rax,-0x8(%rsp)
mov    (%rcx),%eax
mov    0x4(%rcx),%r14d
xor    %r10d,%r10d
mov    -0x10(%rsp),%r12d
nopw   0x0(%rax,%rax,1)
movswl (%rdi,%r10,2),%ebp
mov    (%rsi),%edx
movzwl %dx,%ebx
sar    $0x10,%edx
imul   %ebp,%edx
add    %eax,%edx
imul   %ebp,%ebx
sar    $0x10,%ebx
add    %edx,%ebx
lea    0x0(,%rbx,4),%edx
shr    $0xe,%ebx
movswl %bx,%r9d
mov    %r9d,%eax
mov    -0xc(%rsp),%r11d
imul   %r11d,%eax
movzwl %dx,%r15d
mov    %r15d,%ebx
imul   %r11d,%ebx
shr    $0x10,%ebx
add    %eax,%ebx
sar    $0xe,%ebx
mov    %r9d,%eax
imul   %r12d,%eax
add    %r14d,%eax
mov    %rdi,%r11
mov    %r15d,%edi
imul   %r12d,%edi
sar    $0x10,%edi
add    %eax,%edi
add    %ebx,%edi
mov    %edi,(%rcx)
mov    0x4(%rsi),%ebx
movzwl %bx,%eax
sar    $0x10,%ebx
imul   %ebp,%ebx
imul   %ebp,%eax
sar    $0x10,%eax
add    %ebx,%eax
add    %edi,%eax
mov    %r9d,%edi
imul   %r13d,%edi
mov    %r15d,%ebx
imul   %r13d,%ebx
shr    $0x10,%ebx
add    %edi,%ebx
mov    %eax,(%rcx)
sar    $0xe,%ebx
mov    -0x14(%rsp),%edi
imul   %edi,%r9d
imul   %edi,%r15d
sar    $0x10,%r15d
add    %r9d,%r15d
add    %ebx,%r15d
mov    %r15d,0x4(%rcx)
mov    0x8(%rsi),%edi
movzwl %di,%r14d
sar    $0x10,%edi
imul   %ebp,%edi
imul   %ebp,%r14d
sar    $0x10,%r14d
add    %edi,%r14d
add    %r15d,%r14d
mov    %edx,%edi
sar    $0xe,%edi
cmp    $0xffff7fff,%edi
mov    $0x7ffe,%ebp
cmovl  %ebp,%edi
add    $0x2,%edi
cmp    $0x1fff8000,%edx
mov    $0x7fff,%edx
cmovge %edx,%edi
mov    %r14d,0x4(%rcx)
mov    %di,(%r8,%r10,2)
mov    %r11,%rdi
add    $0x1,%r10
cmp    %r10,-0x8(%rsp)
jne    1160 <SKP_Silk_biquad_alt+0x60>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @SKP_Silk_biquad_alt(i16* %0, i32* %1, i32* %2, i32* %3, i16* %4, i32 %5) {
%7 = alloca i16*
%8 = alloca i32*
%9 = alloca i32*
%10 = alloca i32*
%11 = alloca i16*
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
store i16* %0, i16** %7
store i32* %1, i32** %8
store i32* %2, i32** %9
store i32* %3, i32** %10
store i16* %4, i16** %11
store i32 %5, i32* %12
%20 = load i32*, i32** %9
%21 = getelementptr inbounds i32, i32* %20, i64 0
%22 = load i32, i32* %21
%23 = sub nsw i32 0, %22
%24 = and i32 %23, 16383
store i32 %24, i32* %16
%25 = load i32*, i32** %9
%26 = getelementptr inbounds i32, i32* %25, i64 0
%27 = load i32, i32* %26
%28 = sub nsw i32 0, %27
%29 = ashr i32 %28, 14
store i32 %29, i32* %15
%30 = load i32*, i32** %9
%31 = getelementptr inbounds i32, i32* %30, i64 1
%32 = load i32, i32* %31
%33 = sub nsw i32 0, %32
%34 = and i32 %33, 16383
store i32 %34, i32* %18
%35 = load i32*, i32** %9
%36 = getelementptr inbounds i32, i32* %35, i64 1
%37 = load i32, i32* %36
%38 = sub nsw i32 0, %37
%39 = ashr i32 %38, 14
store i32 %39, i32* %17
store i32 0, i32* %13
br label %40
40: ; preds = %224, %6
%41 = load i32, i32* %13
%42 = load i32, i32* %12
%43 = icmp slt i32 %41, %42
br i1 %43, label %44, label %227
44: ; preds = %40
%45 = load i16*, i16** %7
%46 = load i32, i32* %13
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i16, i16* %45, i64 %47
%49 = load i16, i16* %48
%50 = sext i16 %49 to i32
store i32 %50, i32* %14
%51 = load i32*, i32** %10
%52 = getelementptr inbounds i32, i32* %51, i64 0
%53 = load i32, i32* %52
%54 = load i32*, i32** %8
%55 = getelementptr inbounds i32, i32* %54, i64 0
%56 = load i32, i32* %55
%57 = ashr i32 %56, 16
%58 = load i32, i32* %14
%59 = trunc i32 %58 to i16
%60 = sext i16 %59 to i32
%61 = mul nsw i32 %57, %60
%62 = load i32*, i32** %8
%63 = getelementptr inbounds i32, i32* %62, i64 0
%64 = load i32, i32* %63
%65 = and i32 %64, 65535
%66 = load i32, i32* %14
%67 = trunc i32 %66 to i16
%68 = sext i16 %67 to i32
%69 = mul nsw i32 %65, %68
%70 = ashr i32 %69, 16
%71 = add nsw i32 %61, %70
%72 = add nsw i32 %53, %71
%73 = shl i32 %72, 2
store i32 %73, i32* %19
%74 = load i32*, i32** %10
%75 = getelementptr inbounds i32, i32* %74, i64 1
%76 = load i32, i32* %75
%77 = load i32, i32* %19
%78 = ashr i32 %77, 16
%79 = load i32, i32* %16
%80 = trunc i32 %79 to i16
%81 = sext i16 %80 to i32
%82 = mul nsw i32 %78, %81
%83 = load i32, i32* %19
%84 = and i32 %83, 65535
%85 = load i32, i32* %16
%86 = trunc i32 %85 to i16
%87 = sext i16 %86 to i32
%88 = mul nsw i32 %84, %87
%89 = ashr i32 %88, 16
%90 = add nsw i32 %82, %89
%91 = ashr i32 %90, 14
%92 = add nsw i32 %76, %91
%93 = load i32*, i32** %10
%94 = getelementptr inbounds i32, i32* %93, i64 0
store i32 %92, i32* %94
%95 = load i32*, i32** %10
%96 = getelementptr inbounds i32, i32* %95, i64 0
%97 = load i32, i32* %96
%98 = load i32, i32* %19
%99 = ashr i32 %98, 16
%100 = load i32, i32* %15
%101 = trunc i32 %100 to i16
%102 = sext i16 %101 to i32
%103 = mul nsw i32 %99, %102
%104 = load i32, i32* %19
%105 = and i32 %104, 65535
%106 = load i32, i32* %15
%107 = trunc i32 %106 to i16
%108 = sext i16 %107 to i32
%109 = mul nsw i32 %105, %108
%110 = ashr i32 %109, 16
%111 = add nsw i32 %103, %110
%112 = add nsw i32 %97, %111
%113 = load i32*, i32** %10
%114 = getelementptr inbounds i32, i32* %113, i64 0
store i32 %112, i32* %114
%115 = load i32*, i32** %10
%116 = getelementptr inbounds i32, i32* %115, i64 0
%117 = load i32, i32* %116
%118 = load i32*, i32** %8
%119 = getelementptr inbounds i32, i32* %118, i64 1
%120 = load i32, i32* %119
%121 = ashr i32 %120, 16
%122 = load i32, i32* %14
%123 = trunc i32 %122 to i16
%124 = sext i16 %123 to i32
%125 = mul nsw i32 %121, %124
%126 = load i32*, i32** %8
%127 = getelementptr inbounds i32, i32* %126, i64 1
%128 = load i32, i32* %127
%129 = and i32 %128, 65535
%130 = load i32, i32* %14
%131 = trunc i32 %130 to i16
%132 = sext i16 %131 to i32
%133 = mul nsw i32 %129, %132
%134 = ashr i32 %133, 16
%135 = add nsw i32 %125, %134
%136 = add nsw i32 %117, %135
%137 = load i32*, i32** %10
%138 = getelementptr inbounds i32, i32* %137, i64 0
store i32 %136, i32* %138
%139 = load i32, i32* %19
%140 = ashr i32 %139, 16
%141 = load i32, i32* %18
%142 = trunc i32 %141 to i16
%143 = sext i16 %142 to i32
%144 = mul nsw i32 %140, %143
%145 = load i32, i32* %19
%146 = and i32 %145, 65535
%147 = load i32, i32* %18
%148 = trunc i32 %147 to i16
%149 = sext i16 %148 to i32
%150 = mul nsw i32 %146, %149
%151 = ashr i32 %150, 16
%152 = add nsw i32 %144, %151
%153 = ashr i32 %152, 14
%154 = load i32*, i32** %10
%155 = getelementptr inbounds i32, i32* %154, i64 1
store i32 %153, i32* %155
%156 = load i32*, i32** %10
%157 = getelementptr inbounds i32, i32* %156, i64 1
%158 = load i32, i32* %157
%159 = load i32, i32* %19
%160 = ashr i32 %159, 16
%161 = load i32, i32* %17
%162 = trunc i32 %161 to i16
%163 = sext i16 %162 to i32
%164 = mul nsw i32 %160, %163
%165 = load i32, i32* %19
%166 = and i32 %165, 65535
%167 = load i32, i32* %17
%168 = trunc i32 %167 to i16
%169 = sext i16 %168 to i32
%170 = mul nsw i32 %166, %169
%171 = ashr i32 %170, 16
%172 = add nsw i32 %164, %171
%173 = add nsw i32 %158, %172
%174 = load i32*, i32** %10
%175 = getelementptr inbounds i32, i32* %174, i64 1
store i32 %173, i32* %175
%176 = load i32*, i32** %10
%177 = getelementptr inbounds i32, i32* %176, i64 1
%178 = load i32, i32* %177
%179 = load i32*, i32** %8
%180 = getelementptr inbounds i32, i32* %179, i64 2
%181 = load i32, i32* %180
%182 = ashr i32 %181, 16
%183 = load i32, i32* %14
%184 = trunc i32 %183 to i16
%185 = sext i16 %184 to i32
%186 = mul nsw i32 %182, %185
%187 = load i32*, i32** %8
%188 = getelementptr inbounds i32, i32* %187, i64 2
%189 = load i32, i32* %188
%190 = and i32 %189, 65535
%191 = load i32, i32* %14
%192 = trunc i32 %191 to i16
%193 = sext i16 %192 to i32
%194 = mul nsw i32 %190, %193
%195 = ashr i32 %194, 16
%196 = add nsw i32 %186, %195
%197 = add nsw i32 %178, %196
%198 = load i32*, i32** %10
%199 = getelementptr inbounds i32, i32* %198, i64 1
store i32 %197, i32* %199
%200 = load i32, i32* %19
%201 = ashr i32 %200, 14
%202 = add nsw i32 %201, 2
%203 = icmp sgt i32 %202, 32767
br i1 %203, label %204, label %205
204: ; preds = %44
br label %217
205: ; preds = %44
%206 = load i32, i32* %19
%207 = ashr i32 %206, 14
%208 = add nsw i32 %207, 2
%209 = icmp slt i32 %208, -32768
br i1 %209, label %210, label %211
210: ; preds = %205
br label %215
211: ; preds = %205
%212 = load i32, i32* %19
%213 = ashr i32 %212, 14
%214 = add nsw i32 %213, 2
br label %215
215: ; preds = %211, %210
%216 = phi i32 [ -32768, %210 ], [ %214, %211 ]
br label %217
217: ; preds = %215, %204
%218 = phi i32 [ 32767, %204 ], [ %216, %215 ]
%219 = trunc i32 %218 to i16
%220 = load i16*, i16** %11
%221 = load i32, i32* %13
%222 = sext i32 %221 to i64
%223 = getelementptr inbounds i16, i16* %220, i64 %222
store i16 %219, i16* %223
br label %224
224: ; preds = %217
%225 = load i32, i32* %13
%226 = add nsw i32 %225, 1
store i32 %226, i32* %13
br label %40
227: ; preds = %40
ret void
}

LLVM IR (-O2):
define void @SKP_Silk_biquad_alt(i16* nocapture %0, i32* nocapture %1, i32* nocapture %2, i32* nocapture %3, i16* nocapture writeonly %4, i32 %5) {
%7 = load i32, i32* %2
%8 = sub nsw i32 0, %7
%9 = getelementptr inbounds i32, i32* %2, i64 1
%10 = load i32, i32* %9
%11 = sub nsw i32 0, %10
%12 = icmp sgt i32 %5, 0
br i1 %12, label %13, label %91
13: ; preds = %6
%14 = getelementptr inbounds i32, i32* %3, i64 1
%15 = and i32 %8, 16383
%16 = shl i32 %8, 2
%17 = ashr i32 %16, 16
%18 = getelementptr inbounds i32, i32* %1, i64 1
%19 = and i32 %11, 16383
%20 = shl i32 %11, 2
%21 = ashr i32 %20, 16
%22 = getelementptr inbounds i32, i32* %1, i64 2
%23 = zext i32 %5 to i64
%24 = load i32, i32* %3
%25 = load i32, i32* %14
br label %26
26: ; preds = %13, %26
%27 = phi i32 [ %25, %13 ], [ %80, %26 ]
%28 = phi i32 [ %24, %13 ], [ %62, %26 ]
%29 = phi i64 [ 0, %13 ], [ %89, %26 ]
%30 = getelementptr inbounds i16, i16* %0, i64 %29
%31 = load i16, i16* %30
%32 = sext i16 %31 to i32
%33 = load i32, i32* %1
%34 = ashr i32 %33, 16
%35 = mul nsw i32 %34, %32
%36 = and i32 %33, 65535
%37 = mul nsw i32 %36, %32
%38 = ashr i32 %37, 16
%39 = add i32 %35, %28
%40 = add i32 %39, %38
%41 = shl i32 %40, 2
%42 = ashr i32 %41, 16
%43 = mul nsw i32 %42, %15
%44 = and i32 %41, 65532
%45 = mul nuw nsw i32 %44, %15
%46 = lshr i32 %45, 16
%47 = add nsw i32 %46, %43
%48 = ashr i32 %47, 14
%49 = mul nsw i32 %42, %17
%50 = mul nsw i32 %44, %17
%51 = ashr i32 %50, 16
%52 = add i32 %49, %27
%53 = add i32 %52, %51
%54 = add i32 %53, %48
store i32 %54, i32* %3
%55 = load i32, i32* %18
%56 = ashr i32 %55, 16
%57 = mul nsw i32 %56, %32
%58 = and i32 %55, 65535
%59 = mul nsw i32 %58, %32
%60 = ashr i32 %59, 16
%61 = add nsw i32 %60, %57
%62 = add nsw i32 %61, %54
store i32 %62, i32* %3
%63 = mul nsw i32 %42, %19
%64 = mul nuw nsw i32 %44, %19
%65 = lshr i32 %64, 16
%66 = add nsw i32 %65, %63
%67 = ashr i32 %66, 14
%68 = mul nsw i32 %42, %21
%69 = mul nsw i32 %44, %21
%70 = ashr i32 %69, 16
%71 = add nsw i32 %70, %68
%72 = add nsw i32 %71, %67
store i32 %72, i32* %14
%73 = load i32, i32* %22
%74 = ashr i32 %73, 16
%75 = mul nsw i32 %74, %32
%76 = and i32 %73, 65535
%77 = mul nsw i32 %76, %32
%78 = ashr i32 %77, 16
%79 = add nsw i32 %78, %75
%80 = add nsw i32 %79, %72
store i32 %80, i32* %14
%81 = ashr i32 %41, 14
%82 = icmp sgt i32 %41, 536838143
%83 = icmp sgt i32 %81, -32770
%84 = select i1 %83, i32 %81, i32 -32770
%85 = trunc i32 %84 to i16
%86 = add i16 %85, 2
%87 = select i1 %82, i16 32767, i16 %86
%88 = getelementptr inbounds i16, i16* %4, i64 %29
store i16 %87, i16* %88
%89 = add nuw nsw i64 %29, 1
%90 = icmp eq i64 %89, %23
br i1 %90, label %91, label %26
91: ; preds = %26, %6
ret void
}