void mag_img(short int *srcx, short int *srcy, short int *dst, int npix) {
  int i, res;
  for (i = 0; i < npix; ++i) {
    res = *srcx + *srcy;
    if (res > 4096 - 1)
      *dst = 4096 - 1;
    else
      *dst = res;
    dst++;
    srcx++;
    srcy++;
  }
}


x86 assembly (clang, -O0):
<mag_img>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%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
jge    1193 <mag_img+0x93>
mov    -0x8(%rbp),%rax
movswl (%rax),%eax
mov    -0x10(%rbp),%rcx
movswl (%rcx),%ecx
add    %ecx,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0xfff,-0x24(%rbp)
jle    1154 <mag_img+0x54>
mov    -0x18(%rbp),%rax
movw   $0xfff,(%rax)
jmp    1161 <mag_img+0x61>
mov    -0x24(%rbp),%eax
mov    %ax,%cx
mov    -0x18(%rbp),%rax
mov    %cx,(%rax)
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    111a <mag_img+0x1a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<mag_img>:
push   %rbp
push   %rbx
test   %ecx,%ecx
jle    13c9 <mag_img+0x2c9>
lea    -0x1(%rcx),%r9d
xor    %r8d,%r8d
cmp    $0x7,%r9d
jae    11b0 <mag_img+0xb0>
mov    %ecx,%ebp
sub    %r8d,%ebp
mov    %r8d,%eax
not    %eax
test   $0x1,%bpl
je     1154 <mag_img+0x54>
movswl (%rdi),%ebp
movswl (%rsi),%ebx
add    %ebp,%ebx
cmp    $0xfff,%ebx
mov    $0xfff,%ebp
cmovl  %ebx,%ebp
mov    %bp,(%rdx)
add    $0x2,%rdx
add    $0x2,%rdi
add    $0x2,%rsi
add    $0x1,%r8d
add    %ecx,%eax
je     13c9 <mag_img+0x2c9>
sub    %r8d,%ecx
xor    %eax,%eax
mov    $0xfff,%r8d
nopw   0x0(%rax,%rax,1)
movswl (%rdi,%rax,2),%ebp
movswl (%rsi,%rax,2),%ebx
add    %ebp,%ebx
cmp    $0xfff,%ebx
cmovge %r8d,%ebx
mov    %bx,(%rdx,%rax,2)
movswl 0x2(%rdi,%rax,2),%ebp
movswl 0x2(%rsi,%rax,2),%ebx
add    %ebp,%ebx
cmp    $0xfff,%ebx
cmovge %r8d,%ebx
mov    %bx,0x2(%rdx,%rax,2)
add    $0x2,%rax
cmp    %eax,%ecx
jne    1170 <mag_img+0x70>
jmp    13c9 <mag_img+0x2c9>
lea    (%rdi,%r9,2),%rax
add    $0x2,%rax
cmp    %rdx,%rax
seta   %r11b
lea    (%rdx,%r9,2),%rax
add    $0x2,%rax
cmp    %rdi,%rax
seta   %bpl
lea    (%rsi,%r9,2),%rbx
add    $0x2,%rbx
cmp    %rdx,%rbx
seta   %bl
cmp    %rsi,%rax
seta   %r10b
test   %bpl,%r11b
jne    111b <mag_img+0x1b>
and    %r10b,%bl
jne    111b <mag_img+0x1b>
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffff8,%r8
lea    -0x8(%r8),%rax
mov    %rax,%r10
shr    $0x3,%r10
add    $0x1,%r10
test   %rax,%rax
je     13dd <mag_img+0x2dd>
mov    %r10,%r11
and    $0xfffffffffffffffe,%r11
xor    %eax,%eax
movdqa 0xdd7(%rip),%xmm0
nopl   0x0(%rax)
movdqu (%rdi,%rax,2),%xmm1
punpcklwd %xmm1,%xmm2
psrad  $0x10,%xmm2
punpckhwd %xmm1,%xmm1
psrad  $0x10,%xmm1
movdqu (%rsi,%rax,2),%xmm3
punpcklwd %xmm3,%xmm4
psrad  $0x10,%xmm4
paddd  %xmm2,%xmm4
punpckhwd %xmm3,%xmm2
psrad  $0x10,%xmm2
paddd  %xmm1,%xmm2
movdqa %xmm0,%xmm1
pcmpgtd %xmm4,%xmm1
pand   %xmm1,%xmm4
pandn  %xmm0,%xmm1
por    %xmm4,%xmm1
movdqa %xmm0,%xmm3
pcmpgtd %xmm2,%xmm3
pand   %xmm3,%xmm2
pandn  %xmm0,%xmm3
por    %xmm2,%xmm3
pslld  $0x10,%xmm3
psrad  $0x10,%xmm3
pslld  $0x10,%xmm1
psrad  $0x10,%xmm1
packssdw %xmm3,%xmm1
movdqu %xmm1,(%rdx,%rax,2)
movdqu 0x10(%rdi,%rax,2),%xmm1
punpcklwd %xmm1,%xmm2
psrad  $0x10,%xmm2
punpckhwd %xmm1,%xmm1
psrad  $0x10,%xmm1
movdqu 0x10(%rsi,%rax,2),%xmm3
punpcklwd %xmm3,%xmm4
psrad  $0x10,%xmm4
paddd  %xmm2,%xmm4
punpckhwd %xmm3,%xmm2
psrad  $0x10,%xmm2
paddd  %xmm1,%xmm2
movdqa %xmm0,%xmm1
pcmpgtd %xmm4,%xmm1
pand   %xmm1,%xmm4
pandn  %xmm0,%xmm1
por    %xmm4,%xmm1
movdqa %xmm0,%xmm3
pcmpgtd %xmm2,%xmm3
pand   %xmm3,%xmm2
pandn  %xmm0,%xmm3
por    %xmm2,%xmm3
pslld  $0x10,%xmm3
psrad  $0x10,%xmm3
pslld  $0x10,%xmm1
psrad  $0x10,%xmm1
packssdw %xmm3,%xmm1
movdqu %xmm1,0x10(%rdx,%rax,2)
add    $0x10,%rax
add    $0xfffffffffffffffe,%r11
jne    1230 <mag_img+0x130>
test   $0x1,%r10b
je     13c4 <mag_img+0x2c4>
movdqu (%rdi,%rax,2),%xmm0
punpcklwd %xmm0,%xmm1
psrad  $0x10,%xmm1
punpckhwd %xmm0,%xmm0
psrad  $0x10,%xmm0
movdqu (%rsi,%rax,2),%xmm2
punpcklwd %xmm2,%xmm3
psrad  $0x10,%xmm3
paddd  %xmm1,%xmm3
punpckhwd %xmm2,%xmm1
psrad  $0x10,%xmm1
paddd  %xmm0,%xmm1
movdqa 0xc81(%rip),%xmm0
movdqa %xmm0,%xmm2
pcmpgtd %xmm3,%xmm2
pand   %xmm2,%xmm3
pandn  %xmm0,%xmm2
por    %xmm3,%xmm2
movdqa %xmm0,%xmm3
pcmpgtd %xmm1,%xmm3
pand   %xmm3,%xmm1
pandn  %xmm0,%xmm3
por    %xmm1,%xmm3
pslld  $0x10,%xmm3
psrad  $0x10,%xmm3
pslld  $0x10,%xmm2
psrad  $0x10,%xmm2
packssdw %xmm3,%xmm2
movdqu %xmm2,(%rdx,%rax,2)
cmp    %r8,%r9
jne    13cc <mag_img+0x2cc>
pop    %rbx
pop    %rbp
ret
lea    (%rdi,%r8,2),%rdi
lea    (%rsi,%r8,2),%rsi
lea    (%rdx,%r8,2),%rdx
jmp    111b <mag_img+0x1b>
xor    %eax,%eax
test   $0x1,%r10b
jne    1341 <mag_img+0x241>
jmp    13c4 <mag_img+0x2c4>

LLVM IR (-O0):
define void @mag_img(i16* %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 = %38, %4
%12 = load i32, i32* %9
%13 = load i32, i32* %8
%14 = icmp slt i32 %12, %13
br i1 %14, label %15, label %41
15: ; preds = %11
%16 = load i16*, i16** %5
%17 = load i16, i16* %16
%18 = sext i16 %17 to i32
%19 = load i16*, i16** %6
%20 = load i16, i16* %19
%21 = sext i16 %20 to i32
%22 = add nsw i32 %18, %21
store i32 %22, i32* %10
%23 = load i32, i32* %10
%24 = icmp sgt i32 %23, 4095
br i1 %24, label %25, label %27
25: ; preds = %15
%26 = load i16*, i16** %7
store i16 4095, i16* %26
br label %31
27: ; preds = %15
%28 = load i32, i32* %10
%29 = trunc i32 %28 to i16
%30 = load i16*, i16** %7
store i16 %29, i16* %30
br label %31
31: ; preds = %27, %25
%32 = load i16*, i16** %7
%33 = getelementptr inbounds i16, i16* %32, i32 1
store i16* %33, i16** %7
%34 = load i16*, i16** %5
%35 = getelementptr inbounds i16, i16* %34, i32 1
store i16* %35, i16** %5
%36 = load i16*, i16** %6
%37 = getelementptr inbounds i16, i16* %36, i32 1
store i16* %37, i16** %6
br label %38
38: ; preds = %31
%39 = load i32, i32* %9
%40 = add nsw i32 %39, 1
store i32 %40, i32* %9
br label %11
41: ; preds = %11
ret void
}

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