int utf8_wctomb(char *s, int wc1) {
  unsigned int wc = wc1;
  if (!s)
    return 0;
  if (wc < (1 << 7)) {
    *s++ = wc;
    return 1;
  } else if (wc < (1 << 11)) {
    *s++ = 0xc0 | (wc >> 6);
    *s++ = 0x80 | (wc & 0x3f);
    return 2;
  } else if (wc < (1 << 16)) {
    *s++ = 0xe0 | (wc >> 12);
    *s++ = 0x80 | ((wc >> 6) & 0x3f);
    *s++ = 0x80 | (wc & 0x3f);
    return 3;
  } else if (wc < (1 << 21)) {
    *s++ = 0xf0 | (wc >> 18);
    *s++ = 0x80 | ((wc >> 12) & 0x3f);
    *s++ = 0x80 | ((wc >> 6) & 0x3f);
    *s++ = 0x80 | (wc & 0x3f);
    return 4;
  } else if (wc < (1 << 26)) {
    *s++ = 0xf8 | (wc >> 24);
    *s++ = 0x80 | ((wc >> 18) & 0x3f);
    *s++ = 0x80 | ((wc >> 12) & 0x3f);
    *s++ = 0x80 | ((wc >> 6) & 0x3f);
    *s++ = 0x80 | (wc & 0x3f);
    return 5;
  } else if (wc < (1 << 31)) {
    *s++ = 0xfc | (wc >> 30);
    *s++ = 0x80 | ((wc >> 24) & 0x3f);
    *s++ = 0x80 | ((wc >> 18) & 0x3f);
    *s++ = 0x80 | ((wc >> 12) & 0x3f);
    *s++ = 0x80 | ((wc >> 6) & 0x3f);
    *s++ = 0x80 | (wc & 0x3f);
    return 6;
  } else
    return -1;
}


x86 assembly (clang, -O0):
<utf8_wctomb>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1128 <utf8_wctomb+0x28>
movl   $0x0,-0x4(%rbp)
jmp    1451 <utf8_wctomb+0x351>
cmpl   $0x80,-0x18(%rbp)
jae    1157 <utf8_wctomb+0x57>
mov    -0x18(%rbp),%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    1451 <utf8_wctomb+0x351>
cmpl   $0x800,-0x18(%rbp)
jae    11ac <utf8_wctomb+0xac>
mov    -0x18(%rbp),%eax
shr    $0x6,%eax
or     $0xc0,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
movl   $0x2,-0x4(%rbp)
jmp    1451 <utf8_wctomb+0x351>
cmpl   $0x10000,-0x18(%rbp)
jae    1222 <utf8_wctomb+0x122>
mov    -0x18(%rbp),%eax
shr    $0xc,%eax
or     $0xe0,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
shr    $0x6,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
movl   $0x3,-0x4(%rbp)
jmp    1451 <utf8_wctomb+0x351>
cmpl   $0x200000,-0x18(%rbp)
jae    12b9 <utf8_wctomb+0x1b9>
mov    -0x18(%rbp),%eax
shr    $0x12,%eax
or     $0xf0,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
shr    $0xc,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
shr    $0x6,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
movl   $0x4,-0x4(%rbp)
jmp    1451 <utf8_wctomb+0x351>
cmpl   $0x4000000,-0x18(%rbp)
jae    1371 <utf8_wctomb+0x271>
mov    -0x18(%rbp),%eax
shr    $0x18,%eax
or     $0xf8,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
shr    $0x12,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
shr    $0xc,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
shr    $0x6,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
movl   $0x5,-0x4(%rbp)
jmp    1451 <utf8_wctomb+0x351>
cmpl   $0x80000000,-0x18(%rbp)
jae    144a <utf8_wctomb+0x34a>
mov    -0x18(%rbp),%eax
shr    $0x1e,%eax
or     $0xfc,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
shr    $0x18,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
shr    $0x12,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
shr    $0xc,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
shr    $0x6,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
movl   $0x6,-0x4(%rbp)
jmp    1451 <utf8_wctomb+0x351>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<utf8_wctomb>:
test   %rdi,%rdi
je     1113 <utf8_wctomb+0x13>
cmp    $0x7f,%esi
ja     1116 <utf8_wctomb+0x16>
mov    %sil,(%rdi)
mov    $0x1,%eax
ret
xor    %eax,%eax
ret
cmp    $0x7ff,%esi
ja     1139 <utf8_wctomb+0x39>
mov    %esi,%eax
shr    $0x6,%eax
or     $0xc0,%al
mov    %al,(%rdi)
and    $0x3f,%sil
or     $0x80,%sil
mov    %sil,0x1(%rdi)
mov    $0x2,%eax
ret
cmp    $0xffff,%esi
ja     1168 <utf8_wctomb+0x68>
mov    %esi,%eax
shr    $0xc,%eax
or     $0xe0,%al
mov    %al,(%rdi)
mov    %esi,%eax
shr    $0x6,%eax
and    $0x3f,%al
or     $0x80,%al
mov    %al,0x1(%rdi)
and    $0x3f,%sil
or     $0x80,%sil
mov    %sil,0x2(%rdi)
mov    $0x3,%eax
ret
cmp    $0x1fffff,%esi
ja     11a3 <utf8_wctomb+0xa3>
mov    %esi,%eax
shr    $0x12,%eax
or     $0xf0,%al
mov    %al,(%rdi)
mov    %esi,%eax
shr    $0xc,%eax
and    $0x3f,%al
or     $0x80,%al
mov    %al,0x1(%rdi)
mov    %esi,%eax
shr    $0x6,%eax
and    $0x3f,%al
or     $0x80,%al
mov    %al,0x2(%rdi)
and    $0x3f,%sil
or     $0x80,%sil
mov    %sil,0x3(%rdi)
mov    $0x4,%eax
ret
cmp    $0x3ffffff,%esi
ja     11ea <utf8_wctomb+0xea>
mov    %esi,%eax
shr    $0x18,%eax
or     $0xf8,%al
mov    %al,(%rdi)
mov    %esi,%eax
shr    $0x12,%eax
and    $0x3f,%al
or     $0x80,%al
mov    %al,0x1(%rdi)
mov    %esi,%eax
shr    $0xc,%eax
and    $0x3f,%al
or     $0x80,%al
mov    %al,0x2(%rdi)
mov    %esi,%eax
shr    $0x6,%eax
and    $0x3f,%al
or     $0x80,%al
mov    %al,0x3(%rdi)
and    $0x3f,%sil
or     $0x80,%sil
mov    %sil,0x4(%rdi)
mov    $0x5,%eax
ret
test   %esi,%esi
js     1239 <utf8_wctomb+0x139>
mov    %esi,%eax
shr    $0x1e,%eax
or     $0xfc,%al
mov    %al,(%rdi)
mov    %esi,%eax
shr    $0x18,%eax
and    $0x3f,%al
or     $0x80,%al
mov    %al,0x1(%rdi)
mov    %esi,%eax
shr    $0x12,%eax
and    $0x3f,%al
or     $0x80,%al
mov    %al,0x2(%rdi)
mov    %esi,%eax
shr    $0xc,%eax
and    $0x3f,%al
or     $0x80,%al
mov    %al,0x3(%rdi)
mov    %esi,%eax
shr    $0x6,%eax
and    $0x3f,%al
or     $0x80,%al
mov    %al,0x4(%rdi)
and    $0x3f,%sil
or     $0x80,%sil
mov    %sil,0x5(%rdi)
mov    $0x6,%eax
ret
mov    $0xffffffff,%eax
ret

LLVM IR (-O0):
define i32 @utf8_wctomb(i8* %0, i32 %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
store i8* %0, i8** %4
store i32 %1, i32* %5
%7 = load i32, i32* %5
store i32 %7, i32* %6
%8 = load i8*, i8** %4
%9 = icmp ne i8* %8, null
br i1 %9, label %11, label %10
10: ; preds = %2
store i32 0, i32* %3
br label %170
11: ; preds = %2
%12 = load i32, i32* %6
%13 = icmp ult i32 %12, 128
br i1 %13, label %14, label %19
14: ; preds = %11
%15 = load i32, i32* %6
%16 = trunc i32 %15 to i8
%17 = load i8*, i8** %4
%18 = getelementptr inbounds i8, i8* %17, i32 1
store i8* %18, i8** %4
store i8 %16, i8* %17
store i32 1, i32* %3
br label %170
19: ; preds = %11
%20 = load i32, i32* %6
%21 = icmp ult i32 %20, 2048
br i1 %21, label %22, label %35
22: ; preds = %19
%23 = load i32, i32* %6
%24 = lshr i32 %23, 6
%25 = or i32 192, %24
%26 = trunc i32 %25 to i8
%27 = load i8*, i8** %4
%28 = getelementptr inbounds i8, i8* %27, i32 1
store i8* %28, i8** %4
store i8 %26, i8* %27
%29 = load i32, i32* %6
%30 = and i32 %29, 63
%31 = or i32 128, %30
%32 = trunc i32 %31 to i8
%33 = load i8*, i8** %4
%34 = getelementptr inbounds i8, i8* %33, i32 1
store i8* %34, i8** %4
store i8 %32, i8* %33
store i32 2, i32* %3
br label %170
35: ; preds = %19
%36 = load i32, i32* %6
%37 = icmp ult i32 %36, 65536
br i1 %37, label %38, label %58
38: ; preds = %35
%39 = load i32, i32* %6
%40 = lshr i32 %39, 12
%41 = or i32 224, %40
%42 = trunc i32 %41 to i8
%43 = load i8*, i8** %4
%44 = getelementptr inbounds i8, i8* %43, i32 1
store i8* %44, i8** %4
store i8 %42, i8* %43
%45 = load i32, i32* %6
%46 = lshr i32 %45, 6
%47 = and i32 %46, 63
%48 = or i32 128, %47
%49 = trunc i32 %48 to i8
%50 = load i8*, i8** %4
%51 = getelementptr inbounds i8, i8* %50, i32 1
store i8* %51, i8** %4
store i8 %49, i8* %50
%52 = load i32, i32* %6
%53 = and i32 %52, 63
%54 = or i32 128, %53
%55 = trunc i32 %54 to i8
%56 = load i8*, i8** %4
%57 = getelementptr inbounds i8, i8* %56, i32 1
store i8* %57, i8** %4
store i8 %55, i8* %56
store i32 3, i32* %3
br label %170
58: ; preds = %35
%59 = load i32, i32* %6
%60 = icmp ult i32 %59, 2097152
br i1 %60, label %61, label %88
61: ; preds = %58
%62 = load i32, i32* %6
%63 = lshr i32 %62, 18
%64 = or i32 240, %63
%65 = trunc i32 %64 to i8
%66 = load i8*, i8** %4
%67 = getelementptr inbounds i8, i8* %66, i32 1
store i8* %67, i8** %4
store i8 %65, i8* %66
%68 = load i32, i32* %6
%69 = lshr i32 %68, 12
%70 = and i32 %69, 63
%71 = or i32 128, %70
%72 = trunc i32 %71 to i8
%73 = load i8*, i8** %4
%74 = getelementptr inbounds i8, i8* %73, i32 1
store i8* %74, i8** %4
store i8 %72, i8* %73
%75 = load i32, i32* %6
%76 = lshr i32 %75, 6
%77 = and i32 %76, 63
%78 = or i32 128, %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* %6
%83 = and i32 %82, 63
%84 = or i32 128, %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
store i32 4, i32* %3
br label %170
88: ; preds = %58
%89 = load i32, i32* %6
%90 = icmp ult i32 %89, 67108864
br i1 %90, label %91, label %125
91: ; preds = %88
%92 = load i32, i32* %6
%93 = lshr i32 %92, 24
%94 = or i32 248, %93
%95 = trunc i32 %94 to i8
%96 = load i8*, i8** %4
%97 = getelementptr inbounds i8, i8* %96, i32 1
store i8* %97, i8** %4
store i8 %95, i8* %96
%98 = load i32, i32* %6
%99 = lshr i32 %98, 18
%100 = and i32 %99, 63
%101 = or i32 128, %100
%102 = trunc i32 %101 to i8
%103 = load i8*, i8** %4
%104 = getelementptr inbounds i8, i8* %103, i32 1
store i8* %104, i8** %4
store i8 %102, i8* %103
%105 = load i32, i32* %6
%106 = lshr i32 %105, 12
%107 = and i32 %106, 63
%108 = or i32 128, %107
%109 = trunc i32 %108 to i8
%110 = load i8*, i8** %4
%111 = getelementptr inbounds i8, i8* %110, i32 1
store i8* %111, i8** %4
store i8 %109, i8* %110
%112 = load i32, i32* %6
%113 = lshr i32 %112, 6
%114 = and i32 %113, 63
%115 = or i32 128, %114
%116 = trunc i32 %115 to i8
%117 = load i8*, i8** %4
%118 = getelementptr inbounds i8, i8* %117, i32 1
store i8* %118, i8** %4
store i8 %116, i8* %117
%119 = load i32, i32* %6
%120 = and i32 %119, 63
%121 = or i32 128, %120
%122 = trunc i32 %121 to i8
%123 = load i8*, i8** %4
%124 = getelementptr inbounds i8, i8* %123, i32 1
store i8* %124, i8** %4
store i8 %122, i8* %123
store i32 5, i32* %3
br label %170
125: ; preds = %88
%126 = load i32, i32* %6
%127 = icmp ult i32 %126, -2147483648
br i1 %127, label %128, label %169
128: ; preds = %125
%129 = load i32, i32* %6
%130 = lshr i32 %129, 30
%131 = or i32 252, %130
%132 = trunc i32 %131 to i8
%133 = load i8*, i8** %4
%134 = getelementptr inbounds i8, i8* %133, i32 1
store i8* %134, i8** %4
store i8 %132, i8* %133
%135 = load i32, i32* %6
%136 = lshr i32 %135, 24
%137 = and i32 %136, 63
%138 = or i32 128, %137
%139 = trunc i32 %138 to i8
%140 = load i8*, i8** %4
%141 = getelementptr inbounds i8, i8* %140, i32 1
store i8* %141, i8** %4
store i8 %139, i8* %140
%142 = load i32, i32* %6
%143 = lshr i32 %142, 18
%144 = and i32 %143, 63
%145 = or i32 128, %144
%146 = trunc i32 %145 to i8
%147 = load i8*, i8** %4
%148 = getelementptr inbounds i8, i8* %147, i32 1
store i8* %148, i8** %4
store i8 %146, i8* %147
%149 = load i32, i32* %6
%150 = lshr i32 %149, 12
%151 = and i32 %150, 63
%152 = or i32 128, %151
%153 = trunc i32 %152 to i8
%154 = load i8*, i8** %4
%155 = getelementptr inbounds i8, i8* %154, i32 1
store i8* %155, i8** %4
store i8 %153, i8* %154
%156 = load i32, i32* %6
%157 = lshr i32 %156, 6
%158 = and i32 %157, 63
%159 = or i32 128, %158
%160 = trunc i32 %159 to i8
%161 = load i8*, i8** %4
%162 = getelementptr inbounds i8, i8* %161, i32 1
store i8* %162, i8** %4
store i8 %160, i8* %161
%163 = load i32, i32* %6
%164 = and i32 %163, 63
%165 = or i32 128, %164
%166 = trunc i32 %165 to i8
%167 = load i8*, i8** %4
%168 = getelementptr inbounds i8, i8* %167, i32 1
store i8* %168, i8** %4
store i8 %166, i8* %167
store i32 6, i32* %3
br label %170
169: ; preds = %125
store i32 -1, i32* %3
br label %170
170: ; preds = %169, %128, %91, %61, %38, %22, %14, %10
%171 = load i32, i32* %3
ret i32 %171
}

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