void scale_img(short int *src, short int *dst, int c0, int c1, int ov_flag,
               int npix) {
  short int lut[4096];
  int i, res;
  for (i = 0; i < 4096; ++i) {
    res = i * c0 + c1;
    if (res < 0) {
      if (ov_flag)
        res = 0;
      else
        res = (((res) > 0) ? ((res)) : (-(res)));
    }
    if (res > 4096 - 1)
      res = 4096 - 1;
    lut[i] = res;
  }
  for (i = 0; i < npix; ++i) {
    *dst = lut[*src];
    dst++;
    src++;
  }
}


x86 assembly (clang, -O0):
<scale_img>:
push   %rbp
mov    %rsp,%rbp
sub    $0x1fb0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    %r9d,-0x20(%rbp)
movl   $0x0,-0x2024(%rbp)
cmpl   $0x1000,-0x2024(%rbp)
jge    11f7 <scale_img+0xf7>
mov    -0x2024(%rbp),%eax
imul   -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x2028(%rbp)
cmpl   $0x0,-0x2028(%rbp)
jge    11b1 <scale_img+0xb1>
cmpl   $0x0,-0x1c(%rbp)
je     1174 <scale_img+0x74>
movl   $0x0,-0x2028(%rbp)
jmp    11ac <scale_img+0xac>
cmpl   $0x0,-0x2028(%rbp)
jle    1192 <scale_img+0x92>
mov    -0x2028(%rbp),%eax
mov    %eax,-0x202c(%rbp)
jmp    11a0 <scale_img+0xa0>
xor    %eax,%eax
sub    -0x2028(%rbp),%eax
mov    %eax,-0x202c(%rbp)
mov    -0x202c(%rbp),%eax
mov    %eax,-0x2028(%rbp)
jmp    11b1 <scale_img+0xb1>
cmpl   $0xfff,-0x2028(%rbp)
jle    11cb <scale_img+0xcb>
movl   $0xfff,-0x2028(%rbp)
mov    -0x2028(%rbp),%eax
mov    %ax,%cx
movslq -0x2024(%rbp),%rax
mov    %cx,-0x2020(%rbp,%rax,2)
ff
mov    -0x2024(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2024(%rbp)
jmp    112b <scale_img+0x2b>
movl   $0x0,-0x2024(%rbp)
mov    -0x2024(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1253 <scale_img+0x153>
mov    -0x8(%rbp),%rax
movswq (%rax),%rax
mov    -0x2020(%rbp,%rax,2),%cx
ff
mov    -0x10(%rbp),%rax
mov    %cx,(%rax)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
mov    -0x2024(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2024(%rbp)
jmp    1201 <scale_img+0x101>
add    $0x1fb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<scale_img>:
sub    $0x1f88,%rsp
movd   %edx,%xmm0
pshufd $0x0,%xmm0,%xmm10
movd   %ecx,%xmm0
pshufd $0x0,%xmm0,%xmm11
movdqa 0xedc(%rip),%xmm14
movdqa 0xee4(%rip),%xmm3
xor    %eax,%eax
pshufd $0xf5,%xmm10,%xmm12
movdqa 0xee3(%rip),%xmm13
movdqa 0xeea(%rip),%xmm8
movdqa 0xef1(%rip),%xmm9
jmp    11f0 <scale_img+0xf0>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
pxor   %xmm1,%xmm1
pxor   %xmm4,%xmm4
pxor   %xmm2,%xmm2
pcmpgtd %xmm7,%xmm2
pcmpgtd %xmm0,%xmm6
pand   %xmm6,%xmm4
pandn  %xmm0,%xmm6
por    %xmm4,%xmm6
pand   %xmm2,%xmm1
pandn  %xmm7,%xmm2
por    %xmm1,%xmm2
movdqa %xmm13,%xmm0
pcmpgtd %xmm2,%xmm0
pand   %xmm0,%xmm2
pandn  %xmm13,%xmm0
por    %xmm2,%xmm0
movdqa %xmm13,%xmm1
pcmpgtd %xmm6,%xmm1
pand   %xmm1,%xmm6
pandn  %xmm13,%xmm1
por    %xmm6,%xmm1
pslld  $0x10,%xmm1
psrad  $0x10,%xmm1
pslld  $0x10,%xmm0
psrad  $0x10,%xmm0
packssdw %xmm0,%xmm1
movdqa %xmm1,-0x70(%rsp,%rax,2)
add    $0x10,%rax
paddd  %xmm9,%xmm3
paddd  %xmm9,%xmm14
cmp    $0x1000,%rax
je     1354 <scale_img+0x254>
movdqa %xmm14,%xmm0
pmuludq %xmm10,%xmm0
pshufd $0xe8,%xmm0,%xmm7
pshufd $0xf5,%xmm14,%xmm0
pmuludq %xmm12,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm7
movdqa %xmm3,%xmm0
pmuludq %xmm10,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pshufd $0xf5,%xmm3,%xmm1
pmuludq %xmm12,%xmm1
pshufd $0xe8,%xmm1,%xmm1
punpckldq %xmm1,%xmm0
paddd  %xmm11,%xmm0
paddd  %xmm11,%xmm7
pxor   %xmm6,%xmm6
test   %r8d,%r8d
je     1260 <scale_img+0x160>
pxor   %xmm1,%xmm1
pxor   %xmm4,%xmm4
jmp    1270 <scale_img+0x170>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
pxor   %xmm4,%xmm4
psubd  %xmm0,%xmm4
pxor   %xmm1,%xmm1
psubd  %xmm7,%xmm1
pxor   %xmm5,%xmm5
pcmpgtd %xmm7,%xmm5
pxor   %xmm2,%xmm2
pcmpgtd %xmm0,%xmm2
pand   %xmm2,%xmm4
pandn  %xmm0,%xmm2
por    %xmm4,%xmm2
pand   %xmm5,%xmm1
pandn  %xmm7,%xmm5
por    %xmm1,%xmm5
movdqa %xmm13,%xmm0
pcmpgtd %xmm5,%xmm0
pand   %xmm0,%xmm5
pandn  %xmm13,%xmm0
por    %xmm5,%xmm0
movdqa %xmm13,%xmm1
pcmpgtd %xmm2,%xmm1
pand   %xmm1,%xmm2
pandn  %xmm13,%xmm1
por    %xmm2,%xmm1
pslld  $0x10,%xmm1
psrad  $0x10,%xmm1
pslld  $0x10,%xmm0
psrad  $0x10,%xmm0
packssdw %xmm0,%xmm1
movdqa %xmm1,-0x80(%rsp,%rax,2)
movdqa %xmm3,%xmm0
paddd  %xmm8,%xmm0
movdqa %xmm14,%xmm1
paddd  %xmm8,%xmm1
pshufd $0xf5,%xmm1,%xmm2
pmuludq %xmm10,%xmm1
pshufd $0xe8,%xmm1,%xmm7
pmuludq %xmm12,%xmm2
pshufd $0xe8,%xmm2,%xmm1
punpckldq %xmm1,%xmm7
pshufd $0xf5,%xmm0,%xmm1
pmuludq %xmm10,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pmuludq %xmm12,%xmm1
pshufd $0xe8,%xmm1,%xmm1
punpckldq %xmm1,%xmm0
paddd  %xmm11,%xmm0
paddd  %xmm11,%xmm7
jne    1160 <scale_img+0x60>
pxor   %xmm4,%xmm4
psubd  %xmm0,%xmm4
pxor   %xmm1,%xmm1
psubd  %xmm7,%xmm1
jmp    1168 <scale_img+0x68>
test   %r9d,%r9d
jle    13f7 <scale_img+0x2f7>
lea    -0x1(%r9),%eax
cmp    $0x3,%eax
jb     13d1 <scale_img+0x2d1>
mov    %r9d,%r8d
and    $0xfffffffc,%r8d
xor    %edx,%edx
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movswq (%rdi,%rdx,2),%rax
movzwl -0x80(%rsp,%rax,2),%eax
mov    %ax,(%rsi,%rdx,2)
movswq 0x2(%rdi,%rdx,2),%rax
movzwl -0x80(%rsp,%rax,2),%eax
mov    %ax,0x2(%rsi,%rdx,2)
movswq 0x4(%rdi,%rdx,2),%rax
movzwl -0x80(%rsp,%rax,2),%eax
mov    %ax,0x4(%rsi,%rdx,2)
movswq 0x6(%rdi,%rdx,2),%rax
movzwl -0x80(%rsp,%rax,2),%eax
mov    %ax,0x6(%rsi,%rdx,2)
add    $0xfffffffffffffff8,%rcx
add    $0x4,%rdx
cmp    %edx,%r8d
jne    1380 <scale_img+0x280>
sub    %rcx,%rdi
sub    %rcx,%rsi
test   $0x3,%r9b
je     13f7 <scale_img+0x2f7>
and    $0x3,%r9d
xor    %eax,%eax
nopl   (%rax)
movswq (%rdi,%rax,2),%rcx
movzwl -0x80(%rsp,%rcx,2),%ecx
mov    %cx,(%rsi,%rax,2)
add    $0x1,%rax
cmp    %eax,%r9d
jne    13e0 <scale_img+0x2e0>
add    $0x1f88,%rsp
ret

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

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