int var_int_write(unsigned char *p, unsigned int i) {
  if (i < (1 << 7)) {
    *p = 0x80 | i;
    return 1;
  } else if (i < (1 << 14)) {
    *(p++) = 0x40 | (i >> 8);
    *p = i & 0xFF;
    return 2;
  } else if (i < (1 << 21)) {
    *(p++) = 0x20 | (i >> 16);
    *(p++) = 0xFF & (i >> 8);
    *p = i & 0xFF;
    return 3;
  } else if (i < (1 << 28)) {
    *(p++) = 0x10 | (i >> 24);
    *(p++) = 0xFF & (i >> 16);
    *(p++) = 0xFF & (i >> 8);
    *p = i & 0xFF;
    return 4;
  } else {
    *(p++) = 0x08;
    *(p++) = 0xFF & (i >> 24);
    *(p++) = 0xFF & (i >> 16);
    *(p++) = 0xFF & (i >> 8);
    *p = i & 0xFF;
    return 5;
  }
}


x86 assembly (clang, -O0):
<var_int_write>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
cmpl   $0x80,-0x14(%rbp)
jae    1134 <var_int_write+0x34>
mov    -0x14(%rbp),%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    12e0 <var_int_write+0x1e0>
cmpl   $0x4000,-0x14(%rbp)
jae    1179 <var_int_write+0x79>
mov    -0x14(%rbp),%eax
shr    $0x8,%eax
or     $0x40,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x14(%rbp),%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
movl   $0x2,-0x4(%rbp)
jmp    12e0 <var_int_write+0x1e0>
cmpl   $0x200000,-0x14(%rbp)
jae    11dc <var_int_write+0xdc>
mov    -0x14(%rbp),%eax
shr    $0x10,%eax
or     $0x20,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x14(%rbp),%eax
shr    $0x8,%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x14(%rbp),%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
movl   $0x3,-0x4(%rbp)
jmp    12e0 <var_int_write+0x1e0>
cmpl   $0x10000000,-0x14(%rbp)
jae    125d <var_int_write+0x15d>
mov    -0x14(%rbp),%eax
shr    $0x18,%eax
or     $0x10,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x14(%rbp),%eax
shr    $0x10,%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x14(%rbp),%eax
shr    $0x8,%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x14(%rbp),%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
movl   $0x4,-0x4(%rbp)
jmp    12e0 <var_int_write+0x1e0>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x8,(%rax)
mov    -0x14(%rbp),%eax
shr    $0x18,%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x14(%rbp),%eax
shr    $0x10,%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x14(%rbp),%eax
shr    $0x8,%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x14(%rbp),%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
movl   $0x5,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<var_int_write>:
mov    %esi,%eax
cmp    $0x7f,%esi
ja     1111 <var_int_write+0x11>
or     $0x80,%al
mov    %al,(%rdi)
mov    $0x1,%eax
ret
cmp    $0x3fff,%eax
ja     112b <var_int_write+0x2b>
mov    %eax,%ecx
shr    $0x8,%ecx
or     $0x40,%cl
mov    %cl,(%rdi)
mov    %al,0x1(%rdi)
mov    $0x2,%eax
ret
cmp    $0x1fffff,%eax
ja     1148 <var_int_write+0x48>
mov    %eax,%ecx
shr    $0x10,%ecx
or     $0x20,%cl
mov    %cl,(%rdi)
mov    %ah,0x1(%rdi)
mov    %al,0x2(%rdi)
mov    $0x3,%eax
ret
cmp    $0xfffffff,%eax
ja     116d <var_int_write+0x6d>
mov    %eax,%ecx
shr    $0x18,%ecx
or     $0x10,%cl
mov    %cl,(%rdi)
mov    %eax,%ecx
shr    $0x10,%ecx
mov    %cl,0x1(%rdi)
mov    %ah,0x2(%rdi)
mov    %al,0x3(%rdi)
mov    $0x4,%eax
ret
movb   $0x8,(%rdi)
mov    %eax,%ecx
shr    $0x18,%ecx
mov    %cl,0x1(%rdi)
mov    %eax,%ecx
shr    $0x10,%ecx
mov    %cl,0x2(%rdi)
mov    %ah,0x3(%rdi)
mov    %al,0x4(%rdi)
mov    $0x5,%eax
ret

LLVM IR (-O0):
define i32 @var_int_write(i8* %0, i32 %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i32
store i8* %0, i8** %4
store i32 %1, i32* %5
%6 = load i32, i32* %5
%7 = icmp ult i32 %6, 128
br i1 %7, label %8, label %13
8: ; preds = %2
%9 = load i32, i32* %5
%10 = or i32 128, %9
%11 = trunc i32 %10 to i8
%12 = load i8*, i8** %4
store i8 %11, i8* %12
store i32 1, i32* %3
br label %98
13: ; preds = %2
%14 = load i32, i32* %5
%15 = icmp ult i32 %14, 16384
br i1 %15, label %16, label %27
16: ; preds = %13
%17 = load i32, i32* %5
%18 = lshr i32 %17, 8
%19 = or i32 64, %18
%20 = trunc i32 %19 to i8
%21 = load i8*, i8** %4
%22 = getelementptr inbounds i8, i8* %21, i32 1
store i8* %22, i8** %4
store i8 %20, i8* %21
%23 = load i32, i32* %5
%24 = and i32 %23, 255
%25 = trunc i32 %24 to i8
%26 = load i8*, i8** %4
store i8 %25, i8* %26
store i32 2, i32* %3
br label %98
27: ; preds = %13
%28 = load i32, i32* %5
%29 = icmp ult i32 %28, 2097152
br i1 %29, label %30, label %47
30: ; preds = %27
%31 = load i32, i32* %5
%32 = lshr i32 %31, 16
%33 = or i32 32, %32
%34 = trunc i32 %33 to i8
%35 = load i8*, i8** %4
%36 = getelementptr inbounds i8, i8* %35, i32 1
store i8* %36, i8** %4
store i8 %34, i8* %35
%37 = load i32, i32* %5
%38 = lshr i32 %37, 8
%39 = and i32 255, %38
%40 = trunc i32 %39 to i8
%41 = load i8*, i8** %4
%42 = getelementptr inbounds i8, i8* %41, i32 1
store i8* %42, i8** %4
store i8 %40, i8* %41
%43 = load i32, i32* %5
%44 = and i32 %43, 255
%45 = trunc i32 %44 to i8
%46 = load i8*, i8** %4
store i8 %45, i8* %46
store i32 3, i32* %3
br label %98
47: ; preds = %27
%48 = load i32, i32* %5
%49 = icmp ult i32 %48, 268435456
br i1 %49, label %50, label %73
50: ; preds = %47
%51 = load i32, i32* %5
%52 = lshr i32 %51, 24
%53 = or i32 16, %52
%54 = trunc i32 %53 to i8
%55 = load i8*, i8** %4
%56 = getelementptr inbounds i8, i8* %55, i32 1
store i8* %56, i8** %4
store i8 %54, i8* %55
%57 = load i32, i32* %5
%58 = lshr i32 %57, 16
%59 = and i32 255, %58
%60 = trunc i32 %59 to i8
%61 = load i8*, i8** %4
%62 = getelementptr inbounds i8, i8* %61, i32 1
store i8* %62, i8** %4
store i8 %60, i8* %61
%63 = load i32, i32* %5
%64 = lshr i32 %63, 8
%65 = and i32 255, %64
%66 = trunc i32 %65 to i8
%67 = load i8*, i8** %4
%68 = getelementptr inbounds i8, i8* %67, i32 1
store i8* %68, i8** %4
store i8 %66, i8* %67
%69 = load i32, i32* %5
%70 = and i32 %69, 255
%71 = trunc i32 %70 to i8
%72 = load i8*, i8** %4
store i8 %71, i8* %72
store i32 4, i32* %3
br label %98
73: ; preds = %47
%74 = load i8*, i8** %4
%75 = getelementptr inbounds i8, i8* %74, i32 1
store i8* %75, i8** %4
store i8 8, i8* %74
%76 = load i32, i32* %5
%77 = lshr i32 %76, 24
%78 = and i32 255, %77
%79 = trunc i32 %78 to i8
%80 = load i8*, i8** %4
%81 = getelementptr inbounds i8, i8* %80, i32 1
store i8* %81, i8** %4
store i8 %79, i8* %80
%82 = load i32, i32* %5
%83 = lshr i32 %82, 16
%84 = and i32 255, %83
%85 = trunc i32 %84 to i8
%86 = load i8*, i8** %4
%87 = getelementptr inbounds i8, i8* %86, i32 1
store i8* %87, i8** %4
store i8 %85, i8* %86
%88 = load i32, i32* %5
%89 = lshr i32 %88, 8
%90 = and i32 255, %89
%91 = trunc i32 %90 to i8
%92 = load i8*, i8** %4
%93 = getelementptr inbounds i8, i8* %92, i32 1
store i8* %93, i8** %4
store i8 %91, i8* %92
%94 = load i32, i32* %5
%95 = and i32 %94, 255
%96 = trunc i32 %95 to i8
%97 = load i8*, i8** %4
store i8 %96, i8* %97
store i32 5, i32* %3
br label %98
98: ; preds = %73, %50, %30, %16, %8
%99 = load i32, i32* %3
ret i32 %99
}

LLVM IR (-O2):
define i32 @var_int_write(i8* nocapture writeonly %0, i32 %1) {
%3 = icmp ult i32 %1, 128
br i1 %3, label %4, label %7
4: ; preds = %2
%5 = trunc i32 %1 to i8
%6 = or i8 %5, -128
store i8 %6, i8* %0
br label %52
7: ; preds = %2
%8 = icmp ult i32 %1, 16384
br i1 %8, label %9, label %15
9: ; preds = %7
%10 = lshr i32 %1, 8
%11 = trunc i32 %10 to i8
%12 = or i8 %11, 64
%13 = getelementptr inbounds i8, i8* %0, i64 1
store i8 %12, i8* %0
%14 = trunc i32 %1 to i8
store i8 %14, i8* %13
br label %52
15: ; preds = %7
%16 = icmp ult i32 %1, 2097152
br i1 %16, label %17, label %26
17: ; preds = %15
%18 = lshr i32 %1, 16
%19 = trunc i32 %18 to i8
%20 = or i8 %19, 32
%21 = getelementptr inbounds i8, i8* %0, i64 1
store i8 %20, i8* %0
%22 = lshr i32 %1, 8
%23 = trunc i32 %22 to i8
%24 = getelementptr inbounds i8, i8* %0, i64 2
store i8 %23, i8* %21
%25 = trunc i32 %1 to i8
store i8 %25, i8* %24
br label %52
26: ; preds = %15
%27 = icmp ult i32 %1, 268435456
br i1 %27, label %28, label %40
28: ; preds = %26
%29 = lshr i32 %1, 24
%30 = trunc i32 %29 to i8
%31 = or i8 %30, 16
%32 = getelementptr inbounds i8, i8* %0, i64 1
store i8 %31, i8* %0
%33 = lshr i32 %1, 16
%34 = trunc i32 %33 to i8
%35 = getelementptr inbounds i8, i8* %0, i64 2
store i8 %34, i8* %32
%36 = lshr i32 %1, 8
%37 = trunc i32 %36 to i8
%38 = getelementptr inbounds i8, i8* %0, i64 3
store i8 %37, i8* %35
%39 = trunc i32 %1 to i8
store i8 %39, i8* %38
br label %52
40: ; preds = %26
%41 = getelementptr inbounds i8, i8* %0, i64 1
store i8 8, i8* %0
%42 = lshr i32 %1, 24
%43 = trunc i32 %42 to i8
%44 = getelementptr inbounds i8, i8* %0, i64 2
store i8 %43, i8* %41
%45 = lshr i32 %1, 16
%46 = trunc i32 %45 to i8
%47 = getelementptr inbounds i8, i8* %0, i64 3
store i8 %46, i8* %44
%48 = lshr i32 %1, 8
%49 = trunc i32 %48 to i8
%50 = getelementptr inbounds i8, i8* %0, i64 4
store i8 %49, i8* %47
%51 = trunc i32 %1 to i8
store i8 %51, i8* %50
br label %52
52: ; preds = %40, %28, %17, %9, %4
%53 = phi i32 [ 1, %4 ], [ 2, %9 ], [ 3, %17 ], [ 4, %28 ], [ 5, %40 ]
ret i32 %53
}