void recvc(unsigned char *s, unsigned char *d, int lx, int lx2, int h) {
  unsigned char *dp, *sp, *sp2;
  int j;
  sp = s;
  sp2 = s + lx;
  dp = d;
  for (j = 0; j < h; j++) {
    dp[0] = (unsigned int)(sp[0] + sp2[0] + 1) >> 1;
    dp[1] = (unsigned int)(sp[1] + sp2[1] + 1) >> 1;
    dp[2] = (unsigned int)(sp[2] + sp2[2] + 1) >> 1;
    dp[3] = (unsigned int)(sp[3] + sp2[3] + 1) >> 1;
    dp[4] = (unsigned int)(sp[4] + sp2[4] + 1) >> 1;
    dp[5] = (unsigned int)(sp[5] + sp2[5] + 1) >> 1;
    dp[6] = (unsigned int)(sp[6] + sp2[6] + 1) >> 1;
    dp[7] = (unsigned int)(sp[7] + sp2[7] + 1) >> 1;
    sp += lx2;
    sp2 += lx2;
    dp += lx2;
  }
}


x86 assembly (clang, -O0):
<recvc>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    128e <recvc+0x18e>
mov    -0x30(%rbp),%rax
movzbl (%rax),%eax
mov    -0x38(%rbp),%rcx
movzbl (%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
movzbl 0x1(%rax),%eax
mov    -0x38(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x30(%rbp),%rax
movzbl 0x2(%rax),%eax
mov    -0x38(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x30(%rbp),%rax
movzbl 0x3(%rax),%eax
mov    -0x38(%rbp),%rcx
movzbl 0x3(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x3(%rax)
mov    -0x30(%rbp),%rax
movzbl 0x4(%rax),%eax
mov    -0x38(%rbp),%rcx
movzbl 0x4(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x4(%rax)
mov    -0x30(%rbp),%rax
movzbl 0x5(%rax),%eax
mov    -0x38(%rbp),%rcx
movzbl 0x5(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x5(%rax)
mov    -0x30(%rbp),%rax
movzbl 0x6(%rax),%eax
mov    -0x38(%rbp),%rcx
movzbl 0x6(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x6(%rax)
mov    -0x30(%rbp),%rax
movzbl 0x7(%rax),%eax
mov    -0x38(%rbp),%rcx
movzbl 0x7(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x7(%rax)
mov    -0x18(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%ecx
mov    -0x38(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    113c <recvc+0x3c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<recvc>:
test   %r8d,%r8d
jle    11e2 <recvc+0xe2>
movslq %edx,%rax
add    %rdi,%rax
movslq %ecx,%r9
mov    $0x7,%edx
nopw   0x0(%rax,%rax,1)
movzbl -0x7(%rdi,%rdx,1),%r10d
movzbl -0x7(%rax,%rdx,1),%ecx
add    %r10d,%ecx
add    $0x1,%ecx
shr    %ecx
mov    %cl,-0x7(%rsi,%rdx,1)
movzbl -0x6(%rdi,%rdx,1),%r10d
movzbl -0x6(%rax,%rdx,1),%ecx
add    %r10d,%ecx
add    $0x1,%ecx
shr    %ecx
mov    %cl,-0x6(%rsi,%rdx,1)
movzbl -0x5(%rdi,%rdx,1),%r10d
movzbl -0x5(%rax,%rdx,1),%ecx
add    %r10d,%ecx
add    $0x1,%ecx
shr    %ecx
mov    %cl,-0x5(%rsi,%rdx,1)
movzbl -0x4(%rdi,%rdx,1),%r10d
movzbl -0x4(%rax,%rdx,1),%ecx
add    %r10d,%ecx
add    $0x1,%ecx
shr    %ecx
mov    %cl,-0x4(%rsi,%rdx,1)
movzbl -0x3(%rdi,%rdx,1),%r10d
movzbl -0x3(%rax,%rdx,1),%ecx
add    %r10d,%ecx
add    $0x1,%ecx
shr    %ecx
mov    %cl,-0x3(%rsi,%rdx,1)
movzbl -0x2(%rdi,%rdx,1),%r10d
movzbl -0x2(%rax,%rdx,1),%ecx
add    %r10d,%ecx
add    $0x1,%ecx
shr    %ecx
mov    %cl,-0x2(%rsi,%rdx,1)
movzbl -0x1(%rdi,%rdx,1),%r10d
movzbl -0x1(%rax,%rdx,1),%ecx
add    %r10d,%ecx
add    $0x1,%ecx
shr    %ecx
mov    %cl,-0x1(%rsi,%rdx,1)
movzbl (%rdi,%rdx,1),%r10d
movzbl (%rax,%rdx,1),%ecx
add    %r10d,%ecx
add    $0x1,%ecx
shr    %ecx
mov    %cl,(%rsi,%rdx,1)
add    %r9,%rdx
add    $0xffffffff,%r8d
jne    1120 <recvc+0x20>
ret

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

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