int encode_utf8(char *dest, unsigned int ucval) {
  int dlen;
  unsigned int exbytenr;
  unsigned char *dp = (unsigned char *)dest;
  if (ucval < 0x80u) {
    if (dest)
      *dest = (char)ucval;
    return 1;
  }
  for (exbytenr = 1; exbytenr < 5; ++exbytenr)
    if (ucval < (1u << (exbytenr * 5 + 6)))
      break;
  dlen = 1 + exbytenr;
  if (!dest)
    return dlen;
  *dp = (((1u << (exbytenr + 2)) - 2) << (6 - exbytenr)) |
        ((ucval >> (6 * exbytenr)) & ((1u << (6 - exbytenr)) - 1));
  ++dp;
  while (exbytenr--) {
    *dp = 0x80u | ((ucval >> (6 * exbytenr)) & 0x3Fu);
    ++dp;
  }
  return dlen;
}


x86 assembly (clang, -O0):
<encode_utf8>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
cmpl   $0x80,-0x14(%rbp)
jae    1142 <encode_utf8+0x42>
cmpq   $0x0,-0x10(%rbp)
je     1136 <encode_utf8+0x36>
mov    -0x14(%rbp),%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    123c <encode_utf8+0x13c>
movl   $0x1,-0x1c(%rbp)
cmpl   $0x5,-0x1c(%rbp)
jae    1186 <encode_utf8+0x86>
mov    -0x14(%rbp),%eax
imul   $0x5,-0x1c(%rbp),%ecx
add    $0x6,%ecx
mov    $0x1,%edx
shl    %cl,%edx
mov    %edx,%ecx
cmp    %ecx,%eax
jae    1173 <encode_utf8+0x73>
jmp    1186 <encode_utf8+0x86>
jmp    1178 <encode_utf8+0x78>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1149 <encode_utf8+0x49>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    11a5 <encode_utf8+0xa5>
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    123c <encode_utf8+0x13c>
mov    -0x1c(%rbp),%ecx
add    $0x2,%ecx
mov    $0x1,%eax
shl    %cl,%eax
sub    $0x2,%eax
mov    $0x6,%ecx
sub    -0x1c(%rbp),%ecx
shl    %cl,%eax
mov    -0x14(%rbp),%edx
imul   $0x6,-0x1c(%rbp),%ecx
shr    %cl,%edx
mov    %edx,-0x2c(%rbp)
mov    $0x6,%ecx
sub    -0x1c(%rbp),%ecx
mov    $0x1,%edx
shl    %cl,%edx
mov    -0x2c(%rbp),%ecx
sub    $0x1,%edx
and    %edx,%ecx
or     %ecx,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x1c(%rbp)
cmp    $0x0,%eax
je     1236 <encode_utf8+0x136>
mov    -0x14(%rbp),%eax
imul   $0x6,-0x1c(%rbp),%ecx
shr    %cl,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    11f8 <encode_utf8+0xf8>
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<encode_utf8>:
cmp    $0x80,%esi
jae    1116 <encode_utf8+0x16>
mov    $0x1,%eax
test   %rdi,%rdi
je     1115 <encode_utf8+0x15>
mov    %sil,(%rdi)
ret
mov    $0x1,%r8d
cmp    $0x800,%esi
jb     1150 <encode_utf8+0x50>
mov    $0x2,%r8d
cmp    $0x10000,%esi
jb     1150 <encode_utf8+0x50>
mov    $0x3,%r8d
cmp    $0x200000,%esi
jb     1150 <encode_utf8+0x50>
cmp    $0x4000000,%esi
mov    $0x5,%r8d
sbb    $0x0,%r8d
lea    0x1(%r8),%eax
test   %rdi,%rdi
je     1115 <encode_utf8+0x15>
mov    $0x4,%r11d
mov    %r8d,%ecx
shl    %cl,%r11d
add    $0xfe,%r11d
mov    $0x6,%r9b
sub    %r8b,%r9b
mov    %r9d,%ecx
shl    %cl,%r11d
lea    (%r8,%r8,1),%ecx
lea    (%rcx,%rcx,2),%ecx
mov    %esi,%r10d
shr    %cl,%r10d
mov    $0xffffffff,%edx
mov    %r9d,%ecx
shl    %cl,%edx
not    %edx
and    %r10d,%edx
or     %r11d,%edx
mov    %dl,(%rdi)
lea    -0x1(%r8),%r9d
movq   %r9,%xmm0
add    $0x2,%r9
pshufd $0x44,%xmm0,%xmm1
movd   %r8d,%xmm0
pshufd $0x50,%xmm0,%xmm0
pxor   0xe43(%rip),%xmm1
movdqa 0xe4b(%rip),%xmm2
movdqa %xmm2,%xmm3
pcmpgtd %xmm1,%xmm3
pcmpeqd %xmm1,%xmm2
pshufd $0xf5,%xmm2,%xmm2
pand   %xmm3,%xmm2
pshufd $0xf5,%xmm3,%xmm3
por    %xmm2,%xmm3
movdqa 0xe35(%rip),%xmm2
paddd  %xmm0,%xmm2
movd   %xmm3,%ecx
not    %ecx
test   $0x1,%cl
je     1210 <encode_utf8+0x110>
movd   %xmm2,%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,2),%ecx
mov    %esi,%edx
shr    %cl,%edx
and    $0x3f,%dl
or     $0x80,%dl
mov    %dl,0x1(%rdi)
and    $0xfffffffffffffffe,%r9
pcmpeqd %xmm4,%xmm4
pxor   %xmm4,%xmm3
pextrw $0x4,%xmm3,%ecx
test   $0x1,%cl
je     123d <encode_utf8+0x13d>
pextrw $0x2,%xmm2,%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,2),%ecx
mov    %esi,%edx
shr    %cl,%edx
and    $0x3f,%dl
or     $0x80,%dl
mov    %dl,0x2(%rdi)
cmp    $0x2,%r9
je     1115 <encode_utf8+0x15>
movdqa 0xde1(%rip),%xmm2
movdqa %xmm1,%xmm3
pcmpgtd %xmm2,%xmm3
pcmpeqd %xmm1,%xmm2
pshufd $0xf5,%xmm2,%xmm2
pand   %xmm3,%xmm2
pshufd $0xf5,%xmm3,%xmm3
por    %xmm2,%xmm3
movdqa 0xdcb(%rip),%xmm2
paddd  %xmm0,%xmm2
movd   %xmm3,%ecx
test   $0x1,%cl
je     1298 <encode_utf8+0x198>
movd   %xmm2,%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,2),%ecx
mov    %esi,%edx
shr    %cl,%edx
and    $0x3f,%dl
or     $0x80,%dl
mov    %dl,0x3(%rdi)
pextrw $0x4,%xmm3,%ecx
test   $0x1,%cl
je     12b9 <encode_utf8+0x1b9>
pextrw $0x2,%xmm2,%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,2),%ecx
mov    %esi,%edx
shr    %cl,%edx
and    $0x3f,%dl
or     $0x80,%dl
mov    %dl,0x4(%rdi)
cmp    $0x4,%r9
je     1115 <encode_utf8+0x15>
movdqa 0xd85(%rip),%xmm2
movdqa %xmm1,%xmm3
pcmpgtd %xmm2,%xmm3
pcmpeqd %xmm2,%xmm1
pshufd $0xf5,%xmm1,%xmm2
pand   %xmm3,%xmm2
pshufd $0xf5,%xmm3,%xmm1
por    %xmm2,%xmm1
paddd  0xd6f(%rip),%xmm0
movd   %xmm1,%ecx
test   $0x1,%cl
je     1310 <encode_utf8+0x210>
movd   %xmm0,%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,2),%ecx
mov    %esi,%edx
shr    %cl,%edx
and    $0x3f,%dl
or     $0x80,%dl
mov    %dl,0x5(%rdi)
pextrw $0x4,%xmm1,%ecx
test   $0x1,%cl
je     1115 <encode_utf8+0x15>
pextrw $0x2,%xmm0,%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,2),%ecx
shr    %cl,%esi
and    $0x3f,%sil
or     $0x80,%sil
mov    %sil,0x6(%rdi)
ret

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

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