void encodegraphsize(int n, char **pp) {
  char *p;
  p = *pp;
  if (n <= 62)
    *p++ = (char)(63 + n);
  else if (n <= 258047) {
    *p++ = 126;
    *p++ = (char)(63 + (n >> 12));
    *p++ = (char)(63 + ((n >> 6) & 63));
    *p++ = (char)(63 + (n & 63));
  } else {
    *p++ = 126;
    *p++ = 126;
    *p++ = (char)(63 + (n >> 30));
    *p++ = (char)(63 + ((n >> 24) & 63));
    *p++ = (char)(63 + ((n >> 18) & 63));
    *p++ = (char)(63 + ((n >> 12) & 63));
    *p++ = (char)(63 + ((n >> 6) & 63));
    *p++ = (char)(63 + (n & 63));
  }
  *pp = p;
}


x86 assembly (clang, -O0):
<encodegraphsize>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x18(%rbp)
cmpl   $0x3e,-0x4(%rbp)
jg     113e <encodegraphsize+0x3e>
mov    -0x4(%rbp),%eax
add    $0x3f,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
jmp    1296 <encodegraphsize+0x196>
cmpl   $0x3efff,-0x4(%rbp)
jg     11b9 <encodegraphsize+0xb9>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x7e,(%rax)
mov    -0x4(%rbp),%eax
sar    $0xc,%eax
add    $0x3f,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
sar    $0x6,%eax
and    $0x3f,%eax
add    $0x3f,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
and    $0x3f,%eax
add    $0x3f,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
jmp    1291 <encodegraphsize+0x191>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x7e,(%rax)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x7e,(%rax)
mov    -0x4(%rbp),%eax
sar    $0x1e,%eax
add    $0x3f,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
sar    $0x18,%eax
and    $0x3f,%eax
add    $0x3f,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
sar    $0x12,%eax
and    $0x3f,%eax
add    $0x3f,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
sar    $0xc,%eax
and    $0x3f,%eax
add    $0x3f,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
sar    $0x6,%eax
and    $0x3f,%eax
add    $0x3f,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
and    $0x3f,%eax
add    $0x3f,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
jmp    1296 <encodegraphsize+0x196>
mov    -0x18(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<encodegraphsize>:
mov    (%rsi),%rax
cmp    $0x3e,%edi
jg     1115 <encodegraphsize+0x15>
mov    $0x1,%edx
mov    %rax,%rcx
jmp    119c <encodegraphsize+0x9c>
movb   $0x7e,(%rax)
cmp    $0x3efff,%edi
ja     1148 <encodegraphsize+0x48>
mov    %edi,%ecx
shr    $0xc,%ecx
add    $0x3f,%cl
mov    %cl,0x1(%rax)
mov    %edi,%edx
shr    $0x6,%edx
and    $0x3f,%dl
add    $0x3f,%dl
lea    0x3(%rax),%rcx
mov    %dl,0x2(%rax)
and    $0x3f,%dil
mov    $0x4,%edx
jmp    119c <encodegraphsize+0x9c>
movb   $0x7e,0x1(%rax)
mov    %edi,%ecx
shr    $0x1e,%ecx
add    $0x3f,%cl
mov    %cl,0x2(%rax)
mov    %edi,%ecx
shr    $0x18,%ecx
and    $0x3f,%cl
add    $0x3f,%cl
mov    %cl,0x3(%rax)
mov    %edi,%ecx
shr    $0x12,%ecx
and    $0x3f,%cl
add    $0x3f,%cl
mov    %cl,0x4(%rax)
mov    %edi,%ecx
shr    $0xc,%ecx
and    $0x3f,%cl
add    $0x3f,%cl
mov    %cl,0x5(%rax)
mov    %edi,%edx
shr    $0x6,%edx
and    $0x3f,%dl
add    $0x3f,%dl
lea    0x7(%rax),%rcx
mov    %dl,0x6(%rax)
and    $0x3f,%dil
mov    $0x8,%edx
add    $0x3f,%dil
add    %rdx,%rax
mov    %dil,(%rcx)
mov    %rax,(%rsi)
ret

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

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