int pastPacketNumber(char *message, int number, int len) {
  for (int i = len - 1; i > 1; i--) {
    message[i] = message[i - 2];
  }
  message[0] = (int)(number / 10) + '0';
  message[1] = number % 10 + '0';
  return 1;
}


x86 assembly (clang, -O0):
<pastPacketNumber>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0x10(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x1,-0x14(%rbp)
jle    114a <pastPacketNumber+0x4a>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1117 <pastPacketNumber+0x17>
mov    -0xc(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
add    $0x30,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
mov    -0xc(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
mov    %dl,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x1(%rax)
mov    $0x1,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<pastPacketNumber>:
push   %rbp
push   %r14
push   %rbx
cmp    $0x3,%edx
jl     1160 <pastPacketNumber+0x60>
mov    $0xfffffffd,%eax
mov    %edx,%ebx
xor    %r9d,%r9d
mov    %rbx,%rcx
sub    $0x3,%rcx
mov    $0x0,%r8d
cmovae %rcx,%r8
add    $0x1,%r8
cmp    $0x8,%r8
jae    1192 <pastPacketNumber+0x92>
add    %rbx,%rax
add    $0xffffffffffffffff,%rbx
cs nopw 0x0(%rax,%rax,1)
nop
mov    %eax,%ecx
movzbl (%rdi,%rcx,1),%ecx
mov    %ebx,%edx
mov    %cl,(%rdi,%rdx,1)
add    $0xffffffffffffffff,%rax
lea    -0x1(%rbx),%rcx
add    $0x1,%rbx
cmp    $0x3,%rbx
mov    %rcx,%rbx
ja     1140 <pastPacketNumber+0x40>
movslq %esi,%rax
imul   $0x66666667,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
sar    $0x22,%rcx
add    %edx,%ecx
lea    0x30(%rcx),%edx
mov    %dl,(%rdi)
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%ecx
sub    %ecx,%eax
add    $0x30,%al
mov    %al,0x1(%rdi)
mov    $0x1,%eax
pop    %rbx
pop    %r14
pop    %rbp
ret
mov    %ebx,%ebp
sub    $0x3,%ebp
cmovb  %r9d,%ebp
mov    %rbx,%rcx
sub    $0x3,%rcx
cmovae %rcx,%r9
lea    -0x1(%rdx),%r10d
cmp    %ebp,%r10d
jb     112e <pastPacketNumber+0x2e>
mov    %r9,%r11
shr    $0x20,%r11
jne    112e <pastPacketNumber+0x2e>
add    $0xfffffffd,%edx
cmp    %ebp,%edx
jb     112e <pastPacketNumber+0x2e>
test   %r11,%r11
jne    112e <pastPacketNumber+0x2e>
lea    (%rdi,%r10,1),%rbp
mov    %rbp,%rcx
sub    %r9,%rcx
cmp    %rbp,%rcx
ja     112e <pastPacketNumber+0x2e>
lea    (%rdi,%rdx,1),%rbp
mov    %rbp,%rcx
sub    %r9,%rcx
cmp    %rbp,%rcx
ja     112e <pastPacketNumber+0x2e>
cmp    $0x3,%rbx
mov    $0x3,%ecx
cmovb  %rbx,%rcx
lea    (%rcx,%r10,1),%r9
sub    %rbx,%r9
add    %rdi,%r9
lea    (%rdx,%rdi,1),%rbp
add    $0x1,%rbp
cmp    %rbp,%r9
jae    1238 <pastPacketNumber+0x138>
lea    (%r10,%rdi,1),%rbp
add    $0x1,%rbp
add    %rdx,%rcx
sub    %rbx,%rcx
add    %rdi,%rcx
cmp    %rbp,%rcx
jb     112e <pastPacketNumber+0x2e>
cmp    $0x10,%r8
jae    1246 <pastPacketNumber+0x146>
xor    %r10d,%r10d
jmp    12ea <pastPacketNumber+0x1ea>
mov    %r8,%r10
and    $0xfffffffffffffff0,%r10
lea    -0x10(%r10),%rcx
mov    %rcx,%r9
shr    $0x4,%r9
add    $0x1,%r9
test   %rcx,%rcx
je     12b3 <pastPacketNumber+0x1b3>
mov    %r9,%rdx
and    $0xfffffffffffffffe,%rdx
lea    (%rax,%rbx,1),%rcx
add    $0xfffffffffffffff0,%rcx
xor    %r11d,%r11d
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    0x12(%rcx),%r14d
lea    0x10(%rcx),%ebp
movups -0xf(%rdi,%rbp,1),%xmm0
movups %xmm0,-0xf(%rdi,%r14,1)
mov    %ecx,%ebp
lea    0x2(%rcx),%r14d
movups -0xf(%rdi,%rbp,1),%xmm0
movups %xmm0,-0xf(%rdi,%r14,1)
add    $0x20,%r11
add    $0xffffffffffffffe0,%rcx
add    $0xfffffffffffffffe,%rdx
jne    1280 <pastPacketNumber+0x180>
jmp    12b6 <pastPacketNumber+0x1b6>
xor    %r11d,%r11d
test   $0x1,%r9b
je     12d3 <pastPacketNumber+0x1d3>
mov    %ebx,%ecx
sub    %r11d,%ecx
lea    (%rax,%rcx,1),%edx
add    %eax,%ecx
add    $0x2,%ecx
movups -0xf(%rdi,%rdx,1),%xmm0
movups %xmm0,-0xf(%rdi,%rcx,1)
cmp    %r10,%r8
je     1160 <pastPacketNumber+0x60>
test   $0x8,%r8b
jne    12ea <pastPacketNumber+0x1ea>
sub    %r10,%rbx
jmp    112e <pastPacketNumber+0x2e>
xor    %r9d,%r9d
mov    %rbx,%rcx
sub    $0x3,%rcx
cmovae %rcx,%r9
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffff8,%r8
lea    (%rax,%rbx,1),%rcx
sub    %r8,%rbx
sub    %r10,%rcx
sub    %r8,%r10
add    $0x2,%rcx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    -0x2(%rcx),%ebp
mov    -0x7(%rdi,%rbp,1),%rbp
mov    %ecx,%edx
mov    %rbp,-0x7(%rdi,%rdx,1)
add    $0xfffffffffffffff8,%rcx
add    $0x8,%r10
jne    1320 <pastPacketNumber+0x220>
cmp    %r8,%r9
jne    112e <pastPacketNumber+0x2e>
jmp    1160 <pastPacketNumber+0x60>

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

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