unsigned char cDigitAddlenwithleninto(unsigned char *pByteShort, int shortLen,
                                      unsigned char *pByteLong, int longLen,
                                      unsigned char *pByteRes) {
  int limit;
  int i;
  int accum;
  accum = 0;
  limit = shortLen - 1;
  for (i = 0; i <= limit; i += 1) {
    accum = ((((unsigned)accum >> 8)) + (pByteShort[i])) + (pByteLong[i]);
    pByteRes[i] = (accum & 255);
  }
  limit = longLen - 1;
  for (i = shortLen; i <= limit; i += 1) {
    accum = (((unsigned)accum >> 8)) + (pByteLong[i]);
    pByteRes[i] = (accum & 255);
  }
  return ((unsigned)accum >> 8);
}


x86 assembly (clang, -O0):
<cDigitAddlenwithleninto>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8,-0x28(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jg     1181 <cDigitAddlenwithleninto+0x81>
mov    -0x34(%rbp),%eax
shr    $0x8,%eax
mov    -0x8(%rbp),%rcx
movslq -0x30(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    -0x18(%rbp),%rcx
movslq -0x30(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
and    $0xff,%eax
mov    %al,%dl
mov    -0x28(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    112d <cDigitAddlenwithleninto+0x2d>
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jg     11d6 <cDigitAddlenwithleninto+0xd6>
mov    -0x34(%rbp),%eax
shr    $0x8,%eax
mov    -0x18(%rbp),%rcx
movslq -0x30(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
and    $0xff,%eax
mov    %al,%dl
mov    -0x28(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1190 <cDigitAddlenwithleninto+0x90>
mov    -0x34(%rbp),%eax
shr    $0x8,%eax
movzbl %al,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<cDigitAddlenwithleninto>:
push   %rbx
test   %esi,%esi
jle    111b <cDigitAddlenwithleninto+0x1b>
mov    %esi,%r10d
cmp    $0x1,%esi
jne    111f <cDigitAddlenwithleninto+0x1f>
xor    %r9d,%r9d
xor    %r11d,%r11d
test   $0x1,%r10b
jne    1173 <cDigitAddlenwithleninto+0x73>
jmp    1187 <cDigitAddlenwithleninto+0x87>
xor    %eax,%eax
jmp    1187 <cDigitAddlenwithleninto+0x87>
mov    %r10d,%r11d
and    $0xfffffffe,%r11d
xor    %r9d,%r9d
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
shr    $0x8,%eax
movzbl (%rdi,%r9,1),%ebx
add    %eax,%ebx
movzbl (%rdx,%r9,1),%eax
add    %ebx,%eax
mov    %al,(%r8,%r9,1)
shr    $0x8,%eax
movzbl 0x1(%rdi,%r9,1),%ebx
add    %eax,%ebx
movzbl 0x1(%rdx,%r9,1),%eax
add    %ebx,%eax
mov    %al,0x1(%r8,%r9,1)
add    $0x2,%r9
cmp    %r9,%r11
jne    1130 <cDigitAddlenwithleninto+0x30>
mov    %eax,%r11d
shr    $0x8,%r11d
test   $0x1,%r10b
je     1187 <cDigitAddlenwithleninto+0x87>
movzbl (%rdi,%r9,1),%eax
add    %eax,%r11d
movzbl (%rdx,%r9,1),%eax
add    %r11d,%eax
mov    %al,(%r8,%r9,1)
cmp    %ecx,%esi
jge    1213 <cDigitAddlenwithleninto+0x113>
movslq %esi,%rdi
movslq %ecx,%r9
sub    %esi,%ecx
mov    %rdi,%r10
not    %r10
add    %r9,%r10
and    $0x3,%rcx
je     11c7 <cDigitAddlenwithleninto+0xc7>
cs nopw 0x0(%rax,%rax,1)
shr    $0x8,%eax
movzbl (%rdx,%rdi,1),%esi
add    %esi,%eax
mov    %al,(%r8,%rdi,1)
add    $0x1,%rdi
add    $0xffffffffffffffff,%rcx
jne    11b0 <cDigitAddlenwithleninto+0xb0>
cmp    $0x3,%r10
jb     1213 <cDigitAddlenwithleninto+0x113>
nopl   (%rax)
shr    $0x8,%eax
movzbl (%rdx,%rdi,1),%ecx
add    %eax,%ecx
mov    %cl,(%r8,%rdi,1)
shr    $0x8,%ecx
movzbl 0x1(%rdx,%rdi,1),%eax
add    %ecx,%eax
mov    %al,0x1(%r8,%rdi,1)
shr    $0x8,%eax
movzbl 0x2(%rdx,%rdi,1),%ecx
add    %eax,%ecx
mov    %cl,0x2(%r8,%rdi,1)
shr    $0x8,%ecx
movzbl 0x3(%rdx,%rdi,1),%eax
add    %ecx,%eax
mov    %al,0x3(%r8,%rdi,1)
add    $0x4,%rdi
cmp    %rdi,%r9
jne    11d0 <cDigitAddlenwithleninto+0xd0>
shr    $0x8,%eax
pop    %rbx
ret

LLVM IR (-O0):
define zeroext i8 @cDigitAddlenwithleninto(i8* %0, i32 %1, i8* %2, i32 %3, i8* %4) {
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i8*
%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 i8* %4, i8** %10
store i32 0, i32* %13
%14 = load i32, i32* %7
%15 = sub nsw i32 %14, 1
store i32 %15, i32* %11
store i32 0, i32* %12
br label %16
16: ; preds = %44, %5
%17 = load i32, i32* %12
%18 = load i32, i32* %11
%19 = icmp sle i32 %17, %18
br i1 %19, label %20, label %47
20: ; preds = %16
%21 = load i32, i32* %13
%22 = lshr i32 %21, 8
%23 = load i8*, i8** %6
%24 = load i32, i32* %12
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i8, i8* %23, i64 %25
%27 = load i8, i8* %26
%28 = zext i8 %27 to i32
%29 = add i32 %22, %28
%30 = load i8*, i8** %8
%31 = load i32, i32* %12
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds i8, i8* %30, i64 %32
%34 = load i8, i8* %33
%35 = zext i8 %34 to i32
%36 = add i32 %29, %35
store i32 %36, i32* %13
%37 = load i32, i32* %13
%38 = and i32 %37, 255
%39 = trunc i32 %38 to i8
%40 = load i8*, i8** %10
%41 = load i32, i32* %12
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i8, i8* %40, i64 %42
store i8 %39, i8* %43
br label %44
44: ; preds = %20
%45 = load i32, i32* %12
%46 = add nsw i32 %45, 1
store i32 %46, i32* %12
br label %16
47: ; preds = %16
%48 = load i32, i32* %9
%49 = sub nsw i32 %48, 1
store i32 %49, i32* %11
%50 = load i32, i32* %7
store i32 %50, i32* %12
br label %51
51: ; preds = %72, %47
%52 = load i32, i32* %12
%53 = load i32, i32* %11
%54 = icmp sle i32 %52, %53
br i1 %54, label %55, label %75
55: ; preds = %51
%56 = load i32, i32* %13
%57 = lshr i32 %56, 8
%58 = load i8*, i8** %8
%59 = load i32, i32* %12
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds i8, i8* %58, i64 %60
%62 = load i8, i8* %61
%63 = zext i8 %62 to i32
%64 = add i32 %57, %63
store i32 %64, i32* %13
%65 = load i32, i32* %13
%66 = and i32 %65, 255
%67 = trunc i32 %66 to i8
%68 = load i8*, i8** %10
%69 = load i32, i32* %12
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds i8, i8* %68, i64 %70
store i8 %67, i8* %71
br label %72
72: ; preds = %55
%73 = load i32, i32* %12
%74 = add nsw i32 %73, 1
store i32 %74, i32* %12
br label %51
75: ; preds = %51
%76 = load i32, i32* %13
%77 = lshr i32 %76, 8
%78 = trunc i32 %77 to i8
ret i8 %78
}

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