#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 */
typedef int uint8_t;
typedef int uint32_t;

/* Variables and functions */
int get16le(int const *);
int get32le(int const *);
int /*<<< orphan*/ *strchr(char *, char);
scalar_t__ strcmp(char *, char *);
int /*<<< orphan*/ sys_error(char *);
void parse_sfo_content(const uint8_t *sfo, uint32_t sfo_size, char *category,
                       char *title, char *content, char *min_version,
                       char *pkg_version) {
  if (get32le(sfo) != 0x46535000) {
    sys_error("ERROR: incorrect sfo signature\n");
  }
  uint32_t keys = get32le(sfo + 8);
  uint32_t values = get32le(sfo + 12);
  uint32_t count = get32le(sfo + 16);
  int title_index = -1;
  int content_index = -1;
  int category_index = -1;
  int minver_index = -1;
  int pkgver_index = -1;
  for (uint32_t i = 0; i < count; i++) {
    if (i * 16 + 20 + 2 > sfo_size) {
      sys_error("ERROR: sfo information is too small\n");
    }
    char *key = (char *)sfo + keys + get16le(sfo + i * 16 + 20);
    if (strcmp(key, "TITLE") == 0) {
      if (title_index < 0) {
        title_index = (int)i;
      }
    } else if (strcmp(key, "STITLE") == 0) {
      title_index = (int)i;
    } else if (strcmp(key, "CONTENT_ID") == 0) {
      content_index = (int)i;
    } else if (strcmp(key, "CATEGORY") == 0) {
      category_index = (int)i;
    } else if (strcmp(key, "PSP2_DISP_VER") == 0) {
      minver_index = (int)i;
    } else if (strcmp(key, "APP_VER") == 0) {
      pkgver_index = (int)i;
    }
  }
  if (title_index < 0) {
    sys_error(
        "ERROR: cannot find title from sfo file, pkg is probably corrupted\n");
  }
  char *value =
      (char *)sfo + values + get32le(sfo + title_index * 16 + 20 + 12);
  size_t i;
  size_t max = 255;
  for (i = 0; i < max && *value; i++, value++) {
    if ((*value >= 32 && *value < 127 &&
         strchr("<>\"/\\|?*", *value) == NULL) ||
        (uint8_t)*value >= 128) {
      if (*value == ':') {
        *title++ = ' ';
        *title++ = '-';
        max--;
      } else {
        *title++ = *value;
      }
    } else if (*value == 10) {
      *title++ = ' ';
    }
  }
  *title = 0;
  if (content_index >= 0 && content) {
    value = (char *)sfo + values + get32le(sfo + content_index * 16 + 20 + 12);
    while (*value) {
      *content++ = *value++;
    }
    *content = 0;
  }
  if (category_index >= 0) {
    value = (char *)sfo + values + get32le(sfo + category_index * 16 + 20 + 12);
    while (*value) {
      *category++ = *value++;
    }
  }
  *category = 0;
  if (minver_index >= 0 && min_version) {
    value = (char *)sfo + values + get32le(sfo + minver_index * 16 + 20 + 12);
    if (*value == '0') {
      value++;
    }
    while (*value) {
      *min_version++ = *value++;
    }
    if (min_version[-1] == '0') {
      min_version[-1] = 0;
    } else {
      *min_version = 0;
    }
  }
  if (pkgver_index >= 0 && pkg_version) {
    value = (char *)sfo + values + get32le(sfo + pkgver_index * 16 + 20 + 12);
    if (*value == '0') {
      value++;
    }
    while (*value) {
      *pkg_version++ = *value++;
    }
    *pkg_version = 0;
  }
}


x86 assembly (clang, -O0):
<parse_sfo_content>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x8(%rbp),%rdi
call   1040 <get32le@plt>
cmp    $0x46535000,%eax
je     1196 <parse_sfo_content+0x46>
lea    0xe6f(%rip),%rdi
call   1060 <sys_error@plt>
mov    -0x8(%rbp),%rdi
add    $0x20,%rdi
call   1040 <get32le@plt>
mov    %eax,-0x34(%rbp)
mov    -0x8(%rbp),%rdi
add    $0x30,%rdi
call   1040 <get32le@plt>
mov    %eax,-0x38(%rbp)
mov    -0x8(%rbp),%rdi
add    $0x40,%rdi
call   1040 <get32le@plt>
mov    %eax,-0x3c(%rbp)
movl   $0xffffffff,-0x40(%rbp)
movl   $0xffffffff,-0x44(%rbp)
movl   $0xffffffff,-0x48(%rbp)
movl   $0xffffffff,-0x4c(%rbp)
movl   $0xffffffff,-0x50(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jge    1367 <parse_sfo_content+0x217>
mov    -0x54(%rbp),%eax
shl    $0x4,%eax
add    $0x14,%eax
add    $0x2,%eax
cmp    -0xc(%rbp),%eax
jle    121d <parse_sfo_content+0xcd>
lea    0xe08(%rip),%rdi
call   1060 <sys_error@plt>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x80(%rbp)
mov    -0x8(%rbp),%rdi
mov    -0x54(%rbp),%eax
shl    $0x4,%eax
cltq
shl    $0x2,%rax
add    %rax,%rdi
add    $0x50,%rdi
call   1070 <get16le@plt>
mov    %eax,%ecx
mov    -0x80(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x60(%rbp),%rdi
lea    0xde3(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    1287 <parse_sfo_content+0x137>
cmpl   $0x0,-0x40(%rbp)
jge    1282 <parse_sfo_content+0x132>
mov    -0x54(%rbp),%eax
mov    %eax,-0x40(%rbp)
jmp    1354 <parse_sfo_content+0x204>
mov    -0x60(%rbp),%rdi
lea    0xdb3(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    12ac <parse_sfo_content+0x15c>
mov    -0x54(%rbp),%eax
mov    %eax,-0x40(%rbp)
jmp    134f <parse_sfo_content+0x1ff>
mov    -0x60(%rbp),%rdi
lea    0xd95(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    12d1 <parse_sfo_content+0x181>
mov    -0x54(%rbp),%eax
mov    %eax,-0x44(%rbp)
jmp    134a <parse_sfo_content+0x1fa>
mov    -0x60(%rbp),%rdi
lea    0xd7b(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    12f6 <parse_sfo_content+0x1a6>
mov    -0x54(%rbp),%eax
mov    %eax,-0x48(%rbp)
jmp    1345 <parse_sfo_content+0x1f5>
mov    -0x60(%rbp),%rdi
lea    0xd5f(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    131b <parse_sfo_content+0x1cb>
mov    -0x54(%rbp),%eax
mov    %eax,-0x4c(%rbp)
jmp    1340 <parse_sfo_content+0x1f0>
mov    -0x60(%rbp),%rdi
lea    0xd48(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    133b <parse_sfo_content+0x1eb>
mov    -0x54(%rbp),%eax
mov    %eax,-0x50(%rbp)
jmp    1340 <parse_sfo_content+0x1f0>
jmp    1345 <parse_sfo_content+0x1f5>
jmp    134a <parse_sfo_content+0x1fa>
jmp    134f <parse_sfo_content+0x1ff>
jmp    1354 <parse_sfo_content+0x204>
jmp    1359 <parse_sfo_content+0x209>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    11f0 <parse_sfo_content+0xa0>
cmpl   $0x0,-0x40(%rbp)
jge    137d <parse_sfo_content+0x22d>
lea    0xcfe(%rip),%rdi
call   1060 <sys_error@plt>
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x88(%rbp)
mov    -0x8(%rbp),%rdi
mov    -0x40(%rbp),%eax
shl    $0x4,%eax
cltq
shl    $0x2,%rax
add    %rax,%rdi
add    $0x50,%rdi
add    $0x30,%rdi
call   1040 <get32le@plt>
mov    %eax,%ecx
mov    -0x88(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
movq   $0xff,-0x78(%rbp)
movq   $0x0,-0x70(%rbp)
mov    -0x70(%rbp),%rcx
xor    %eax,%eax
cmp    -0x78(%rbp),%rcx
mov    %al,-0x89(%rbp)
jae    13fb <parse_sfo_content+0x2ab>
mov    -0x68(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x89(%rbp)
mov    -0x89(%rbp),%al
test   $0x1,%al
jne    140e <parse_sfo_content+0x2be>
jmp    1507 <parse_sfo_content+0x3b7>
mov    -0x68(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
jl     144b <parse_sfo_content+0x2fb>
mov    -0x68(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7f,%eax
jge    144b <parse_sfo_content+0x2fb>
mov    -0x68(%rbp),%rax
lea    0xc80(%rip),%rdi
movsbl (%rax),%esi
call   1030 <strchr@plt>
cmp    $0x0,%rax
je     145d <parse_sfo_content+0x30d>
mov    -0x68(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x80,%eax
jl     14be <parse_sfo_content+0x36e>
mov    -0x68(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3a,%eax
jne    14a2 <parse_sfo_content+0x352>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x20,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x2d,(%rax)
mov    -0x78(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x78(%rbp)
jmp    14b9 <parse_sfo_content+0x369>
mov    -0x68(%rbp),%rax
mov    (%rax),%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
jmp    14e5 <parse_sfo_content+0x395>
mov    -0x68(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
jne    14e0 <parse_sfo_content+0x390>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x20,(%rax)
jmp    14e5 <parse_sfo_content+0x395>
jmp    14ea <parse_sfo_content+0x39a>
mov    -0x70(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x70(%rbp)
mov    -0x68(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x68(%rbp)
jmp    13d2 <parse_sfo_content+0x282>
mov    -0x20(%rbp),%rax
movb   $0x0,(%rax)
cmpl   $0x0,-0x44(%rbp)
jl     15a3 <parse_sfo_content+0x453>
cmpq   $0x0,-0x28(%rbp)
je     15a3 <parse_sfo_content+0x453>
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x98(%rbp)
mov    -0x8(%rbp),%rdi
mov    -0x44(%rbp),%eax
shl    $0x4,%eax
cltq
shl    $0x2,%rax
add    %rax,%rdi
add    $0x50,%rdi
add    $0x30,%rdi
call   1040 <get32le@plt>
mov    %eax,%ecx
mov    -0x98(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x68(%rbp),%rax
cmpb   $0x0,(%rax)
je     159c <parse_sfo_content+0x44c>
mov    -0x68(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x68(%rbp)
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
jmp    1568 <parse_sfo_content+0x418>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
cmpl   $0x0,-0x48(%rbp)
jl     162b <parse_sfo_content+0x4db>
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0xa0(%rbp)
mov    -0x8(%rbp),%rdi
mov    -0x48(%rbp),%eax
shl    $0x4,%eax
cltq
shl    $0x2,%rax
add    %rax,%rdi
add    $0x50,%rdi
add    $0x30,%rdi
call   1040 <get32le@plt>
mov    %eax,%ecx
mov    -0xa0(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x68(%rbp),%rax
cmpb   $0x0,(%rax)
je     1626 <parse_sfo_content+0x4d6>
mov    -0x68(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x68(%rbp)
mov    (%rax),%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
jmp    15f2 <parse_sfo_content+0x4a2>
jmp    162b <parse_sfo_content+0x4db>
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
cmpl   $0x0,-0x4c(%rbp)
jl     170b <parse_sfo_content+0x5bb>
cmpq   $0x0,-0x30(%rbp)
je     170b <parse_sfo_content+0x5bb>
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0xa8(%rbp)
mov    -0x8(%rbp),%rdi
mov    -0x4c(%rbp),%eax
shl    $0x4,%eax
cltq
shl    $0x2,%rax
add    %rax,%rdi
add    $0x50,%rdi
add    $0x30,%rdi
call   1040 <get32le@plt>
mov    %eax,%ecx
mov    -0xa8(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x68(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    16a8 <parse_sfo_content+0x558>
mov    -0x68(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x68(%rbp)
jmp    16ad <parse_sfo_content+0x55d>
mov    -0x68(%rbp),%rax
cmpb   $0x0,(%rax)
je     16e1 <parse_sfo_content+0x591>
mov    -0x68(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x68(%rbp)
mov    (%rax),%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
jmp    16ad <parse_sfo_content+0x55d>
mov    -0x30(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x30,%eax
jne    16ff <parse_sfo_content+0x5af>
mov    -0x30(%rbp),%rax
movb   $0x0,-0x1(%rax)
jmp    1706 <parse_sfo_content+0x5b6>
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
jmp    170b <parse_sfo_content+0x5bb>
cmpl   $0x0,-0x50(%rbp)
jl     17c1 <parse_sfo_content+0x671>
cmpq   $0x0,0x10(%rbp)
je     17c1 <parse_sfo_content+0x671>
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0xb0(%rbp)
mov    -0x8(%rbp),%rdi
mov    -0x50(%rbp),%eax
shl    $0x4,%eax
cltq
shl    $0x2,%rax
add    %rax,%rdi
add    $0x50,%rdi
add    $0x30,%rdi
call   1040 <get32le@plt>
mov    %eax,%ecx
mov    -0xb0(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x68(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    1781 <parse_sfo_content+0x631>
mov    -0x68(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x68(%rbp)
jmp    1786 <parse_sfo_content+0x636>
mov    -0x68(%rbp),%rax
cmpb   $0x0,(%rax)
je     17ba <parse_sfo_content+0x66a>
mov    -0x68(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x68(%rbp)
mov    (%rax),%cl
mov    0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,0x10(%rbp)
mov    %cl,(%rax)
jmp    1786 <parse_sfo_content+0x636>
mov    0x10(%rbp),%rax
movb   $0x0,(%rax)
add    $0xb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<parse_sfo_content>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %r9,0x48(%rsp)
mov    %r8,0x38(%rsp)
mov    %rcx,0x40(%rsp)
mov    %rdx,%r13
mov    %esi,0x2c(%rsp)
mov    %rdi,%r12
call   1040 <get32le@plt>
cmp    $0x46535000,%eax
je     118f <parse_sfo_content+0x3f>
lea    0xe76(%rip),%rdi
call   1060 <sys_error@plt>
lea    0x20(%r12),%rdi
call   1040 <get32le@plt>
mov    %eax,%r14d
lea    0x30(%r12),%rdi
call   1040 <get32le@plt>
mov    %eax,%ebp
lea    0x40(%r12),%rdi
call   1040 <get32le@plt>
test   %eax,%eax
mov    %r12,0x30(%rsp)
jle    131e <parse_sfo_content+0x1ce>
mov    %ebp,0x28(%rsp)
movslq %r14d,%rcx
add    %r12,%rcx
mov    %rcx,0x18(%rsp)
mov    %eax,%eax
mov    %rax,0x20(%rsp)
lea    0x50(%r12),%rax
mov    %rax,0x50(%rsp)
movl   $0xffffffff,0x8(%rsp)
ff
xor    %ebp,%ebp
xor    %r15d,%r15d
movl   $0xffffffff,0xc(%rsp)
ff
movl   $0xffffffff,0x10(%rsp)
ff
movl   $0xffffffff,0x14(%rsp)
ff
mov    $0xffffffff,%ebx
mov    0x2c(%rsp),%r12d
jmp    1228 <parse_sfo_content+0xd8>
test   %ebx,%ebx
cmovs  %r15d,%ebx
add    $0x1,%r15
add    $0x10,%ebp
cmp    %r15,0x20(%rsp)
je     130f <parse_sfo_content+0x1bf>
lea    0x16(%rbp),%eax
cmp    %r12d,%eax
jle    123c <parse_sfo_content+0xec>
lea    0xde9(%rip),%rdi
call   1060 <sys_error@plt>
mov    %ebp,%eax
mov    0x50(%rsp),%rcx
lea    (%rcx,%rax,4),%rdi
call   1070 <get16le@plt>
movslq %eax,%r14
add    0x18(%rsp),%r14
mov    %r14,%rdi
lea    0xde8(%rip),%rsi
call   1050 <strcmp@plt>
test   %rax,%rax
je     1210 <parse_sfo_content+0xc0>
mov    %r14,%rdi
lea    0xdd3(%rip),%rsi
call   1050 <strcmp@plt>
test   %rax,%rax
je     12e0 <parse_sfo_content+0x190>
mov    %r14,%rdi
lea    0xdc6(%rip),%rsi
call   1050 <strcmp@plt>
test   %rax,%rax
je     12e8 <parse_sfo_content+0x198>
mov    %r14,%rdi
lea    0xdbd(%rip),%rsi
call   1050 <strcmp@plt>
test   %rax,%rax
je     12f5 <parse_sfo_content+0x1a5>
mov    %r14,%rdi
lea    0xdb2(%rip),%rsi
call   1050 <strcmp@plt>
test   %rax,%rax
je     1302 <parse_sfo_content+0x1b2>
mov    %r14,%rdi
lea    0xdac(%rip),%rsi
call   1050 <strcmp@plt>
test   %rax,%rax
mov    0x8(%rsp),%eax
cmove  %r15d,%eax
mov    %eax,0x8(%rsp)
jmp    1216 <parse_sfo_content+0xc6>
nopl   0x0(%rax,%rax,1)
mov    %r15d,%ebx
jmp    1216 <parse_sfo_content+0xc6>
mov    %r15d,%eax
mov    %r15d,0x14(%rsp)
jmp    1216 <parse_sfo_content+0xc6>
mov    %r15d,%eax
mov    %r15d,0x10(%rsp)
jmp    1216 <parse_sfo_content+0xc6>
mov    %r15d,%eax
mov    %r15d,0xc(%rsp)
jmp    1216 <parse_sfo_content+0xc6>
test   %ebx,%ebx
mov    0x30(%rsp),%r12
mov    0x28(%rsp),%ebp
jns    134f <parse_sfo_content+0x1ff>
jmp    1343 <parse_sfo_content+0x1f3>
movl   $0xffffffff,0x8(%rsp)
ff
movl   $0xffffffff,0xc(%rsp)
ff
movl   $0xffffffff,0x10(%rsp)
ff
movl   $0xffffffff,0x14(%rsp)
ff
mov    $0xffffffff,%ebx
lea    0xd2c(%rip),%rdi
call   1060 <sys_error@plt>
mov    0x90(%rsp),%r15
movslq %ebp,%rbp
lea    (%r12,%rbp,1),%rax
mov    %rax,0x20(%rsp)
shl    $0x4,%ebx
movslq %ebx,%rax
lea    (%r12,%rax,4),%rdi
add    $0x80,%rdi
call   1040 <get32le@plt>
movslq %eax,%rbx
mov    %rbp,0x18(%rsp)
add    %rbp,%rbx
add    %r12,%rbx
mov    $0xff,%ebp
xor    %r14d,%r14d
mov    0x40(%rsp),%r12
jmp    13ad <parse_sfo_content+0x25d>
mov    %cl,(%r12)
nopw   0x0(%rax,%rax,1)
add    $0x1,%r12
add    $0x1,%r14
cmp    %rbp,%r14
jae    13f8 <parse_sfo_content+0x2a8>
movzbl (%rbx,%r14,1),%ecx
test   %cl,%cl
je     13f8 <parse_sfo_content+0x2a8>
lea    -0x7f(%rcx),%eax
cmp    $0xa1,%al
jb     13d6 <parse_sfo_content+0x286>
movsbl %cl,%esi
lea    0xcf2(%rip),%rdi
call   1030 <strchr@plt>
movzbl (%rbx,%r14,1),%ecx
test   %rax,%rax
je     13e2 <parse_sfo_content+0x292>
cmp    $0xa,%cl
jne    13a4 <parse_sfo_content+0x254>
movb   $0x20,(%r12)
jmp    13a0 <parse_sfo_content+0x250>
cmp    $0x3a,%cl
jne    1396 <parse_sfo_content+0x246>
movw   $0x2d20,(%r12)
add    $0x2,%r12
add    $0xffffffffffffffff,%rbp
jmp    13a4 <parse_sfo_content+0x254>
movb   $0x0,(%r12)
mov    0x38(%rsp),%rbp
test   %rbp,%rbp
mov    0x30(%rsp),%r14
mov    0x48(%rsp),%rbx
mov    0x14(%rsp),%eax
mov    0x20(%rsp),%r12
je     1466 <parse_sfo_content+0x316>
test   %eax,%eax
js     1466 <parse_sfo_content+0x316>
shl    $0x4,%eax
cltq
lea    (%r14,%rax,4),%rdi
add    $0x80,%rdi
call   1040 <get32le@plt>
movslq %eax,%rcx
mov    (%r12,%rcx,1),%al
test   %al,%al
je     1462 <parse_sfo_content+0x312>
add    0x18(%rsp),%rcx
add    %r14,%rcx
add    $0x1,%rcx
nopw   0x0(%rax,%rax,1)
mov    %al,0x0(%rbp)
add    $0x1,%rbp
movzbl (%rcx),%eax
add    $0x1,%rcx
test   %al,%al
jne    1450 <parse_sfo_content+0x300>
movb   $0x0,0x0(%rbp)
mov    0x10(%rsp),%eax
test   %eax,%eax
js     14b3 <parse_sfo_content+0x363>
shl    $0x4,%eax
cltq
lea    (%r14,%rax,4),%rdi
add    $0x80,%rdi
call   1040 <get32le@plt>
movslq %eax,%rcx
mov    (%r12,%rcx,1),%al
test   %al,%al
je     14b3 <parse_sfo_content+0x363>
add    0x18(%rsp),%rcx
add    %r14,%rcx
add    $0x1,%rcx
nopw   0x0(%rax,%rax,1)
mov    %al,0x0(%r13)
add    $0x1,%r13
movzbl (%rcx),%eax
add    $0x1,%rcx
test   %al,%al
jne    14a0 <parse_sfo_content+0x350>
movb   $0x0,0x0(%r13)
test   %rbx,%rbx
mov    0xc(%rsp),%eax
je     1530 <parse_sfo_content+0x3e0>
test   %eax,%eax
js     1530 <parse_sfo_content+0x3e0>
shl    $0x4,%eax
cltq
lea    (%r14,%rax,4),%rdi
add    $0x80,%rdi
call   1040 <get32le@plt>
movslq %eax,%rcx
xor    %edx,%edx
cmpb   $0x30,(%r12,%rcx,1)
lea    (%r12,%rcx,1),%rax
sete   %dl
mov    (%rdx,%rax,1),%al
test   %al,%al
je     1521 <parse_sfo_content+0x3d1>
add    0x18(%rsp),%rcx
add    %rdx,%rcx
add    %r14,%rcx
add    $0x1,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %al,(%rbx)
add    $0x1,%rbx
movzbl (%rcx),%eax
add    $0x1,%rcx
test   %al,%al
jne    1510 <parse_sfo_content+0x3c0>
cmpb   $0x30,-0x1(%rbx)
lea    -0x1(%rbx),%rax
cmovne %rbx,%rax
movb   $0x0,(%rax)
test   %r15,%r15
mov    0x8(%rsp),%eax
je     1596 <parse_sfo_content+0x446>
test   %eax,%eax
js     1596 <parse_sfo_content+0x446>
shl    $0x4,%eax
cltq
lea    (%r14,%rax,4),%rdi
add    $0x80,%rdi
call   1040 <get32le@plt>
movslq %eax,%rcx
xor    %edx,%edx
cmpb   $0x30,(%r12,%rcx,1)
lea    (%r12,%rcx,1),%rax
sete   %dl
mov    (%rdx,%rax,1),%al
test   %al,%al
je     1592 <parse_sfo_content+0x442>
add    0x18(%rsp),%rcx
add    %rdx,%rcx
add    %r14,%rcx
add    $0x1,%rcx
nopl   0x0(%rax)
mov    %al,(%r15)
add    $0x1,%r15
movzbl (%rcx),%eax
add    $0x1,%rcx
test   %al,%al
jne    1580 <parse_sfo_content+0x430>
movb   $0x0,(%r15)
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [32 x i8] c"ERROR: incorrect sfo signature\0A\00"
@.str.1 = [37 x i8] c"ERROR: sfo information is too small\0A\00"
@.str.2 = [6 x i8] c"TITLE\00"
@.str.3 = [7 x i8] c"STITLE\00"
@.str.4 = [11 x i8] c"CONTENT_ID\00"
@.str.5 = [9 x i8] c"CATEGORY\00"
@.str.6 = [14 x i8] c"PSP2_DISP_VER\00"
@.str.7 = [8 x i8] c"APP_VER\00"
@.str.8 = [67 x i8] c"ERROR: cannot find title from sfo file, pkg is probably corrupted\0A\00"
@.str.9 = [9 x i8] c"<>\22/\\|?*\00"
define void @parse_sfo_content(i32* %0, i32 %1, i8* nocapture writeonly %2, i8* nocapture writeonly %3, i8* writeonly %4, i8* %5, i8* writeonly %6) {
%8 = tail call i32 @get32le(i32* %0)
%9 = icmp eq i32 %8, 1179865088
br i1 %9, label %12, label %10
10: ; preds = %7
%11 = tail call i32 @sys_error(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str, i64 0, i64 0))
br label %12
12: ; preds = %10, %7
%13 = getelementptr inbounds i32, i32* %0, i64 8
%14 = tail call i32 @get32le(i32* %13)
%15 = getelementptr inbounds i32, i32* %0, i64 12
%16 = tail call i32 @get32le(i32* %15)
%17 = getelementptr inbounds i32, i32* %0, i64 16
%18 = tail call i32 @get32le(i32* %17)
%19 = icmp sgt i32 %18, 0
br i1 %19, label %20, label %76
20: ; preds = %12
%21 = bitcast i32* %0 to i8*
%22 = sext i32 %14 to i64
%23 = getelementptr inbounds i8, i8* %21, i64 %22
%24 = zext i32 %18 to i64
%25 = getelementptr inbounds i32, i32* %0, i64 20
br label %28
26: ; preds = %68
%27 = icmp slt i32 %69, 0
br i1 %27, label %76, label %83
28: ; preds = %20, %68
%29 = phi i64 [ 0, %20 ], [ %74, %68 ]
%30 = phi i32 [ -1, %20 ], [ %73, %68 ]
%31 = phi i32 [ -1, %20 ], [ %72, %68 ]
%32 = phi i32 [ -1, %20 ], [ %71, %68 ]
%33 = phi i32 [ -1, %20 ], [ %70, %68 ]
%34 = phi i32 [ -1, %20 ], [ %69, %68 ]
%35 = trunc i64 %29 to i32
%36 = shl nsw i32 %35, 4
%37 = add nuw nsw i32 %36, 22
%38 = icmp sgt i32 %37, %1
br i1 %38, label %39, label %41
39: ; preds = %28
%40 = tail call i32 @sys_error(i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str.1, i64 0, i64 0))
br label %41
41: ; preds = %39, %28
%42 = zext i32 %36 to i64
%43 = getelementptr inbounds i32, i32* %25, i64 %42
%44 = tail call i32 @get16le(i32* %43)
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %23, i64 %45
%47 = tail call i64 @strcmp(i8* %46, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i64 0, i64 0))
%48 = icmp eq i64 %47, 0
br i1 %48, label %49, label %52
49: ; preds = %41
%50 = icmp slt i32 %34, 0
%51 = select i1 %50, i32 %35, i32 %34
br label %68
52: ; preds = %41
%53 = tail call i64 @strcmp(i8* %46, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.3, i64 0, i64 0))
%54 = icmp eq i64 %53, 0
br i1 %54, label %68, label %55
55: ; preds = %52
%56 = tail call i64 @strcmp(i8* %46, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i64 0, i64 0))
%57 = icmp eq i64 %56, 0
br i1 %57, label %68, label %58
58: ; preds = %55
%59 = tail call i64 @strcmp(i8* %46, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.5, i64 0, i64 0))
%60 = icmp eq i64 %59, 0
br i1 %60, label %68, label %61
61: ; preds = %58
%62 = tail call i64 @strcmp(i8* %46, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.6, i64 0, i64 0))
%63 = icmp eq i64 %62, 0
br i1 %63, label %68, label %64
64: ; preds = %61
%65 = tail call i64 @strcmp(i8* %46, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.7, i64 0, i64 0))
%66 = icmp eq i64 %65, 0
%67 = select i1 %66, i32 %35, i32 %30
br label %68
68: ; preds = %64, %49, %61, %58, %55, %52
%69 = phi i32 [ %51, %49 ], [ %35, %52 ], [ %34, %55 ], [ %34, %58 ], [ %34, %61 ], [ %34, %64 ]
%70 = phi i32 [ %33, %49 ], [ %33, %52 ], [ %35, %55 ], [ %33, %58 ], [ %33, %61 ], [ %33, %64 ]
%71 = phi i32 [ %32, %49 ], [ %32, %52 ], [ %32, %55 ], [ %35, %58 ], [ %32, %61 ], [ %32, %64 ]
%72 = phi i32 [ %31, %49 ], [ %31, %52 ], [ %31, %55 ], [ %31, %58 ], [ %35, %61 ], [ %31, %64 ]
%73 = phi i32 [ %30, %49 ], [ %30, %52 ], [ %30, %55 ], [ %30, %58 ], [ %30, %61 ], [ %67, %64 ]
%74 = add nuw nsw i64 %29, 1
%75 = icmp eq i64 %74, %24
br i1 %75, label %26, label %28
76: ; preds = %12, %26
%77 = phi i32 [ %73, %26 ], [ -1, %12 ]
%78 = phi i32 [ %72, %26 ], [ -1, %12 ]
%79 = phi i32 [ %71, %26 ], [ -1, %12 ]
%80 = phi i32 [ %70, %26 ], [ -1, %12 ]
%81 = phi i32 [ %69, %26 ], [ -1, %12 ]
%82 = tail call i32 @sys_error(i8* getelementptr inbounds ([67 x i8], [67 x i8]* @.str.8, i64 0, i64 0))
br label %83
83: ; preds = %76, %26
%84 = phi i32 [ %77, %76 ], [ %73, %26 ]
%85 = phi i32 [ %78, %76 ], [ %72, %26 ]
%86 = phi i32 [ %79, %76 ], [ %71, %26 ]
%87 = phi i32 [ %80, %76 ], [ %70, %26 ]
%88 = phi i32 [ %81, %76 ], [ %69, %26 ]
%89 = bitcast i32* %0 to i8*
%90 = sext i32 %16 to i64
%91 = getelementptr inbounds i8, i8* %89, i64 %90
%92 = shl nsw i32 %88, 4
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i32, i32* %0, i64 %93
%95 = getelementptr inbounds i32, i32* %94, i64 20
%96 = getelementptr inbounds i32, i32* %95, i64 12
%97 = tail call i32 @get32le(i32* %96)
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds i8, i8* %91, i64 %98
br label %100
100: ; preds = %83, %126
%101 = phi i64 [ 255, %83 ], [ %128, %126 ]
%102 = phi i64 [ 0, %83 ], [ %129, %126 ]
%103 = phi i8* [ %99, %83 ], [ %130, %126 ]
%104 = phi i8* [ %3, %83 ], [ %127, %126 ]
%105 = load i8, i8* %103
%106 = icmp eq i8 %105, 0
br i1 %106, label %132, label %107
107: ; preds = %100
%108 = add i8 %105, -127
%109 = icmp ult i8 %108, -95
br i1 %109, label %121, label %110
110: ; preds = %107
%111 = tail call i32* @strchr(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.9, i64 0, i64 0), i8 signext %105)
%112 = icmp eq i32* %111, null
%113 = load i8, i8* %103
br i1 %112, label %114, label %121
114: ; preds = %110
%115 = icmp eq i8 %113, 58
%116 = getelementptr inbounds i8, i8* %104, i64 1
br i1 %115, label %117, label %120
117: ; preds = %114
store i8 32, i8* %104
%118 = getelementptr inbounds i8, i8* %104, i64 2
store i8 45, i8* %116
%119 = add i64 %101, -1
br label %126
120: ; preds = %114
store i8 %113, i8* %104
br label %126
121: ; preds = %110, %107
%122 = phi i8 [ %105, %107 ], [ %113, %110 ]
%123 = icmp eq i8 %122, 10
br i1 %123, label %124, label %126
124: ; preds = %121
%125 = getelementptr inbounds i8, i8* %104, i64 1
store i8 32, i8* %104
br label %126
126: ; preds = %120, %117, %124, %121
%127 = phi i8* [ %118, %117 ], [ %116, %120 ], [ %125, %124 ], [ %104, %121 ]
%128 = phi i64 [ %119, %117 ], [ %101, %120 ], [ %101, %124 ], [ %101, %121 ]
%129 = add nuw i64 %102, 1
%130 = getelementptr inbounds i8, i8* %103, i64 1
%131 = icmp ult i64 %129, %128
br i1 %131, label %100, label %132
132: ; preds = %126, %100
%133 = phi i8* [ %127, %126 ], [ %104, %100 ]
store i8 0, i8* %133
%134 = icmp sgt i32 %87, -1
%135 = icmp ne i8* %4, null
%136 = and i1 %135, %134
br i1 %136, label %137, label %158
137: ; preds = %132
%138 = shl nsw i32 %87, 4
%139 = sext i32 %138 to i64
%140 = getelementptr inbounds i32, i32* %0, i64 %139
%141 = getelementptr inbounds i32, i32* %140, i64 20
%142 = getelementptr inbounds i32, i32* %141, i64 12
%143 = tail call i32 @get32le(i32* %142)
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i8, i8* %91, i64 %144
%146 = load i8, i8* %145
%147 = icmp eq i8 %146, 0
br i1 %147, label %156, label %148
148: ; preds = %137, %148
%149 = phi i8 [ %154, %148 ], [ %146, %137 ]
%150 = phi i8* [ %152, %148 ], [ %145, %137 ]
%151 = phi i8* [ %153, %148 ], [ %4, %137 ]
%152 = getelementptr inbounds i8, i8* %150, i64 1
%153 = getelementptr inbounds i8, i8* %151, i64 1
store i8 %149, i8* %151
%154 = load i8, i8* %152
%155 = icmp eq i8 %154, 0
br i1 %155, label %156, label %148
156: ; preds = %148, %137
%157 = phi i8* [ %4, %137 ], [ %153, %148 ]
store i8 0, i8* %157
br label %158
158: ; preds = %156, %132
%159 = icmp sgt i32 %86, -1
br i1 %159, label %160, label %179
160: ; preds = %158
%161 = shl nsw i32 %86, 4
%162 = sext i32 %161 to i64
%163 = getelementptr inbounds i32, i32* %0, i64 %162
%164 = getelementptr inbounds i32, i32* %163, i64 20
%165 = getelementptr inbounds i32, i32* %164, i64 12
%166 = tail call i32 @get32le(i32* %165)
%167 = sext i32 %166 to i64
%168 = getelementptr inbounds i8, i8* %91, i64 %167
%169 = load i8, i8* %168
%170 = icmp eq i8 %169, 0
br i1 %170, label %179, label %171
171: ; preds = %160, %171
%172 = phi i8 [ %177, %171 ], [ %169, %160 ]
%173 = phi i8* [ %175, %171 ], [ %168, %160 ]
%174 = phi i8* [ %176, %171 ], [ %2, %160 ]
%175 = getelementptr inbounds i8, i8* %173, i64 1
%176 = getelementptr inbounds i8, i8* %174, i64 1
store i8 %172, i8* %174
%177 = load i8, i8* %175
%178 = icmp eq i8 %177, 0
br i1 %178, label %179, label %171
179: ; preds = %171, %160, %158
%180 = phi i8* [ %2, %158 ], [ %2, %160 ], [ %176, %171 ]
store i8 0, i8* %180
%181 = icmp sgt i32 %85, -1
%182 = icmp ne i8* %5, null
%183 = and i1 %182, %181
br i1 %183, label %184, label %213
184: ; preds = %179
%185 = shl nsw i32 %85, 4
%186 = sext i32 %185 to i64
%187 = getelementptr inbounds i32, i32* %0, i64 %186
%188 = getelementptr inbounds i32, i32* %187, i64 20
%189 = getelementptr inbounds i32, i32* %188, i64 12
%190 = tail call i32 @get32le(i32* %189)
%191 = sext i32 %190 to i64
%192 = getelementptr inbounds i8, i8* %91, i64 %191
%193 = load i8, i8* %192
%194 = icmp eq i8 %193, 48
%195 = zext i1 %194 to i64
%196 = getelementptr i8, i8* %192, i64 %195
%197 = load i8, i8* %196
%198 = icmp eq i8 %197, 0
br i1 %198, label %207, label %199
199: ; preds = %184, %199
%200 = phi i8 [ %205, %199 ], [ %197, %184 ]
%201 = phi i8* [ %203, %199 ], [ %196, %184 ]
%202 = phi i8* [ %204, %199 ], [ %5, %184 ]
%203 = getelementptr inbounds i8, i8* %201, i64 1
%204 = getelementptr inbounds i8, i8* %202, i64 1
store i8 %200, i8* %202
%205 = load i8, i8* %203
%206 = icmp eq i8 %205, 0
br i1 %206, label %207, label %199
207: ; preds = %199, %184
%208 = phi i8* [ %5, %184 ], [ %204, %199 ]
%209 = getelementptr inbounds i8, i8* %208, i64 -1
%210 = load i8, i8* %209
%211 = icmp eq i8 %210, 48
%212 = select i1 %211, i8* %209, i8* %208
store i8 0, i8* %212
br label %213
213: ; preds = %207, %179
%214 = icmp sgt i32 %84, -1
%215 = icmp ne i8* %6, null
%216 = and i1 %215, %214
br i1 %216, label %217, label %242
217: ; preds = %213
%218 = shl nsw i32 %84, 4
%219 = sext i32 %218 to i64
%220 = getelementptr inbounds i32, i32* %0, i64 %219
%221 = getelementptr inbounds i32, i32* %220, i64 20
%222 = getelementptr inbounds i32, i32* %221, i64 12
%223 = tail call i32 @get32le(i32* %222)
%224 = sext i32 %223 to i64
%225 = getelementptr inbounds i8, i8* %91, i64 %224
%226 = load i8, i8* %225
%227 = icmp eq i8 %226, 48
%228 = zext i1 %227 to i64
%229 = getelementptr i8, i8* %225, i64 %228
%230 = load i8, i8* %229
%231 = icmp eq i8 %230, 0
br i1 %231, label %240, label %232
232: ; preds = %217, %232
%233 = phi i8 [ %238, %232 ], [ %230, %217 ]
%234 = phi i8* [ %236, %232 ], [ %229, %217 ]
%235 = phi i8* [ %237, %232 ], [ %6, %217 ]
%236 = getelementptr inbounds i8, i8* %234, i64 1
%237 = getelementptr inbounds i8, i8* %235, i64 1
store i8 %233, i8* %235
%238 = load i8, i8* %236
%239 = icmp eq i8 %238, 0
br i1 %239, label %240, label %232
240: ; preds = %232, %217
%241 = phi i8* [ %6, %217 ], [ %237, %232 ]
store i8 0, i8* %241
br label %242
242: ; preds = %240, %213
ret void
}