void vp8cx_vertical_band_1_2_scale_c(unsigned char *dest,
                                     unsigned int dest_pitch,
                                     unsigned int dest_width) {
  unsigned int i;
  unsigned int a, b;
  unsigned char *des = dest;
  for (i = 0; i < dest_width; i++) {
    a = des[0];
    b = des[dest_pitch * 2];
    des[dest_pitch] = (unsigned char)((a + b + 1) >> 1);
    des++;
  }
}


x86 assembly (clang, -O0):
<vp8cx_vertical_band_1_2_scale_c>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x10(%rbp),%eax
jae    1178 <vp8cx_vertical_band_1_2_scale_c+0x78>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,-0x18(%rbp)
mov    -0x28(%rbp),%rax
mov    -0xc(%rbp),%ecx
shl    $0x1,%ecx
mov    %ecx,%ecx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
add    -0x1c(%rbp),%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%dl
mov    -0x28(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    111d <vp8cx_vertical_band_1_2_scale_c+0x1d>
pop    %rbp
ret

x86 assembly (clang, -O2):
<vp8cx_vertical_band_1_2_scale_c>:
push   %rbp
push   %r14
push   %rbx
test   %edx,%edx
je     11a1 <vp8cx_vertical_band_1_2_scale_c+0xa1>
lea    (%rsi,%rsi,1),%r10d
mov    %esi,%ecx
lea    -0x1(%rdx),%r9d
xor    %r8d,%r8d
cmp    $0x7,%r9d
jae    11a6 <vp8cx_vertical_band_1_2_scale_c+0xa6>
mov    %rdi,%rsi
mov    %edx,%edi
sub    %r8d,%edi
mov    %r8d,%eax
not    %eax
test   $0x1,%dil
je     1151 <vp8cx_vertical_band_1_2_scale_c+0x51>
movzbl (%rsi),%edi
movzbl (%rsi,%r10,1),%ebp
add    %ebp,%edi
add    $0x1,%edi
shr    %edi
mov    %dil,(%rsi,%rcx,1)
add    $0x1,%rsi
add    $0x1,%r8d
add    %edx,%eax
je     11a1 <vp8cx_vertical_band_1_2_scale_c+0xa1>
lea    (%r10,%rsi,1),%rax
add    $0x1,%rax
add    %rsi,%rcx
add    $0x1,%rcx
sub    %r8d,%edx
xor    %edi,%edi
nopl   0x0(%rax)
movzbl (%rsi,%rdi,1),%ebp
movzbl -0x1(%rax,%rdi,1),%ebx
add    %ebx,%ebp
add    $0x1,%ebp
shr    %ebp
mov    %bpl,-0x1(%rcx,%rdi,1)
movzbl 0x1(%rsi,%rdi,1),%ebp
movzbl (%rax,%rdi,1),%ebx
add    %ebx,%ebp
add    $0x1,%ebp
shr    %ebp
mov    %bpl,(%rcx,%rdi,1)
add    $0x2,%rdi
cmp    %edi,%edx
jne    1170 <vp8cx_vertical_band_1_2_scale_c+0x70>
pop    %rbx
pop    %r14
pop    %rbp
ret
lea    (%rdi,%rcx,1),%rax
lea    (%rcx,%r9,1),%rsi
add    %rdi,%rsi
add    $0x1,%rsi
lea    0x1(%r9,%rdi,1),%r14
lea    (%rdi,%r10,1),%r11
lea    (%r9,%r10,1),%rbx
add    %rdi,%rbx
add    $0x1,%rbx
cmp    %r14,%rax
setb   %bpl
cmp    %rdi,%rsi
seta   %r14b
cmp    %rbx,%rax
setb   %al
cmp    %rsi,%r11
setb   %bl
test   %r14b,%bpl
jne    1123 <vp8cx_vertical_band_1_2_scale_c+0x23>
and    %bl,%al
jne    1123 <vp8cx_vertical_band_1_2_scale_c+0x23>
movabs $0x1ffffffe0,%r8
cmp    $0x1f,%r9d
jae    1208 <vp8cx_vertical_band_1_2_scale_c+0x108>
xor    %eax,%eax
jmp    1262 <vp8cx_vertical_band_1_2_scale_c+0x162>
lea    0x1(%r9),%r11
mov    %r11,%rax
and    %r8,%rax
lea    0x10(%rdi),%rsi
mov    %rax,%rbx
nopl   0x0(%rax)
movdqu -0x10(%rsi),%xmm0
movdqu (%rsi),%xmm1
movdqu -0x10(%rsi,%r10,1),%xmm2
pavgb  %xmm0,%xmm2
movdqu (%rsi,%r10,1),%xmm0
pavgb  %xmm1,%xmm0
movdqu %xmm2,-0x10(%rsi,%rcx,1)
movdqu %xmm0,(%rsi,%rcx,1)
add    $0x20,%rsi
add    $0xffffffffffffffe0,%rbx
jne    1220 <vp8cx_vertical_band_1_2_scale_c+0x120>
cmp    %rax,%r11
je     11a1 <vp8cx_vertical_band_1_2_scale_c+0xa1>
test   $0x18,%r11b
je     12ab <vp8cx_vertical_band_1_2_scale_c+0x1ab>
add    $0x1,%r9
add    $0x18,%r8
and    %r9,%r8
lea    (%rdi,%r8,1),%rsi
add    %rax,%rdi
sub    %r8,%rax
nopw   0x0(%rax,%rax,1)
movq   (%rdi),%xmm0
movq   (%rdi,%r10,1),%xmm1
pavgb  %xmm0,%xmm1
movq   %xmm1,(%rdi,%rcx,1)
add    $0x8,%rdi
add    $0x8,%rax
jne    1280 <vp8cx_vertical_band_1_2_scale_c+0x180>
cmp    %r8,%r9
jne    1126 <vp8cx_vertical_band_1_2_scale_c+0x26>
jmp    11a1 <vp8cx_vertical_band_1_2_scale_c+0xa1>
add    %rax,%rdi
mov    %rdi,%rsi
mov    %eax,%r8d
jmp    1126 <vp8cx_vertical_band_1_2_scale_c+0x26>

LLVM IR (-O0):
define void @vp8cx_vertical_band_1_2_scale_c(i8* %0, i32 %1, i32 %2) {
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i8*
store i8* %0, i8** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%11 = load i8*, i8** %4
store i8* %11, i8** %10
store i32 0, i32* %7
br label %12
12: ; preds = %40, %3
%13 = load i32, i32* %7
%14 = load i32, i32* %6
%15 = icmp ult i32 %13, %14
br i1 %15, label %16, label %43
16: ; preds = %12
%17 = load i8*, i8** %10
%18 = getelementptr inbounds i8, i8* %17, i64 0
%19 = load i8, i8* %18
%20 = zext i8 %19 to i32
store i32 %20, i32* %8
%21 = load i8*, i8** %10
%22 = load i32, i32* %5
%23 = mul i32 %22, 2
%24 = zext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %21, i64 %24
%26 = load i8, i8* %25
%27 = zext i8 %26 to i32
store i32 %27, i32* %9
%28 = load i32, i32* %8
%29 = load i32, i32* %9
%30 = add i32 %28, %29
%31 = add i32 %30, 1
%32 = lshr i32 %31, 1
%33 = trunc i32 %32 to i8
%34 = load i8*, i8** %10
%35 = load i32, i32* %5
%36 = zext i32 %35 to i64
%37 = getelementptr inbounds i8, i8* %34, i64 %36
store i8 %33, i8* %37
%38 = load i8*, i8** %10
%39 = getelementptr inbounds i8, i8* %38, i32 1
store i8* %39, i8** %10
br label %40
40: ; preds = %16
%41 = load i32, i32* %7
%42 = add i32 %41, 1
store i32 %42, i32* %7
br label %12
43: ; preds = %12
ret void
}

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