#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 __u64;
typedef int __u16;

/* Variables and functions */
int /*<<< orphan*/ printf(char *, ...);
int /*<<< orphan*/ putchar(char);
void dco_identify_print(__u16 *dco) {
  __u64 lba;
  printf("DCO Revision: 0x%04x", dco[0]);
  if (dco[0] == 0 || dco[0] > 2)
    printf(" -- unknown, treating as 0002");
  printf("\nThe following features can be selectively disabled via DCO:\n");
  printf("\tTransfer modes:\n\t\t");
  if (dco[1] & 0x0007) {
    if (dco[1] & (1 << 2))
      printf(" mdma0 mdma1 mdma2");
    else if (dco[1] & (1 << 1))
      printf(" mdma0 mdma1");
    else if (dco[1] & (1 << 0))
      printf(" mdma0");
    printf("\n\t\t");
  }
  if (dco[2] & (1 << 6)) {
    printf(" udma0 udma1 udma2 udma3 udma4 udma5 udma6");
    if (dco[0] < 2)
      printf("(?)");
  } else if (dco[2] & (1 << 5))
    printf(" udma0 udma1 udma2 udma3 udma4 udma5");
  else if (dco[2] & (1 << 4))
    printf(" udma0 udma1 udma2 udma3 udma4");
  else if (dco[2] & (1 << 3))
    printf(" udma0 udma1 udma2 udma3");
  else if (dco[2] & (1 << 2))
    printf(" udma0 udma1 udma2");
  else if (dco[2] & (1 << 1))
    printf(" udma0 udma1");
  else if (dco[2] & (1 << 0))
    printf(" udma0");
  putchar('\n');
  lba = ((((__u64)dco[5]) << 32) | (dco[4] << 16) | dco[3]) + 1;
  printf("\tReal max sectors: %llu\n", lba);
  printf("\tATA command/feature sets:");
  if (dco[7] & 0x01ff) {
    printf("\n\t\t");
    if (dco[7] & (1 << 0))
      printf(" SMART");
    if (dco[7] & (1 << 1))
      printf(" self_test");
    if (dco[7] & (1 << 2))
      printf(" error_log");
    if (dco[7] & (1 << 3))
      printf(" security");
    if (dco[7] & (1 << 4))
      printf(" PUIS");
    if (dco[7] & (1 << 5))
      printf(" TCQ");
    if (dco[7] & (1 << 6))
      printf(" AAM");
    if (dco[7] & (1 << 7))
      printf(" HPA");
    if (dco[7] & (1 << 8))
      printf(" 48_bit");
  }
  if (dco[7] & 0xfe00) {
    printf("\n\t\t");
    if (dco[0] < 2)
      printf(" (?):");
    if (dco[7] & (1 << 9))
      printf(" streaming");
    if (dco[7] & (1 << 10))
      printf(" TLC_Reserved_7[10]");
    if (dco[7] & (1 << 11))
      printf(" FUA");
    if (dco[7] & (1 << 12))
      printf(" selective_test");
    if (dco[7] & (1 << 13))
      printf(" conveyance_test");
    if (dco[7] & (1 << 14))
      printf(" write_read_verify");
    if (dco[7] & (1 << 15))
      printf(" reserved_7[15]");
  }
  if (dco[21] & 0xf800) {
    printf("\n\t\t");
    if (dco[0] < 2)
      printf(" (?):");
    if (dco[21] & (1 << 11))
      printf(" free_fall");
    if (dco[21] & (1 << 12))
      printf(" trusted_computing");
    if (dco[21] & (1 << 13))
      printf(" WRITE_UNC_EXT");
    if (dco[21] & (1 << 14))
      printf(" NV_cache_power_management");
    if (dco[21] & (1 << 15))
      printf(" NV_cache");
  }
  putchar('\n');
  if (dco[8] && 0x1f) {
    printf("\tSATA command/feature sets:\n\t\t");
    if (dco[0] < 2)
      printf(" (?):");
    if (dco[8] & (1 << 0))
      printf(" NCQ");
    if (dco[8] & (1 << 1))
      printf(" NZ_buffer_offsets");
    if (dco[8] & (1 << 2))
      printf(" interface_power_management");
    if (dco[8] & (1 << 3))
      printf(" async_notification");
    if (dco[8] & (1 << 4))
      printf(" SSP");
    putchar('\n');
  }
}


x86 assembly (clang, -O0):
<dco_identify_print>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%esi
lea    0xec7(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
cmpl   $0x0,(%rax)
je     115a <dco_identify_print+0x3a>
mov    -0x8(%rbp),%rax
cmpl   $0x2,(%rax)
jle    1168 <dco_identify_print+0x48>
lea    0xeb4(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
lea    0xec4(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
lea    0xef4(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
and    $0x7,%eax
cmp    $0x0,%eax
je     121c <dco_identify_print+0xfc>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     11bd <dco_identify_print+0x9d>
lea    0xed4(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    120e <dco_identify_print+0xee>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     11e3 <dco_identify_print+0xc3>
lea    0xec1(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1209 <dco_identify_print+0xe9>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1204 <dco_identify_print+0xe4>
lea    0xea8(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1209 <dco_identify_print+0xe9>
jmp    120e <dco_identify_print+0xee>
lea    0xe6c(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     125d <dco_identify_print+0x13d>
lea    0xe76(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
cmpl   $0x2,(%rax)
jge    1258 <dco_identify_print+0x138>
lea    0xe86(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    135a <dco_identify_print+0x23a>
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     1283 <dco_identify_print+0x163>
lea    0xe64(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1355 <dco_identify_print+0x235>
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     12a9 <dco_identify_print+0x189>
lea    0xe63(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1350 <dco_identify_print+0x230>
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     12cf <dco_identify_print+0x1af>
lea    0xe5c(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    134b <dco_identify_print+0x22b>
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     12f5 <dco_identify_print+0x1d5>
lea    0xe4f(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1346 <dco_identify_print+0x226>
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     131b <dco_identify_print+0x1fb>
lea    0xe3c(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1341 <dco_identify_print+0x221>
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     133c <dco_identify_print+0x21c>
lea    0xe23(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1341 <dco_identify_print+0x221>
jmp    1346 <dco_identify_print+0x226>
jmp    134b <dco_identify_print+0x22b>
jmp    1350 <dco_identify_print+0x230>
jmp    1355 <dco_identify_print+0x235>
jmp    135a <dco_identify_print+0x23a>
mov    $0xa,%edi
call   1030 <putchar@plt>
mov    -0x8(%rbp),%rax
mov    0x14(%rax),%eax
mov    $0x20,%ecx
shl    %cl,%eax
mov    -0x8(%rbp),%rcx
mov    0x10(%rcx),%ecx
shl    $0x10,%ecx
or     %ecx,%eax
mov    -0x8(%rbp),%rcx
or     0xc(%rcx),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%esi
lea    0xdca(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
lea    0xdd5(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x1ff,%eax
cmp    $0x0,%eax
je     14ff <dco_identify_print+0x3df>
lea    0xcbb(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     13ee <dco_identify_print+0x2ce>
lea    0xdac(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     140f <dco_identify_print+0x2ef>
lea    0xd92(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     1430 <dco_identify_print+0x310>
lea    0xd7c(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     1451 <dco_identify_print+0x331>
lea    0xd66(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1472 <dco_identify_print+0x352>
lea    0xd4f(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     1493 <dco_identify_print+0x373>
lea    0xd34(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     14b4 <dco_identify_print+0x394>
lea    0xd18(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     14d7 <dco_identify_print+0x3b7>
lea    0xcfa(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x100,%eax
cmp    $0x0,%eax
je     14fa <dco_identify_print+0x3da>
lea    0xcdc(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    14ff <dco_identify_print+0x3df>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0xfe00,%eax
cmp    $0x0,%eax
je     1637 <dco_identify_print+0x517>
lea    0xb66(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
cmpl   $0x2,(%rax)
jge    153d <dco_identify_print+0x41d>
lea    0xca1(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x200,%eax
cmp    $0x0,%eax
je     1560 <dco_identify_print+0x440>
lea    0xc84(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x400,%eax
cmp    $0x0,%eax
je     1583 <dco_identify_print+0x463>
lea    0xc6c(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x800,%eax
cmp    $0x0,%eax
je     15a6 <dco_identify_print+0x486>
lea    0xc5d(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x1000,%eax
cmp    $0x0,%eax
je     15c9 <dco_identify_print+0x4a9>
lea    0xc3f(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x2000,%eax
cmp    $0x0,%eax
je     15ec <dco_identify_print+0x4cc>
lea    0xc2c(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x4000,%eax
cmp    $0x0,%eax
je     160f <dco_identify_print+0x4ef>
lea    0xc1a(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%eax
and    $0x8000,%eax
cmp    $0x0,%eax
je     1632 <dco_identify_print+0x512>
lea    0xc0a(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1637 <dco_identify_print+0x517>
mov    -0x8(%rbp),%rax
mov    0x54(%rax),%eax
and    $0xf800,%eax
cmp    $0x0,%eax
je     1729 <dco_identify_print+0x609>
lea    0xa2e(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
cmpl   $0x2,(%rax)
jge    1675 <dco_identify_print+0x555>
lea    0xb69(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x54(%rax),%eax
and    $0x800,%eax
cmp    $0x0,%eax
je     1698 <dco_identify_print+0x578>
lea    0xbb4(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x54(%rax),%eax
and    $0x1000,%eax
cmp    $0x0,%eax
je     16bb <dco_identify_print+0x59b>
lea    0xb9c(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x54(%rax),%eax
and    $0x2000,%eax
cmp    $0x0,%eax
je     16de <dco_identify_print+0x5be>
lea    0xb8c(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x54(%rax),%eax
and    $0x4000,%eax
cmp    $0x0,%eax
je     1701 <dco_identify_print+0x5e1>
lea    0xb78(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x54(%rax),%eax
and    $0x8000,%eax
cmp    $0x0,%eax
je     1724 <dco_identify_print+0x604>
lea    0xb70(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1729 <dco_identify_print+0x609>
mov    $0xa,%edi
call   1030 <putchar@plt>
mov    -0x8(%rbp),%rax
cmpl   $0x0,0x20(%rax)
je     1819 <dco_identify_print+0x6f9>
lea    0xb4f(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
cmpl   $0x2,(%rax)
jge    176a <dco_identify_print+0x64a>
lea    0xa74(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x20(%rax),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     178b <dco_identify_print+0x66b>
lea    0xb32(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x20(%rax),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     17ac <dco_identify_print+0x68c>
lea    0xb16(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x20(%rax),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     17cd <dco_identify_print+0x6ad>
lea    0xb08(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x20(%rax),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     17ee <dco_identify_print+0x6ce>
lea    0xb03(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x8(%rbp),%rax
mov    0x20(%rax),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     180f <dco_identify_print+0x6ef>
lea    0xaf6(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dco_identify_print>:
push   %rbx
mov    %rdi,%rbx
mov    (%rdi),%esi
lea    0xec3(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    (%rbx),%eax
test   %eax,%eax
je     114f <dco_identify_print+0x1f>
cmp    $0x3,%eax
jl     115d <dco_identify_print+0x2d>
lea    0xebf(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
lea    0x1161(%rip),%rdi
call   1040 <puts@plt>
lea    0xec3(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x4(%rbx),%eax
test   $0x7,%al
je     11b8 <dco_identify_print+0x88>
test   $0x4,%al
jne    1193 <dco_identify_print+0x63>
test   $0x2,%al
jne    119c <dco_identify_print+0x6c>
test   $0x1,%al
je     11aa <dco_identify_print+0x7a>
lea    0xed6(%rip),%rdi
jmp    11a3 <dco_identify_print+0x73>
lea    0xead(%rip),%rdi
jmp    11a3 <dco_identify_print+0x73>
lea    0xeb7(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
lea    0xe92(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x8(%rbx),%eax
test   $0x40,%al
jne    11e0 <dco_identify_print+0xb0>
test   $0x20,%al
jne    11fc <dco_identify_print+0xcc>
test   $0x10,%al
jne    1205 <dco_identify_print+0xd5>
test   $0x8,%al
jne    120e <dco_identify_print+0xde>
test   $0x4,%al
jne    1217 <dco_identify_print+0xe7>
test   $0x2,%al
jne    1220 <dco_identify_print+0xf0>
test   $0x1,%al
je     122e <dco_identify_print+0xfe>
lea    0xf3c(%rip),%rdi
jmp    1227 <dco_identify_print+0xf7>
lea    0xe87(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
cmpl   $0x2,(%rbx)
jge    122e <dco_identify_print+0xfe>
lea    0xe9f(%rip),%rdi
jmp    1227 <dco_identify_print+0xf7>
lea    0xe9a(%rip),%rdi
jmp    1227 <dco_identify_print+0xf7>
lea    0xeb6(%rip),%rdi
jmp    1227 <dco_identify_print+0xf7>
lea    0xecc(%rip),%rdi
jmp    1227 <dco_identify_print+0xf7>
lea    0xedc(%rip),%rdi
jmp    1227 <dco_identify_print+0xf7>
lea    0xee6(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
lea    0xee2(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
lea    0xeed(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x1ff,%eax
je     12c7 <dco_identify_print+0x197>
lea    0xdde(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x1,%al
jne    1427 <dco_identify_print+0x2f7>
test   $0x2,%al
jne    1440 <dco_identify_print+0x310>
test   $0x4,%al
jne    1459 <dco_identify_print+0x329>
test   $0x8,%al
jne    1472 <dco_identify_print+0x342>
test   $0x10,%al
jne    148b <dco_identify_print+0x35b>
test   $0x20,%al
jne    14a4 <dco_identify_print+0x374>
test   $0x40,%al
jne    14bd <dco_identify_print+0x38d>
test   $0x80,%al
jne    14d6 <dco_identify_print+0x3a6>
test   $0x100,%eax
je     12c7 <dco_identify_print+0x197>
lea    0xed4(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0xfe00,%eax
je     1349 <dco_identify_print+0x219>
lea    0xd6e(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
cmpl   $0x1,(%rbx)
jg     12ef <dco_identify_print+0x1bf>
lea    0xeb1(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x200,%eax
jne    14f7 <dco_identify_print+0x3c7>
test   $0x400,%eax
jne    1513 <dco_identify_print+0x3e3>
test   $0x800,%eax
jne    152f <dco_identify_print+0x3ff>
test   $0x1000,%eax
jne    154b <dco_identify_print+0x41b>
test   $0x2000,%eax
jne    1567 <dco_identify_print+0x437>
test   $0x4000,%eax
jne    1583 <dco_identify_print+0x453>
test   $0x8000,%eax
je     1349 <dco_identify_print+0x219>
lea    0xeb5(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
testb  $0xf8,0x55(%rbx)
je     13b4 <dco_identify_print+0x284>
lea    0xced(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
cmpl   $0x1,(%rbx)
jg     1370 <dco_identify_print+0x240>
lea    0xe30(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x54(%rbx),%eax
test   $0x800,%eax
jne    15a4 <dco_identify_print+0x474>
test   $0x1000,%eax
jne    15c0 <dco_identify_print+0x490>
test   $0x2000,%eax
jne    15dc <dco_identify_print+0x4ac>
test   $0x4000,%eax
jne    15f8 <dco_identify_print+0x4c8>
test   $0x8000,%eax
je     13b4 <dco_identify_print+0x284>
lea    0xea2(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
cmpl   $0x0,0x20(%rbx)
je     1425 <dco_identify_print+0x2f5>
lea    0xe8e(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
cmpl   $0x1,(%rbx)
jg     13e5 <dco_identify_print+0x2b5>
lea    0xdbb(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x20(%rbx),%eax
test   $0x1,%al
jne    1619 <dco_identify_print+0x4e9>
test   $0x2,%al
jne    1632 <dco_identify_print+0x502>
test   $0x4,%al
jne    164b <dco_identify_print+0x51b>
test   $0x8,%al
jne    1664 <dco_identify_print+0x534>
test   $0x10,%al
je     141a <dco_identify_print+0x2ea>
lea    0xead(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    $0xa,%edi
pop    %rbx
jmp    1030 <putchar@plt>
pop    %rbx
ret
lea    0xd27(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x2,%al
je     127f <dco_identify_print+0x14f>
lea    0xd15(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x4,%al
je     1287 <dco_identify_print+0x157>
lea    0xd07(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x8,%al
je     128f <dco_identify_print+0x15f>
lea    0xcf9(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x10,%al
je     1297 <dco_identify_print+0x167>
lea    0xcea(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x20,%al
je     129f <dco_identify_print+0x16f>
lea    0xcd7(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x40,%al
je     12a7 <dco_identify_print+0x177>
lea    0xcc3(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x80,%al
je     12af <dco_identify_print+0x17f>
lea    0xcaf(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x100,%eax
jne    12b6 <dco_identify_print+0x186>
jmp    12c7 <dco_identify_print+0x197>
lea    0xca1(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x400,%eax
je     1308 <dco_identify_print+0x1d8>
lea    0xc90(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x800,%eax
je     1313 <dco_identify_print+0x1e3>
lea    0xc88(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x1000,%eax
je     131e <dco_identify_print+0x1ee>
lea    0xc71(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x2000,%eax
je     1329 <dco_identify_print+0x1f9>
lea    0xc65(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x4000,%eax
je     1334 <dco_identify_print+0x204>
lea    0xc5a(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x1c(%rbx),%eax
test   $0x8000,%eax
jne    133b <dco_identify_print+0x20b>
jmp    1349 <dco_identify_print+0x219>
lea    0xc5c(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x54(%rbx),%eax
test   $0x1000,%eax
je     1389 <dco_identify_print+0x259>
lea    0xc4b(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x54(%rbx),%eax
test   $0x2000,%eax
je     1394 <dco_identify_print+0x264>
lea    0xc42(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x54(%rbx),%eax
test   $0x4000,%eax
je     139f <dco_identify_print+0x26f>
lea    0xc35(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x54(%rbx),%eax
test   $0x8000,%eax
jne    13a6 <dco_identify_print+0x276>
jmp    13b4 <dco_identify_print+0x284>
lea    0xc58(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x20(%rbx),%eax
test   $0x2,%al
je     13f8 <dco_identify_print+0x2c8>
lea    0xc44(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x20(%rbx),%eax
test   $0x4,%al
je     1400 <dco_identify_print+0x2d0>
lea    0xc3e(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x20(%rbx),%eax
test   $0x8,%al
je     1408 <dco_identify_print+0x2d8>
lea    0xc41(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x20(%rbx),%eax
test   $0x10,%al
jne    140c <dco_identify_print+0x2dc>
jmp    141a <dco_identify_print+0x2ea>

LLVM IR (-O0):
@.str = [21 x i8] c"DCO Revision: 0x%04x\00"
@.str.1 = [30 x i8] c" -- unknown, treating as 0002\00"
@.str.2 = [62 x i8] c"\0AThe following features can be selectively disabled via DCO:\0A\00"
@.str.3 = [20 x i8] c"\09Transfer modes:\0A\09\09\00"
@.str.4 = [19 x i8] c" mdma0 mdma1 mdma2\00"
@.str.5 = [13 x i8] c" mdma0 mdma1\00"
@.str.6 = [7 x i8] c" mdma0\00"
@.str.7 = [4 x i8] c"\0A\09\09\00"
@.str.8 = [43 x i8] c" udma0 udma1 udma2 udma3 udma4 udma5 udma6\00"
@.str.9 = [4 x i8] c"(?)\00"
@.str.10 = [37 x i8] c" udma0 udma1 udma2 udma3 udma4 udma5\00"
@.str.11 = [31 x i8] c" udma0 udma1 udma2 udma3 udma4\00"
@.str.12 = [25 x i8] c" udma0 udma1 udma2 udma3\00"
@.str.13 = [19 x i8] c" udma0 udma1 udma2\00"
@.str.14 = [13 x i8] c" udma0 udma1\00"
@.str.15 = [7 x i8] c" udma0\00"
@.str.16 = [25 x i8] c"\09Real max sectors: %llu\0A\00"
@.str.17 = [27 x i8] c"\09ATA command/feature sets:\00"
@.str.18 = [7 x i8] c" SMART\00"
@.str.19 = [11 x i8] c" self_test\00"
@.str.20 = [11 x i8] c" error_log\00"
@.str.21 = [10 x i8] c" security\00"
@.str.22 = [6 x i8] c" PUIS\00"
@.str.23 = [5 x i8] c" TCQ\00"
@.str.24 = [5 x i8] c" AAM\00"
@.str.25 = [5 x i8] c" HPA\00"
@.str.26 = [8 x i8] c" 48_bit\00"
@.str.27 = [6 x i8] c" (?):\00"
@.str.28 = [11 x i8] c" streaming\00"
@.str.29 = [20 x i8] c" TLC_Reserved_7[10]\00"
@.str.30 = [5 x i8] c" FUA\00"
@.str.31 = [16 x i8] c" selective_test\00"
@.str.32 = [17 x i8] c" conveyance_test\00"
@.str.33 = [19 x i8] c" write_read_verify\00"
@.str.34 = [16 x i8] c" reserved_7[15]\00"
@.str.35 = [11 x i8] c" free_fall\00"
@.str.36 = [19 x i8] c" trusted_computing\00"
@.str.37 = [15 x i8] c" WRITE_UNC_EXT\00"
@.str.38 = [27 x i8] c" NV_cache_power_management\00"
@.str.39 = [10 x i8] c" NV_cache\00"
@.str.40 = [31 x i8] c"\09SATA command/feature sets:\0A\09\09\00"
@.str.41 = [5 x i8] c" NCQ\00"
@.str.42 = [19 x i8] c" NZ_buffer_offsets\00"
@.str.43 = [28 x i8] c" interface_power_management\00"
@.str.44 = [20 x i8] c" async_notification\00"
@.str.45 = [5 x i8] c" SSP\00"
define void @dco_identify_print(i32* %0) {
%2 = alloca i32*
%3 = alloca i32
store i32* %0, i32** %2
%4 = load i32*, i32** %2
%5 = getelementptr inbounds i32, i32* %4, i64 0
%6 = load i32, i32* %5
%7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str, i64 0, i64 0), i32 %6)
%8 = load i32*, i32** %2
%9 = getelementptr inbounds i32, i32* %8, i64 0
%10 = load i32, i32* %9
%11 = icmp eq i32 %10, 0
br i1 %11, label %17, label %12
12: ; preds = %1
%13 = load i32*, i32** %2
%14 = getelementptr inbounds i32, i32* %13, i64 0
%15 = load i32, i32* %14
%16 = icmp sgt i32 %15, 2
br i1 %16, label %17, label %19
17: ; preds = %12, %1
%18 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.1, i64 0, i64 0))
br label %19
19: ; preds = %17, %12
%20 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([62 x i8], [62 x i8]* @.str.2, i64 0, i64 0))
%21 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.3, i64 0, i64 0))
%22 = load i32*, i32** %2
%23 = getelementptr inbounds i32, i32* %22, i64 1
%24 = load i32, i32* %23
%25 = and i32 %24, 7
%26 = icmp ne i32 %25, 0
br i1 %26, label %27, label %55
27: ; preds = %19
%28 = load i32*, i32** %2
%29 = getelementptr inbounds i32, i32* %28, i64 1
%30 = load i32, i32* %29
%31 = and i32 %30, 4
%32 = icmp ne i32 %31, 0
br i1 %32, label %33, label %35
33: ; preds = %27
%34 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.4, i64 0, i64 0))
br label %53
35: ; preds = %27
%36 = load i32*, i32** %2
%37 = getelementptr inbounds i32, i32* %36, i64 1
%38 = load i32, i32* %37
%39 = and i32 %38, 2
%40 = icmp ne i32 %39, 0
br i1 %40, label %41, label %43
41: ; preds = %35
%42 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.5, i64 0, i64 0))
br label %52
43: ; preds = %35
%44 = load i32*, i32** %2
%45 = getelementptr inbounds i32, i32* %44, i64 1
%46 = load i32, i32* %45
%47 = and i32 %46, 1
%48 = icmp ne i32 %47, 0
br i1 %48, label %49, label %51
49: ; preds = %43
%50 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.6, i64 0, i64 0))
br label %51
51: ; preds = %49, %43
br label %52
52: ; preds = %51, %41
br label %53
53: ; preds = %52, %33
%54 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0))
br label %55
55: ; preds = %53, %19
%56 = load i32*, i32** %2
%57 = getelementptr inbounds i32, i32* %56, i64 2
%58 = load i32, i32* %57
%59 = and i32 %58, 64
%60 = icmp ne i32 %59, 0
br i1 %60, label %61, label %70
61: ; preds = %55
%62 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.8, i64 0, i64 0))
%63 = load i32*, i32** %2
%64 = getelementptr inbounds i32, i32* %63, i64 0
%65 = load i32, i32* %64
%66 = icmp slt i32 %65, 2
br i1 %66, label %67, label %69
67: ; preds = %61
%68 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.9, i64 0, i64 0))
br label %69
69: ; preds = %67, %61
br label %124
70: ; preds = %55
%71 = load i32*, i32** %2
%72 = getelementptr inbounds i32, i32* %71, i64 2
%73 = load i32, i32* %72
%74 = and i32 %73, 32
%75 = icmp ne i32 %74, 0
br i1 %75, label %76, label %78
76: ; preds = %70
%77 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str.10, i64 0, i64 0))
br label %123
78: ; preds = %70
%79 = load i32*, i32** %2
%80 = getelementptr inbounds i32, i32* %79, i64 2
%81 = load i32, i32* %80
%82 = and i32 %81, 16
%83 = icmp ne i32 %82, 0
br i1 %83, label %84, label %86
84: ; preds = %78
%85 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.11, i64 0, i64 0))
br label %122
86: ; preds = %78
%87 = load i32*, i32** %2
%88 = getelementptr inbounds i32, i32* %87, i64 2
%89 = load i32, i32* %88
%90 = and i32 %89, 8
%91 = icmp ne i32 %90, 0
br i1 %91, label %92, label %94
92: ; preds = %86
%93 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.12, i64 0, i64 0))
br label %121
94: ; preds = %86
%95 = load i32*, i32** %2
%96 = getelementptr inbounds i32, i32* %95, i64 2
%97 = load i32, i32* %96
%98 = and i32 %97, 4
%99 = icmp ne i32 %98, 0
br i1 %99, label %100, label %102
100: ; preds = %94
%101 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.13, i64 0, i64 0))
br label %120
102: ; preds = %94
%103 = load i32*, i32** %2
%104 = getelementptr inbounds i32, i32* %103, i64 2
%105 = load i32, i32* %104
%106 = and i32 %105, 2
%107 = icmp ne i32 %106, 0
br i1 %107, label %108, label %110
108: ; preds = %102
%109 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.14, i64 0, i64 0))
br label %119
110: ; preds = %102
%111 = load i32*, i32** %2
%112 = getelementptr inbounds i32, i32* %111, i64 2
%113 = load i32, i32* %112
%114 = and i32 %113, 1
%115 = icmp ne i32 %114, 0
br i1 %115, label %116, label %118
116: ; preds = %110
%117 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.15, i64 0, i64 0))
br label %118
118: ; preds = %116, %110
br label %119
119: ; preds = %118, %108
br label %120
120: ; preds = %119, %100
br label %121
121: ; preds = %120, %92
br label %122
122: ; preds = %121, %84
br label %123
123: ; preds = %122, %76
br label %124
124: ; preds = %123, %69
%125 = call i32 @putchar(i8 signext 10)
%126 = load i32*, i32** %2
%127 = getelementptr inbounds i32, i32* %126, i64 5
%128 = load i32, i32* %127
%129 = shl i32 %128, 32
%130 = load i32*, i32** %2
%131 = getelementptr inbounds i32, i32* %130, i64 4
%132 = load i32, i32* %131
%133 = shl i32 %132, 16
%134 = or i32 %129, %133
%135 = load i32*, i32** %2
%136 = getelementptr inbounds i32, i32* %135, i64 3
%137 = load i32, i32* %136
%138 = or i32 %134, %137
%139 = add nsw i32 %138, 1
store i32 %139, i32* %3
%140 = load i32, i32* %3
%141 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.16, i64 0, i64 0), i32 %140)
%142 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.17, i64 0, i64 0))
%143 = load i32*, i32** %2
%144 = getelementptr inbounds i32, i32* %143, i64 7
%145 = load i32, i32* %144
%146 = and i32 %145, 511
%147 = icmp ne i32 %146, 0
br i1 %147, label %148, label %222
148: ; preds = %124
%149 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0))
%150 = load i32*, i32** %2
%151 = getelementptr inbounds i32, i32* %150, i64 7
%152 = load i32, i32* %151
%153 = and i32 %152, 1
%154 = icmp ne i32 %153, 0
br i1 %154, label %155, label %157
155: ; preds = %148
%156 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.18, i64 0, i64 0))
br label %157
157: ; preds = %155, %148
%158 = load i32*, i32** %2
%159 = getelementptr inbounds i32, i32* %158, i64 7
%160 = load i32, i32* %159
%161 = and i32 %160, 2
%162 = icmp ne i32 %161, 0
br i1 %162, label %163, label %165
163: ; preds = %157
%164 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.19, i64 0, i64 0))
br label %165
165: ; preds = %163, %157
%166 = load i32*, i32** %2
%167 = getelementptr inbounds i32, i32* %166, i64 7
%168 = load i32, i32* %167
%169 = and i32 %168, 4
%170 = icmp ne i32 %169, 0
br i1 %170, label %171, label %173
171: ; preds = %165
%172 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.20, i64 0, i64 0))
br label %173
173: ; preds = %171, %165
%174 = load i32*, i32** %2
%175 = getelementptr inbounds i32, i32* %174, i64 7
%176 = load i32, i32* %175
%177 = and i32 %176, 8
%178 = icmp ne i32 %177, 0
br i1 %178, label %179, label %181
179: ; preds = %173
%180 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.21, i64 0, i64 0))
br label %181
181: ; preds = %179, %173
%182 = load i32*, i32** %2
%183 = getelementptr inbounds i32, i32* %182, i64 7
%184 = load i32, i32* %183
%185 = and i32 %184, 16
%186 = icmp ne i32 %185, 0
br i1 %186, label %187, label %189
187: ; preds = %181
%188 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.22, i64 0, i64 0))
br label %189
189: ; preds = %187, %181
%190 = load i32*, i32** %2
%191 = getelementptr inbounds i32, i32* %190, i64 7
%192 = load i32, i32* %191
%193 = and i32 %192, 32
%194 = icmp ne i32 %193, 0
br i1 %194, label %195, label %197
195: ; preds = %189
%196 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.23, i64 0, i64 0))
br label %197
197: ; preds = %195, %189
%198 = load i32*, i32** %2
%199 = getelementptr inbounds i32, i32* %198, i64 7
%200 = load i32, i32* %199
%201 = and i32 %200, 64
%202 = icmp ne i32 %201, 0
br i1 %202, label %203, label %205
203: ; preds = %197
%204 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.24, i64 0, i64 0))
br label %205
205: ; preds = %203, %197
%206 = load i32*, i32** %2
%207 = getelementptr inbounds i32, i32* %206, i64 7
%208 = load i32, i32* %207
%209 = and i32 %208, 128
%210 = icmp ne i32 %209, 0
br i1 %210, label %211, label %213
211: ; preds = %205
%212 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.25, i64 0, i64 0))
br label %213
213: ; preds = %211, %205
%214 = load i32*, i32** %2
%215 = getelementptr inbounds i32, i32* %214, i64 7
%216 = load i32, i32* %215
%217 = and i32 %216, 256
%218 = icmp ne i32 %217, 0
br i1 %218, label %219, label %221
219: ; preds = %213
%220 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.26, i64 0, i64 0))
br label %221
221: ; preds = %219, %213
br label %222
222: ; preds = %221, %124
%223 = load i32*, i32** %2
%224 = getelementptr inbounds i32, i32* %223, i64 7
%225 = load i32, i32* %224
%226 = and i32 %225, 65024
%227 = icmp ne i32 %226, 0
br i1 %227, label %228, label %293
228: ; preds = %222
%229 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0))
%230 = load i32*, i32** %2
%231 = getelementptr inbounds i32, i32* %230, i64 0
%232 = load i32, i32* %231
%233 = icmp slt i32 %232, 2
br i1 %233, label %234, label %236
234: ; preds = %228
%235 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.27, i64 0, i64 0))
br label %236
236: ; preds = %234, %228
%237 = load i32*, i32** %2
%238 = getelementptr inbounds i32, i32* %237, i64 7
%239 = load i32, i32* %238
%240 = and i32 %239, 512
%241 = icmp ne i32 %240, 0
br i1 %241, label %242, label %244
242: ; preds = %236
%243 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0))
br label %244
244: ; preds = %242, %236
%245 = load i32*, i32** %2
%246 = getelementptr inbounds i32, i32* %245, i64 7
%247 = load i32, i32* %246
%248 = and i32 %247, 1024
%249 = icmp ne i32 %248, 0
br i1 %249, label %250, label %252
250: ; preds = %244
%251 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.29, i64 0, i64 0))
br label %252
252: ; preds = %250, %244
%253 = load i32*, i32** %2
%254 = getelementptr inbounds i32, i32* %253, i64 7
%255 = load i32, i32* %254
%256 = and i32 %255, 2048
%257 = icmp ne i32 %256, 0
br i1 %257, label %258, label %260
258: ; preds = %252
%259 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.30, i64 0, i64 0))
br label %260
260: ; preds = %258, %252
%261 = load i32*, i32** %2
%262 = getelementptr inbounds i32, i32* %261, i64 7
%263 = load i32, i32* %262
%264 = and i32 %263, 4096
%265 = icmp ne i32 %264, 0
br i1 %265, label %266, label %268
266: ; preds = %260
%267 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.31, i64 0, i64 0))
br label %268
268: ; preds = %266, %260
%269 = load i32*, i32** %2
%270 = getelementptr inbounds i32, i32* %269, i64 7
%271 = load i32, i32* %270
%272 = and i32 %271, 8192
%273 = icmp ne i32 %272, 0
br i1 %273, label %274, label %276
274: ; preds = %268
%275 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.32, i64 0, i64 0))
br label %276
276: ; preds = %274, %268
%277 = load i32*, i32** %2
%278 = getelementptr inbounds i32, i32* %277, i64 7
%279 = load i32, i32* %278
%280 = and i32 %279, 16384
%281 = icmp ne i32 %280, 0
br i1 %281, label %282, label %284
282: ; preds = %276
%283 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.33, i64 0, i64 0))
br label %284
284: ; preds = %282, %276
%285 = load i32*, i32** %2
%286 = getelementptr inbounds i32, i32* %285, i64 7
%287 = load i32, i32* %286
%288 = and i32 %287, 32768
%289 = icmp ne i32 %288, 0
br i1 %289, label %290, label %292
290: ; preds = %284
%291 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.34, i64 0, i64 0))
br label %292
292: ; preds = %290, %284
br label %293
293: ; preds = %292, %222
%294 = load i32*, i32** %2
%295 = getelementptr inbounds i32, i32* %294, i64 21
%296 = load i32, i32* %295
%297 = and i32 %296, 63488
%298 = icmp ne i32 %297, 0
br i1 %298, label %299, label %348
299: ; preds = %293
%300 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0))
%301 = load i32*, i32** %2
%302 = getelementptr inbounds i32, i32* %301, i64 0
%303 = load i32, i32* %302
%304 = icmp slt i32 %303, 2
br i1 %304, label %305, label %307
305: ; preds = %299
%306 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.27, i64 0, i64 0))
br label %307
307: ; preds = %305, %299
%308 = load i32*, i32** %2
%309 = getelementptr inbounds i32, i32* %308, i64 21
%310 = load i32, i32* %309
%311 = and i32 %310, 2048
%312 = icmp ne i32 %311, 0
br i1 %312, label %313, label %315
313: ; preds = %307
%314 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.35, i64 0, i64 0))
br label %315
315: ; preds = %313, %307
%316 = load i32*, i32** %2
%317 = getelementptr inbounds i32, i32* %316, i64 21
%318 = load i32, i32* %317
%319 = and i32 %318, 4096
%320 = icmp ne i32 %319, 0
br i1 %320, label %321, label %323
321: ; preds = %315
%322 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.36, i64 0, i64 0))
br label %323
323: ; preds = %321, %315
%324 = load i32*, i32** %2
%325 = getelementptr inbounds i32, i32* %324, i64 21
%326 = load i32, i32* %325
%327 = and i32 %326, 8192
%328 = icmp ne i32 %327, 0
br i1 %328, label %329, label %331
329: ; preds = %323
%330 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.37, i64 0, i64 0))
br label %331
331: ; preds = %329, %323
%332 = load i32*, i32** %2
%333 = getelementptr inbounds i32, i32* %332, i64 21
%334 = load i32, i32* %333
%335 = and i32 %334, 16384
%336 = icmp ne i32 %335, 0
br i1 %336, label %337, label %339
337: ; preds = %331
%338 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.38, i64 0, i64 0))
br label %339
339: ; preds = %337, %331
%340 = load i32*, i32** %2
%341 = getelementptr inbounds i32, i32* %340, i64 21
%342 = load i32, i32* %341
%343 = and i32 %342, 32768
%344 = icmp ne i32 %343, 0
br i1 %344, label %345, label %347
345: ; preds = %339
%346 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.39, i64 0, i64 0))
br label %347
347: ; preds = %345, %339
br label %348
348: ; preds = %347, %293
%349 = call i32 @putchar(i8 signext 10)
%350 = load i32*, i32** %2
%351 = getelementptr inbounds i32, i32* %350, i64 8
%352 = load i32, i32* %351
%353 = icmp ne i32 %352, 0
br i1 %353, label %354, label %404
354: ; preds = %348
%355 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.40, i64 0, i64 0))
%356 = load i32*, i32** %2
%357 = getelementptr inbounds i32, i32* %356, i64 0
%358 = load i32, i32* %357
%359 = icmp slt i32 %358, 2
br i1 %359, label %360, label %362
360: ; preds = %354
%361 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.27, i64 0, i64 0))
br label %362
362: ; preds = %360, %354
%363 = load i32*, i32** %2
%364 = getelementptr inbounds i32, i32* %363, i64 8
%365 = load i32, i32* %364
%366 = and i32 %365, 1
%367 = icmp ne i32 %366, 0
br i1 %367, label %368, label %370
368: ; preds = %362
%369 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.41, i64 0, i64 0))
br label %370
370: ; preds = %368, %362
%371 = load i32*, i32** %2
%372 = getelementptr inbounds i32, i32* %371, i64 8
%373 = load i32, i32* %372
%374 = and i32 %373, 2
%375 = icmp ne i32 %374, 0
br i1 %375, label %376, label %378
376: ; preds = %370
%377 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.42, i64 0, i64 0))
br label %378
378: ; preds = %376, %370
%379 = load i32*, i32** %2
%380 = getelementptr inbounds i32, i32* %379, i64 8
%381 = load i32, i32* %380
%382 = and i32 %381, 4
%383 = icmp ne i32 %382, 0
br i1 %383, label %384, label %386
384: ; preds = %378
%385 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.43, i64 0, i64 0))
br label %386
386: ; preds = %384, %378
%387 = load i32*, i32** %2
%388 = getelementptr inbounds i32, i32* %387, i64 8
%389 = load i32, i32* %388
%390 = and i32 %389, 8
%391 = icmp ne i32 %390, 0
br i1 %391, label %392, label %394
392: ; preds = %386
%393 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.44, i64 0, i64 0))
br label %394
394: ; preds = %392, %386
%395 = load i32*, i32** %2
%396 = getelementptr inbounds i32, i32* %395, i64 8
%397 = load i32, i32* %396
%398 = and i32 %397, 16
%399 = icmp ne i32 %398, 0
br i1 %399, label %400, label %402
400: ; preds = %394
%401 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.45, i64 0, i64 0))
br label %402
402: ; preds = %400, %394
%403 = call i32 @putchar(i8 signext 10)
br label %404
404: ; preds = %402, %348
ret void
}

LLVM IR (-O2):
@.str = [21 x i8] c"DCO Revision: 0x%04x\00"
@.str.1 = [30 x i8] c" -- unknown, treating as 0002\00"
@.str.3 = [20 x i8] c"\09Transfer modes:\0A\09\09\00"
@.str.4 = [19 x i8] c" mdma0 mdma1 mdma2\00"
@.str.5 = [13 x i8] c" mdma0 mdma1\00"
@.str.6 = [7 x i8] c" mdma0\00"
@.str.7 = [4 x i8] c"\0A\09\09\00"
@.str.8 = [43 x i8] c" udma0 udma1 udma2 udma3 udma4 udma5 udma6\00"
@.str.9 = [4 x i8] c"(?)\00"
@.str.10 = [37 x i8] c" udma0 udma1 udma2 udma3 udma4 udma5\00"
@.str.11 = [31 x i8] c" udma0 udma1 udma2 udma3 udma4\00"
@.str.12 = [25 x i8] c" udma0 udma1 udma2 udma3\00"
@.str.13 = [19 x i8] c" udma0 udma1 udma2\00"
@.str.14 = [13 x i8] c" udma0 udma1\00"
@.str.15 = [7 x i8] c" udma0\00"
@.str.16 = [25 x i8] c"\09Real max sectors: %llu\0A\00"
@.str.17 = [27 x i8] c"\09ATA command/feature sets:\00"
@.str.18 = [7 x i8] c" SMART\00"
@.str.19 = [11 x i8] c" self_test\00"
@.str.20 = [11 x i8] c" error_log\00"
@.str.21 = [10 x i8] c" security\00"
@.str.22 = [6 x i8] c" PUIS\00"
@.str.23 = [5 x i8] c" TCQ\00"
@.str.24 = [5 x i8] c" AAM\00"
@.str.25 = [5 x i8] c" HPA\00"
@.str.26 = [8 x i8] c" 48_bit\00"
@.str.27 = [6 x i8] c" (?):\00"
@.str.28 = [11 x i8] c" streaming\00"
@.str.29 = [20 x i8] c" TLC_Reserved_7[10]\00"
@.str.30 = [5 x i8] c" FUA\00"
@.str.31 = [16 x i8] c" selective_test\00"
@.str.32 = [17 x i8] c" conveyance_test\00"
@.str.33 = [19 x i8] c" write_read_verify\00"
@.str.34 = [16 x i8] c" reserved_7[15]\00"
@.str.35 = [11 x i8] c" free_fall\00"
@.str.36 = [19 x i8] c" trusted_computing\00"
@.str.37 = [15 x i8] c" WRITE_UNC_EXT\00"
@.str.38 = [27 x i8] c" NV_cache_power_management\00"
@.str.39 = [10 x i8] c" NV_cache\00"
@.str.40 = [31 x i8] c"\09SATA command/feature sets:\0A\09\09\00"
@.str.41 = [5 x i8] c" NCQ\00"
@.str.42 = [19 x i8] c" NZ_buffer_offsets\00"
@.str.43 = [28 x i8] c" interface_power_management\00"
@.str.44 = [20 x i8] c" async_notification\00"
@.str.45 = [5 x i8] c" SSP\00"
@str = [61 x i8] c"\0AThe following features can be selectively disabled via DCO:\00"
define void @dco_identify_print(i32* nocapture %0) {
%2 = load i32, i32* %0
%3 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([21 x i8], [21 x i8]* @.str, i64 0, i64 0), i32 %2)
%4 = load i32, i32* %0
%5 = icmp eq i32 %4, 0
%6 = icmp sgt i32 %4, 2
%7 = or i1 %5, %6
br i1 %7, label %8, label %10
8: ; preds = %1
%9 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([30 x i8], [30 x i8]* @.str.1, i64 0, i64 0))
br label %10
10: ; preds = %1, %8
%11 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([61 x i8], [61 x i8]* @str, i64 0, i64 0))
%12 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @.str.3, i64 0, i64 0))
%13 = getelementptr inbounds i32, i32* %0, i64 1
%14 = load i32, i32* %13
%15 = and i32 %14, 7
%16 = icmp eq i32 %15, 0
br i1 %16, label %31, label %17
17: ; preds = %10
%18 = and i32 %14, 4
%19 = icmp eq i32 %18, 0
br i1 %19, label %20, label %26
20: ; preds = %17
%21 = and i32 %14, 2
%22 = icmp eq i32 %21, 0
br i1 %22, label %23, label %26
23: ; preds = %20
%24 = and i32 %14, 1
%25 = icmp eq i32 %24, 0
br i1 %25, label %29, label %26
26: ; preds = %23, %20, %17
%27 = phi i8* [ getelementptr inbounds ([19 x i8], [19 x i8]* @.str.4, i64 0, i64 0), %17 ], [ getelementptr inbounds ([13 x i8], [13 x i8]* @.str.5, i64 0, i64 0), %20 ], [ getelementptr inbounds ([7 x i8], [7 x i8]* @.str.6, i64 0, i64 0), %23 ]
%28 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) %27)
br label %29
29: ; preds = %26, %23
%30 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0))
br label %31
31: ; preds = %29, %10
%32 = getelementptr inbounds i32, i32* %0, i64 2
%33 = load i32, i32* %32
%34 = and i32 %33, 64
%35 = icmp eq i32 %34, 0
br i1 %35, label %40, label %36
36: ; preds = %31
%37 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([43 x i8], [43 x i8]* @.str.8, i64 0, i64 0))
%38 = load i32, i32* %0
%39 = icmp slt i32 %38, 2
br i1 %39, label %58, label %61
40: ; preds = %31
%41 = and i32 %33, 32
%42 = icmp eq i32 %41, 0
br i1 %42, label %43, label %58
43: ; preds = %40
%44 = and i32 %33, 16
%45 = icmp eq i32 %44, 0
br i1 %45, label %46, label %58
46: ; preds = %43
%47 = and i32 %33, 8
%48 = icmp eq i32 %47, 0
br i1 %48, label %49, label %58
49: ; preds = %46
%50 = and i32 %33, 4
%51 = icmp eq i32 %50, 0
br i1 %51, label %52, label %58
52: ; preds = %49
%53 = and i32 %33, 2
%54 = icmp eq i32 %53, 0
br i1 %54, label %55, label %58
55: ; preds = %52
%56 = and i32 %33, 1
%57 = icmp eq i32 %56, 0
br i1 %57, label %61, label %58
58: ; preds = %55, %52, %49, %46, %43, %40, %36
%59 = phi i8* [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str.9, i64 0, i64 0), %36 ], [ getelementptr inbounds ([37 x i8], [37 x i8]* @.str.10, i64 0, i64 0), %40 ], [ getelementptr inbounds ([31 x i8], [31 x i8]* @.str.11, i64 0, i64 0), %43 ], [ getelementptr inbounds ([25 x i8], [25 x i8]* @.str.12, i64 0, i64 0), %46 ], [ getelementptr inbounds ([19 x i8], [19 x i8]* @.str.13, i64 0, i64 0), %49 ], [ getelementptr inbounds ([13 x i8], [13 x i8]* @.str.14, i64 0, i64 0), %52 ], [ getelementptr inbounds ([7 x i8], [7 x i8]* @.str.15, i64 0, i64 0), %55 ]
%60 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) %59)
br label %61
61: ; preds = %58, %55, %36
%62 = tail call i32 @putchar(i8 signext 10)
%63 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([25 x i8], [25 x i8]* @.str.16, i64 0, i64 0), i32 poison)
%64 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([27 x i8], [27 x i8]* @.str.17, i64 0, i64 0))
%65 = getelementptr inbounds i32, i32* %0, i64 7
%66 = load i32, i32* %65
%67 = and i32 %66, 511
%68 = icmp eq i32 %67, 0
br i1 %68, label %133, label %69
69: ; preds = %61
%70 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0))
%71 = load i32, i32* %65
%72 = and i32 %71, 1
%73 = icmp eq i32 %72, 0
br i1 %73, label %77, label %74
74: ; preds = %69
%75 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @.str.18, i64 0, i64 0))
%76 = load i32, i32* %65
br label %77
77: ; preds = %74, %69
%78 = phi i32 [ %76, %74 ], [ %71, %69 ]
%79 = and i32 %78, 2
%80 = icmp eq i32 %79, 0
br i1 %80, label %84, label %81
81: ; preds = %77
%82 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str.19, i64 0, i64 0))
%83 = load i32, i32* %65
br label %84
84: ; preds = %81, %77
%85 = phi i32 [ %83, %81 ], [ %78, %77 ]
%86 = and i32 %85, 4
%87 = icmp eq i32 %86, 0
br i1 %87, label %91, label %88
88: ; preds = %84
%89 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str.20, i64 0, i64 0))
%90 = load i32, i32* %65
br label %91
91: ; preds = %88, %84
%92 = phi i32 [ %90, %88 ], [ %85, %84 ]
%93 = and i32 %92, 8
%94 = icmp eq i32 %93, 0
br i1 %94, label %98, label %95
95: ; preds = %91
%96 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.21, i64 0, i64 0))
%97 = load i32, i32* %65
br label %98
98: ; preds = %95, %91
%99 = phi i32 [ %97, %95 ], [ %92, %91 ]
%100 = and i32 %99, 16
%101 = icmp eq i32 %100, 0
br i1 %101, label %105, label %102
102: ; preds = %98
%103 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @.str.22, i64 0, i64 0))
%104 = load i32, i32* %65
br label %105
105: ; preds = %102, %98
%106 = phi i32 [ %104, %102 ], [ %99, %98 ]
%107 = and i32 %106, 32
%108 = icmp eq i32 %107, 0
br i1 %108, label %112, label %109
109: ; preds = %105
%110 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.23, i64 0, i64 0))
%111 = load i32, i32* %65
br label %112
112: ; preds = %109, %105
%113 = phi i32 [ %111, %109 ], [ %106, %105 ]
%114 = and i32 %113, 64
%115 = icmp eq i32 %114, 0
br i1 %115, label %119, label %116
116: ; preds = %112
%117 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.24, i64 0, i64 0))
%118 = load i32, i32* %65
br label %119
119: ; preds = %116, %112
%120 = phi i32 [ %118, %116 ], [ %113, %112 ]
%121 = and i32 %120, 128
%122 = icmp eq i32 %121, 0
br i1 %122, label %126, label %123
123: ; preds = %119
%124 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.25, i64 0, i64 0))
%125 = load i32, i32* %65
br label %126
126: ; preds = %123, %119
%127 = phi i32 [ %125, %123 ], [ %120, %119 ]
%128 = and i32 %127, 256
%129 = icmp eq i32 %128, 0
br i1 %129, label %133, label %130
130: ; preds = %126
%131 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.26, i64 0, i64 0))
%132 = load i32, i32* %65
br label %133
133: ; preds = %126, %130, %61
%134 = phi i32 [ %127, %126 ], [ %132, %130 ], [ %66, %61 ]
%135 = and i32 %134, 65024
%136 = icmp eq i32 %135, 0
br i1 %136, label %191, label %137
137: ; preds = %133
%138 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0))
%139 = load i32, i32* %0
%140 = icmp slt i32 %139, 2
br i1 %140, label %141, label %143
141: ; preds = %137
%142 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @.str.27, i64 0, i64 0))
br label %143
143: ; preds = %141, %137
%144 = load i32, i32* %65
%145 = and i32 %144, 512
%146 = icmp eq i32 %145, 0
br i1 %146, label %150, label %147
147: ; preds = %143
%148 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str.28, i64 0, i64 0))
%149 = load i32, i32* %65
br label %150
150: ; preds = %147, %143
%151 = phi i32 [ %149, %147 ], [ %144, %143 ]
%152 = and i32 %151, 1024
%153 = icmp eq i32 %152, 0
br i1 %153, label %157, label %154
154: ; preds = %150
%155 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @.str.29, i64 0, i64 0))
%156 = load i32, i32* %65
br label %157
157: ; preds = %154, %150
%158 = phi i32 [ %156, %154 ], [ %151, %150 ]
%159 = and i32 %158, 2048
%160 = icmp eq i32 %159, 0
br i1 %160, label %164, label %161
161: ; preds = %157
%162 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.30, i64 0, i64 0))
%163 = load i32, i32* %65
br label %164
164: ; preds = %161, %157
%165 = phi i32 [ %163, %161 ], [ %158, %157 ]
%166 = and i32 %165, 4096
%167 = icmp eq i32 %166, 0
br i1 %167, label %171, label %168
168: ; preds = %164
%169 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.31, i64 0, i64 0))
%170 = load i32, i32* %65
br label %171
171: ; preds = %168, %164
%172 = phi i32 [ %170, %168 ], [ %165, %164 ]
%173 = and i32 %172, 8192
%174 = icmp eq i32 %173, 0
br i1 %174, label %178, label %175
175: ; preds = %171
%176 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([17 x i8], [17 x i8]* @.str.32, i64 0, i64 0))
%177 = load i32, i32* %65
br label %178
178: ; preds = %175, %171
%179 = phi i32 [ %177, %175 ], [ %172, %171 ]
%180 = and i32 %179, 16384
%181 = icmp eq i32 %180, 0
br i1 %181, label %185, label %182
182: ; preds = %178
%183 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([19 x i8], [19 x i8]* @.str.33, i64 0, i64 0))
%184 = load i32, i32* %65
br label %185
185: ; preds = %182, %178
%186 = phi i32 [ %184, %182 ], [ %179, %178 ]
%187 = and i32 %186, 32768
%188 = icmp eq i32 %187, 0
br i1 %188, label %191, label %189
189: ; preds = %185
%190 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.34, i64 0, i64 0))
br label %191
191: ; preds = %185, %189, %133
%192 = getelementptr inbounds i32, i32* %0, i64 21
%193 = load i32, i32* %192
%194 = and i32 %193, 63488
%195 = icmp eq i32 %194, 0
br i1 %195, label %236, label %196
196: ; preds = %191
%197 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i64 0, i64 0))
%198 = load i32, i32* %0
%199 = icmp slt i32 %198, 2
br i1 %199, label %200, label %202
200: ; preds = %196
%201 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @.str.27, i64 0, i64 0))
br label %202
202: ; preds = %200, %196
%203 = load i32, i32* %192
%204 = and i32 %203, 2048
%205 = icmp eq i32 %204, 0
br i1 %205, label %209, label %206
206: ; preds = %202
%207 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str.35, i64 0, i64 0))
%208 = load i32, i32* %192
br label %209
209: ; preds = %206, %202
%210 = phi i32 [ %208, %206 ], [ %203, %202 ]
%211 = and i32 %210, 4096
%212 = icmp eq i32 %211, 0
br i1 %212, label %216, label %213
213: ; preds = %209
%214 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([19 x i8], [19 x i8]* @.str.36, i64 0, i64 0))
%215 = load i32, i32* %192
br label %216
216: ; preds = %213, %209
%217 = phi i32 [ %215, %213 ], [ %210, %209 ]
%218 = and i32 %217, 8192
%219 = icmp eq i32 %218, 0
br i1 %219, label %223, label %220
220: ; preds = %216
%221 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([15 x i8], [15 x i8]* @.str.37, i64 0, i64 0))
%222 = load i32, i32* %192
br label %223
223: ; preds = %220, %216
%224 = phi i32 [ %222, %220 ], [ %217, %216 ]
%225 = and i32 %224, 16384
%226 = icmp eq i32 %225, 0
br i1 %226, label %230, label %227
227: ; preds = %223
%228 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([27 x i8], [27 x i8]* @.str.38, i64 0, i64 0))
%229 = load i32, i32* %192
br label %230
230: ; preds = %227, %223
%231 = phi i32 [ %229, %227 ], [ %224, %223 ]
%232 = and i32 %231, 32768
%233 = icmp eq i32 %232, 0
br i1 %233, label %236, label %234
234: ; preds = %230
%235 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.39, i64 0, i64 0))
br label %236
236: ; preds = %230, %234, %191
%237 = tail call i32 @putchar(i8 signext 10)
%238 = getelementptr inbounds i32, i32* %0, i64 8
%239 = load i32, i32* %238
%240 = icmp eq i32 %239, 0
br i1 %240, label %283, label %241
241: ; preds = %236
%242 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([31 x i8], [31 x i8]* @.str.40, i64 0, i64 0))
%243 = load i32, i32* %0
%244 = icmp slt i32 %243, 2
br i1 %244, label %245, label %247
245: ; preds = %241
%246 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @.str.27, i64 0, i64 0))
br label %247
247: ; preds = %245, %241
%248 = load i32, i32* %238
%249 = and i32 %248, 1
%250 = icmp eq i32 %249, 0
br i1 %250, label %254, label %251
251: ; preds = %247
%252 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.41, i64 0, i64 0))
%253 = load i32, i32* %238
br label %254
254: ; preds = %251, %247
%255 = phi i32 [ %253, %251 ], [ %248, %247 ]
%256 = and i32 %255, 2
%257 = icmp eq i32 %256, 0
br i1 %257, label %261, label %258
258: ; preds = %254
%259 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([19 x i8], [19 x i8]* @.str.42, i64 0, i64 0))
%260 = load i32, i32* %238
br label %261
261: ; preds = %258, %254
%262 = phi i32 [ %260, %258 ], [ %255, %254 ]
%263 = and i32 %262, 4
%264 = icmp eq i32 %263, 0
br i1 %264, label %268, label %265
265: ; preds = %261
%266 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([28 x i8], [28 x i8]* @.str.43, i64 0, i64 0))
%267 = load i32, i32* %238
br label %268
268: ; preds = %265, %261
%269 = phi i32 [ %267, %265 ], [ %262, %261 ]
%270 = and i32 %269, 8
%271 = icmp eq i32 %270, 0
br i1 %271, label %275, label %272
272: ; preds = %268
%273 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @.str.44, i64 0, i64 0))
%274 = load i32, i32* %238
br label %275
275: ; preds = %272, %268
%276 = phi i32 [ %274, %272 ], [ %269, %268 ]
%277 = and i32 %276, 16
%278 = icmp eq i32 %277, 0
br i1 %278, label %281, label %279
279: ; preds = %275
%280 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.45, i64 0, i64 0))
br label %281
281: ; preds = %279, %275
%282 = tail call i32 @putchar(i8 signext 10)
br label %283
283: ; preds = %281, %236
ret void
}