void blur(unsigned char im[70 * 200]) {
  unsigned char *i = im;
  int x, y;
  for (y = 0; y < 68; y++) {
    for (x = 0; x < 198; x++) {
      unsigned int c11 = *i, c12 = i[1], c21 = i[200], c22 = i[201];
      *i++ = ((c11 + c12 + c21 + c22) / 4);
    }
  }
}


x86 assembly (clang, -O0):
<blur>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x10(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x44,-0x18(%rbp)
jge    11a9 <blur+0xa9>
movl   $0x0,-0x14(%rbp)
cmpl   $0xc6,-0x14(%rbp)
jge    1196 <blur+0x96>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movzbl 0xc8(%rax),%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movzbl 0xc9(%rax),%eax
mov    %eax,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
add    -0x24(%rbp),%eax
add    -0x28(%rbp),%eax
shr    $0x2,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1128 <blur+0x28>
jmp    119b <blur+0x9b>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1117 <blur+0x17>
pop    %rbp
ret

x86 assembly (clang, -O2):
<blur>:
mov    (%rdi),%al
xor    %r8d,%r8d
pxor   %xmm9,%xmm9
movdqa 0xeed(%rip),%xmm8
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl %al,%ecx
movd   %ecx,%xmm1
pslldq $0xf,%xmm1
mov    $0xc9,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movdqa %xmm1,%xmm4
movdqu -0xc8(%rdi,%rcx,1),%xmm1
ff ff
movdqu -0x1(%rdi,%rcx,1),%xmm0
movdqu (%rdi,%rcx,1),%xmm3
movdqa %xmm1,%xmm6
pslldq $0x1,%xmm6
psrldq $0xf,%xmm4
por    %xmm6,%xmm4
punpcklbw %xmm9,%xmm4
punpckhbw %xmm9,%xmm6
movdqa %xmm1,%xmm7
punpcklbw %xmm9,%xmm7
movdqa %xmm1,%xmm2
punpckhbw %xmm9,%xmm2
movdqa %xmm0,%xmm5
punpckhbw %xmm9,%xmm5
paddw  %xmm2,%xmm5
paddw  %xmm6,%xmm5
punpcklbw %xmm9,%xmm0
paddw  %xmm7,%xmm0
movdqa %xmm3,%xmm2
punpcklbw %xmm9,%xmm2
paddw  %xmm0,%xmm2
paddw  %xmm4,%xmm2
punpckhbw %xmm9,%xmm3
paddw  %xmm5,%xmm3
psrlw  $0x2,%xmm2
psrlw  $0x2,%xmm3
pand   %xmm8,%xmm3
pand   %xmm8,%xmm2
packuswb %xmm3,%xmm2
movdqu %xmm2,-0xc9(%rdi,%rcx,1)
ff ff
add    $0x10,%rcx
cmp    $0x189,%rcx
jne    1140 <blur+0x40>
pextrw $0x7,%xmm1,%ecx
shr    $0x8,%ecx
movzbl 0xc1(%rdi),%edx
movzbl 0x188(%rdi),%esi
add    %edx,%ecx
add    %esi,%ecx
movzbl 0x189(%rdi),%esi
add    %esi,%ecx
shr    $0x2,%ecx
mov    %cl,0xc0(%rdi)
movzbl 0xc2(%rdi),%ecx
add    %ecx,%edx
add    %esi,%edx
movzbl 0x18a(%rdi),%esi
add    %esi,%edx
shr    $0x2,%edx
mov    %dl,0xc1(%rdi)
movzbl 0xc3(%rdi),%edx
add    %edx,%ecx
add    %esi,%ecx
movzbl 0x18b(%rdi),%esi
add    %esi,%ecx
shr    $0x2,%ecx
mov    %cl,0xc2(%rdi)
movzbl 0xc4(%rdi),%ecx
movzbl 0x18c(%rdi),%eax
add    %ecx,%edx
add    %esi,%edx
add    %eax,%edx
shr    $0x2,%edx
mov    %dl,0xc3(%rdi)
movzbl 0xc5(%rdi),%edx
movzbl 0x18d(%rdi),%esi
add    %edx,%ecx
add    %eax,%ecx
add    %esi,%ecx
shr    $0x2,%ecx
mov    %cl,0xc4(%rdi)
movzbl 0xc6(%rdi),%eax
movzbl 0x18e(%rdi),%r9d
mov    %eax,%ecx
add    %edx,%ecx
add    %esi,%ecx
add    %r9d,%ecx
shr    $0x2,%ecx
mov    %cl,0xc5(%rdi)
add    $0xc6,%rdi
add    $0x1,%r8d
cmp    $0x44,%r8d
jne    1120 <blur+0x20>
ret

LLVM IR (-O0):
define void @blur(i8* %0) {
%2 = alloca i8*
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i8* %0, i8** %2
%10 = load i8*, i8** %2
store i8* %10, i8** %3
store i32 0, i32* %5
br label %11
11: ; preds = %49, %1
%12 = load i32, i32* %5
%13 = icmp slt i32 %12, 68
br i1 %13, label %14, label %52
14: ; preds = %11
store i32 0, i32* %4
br label %15
15: ; preds = %45, %14
%16 = load i32, i32* %4
%17 = icmp slt i32 %16, 198
br i1 %17, label %18, label %48
18: ; preds = %15
%19 = load i8*, i8** %3
%20 = load i8, i8* %19
%21 = zext i8 %20 to i32
store i32 %21, i32* %6
%22 = load i8*, i8** %3
%23 = getelementptr inbounds i8, i8* %22, i64 1
%24 = load i8, i8* %23
%25 = zext i8 %24 to i32
store i32 %25, i32* %7
%26 = load i8*, i8** %3
%27 = getelementptr inbounds i8, i8* %26, i64 200
%28 = load i8, i8* %27
%29 = zext i8 %28 to i32
store i32 %29, i32* %8
%30 = load i8*, i8** %3
%31 = getelementptr inbounds i8, i8* %30, i64 201
%32 = load i8, i8* %31
%33 = zext i8 %32 to i32
store i32 %33, i32* %9
%34 = load i32, i32* %6
%35 = load i32, i32* %7
%36 = add i32 %34, %35
%37 = load i32, i32* %8
%38 = add i32 %36, %37
%39 = load i32, i32* %9
%40 = add i32 %38, %39
%41 = udiv i32 %40, 4
%42 = trunc i32 %41 to i8
%43 = load i8*, i8** %3
%44 = getelementptr inbounds i8, i8* %43, i32 1
store i8* %44, i8** %3
store i8 %42, i8* %43
br label %45
45: ; preds = %18
%46 = load i32, i32* %4
%47 = add nsw i32 %46, 1
store i32 %47, i32* %4
br label %15
48: ; preds = %15
br label %49
49: ; preds = %48
%50 = load i32, i32* %5
%51 = add nsw i32 %50, 1
store i32 %51, i32* %5
br label %11
52: ; preds = %11
ret void
}

LLVM IR (-O2):
define void @blur(i8* nocapture %0) {
%2 = load i8, i8* %0
br label %3
3: ; preds = %35, %1
%4 = phi i8 [ %2, %1 ], [ %114, %35 ]
%5 = phi i8* [ %0, %1 ], [ %113, %35 ]
%6 = phi i32 [ 0, %1 ], [ %127, %35 ]
%7 = getelementptr i8, i8* %5, i64 192
%8 = insertelement <16 x i8> poison, i8 %4, i64 15
br label %9
9: ; preds = %9, %3
%10 = phi i64 [ 0, %3 ], [ %33, %9 ]
%11 = phi <16 x i8> [ %8, %3 ], [ %15, %9 ]
%12 = getelementptr i8, i8* %5, i64 %10
%13 = getelementptr inbounds i8, i8* %12, i64 1
%14 = bitcast i8* %13 to <16 x i8>*
%15 = load <16 x i8>, <16 x i8>* %14
%16 = shufflevector <16 x i8> %11, <16 x i8> %15, <16 x i32> <i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30>
%17 = zext <16 x i8> %16 to <16 x i16>
%18 = zext <16 x i8> %15 to <16 x i16>
%19 = getelementptr inbounds i8, i8* %12, i64 200
%20 = bitcast i8* %19 to <16 x i8>*
%21 = load <16 x i8>, <16 x i8>* %20
%22 = zext <16 x i8> %21 to <16 x i16>
%23 = getelementptr inbounds i8, i8* %12, i64 201
%24 = bitcast i8* %23 to <16 x i8>*
%25 = load <16 x i8>, <16 x i8>* %24
%26 = zext <16 x i8> %25 to <16 x i16>
%27 = add nuw nsw <16 x i16> %18, %17
%28 = add nuw nsw <16 x i16> %27, %22
%29 = add nuw nsw <16 x i16> %28, %26
%30 = lshr <16 x i16> %29, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
%31 = trunc <16 x i16> %30 to <16 x i8>
%32 = bitcast i8* %12 to <16 x i8>*
store <16 x i8> %31, <16 x i8>* %32
%33 = add nuw i64 %10, 16
%34 = icmp eq i64 %33, 192
br i1 %34, label %35, label %9
35: ; preds = %9
%36 = extractelement <16 x i8> %15, i64 15
%37 = zext i8 %36 to i16
%38 = getelementptr i8, i8* %5, i64 193
%39 = load i8, i8* %38
%40 = zext i8 %39 to i16
%41 = getelementptr i8, i8* %5, i64 392
%42 = load i8, i8* %41
%43 = zext i8 %42 to i16
%44 = getelementptr i8, i8* %5, i64 393
%45 = load i8, i8* %44
%46 = zext i8 %45 to i16
%47 = add nuw nsw i16 %40, %37
%48 = add nuw nsw i16 %47, %43
%49 = add nuw nsw i16 %48, %46
%50 = lshr i16 %49, 2
%51 = trunc i16 %50 to i8
store i8 %51, i8* %7
%52 = zext i8 %39 to i16
%53 = getelementptr i8, i8* %5, i64 194
%54 = load i8, i8* %53
%55 = zext i8 %54 to i16
%56 = getelementptr i8, i8* %5, i64 393
%57 = load i8, i8* %56
%58 = zext i8 %57 to i16
%59 = getelementptr i8, i8* %5, i64 394
%60 = load i8, i8* %59
%61 = zext i8 %60 to i16
%62 = add nuw nsw i16 %55, %52
%63 = add nuw nsw i16 %62, %58
%64 = add nuw nsw i16 %63, %61
%65 = lshr i16 %64, 2
%66 = trunc i16 %65 to i8
store i8 %66, i8* %38
%67 = zext i8 %54 to i16
%68 = getelementptr i8, i8* %5, i64 195
%69 = load i8, i8* %68
%70 = zext i8 %69 to i16
%71 = getelementptr i8, i8* %5, i64 394
%72 = load i8, i8* %71
%73 = zext i8 %72 to i16
%74 = getelementptr i8, i8* %5, i64 395
%75 = load i8, i8* %74
%76 = zext i8 %75 to i16
%77 = add nuw nsw i16 %70, %67
%78 = add nuw nsw i16 %77, %73
%79 = add nuw nsw i16 %78, %76
%80 = lshr i16 %79, 2
%81 = trunc i16 %80 to i8
store i8 %81, i8* %53
%82 = zext i8 %69 to i16
%83 = getelementptr i8, i8* %5, i64 196
%84 = load i8, i8* %83
%85 = zext i8 %84 to i16
%86 = getelementptr i8, i8* %5, i64 395
%87 = load i8, i8* %86
%88 = zext i8 %87 to i16
%89 = getelementptr i8, i8* %5, i64 396
%90 = load i8, i8* %89
%91 = zext i8 %90 to i16
%92 = add nuw nsw i16 %85, %82
%93 = add nuw nsw i16 %92, %88
%94 = add nuw nsw i16 %93, %91
%95 = lshr i16 %94, 2
%96 = trunc i16 %95 to i8
store i8 %96, i8* %68
%97 = zext i8 %84 to i16
%98 = getelementptr i8, i8* %5, i64 197
%99 = load i8, i8* %98
%100 = zext i8 %99 to i16
%101 = getelementptr i8, i8* %5, i64 396
%102 = load i8, i8* %101
%103 = zext i8 %102 to i16
%104 = getelementptr i8, i8* %5, i64 397
%105 = load i8, i8* %104
%106 = zext i8 %105 to i16
%107 = add nuw nsw i16 %100, %97
%108 = add nuw nsw i16 %107, %103
%109 = add nuw nsw i16 %108, %106
%110 = lshr i16 %109, 2
%111 = trunc i16 %110 to i8
store i8 %111, i8* %83
%112 = zext i8 %99 to i16
%113 = getelementptr i8, i8* %5, i64 198
%114 = load i8, i8* %113
%115 = zext i8 %114 to i16
%116 = getelementptr i8, i8* %5, i64 397
%117 = load i8, i8* %116
%118 = zext i8 %117 to i16
%119 = getelementptr i8, i8* %5, i64 398
%120 = load i8, i8* %119
%121 = zext i8 %120 to i16
%122 = add nuw nsw i16 %115, %112
%123 = add nuw nsw i16 %122, %118
%124 = add nuw nsw i16 %123, %121
%125 = lshr i16 %124, 2
%126 = trunc i16 %125 to i8
store i8 %126, i8* %98
%127 = add nuw nsw i32 %6, 1
%128 = icmp eq i32 %127, 68
br i1 %128, label %129, label %3
129: ; preds = %35
ret void
}