void sharpen(short const *in, float level, int count, short *out) {
  int const accuracy = 16;
  int const middle = (int)(level * (1 << accuracy));
  int const side = (middle - (1 << accuracy)) >> 1;
  *out++ = *in++;
  *out++ = *in++;
  *out++ = *in++;
  for (count = (count - 2) * 3; count--; in++)
    *out++ = (in[0] * middle - in[-3] * side - in[3] * side) >> accuracy;
  *out++ = *in++;
  *out++ = *in++;
  *out++ = *in++;
}


x86 assembly (clang, -O0):
<sharpen>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x10,-0x1c(%rbp)
movss  0xedd(%rip),%xmm0
mulss  -0xc(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
sub    $0x10000,%eax
sar    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cx
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cx,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cx
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cx,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cx
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cx,(%rax)
mov    -0x10(%rbp),%eax
sub    $0x2,%eax
imul   $0x3,%eax,%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x10(%rbp)
cmp    $0x0,%eax
je     1219 <sharpen+0x119>
mov    -0x8(%rbp),%rax
movswl (%rax),%eax
imul   -0x20(%rbp),%eax
mov    -0x8(%rbp),%rcx
movswl -0x6(%rcx),%ecx
imul   -0x24(%rbp),%ecx
sub    %ecx,%eax
mov    -0x8(%rbp),%rcx
movswl 0x6(%rcx),%ecx
imul   -0x24(%rbp),%ecx
sub    %ecx,%eax
sar    $0x10,%eax
mov    %ax,%cx
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cx,(%rax)
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
jmp    11b5 <sharpen+0xb5>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cx
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cx,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cx
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cx,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cx
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<sharpen>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
movzwl (%rdi),%eax
mov    %ax,(%rdx)
movzwl 0x2(%rdi),%eax
mov    %ax,0x2(%rdx)
lea    0x6(%rdi),%rax
movzwl 0x4(%rdi),%ecx
lea    0x6(%rdx),%r9
mov    %cx,0x4(%rdx)
lea    (%rsi,%rsi,2),%r10d
mov    %r10d,%r8d
add    $0xfffffffa,%r8d
je     118d <sharpen+0x8d>
mulss  0xec5(%rip),%xmm0
cvttss2si %xmm0,%r14d
lea    -0x10000(%r14),%r15d
sar    %r15d
add    $0xfffffff9,%r10d
cmp    $0x7,%r10d
jb     1176 <sharpen+0x76>
lea    (%rdi,%r10,2),%rcx
add    $0xe,%rcx
cmp    %rcx,%r9
jae    123d <sharpen+0x13d>
lea    (%rdx,%r10,2),%rcx
add    $0x8,%rcx
cmp    %rdi,%rcx
jbe    123d <sharpen+0x13d>
mov    %r9,%r12
test   $0x1,%r8b
jne    1195 <sharpen+0x95>
mov    %r8d,%r9d
cmp    $0x1,%r8d
jne    11ca <sharpen+0xca>
jmp    1379 <sharpen+0x279>
mov    %r9,%r12
jmp    1379 <sharpen+0x279>
lea    -0x1(%r8),%r9d
movswl (%rax),%edi
imul   %r14d,%edi
movswl -0x6(%rax),%ebx
movswl 0x6(%rax),%ecx
add    %ebx,%ecx
imul   %r15d,%ecx
sub    %ecx,%edi
shr    $0x10,%edi
mov    %di,(%r12)
add    $0x2,%r12
add    $0x2,%rax
cmp    $0x1,%r8d
je     1379 <sharpen+0x279>
mov    %r9d,%edi
xor    %ecx,%ecx
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movswl (%rax,%rcx,2),%esi
imul   %r14d,%esi
movswl -0x6(%rax,%rcx,2),%ebp
movswl 0x6(%rax,%rcx,2),%edx
add    %ebp,%edx
imul   %r15d,%edx
sub    %edx,%esi
shr    $0x10,%esi
mov    %si,(%r12,%rcx,2)
movswl 0x2(%rax,%rcx,2),%edx
imul   %r14d,%edx
movswl -0x4(%rax,%rcx,2),%esi
movswl 0x8(%rax,%rcx,2),%ebp
add    %esi,%ebp
imul   %r15d,%ebp
sub    %ebp,%edx
shr    $0x10,%edx
mov    %dx,0x2(%r12,%rcx,2)
add    $0xfffffffffffffffc,%rbx
add    $0x2,%rcx
cmp    %ecx,%edi
jne    11e0 <sharpen+0xe0>
sub    %rbx,%rax
sub    %rbx,%r12
jmp    1379 <sharpen+0x279>
add    $0x1,%r10
mov    %r10,%r11
and    $0xfffffffffffffff8,%r11
lea    (%rax,%r11,2),%rax
sub    %r11d,%r8d
lea    (%r9,%r11,2),%r12
movd   %r14d,%xmm0
pshufd $0x0,%xmm0,%xmm8
movd   %r15d,%xmm1
pshufd $0x0,%xmm1,%xmm9
xor    %ebx,%ebx
pshufd $0xf5,%xmm8,%xmm2
pshufd $0xf5,%xmm9,%xmm3
nopw   0x0(%rax,%rax,1)
movdqu (%rdi,%rbx,2),%xmm7
movdqu 0x6(%rdi,%rbx,2),%xmm4
movdqu 0xc(%rdi,%rbx,2),%xmm6
punpcklwd %xmm4,%xmm0
psrad  $0x10,%xmm0
punpckhwd %xmm4,%xmm5
psrad  $0x10,%xmm5
movdqa %xmm8,%xmm4
pmuludq %xmm5,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pshufd $0xf5,%xmm5,%xmm5
pmuludq %xmm2,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm4
movdqa %xmm8,%xmm5
pmuludq %xmm0,%xmm5
pshufd $0xe8,%xmm5,%xmm5
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm2,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm5
punpckhwd %xmm7,%xmm0
psrad  $0x10,%xmm0
punpcklwd %xmm7,%xmm7
psrad  $0x10,%xmm7
punpckhwd %xmm6,%xmm1
psrad  $0x10,%xmm1
paddd  %xmm0,%xmm1
punpcklwd %xmm6,%xmm0
psrad  $0x10,%xmm0
paddd  %xmm7,%xmm0
pshufd $0xf5,%xmm1,%xmm6
pmuludq %xmm9,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm3,%xmm6
pshufd $0xe8,%xmm6,%xmm6
punpckldq %xmm6,%xmm1
psubd  %xmm1,%xmm4
pshufd $0xf5,%xmm0,%xmm1
pmuludq %xmm9,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pmuludq %xmm3,%xmm1
pshufd $0xe8,%xmm1,%xmm1
punpckldq %xmm1,%xmm0
psubd  %xmm0,%xmm5
psrad  $0x10,%xmm4
psrad  $0x10,%xmm5
packssdw %xmm4,%xmm5
movdqu %xmm5,(%r9,%rbx,2)
add    $0x8,%rbx
cmp    %rbx,%r11
jne    1280 <sharpen+0x180>
cmp    %r11,%r10
jne    1179 <sharpen+0x79>
movzwl (%rax),%ecx
mov    %cx,(%r12)
movzwl 0x2(%rax),%ecx
mov    %cx,0x2(%r12)
movzwl 0x4(%rax),%eax
mov    %ax,0x4(%r12)
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @sharpen(i16* nocapture %0, float %1, i32 %2, i16* nocapture writeonly %3) {
%5 = fmul float %1, 6.553600e+04
%6 = fptosi float %5 to i32
%7 = add nsw i32 %6, -65536
%8 = ashr i32 %7, 1
%9 = getelementptr inbounds i16, i16* %0, i64 1
%10 = load i16, i16* %0
%11 = getelementptr inbounds i16, i16* %3, i64 1
store i16 %10, i16* %3
%12 = getelementptr inbounds i16, i16* %0, i64 2
%13 = load i16, i16* %9
%14 = getelementptr inbounds i16, i16* %3, i64 2
store i16 %13, i16* %11
%15 = getelementptr inbounds i16, i16* %0, i64 3
%16 = load i16, i16* %12
%17 = getelementptr i16, i16* %3, i64 3
store i16 %16, i16* %14
%18 = mul i32 %2, 3
%19 = add i32 %18, -6
%20 = icmp eq i32 %19, 0
br i1 %20, label %141, label %21
21: ; preds = %4
%22 = add i32 %18, -7
%23 = zext i32 %22 to i64
%24 = add nuw nsw i64 %23, 1
%25 = icmp ult i32 %22, 7
br i1 %25, label %72, label %26
26: ; preds = %21
%27 = add i32 %18, -7
%28 = zext i32 %27 to i64
%29 = add nuw nsw i64 %28, 4
%30 = getelementptr i16, i16* %3, i64 %29
%31 = add nuw nsw i64 %28, 7
%32 = getelementptr i16, i16* %0, i64 %31
%33 = icmp ult i16* %17, %32
%34 = icmp ugt i16* %30, %0
%35 = and i1 %33, %34
br i1 %35, label %72, label %36
36: ; preds = %26
%37 = and i64 %24, 8589934584
%38 = getelementptr i16, i16* %15, i64 %37
%39 = trunc i64 %37 to i32
%40 = sub i32 %19, %39
%41 = getelementptr i16, i16* %17, i64 %37
%42 = insertelement <8 x i32> poison, i32 %6, i64 0
%43 = shufflevector <8 x i32> %42, <8 x i32> poison, <8 x i32> zeroinitializer
%44 = insertelement <8 x i32> poison, i32 %8, i64 0
%45 = shufflevector <8 x i32> %44, <8 x i32> poison, <8 x i32> zeroinitializer
br label %46
46: ; preds = %46, %36
%47 = phi i64 [ 0, %36 ], [ %68, %46 ]
%48 = getelementptr i16, i16* %15, i64 %47
%49 = getelementptr i16, i16* %17, i64 %47
%50 = bitcast i16* %48 to <8 x i16>*
%51 = load <8 x i16>, <8 x i16>* %50
%52 = sext <8 x i16> %51 to <8 x i32>
%53 = mul nsw <8 x i32> %43, %52
%54 = getelementptr inbounds i16, i16* %48, i64 -3
%55 = bitcast i16* %54 to <8 x i16>*
%56 = load <8 x i16>, <8 x i16>* %55
%57 = sext <8 x i16> %56 to <8 x i32>
%58 = getelementptr inbounds i16, i16* %48, i64 3
%59 = bitcast i16* %58 to <8 x i16>*
%60 = load <8 x i16>, <8 x i16>* %59
%61 = sext <8 x i16> %60 to <8 x i32>
%62 = add nsw <8 x i32> %61, %57
%63 = mul <8 x i32> %62, %45
%64 = sub <8 x i32> %53, %63
%65 = lshr <8 x i32> %64, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
%66 = trunc <8 x i32> %65 to <8 x i16>
%67 = bitcast i16* %49 to <8 x i16>*
store <8 x i16> %66, <8 x i16>* %67
%68 = add nuw i64 %47, 8
%69 = icmp eq i64 %68, %37
br i1 %69, label %70, label %46
70: ; preds = %46
%71 = icmp eq i64 %24, %37
br i1 %71, label %141, label %72
72: ; preds = %26, %21, %70
%73 = phi i16* [ %15, %26 ], [ %15, %21 ], [ %38, %70 ]
%74 = phi i32 [ %19, %26 ], [ %19, %21 ], [ %40, %70 ]
%75 = phi i16* [ %17, %26 ], [ %17, %21 ], [ %41, %70 ]
%76 = and i32 %74, 1
%77 = icmp eq i32 %76, 0
br i1 %77, label %96, label %78
78: ; preds = %72
%79 = add nsw i32 %74, -1
%80 = load i16, i16* %73
%81 = sext i16 %80 to i32
%82 = mul nsw i32 %81, %6
%83 = getelementptr inbounds i16, i16* %73, i64 -3
%84 = load i16, i16* %83
%85 = sext i16 %84 to i32
%86 = getelementptr inbounds i16, i16* %73, i64 3
%87 = load i16, i16* %86
%88 = sext i16 %87 to i32
%89 = add nsw i32 %88, %85
%90 = mul i32 %89, %8
%91 = sub i32 %82, %90
%92 = lshr i32 %91, 16
%93 = trunc i32 %92 to i16
%94 = getelementptr inbounds i16, i16* %75, i64 1
store i16 %93, i16* %75
%95 = getelementptr inbounds i16, i16* %73, i64 1
br label %96
96: ; preds = %78, %72
%97 = phi i16* [ undef, %72 ], [ %94, %78 ]
%98 = phi i16* [ undef, %72 ], [ %95, %78 ]
%99 = phi i16* [ %73, %72 ], [ %95, %78 ]
%100 = phi i32 [ %74, %72 ], [ %79, %78 ]
%101 = phi i16* [ %75, %72 ], [ %94, %78 ]
%102 = icmp eq i32 %74, 1
br i1 %102, label %141, label %103
103: ; preds = %96, %103
%104 = phi i16* [ %139, %103 ], [ %99, %96 ]
%105 = phi i32 [ %123, %103 ], [ %100, %96 ]
%106 = phi i16* [ %138, %103 ], [ %101, %96 ]
%107 = load i16, i16* %104
%108 = sext i16 %107 to i32
%109 = mul nsw i32 %108, %6
%110 = getelementptr inbounds i16, i16* %104, i64 -3
%111 = load i16, i16* %110
%112 = sext i16 %111 to i32
%113 = getelementptr inbounds i16, i16* %104, i64 3
%114 = load i16, i16* %113
%115 = sext i16 %114 to i32
%116 = add nsw i32 %115, %112
%117 = mul i32 %116, %8
%118 = sub i32 %109, %117
%119 = lshr i32 %118, 16
%120 = trunc i32 %119 to i16
%121 = getelementptr inbounds i16, i16* %106, i64 1
store i16 %120, i16* %106
%122 = getelementptr inbounds i16, i16* %104, i64 1
%123 = add nsw i32 %105, -2
%124 = load i16, i16* %122
%125 = sext i16 %124 to i32
%126 = mul nsw i32 %125, %6
%127 = getelementptr inbounds i16, i16* %104, i64 -2
%128 = load i16, i16* %127
%129 = sext i16 %128 to i32
%130 = getelementptr inbounds i16, i16* %104, i64 4
%131 = load i16, i16* %130
%132 = sext i16 %131 to i32
%133 = add nsw i32 %132, %129
%134 = mul i32 %133, %8
%135 = sub i32 %126, %134
%136 = lshr i32 %135, 16
%137 = trunc i32 %136 to i16
%138 = getelementptr inbounds i16, i16* %106, i64 2
store i16 %137, i16* %121
%139 = getelementptr inbounds i16, i16* %104, i64 2
%140 = icmp eq i32 %123, 0
br i1 %140, label %141, label %103
141: ; preds = %96, %103, %70, %4
%142 = phi i16* [ %17, %4 ], [ %41, %70 ], [ %97, %96 ], [ %138, %103 ]
%143 = phi i16* [ %15, %4 ], [ %38, %70 ], [ %98, %96 ], [ %139, %103 ]
%144 = getelementptr inbounds i16, i16* %143, i64 1
%145 = load i16, i16* %143
%146 = getelementptr inbounds i16, i16* %142, i64 1
store i16 %145, i16* %142
%147 = getelementptr inbounds i16, i16* %143, i64 2
%148 = load i16, i16* %144
%149 = getelementptr inbounds i16, i16* %142, i64 2
store i16 %148, i16* %146
%150 = load i16, i16* %147
store i16 %150, i16* %149
ret void
}