copy_data_header_to_buffer(int block_number, char *data_buffer, int data_size,
                           char *buffer) {
  int i = 0;
  buffer[0] = '\0';
  buffer[1] = '\3';
  buffer[2] = (char)(block_number / 256);
  buffer[3] = (char)(block_number % 256);
  for (i = 0; i < data_size; i++) {
    buffer[4 + i] = data_buffer[i];
  }
}


x86 assembly (clang, -O0):
<copy_data_header_to_buffer>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x20(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x20(%rbp),%rax
movb   $0x3,0x1(%rax)
mov    -0x8(%rbp),%eax
mov    $0x100,%ecx
cltd
idiv   %ecx
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x8(%rbp),%eax
mov    $0x100,%ecx
cltd
idiv   %ecx
mov    %dl,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x3(%rax)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    118c <copy_data_header_to_buffer+0x8c>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1157 <copy_data_header_to_buffer+0x57>
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<copy_data_header_to_buffer>:
lea    0xff(%rdi),%eax
test   %edi,%edi
cmovns %edi,%eax
movw   $0x300,(%rcx)
mov    %ah,0x2(%rcx)
mov    %dil,0x3(%rcx)
test   %edx,%edx
jle    11ac <copy_data_header_to_buffer+0xac>
mov    %edx,%r8d
cmp    $0x8,%edx
jb     1141 <copy_data_header_to_buffer+0x41>
lea    0x4(%rcx),%rax
lea    (%rsi,%r8,1),%rdi
cmp    %rdi,%rax
jae    11ad <copy_data_header_to_buffer+0xad>
lea    (%r8,%rcx,1),%rax
add    $0x4,%rax
cmp    %rsi,%rax
jbe    11ad <copy_data_header_to_buffer+0xad>
xor    %edx,%edx
mov    %rdx,%r9
not    %r9
add    %r8,%r9
mov    %r8,%rdi
and    $0x3,%rdi
je     1172 <copy_data_header_to_buffer+0x72>
cs nopw 0x0(%rax,%rax,1)
nop
movzbl (%rsi,%rdx,1),%eax
mov    %al,0x4(%rcx,%rdx,1)
add    $0x1,%rdx
add    $0xffffffffffffffff,%rdi
jne    1160 <copy_data_header_to_buffer+0x60>
cmp    $0x3,%r9
jb     11ac <copy_data_header_to_buffer+0xac>
nopl   0x0(%rax,%rax,1)
movzbl (%rsi,%rdx,1),%eax
mov    %al,0x4(%rcx,%rdx,1)
movzbl 0x1(%rsi,%rdx,1),%eax
mov    %al,0x5(%rcx,%rdx,1)
movzbl 0x2(%rsi,%rdx,1),%eax
mov    %al,0x6(%rcx,%rdx,1)
movzbl 0x3(%rsi,%rdx,1),%eax
mov    %al,0x7(%rcx,%rdx,1)
add    $0x4,%rdx
cmp    %rdx,%r8
jne    1180 <copy_data_header_to_buffer+0x80>
ret
cmp    $0x20,%edx
jae    11b9 <copy_data_header_to_buffer+0xb9>
xor    %edx,%edx
jmp    1286 <copy_data_header_to_buffer+0x186>
mov    %r8d,%edx
and    $0xffffffe0,%edx
lea    -0x20(%rdx),%rax
mov    %rax,%rdi
shr    $0x5,%rdi
add    $0x1,%rdi
mov    %edi,%r9d
and    $0x3,%r9d
cmp    $0x60,%rax
jae    11df <copy_data_header_to_buffer+0xdf>
xor    %eax,%eax
jmp    1249 <copy_data_header_to_buffer+0x149>
and    $0xfffffffffffffffc,%rdi
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nop
movups (%rsi,%rax,1),%xmm0
movups 0x10(%rsi,%rax,1),%xmm1
movups %xmm0,0x4(%rcx,%rax,1)
movups %xmm1,0x14(%rcx,%rax,1)
movups 0x20(%rsi,%rax,1),%xmm0
movups 0x30(%rsi,%rax,1),%xmm1
movups %xmm0,0x24(%rcx,%rax,1)
movups %xmm1,0x34(%rcx,%rax,1)
movups 0x40(%rsi,%rax,1),%xmm0
movups 0x50(%rsi,%rax,1),%xmm1
movups %xmm0,0x44(%rcx,%rax,1)
movups %xmm1,0x54(%rcx,%rax,1)
movups 0x60(%rsi,%rax,1),%xmm0
movups 0x70(%rsi,%rax,1),%xmm1
movups %xmm0,0x64(%rcx,%rax,1)
movups %xmm1,0x74(%rcx,%rax,1)
sub    $0xffffffffffffff80,%rax
add    $0xfffffffffffffffc,%rdi
jne    11f0 <copy_data_header_to_buffer+0xf0>
test   %r9,%r9
je     1273 <copy_data_header_to_buffer+0x173>
xchg   %ax,%ax
movups (%rsi,%rax,1),%xmm0
movups 0x10(%rsi,%rax,1),%xmm1
mov    %rax,%rdi
or     $0x4,%rdi
movups %xmm0,(%rcx,%rdi,1)
movups %xmm1,0x10(%rcx,%rdi,1)
add    $0x20,%rax
add    $0xffffffffffffffff,%r9
jne    1250 <copy_data_header_to_buffer+0x150>
cmp    %r8,%rdx
je     11ac <copy_data_header_to_buffer+0xac>
test   $0x18,%r8b
je     1143 <copy_data_header_to_buffer+0x43>
mov    %rdx,%rax
mov    %r8d,%edx
and    $0xfffffff8,%edx
nop
mov    (%rsi,%rax,1),%rdi
mov    %rdi,0x4(%rcx,%rax,1)
add    $0x8,%rax
cmp    %rax,%rdx
jne    1290 <copy_data_header_to_buffer+0x190>
cmp    %r8,%rdx
je     11ac <copy_data_header_to_buffer+0xac>
jmp    1143 <copy_data_header_to_buffer+0x43>

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

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