#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 scalar_t__ uint64_t;
typedef scalar_t__ uint32_t;

/* Variables and functions */
int EXIT_FAILURE;
int EXIT_SUCCESS;
void *atoi(char *);
scalar_t__ atoll(char *);
int /*<<< orphan*/ printf(char *, scalar_t__, char *);
scalar_t__ strcasecmp(char *, char *);
int /*<<< orphan*/ usage();
char *utoa32(scalar_t__);
char *utoa32_sse(scalar_t__);
char *utoa32_sse_2(scalar_t__);
char *utoa64(scalar_t__);
char *utoa64_sse(scalar_t__);
int main(int argc, char *argv[]) {
  uint32_t min32 = 0, max32 = 0, i32 = 0;
  uint64_t min64 = 0, max64 = 0, i64 = 0;
  enum { unknown, naive_32, naive_64, sse_32, sse_32_2, sse_64 };
  int function = unknown;
  int count = 0;
  char *tmp;
  if (argc < 3)
    usage();
  if ((strcasecmp(argv[1], "c32") == 0))
    function = naive_32;
  else if ((strcasecmp(argv[1], "c64") == 0))
    function = naive_64;
  else if ((strcasecmp(argv[1], "sse32") == 0))
    function = sse_32;
  else if ((strcasecmp(argv[1], "sse32_2") == 0))
    function = sse_32_2;
  else if ((strcasecmp(argv[1], "sse64") == 0))
    function = sse_64;
  else
    usage();
  if (function == naive_32 || function == sse_32 || function == sse_32_2) {
    if (argc == 3)
      min32 = max32 = atoi(argv[2]);
    else {
      min32 = atoi(argv[2]);
      max32 = atoi(argv[3]);
      if (min32 > max32)
        usage();
    }
  } else {
    if (argc == 3)
      min64 = max64 = atoll(argv[2]);
    else {
      min64 = atoll(argv[2]);
      max64 = atoll(argv[3]);
      if (min64 > max64)
        usage();
    }
  }
  if (argc > 4)
    count = atoi(argv[4]);
  switch (function) {
  case naive_32:
    if (count > 0)
      while (count--)
        for (i32 = min32; i32 <= max32; i32 += 4) {
          tmp = utoa32(i32 + 0);
          tmp = utoa32(i32 + 1);
          tmp = utoa32(i32 + 2);
          tmp = utoa32(i32 + 3);
        }
    else
      for (i32 = min32; i32 <= max32; i32++)
        printf("%u = %s\n", i32, utoa32(i32));
    break;
  case naive_64:
    if (count > 0)
      while (count--)
        for (i64 = min64; i64 <= max64; i64 += 4) {
          tmp = utoa64(i64 + 0);
          tmp = utoa64(i64 + 1);
          tmp = utoa64(i64 + 2);
          tmp = utoa64(i64 + 3);
        }
    else
      for (i64 = min64; i64 <= max64; i64++)
        printf("%lu = %s\n", i64, utoa64(i64));
    break;
  case sse_32:
    if (count > 0) {
      while (count--)
        for (i32 = min32; i32 <= max32; i32 += 4) {
          tmp = utoa32_sse(i32 + 0);
          tmp = utoa32_sse(i32 + 1);
          tmp = utoa32_sse(i32 + 2);
          tmp = utoa32_sse(i32 + 3);
        }
    } else
      for (i32 = min32; i32 <= max32; i32++)
        printf("%u = %s\n", i32, utoa32_sse(i32));
    break;
  case sse_32_2:
    if (count > 0) {
      while (count--)
        for (i32 = min32; i32 <= max32; i32 += 4) {
          tmp = utoa32_sse_2(i32 + 0);
          tmp = utoa32_sse_2(i32 + 1);
          tmp = utoa32_sse_2(i32 + 2);
          tmp = utoa32_sse_2(i32 + 3);
        }
    } else
      for (i32 = min32; i32 <= max32; i32++)
        printf("%u = %s\n", i32, utoa32_sse_2(i32));
    break;
  case sse_64:
    if (count > 0) {
      while (count--)
        for (i64 = min64; i64 <= max64; i64 += 4) {
          tmp = utoa64_sse(i64 + 0);
          tmp = utoa64_sse(i64 + 1);
          tmp = utoa64_sse(i64 + 2);
          tmp = utoa64_sse(i64 + 3);
        }
    } else
      for (i64 = min64; i64 <= max64; i64++)
        printf("%lu = %s\n", i64, utoa64_sse(i64));
    break;
  default:
    return EXIT_FAILURE;
  }
  return tmp ? EXIT_SUCCESS : EXIT_SUCCESS;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movq   $0x0,-0x18(%rbp)
movq   $0x0,-0x20(%rbp)
movq   $0x0,-0x28(%rbp)
movq   $0x0,-0x30(%rbp)
movq   $0x0,-0x38(%rbp)
movq   $0x0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
cmpl   $0x3,-0x8(%rbp)
jge    1208 <main+0x68>
mov    $0x0,%al
call   10b0 <usage@plt>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rdi
lea    0xdfd(%rip),%rsi
call   1040 <strcasecmp@plt>
cmp    $0x0,%rax
jne    1232 <main+0x92>
movl   $0x1,-0x44(%rbp)
jmp    12f5 <main+0x155>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rdi
lea    0xdd7(%rip),%rsi
call   1040 <strcasecmp@plt>
cmp    $0x0,%rax
jne    125c <main+0xbc>
movl   $0x2,-0x44(%rbp)
jmp    12f0 <main+0x150>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rdi
lea    0xdb1(%rip),%rsi
call   1040 <strcasecmp@plt>
cmp    $0x0,%rax
jne    1286 <main+0xe6>
movl   $0x3,-0x44(%rbp)
jmp    12eb <main+0x14b>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rdi
lea    0xd8d(%rip),%rsi
call   1040 <strcasecmp@plt>
cmp    $0x0,%rax
jne    12b0 <main+0x110>
movl   $0x4,-0x44(%rbp)
jmp    12e6 <main+0x146>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rdi
lea    0xd6b(%rip),%rsi
call   1040 <strcasecmp@plt>
cmp    $0x0,%rax
jne    12da <main+0x13a>
movl   $0x5,-0x44(%rbp)
jmp    12e1 <main+0x141>
mov    $0x0,%al
call   10b0 <usage@plt>
jmp    12e6 <main+0x146>
jmp    12eb <main+0x14b>
jmp    12f0 <main+0x150>
jmp    12f5 <main+0x155>
cmpl   $0x1,-0x44(%rbp)
je     1313 <main+0x173>
cmpl   $0x3,-0x44(%rbp)
je     1313 <main+0x173>
cmpl   $0x4,-0x44(%rbp)
jne    1378 <main+0x1d8>
cmpl   $0x3,-0x8(%rbp)
jne    1337 <main+0x197>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rdi
call   10c0 <atoi@plt>
mov    %rax,-0x20(%rbp)
mov    %rax,-0x18(%rbp)
jmp    1373 <main+0x1d3>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rdi
call   10c0 <atoi@plt>
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rdi
call   10c0 <atoi@plt>
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
jle    136e <main+0x1ce>
mov    $0x0,%al
call   10b0 <usage@plt>
jmp    1373 <main+0x1d3>
jmp    13dd <main+0x23d>
cmpl   $0x3,-0x8(%rbp)
jne    139c <main+0x1fc>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rdi
call   1070 <atoll@plt>
mov    %rax,-0x38(%rbp)
mov    %rax,-0x30(%rbp)
jmp    13d8 <main+0x238>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rdi
call   1070 <atoll@plt>
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rdi
call   1070 <atoll@plt>
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
cmp    -0x38(%rbp),%rax
jle    13d3 <main+0x233>
mov    $0x0,%al
call   10b0 <usage@plt>
jmp    13d8 <main+0x238>
jmp    13dd <main+0x23d>
cmpl   $0x4,-0x8(%rbp)
jle    13f7 <main+0x257>
mov    -0x10(%rbp),%rax
mov    0x20(%rax),%rdi
call   10c0 <atoi@plt>
mov    %eax,-0x48(%rbp)
mov    -0x44(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x58(%rbp)
sub    $0x4,%eax
ja     18c1 <main+0x721>
mov    -0x58(%rbp),%rax
lea    0xbe9(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
cmpl   $0x0,-0x48(%rbp)
jle    14b8 <main+0x318>
jmp    142f <main+0x28f>
mov    -0x48(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x48(%rbp)
cmp    $0x0,%eax
je     14b3 <main+0x313>
mov    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jg     14ae <main+0x30e>
mov    -0x28(%rbp),%rdi
add    $0x0,%rdi
call   1090 <utoa32@plt>
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rdi
add    $0x1,%rdi
call   1090 <utoa32@plt>
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rdi
add    $0x2,%rdi
call   1090 <utoa32@plt>
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rdi
add    $0x3,%rdi
call   1090 <utoa32@plt>
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x28(%rbp)
jmp    144b <main+0x2ab>
jmp    142f <main+0x28f>
jmp    1508 <main+0x368>
mov    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jg     1503 <main+0x363>
mov    -0x28(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x28(%rbp),%rdi
call   1090 <utoa32@plt>
mov    -0x60(%rbp),%rsi
mov    %rax,%rdx
lea    0xb43(%rip),%rdi
call   1060 <printf@plt>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    14c0 <main+0x320>
jmp    1508 <main+0x368>
jmp    18d2 <main+0x732>
cmpl   $0x0,-0x48(%rbp)
jle    15a5 <main+0x405>
jmp    151c <main+0x37c>
mov    -0x48(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x48(%rbp)
cmp    $0x0,%eax
je     15a0 <main+0x400>
mov    -0x30(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x38(%rbp),%rax
jg     159b <main+0x3fb>
mov    -0x40(%rbp),%rdi
add    $0x0,%rdi
call   10a0 <utoa64@plt>
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rdi
add    $0x1,%rdi
call   10a0 <utoa64@plt>
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rdi
add    $0x2,%rdi
call   10a0 <utoa64@plt>
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rdi
add    $0x3,%rdi
call   10a0 <utoa64@plt>
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x40(%rbp)
jmp    1538 <main+0x398>
jmp    151c <main+0x37c>
jmp    15f5 <main+0x455>
mov    -0x30(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x38(%rbp),%rax
jg     15f0 <main+0x450>
mov    -0x40(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x40(%rbp),%rdi
call   10a0 <utoa64@plt>
mov    -0x68(%rbp),%rsi
mov    %rax,%rdx
lea    0xa5f(%rip),%rdi
call   1060 <printf@plt>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    15ad <main+0x40d>
jmp    15f5 <main+0x455>
jmp    18d2 <main+0x732>
cmpl   $0x0,-0x48(%rbp)
jle    1692 <main+0x4f2>
jmp    1609 <main+0x469>
mov    -0x48(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x48(%rbp)
cmp    $0x0,%eax
je     168d <main+0x4ed>
mov    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jg     1688 <main+0x4e8>
mov    -0x28(%rbp),%rdi
add    $0x0,%rdi
call   1050 <utoa32_sse@plt>
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rdi
add    $0x1,%rdi
call   1050 <utoa32_sse@plt>
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rdi
add    $0x2,%rdi
call   1050 <utoa32_sse@plt>
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rdi
add    $0x3,%rdi
call   1050 <utoa32_sse@plt>
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x28(%rbp)
jmp    1625 <main+0x485>
jmp    1609 <main+0x469>
jmp    16e2 <main+0x542>
mov    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jg     16dd <main+0x53d>
mov    -0x28(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x28(%rbp),%rdi
call   1050 <utoa32_sse@plt>
mov    -0x70(%rbp),%rsi
mov    %rax,%rdx
lea    0x969(%rip),%rdi
call   1060 <printf@plt>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    169a <main+0x4fa>
jmp    16e2 <main+0x542>
jmp    18d2 <main+0x732>
cmpl   $0x0,-0x48(%rbp)
jle    177f <main+0x5df>
jmp    16f6 <main+0x556>
mov    -0x48(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x48(%rbp)
cmp    $0x0,%eax
je     177a <main+0x5da>
mov    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jg     1775 <main+0x5d5>
mov    -0x28(%rbp),%rdi
add    $0x0,%rdi
call   1030 <utoa32_sse_2@plt>
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rdi
add    $0x1,%rdi
call   1030 <utoa32_sse_2@plt>
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rdi
add    $0x2,%rdi
call   1030 <utoa32_sse_2@plt>
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rdi
add    $0x3,%rdi
call   1030 <utoa32_sse_2@plt>
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x28(%rbp)
jmp    1712 <main+0x572>
jmp    16f6 <main+0x556>
jmp    17cf <main+0x62f>
mov    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jg     17ca <main+0x62a>
mov    -0x28(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x28(%rbp),%rdi
call   1030 <utoa32_sse_2@plt>
mov    -0x78(%rbp),%rsi
mov    %rax,%rdx
lea    0x87c(%rip),%rdi
call   1060 <printf@plt>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1787 <main+0x5e7>
jmp    17cf <main+0x62f>
jmp    18d2 <main+0x732>
cmpl   $0x0,-0x48(%rbp)
jle    186c <main+0x6cc>
jmp    17e3 <main+0x643>
mov    -0x48(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x48(%rbp)
cmp    $0x0,%eax
je     1867 <main+0x6c7>
mov    -0x30(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x38(%rbp),%rax
jg     1862 <main+0x6c2>
mov    -0x40(%rbp),%rdi
add    $0x0,%rdi
call   1080 <utoa64_sse@plt>
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rdi
add    $0x1,%rdi
call   1080 <utoa64_sse@plt>
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rdi
add    $0x2,%rdi
call   1080 <utoa64_sse@plt>
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rdi
add    $0x3,%rdi
call   1080 <utoa64_sse@plt>
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x40(%rbp)
jmp    17ff <main+0x65f>
jmp    17e3 <main+0x643>
jmp    18bc <main+0x71c>
mov    -0x30(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x38(%rbp),%rax
jg     18b7 <main+0x717>
mov    -0x40(%rbp),%rax
mov    %rax,-0x80(%rbp)
mov    -0x40(%rbp),%rdi
call   1080 <utoa64_sse@plt>
mov    -0x80(%rbp),%rsi
mov    %rax,%rdx
lea    0x798(%rip),%rdi
call   1060 <printf@plt>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1874 <main+0x6d4>
jmp    18bc <main+0x71c>
jmp    18d2 <main+0x732>
mov    0x2718(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1909 <main+0x769>
cmpq   $0x0,-0x50(%rbp)
je     18f1 <main+0x751>
mov    0x26f4(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x84(%rbp)
jmp    1900 <main+0x760>
mov    0x26e0(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x84(%rbp)
mov    -0x84(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %rsi,%rbp
mov    %edi,%r15d
cmp    $0x2,%edi
jg     11c0 <main+0x20>
xor    %eax,%eax
call   10b0 <usage@plt>
mov    0x8(%rbp),%rbx
lea    0xe49(%rip),%rsi
mov    %rbx,%rdi
call   1040 <strcasecmp@plt>
test   %rax,%rax
je     1240 <main+0xa0>
lea    0xe39(%rip),%rsi
mov    %rbx,%rdi
call   1040 <strcasecmp@plt>
test   %rax,%rax
je     1248 <main+0xa8>
lea    0xe29(%rip),%rsi
mov    %rbx,%rdi
call   1040 <strcasecmp@plt>
test   %rax,%rax
je     1298 <main+0xf8>
lea    0xe17(%rip),%rsi
mov    %rbx,%rdi
call   1040 <strcasecmp@plt>
test   %rax,%rax
je     12a0 <main+0x100>
lea    0xe07(%rip),%rsi
mov    %rbx,%rdi
call   1040 <strcasecmp@plt>
test   %rax,%rax
je     167e <main+0x4de>
xor    %r13d,%r13d
xor    %eax,%eax
call   10b0 <usage@plt>
jmp    124e <main+0xae>
mov    $0x1,%r13d
jmp    12a6 <main+0x106>
mov    $0x2,%r13d
mov    0x10(%rbp),%rdi
call   1070 <atoll@plt>
mov    %rax,%r12
cmp    $0x3,%r15d
jne    1270 <main+0xd0>
xor    %ebx,%ebx
mov    %r12,%rbp
xor    %r14d,%r14d
xor    %r15d,%r15d
jmp    1313 <main+0x173>
mov    %r15d,0xc(%rsp)
mov    %rbp,0x10(%rsp)
mov    0x18(%rbp),%rdi
call   1070 <atoll@plt>
mov    %rax,%r15
xor    %r14d,%r14d
mov    $0x0,%ebx
mov    %rax,%rbp
cmp    %rax,%r12
jg     12ee <main+0x14e>
jmp    12f8 <main+0x158>
mov    $0x3,%r13d
jmp    12a6 <main+0x106>
mov    $0x4,%r13d
mov    0x10(%rbp),%rdi
call   10c0 <atoi@plt>
mov    %rax,%r14
cmp    $0x3,%r15d
jne    12c5 <main+0x125>
xor    %ebp,%ebp
xor    %r12d,%r12d
mov    %r14,%rbx
xor    %r15d,%r15d
jmp    1313 <main+0x173>
mov    %r15d,0xc(%rsp)
mov    %rbp,0x10(%rsp)
mov    0x18(%rbp),%rdi
call   10c0 <atoi@plt>
mov    %rax,%rbx
xor    %r12d,%r12d
mov    $0x0,%r15d
mov    $0x0,%ebp
cmp    %rax,%r14
jle    12f8 <main+0x158>
xor    %eax,%eax
call   10b0 <usage@plt>
mov    %r15,%rbp
xor    %r15d,%r15d
cmpl   $0x5,0xc(%rsp)
jl     1313 <main+0x173>
mov    0x10(%rsp),%rax
mov    0x20(%rax),%rdi
call   10c0 <atoi@plt>
mov    %rax,%r15
add    $0xffffffff,%r13d
cmp    $0x4,%r13d
ja     13de <main+0x23e>
lea    0xcd8(%rip),%rax
movslq (%rax,%r13,4),%rcx
add    %rax,%rcx
jmp    *%rcx
mov    0x2ca0(%rip),%r13
test   %r15d,%r15d
jg     1395 <main+0x1f5>
cmp    %rbx,%r14
jg     13e5 <main+0x245>
add    $0x1,%rbx
lea    0xcdf(%rip),%rbp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %r14,%rdi
call   1090 <utoa32@plt>
mov    %rbp,%rdi
mov    %r14,%rsi
mov    %rax,%rdx
call   1060 <printf@plt>
add    $0x1,%r14
cmp    %r14,%rbx
jne    1360 <main+0x1c0>
jmp    13e5 <main+0x245>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
test   %r15d,%r15d
je     13e5 <main+0x245>
add    $0xffffffff,%r15d
cmp    %rbx,%r14
jg     1390 <main+0x1f0>
mov    %r14,%rbp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %rbp,%rdi
call   1090 <utoa32@plt>
lea    0x1(%rbp),%rdi
call   1090 <utoa32@plt>
lea    0x2(%rbp),%rdi
call   1090 <utoa32@plt>
lea    0x3(%rbp),%rdi
call   1090 <utoa32@plt>
add    $0x4,%rbp
cmp    %rbx,%rbp
jle    13b0 <main+0x210>
jmp    1390 <main+0x1f0>
mov    0x2bfb(%rip),%r13
mov    0x0(%r13),%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    0x2bd9(%rip),%r13
test   %r15d,%r15d
jg     1455 <main+0x2b5>
cmp    %rbp,%r12
jg     13e5 <main+0x245>
add    $0x1,%rbp
lea    0xc25(%rip),%rbx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %r12,%rdi
call   10a0 <utoa64@plt>
mov    %rbx,%rdi
mov    %r12,%rsi
mov    %rax,%rdx
call   1060 <printf@plt>
add    $0x1,%r12
cmp    %r12,%rbp
jne    1420 <main+0x280>
jmp    13e5 <main+0x245>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
test   %r15d,%r15d
je     13e5 <main+0x245>
add    $0xffffffff,%r15d
cmp    %rbp,%r12
jg     1450 <main+0x2b0>
mov    %r12,%rbx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %rbx,%rdi
call   10a0 <utoa64@plt>
lea    0x1(%rbx),%rdi
call   10a0 <utoa64@plt>
lea    0x2(%rbx),%rdi
call   10a0 <utoa64@plt>
lea    0x3(%rbx),%rdi
call   10a0 <utoa64@plt>
add    $0x4,%rbx
cmp    %rbp,%rbx
jle    1470 <main+0x2d0>
jmp    1450 <main+0x2b0>
mov    0x2b33(%rip),%r13
test   %r15d,%r15d
jg     14f9 <main+0x359>
cmp    %rbx,%r14
jg     13e5 <main+0x245>
add    $0x1,%rbx
lea    0xb72(%rip),%rbp
xchg   %ax,%ax
mov    %r14,%rdi
call   1050 <utoa32_sse@plt>
mov    %rbp,%rdi
mov    %r14,%rsi
mov    %rax,%rdx
call   1060 <printf@plt>
add    $0x1,%r14
cmp    %r14,%rbx
jne    14c0 <main+0x320>
jmp    13e5 <main+0x245>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
test   %r15d,%r15d
je     13e5 <main+0x245>
add    $0xffffffff,%r15d
cmp    %rbx,%r14
jg     14f0 <main+0x350>
mov    %r14,%rbp
cs nopw 0x0(%rax,%rax,1)
nop
mov    %rbp,%rdi
call   1050 <utoa32_sse@plt>
lea    0x1(%rbp),%rdi
call   1050 <utoa32_sse@plt>
lea    0x2(%rbp),%rdi
call   1050 <utoa32_sse@plt>
lea    0x3(%rbp),%rdi
call   1050 <utoa32_sse@plt>
add    $0x4,%rbp
cmp    %rbx,%rbp
jle    1510 <main+0x370>
jmp    14f0 <main+0x350>
mov    0x2a93(%rip),%r13
test   %r15d,%r15d
jg     1599 <main+0x3f9>
cmp    %rbx,%r14
jg     13e5 <main+0x245>
add    $0x1,%rbx
lea    0xad2(%rip),%rbp
xchg   %ax,%ax
mov    %r14,%rdi
call   1030 <utoa32_sse_2@plt>
mov    %rbp,%rdi
mov    %r14,%rsi
mov    %rax,%rdx
call   1060 <printf@plt>
add    $0x1,%r14
cmp    %r14,%rbx
jne    1560 <main+0x3c0>
jmp    13e5 <main+0x245>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
test   %r15d,%r15d
je     13e5 <main+0x245>
add    $0xffffffff,%r15d
cmp    %rbx,%r14
jg     1590 <main+0x3f0>
mov    %r14,%rbp
cs nopw 0x0(%rax,%rax,1)
nop
mov    %rbp,%rdi
call   1030 <utoa32_sse_2@plt>
lea    0x1(%rbp),%rdi
call   1030 <utoa32_sse_2@plt>
lea    0x2(%rbp),%rdi
call   1030 <utoa32_sse_2@plt>
lea    0x3(%rbp),%rdi
call   1030 <utoa32_sse_2@plt>
add    $0x4,%rbp
cmp    %rbx,%rbp
jle    15b0 <main+0x410>
jmp    1590 <main+0x3f0>
mov    0x29f3(%rip),%r13
test   %r15d,%r15d
jg     1639 <main+0x499>
cmp    %rbp,%r12
jg     13e5 <main+0x245>
add    $0x1,%rbp
lea    0xa3b(%rip),%rbx
xchg   %ax,%ax
mov    %r12,%rdi
call   1080 <utoa64_sse@plt>
mov    %rbx,%rdi
mov    %r12,%rsi
mov    %rax,%rdx
call   1060 <printf@plt>
add    $0x1,%r12
cmp    %r12,%rbp
jne    1600 <main+0x460>
jmp    13e5 <main+0x245>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
test   %r15d,%r15d
je     13e5 <main+0x245>
add    $0xffffffff,%r15d
cmp    %rbp,%r12
jg     1630 <main+0x490>
mov    %r12,%rbx
cs nopw 0x0(%rax,%rax,1)
nop
mov    %rbx,%rdi
call   1080 <utoa64_sse@plt>
lea    0x1(%rbx),%rdi
call   1080 <utoa64_sse@plt>
lea    0x2(%rbx),%rdi
call   1080 <utoa64_sse@plt>
lea    0x3(%rbx),%rdi
call   1080 <utoa64_sse@plt>
add    $0x4,%rbx
cmp    %rbp,%rbx
jle    1650 <main+0x4b0>
jmp    1630 <main+0x490>
mov    $0x5,%r13d
jmp    124e <main+0xae>

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

LLVM IR (-O2):
@.str = [4 x i8] c"c32\00"
@.str.1 = [4 x i8] c"c64\00"
@.str.2 = [6 x i8] c"sse32\00"
@.str.3 = [8 x i8] c"sse32_2\00"
@.str.4 = [6 x i8] c"sse64\00"
@.str.5 = [9 x i8] c"%u = %s\0A\00"
@.str.6 = [10 x i8] c"%lu = %s\0A\00"
@EXIT_FAILURE = global i32 0
@EXIT_SUCCESS = global i32 0
define i32 @main(i32 %0, i8** nocapture %1) {
%3 = icmp slt i32 %0, 3
br i1 %3, label %4, label %6
4: ; preds = %2
%5 = tail call i32 (...) @usage()
br label %6
6: ; preds = %4, %2
%7 = getelementptr inbounds i8*, i8** %1, i64 1
%8 = load i8*, i8** %7
%9 = tail call i64 @strcasecmp(i8* %8, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0))
%10 = icmp eq i64 %9, 0
br i1 %10, label %25, label %11
11: ; preds = %6
%12 = tail call i64 @strcasecmp(i8* %8, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i64 0, i64 0))
%13 = icmp eq i64 %12, 0
br i1 %13, label %38, label %14
14: ; preds = %11
%15 = tail call i64 @strcasecmp(i8* %8, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i64 0, i64 0))
%16 = icmp eq i64 %15, 0
br i1 %16, label %25, label %17
17: ; preds = %14
%18 = tail call i64 @strcasecmp(i8* %8, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.3, i64 0, i64 0))
%19 = icmp eq i64 %18, 0
br i1 %19, label %25, label %20
20: ; preds = %17
%21 = tail call i64 @strcasecmp(i8* %8, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i64 0, i64 0))
%22 = icmp eq i64 %21, 0
br i1 %22, label %38, label %23
23: ; preds = %20
%24 = tail call i32 (...) @usage()
br label %38
25: ; preds = %17, %14, %6
%26 = phi i32 [ 4, %17 ], [ 3, %14 ], [ 1, %6 ]
%27 = icmp eq i32 %0, 3
%28 = getelementptr inbounds i8*, i8** %1, i64 2
%29 = load i8*, i8** %28
%30 = tail call i8* @atoi(i8* %29)
%31 = ptrtoint i8* %30 to i64
br i1 %27, label %69, label %32
32: ; preds = %25
%33 = getelementptr inbounds i8*, i8** %1, i64 3
%34 = load i8*, i8** %33
%35 = tail call i8* @atoi(i8* %34)
%36 = ptrtoint i8* %35 to i64
%37 = icmp sgt i8* %30, %35
br i1 %37, label %49, label %56
38: ; preds = %23, %11, %20
%39 = phi i32 [ 0, %23 ], [ 2, %11 ], [ 5, %20 ]
%40 = icmp eq i32 %0, 3
%41 = getelementptr inbounds i8*, i8** %1, i64 2
%42 = load i8*, i8** %41
%43 = tail call i64 @atoll(i8* %42)
br i1 %40, label %69, label %44
44: ; preds = %38
%45 = getelementptr inbounds i8*, i8** %1, i64 3
%46 = load i8*, i8** %45
%47 = tail call i64 @atoll(i8* %46)
%48 = icmp sgt i64 %43, %47
br i1 %48, label %49, label %56
49: ; preds = %44, %32
%50 = phi i32 [ %26, %32 ], [ %39, %44 ]
%51 = phi i64 [ %31, %32 ], [ 0, %44 ]
%52 = phi i64 [ %36, %32 ], [ 0, %44 ]
%53 = phi i64 [ 0, %32 ], [ %43, %44 ]
%54 = phi i64 [ 0, %32 ], [ %47, %44 ]
%55 = tail call i32 (...) @usage()
br label %56
56: ; preds = %49, %44, %32
%57 = phi i32 [ %26, %32 ], [ %39, %44 ], [ %50, %49 ]
%58 = phi i64 [ %31, %32 ], [ 0, %44 ], [ %51, %49 ]
%59 = phi i64 [ %36, %32 ], [ 0, %44 ], [ %52, %49 ]
%60 = phi i64 [ 0, %32 ], [ %43, %44 ], [ %53, %49 ]
%61 = phi i64 [ 0, %32 ], [ %47, %44 ], [ %54, %49 ]
%62 = icmp sgt i32 %0, 4
br i1 %62, label %63, label %69
63: ; preds = %56
%64 = getelementptr inbounds i8*, i8** %1, i64 4
%65 = load i8*, i8** %64
%66 = tail call i8* @atoi(i8* %65)
%67 = ptrtoint i8* %66 to i64
%68 = trunc i64 %67 to i32
br label %69
69: ; preds = %38, %25, %63, %56
%70 = phi i64 [ %61, %63 ], [ %61, %56 ], [ 0, %25 ], [ %43, %38 ]
%71 = phi i64 [ %60, %63 ], [ %60, %56 ], [ 0, %25 ], [ %43, %38 ]
%72 = phi i64 [ %59, %63 ], [ %59, %56 ], [ %31, %25 ], [ 0, %38 ]
%73 = phi i64 [ %58, %63 ], [ %58, %56 ], [ %31, %25 ], [ 0, %38 ]
%74 = phi i32 [ %57, %63 ], [ %57, %56 ], [ %26, %25 ], [ %39, %38 ]
%75 = phi i32 [ %68, %63 ], [ 0, %56 ], [ 0, %25 ], [ 0, %38 ]
switch i32 %74, label %206 [
i32 1, label %76
i32 2, label %102
i32 3, label %128
i32 4, label %154
i32 5, label %180
]
76: ; preds = %69
%77 = icmp sgt i32 %75, 0
%78 = icmp sgt i64 %73, %72
br i1 %77, label %82, label %79
79: ; preds = %76
br i1 %78, label %206, label %96
80: ; preds = %85, %82
%81 = icmp eq i32 %84, 0
br i1 %81, label %206, label %82
82: ; preds = %76, %80
%83 = phi i32 [ %84, %80 ], [ %75, %76 ]
%84 = add nsw i32 %83, -1
br i1 %78, label %80, label %85
85: ; preds = %82, %85
%86 = phi i64 [ %94, %85 ], [ %73, %82 ]
%87 = tail call i8* @utoa32(i64 %86)
%88 = add nsw i64 %86, 1
%89 = tail call i8* @utoa32(i64 %88)
%90 = add nsw i64 %86, 2
%91 = tail call i8* @utoa32(i64 %90)
%92 = add nsw i64 %86, 3
%93 = tail call i8* @utoa32(i64 %92)
%94 = add nsw i64 %86, 4
%95 = icmp sgt i64 %94, %72
br i1 %95, label %80, label %85
96: ; preds = %79, %96
%97 = phi i64 [ %100, %96 ], [ %73, %79 ]
%98 = tail call i8* @utoa32(i64 %97)
%99 = tail call i32 @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.5, i64 0, i64 0), i64 %97, i8* %98)
%100 = add i64 %97, 1
%101 = icmp eq i64 %97, %72
br i1 %101, label %206, label %96
102: ; preds = %69
%103 = icmp sgt i32 %75, 0
%104 = icmp sgt i64 %71, %70
br i1 %103, label %108, label %105
105: ; preds = %102
br i1 %104, label %206, label %122
106: ; preds = %111, %108
%107 = icmp eq i32 %110, 0
br i1 %107, label %206, label %108
108: ; preds = %102, %106
%109 = phi i32 [ %110, %106 ], [ %75, %102 ]
%110 = add nsw i32 %109, -1
br i1 %104, label %106, label %111
111: ; preds = %108, %111
%112 = phi i64 [ %120, %111 ], [ %71, %108 ]
%113 = tail call i8* @utoa64(i64 %112)
%114 = add nsw i64 %112, 1
%115 = tail call i8* @utoa64(i64 %114)
%116 = add nsw i64 %112, 2
%117 = tail call i8* @utoa64(i64 %116)
%118 = add nsw i64 %112, 3
%119 = tail call i8* @utoa64(i64 %118)
%120 = add nsw i64 %112, 4
%121 = icmp sgt i64 %120, %70
br i1 %121, label %106, label %111
122: ; preds = %105, %122
%123 = phi i64 [ %126, %122 ], [ %71, %105 ]
%124 = tail call i8* @utoa64(i64 %123)
%125 = tail call i32 @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i64 0, i64 0), i64 %123, i8* %124)
%126 = add i64 %123, 1
%127 = icmp eq i64 %123, %70
br i1 %127, label %206, label %122
128: ; preds = %69
%129 = icmp sgt i32 %75, 0
%130 = icmp sgt i64 %73, %72
br i1 %129, label %134, label %131
131: ; preds = %128
br i1 %130, label %206, label %148
132: ; preds = %137, %134
%133 = icmp eq i32 %136, 0
br i1 %133, label %206, label %134
134: ; preds = %128, %132
%135 = phi i32 [ %136, %132 ], [ %75, %128 ]
%136 = add nsw i32 %135, -1
br i1 %130, label %132, label %137
137: ; preds = %134, %137
%138 = phi i64 [ %146, %137 ], [ %73, %134 ]
%139 = tail call i8* @utoa32_sse(i64 %138)
%140 = add nsw i64 %138, 1
%141 = tail call i8* @utoa32_sse(i64 %140)
%142 = add nsw i64 %138, 2
%143 = tail call i8* @utoa32_sse(i64 %142)
%144 = add nsw i64 %138, 3
%145 = tail call i8* @utoa32_sse(i64 %144)
%146 = add nsw i64 %138, 4
%147 = icmp sgt i64 %146, %72
br i1 %147, label %132, label %137
148: ; preds = %131, %148
%149 = phi i64 [ %152, %148 ], [ %73, %131 ]
%150 = tail call i8* @utoa32_sse(i64 %149)
%151 = tail call i32 @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.5, i64 0, i64 0), i64 %149, i8* %150)
%152 = add i64 %149, 1
%153 = icmp eq i64 %149, %72
br i1 %153, label %206, label %148
154: ; preds = %69
%155 = icmp sgt i32 %75, 0
%156 = icmp sgt i64 %73, %72
br i1 %155, label %160, label %157
157: ; preds = %154
br i1 %156, label %206, label %174
158: ; preds = %163, %160
%159 = icmp eq i32 %162, 0
br i1 %159, label %206, label %160
160: ; preds = %154, %158
%161 = phi i32 [ %162, %158 ], [ %75, %154 ]
%162 = add nsw i32 %161, -1
br i1 %156, label %158, label %163
163: ; preds = %160, %163
%164 = phi i64 [ %172, %163 ], [ %73, %160 ]
%165 = tail call i8* @utoa32_sse_2(i64 %164)
%166 = add nsw i64 %164, 1
%167 = tail call i8* @utoa32_sse_2(i64 %166)
%168 = add nsw i64 %164, 2
%169 = tail call i8* @utoa32_sse_2(i64 %168)
%170 = add nsw i64 %164, 3
%171 = tail call i8* @utoa32_sse_2(i64 %170)
%172 = add nsw i64 %164, 4
%173 = icmp sgt i64 %172, %72
br i1 %173, label %158, label %163
174: ; preds = %157, %174
%175 = phi i64 [ %178, %174 ], [ %73, %157 ]
%176 = tail call i8* @utoa32_sse_2(i64 %175)
%177 = tail call i32 @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.5, i64 0, i64 0), i64 %175, i8* %176)
%178 = add i64 %175, 1
%179 = icmp eq i64 %175, %72
br i1 %179, label %206, label %174
180: ; preds = %69
%181 = icmp sgt i32 %75, 0
%182 = icmp sgt i64 %71, %70
br i1 %181, label %186, label %183
183: ; preds = %180
br i1 %182, label %206, label %200
184: ; preds = %189, %186
%185 = icmp eq i32 %188, 0
br i1 %185, label %206, label %186
186: ; preds = %180, %184
%187 = phi i32 [ %188, %184 ], [ %75, %180 ]
%188 = add nsw i32 %187, -1
br i1 %182, label %184, label %189
189: ; preds = %186, %189
%190 = phi i64 [ %198, %189 ], [ %71, %186 ]
%191 = tail call i8* @utoa64_sse(i64 %190)
%192 = add nsw i64 %190, 1
%193 = tail call i8* @utoa64_sse(i64 %192)
%194 = add nsw i64 %190, 2
%195 = tail call i8* @utoa64_sse(i64 %194)
%196 = add nsw i64 %190, 3
%197 = tail call i8* @utoa64_sse(i64 %196)
%198 = add nsw i64 %190, 4
%199 = icmp sgt i64 %198, %70
br i1 %199, label %184, label %189
200: ; preds = %183, %200
%201 = phi i64 [ %204, %200 ], [ %71, %183 ]
%202 = tail call i8* @utoa64_sse(i64 %201)
%203 = tail call i32 @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i64 0, i64 0), i64 %201, i8* %202)
%204 = add i64 %201, 1
%205 = icmp eq i64 %201, %70
br i1 %205, label %206, label %200
206: ; preds = %200, %184, %174, %158, %148, %132, %122, %106, %96, %80, %183, %157, %131, %105, %79, %69
%207 = phi i32* [ @EXIT_FAILURE, %69 ], [ @EXIT_SUCCESS, %79 ], [ @EXIT_SUCCESS, %105 ], [ @EXIT_SUCCESS, %131 ], [ @EXIT_SUCCESS, %157 ], [ @EXIT_SUCCESS, %183 ], [ @EXIT_SUCCESS, %80 ], [ @EXIT_SUCCESS, %96 ], [ @EXIT_SUCCESS, %106 ], [ @EXIT_SUCCESS, %122 ], [ @EXIT_SUCCESS, %132 ], [ @EXIT_SUCCESS, %148 ], [ @EXIT_SUCCESS, %158 ], [ @EXIT_SUCCESS, %174 ], [ @EXIT_SUCCESS, %184 ], [ @EXIT_SUCCESS, %200 ]
%208 = load i32, i32* %207
ret i32 %208
}