#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
scalar_t__ EILSEQ;
scalar_t__ EINVAL;
scalar_t__ errno;
size_t utf8_to_code(const unsigned char *const buffer,
                    unsigned int *const codeptr) {
  if (!buffer) {
    errno = EINVAL;
    return 0;
  }
  if (*buffer == 0U) {
    errno = 0;
    return 0;
  }
  if (*buffer < 128U) {
    if (codeptr)
      *codeptr = buffer[0];
    return 1;
  }
  if (*buffer < 192U) {
    errno = EILSEQ;
    return 0;
  }
  if (*buffer < 224U) {
    if (buffer[1] >= 128U && buffer[1] < 192U)
      return ((buffer[0] - 192U) << 6U) | (buffer[1] - 128U);
    errno = EILSEQ;
    return 0;
  }
  if (*buffer < 240U) {
    if (buffer[1] >= 128U && buffer[1] < 192U && buffer[2] >= 128U &&
        buffer[2] < 192U)
      return ((buffer[0] - 224U) << 12U) | ((buffer[1] - 128U) << 6U) |
             (buffer[2] - 128U);
    errno = EILSEQ;
    return 0;
  }
  if (*buffer < 248U) {
    if (buffer[1] >= 128U && buffer[1] < 192U && buffer[2] >= 128U &&
        buffer[2] < 192U && buffer[3] >= 128U && buffer[3] < 192U)
      return ((buffer[0] - 240U) << 18U) | ((buffer[1] - 128U) << 12U) |
             ((buffer[2] - 128U) << 6U) | (buffer[3] - 128U);
    errno = EILSEQ;
    return 0;
  }
  if (*buffer < 252U) {
    if (buffer[1] >= 128U && buffer[1] < 192U && buffer[2] >= 128U &&
        buffer[2] < 192U && buffer[3] >= 128U && buffer[3] < 192U &&
        buffer[4] >= 128U && buffer[4] < 192U)
      return ((buffer[0] - 248U) << 24U) | ((buffer[1] - 128U) << 18U) |
             ((buffer[2] - 128U) << 12U) | ((buffer[3] - 128U) << 6U) |
             (buffer[4] - 128U);
    errno = EILSEQ;
    return 0;
  }
  if (*buffer < 254U) {
    if (buffer[1] >= 128U && buffer[1] < 192U && buffer[2] >= 128U &&
        buffer[2] < 192U && buffer[3] >= 128U && buffer[3] < 192U &&
        buffer[4] >= 128U && buffer[4] < 192U && buffer[5] >= 128U &&
        buffer[5] < 192U)
      return ((buffer[0] - 252U) << 30U) | ((buffer[1] - 128U) << 24U) |
             ((buffer[2] - 128U) << 18U) | ((buffer[3] - 128U) << 12U) |
             ((buffer[4] - 128U) << 6U) | (buffer[5] - 128U);
    errno = EILSEQ;
    return 0;
  }
  errno = EILSEQ;
  return 0;
}


x86 assembly (clang, -O0):
<utf8_to_code>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1138 <utf8_to_code+0x38>
mov    0x2eb2(%rip),%rax
mov    (%rax),%rcx
mov    0x2eb0(%rip),%rax
mov    %rcx,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x0,%eax
jne    1163 <utf8_to_code+0x63>
mov    0x2e89(%rip),%rax
movq   $0x0,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x80,%eax
jae    119a <utf8_to_code+0x9a>
cmpq   $0x0,-0x18(%rbp)
je     118d <utf8_to_code+0x8d>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
movq   $0x1,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xc0,%eax
jae    11cd <utf8_to_code+0xcd>
mov    0x2e3d(%rip),%rax
mov    (%rax),%rcx
mov    0x2e1b(%rip),%rax
mov    %rcx,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xe0,%eax
jae    1250 <utf8_to_code+0x150>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jb     122f <utf8_to_code+0x12f>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xc0,%eax
jae    122f <utf8_to_code+0x12f>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
sub    $0xc0,%eax
shl    $0x6,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
sub    $0x80,%ecx
or     %ecx,%eax
mov    %eax,%eax
mov    %rax,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    0x2dba(%rip),%rax
mov    (%rax),%rcx
mov    0x2d98(%rip),%rax
mov    %rcx,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xf0,%eax
jae    130c <utf8_to_code+0x20c>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jb     12eb <utf8_to_code+0x1eb>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xc0,%eax
jae    12eb <utf8_to_code+0x1eb>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x80,%eax
jb     12eb <utf8_to_code+0x1eb>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xc0,%eax
jae    12eb <utf8_to_code+0x1eb>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
sub    $0xe0,%eax
shl    $0xc,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
sub    $0x80,%ecx
shl    $0x6,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
sub    $0x80,%ecx
or     %ecx,%eax
mov    %eax,%eax
mov    %rax,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    0x2cfe(%rip),%rax
mov    (%rax),%rcx
mov    0x2cdc(%rip),%rax
mov    %rcx,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xf8,%eax
jae    1401 <utf8_to_code+0x301>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jb     13e0 <utf8_to_code+0x2e0>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xc0,%eax
jae    13e0 <utf8_to_code+0x2e0>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x80,%eax
jb     13e0 <utf8_to_code+0x2e0>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xc0,%eax
jae    13e0 <utf8_to_code+0x2e0>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x80,%eax
jb     13e0 <utf8_to_code+0x2e0>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0xc0,%eax
jae    13e0 <utf8_to_code+0x2e0>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
sub    $0xf0,%eax
shl    $0x12,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
sub    $0x80,%ecx
shl    $0xc,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
sub    $0x80,%ecx
shl    $0x6,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x3(%rcx),%ecx
sub    $0x80,%ecx
or     %ecx,%eax
mov    %eax,%eax
mov    %rax,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    0x2c09(%rip),%rax
mov    (%rax),%rcx
mov    0x2be7(%rip),%rax
mov    %rcx,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xfc,%eax
jae    152f <utf8_to_code+0x42f>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jb     150e <utf8_to_code+0x40e>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xc0,%eax
jae    150e <utf8_to_code+0x40e>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x80,%eax
jb     150e <utf8_to_code+0x40e>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xc0,%eax
jae    150e <utf8_to_code+0x40e>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x80,%eax
jb     150e <utf8_to_code+0x40e>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0xc0,%eax
jae    150e <utf8_to_code+0x40e>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0x80,%eax
jb     150e <utf8_to_code+0x40e>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0xc0,%eax
jae    150e <utf8_to_code+0x40e>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
sub    $0xf8,%eax
shl    $0x18,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
sub    $0x80,%ecx
shl    $0x12,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
sub    $0x80,%ecx
shl    $0xc,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x3(%rcx),%ecx
sub    $0x80,%ecx
shl    $0x6,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x4(%rcx),%ecx
sub    $0x80,%ecx
or     %ecx,%eax
mov    %eax,%eax
mov    %rax,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    0x2adb(%rip),%rax
mov    (%rax),%rcx
mov    0x2ab9(%rip),%rax
mov    %rcx,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xfe,%eax
jae    1696 <utf8_to_code+0x596>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jb     1675 <utf8_to_code+0x575>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xc0,%eax
jae    1675 <utf8_to_code+0x575>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x80,%eax
jb     1675 <utf8_to_code+0x575>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xc0,%eax
jae    1675 <utf8_to_code+0x575>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x80,%eax
jb     1675 <utf8_to_code+0x575>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0xc0,%eax
jae    1675 <utf8_to_code+0x575>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0x80,%eax
jb     1675 <utf8_to_code+0x575>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
cmp    $0xc0,%eax
jae    1675 <utf8_to_code+0x575>
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%eax
cmp    $0x80,%eax
jb     1675 <utf8_to_code+0x575>
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%eax
cmp    $0xc0,%eax
jae    1675 <utf8_to_code+0x575>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
sub    $0xfc,%eax
shl    $0x1e,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
sub    $0x80,%ecx
shl    $0x18,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
sub    $0x80,%ecx
shl    $0x12,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x3(%rcx),%ecx
sub    $0x80,%ecx
shl    $0xc,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x4(%rcx),%ecx
sub    $0x80,%ecx
shl    $0x6,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x5(%rcx),%ecx
sub    $0x80,%ecx
or     %ecx,%eax
mov    %eax,%eax
mov    %rax,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    0x2974(%rip),%rax
mov    (%rax),%rcx
mov    0x2952(%rip),%rax
mov    %rcx,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    16b2 <utf8_to_code+0x5b2>
mov    0x2953(%rip),%rax
mov    (%rax),%rcx
mov    0x2931(%rip),%rax
mov    %rcx,(%rax)
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<utf8_to_code>:
test   %rdi,%rdi
je     1123 <utf8_to_code+0x23>
movzbl (%rdi),%eax
test   %eax,%eax
je     112f <utf8_to_code+0x2f>
test   %al,%al
js     1142 <utf8_to_code+0x42>
mov    $0x1,%ecx
test   %rsi,%rsi
je     12e8 <utf8_to_code+0x1e8>
mov    %eax,(%rsi)
mov    %ecx,%eax
ret
mov    0x2ea6(%rip),%rax
jmp    12d9 <utf8_to_code+0x1d9>
mov    0x2ea2(%rip),%rax
movq   $0x0,(%rax)
jmp    12e6 <utf8_to_code+0x1e6>
cmp    $0xbf,%al
jbe    12d2 <utf8_to_code+0x1d2>
cmp    $0xdf,%al
ja     116b <utf8_to_code+0x6b>
movzbl 0x1(%rdi),%ecx
cmp    $0xbf,%cl
jg     12d2 <utf8_to_code+0x1d2>
shl    $0x6,%eax
add    $0xffffd000,%eax
add    $0xffffff80,%ecx
or     %eax,%ecx
mov    %ecx,%eax
ret
cmp    $0xef,%al
ja     11a1 <utf8_to_code+0xa1>
movzbl 0x1(%rdi),%edx
cmp    $0xbf,%dl
jg     12d2 <utf8_to_code+0x1d2>
movzbl 0x2(%rdi),%ecx
cmp    $0xbf,%cl
jg     12d2 <utf8_to_code+0x1d2>
shl    $0xc,%eax
add    $0xfff20000,%eax
shl    $0x6,%edx
add    $0xffffe000,%edx
or     %eax,%edx
add    $0xffffff80,%ecx
jmp    11ee <utf8_to_code+0xee>
cmp    $0xf7,%al
ja     11f3 <utf8_to_code+0xf3>
movzbl 0x1(%rdi),%edx
cmp    $0xbf,%dl
jg     12d2 <utf8_to_code+0x1d2>
movzbl 0x2(%rdi),%esi
cmp    $0xbf,%sil
jg     12d2 <utf8_to_code+0x1d2>
movzbl 0x3(%rdi),%ecx
cmp    $0xbf,%cl
jg     12d2 <utf8_to_code+0x1d2>
shl    $0x12,%eax
add    $0xfc400000,%eax
shl    $0xc,%edx
add    $0xfff80000,%edx
or     %eax,%edx
shl    $0x6,%esi
add    $0xffffe000,%esi
add    $0xffffff80,%ecx
or     %esi,%ecx
or     %edx,%ecx
mov    %ecx,%eax
ret
cmp    $0xfb,%al
ja     1260 <utf8_to_code+0x160>
movzbl 0x1(%rdi),%edx
cmp    $0xbf,%dl
jg     12d2 <utf8_to_code+0x1d2>
movzbl 0x2(%rdi),%esi
cmp    $0xbf,%sil
jg     12d2 <utf8_to_code+0x1d2>
movzbl 0x3(%rdi),%r8d
cmp    $0xbf,%r8b
jg     12d2 <utf8_to_code+0x1d2>
movzbl 0x4(%rdi),%ecx
cmp    $0xbf,%cl
jg     12d2 <utf8_to_code+0x1d2>
shl    $0x18,%eax
add    $0x8000000,%eax
shl    $0x12,%edx
add    $0xfe000000,%edx
or     %eax,%edx
shl    $0xc,%esi
add    $0xfff80000,%esi
shl    $0x6,%r8d
add    $0xffffe000,%r8d
or     %esi,%r8d
or     %edx,%r8d
add    $0xffffff80,%ecx
jmp    12cc <utf8_to_code+0x1cc>
cmp    $0xfd,%al
ja     12d2 <utf8_to_code+0x1d2>
movzbl 0x1(%rdi),%edx
cmp    $0xbf,%dl
jg     12d2 <utf8_to_code+0x1d2>
movzbl 0x2(%rdi),%esi
cmp    $0xbf,%sil
jg     12d2 <utf8_to_code+0x1d2>
movzbl 0x3(%rdi),%r8d
cmp    $0xbf,%r8b
jg     12d2 <utf8_to_code+0x1d2>
movzbl 0x4(%rdi),%r9d
cmp    $0xbf,%r9b
jg     12d2 <utf8_to_code+0x1d2>
movzbl 0x5(%rdi),%ecx
cmp    $0xbf,%cl
jg     12d2 <utf8_to_code+0x1d2>
shl    $0x1e,%eax
xor    $0xffffff80,%edx
shl    $0x18,%edx
or     %eax,%edx
shl    $0x12,%esi
add    $0xfe000000,%esi
shl    $0xc,%r8d
add    $0xfff80000,%r8d
or     %esi,%r8d
or     %edx,%r8d
shl    $0x6,%r9d
add    $0xffffe000,%r9d
add    $0xffffff80,%ecx
or     %r9d,%ecx
or     %r8d,%ecx
mov    %ecx,%eax
ret
mov    0x2d17(%rip),%rax
mov    (%rax),%rax
mov    0x2cf5(%rip),%rcx
mov    %rax,(%rcx)
xor    %ecx,%ecx
mov    %ecx,%eax
ret

LLVM IR (-O0):
@EINVAL = global i64 0
@errno = global i64 0
@EILSEQ = global i64 0
define i64 @utf8_to_code(i8* %0, i32* %1) {
%3 = alloca i64
%4 = alloca i8*
%5 = alloca i32*
store i8* %0, i8** %4
store i32* %1, i32** %5
%6 = load i8*, i8** %4
%7 = icmp ne i8* %6, null
br i1 %7, label %10, label %8
8: ; preds = %2
%9 = load i64, i64* @EINVAL
store i64 %9, i64* @errno
store i64 0, i64* %3
br label %395
10: ; preds = %2
%11 = load i8*, i8** %4
%12 = load i8, i8* %11
%13 = zext i8 %12 to i32
%14 = icmp eq i32 %13, 0
br i1 %14, label %15, label %16
15: ; preds = %10
store i64 0, i64* @errno
store i64 0, i64* %3
br label %395
16: ; preds = %10
%17 = load i8*, i8** %4
%18 = load i8, i8* %17
%19 = zext i8 %18 to i32
%20 = icmp ult i32 %19, 128
br i1 %20, label %21, label %31
21: ; preds = %16
%22 = load i32*, i32** %5
%23 = icmp ne i32* %22, null
br i1 %23, label %24, label %30
24: ; preds = %21
%25 = load i8*, i8** %4
%26 = getelementptr inbounds i8, i8* %25, i64 0
%27 = load i8, i8* %26
%28 = zext i8 %27 to i32
%29 = load i32*, i32** %5
store i32 %28, i32* %29
br label %30
30: ; preds = %24, %21
store i64 1, i64* %3
br label %395
31: ; preds = %16
%32 = load i8*, i8** %4
%33 = load i8, i8* %32
%34 = zext i8 %33 to i32
%35 = icmp ult i32 %34, 192
br i1 %35, label %36, label %38
36: ; preds = %31
%37 = load i64, i64* @EILSEQ
store i64 %37, i64* @errno
store i64 0, i64* %3
br label %395
38: ; preds = %31
%39 = load i8*, i8** %4
%40 = load i8, i8* %39
%41 = zext i8 %40 to i32
%42 = icmp ult i32 %41, 224
br i1 %42, label %43, label %71
43: ; preds = %38
%44 = load i8*, i8** %4
%45 = getelementptr inbounds i8, i8* %44, i64 1
%46 = load i8, i8* %45
%47 = zext i8 %46 to i32
%48 = icmp uge i32 %47, 128
br i1 %48, label %49, label %69
49: ; preds = %43
%50 = load i8*, i8** %4
%51 = getelementptr inbounds i8, i8* %50, i64 1
%52 = load i8, i8* %51
%53 = zext i8 %52 to i32
%54 = icmp ult i32 %53, 192
br i1 %54, label %55, label %69
55: ; preds = %49
%56 = load i8*, i8** %4
%57 = getelementptr inbounds i8, i8* %56, i64 0
%58 = load i8, i8* %57
%59 = zext i8 %58 to i32
%60 = sub i32 %59, 192
%61 = shl i32 %60, 6
%62 = load i8*, i8** %4
%63 = getelementptr inbounds i8, i8* %62, i64 1
%64 = load i8, i8* %63
%65 = zext i8 %64 to i32
%66 = sub i32 %65, 128
%67 = or i32 %61, %66
%68 = zext i32 %67 to i64
store i64 %68, i64* %3
br label %395
69: ; preds = %49, %43
%70 = load i64, i64* @EILSEQ
store i64 %70, i64* @errno
store i64 0, i64* %3
br label %395
71: ; preds = %38
%72 = load i8*, i8** %4
%73 = load i8, i8* %72
%74 = zext i8 %73 to i32
%75 = icmp ult i32 %74, 240
br i1 %75, label %76, label %123
76: ; preds = %71
%77 = load i8*, i8** %4
%78 = getelementptr inbounds i8, i8* %77, i64 1
%79 = load i8, i8* %78
%80 = zext i8 %79 to i32
%81 = icmp uge i32 %80, 128
br i1 %81, label %82, label %121
82: ; preds = %76
%83 = load i8*, i8** %4
%84 = getelementptr inbounds i8, i8* %83, i64 1
%85 = load i8, i8* %84
%86 = zext i8 %85 to i32
%87 = icmp ult i32 %86, 192
br i1 %87, label %88, label %121
88: ; preds = %82
%89 = load i8*, i8** %4
%90 = getelementptr inbounds i8, i8* %89, i64 2
%91 = load i8, i8* %90
%92 = zext i8 %91 to i32
%93 = icmp uge i32 %92, 128
br i1 %93, label %94, label %121
94: ; preds = %88
%95 = load i8*, i8** %4
%96 = getelementptr inbounds i8, i8* %95, i64 2
%97 = load i8, i8* %96
%98 = zext i8 %97 to i32
%99 = icmp ult i32 %98, 192
br i1 %99, label %100, label %121
100: ; preds = %94
%101 = load i8*, i8** %4
%102 = getelementptr inbounds i8, i8* %101, i64 0
%103 = load i8, i8* %102
%104 = zext i8 %103 to i32
%105 = sub i32 %104, 224
%106 = shl i32 %105, 12
%107 = load i8*, i8** %4
%108 = getelementptr inbounds i8, i8* %107, i64 1
%109 = load i8, i8* %108
%110 = zext i8 %109 to i32
%111 = sub i32 %110, 128
%112 = shl i32 %111, 6
%113 = or i32 %106, %112
%114 = load i8*, i8** %4
%115 = getelementptr inbounds i8, i8* %114, i64 2
%116 = load i8, i8* %115
%117 = zext i8 %116 to i32
%118 = sub i32 %117, 128
%119 = or i32 %113, %118
%120 = zext i32 %119 to i64
store i64 %120, i64* %3
br label %395
121: ; preds = %94, %88, %82, %76
%122 = load i64, i64* @EILSEQ
store i64 %122, i64* @errno
store i64 0, i64* %3
br label %395
123: ; preds = %71
%124 = load i8*, i8** %4
%125 = load i8, i8* %124
%126 = zext i8 %125 to i32
%127 = icmp ult i32 %126, 248
br i1 %127, label %128, label %194
128: ; preds = %123
%129 = load i8*, i8** %4
%130 = getelementptr inbounds i8, i8* %129, i64 1
%131 = load i8, i8* %130
%132 = zext i8 %131 to i32
%133 = icmp uge i32 %132, 128
br i1 %133, label %134, label %192
134: ; preds = %128
%135 = load i8*, i8** %4
%136 = getelementptr inbounds i8, i8* %135, i64 1
%137 = load i8, i8* %136
%138 = zext i8 %137 to i32
%139 = icmp ult i32 %138, 192
br i1 %139, label %140, label %192
140: ; preds = %134
%141 = load i8*, i8** %4
%142 = getelementptr inbounds i8, i8* %141, i64 2
%143 = load i8, i8* %142
%144 = zext i8 %143 to i32
%145 = icmp uge i32 %144, 128
br i1 %145, label %146, label %192
146: ; preds = %140
%147 = load i8*, i8** %4
%148 = getelementptr inbounds i8, i8* %147, i64 2
%149 = load i8, i8* %148
%150 = zext i8 %149 to i32
%151 = icmp ult i32 %150, 192
br i1 %151, label %152, label %192
152: ; preds = %146
%153 = load i8*, i8** %4
%154 = getelementptr inbounds i8, i8* %153, i64 3
%155 = load i8, i8* %154
%156 = zext i8 %155 to i32
%157 = icmp uge i32 %156, 128
br i1 %157, label %158, label %192
158: ; preds = %152
%159 = load i8*, i8** %4
%160 = getelementptr inbounds i8, i8* %159, i64 3
%161 = load i8, i8* %160
%162 = zext i8 %161 to i32
%163 = icmp ult i32 %162, 192
br i1 %163, label %164, label %192
164: ; preds = %158
%165 = load i8*, i8** %4
%166 = getelementptr inbounds i8, i8* %165, i64 0
%167 = load i8, i8* %166
%168 = zext i8 %167 to i32
%169 = sub i32 %168, 240
%170 = shl i32 %169, 18
%171 = load i8*, i8** %4
%172 = getelementptr inbounds i8, i8* %171, i64 1
%173 = load i8, i8* %172
%174 = zext i8 %173 to i32
%175 = sub i32 %174, 128
%176 = shl i32 %175, 12
%177 = or i32 %170, %176
%178 = load i8*, i8** %4
%179 = getelementptr inbounds i8, i8* %178, i64 2
%180 = load i8, i8* %179
%181 = zext i8 %180 to i32
%182 = sub i32 %181, 128
%183 = shl i32 %182, 6
%184 = or i32 %177, %183
%185 = load i8*, i8** %4
%186 = getelementptr inbounds i8, i8* %185, i64 3
%187 = load i8, i8* %186
%188 = zext i8 %187 to i32
%189 = sub i32 %188, 128
%190 = or i32 %184, %189
%191 = zext i32 %190 to i64
store i64 %191, i64* %3
br label %395
192: ; preds = %158, %152, %146, %140, %134, %128
%193 = load i64, i64* @EILSEQ
store i64 %193, i64* @errno
store i64 0, i64* %3
br label %395
194: ; preds = %123
%195 = load i8*, i8** %4
%196 = load i8, i8* %195
%197 = zext i8 %196 to i32
%198 = icmp ult i32 %197, 252
br i1 %198, label %199, label %284
199: ; preds = %194
%200 = load i8*, i8** %4
%201 = getelementptr inbounds i8, i8* %200, i64 1
%202 = load i8, i8* %201
%203 = zext i8 %202 to i32
%204 = icmp uge i32 %203, 128
br i1 %204, label %205, label %282
205: ; preds = %199
%206 = load i8*, i8** %4
%207 = getelementptr inbounds i8, i8* %206, i64 1
%208 = load i8, i8* %207
%209 = zext i8 %208 to i32
%210 = icmp ult i32 %209, 192
br i1 %210, label %211, label %282
211: ; preds = %205
%212 = load i8*, i8** %4
%213 = getelementptr inbounds i8, i8* %212, i64 2
%214 = load i8, i8* %213
%215 = zext i8 %214 to i32
%216 = icmp uge i32 %215, 128
br i1 %216, label %217, label %282
217: ; preds = %211
%218 = load i8*, i8** %4
%219 = getelementptr inbounds i8, i8* %218, i64 2
%220 = load i8, i8* %219
%221 = zext i8 %220 to i32
%222 = icmp ult i32 %221, 192
br i1 %222, label %223, label %282
223: ; preds = %217
%224 = load i8*, i8** %4
%225 = getelementptr inbounds i8, i8* %224, i64 3
%226 = load i8, i8* %225
%227 = zext i8 %226 to i32
%228 = icmp uge i32 %227, 128
br i1 %228, label %229, label %282
229: ; preds = %223
%230 = load i8*, i8** %4
%231 = getelementptr inbounds i8, i8* %230, i64 3
%232 = load i8, i8* %231
%233 = zext i8 %232 to i32
%234 = icmp ult i32 %233, 192
br i1 %234, label %235, label %282
235: ; preds = %229
%236 = load i8*, i8** %4
%237 = getelementptr inbounds i8, i8* %236, i64 4
%238 = load i8, i8* %237
%239 = zext i8 %238 to i32
%240 = icmp uge i32 %239, 128
br i1 %240, label %241, label %282
241: ; preds = %235
%242 = load i8*, i8** %4
%243 = getelementptr inbounds i8, i8* %242, i64 4
%244 = load i8, i8* %243
%245 = zext i8 %244 to i32
%246 = icmp ult i32 %245, 192
br i1 %246, label %247, label %282
247: ; preds = %241
%248 = load i8*, i8** %4
%249 = getelementptr inbounds i8, i8* %248, i64 0
%250 = load i8, i8* %249
%251 = zext i8 %250 to i32
%252 = sub i32 %251, 248
%253 = shl i32 %252, 24
%254 = load i8*, i8** %4
%255 = getelementptr inbounds i8, i8* %254, i64 1
%256 = load i8, i8* %255
%257 = zext i8 %256 to i32
%258 = sub i32 %257, 128
%259 = shl i32 %258, 18
%260 = or i32 %253, %259
%261 = load i8*, i8** %4
%262 = getelementptr inbounds i8, i8* %261, i64 2
%263 = load i8, i8* %262
%264 = zext i8 %263 to i32
%265 = sub i32 %264, 128
%266 = shl i32 %265, 12
%267 = or i32 %260, %266
%268 = load i8*, i8** %4
%269 = getelementptr inbounds i8, i8* %268, i64 3
%270 = load i8, i8* %269
%271 = zext i8 %270 to i32
%272 = sub i32 %271, 128
%273 = shl i32 %272, 6
%274 = or i32 %267, %273
%275 = load i8*, i8** %4
%276 = getelementptr inbounds i8, i8* %275, i64 4
%277 = load i8, i8* %276
%278 = zext i8 %277 to i32
%279 = sub i32 %278, 128
%280 = or i32 %274, %279
%281 = zext i32 %280 to i64
store i64 %281, i64* %3
br label %395
282: ; preds = %241, %235, %229, %223, %217, %211, %205, %199
%283 = load i64, i64* @EILSEQ
store i64 %283, i64* @errno
store i64 0, i64* %3
br label %395
284: ; preds = %194
%285 = load i8*, i8** %4
%286 = load i8, i8* %285
%287 = zext i8 %286 to i32
%288 = icmp ult i32 %287, 254
br i1 %288, label %289, label %393
289: ; preds = %284
%290 = load i8*, i8** %4
%291 = getelementptr inbounds i8, i8* %290, i64 1
%292 = load i8, i8* %291
%293 = zext i8 %292 to i32
%294 = icmp uge i32 %293, 128
br i1 %294, label %295, label %391
295: ; preds = %289
%296 = load i8*, i8** %4
%297 = getelementptr inbounds i8, i8* %296, i64 1
%298 = load i8, i8* %297
%299 = zext i8 %298 to i32
%300 = icmp ult i32 %299, 192
br i1 %300, label %301, label %391
301: ; preds = %295
%302 = load i8*, i8** %4
%303 = getelementptr inbounds i8, i8* %302, i64 2
%304 = load i8, i8* %303
%305 = zext i8 %304 to i32
%306 = icmp uge i32 %305, 128
br i1 %306, label %307, label %391
307: ; preds = %301
%308 = load i8*, i8** %4
%309 = getelementptr inbounds i8, i8* %308, i64 2
%310 = load i8, i8* %309
%311 = zext i8 %310 to i32
%312 = icmp ult i32 %311, 192
br i1 %312, label %313, label %391
313: ; preds = %307
%314 = load i8*, i8** %4
%315 = getelementptr inbounds i8, i8* %314, i64 3
%316 = load i8, i8* %315
%317 = zext i8 %316 to i32
%318 = icmp uge i32 %317, 128
br i1 %318, label %319, label %391
319: ; preds = %313
%320 = load i8*, i8** %4
%321 = getelementptr inbounds i8, i8* %320, i64 3
%322 = load i8, i8* %321
%323 = zext i8 %322 to i32
%324 = icmp ult i32 %323, 192
br i1 %324, label %325, label %391
325: ; preds = %319
%326 = load i8*, i8** %4
%327 = getelementptr inbounds i8, i8* %326, i64 4
%328 = load i8, i8* %327
%329 = zext i8 %328 to i32
%330 = icmp uge i32 %329, 128
br i1 %330, label %331, label %391
331: ; preds = %325
%332 = load i8*, i8** %4
%333 = getelementptr inbounds i8, i8* %332, i64 4
%334 = load i8, i8* %333
%335 = zext i8 %334 to i32
%336 = icmp ult i32 %335, 192
br i1 %336, label %337, label %391
337: ; preds = %331
%338 = load i8*, i8** %4
%339 = getelementptr inbounds i8, i8* %338, i64 5
%340 = load i8, i8* %339
%341 = zext i8 %340 to i32
%342 = icmp uge i32 %341, 128
br i1 %342, label %343, label %391
343: ; preds = %337
%344 = load i8*, i8** %4
%345 = getelementptr inbounds i8, i8* %344, i64 5
%346 = load i8, i8* %345
%347 = zext i8 %346 to i32
%348 = icmp ult i32 %347, 192
br i1 %348, label %349, label %391
349: ; preds = %343
%350 = load i8*, i8** %4
%351 = getelementptr inbounds i8, i8* %350, i64 0
%352 = load i8, i8* %351
%353 = zext i8 %352 to i32
%354 = sub i32 %353, 252
%355 = shl i32 %354, 30
%356 = load i8*, i8** %4
%357 = getelementptr inbounds i8, i8* %356, i64 1
%358 = load i8, i8* %357
%359 = zext i8 %358 to i32
%360 = sub i32 %359, 128
%361 = shl i32 %360, 24
%362 = or i32 %355, %361
%363 = load i8*, i8** %4
%364 = getelementptr inbounds i8, i8* %363, i64 2
%365 = load i8, i8* %364
%366 = zext i8 %365 to i32
%367 = sub i32 %366, 128
%368 = shl i32 %367, 18
%369 = or i32 %362, %368
%370 = load i8*, i8** %4
%371 = getelementptr inbounds i8, i8* %370, i64 3
%372 = load i8, i8* %371
%373 = zext i8 %372 to i32
%374 = sub i32 %373, 128
%375 = shl i32 %374, 12
%376 = or i32 %369, %375
%377 = load i8*, i8** %4
%378 = getelementptr inbounds i8, i8* %377, i64 4
%379 = load i8, i8* %378
%380 = zext i8 %379 to i32
%381 = sub i32 %380, 128
%382 = shl i32 %381, 6
%383 = or i32 %376, %382
%384 = load i8*, i8** %4
%385 = getelementptr inbounds i8, i8* %384, i64 5
%386 = load i8, i8* %385
%387 = zext i8 %386 to i32
%388 = sub i32 %387, 128
%389 = or i32 %383, %388
%390 = zext i32 %389 to i64
store i64 %390, i64* %3
br label %395
391: ; preds = %343, %337, %331, %325, %319, %313, %307, %301, %295, %289
%392 = load i64, i64* @EILSEQ
store i64 %392, i64* @errno
store i64 0, i64* %3
br label %395
393: ; preds = %284
%394 = load i64, i64* @EILSEQ
store i64 %394, i64* @errno
store i64 0, i64* %3
br label %395
395: ; preds = %393, %391, %349, %282, %247, %192, %164, %121, %100, %69, %55, %36, %30, %15, %8
%396 = load i64, i64* %3
ret i64 %396
}

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