void vp8cx_vertical_band_2_1_scale_i_c(unsigned char *source,
                                       unsigned int src_pitch,
                                       unsigned char *dest,
                                       unsigned int dest_pitch,
                                       unsigned int dest_width) {
  int i;
  int temp;
  int width = dest_width;
  (void)dest_pitch;
  for (i = 0; i < width; i++) {
    temp = 8;
    temp += source[i - (int)src_pitch] * 3;
    temp += source[i] * 10;
    temp += source[i + src_pitch] * 3;
    temp >>= 4;
    dest[i] = (unsigned char)(temp);
  }
}


x86 assembly (clang, -O0):
<vp8cx_vertical_band_2_1_scale_i_c>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x2c(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    11a5 <vp8cx_vertical_band_2_1_scale_i_c+0xa5>
movl   $0x8,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    -0xc(%rbp),%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
imul   $0x3,%eax,%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
imul   $0xa,%eax,%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    -0xc(%rbp),%ecx
mov    %ecx,%ecx
movzbl (%rax,%rcx,1),%eax
imul   $0x3,%eax,%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
sar    $0x4,%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %al,%dl
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1123 <vp8cx_vertical_band_2_1_scale_i_c+0x23>
pop    %rbp
ret

x86 assembly (clang, -O2):
<vp8cx_vertical_band_2_1_scale_i_c>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %r8d,%r8d
jle    134d <vp8cx_vertical_band_2_1_scale_i_c+0x24d>
movslq %esi,%r9
mov    %r8d,%r10d
mov    %r9d,%r15d
cmp    $0x8,%r8d
jae    1129 <vp8cx_vertical_band_2_1_scale_i_c+0x29>
xor    %eax,%eax
jmp    1314 <vp8cx_vertical_band_2_1_scale_i_c+0x214>
lea    -0x1(%r10),%rbp
xor    %eax,%eax
add    %ebp,%esi
jb     1314 <vp8cx_vertical_band_2_1_scale_i_c+0x214>
shr    $0x20,%rbp
jne    1314 <vp8cx_vertical_band_2_1_scale_i_c+0x214>
lea    (%rdx,%r10,1),%rax
lea    (%rdi,%r15,1),%r14
lea    (%r15,%r10,1),%rbx
add    %rdi,%rbx
lea    (%rdi,%r10,1),%rsi
mov    %rdi,%r11
sub    %r9,%r11
mov    %r10,%rbp
sub    %r9,%rbp
add    %rdi,%rbp
cmp    %rdx,%rbx
seta   %r12b
cmp    %rax,%r14
setb   %r13b
cmp    %rdx,%rsi
seta   %sil
cmp    %rdi,%rax
seta   %cl
cmp    %rdx,%rbp
seta   %bl
cmp    %rax,%r11
setb   %r14b
xor    %eax,%eax
test   %r13b,%r12b
jne    1314 <vp8cx_vertical_band_2_1_scale_i_c+0x214>
and    %cl,%sil
jne    1314 <vp8cx_vertical_band_2_1_scale_i_c+0x214>
and    %r14b,%bl
jne    1314 <vp8cx_vertical_band_2_1_scale_i_c+0x214>
cmp    $0x10,%r8d
jae    11b5 <vp8cx_vertical_band_2_1_scale_i_c+0xb5>
xor    %eax,%eax
jmp    1291 <vp8cx_vertical_band_2_1_scale_i_c+0x191>
mov    %r10d,%eax
and    $0xfffffff0,%eax
xor    %esi,%esi
pxor   %xmm0,%xmm0
movdqa 0xe36(%rip),%xmm8
movdqa 0xe3d(%rip),%xmm9
movdqa 0xe44(%rip),%xmm10
movdqa 0xe4c(%rip),%xmm4
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqu (%r11,%rsi,1),%xmm7
movdqa %xmm7,%xmm1
punpckhbw %xmm0,%xmm1
punpcklbw %xmm0,%xmm7
movdqu (%rdi,%rsi,1),%xmm5
movdqa %xmm5,%xmm6
punpcklbw %xmm0,%xmm6
punpckhbw %xmm0,%xmm5
pmullw %xmm8,%xmm5
pmullw %xmm8,%xmm6
lea    (%r15,%rsi,1),%ebp
movdqu (%rdi,%rbp,1),%xmm2
movdqa %xmm2,%xmm3
punpckhbw %xmm0,%xmm3
paddw  %xmm1,%xmm3
punpcklbw %xmm0,%xmm2
paddw  %xmm7,%xmm2
pmullw %xmm9,%xmm3
pmullw %xmm9,%xmm2
paddw  %xmm10,%xmm5
paddw  %xmm3,%xmm5
paddw  %xmm10,%xmm6
paddw  %xmm2,%xmm6
psrlw  $0x4,%xmm6
psrlw  $0x4,%xmm5
pand   %xmm4,%xmm5
pand   %xmm4,%xmm6
packuswb %xmm5,%xmm6
movdqu %xmm6,(%rdx,%rsi,1)
add    $0x10,%rsi
cmp    %rsi,%rax
jne    11f0 <vp8cx_vertical_band_2_1_scale_i_c+0xf0>
cmp    %r10,%rax
je     134d <vp8cx_vertical_band_2_1_scale_i_c+0x24d>
test   $0x8,%r10b
je     1314 <vp8cx_vertical_band_2_1_scale_i_c+0x214>
mov    %rax,%rsi
mov    %r10d,%eax
and    $0xfffffff8,%eax
pxor   %xmm0,%xmm0
movdqa 0xd5a(%rip),%xmm1
movdqa 0xd62(%rip),%xmm2
movdqa 0xd6a(%rip),%xmm3
movdqa 0xd72(%rip),%xmm4
xchg   %ax,%ax
movq   (%r11,%rsi,1),%xmm5
punpcklbw %xmm0,%xmm5
movq   (%rdi,%rsi,1),%xmm6
punpcklbw %xmm0,%xmm6
pmullw %xmm1,%xmm6
lea    (%r15,%rsi,1),%ebp
movq   (%rdi,%rbp,1),%xmm7
punpcklbw %xmm0,%xmm7
paddw  %xmm5,%xmm7
pmullw %xmm2,%xmm7
paddw  %xmm6,%xmm7
paddw  %xmm3,%xmm7
psrlw  $0x4,%xmm7
pand   %xmm4,%xmm7
packuswb %xmm7,%xmm7
movq   %xmm7,(%rdx,%rsi,1)
add    $0x8,%rsi
cmp    %rsi,%rax
jne    12c0 <vp8cx_vertical_band_2_1_scale_i_c+0x1c0>
cmp    %r10,%rax
je     134d <vp8cx_vertical_band_2_1_scale_i_c+0x24d>
mov    %rdi,%rsi
sub    %r9,%rsi
nopw   0x0(%rax,%rax,1)
movzbl (%rsi,%rax,1),%ebp
movzbl (%rdi,%rax,1),%ebx
lea    (%rbx,%rbx,4),%ebx
lea    (%r15,%rax,1),%ecx
movzbl (%rdi,%rcx,1),%ecx
add    %ebp,%ecx
lea    (%rcx,%rcx,2),%ecx
lea    (%rcx,%rbx,2),%ecx
add    $0x8,%ecx
shr    $0x4,%ecx
mov    %cl,(%rdx,%rax,1)
add    $0x1,%rax
cmp    %rax,%r10
jne    1320 <vp8cx_vertical_band_2_1_scale_i_c+0x220>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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