long DetectorsFilter(short *DelayLine, short *Filter, short InLen) {
  register short *Ptr1, *Ptr2;
  long Acc0, Acc1;
  long FreqEnergy;
  short PartFreq;
  short i;
  Acc0 = Acc1 = 8;
  Ptr1 = DelayLine;
  Ptr2 = Filter;
  for (i = 0; i < InLen - 1; i += (short)2) {
    Acc0 += (long)*Ptr1 * *Ptr2 - (long)*(Ptr1 + 1) * *(Ptr2 + 1);
    Acc1 += (long)*Ptr1 * *(Ptr2 + 1) + (long)*(Ptr1 + 1) * *Ptr2;
    Ptr1 += 2;
    Ptr2 += 2;
  }
  PartFreq = (short)(Acc0 >> 4);
  FreqEnergy = (long)PartFreq * PartFreq << 1;
  PartFreq = (short)(Acc1 >> 4);
  FreqEnergy += (long)PartFreq * PartFreq << 1;
  return FreqEnergy;
}


x86 assembly (clang, -O0):
<DetectorsFilter>:
push   %rbp
mov    %rsp,%rbp
mov    %dx,%ax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %ax,-0x12(%rbp)
movq   $0x8,-0x38(%rbp)
movq   $0x8,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
movw   $0x0,-0x44(%rbp)
movswl -0x44(%rbp),%eax
movswl -0x12(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    11de <DetectorsFilter+0xde>
mov    -0x20(%rbp),%rax
movswq (%rax),%rax
mov    -0x28(%rbp),%rcx
movswq (%rcx),%rcx
imul   %rcx,%rax
mov    -0x20(%rbp),%rcx
movswq 0x2(%rcx),%rcx
mov    -0x28(%rbp),%rdx
movswq 0x2(%rdx),%rdx
imul   %rdx,%rcx
sub    %rcx,%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
movswq (%rax),%rax
mov    -0x28(%rbp),%rcx
movswq 0x2(%rcx),%rcx
imul   %rcx,%rax
mov    -0x20(%rbp),%rcx
movswq 0x2(%rcx),%rcx
mov    -0x28(%rbp),%rdx
movswq (%rdx),%rdx
imul   %rdx,%rcx
add    %rcx,%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x28(%rbp)
movswl -0x44(%rbp),%eax
add    $0x2,%eax
mov    %ax,-0x44(%rbp)
jmp    1139 <DetectorsFilter+0x39>
mov    -0x30(%rbp),%rax
sar    $0x4,%rax
mov    %ax,-0x42(%rbp)
movswq -0x42(%rbp),%rax
movswq -0x42(%rbp),%rcx
imul   %rcx,%rax
shl    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x38(%rbp),%rax
sar    $0x4,%rax
mov    %ax,-0x42(%rbp)
movswq -0x42(%rbp),%rax
movswq -0x42(%rbp),%rcx
imul   %rcx,%rax
shl    $0x1,%rax
add    -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<DetectorsFilter>:
xor    %r8d,%r8d
cmp    $0x2,%dx
jl     117d <DetectorsFilter+0x7d>
push   %r15
push   %r14
push   %rbx
add    $0xffffffff,%edx
mov    $0x8,%eax
xor    %r9d,%r9d
mov    $0x8,%ecx
xchg   %ax,%ax
movswq (%rdi,%r9,1),%r10
movswq (%rsi,%r9,1),%r11
movswq 0x2(%rdi,%r9,1),%r14
movswq 0x2(%rsi,%r9,1),%rbx
mov    %rbx,%r15
imul   %r14,%r15
imul   %r11,%r14
imul   %r10,%r11
add    %r11,%rcx
sub    %r15,%rcx
imul   %r10,%rbx
add    %r14,%rax
add    %rbx,%rax
add    $0x2,%r8d
movswl %r8w,%r8d
add    $0x4,%r9
cmp    %edx,%r8d
jl     1120 <DetectorsFilter+0x20>
shr    $0x4,%rcx
movswq %cx,%r8
shr    $0x4,%rax
movswq %ax,%rax
pop    %rbx
pop    %r14
pop    %r15
jmp    117f <DetectorsFilter+0x7f>
xor    %eax,%eax
imul   %r8,%r8
imul   %rax,%rax
add    %r8,%rax
add    %rax,%rax
ret

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

LLVM IR (-O2):
define i64 @DetectorsFilter(i16* nocapture %0, i16* nocapture %1, i16 signext %2) {
%4 = sext i16 %2 to i32
%5 = add nsw i32 %4, -1
%6 = icmp sgt i16 %2, 1
br i1 %6, label %7, label %42
7: ; preds = %3, %7
%8 = phi i32 [ %35, %7 ], [ 0, %3 ]
%9 = phi i16* [ %31, %7 ], [ %0, %3 ]
%10 = phi i16* [ %32, %7 ], [ %1, %3 ]
%11 = phi i64 [ %30, %7 ], [ 8, %3 ]
%12 = phi i64 [ %26, %7 ], [ 8, %3 ]
%13 = load i16, i16* %9
%14 = sext i16 %13 to i64
%15 = load i16, i16* %10
%16 = sext i16 %15 to i64
%17 = mul nsw i64 %16, %14
%18 = getelementptr inbounds i16, i16* %9, i64 1
%19 = load i16, i16* %18
%20 = sext i16 %19 to i64
%21 = getelementptr inbounds i16, i16* %10, i64 1
%22 = load i16, i16* %21
%23 = sext i16 %22 to i64
%24 = mul nsw i64 %23, %20
%25 = add i64 %17, %12
%26 = sub i64 %25, %24
%27 = mul nsw i64 %23, %14
%28 = mul nsw i64 %20, %16
%29 = add i64 %28, %11
%30 = add i64 %29, %27
%31 = getelementptr inbounds i16, i16* %9, i64 2
%32 = getelementptr inbounds i16, i16* %10, i64 2
%33 = shl nsw i32 %8, 16
%34 = add i32 %33, 131072
%35 = ashr exact i32 %34, 16
%36 = icmp slt i32 %35, %5
br i1 %36, label %7, label %37
37: ; preds = %7
%38 = shl i64 %26, 44
%39 = ashr i64 %38, 48
%40 = shl i64 %30, 44
%41 = ashr i64 %40, 48
br label %42
42: ; preds = %37, %3
%43 = phi i64 [ 0, %3 ], [ %39, %37 ]
%44 = phi i64 [ 0, %3 ], [ %41, %37 ]
%45 = mul nsw i64 %43, %43
%46 = mul nsw i64 %44, %44
%47 = add nuw nsw i64 %46, %45
%48 = shl nuw nsw i64 %47, 1
ret i64 %48
}