void mix_in_with_volume(const short volume, const short *src, short *dst,
                        const unsigned n) {
  unsigned i, j;
  for (i = 0; i < n; i += 4)
    for (j = i; j < i + 4; ++j) {
      dst[j] =
          (short)((((int)dst[j] + ((2 * (int)src[j] * (int)volume) >> 16)) >
                   (0x7FFF))
                      ? (0x7FFF)
                      : ((((int)dst[j] +
                           ((2 * (int)src[j] * (int)volume) >> 16)) < (-0x8000))
                             ? (-0x8000)
                             : ((int)dst[j] +
                                ((2 * (int)src[j] * (int)volume) >> 16))));
    }
}


x86 assembly (clang, -O0):
<mix_in_with_volume>:
push   %rbp
mov    %rsp,%rbp
mov    %di,%ax
mov    %ax,-0x2(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jae    121a <mix_in_with_volume+0x11a>
mov    -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x20(%rbp),%ecx
add    $0x4,%ecx
cmp    %ecx,%eax
jae    1207 <mix_in_with_volume+0x107>
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
movswl (%rax,%rcx,2),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
movswl (%rcx,%rdx,2),%ecx
shl    $0x1,%ecx
movswl -0x2(%rbp),%edx
imul   %edx,%ecx
sar    $0x10,%ecx
add    %ecx,%eax
cmp    $0x7fff,%eax
jle    117d <mix_in_with_volume+0x7d>
mov    $0x7fff,%eax
mov    %eax,-0x28(%rbp)
jmp    11e8 <mix_in_with_volume+0xe8>
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
movswl (%rax,%rcx,2),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
movswl (%rcx,%rdx,2),%ecx
shl    $0x1,%ecx
movswl -0x2(%rbp),%edx
imul   %edx,%ecx
sar    $0x10,%ecx
add    %ecx,%eax
cmp    $0xffff8000,%eax
jge    11ba <mix_in_with_volume+0xba>
mov    $0xffff8000,%eax
mov    %eax,-0x2c(%rbp)
jmp    11e2 <mix_in_with_volume+0xe2>
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
movswl (%rax,%rcx,2),%eax
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edx
movswl (%rcx,%rdx,2),%ecx
shl    $0x1,%ecx
movswl -0x2(%rbp),%edx
imul   %edx,%ecx
sar    $0x10,%ecx
add    %ecx,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %ax,%dx
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %dx,(%rax,%rcx,2)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    112f <mix_in_with_volume+0x2f>
jmp    120c <mix_in_with_volume+0x10c>
mov    -0x20(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x20(%rbp)
jmp    111d <mix_in_with_volume+0x1d>
pop    %rbp
ret

x86 assembly (clang, -O2):
<mix_in_with_volume>:
push   %rbx
test   %ecx,%ecx
je     1696 <mix_in_with_volume+0x596>
movswl %di,%r11d
add    %r11d,%r11d
mov    %ecx,%r10d
lea    -0x1(%r10),%r8
cmp    $0x1c,%r8
jae    1124 <mix_in_with_volume+0x24>
xor    %edi,%edi
jmp    15e0 <mix_in_with_volume+0x4e0>
lea    0x3(%r10),%rax
and    $0xfffffffffffffffc,%rax
lea    (%rsi,%rax,2),%rcx
cmp    %rdx,%rcx
jbe    1145 <mix_in_with_volume+0x45>
lea    (%rdx,%rax,2),%rax
cmp    %rsi,%rax
jbe    1145 <mix_in_with_volume+0x45>
xor    %edi,%edi
jmp    15e0 <mix_in_with_volume+0x4e0>
shr    $0x2,%r8
add    $0x1,%r8
mov    %r8,%r9
and    $0xfffffffffffffff8,%r9
lea    0x0(,%r9,4),%rdi
movd   %r11d,%xmm0
pshufd $0x0,%xmm0,%xmm8
lea    0x3e(%rsi),%rcx
xor    %eax,%eax
pshufd $0xf5,%xmm8,%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzwl 0x38(%rdx,%rax,8),%ebx
movd   %ebx,%xmm2
movzwl 0x30(%rdx,%rax,8),%ebx
movd   %ebx,%xmm3
punpcklwd %xmm2,%xmm3
movzwl 0x28(%rdx,%rax,8),%ebx
movd   %ebx,%xmm2
movzwl 0x20(%rdx,%rax,8),%ebx
movd   %ebx,%xmm4
punpcklwd %xmm2,%xmm4
punpckldq %xmm3,%xmm4
movzwl 0x18(%rdx,%rax,8),%ebx
movd   %ebx,%xmm2
movzwl 0x10(%rdx,%rax,8),%ebx
movd   %ebx,%xmm5
punpcklwd %xmm2,%xmm5
movzwl 0x8(%rdx,%rax,8),%ebx
movd   %ebx,%xmm2
movzwl (%rdx,%rax,8),%ebx
movd   %ebx,%xmm3
punpcklwd %xmm2,%xmm3
punpckldq %xmm5,%xmm3
punpcklqdq %xmm4,%xmm3
pxor   %xmm4,%xmm4
pinsrw $0x1,-0x1e(%rcx,%rax,8),%xmm4
pinsrw $0x3,-0x16(%rcx,%rax,8),%xmm4
pinsrw $0x5,-0xe(%rcx,%rax,8),%xmm4
pinsrw $0x7,-0x6(%rcx,%rax,8),%xmm4
psrad  $0x10,%xmm4
pxor   %xmm5,%xmm5
pinsrw $0x1,-0x3e(%rcx,%rax,8),%xmm5
pinsrw $0x3,-0x36(%rcx,%rax,8),%xmm5
pinsrw $0x5,-0x2e(%rcx,%rax,8),%xmm5
pinsrw $0x7,-0x26(%rcx,%rax,8),%xmm5
psrad  $0x10,%xmm5
movdqa %xmm8,%xmm2
pmuludq %xmm5,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm5,%xmm5
pmuludq %xmm1,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm2
movdqa %xmm8,%xmm5
pmuludq %xmm4,%xmm5
pshufd $0xe8,%xmm5,%xmm5
pshufd $0xf5,%xmm4,%xmm4
pmuludq %xmm1,%xmm4
pshufd $0xe8,%xmm4,%xmm4
punpckldq %xmm4,%xmm5
psrad  $0x10,%xmm5
psrad  $0x10,%xmm2
packssdw %xmm5,%xmm2
paddsw %xmm3,%xmm2
movzwl 0x3a(%rdx,%rax,8),%ebx
movd   %ebx,%xmm3
movzwl 0x32(%rdx,%rax,8),%ebx
movd   %ebx,%xmm4
punpcklwd %xmm3,%xmm4
movzwl 0x2a(%rdx,%rax,8),%ebx
movd   %ebx,%xmm3
movzwl 0x22(%rdx,%rax,8),%ebx
movd   %ebx,%xmm5
punpcklwd %xmm3,%xmm5
punpckldq %xmm4,%xmm5
movzwl 0x1a(%rdx,%rax,8),%ebx
movd   %ebx,%xmm3
movzwl 0x12(%rdx,%rax,8),%ebx
movd   %ebx,%xmm6
punpcklwd %xmm3,%xmm6
movzwl 0xa(%rdx,%rax,8),%ebx
movd   %ebx,%xmm3
movzwl 0x2(%rdx,%rax,8),%ebx
movd   %ebx,%xmm4
punpcklwd %xmm3,%xmm4
punpckldq %xmm6,%xmm4
pxor   %xmm6,%xmm6
pinsrw $0x1,-0x1c(%rcx,%rax,8),%xmm6
pinsrw $0x3,-0x14(%rcx,%rax,8),%xmm6
pinsrw $0x5,-0xc(%rcx,%rax,8),%xmm6
pinsrw $0x7,-0x4(%rcx,%rax,8),%xmm6
punpcklqdq %xmm5,%xmm4
pxor   %xmm5,%xmm5
pinsrw $0x1,-0x3c(%rcx,%rax,8),%xmm5
pinsrw $0x3,-0x34(%rcx,%rax,8),%xmm5
pinsrw $0x5,-0x2c(%rcx,%rax,8),%xmm5
psrad  $0x10,%xmm6
pinsrw $0x7,-0x24(%rcx,%rax,8),%xmm5
psrad  $0x10,%xmm5
movdqa %xmm8,%xmm3
pmuludq %xmm5,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pshufd $0xf5,%xmm5,%xmm5
pmuludq %xmm1,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
movdqa %xmm8,%xmm5
pmuludq %xmm6,%xmm5
pshufd $0xe8,%xmm5,%xmm5
pshufd $0xf5,%xmm6,%xmm6
pmuludq %xmm1,%xmm6
pshufd $0xe8,%xmm6,%xmm6
punpckldq %xmm6,%xmm5
psrad  $0x10,%xmm5
psrad  $0x10,%xmm3
packssdw %xmm5,%xmm3
paddsw %xmm4,%xmm3
movzwl 0x3c(%rdx,%rax,8),%ebx
movd   %ebx,%xmm4
movzwl 0x34(%rdx,%rax,8),%ebx
movd   %ebx,%xmm5
punpcklwd %xmm4,%xmm5
movzwl 0x2c(%rdx,%rax,8),%ebx
movd   %ebx,%xmm4
movzwl 0x24(%rdx,%rax,8),%ebx
movd   %ebx,%xmm6
punpcklwd %xmm4,%xmm6
punpckldq %xmm5,%xmm6
movzwl 0x1c(%rdx,%rax,8),%ebx
movd   %ebx,%xmm4
movzwl 0x14(%rdx,%rax,8),%ebx
movd   %ebx,%xmm7
punpcklwd %xmm4,%xmm7
movzwl 0xc(%rdx,%rax,8),%ebx
movd   %ebx,%xmm4
movzwl 0x4(%rdx,%rax,8),%ebx
movd   %ebx,%xmm5
punpcklwd %xmm4,%xmm5
punpckldq %xmm7,%xmm5
punpcklqdq %xmm6,%xmm5
pxor   %xmm6,%xmm6
pinsrw $0x1,-0x1a(%rcx,%rax,8),%xmm6
pinsrw $0x3,-0x12(%rcx,%rax,8),%xmm6
pinsrw $0x5,-0xa(%rcx,%rax,8),%xmm6
pinsrw $0x7,-0x2(%rcx,%rax,8),%xmm6
psrad  $0x10,%xmm6
pxor   %xmm7,%xmm7
pinsrw $0x1,-0x3a(%rcx,%rax,8),%xmm7
pinsrw $0x3,-0x32(%rcx,%rax,8),%xmm7
pinsrw $0x5,-0x2a(%rcx,%rax,8),%xmm7
pinsrw $0x7,-0x22(%rcx,%rax,8),%xmm7
psrad  $0x10,%xmm7
movdqa %xmm8,%xmm4
pmuludq %xmm7,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pshufd $0xf5,%xmm7,%xmm7
pmuludq %xmm1,%xmm7
pshufd $0xe8,%xmm7,%xmm7
punpckldq %xmm7,%xmm4
movdqa %xmm8,%xmm7
pmuludq %xmm6,%xmm7
pshufd $0xe8,%xmm7,%xmm7
pshufd $0xf5,%xmm6,%xmm6
pmuludq %xmm1,%xmm6
pshufd $0xe8,%xmm6,%xmm6
punpckldq %xmm6,%xmm7
psrad  $0x10,%xmm7
psrad  $0x10,%xmm4
packssdw %xmm7,%xmm4
paddsw %xmm5,%xmm4
movzwl 0x3e(%rdx,%rax,8),%ebx
movd   %ebx,%xmm5
movzwl 0x36(%rdx,%rax,8),%ebx
movd   %ebx,%xmm6
punpcklwd %xmm5,%xmm6
movzwl 0x2e(%rdx,%rax,8),%ebx
movd   %ebx,%xmm5
movzwl 0x26(%rdx,%rax,8),%ebx
movd   %ebx,%xmm7
punpcklwd %xmm5,%xmm7
punpckldq %xmm6,%xmm7
movzwl 0x1e(%rdx,%rax,8),%ebx
movd   %ebx,%xmm5
movzwl 0x16(%rdx,%rax,8),%ebx
movd   %ebx,%xmm6
punpcklwd %xmm5,%xmm6
movzwl 0xe(%rdx,%rax,8),%ebx
movd   %ebx,%xmm0
movzwl 0x6(%rdx,%rax,8),%ebx
movd   %ebx,%xmm5
punpcklwd %xmm0,%xmm5
punpckldq %xmm6,%xmm5
pxor   %xmm0,%xmm0
pinsrw $0x1,-0x18(%rcx,%rax,8),%xmm0
pinsrw $0x3,-0x10(%rcx,%rax,8),%xmm0
pinsrw $0x5,-0x8(%rcx,%rax,8),%xmm0
punpcklqdq %xmm7,%xmm5
pinsrw $0x7,(%rcx,%rax,8),%xmm0
pxor   %xmm7,%xmm7
pinsrw $0x1,-0x38(%rcx,%rax,8),%xmm7
pinsrw $0x3,-0x30(%rcx,%rax,8),%xmm7
pinsrw $0x5,-0x28(%rcx,%rax,8),%xmm7
pinsrw $0x7,-0x20(%rcx,%rax,8),%xmm7
psrad  $0x10,%xmm0
psrad  $0x10,%xmm7
movdqa %xmm8,%xmm6
pmuludq %xmm7,%xmm6
pshufd $0xe8,%xmm6,%xmm6
pshufd $0xf5,%xmm7,%xmm7
pmuludq %xmm1,%xmm7
pshufd $0xe8,%xmm7,%xmm7
punpckldq %xmm7,%xmm6
movdqa %xmm8,%xmm7
pmuludq %xmm0,%xmm7
pshufd $0xe8,%xmm7,%xmm7
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm1,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm7
psrad  $0x10,%xmm7
psrad  $0x10,%xmm6
packssdw %xmm7,%xmm6
paddsw %xmm5,%xmm6
movdqa %xmm4,%xmm0
punpcklwd %xmm6,%xmm0
movdqa %xmm2,%xmm5
punpcklwd %xmm3,%xmm5
movdqa %xmm5,%xmm7
punpckldq %xmm0,%xmm7
punpckhdq %xmm0,%xmm5
punpckhwd %xmm6,%xmm4
punpckhwd %xmm3,%xmm2
movdqa %xmm2,%xmm0
punpckldq %xmm4,%xmm0
punpckhdq %xmm4,%xmm2
movdqu %xmm2,0x30(%rdx,%rax,8)
movdqu %xmm0,0x20(%rdx,%rax,8)
movdqu %xmm5,0x10(%rdx,%rax,8)
movdqu %xmm7,(%rdx,%rax,8)
add    $0x8,%rax
cmp    %rax,%r9
jne    1180 <mix_in_with_volume+0x80>
cmp    %r9,%r8
je     1696 <mix_in_with_volume+0x596>
nopl   0x0(%rax,%rax,1)
movswl (%rsi,%rdi,2),%eax
imul   %r11d,%eax
shr    $0x10,%eax
movzwl (%rdx,%rdi,2),%ecx
lea    (%rax,%rcx,1),%ebx
movswl %bx,%ebx
sar    $0xf,%ebx
xor    $0xffff8000,%ebx
add    %cx,%ax
cmovo  %ebx,%eax
mov    %ax,(%rdx,%rdi,2)
movswl 0x2(%rsi,%rdi,2),%eax
imul   %r11d,%eax
shr    $0x10,%eax
movzwl 0x2(%rdx,%rdi,2),%ecx
lea    (%rax,%rcx,1),%ebx
movswl %bx,%ebx
sar    $0xf,%ebx
xor    $0xffff8000,%ebx
add    %cx,%ax
cmovo  %ebx,%eax
mov    %ax,0x2(%rdx,%rdi,2)
movswl 0x4(%rsi,%rdi,2),%eax
imul   %r11d,%eax
shr    $0x10,%eax
movzwl 0x4(%rdx,%rdi,2),%ecx
lea    (%rax,%rcx,1),%ebx
movswl %bx,%ebx
sar    $0xf,%ebx
xor    $0xffff8000,%ebx
add    %cx,%ax
cmovo  %ebx,%eax
mov    %ax,0x4(%rdx,%rdi,2)
movswl 0x6(%rsi,%rdi,2),%eax
imul   %r11d,%eax
shr    $0x10,%eax
movzwl 0x6(%rdx,%rdi,2),%ecx
lea    (%rax,%rcx,1),%ebx
movswl %bx,%ebx
sar    $0xf,%ebx
xor    $0xffff8000,%ebx
add    %cx,%ax
cmovo  %ebx,%eax
mov    %ax,0x6(%rdx,%rdi,2)
add    $0x4,%rdi
cmp    %r10,%rdi
jb     15e0 <mix_in_with_volume+0x4e0>
pop    %rbx
ret

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

LLVM IR (-O2):
define void @mix_in_with_volume(i16 signext %0, i16* nocapture %1, i16* nocapture %2, i32 %3) {
%5 = icmp eq i32 %3, 0
br i1 %5, label %327, label %6
6: ; preds = %4
%7 = sext i16 %0 to i32
%8 = shl nsw i32 %7, 1
%9 = zext i32 %3 to i64
%10 = add nsw i64 %9, -1
%11 = lshr i64 %10, 2
%12 = add nuw nsw i64 %11, 1
%13 = icmp ult i64 %10, 28
br i1 %13, label %282, label %14
14: ; preds = %6
%15 = add nuw nsw i64 %9, 3
%16 = and i64 %15, 8589934588
%17 = getelementptr i16, i16* %2, i64 %16
%18 = getelementptr i16, i16* %1, i64 %16
%19 = icmp ugt i16* %18, %2
%20 = icmp ugt i16* %17, %1
%21 = and i1 %19, %20
br i1 %21, label %282, label %22
22: ; preds = %14
%23 = and i64 %12, 9223372036854775800
%24 = shl i64 %23, 2
%25 = insertelement <8 x i32> poison, i32 %8, i64 0
%26 = shufflevector <8 x i32> %25, <8 x i32> poison, <8 x i32> zeroinitializer
br label %27
27: ; preds = %27, %22
%28 = phi i64 [ 0, %22 ], [ %278, %27 ]
%29 = shl i64 %28, 2
%30 = or i64 %29, 4
%31 = or i64 %29, 8
%32 = or i64 %29, 12
%33 = or i64 %29, 16
%34 = or i64 %29, 20
%35 = or i64 %29, 24
%36 = or i64 %29, 28
%37 = getelementptr inbounds i16, i16* %2, i64 %29
%38 = getelementptr inbounds i16, i16* %2, i64 %30
%39 = getelementptr inbounds i16, i16* %2, i64 %31
%40 = getelementptr inbounds i16, i16* %2, i64 %32
%41 = getelementptr inbounds i16, i16* %2, i64 %33
%42 = getelementptr inbounds i16, i16* %2, i64 %34
%43 = getelementptr inbounds i16, i16* %2, i64 %35
%44 = getelementptr inbounds i16, i16* %2, i64 %36
%45 = load i16, i16* %37
%46 = load i16, i16* %38
%47 = load i16, i16* %39
%48 = load i16, i16* %40
%49 = load i16, i16* %41
%50 = load i16, i16* %42
%51 = load i16, i16* %43
%52 = load i16, i16* %44
%53 = insertelement <8 x i16> poison, i16 %45, i64 0
%54 = insertelement <8 x i16> %53, i16 %46, i64 1
%55 = insertelement <8 x i16> %54, i16 %47, i64 2
%56 = insertelement <8 x i16> %55, i16 %48, i64 3
%57 = insertelement <8 x i16> %56, i16 %49, i64 4
%58 = insertelement <8 x i16> %57, i16 %50, i64 5
%59 = insertelement <8 x i16> %58, i16 %51, i64 6
%60 = insertelement <8 x i16> %59, i16 %52, i64 7
%61 = getelementptr inbounds i16, i16* %1, i64 %29
%62 = getelementptr inbounds i16, i16* %1, i64 %30
%63 = getelementptr inbounds i16, i16* %1, i64 %31
%64 = getelementptr inbounds i16, i16* %1, i64 %32
%65 = getelementptr inbounds i16, i16* %1, i64 %33
%66 = getelementptr inbounds i16, i16* %1, i64 %34
%67 = getelementptr inbounds i16, i16* %1, i64 %35
%68 = getelementptr inbounds i16, i16* %1, i64 %36
%69 = load i16, i16* %61
%70 = load i16, i16* %62
%71 = load i16, i16* %63
%72 = load i16, i16* %64
%73 = load i16, i16* %65
%74 = load i16, i16* %66
%75 = load i16, i16* %67
%76 = load i16, i16* %68
%77 = insertelement <8 x i16> poison, i16 %69, i64 0
%78 = insertelement <8 x i16> %77, i16 %70, i64 1
%79 = insertelement <8 x i16> %78, i16 %71, i64 2
%80 = insertelement <8 x i16> %79, i16 %72, i64 3
%81 = insertelement <8 x i16> %80, i16 %73, i64 4
%82 = insertelement <8 x i16> %81, i16 %74, i64 5
%83 = insertelement <8 x i16> %82, i16 %75, i64 6
%84 = insertelement <8 x i16> %83, i16 %76, i64 7
%85 = sext <8 x i16> %84 to <8 x i32>
%86 = mul <8 x i32> %26, %85
%87 = lshr <8 x i32> %86, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
%88 = trunc <8 x i32> %87 to <8 x i16>
%89 = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %88, <8 x i16> %60)
%90 = or i64 %29, 1
%91 = or i64 %29, 5
%92 = or i64 %29, 9
%93 = or i64 %29, 13
%94 = or i64 %29, 17
%95 = or i64 %29, 21
%96 = or i64 %29, 25
%97 = or i64 %29, 29
%98 = getelementptr inbounds i16, i16* %2, i64 %90
%99 = getelementptr inbounds i16, i16* %2, i64 %91
%100 = getelementptr inbounds i16, i16* %2, i64 %92
%101 = getelementptr inbounds i16, i16* %2, i64 %93
%102 = getelementptr inbounds i16, i16* %2, i64 %94
%103 = getelementptr inbounds i16, i16* %2, i64 %95
%104 = getelementptr inbounds i16, i16* %2, i64 %96
%105 = getelementptr inbounds i16, i16* %2, i64 %97
%106 = load i16, i16* %98
%107 = load i16, i16* %99
%108 = load i16, i16* %100
%109 = load i16, i16* %101
%110 = load i16, i16* %102
%111 = load i16, i16* %103
%112 = load i16, i16* %104
%113 = load i16, i16* %105
%114 = insertelement <8 x i16> poison, i16 %106, i64 0
%115 = insertelement <8 x i16> %114, i16 %107, i64 1
%116 = insertelement <8 x i16> %115, i16 %108, i64 2
%117 = insertelement <8 x i16> %116, i16 %109, i64 3
%118 = insertelement <8 x i16> %117, i16 %110, i64 4
%119 = insertelement <8 x i16> %118, i16 %111, i64 5
%120 = insertelement <8 x i16> %119, i16 %112, i64 6
%121 = insertelement <8 x i16> %120, i16 %113, i64 7
%122 = getelementptr inbounds i16, i16* %1, i64 %90
%123 = getelementptr inbounds i16, i16* %1, i64 %91
%124 = getelementptr inbounds i16, i16* %1, i64 %92
%125 = getelementptr inbounds i16, i16* %1, i64 %93
%126 = getelementptr inbounds i16, i16* %1, i64 %94
%127 = getelementptr inbounds i16, i16* %1, i64 %95
%128 = getelementptr inbounds i16, i16* %1, i64 %96
%129 = getelementptr inbounds i16, i16* %1, i64 %97
%130 = load i16, i16* %122
%131 = load i16, i16* %123
%132 = load i16, i16* %124
%133 = load i16, i16* %125
%134 = load i16, i16* %126
%135 = load i16, i16* %127
%136 = load i16, i16* %128
%137 = load i16, i16* %129
%138 = insertelement <8 x i16> poison, i16 %130, i64 0
%139 = insertelement <8 x i16> %138, i16 %131, i64 1
%140 = insertelement <8 x i16> %139, i16 %132, i64 2
%141 = insertelement <8 x i16> %140, i16 %133, i64 3
%142 = insertelement <8 x i16> %141, i16 %134, i64 4
%143 = insertelement <8 x i16> %142, i16 %135, i64 5
%144 = insertelement <8 x i16> %143, i16 %136, i64 6
%145 = insertelement <8 x i16> %144, i16 %137, i64 7
%146 = sext <8 x i16> %145 to <8 x i32>
%147 = mul <8 x i32> %26, %146
%148 = lshr <8 x i32> %147, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
%149 = trunc <8 x i32> %148 to <8 x i16>
%150 = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %149, <8 x i16> %121)
%151 = or i64 %29, 2
%152 = or i64 %29, 6
%153 = or i64 %29, 10
%154 = or i64 %29, 14
%155 = or i64 %29, 18
%156 = or i64 %29, 22
%157 = or i64 %29, 26
%158 = or i64 %29, 30
%159 = getelementptr inbounds i16, i16* %2, i64 %151
%160 = getelementptr inbounds i16, i16* %2, i64 %152
%161 = getelementptr inbounds i16, i16* %2, i64 %153
%162 = getelementptr inbounds i16, i16* %2, i64 %154
%163 = getelementptr inbounds i16, i16* %2, i64 %155
%164 = getelementptr inbounds i16, i16* %2, i64 %156
%165 = getelementptr inbounds i16, i16* %2, i64 %157
%166 = getelementptr inbounds i16, i16* %2, i64 %158
%167 = load i16, i16* %159
%168 = load i16, i16* %160
%169 = load i16, i16* %161
%170 = load i16, i16* %162
%171 = load i16, i16* %163
%172 = load i16, i16* %164
%173 = load i16, i16* %165
%174 = load i16, i16* %166
%175 = insertelement <8 x i16> poison, i16 %167, i64 0
%176 = insertelement <8 x i16> %175, i16 %168, i64 1
%177 = insertelement <8 x i16> %176, i16 %169, i64 2
%178 = insertelement <8 x i16> %177, i16 %170, i64 3
%179 = insertelement <8 x i16> %178, i16 %171, i64 4
%180 = insertelement <8 x i16> %179, i16 %172, i64 5
%181 = insertelement <8 x i16> %180, i16 %173, i64 6
%182 = insertelement <8 x i16> %181, i16 %174, i64 7
%183 = getelementptr inbounds i16, i16* %1, i64 %151
%184 = getelementptr inbounds i16, i16* %1, i64 %152
%185 = getelementptr inbounds i16, i16* %1, i64 %153
%186 = getelementptr inbounds i16, i16* %1, i64 %154
%187 = getelementptr inbounds i16, i16* %1, i64 %155
%188 = getelementptr inbounds i16, i16* %1, i64 %156
%189 = getelementptr inbounds i16, i16* %1, i64 %157
%190 = getelementptr inbounds i16, i16* %1, i64 %158
%191 = load i16, i16* %183
%192 = load i16, i16* %184
%193 = load i16, i16* %185
%194 = load i16, i16* %186
%195 = load i16, i16* %187
%196 = load i16, i16* %188
%197 = load i16, i16* %189
%198 = load i16, i16* %190
%199 = insertelement <8 x i16> poison, i16 %191, i64 0
%200 = insertelement <8 x i16> %199, i16 %192, i64 1
%201 = insertelement <8 x i16> %200, i16 %193, i64 2
%202 = insertelement <8 x i16> %201, i16 %194, i64 3
%203 = insertelement <8 x i16> %202, i16 %195, i64 4
%204 = insertelement <8 x i16> %203, i16 %196, i64 5
%205 = insertelement <8 x i16> %204, i16 %197, i64 6
%206 = insertelement <8 x i16> %205, i16 %198, i64 7
%207 = sext <8 x i16> %206 to <8 x i32>
%208 = mul <8 x i32> %26, %207
%209 = lshr <8 x i32> %208, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
%210 = trunc <8 x i32> %209 to <8 x i16>
%211 = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %210, <8 x i16> %182)
%212 = or i64 %29, 3
%213 = or i64 %29, 7
%214 = or i64 %29, 11
%215 = or i64 %29, 15
%216 = or i64 %29, 19
%217 = or i64 %29, 23
%218 = or i64 %29, 27
%219 = or i64 %29, 31
%220 = getelementptr inbounds i16, i16* %2, i64 %212
%221 = getelementptr inbounds i16, i16* %2, i64 %213
%222 = getelementptr inbounds i16, i16* %2, i64 %214
%223 = getelementptr inbounds i16, i16* %2, i64 %215
%224 = getelementptr inbounds i16, i16* %2, i64 %216
%225 = getelementptr inbounds i16, i16* %2, i64 %217
%226 = getelementptr inbounds i16, i16* %2, i64 %218
%227 = getelementptr inbounds i16, i16* %2, i64 %219
%228 = load i16, i16* %220
%229 = load i16, i16* %221
%230 = load i16, i16* %222
%231 = load i16, i16* %223
%232 = load i16, i16* %224
%233 = load i16, i16* %225
%234 = load i16, i16* %226
%235 = load i16, i16* %227
%236 = insertelement <8 x i16> poison, i16 %228, i64 0
%237 = insertelement <8 x i16> %236, i16 %229, i64 1
%238 = insertelement <8 x i16> %237, i16 %230, i64 2
%239 = insertelement <8 x i16> %238, i16 %231, i64 3
%240 = insertelement <8 x i16> %239, i16 %232, i64 4
%241 = insertelement <8 x i16> %240, i16 %233, i64 5
%242 = insertelement <8 x i16> %241, i16 %234, i64 6
%243 = insertelement <8 x i16> %242, i16 %235, i64 7
%244 = getelementptr inbounds i16, i16* %1, i64 %212
%245 = getelementptr inbounds i16, i16* %1, i64 %213
%246 = getelementptr inbounds i16, i16* %1, i64 %214
%247 = getelementptr inbounds i16, i16* %1, i64 %215
%248 = getelementptr inbounds i16, i16* %1, i64 %216
%249 = getelementptr inbounds i16, i16* %1, i64 %217
%250 = getelementptr inbounds i16, i16* %1, i64 %218
%251 = getelementptr inbounds i16, i16* %1, i64 %219
%252 = load i16, i16* %244
%253 = load i16, i16* %245
%254 = load i16, i16* %246
%255 = load i16, i16* %247
%256 = load i16, i16* %248
%257 = load i16, i16* %249
%258 = load i16, i16* %250
%259 = load i16, i16* %251
%260 = insertelement <8 x i16> poison, i16 %252, i64 0
%261 = insertelement <8 x i16> %260, i16 %253, i64 1
%262 = insertelement <8 x i16> %261, i16 %254, i64 2
%263 = insertelement <8 x i16> %262, i16 %255, i64 3
%264 = insertelement <8 x i16> %263, i16 %256, i64 4
%265 = insertelement <8 x i16> %264, i16 %257, i64 5
%266 = insertelement <8 x i16> %265, i16 %258, i64 6
%267 = insertelement <8 x i16> %266, i16 %259, i64 7
%268 = sext <8 x i16> %267 to <8 x i32>
%269 = mul <8 x i32> %26, %268
%270 = lshr <8 x i32> %269, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
%271 = trunc <8 x i32> %270 to <8 x i16>
%272 = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %271, <8 x i16> %243)
%273 = getelementptr inbounds i16, i16* %220, i64 -3
%274 = bitcast i16* %273 to <32 x i16>*
%275 = shufflevector <8 x i16> %89, <8 x i16> %150, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
%276 = shufflevector <8 x i16> %211, <8 x i16> %272, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
%277 = shufflevector <16 x i16> %275, <16 x i16> %276, <32 x i32> <i32 0, i32 8, i32 16, i32 24, i32 1, i32 9, i32 17, i32 25, i32 2, i32 10, i32 18, i32 26, i32 3, i32 11, i32 19, i32 27, i32 4, i32 12, i32 20, i32 28, i32 5, i32 13, i32 21, i32 29, i32 6, i32 14, i32 22, i32 30, i32 7, i32 15, i32 23, i32 31>
store <32 x i16> %277, <32 x i16>* %274
%278 = add nuw i64 %28, 8
%279 = icmp eq i64 %278, %23
br i1 %279, label %280, label %27
280: ; preds = %27
%281 = icmp eq i64 %12, %23
br i1 %281, label %327, label %282
282: ; preds = %14, %6, %280
%283 = phi i64 [ 0, %14 ], [ 0, %6 ], [ %24, %280 ]
br label %284
284: ; preds = %282, %284
%285 = phi i64 [ %286, %284 ], [ %283, %282 ]
%286 = add nuw nsw i64 %285, 4
%287 = getelementptr inbounds i16, i16* %2, i64 %285
%288 = load i16, i16* %287
%289 = getelementptr inbounds i16, i16* %1, i64 %285
%290 = load i16, i16* %289
%291 = sext i16 %290 to i32
%292 = mul i32 %8, %291
%293 = lshr i32 %292, 16
%294 = trunc i32 %293 to i16
%295 = tail call i16 @llvm.sadd.sat.i16(i16 %294, i16 %288)
store i16 %295, i16* %287
%296 = or i64 %285, 1
%297 = getelementptr inbounds i16, i16* %2, i64 %296
%298 = load i16, i16* %297
%299 = getelementptr inbounds i16, i16* %1, i64 %296
%300 = load i16, i16* %299
%301 = sext i16 %300 to i32
%302 = mul i32 %8, %301
%303 = lshr i32 %302, 16
%304 = trunc i32 %303 to i16
%305 = tail call i16 @llvm.sadd.sat.i16(i16 %304, i16 %298)
store i16 %305, i16* %297
%306 = or i64 %285, 2
%307 = getelementptr inbounds i16, i16* %2, i64 %306
%308 = load i16, i16* %307
%309 = getelementptr inbounds i16, i16* %1, i64 %306
%310 = load i16, i16* %309
%311 = sext i16 %310 to i32
%312 = mul i32 %8, %311
%313 = lshr i32 %312, 16
%314 = trunc i32 %313 to i16
%315 = tail call i16 @llvm.sadd.sat.i16(i16 %314, i16 %308)
store i16 %315, i16* %307
%316 = or i64 %285, 3
%317 = getelementptr inbounds i16, i16* %2, i64 %316
%318 = load i16, i16* %317
%319 = getelementptr inbounds i16, i16* %1, i64 %316
%320 = load i16, i16* %319
%321 = sext i16 %320 to i32
%322 = mul i32 %8, %321
%323 = lshr i32 %322, 16
%324 = trunc i32 %323 to i16
%325 = tail call i16 @llvm.sadd.sat.i16(i16 %324, i16 %318)
store i16 %325, i16* %317
%326 = icmp ult i64 %286, %9
br i1 %326, label %284, label %327
327: ; preds = %284, %280, %4
ret void
}