unsigned long davidegrayson_nibble_sort_counter_word(unsigned long w) {
  unsigned char frequency_map[0x10] = {0};
  frequency_map[w >> 0x00 & 0xf]++;
  frequency_map[w >> 0x04 & 0xf]++;
  frequency_map[w >> 0x08 & 0xf]++;
  frequency_map[w >> 0x0c & 0xf]++;
  frequency_map[w >> 0x10 & 0xf]++;
  frequency_map[w >> 0x14 & 0xf]++;
  frequency_map[w >> 0x18 & 0xf]++;
  frequency_map[w >> 0x1c & 0xf]++;
  frequency_map[w >> 0x20 & 0xf]++;
  frequency_map[w >> 0x24 & 0xf]++;
  frequency_map[w >> 0x28 & 0xf]++;
  frequency_map[w >> 0x2c & 0xf]++;
  frequency_map[w >> 0x30 & 0xf]++;
  frequency_map[w >> 0x34 & 0xf]++;
  frequency_map[w >> 0x38 & 0xf]++;
  frequency_map[w >> 0x3c & 0xf]++;
  unsigned long r = 0;
  for (unsigned int j = 0; j < frequency_map[0x1]; j++)
    r = ((unsigned long)0x1 << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0x2]; j++)
    r = ((unsigned long)0x2 << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0x3]; j++)
    r = ((unsigned long)0x3 << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0x4]; j++)
    r = ((unsigned long)0x4 << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0x5]; j++)
    r = ((unsigned long)0x5 << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0x6]; j++)
    r = ((unsigned long)0x6 << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0x7]; j++)
    r = ((unsigned long)0x7 << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0x8]; j++)
    r = ((unsigned long)0x8 << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0x9]; j++)
    r = ((unsigned long)0x9 << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0xa]; j++)
    r = ((unsigned long)0xa << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0xb]; j++)
    r = ((unsigned long)0xb << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0xc]; j++)
    r = ((unsigned long)0xc << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0xd]; j++)
    r = ((unsigned long)0xd << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0xe]; j++)
    r = ((unsigned long)0xe << 60) | (r >> 4);
  for (unsigned int j = 0; j < frequency_map[0xf]; j++)
    r = ((unsigned long)0xf << 60) | (r >> 4);
  return r;
}


x86 assembly (clang, -O0):
<davidegrayson_nibble_sort_counter_word>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x8(%rbp)
lea    -0x20(%rbp),%rdi
xor    %esi,%esi
mov    $0x10,%edx
call   1030 <memset@plt>
mov    -0x8(%rbp),%rax
shr    $0x0,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x4,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x8,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0xc,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x10,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x14,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x18,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x1c,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x20,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x24,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x28,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x2c,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x30,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x34,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x38,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x8(%rbp),%rax
shr    $0x3c,%rax
and    $0xf,%rax
mov    -0x20(%rbp,%rax,1),%cl
add    $0x1,%cl
mov    %cl,-0x20(%rbp,%rax,1)
movq   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
movzbl -0x1f(%rbp),%ecx
cmp    %ecx,%eax
jae    12e1 <davidegrayson_nibble_sort_counter_word+0x1d1>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0x1000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    12ab <davidegrayson_nibble_sort_counter_word+0x19b>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
movzbl -0x1e(%rbp),%ecx
cmp    %ecx,%eax
jae    131e <davidegrayson_nibble_sort_counter_word+0x20e>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0x2000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    12e8 <davidegrayson_nibble_sort_counter_word+0x1d8>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
movzbl -0x1d(%rbp),%ecx
cmp    %ecx,%eax
jae    135b <davidegrayson_nibble_sort_counter_word+0x24b>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0x3000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1325 <davidegrayson_nibble_sort_counter_word+0x215>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
movzbl -0x1c(%rbp),%ecx
cmp    %ecx,%eax
jae    1398 <davidegrayson_nibble_sort_counter_word+0x288>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0x4000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1362 <davidegrayson_nibble_sort_counter_word+0x252>
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
movzbl -0x1b(%rbp),%ecx
cmp    %ecx,%eax
jae    13d5 <davidegrayson_nibble_sort_counter_word+0x2c5>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0x5000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    139f <davidegrayson_nibble_sort_counter_word+0x28f>
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
movzbl -0x1a(%rbp),%ecx
cmp    %ecx,%eax
jae    1412 <davidegrayson_nibble_sort_counter_word+0x302>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0x6000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    13dc <davidegrayson_nibble_sort_counter_word+0x2cc>
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
movzbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
jae    144f <davidegrayson_nibble_sort_counter_word+0x33f>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0x7000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1419 <davidegrayson_nibble_sort_counter_word+0x309>
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%eax
movzbl -0x18(%rbp),%ecx
cmp    %ecx,%eax
jae    148c <davidegrayson_nibble_sort_counter_word+0x37c>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0x8000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    1456 <davidegrayson_nibble_sort_counter_word+0x346>
movl   $0x0,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
movzbl -0x17(%rbp),%ecx
cmp    %ecx,%eax
jae    14c9 <davidegrayson_nibble_sort_counter_word+0x3b9>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0x9000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1493 <davidegrayson_nibble_sort_counter_word+0x383>
movl   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%eax
movzbl -0x16(%rbp),%ecx
cmp    %ecx,%eax
jae    1506 <davidegrayson_nibble_sort_counter_word+0x3f6>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0xa000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    14d0 <davidegrayson_nibble_sort_counter_word+0x3c0>
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
movzbl -0x15(%rbp),%ecx
cmp    %ecx,%eax
jae    1543 <davidegrayson_nibble_sort_counter_word+0x433>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0xb000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    150d <davidegrayson_nibble_sort_counter_word+0x3fd>
movl   $0x0,-0x58(%rbp)
mov    -0x58(%rbp),%eax
movzbl -0x14(%rbp),%ecx
cmp    %ecx,%eax
jae    1580 <davidegrayson_nibble_sort_counter_word+0x470>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0xc000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    154a <davidegrayson_nibble_sort_counter_word+0x43a>
movl   $0x0,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
movzbl -0x13(%rbp),%ecx
cmp    %ecx,%eax
jae    15bd <davidegrayson_nibble_sort_counter_word+0x4ad>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0xd000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    1587 <davidegrayson_nibble_sort_counter_word+0x477>
movl   $0x0,-0x60(%rbp)
mov    -0x60(%rbp),%eax
movzbl -0x12(%rbp),%ecx
cmp    %ecx,%eax
jae    15fa <davidegrayson_nibble_sort_counter_word+0x4ea>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0xe000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x60(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x60(%rbp)
jmp    15c4 <davidegrayson_nibble_sort_counter_word+0x4b4>
movl   $0x0,-0x64(%rbp)
mov    -0x64(%rbp),%eax
movzbl -0x11(%rbp),%ecx
cmp    %ecx,%eax
jae    1637 <davidegrayson_nibble_sort_counter_word+0x527>
mov    -0x28(%rbp),%rax
shr    $0x4,%rax
movabs $0xf000000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    1601 <davidegrayson_nibble_sort_counter_word+0x4f1>
mov    -0x28(%rbp),%rax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<davidegrayson_nibble_sort_counter_word>:
xorps  %xmm0,%xmm0
movaps %xmm0,-0x18(%rsp)
mov    %edi,%eax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %edi,%eax
shr    $0x4,%eax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %edi,%eax
shr    $0x8,%eax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %edi,%eax
shr    $0xc,%eax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %edi,%eax
shr    $0x10,%eax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %edi,%eax
shr    $0x14,%eax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %edi,%eax
shr    $0x18,%eax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %edi,%eax
shr    $0x1c,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %rdi,%rax
shr    $0x20,%rax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %rdi,%rax
shr    $0x24,%rax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %rdi,%rax
shr    $0x28,%rax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %rdi,%rax
shr    $0x2c,%rax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %rdi,%rax
shr    $0x30,%rax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %rdi,%rax
shr    $0x34,%rax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
mov    %rdi,%rax
shr    $0x38,%rax
and    $0xf,%eax
addb   $0x1,-0x18(%rsp,%rax,1)
shr    $0x3c,%rdi
addb   $0x1,-0x18(%rsp,%rdi,1)
movzbl -0x17(%rsp),%edx
test   %edx,%edx
je     11f6 <davidegrayson_nibble_sort_counter_word+0xf6>
lea    -0x1(%rdx),%eax
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%eax
jae    11fa <davidegrayson_nibble_sort_counter_word+0xfa>
xor    %eax,%eax
jmp    121c <davidegrayson_nibble_sort_counter_word+0x11c>
xor    %eax,%eax
jmp    123c <davidegrayson_nibble_sort_counter_word+0x13c>
and    $0xfffffff8,%edx
xor    %eax,%eax
movabs $0x1111111100000000,%rsi
11 11 11
nopl   0x0(%rax)
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    1210 <davidegrayson_nibble_sort_counter_word+0x110>
test   %ecx,%ecx
je     123c <davidegrayson_nibble_sort_counter_word+0x13c>
movabs $0x1000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    1230 <davidegrayson_nibble_sort_counter_word+0x130>
movzbl -0x16(%rsp),%edx
test   %edx,%edx
je     128c <davidegrayson_nibble_sort_counter_word+0x18c>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     126c <davidegrayson_nibble_sort_counter_word+0x16c>
and    $0xfffffff8,%edx
movabs $0x2222222200000000,%rsi
22 22 22
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    1260 <davidegrayson_nibble_sort_counter_word+0x160>
test   %ecx,%ecx
je     128c <davidegrayson_nibble_sort_counter_word+0x18c>
movabs $0x2000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    1280 <davidegrayson_nibble_sort_counter_word+0x180>
movzbl -0x15(%rsp),%edx
test   %edx,%edx
je     12dc <davidegrayson_nibble_sort_counter_word+0x1dc>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     12bc <davidegrayson_nibble_sort_counter_word+0x1bc>
and    $0xfffffff8,%edx
movabs $0x3333333300000000,%rsi
33 33 33
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    12b0 <davidegrayson_nibble_sort_counter_word+0x1b0>
test   %ecx,%ecx
je     12dc <davidegrayson_nibble_sort_counter_word+0x1dc>
movabs $0x3000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    12d0 <davidegrayson_nibble_sort_counter_word+0x1d0>
movzbl -0x14(%rsp),%edx
test   %edx,%edx
je     132c <davidegrayson_nibble_sort_counter_word+0x22c>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     130c <davidegrayson_nibble_sort_counter_word+0x20c>
and    $0xfffffff8,%edx
movabs $0x4444444400000000,%rsi
44 44 44
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    1300 <davidegrayson_nibble_sort_counter_word+0x200>
test   %ecx,%ecx
je     132c <davidegrayson_nibble_sort_counter_word+0x22c>
movabs $0x4000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    1320 <davidegrayson_nibble_sort_counter_word+0x220>
movzbl -0x13(%rsp),%edx
test   %edx,%edx
je     137c <davidegrayson_nibble_sort_counter_word+0x27c>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     135c <davidegrayson_nibble_sort_counter_word+0x25c>
and    $0xfffffff8,%edx
movabs $0x5555555500000000,%rsi
55 55 55
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    1350 <davidegrayson_nibble_sort_counter_word+0x250>
test   %ecx,%ecx
je     137c <davidegrayson_nibble_sort_counter_word+0x27c>
movabs $0x5000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    1370 <davidegrayson_nibble_sort_counter_word+0x270>
movzbl -0x12(%rsp),%edx
test   %edx,%edx
je     13cc <davidegrayson_nibble_sort_counter_word+0x2cc>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     13ac <davidegrayson_nibble_sort_counter_word+0x2ac>
and    $0xfffffff8,%edx
movabs $0x6666666600000000,%rsi
66 66 66
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    13a0 <davidegrayson_nibble_sort_counter_word+0x2a0>
test   %ecx,%ecx
je     13cc <davidegrayson_nibble_sort_counter_word+0x2cc>
movabs $0x6000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    13c0 <davidegrayson_nibble_sort_counter_word+0x2c0>
movzbl -0x11(%rsp),%edx
test   %edx,%edx
je     141c <davidegrayson_nibble_sort_counter_word+0x31c>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     13fc <davidegrayson_nibble_sort_counter_word+0x2fc>
and    $0xfffffff8,%edx
movabs $0x7777777700000000,%rsi
77 77 77
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    13f0 <davidegrayson_nibble_sort_counter_word+0x2f0>
test   %ecx,%ecx
je     141c <davidegrayson_nibble_sort_counter_word+0x31c>
movabs $0x7000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    1410 <davidegrayson_nibble_sort_counter_word+0x310>
movzbl -0x10(%rsp),%edx
test   %edx,%edx
je     146c <davidegrayson_nibble_sort_counter_word+0x36c>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     144c <davidegrayson_nibble_sort_counter_word+0x34c>
and    $0xfffffff8,%edx
movabs $0x8888888800000000,%rsi
88 88 88
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    1440 <davidegrayson_nibble_sort_counter_word+0x340>
test   %ecx,%ecx
je     146c <davidegrayson_nibble_sort_counter_word+0x36c>
movabs $0x8000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    1460 <davidegrayson_nibble_sort_counter_word+0x360>
movzbl -0xf(%rsp),%edx
test   %edx,%edx
je     14bc <davidegrayson_nibble_sort_counter_word+0x3bc>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     149c <davidegrayson_nibble_sort_counter_word+0x39c>
and    $0xfffffff8,%edx
movabs $0x9999999900000000,%rsi
99 99 99
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    1490 <davidegrayson_nibble_sort_counter_word+0x390>
test   %ecx,%ecx
je     14bc <davidegrayson_nibble_sort_counter_word+0x3bc>
movabs $0x9000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    14b0 <davidegrayson_nibble_sort_counter_word+0x3b0>
movzbl -0xe(%rsp),%edx
test   %edx,%edx
je     150c <davidegrayson_nibble_sort_counter_word+0x40c>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     14ec <davidegrayson_nibble_sort_counter_word+0x3ec>
and    $0xfffffff8,%edx
movabs $0xaaaaaaaa00000000,%rsi
aa aa aa
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    14e0 <davidegrayson_nibble_sort_counter_word+0x3e0>
test   %ecx,%ecx
je     150c <davidegrayson_nibble_sort_counter_word+0x40c>
movabs $0xa000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    1500 <davidegrayson_nibble_sort_counter_word+0x400>
movzbl -0xd(%rsp),%edx
test   %edx,%edx
je     155c <davidegrayson_nibble_sort_counter_word+0x45c>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     153c <davidegrayson_nibble_sort_counter_word+0x43c>
and    $0xfffffff8,%edx
movabs $0xbbbbbbbb00000000,%rsi
bb bb bb
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    1530 <davidegrayson_nibble_sort_counter_word+0x430>
test   %ecx,%ecx
je     155c <davidegrayson_nibble_sort_counter_word+0x45c>
movabs $0xb000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    1550 <davidegrayson_nibble_sort_counter_word+0x450>
movzbl -0xc(%rsp),%edx
test   %edx,%edx
je     15ac <davidegrayson_nibble_sort_counter_word+0x4ac>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     158c <davidegrayson_nibble_sort_counter_word+0x48c>
and    $0xfffffff8,%edx
movabs $0xcccccccc00000000,%rsi
cc cc cc
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    1580 <davidegrayson_nibble_sort_counter_word+0x480>
test   %ecx,%ecx
je     15ac <davidegrayson_nibble_sort_counter_word+0x4ac>
movabs $0xc000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    15a0 <davidegrayson_nibble_sort_counter_word+0x4a0>
movzbl -0xb(%rsp),%edx
test   %edx,%edx
je     15fc <davidegrayson_nibble_sort_counter_word+0x4fc>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     15dc <davidegrayson_nibble_sort_counter_word+0x4dc>
and    $0xfffffff8,%edx
movabs $0xdddddddd00000000,%rsi
dd dd dd
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    15d0 <davidegrayson_nibble_sort_counter_word+0x4d0>
test   %ecx,%ecx
je     15fc <davidegrayson_nibble_sort_counter_word+0x4fc>
movabs $0xd000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    15f0 <davidegrayson_nibble_sort_counter_word+0x4f0>
movzbl -0xa(%rsp),%edx
test   %edx,%edx
je     164c <davidegrayson_nibble_sort_counter_word+0x54c>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     162c <davidegrayson_nibble_sort_counter_word+0x52c>
and    $0xfffffff8,%edx
movabs $0xeeeeeeee00000000,%rsi
ee ee ee
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    1620 <davidegrayson_nibble_sort_counter_word+0x520>
test   %ecx,%ecx
je     164c <davidegrayson_nibble_sort_counter_word+0x54c>
movabs $0xe000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    1640 <davidegrayson_nibble_sort_counter_word+0x540>
movzbl -0x9(%rsp),%edx
test   %edx,%edx
je     169c <davidegrayson_nibble_sort_counter_word+0x59c>
lea    -0x1(%rdx),%esi
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x7,%esi
jb     167c <davidegrayson_nibble_sort_counter_word+0x57c>
and    $0xfffffff8,%edx
movabs $0xffffffff00000000,%rsi
ff ff ff
nop
shr    $0x20,%rax
or     %rsi,%rax
add    $0xfffffff8,%edx
jne    1670 <davidegrayson_nibble_sort_counter_word+0x570>
test   %ecx,%ecx
je     169c <davidegrayson_nibble_sort_counter_word+0x59c>
movabs $0xf000000000000000,%rdx
nopw   0x0(%rax,%rax,1)
shr    $0x4,%rax
or     %rdx,%rax
add    $0xffffffff,%ecx
jne    1690 <davidegrayson_nibble_sort_counter_word+0x590>
ret

LLVM IR (-O0):
define i64 @davidegrayson_nibble_sort_counter_word(i64 %0) {
%2 = alloca i64
%3 = alloca [16 x i8]
%4 = alloca i64
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
store i64 %0, i64* %2
%20 = bitcast [16 x i8]* %3 to i8*
%21 = load i64, i64* %2
%22 = lshr i64 %21, 0
%23 = and i64 %22, 15
%24 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %23
%25 = load i8, i8* %24
%26 = add i8 %25, 1
store i8 %26, i8* %24
%27 = load i64, i64* %2
%28 = lshr i64 %27, 4
%29 = and i64 %28, 15
%30 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %29
%31 = load i8, i8* %30
%32 = add i8 %31, 1
store i8 %32, i8* %30
%33 = load i64, i64* %2
%34 = lshr i64 %33, 8
%35 = and i64 %34, 15
%36 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %35
%37 = load i8, i8* %36
%38 = add i8 %37, 1
store i8 %38, i8* %36
%39 = load i64, i64* %2
%40 = lshr i64 %39, 12
%41 = and i64 %40, 15
%42 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %41
%43 = load i8, i8* %42
%44 = add i8 %43, 1
store i8 %44, i8* %42
%45 = load i64, i64* %2
%46 = lshr i64 %45, 16
%47 = and i64 %46, 15
%48 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %47
%49 = load i8, i8* %48
%50 = add i8 %49, 1
store i8 %50, i8* %48
%51 = load i64, i64* %2
%52 = lshr i64 %51, 20
%53 = and i64 %52, 15
%54 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %53
%55 = load i8, i8* %54
%56 = add i8 %55, 1
store i8 %56, i8* %54
%57 = load i64, i64* %2
%58 = lshr i64 %57, 24
%59 = and i64 %58, 15
%60 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %59
%61 = load i8, i8* %60
%62 = add i8 %61, 1
store i8 %62, i8* %60
%63 = load i64, i64* %2
%64 = lshr i64 %63, 28
%65 = and i64 %64, 15
%66 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %65
%67 = load i8, i8* %66
%68 = add i8 %67, 1
store i8 %68, i8* %66
%69 = load i64, i64* %2
%70 = lshr i64 %69, 32
%71 = and i64 %70, 15
%72 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %71
%73 = load i8, i8* %72
%74 = add i8 %73, 1
store i8 %74, i8* %72
%75 = load i64, i64* %2
%76 = lshr i64 %75, 36
%77 = and i64 %76, 15
%78 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %77
%79 = load i8, i8* %78
%80 = add i8 %79, 1
store i8 %80, i8* %78
%81 = load i64, i64* %2
%82 = lshr i64 %81, 40
%83 = and i64 %82, 15
%84 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %83
%85 = load i8, i8* %84
%86 = add i8 %85, 1
store i8 %86, i8* %84
%87 = load i64, i64* %2
%88 = lshr i64 %87, 44
%89 = and i64 %88, 15
%90 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %89
%91 = load i8, i8* %90
%92 = add i8 %91, 1
store i8 %92, i8* %90
%93 = load i64, i64* %2
%94 = lshr i64 %93, 48
%95 = and i64 %94, 15
%96 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %95
%97 = load i8, i8* %96
%98 = add i8 %97, 1
store i8 %98, i8* %96
%99 = load i64, i64* %2
%100 = lshr i64 %99, 52
%101 = and i64 %100, 15
%102 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %101
%103 = load i8, i8* %102
%104 = add i8 %103, 1
store i8 %104, i8* %102
%105 = load i64, i64* %2
%106 = lshr i64 %105, 56
%107 = and i64 %106, 15
%108 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %107
%109 = load i8, i8* %108
%110 = add i8 %109, 1
store i8 %110, i8* %108
%111 = load i64, i64* %2
%112 = lshr i64 %111, 60
%113 = and i64 %112, 15
%114 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 %113
%115 = load i8, i8* %114
%116 = add i8 %115, 1
store i8 %116, i8* %114
store i64 0, i64* %4
store i32 0, i32* %5
br label %117
117: ; preds = %127, %1
%118 = load i32, i32* %5
%119 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 1
%120 = load i8, i8* %119
%121 = zext i8 %120 to i32
%122 = icmp ult i32 %118, %121
br i1 %122, label %123, label %130
123: ; preds = %117
%124 = load i64, i64* %4
%125 = lshr i64 %124, 4
%126 = or i64 1152921504606846976, %125
store i64 %126, i64* %4
br label %127
127: ; preds = %123
%128 = load i32, i32* %5
%129 = add i32 %128, 1
store i32 %129, i32* %5
br label %117
130: ; preds = %117
store i32 0, i32* %6
br label %131
131: ; preds = %141, %130
%132 = load i32, i32* %6
%133 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 2
%134 = load i8, i8* %133
%135 = zext i8 %134 to i32
%136 = icmp ult i32 %132, %135
br i1 %136, label %137, label %144
137: ; preds = %131
%138 = load i64, i64* %4
%139 = lshr i64 %138, 4
%140 = or i64 2305843009213693952, %139
store i64 %140, i64* %4
br label %141
141: ; preds = %137
%142 = load i32, i32* %6
%143 = add i32 %142, 1
store i32 %143, i32* %6
br label %131
144: ; preds = %131
store i32 0, i32* %7
br label %145
145: ; preds = %155, %144
%146 = load i32, i32* %7
%147 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 3
%148 = load i8, i8* %147
%149 = zext i8 %148 to i32
%150 = icmp ult i32 %146, %149
br i1 %150, label %151, label %158
151: ; preds = %145
%152 = load i64, i64* %4
%153 = lshr i64 %152, 4
%154 = or i64 3458764513820540928, %153
store i64 %154, i64* %4
br label %155
155: ; preds = %151
%156 = load i32, i32* %7
%157 = add i32 %156, 1
store i32 %157, i32* %7
br label %145
158: ; preds = %145
store i32 0, i32* %8
br label %159
159: ; preds = %169, %158
%160 = load i32, i32* %8
%161 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 4
%162 = load i8, i8* %161
%163 = zext i8 %162 to i32
%164 = icmp ult i32 %160, %163
br i1 %164, label %165, label %172
165: ; preds = %159
%166 = load i64, i64* %4
%167 = lshr i64 %166, 4
%168 = or i64 4611686018427387904, %167
store i64 %168, i64* %4
br label %169
169: ; preds = %165
%170 = load i32, i32* %8
%171 = add i32 %170, 1
store i32 %171, i32* %8
br label %159
172: ; preds = %159
store i32 0, i32* %9
br label %173
173: ; preds = %183, %172
%174 = load i32, i32* %9
%175 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 5
%176 = load i8, i8* %175
%177 = zext i8 %176 to i32
%178 = icmp ult i32 %174, %177
br i1 %178, label %179, label %186
179: ; preds = %173
%180 = load i64, i64* %4
%181 = lshr i64 %180, 4
%182 = or i64 5764607523034234880, %181
store i64 %182, i64* %4
br label %183
183: ; preds = %179
%184 = load i32, i32* %9
%185 = add i32 %184, 1
store i32 %185, i32* %9
br label %173
186: ; preds = %173
store i32 0, i32* %10
br label %187
187: ; preds = %197, %186
%188 = load i32, i32* %10
%189 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 6
%190 = load i8, i8* %189
%191 = zext i8 %190 to i32
%192 = icmp ult i32 %188, %191
br i1 %192, label %193, label %200
193: ; preds = %187
%194 = load i64, i64* %4
%195 = lshr i64 %194, 4
%196 = or i64 6917529027641081856, %195
store i64 %196, i64* %4
br label %197
197: ; preds = %193
%198 = load i32, i32* %10
%199 = add i32 %198, 1
store i32 %199, i32* %10
br label %187
200: ; preds = %187
store i32 0, i32* %11
br label %201
201: ; preds = %211, %200
%202 = load i32, i32* %11
%203 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 7
%204 = load i8, i8* %203
%205 = zext i8 %204 to i32
%206 = icmp ult i32 %202, %205
br i1 %206, label %207, label %214
207: ; preds = %201
%208 = load i64, i64* %4
%209 = lshr i64 %208, 4
%210 = or i64 8070450532247928832, %209
store i64 %210, i64* %4
br label %211
211: ; preds = %207
%212 = load i32, i32* %11
%213 = add i32 %212, 1
store i32 %213, i32* %11
br label %201
214: ; preds = %201
store i32 0, i32* %12
br label %215
215: ; preds = %225, %214
%216 = load i32, i32* %12
%217 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 8
%218 = load i8, i8* %217
%219 = zext i8 %218 to i32
%220 = icmp ult i32 %216, %219
br i1 %220, label %221, label %228
221: ; preds = %215
%222 = load i64, i64* %4
%223 = lshr i64 %222, 4
%224 = or i64 -9223372036854775808, %223
store i64 %224, i64* %4
br label %225
225: ; preds = %221
%226 = load i32, i32* %12
%227 = add i32 %226, 1
store i32 %227, i32* %12
br label %215
228: ; preds = %215
store i32 0, i32* %13
br label %229
229: ; preds = %239, %228
%230 = load i32, i32* %13
%231 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 9
%232 = load i8, i8* %231
%233 = zext i8 %232 to i32
%234 = icmp ult i32 %230, %233
br i1 %234, label %235, label %242
235: ; preds = %229
%236 = load i64, i64* %4
%237 = lshr i64 %236, 4
%238 = or i64 -8070450532247928832, %237
store i64 %238, i64* %4
br label %239
239: ; preds = %235
%240 = load i32, i32* %13
%241 = add i32 %240, 1
store i32 %241, i32* %13
br label %229
242: ; preds = %229
store i32 0, i32* %14
br label %243
243: ; preds = %253, %242
%244 = load i32, i32* %14
%245 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 10
%246 = load i8, i8* %245
%247 = zext i8 %246 to i32
%248 = icmp ult i32 %244, %247
br i1 %248, label %249, label %256
249: ; preds = %243
%250 = load i64, i64* %4
%251 = lshr i64 %250, 4
%252 = or i64 -6917529027641081856, %251
store i64 %252, i64* %4
br label %253
253: ; preds = %249
%254 = load i32, i32* %14
%255 = add i32 %254, 1
store i32 %255, i32* %14
br label %243
256: ; preds = %243
store i32 0, i32* %15
br label %257
257: ; preds = %267, %256
%258 = load i32, i32* %15
%259 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 11
%260 = load i8, i8* %259
%261 = zext i8 %260 to i32
%262 = icmp ult i32 %258, %261
br i1 %262, label %263, label %270
263: ; preds = %257
%264 = load i64, i64* %4
%265 = lshr i64 %264, 4
%266 = or i64 -5764607523034234880, %265
store i64 %266, i64* %4
br label %267
267: ; preds = %263
%268 = load i32, i32* %15
%269 = add i32 %268, 1
store i32 %269, i32* %15
br label %257
270: ; preds = %257
store i32 0, i32* %16
br label %271
271: ; preds = %281, %270
%272 = load i32, i32* %16
%273 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 12
%274 = load i8, i8* %273
%275 = zext i8 %274 to i32
%276 = icmp ult i32 %272, %275
br i1 %276, label %277, label %284
277: ; preds = %271
%278 = load i64, i64* %4
%279 = lshr i64 %278, 4
%280 = or i64 -4611686018427387904, %279
store i64 %280, i64* %4
br label %281
281: ; preds = %277
%282 = load i32, i32* %16
%283 = add i32 %282, 1
store i32 %283, i32* %16
br label %271
284: ; preds = %271
store i32 0, i32* %17
br label %285
285: ; preds = %295, %284
%286 = load i32, i32* %17
%287 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 13
%288 = load i8, i8* %287
%289 = zext i8 %288 to i32
%290 = icmp ult i32 %286, %289
br i1 %290, label %291, label %298
291: ; preds = %285
%292 = load i64, i64* %4
%293 = lshr i64 %292, 4
%294 = or i64 -3458764513820540928, %293
store i64 %294, i64* %4
br label %295
295: ; preds = %291
%296 = load i32, i32* %17
%297 = add i32 %296, 1
store i32 %297, i32* %17
br label %285
298: ; preds = %285
store i32 0, i32* %18
br label %299
299: ; preds = %309, %298
%300 = load i32, i32* %18
%301 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 14
%302 = load i8, i8* %301
%303 = zext i8 %302 to i32
%304 = icmp ult i32 %300, %303
br i1 %304, label %305, label %312
305: ; preds = %299
%306 = load i64, i64* %4
%307 = lshr i64 %306, 4
%308 = or i64 -2305843009213693952, %307
store i64 %308, i64* %4
br label %309
309: ; preds = %305
%310 = load i32, i32* %18
%311 = add i32 %310, 1
store i32 %311, i32* %18
br label %299
312: ; preds = %299
store i32 0, i32* %19
br label %313
313: ; preds = %323, %312
%314 = load i32, i32* %19
%315 = getelementptr inbounds [16 x i8], [16 x i8]* %3, i64 0, i64 15
%316 = load i8, i8* %315
%317 = zext i8 %316 to i32
%318 = icmp ult i32 %314, %317
br i1 %318, label %319, label %326
319: ; preds = %313
%320 = load i64, i64* %4
%321 = lshr i64 %320, 4
%322 = or i64 -1152921504606846976, %321
store i64 %322, i64* %4
br label %323
323: ; preds = %319
%324 = load i32, i32* %19
%325 = add i32 %324, 1
store i32 %325, i32* %19
br label %313
326: ; preds = %313
%327 = load i64, i64* %4
ret i64 %327
}

LLVM IR (-O2):
define i64 @davidegrayson_nibble_sort_counter_word(i64 %0) {
%2 = alloca [16 x i8]
%3 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 0
%4 = and i64 %0, 15
%5 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %4
%6 = load i8, i8* %5
%7 = add i8 %6, 1
store i8 %7, i8* %5
%8 = lshr i64 %0, 4
%9 = and i64 %8, 15
%10 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %9
%11 = load i8, i8* %10
%12 = add i8 %11, 1
store i8 %12, i8* %10
%13 = lshr i64 %0, 8
%14 = and i64 %13, 15
%15 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %14
%16 = load i8, i8* %15
%17 = add i8 %16, 1
store i8 %17, i8* %15
%18 = lshr i64 %0, 12
%19 = and i64 %18, 15
%20 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %19
%21 = load i8, i8* %20
%22 = add i8 %21, 1
store i8 %22, i8* %20
%23 = lshr i64 %0, 16
%24 = and i64 %23, 15
%25 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %24
%26 = load i8, i8* %25
%27 = add i8 %26, 1
store i8 %27, i8* %25
%28 = lshr i64 %0, 20
%29 = and i64 %28, 15
%30 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %29
%31 = load i8, i8* %30
%32 = add i8 %31, 1
store i8 %32, i8* %30
%33 = lshr i64 %0, 24
%34 = and i64 %33, 15
%35 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %34
%36 = load i8, i8* %35
%37 = add i8 %36, 1
store i8 %37, i8* %35
%38 = lshr i64 %0, 28
%39 = and i64 %38, 15
%40 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %39
%41 = load i8, i8* %40
%42 = add i8 %41, 1
store i8 %42, i8* %40
%43 = lshr i64 %0, 32
%44 = and i64 %43, 15
%45 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %44
%46 = load i8, i8* %45
%47 = add i8 %46, 1
store i8 %47, i8* %45
%48 = lshr i64 %0, 36
%49 = and i64 %48, 15
%50 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %49
%51 = load i8, i8* %50
%52 = add i8 %51, 1
store i8 %52, i8* %50
%53 = lshr i64 %0, 40
%54 = and i64 %53, 15
%55 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %54
%56 = load i8, i8* %55
%57 = add i8 %56, 1
store i8 %57, i8* %55
%58 = lshr i64 %0, 44
%59 = and i64 %58, 15
%60 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %59
%61 = load i8, i8* %60
%62 = add i8 %61, 1
store i8 %62, i8* %60
%63 = lshr i64 %0, 48
%64 = and i64 %63, 15
%65 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %64
%66 = load i8, i8* %65
%67 = add i8 %66, 1
store i8 %67, i8* %65
%68 = lshr i64 %0, 52
%69 = and i64 %68, 15
%70 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %69
%71 = load i8, i8* %70
%72 = add i8 %71, 1
store i8 %72, i8* %70
%73 = lshr i64 %0, 56
%74 = and i64 %73, 15
%75 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %74
%76 = load i8, i8* %75
%77 = add i8 %76, 1
store i8 %77, i8* %75
%78 = lshr i64 %0, 60
%79 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 %78
%80 = load i8, i8* %79
%81 = add i8 %80, 1
store i8 %81, i8* %79
%82 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 1
%83 = load i8, i8* %82
%84 = zext i8 %83 to i32
%85 = icmp eq i8 %83, 0
br i1 %85, label %103, label %86
86: ; preds = %1
%87 = add nsw i32 %84, -1
%88 = and i32 %84, 7
%89 = icmp ult i32 %87, 7
br i1 %89, label %92, label %90
90: ; preds = %86
%91 = and i32 %84, 248
br label %115
92: ; preds = %115, %86
%93 = phi i64 [ undef, %86 ], [ %119, %115 ]
%94 = phi i64 [ 0, %86 ], [ %119, %115 ]
%95 = icmp eq i32 %88, 0
br i1 %95, label %103, label %96
96: ; preds = %92, %96
%97 = phi i64 [ %100, %96 ], [ %94, %92 ]
%98 = phi i32 [ %101, %96 ], [ 0, %92 ]
%99 = lshr i64 %97, 4
%100 = or i64 %99, 1152921504606846976
%101 = add i32 %98, 1
%102 = icmp eq i32 %101, %88
br i1 %102, label %103, label %96
103: ; preds = %92, %96, %1
%104 = phi i64 [ 0, %1 ], [ %93, %92 ], [ %100, %96 ]
%105 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 2
%106 = load i8, i8* %105
%107 = zext i8 %106 to i32
%108 = icmp eq i8 %106, 0
br i1 %108, label %133, label %109
109: ; preds = %103
%110 = add nsw i32 %107, -1
%111 = and i32 %107, 7
%112 = icmp ult i32 %110, 7
br i1 %112, label %122, label %113
113: ; preds = %109
%114 = and i32 %107, 248
br label %145
115: ; preds = %115, %90
%116 = phi i64 [ 0, %90 ], [ %119, %115 ]
%117 = phi i32 [ 0, %90 ], [ %120, %115 ]
%118 = lshr i64 %116, 32
%119 = or i64 %118, 1229782937960972288
%120 = add i32 %117, 8
%121 = icmp eq i32 %120, %91
br i1 %121, label %92, label %115
122: ; preds = %145, %109
%123 = phi i64 [ undef, %109 ], [ %149, %145 ]
%124 = phi i64 [ %104, %109 ], [ %149, %145 ]
%125 = icmp eq i32 %111, 0
br i1 %125, label %133, label %126
126: ; preds = %122, %126
%127 = phi i64 [ %130, %126 ], [ %124, %122 ]
%128 = phi i32 [ %131, %126 ], [ 0, %122 ]
%129 = lshr i64 %127, 4
%130 = or i64 %129, 2305843009213693952
%131 = add i32 %128, 1
%132 = icmp eq i32 %131, %111
br i1 %132, label %133, label %126
133: ; preds = %122, %126, %103
%134 = phi i64 [ %104, %103 ], [ %123, %122 ], [ %130, %126 ]
%135 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 3
%136 = load i8, i8* %135
%137 = zext i8 %136 to i32
%138 = icmp eq i8 %136, 0
br i1 %138, label %163, label %139
139: ; preds = %133
%140 = add nsw i32 %137, -1
%141 = and i32 %137, 7
%142 = icmp ult i32 %140, 7
br i1 %142, label %152, label %143
143: ; preds = %139
%144 = and i32 %137, 248
br label %175
145: ; preds = %145, %113
%146 = phi i64 [ %104, %113 ], [ %149, %145 ]
%147 = phi i32 [ 0, %113 ], [ %150, %145 ]
%148 = lshr i64 %146, 32
%149 = or i64 %148, 2459565875921944576
%150 = add i32 %147, 8
%151 = icmp eq i32 %150, %114
br i1 %151, label %122, label %145
152: ; preds = %175, %139
%153 = phi i64 [ undef, %139 ], [ %179, %175 ]
%154 = phi i64 [ %134, %139 ], [ %179, %175 ]
%155 = icmp eq i32 %141, 0
br i1 %155, label %163, label %156
156: ; preds = %152, %156
%157 = phi i64 [ %160, %156 ], [ %154, %152 ]
%158 = phi i32 [ %161, %156 ], [ 0, %152 ]
%159 = lshr i64 %157, 4
%160 = or i64 %159, 3458764513820540928
%161 = add i32 %158, 1
%162 = icmp eq i32 %161, %141
br i1 %162, label %163, label %156
163: ; preds = %152, %156, %133
%164 = phi i64 [ %134, %133 ], [ %153, %152 ], [ %160, %156 ]
%165 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 4
%166 = load i8, i8* %165
%167 = zext i8 %166 to i32
%168 = icmp eq i8 %166, 0
br i1 %168, label %193, label %169
169: ; preds = %163
%170 = add nsw i32 %167, -1
%171 = and i32 %167, 7
%172 = icmp ult i32 %170, 7
br i1 %172, label %182, label %173
173: ; preds = %169
%174 = and i32 %167, 248
br label %205
175: ; preds = %175, %143
%176 = phi i64 [ %134, %143 ], [ %179, %175 ]
%177 = phi i32 [ 0, %143 ], [ %180, %175 ]
%178 = lshr i64 %176, 32
%179 = or i64 %178, 3689348813882916864
%180 = add i32 %177, 8
%181 = icmp eq i32 %180, %144
br i1 %181, label %152, label %175
182: ; preds = %205, %169
%183 = phi i64 [ undef, %169 ], [ %209, %205 ]
%184 = phi i64 [ %164, %169 ], [ %209, %205 ]
%185 = icmp eq i32 %171, 0
br i1 %185, label %193, label %186
186: ; preds = %182, %186
%187 = phi i64 [ %190, %186 ], [ %184, %182 ]
%188 = phi i32 [ %191, %186 ], [ 0, %182 ]
%189 = lshr i64 %187, 4
%190 = or i64 %189, 4611686018427387904
%191 = add i32 %188, 1
%192 = icmp eq i32 %191, %171
br i1 %192, label %193, label %186
193: ; preds = %182, %186, %163
%194 = phi i64 [ %164, %163 ], [ %183, %182 ], [ %190, %186 ]
%195 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 5
%196 = load i8, i8* %195
%197 = zext i8 %196 to i32
%198 = icmp eq i8 %196, 0
br i1 %198, label %223, label %199
199: ; preds = %193
%200 = add nsw i32 %197, -1
%201 = and i32 %197, 7
%202 = icmp ult i32 %200, 7
br i1 %202, label %212, label %203
203: ; preds = %199
%204 = and i32 %197, 248
br label %235
205: ; preds = %205, %173
%206 = phi i64 [ %164, %173 ], [ %209, %205 ]
%207 = phi i32 [ 0, %173 ], [ %210, %205 ]
%208 = lshr i64 %206, 32
%209 = or i64 %208, 4919131751843889152
%210 = add i32 %207, 8
%211 = icmp eq i32 %210, %174
br i1 %211, label %182, label %205
212: ; preds = %235, %199
%213 = phi i64 [ undef, %199 ], [ %239, %235 ]
%214 = phi i64 [ %194, %199 ], [ %239, %235 ]
%215 = icmp eq i32 %201, 0
br i1 %215, label %223, label %216
216: ; preds = %212, %216
%217 = phi i64 [ %220, %216 ], [ %214, %212 ]
%218 = phi i32 [ %221, %216 ], [ 0, %212 ]
%219 = lshr i64 %217, 4
%220 = or i64 %219, 5764607523034234880
%221 = add i32 %218, 1
%222 = icmp eq i32 %221, %201
br i1 %222, label %223, label %216
223: ; preds = %212, %216, %193
%224 = phi i64 [ %194, %193 ], [ %213, %212 ], [ %220, %216 ]
%225 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 6
%226 = load i8, i8* %225
%227 = zext i8 %226 to i32
%228 = icmp eq i8 %226, 0
br i1 %228, label %253, label %229
229: ; preds = %223
%230 = add nsw i32 %227, -1
%231 = and i32 %227, 7
%232 = icmp ult i32 %230, 7
br i1 %232, label %242, label %233
233: ; preds = %229
%234 = and i32 %227, 248
br label %265
235: ; preds = %235, %203
%236 = phi i64 [ %194, %203 ], [ %239, %235 ]
%237 = phi i32 [ 0, %203 ], [ %240, %235 ]
%238 = lshr i64 %236, 32
%239 = or i64 %238, 6148914689804861440
%240 = add i32 %237, 8
%241 = icmp eq i32 %240, %204
br i1 %241, label %212, label %235
242: ; preds = %265, %229
%243 = phi i64 [ undef, %229 ], [ %269, %265 ]
%244 = phi i64 [ %224, %229 ], [ %269, %265 ]
%245 = icmp eq i32 %231, 0
br i1 %245, label %253, label %246
246: ; preds = %242, %246
%247 = phi i64 [ %250, %246 ], [ %244, %242 ]
%248 = phi i32 [ %251, %246 ], [ 0, %242 ]
%249 = lshr i64 %247, 4
%250 = or i64 %249, 6917529027641081856
%251 = add i32 %248, 1
%252 = icmp eq i32 %251, %231
br i1 %252, label %253, label %246
253: ; preds = %242, %246, %223
%254 = phi i64 [ %224, %223 ], [ %243, %242 ], [ %250, %246 ]
%255 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 7
%256 = load i8, i8* %255
%257 = zext i8 %256 to i32
%258 = icmp eq i8 %256, 0
br i1 %258, label %283, label %259
259: ; preds = %253
%260 = add nsw i32 %257, -1
%261 = and i32 %257, 7
%262 = icmp ult i32 %260, 7
br i1 %262, label %272, label %263
263: ; preds = %259
%264 = and i32 %257, 248
br label %295
265: ; preds = %265, %233
%266 = phi i64 [ %224, %233 ], [ %269, %265 ]
%267 = phi i32 [ 0, %233 ], [ %270, %265 ]
%268 = lshr i64 %266, 32
%269 = or i64 %268, 7378697627765833728
%270 = add i32 %267, 8
%271 = icmp eq i32 %270, %234
br i1 %271, label %242, label %265
272: ; preds = %295, %259
%273 = phi i64 [ undef, %259 ], [ %299, %295 ]
%274 = phi i64 [ %254, %259 ], [ %299, %295 ]
%275 = icmp eq i32 %261, 0
br i1 %275, label %283, label %276
276: ; preds = %272, %276
%277 = phi i64 [ %280, %276 ], [ %274, %272 ]
%278 = phi i32 [ %281, %276 ], [ 0, %272 ]
%279 = lshr i64 %277, 4
%280 = or i64 %279, 8070450532247928832
%281 = add i32 %278, 1
%282 = icmp eq i32 %281, %261
br i1 %282, label %283, label %276
283: ; preds = %272, %276, %253
%284 = phi i64 [ %254, %253 ], [ %273, %272 ], [ %280, %276 ]
%285 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 8
%286 = load i8, i8* %285
%287 = zext i8 %286 to i32
%288 = icmp eq i8 %286, 0
br i1 %288, label %313, label %289
289: ; preds = %283
%290 = add nsw i32 %287, -1
%291 = and i32 %287, 7
%292 = icmp ult i32 %290, 7
br i1 %292, label %302, label %293
293: ; preds = %289
%294 = and i32 %287, 248
br label %325
295: ; preds = %295, %263
%296 = phi i64 [ %254, %263 ], [ %299, %295 ]
%297 = phi i32 [ 0, %263 ], [ %300, %295 ]
%298 = lshr i64 %296, 32
%299 = or i64 %298, 8608480565726806016
%300 = add i32 %297, 8
%301 = icmp eq i32 %300, %264
br i1 %301, label %272, label %295
302: ; preds = %325, %289
%303 = phi i64 [ undef, %289 ], [ %329, %325 ]
%304 = phi i64 [ %284, %289 ], [ %329, %325 ]
%305 = icmp eq i32 %291, 0
br i1 %305, label %313, label %306
306: ; preds = %302, %306
%307 = phi i64 [ %310, %306 ], [ %304, %302 ]
%308 = phi i32 [ %311, %306 ], [ 0, %302 ]
%309 = lshr i64 %307, 4
%310 = or i64 %309, -9223372036854775808
%311 = add i32 %308, 1
%312 = icmp eq i32 %311, %291
br i1 %312, label %313, label %306
313: ; preds = %302, %306, %283
%314 = phi i64 [ %284, %283 ], [ %303, %302 ], [ %310, %306 ]
%315 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 9
%316 = load i8, i8* %315
%317 = zext i8 %316 to i32
%318 = icmp eq i8 %316, 0
br i1 %318, label %343, label %319
319: ; preds = %313
%320 = add nsw i32 %317, -1
%321 = and i32 %317, 7
%322 = icmp ult i32 %320, 7
br i1 %322, label %332, label %323
323: ; preds = %319
%324 = and i32 %317, 248
br label %355
325: ; preds = %325, %293
%326 = phi i64 [ %284, %293 ], [ %329, %325 ]
%327 = phi i32 [ 0, %293 ], [ %330, %325 ]
%328 = lshr i64 %326, 32
%329 = or i64 %328, -8608480570021773312
%330 = add i32 %327, 8
%331 = icmp eq i32 %330, %294
br i1 %331, label %302, label %325
332: ; preds = %355, %319
%333 = phi i64 [ undef, %319 ], [ %359, %355 ]
%334 = phi i64 [ %314, %319 ], [ %359, %355 ]
%335 = icmp eq i32 %321, 0
br i1 %335, label %343, label %336
336: ; preds = %332, %336
%337 = phi i64 [ %340, %336 ], [ %334, %332 ]
%338 = phi i32 [ %341, %336 ], [ 0, %332 ]
%339 = lshr i64 %337, 4
%340 = or i64 %339, -8070450532247928832
%341 = add i32 %338, 1
%342 = icmp eq i32 %341, %321
br i1 %342, label %343, label %336
343: ; preds = %332, %336, %313
%344 = phi i64 [ %314, %313 ], [ %333, %332 ], [ %340, %336 ]
%345 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 10
%346 = load i8, i8* %345
%347 = zext i8 %346 to i32
%348 = icmp eq i8 %346, 0
br i1 %348, label %373, label %349
349: ; preds = %343
%350 = add nsw i32 %347, -1
%351 = and i32 %347, 7
%352 = icmp ult i32 %350, 7
br i1 %352, label %362, label %353
353: ; preds = %349
%354 = and i32 %347, 248
br label %385
355: ; preds = %355, %323
%356 = phi i64 [ %314, %323 ], [ %359, %355 ]
%357 = phi i32 [ 0, %323 ], [ %360, %355 ]
%358 = lshr i64 %356, 32
%359 = or i64 %358, -7378697632060801024
%360 = add i32 %357, 8
%361 = icmp eq i32 %360, %324
br i1 %361, label %332, label %355
362: ; preds = %385, %349
%363 = phi i64 [ undef, %349 ], [ %389, %385 ]
%364 = phi i64 [ %344, %349 ], [ %389, %385 ]
%365 = icmp eq i32 %351, 0
br i1 %365, label %373, label %366
366: ; preds = %362, %366
%367 = phi i64 [ %370, %366 ], [ %364, %362 ]
%368 = phi i32 [ %371, %366 ], [ 0, %362 ]
%369 = lshr i64 %367, 4
%370 = or i64 %369, -6917529027641081856
%371 = add i32 %368, 1
%372 = icmp eq i32 %371, %351
br i1 %372, label %373, label %366
373: ; preds = %362, %366, %343
%374 = phi i64 [ %344, %343 ], [ %363, %362 ], [ %370, %366 ]
%375 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 11
%376 = load i8, i8* %375
%377 = zext i8 %376 to i32
%378 = icmp eq i8 %376, 0
br i1 %378, label %403, label %379
379: ; preds = %373
%380 = add nsw i32 %377, -1
%381 = and i32 %377, 7
%382 = icmp ult i32 %380, 7
br i1 %382, label %392, label %383
383: ; preds = %379
%384 = and i32 %377, 248
br label %415
385: ; preds = %385, %353
%386 = phi i64 [ %344, %353 ], [ %389, %385 ]
%387 = phi i32 [ 0, %353 ], [ %390, %385 ]
%388 = lshr i64 %386, 32
%389 = or i64 %388, -6148914694099828736
%390 = add i32 %387, 8
%391 = icmp eq i32 %390, %354
br i1 %391, label %362, label %385
392: ; preds = %415, %379
%393 = phi i64 [ undef, %379 ], [ %419, %415 ]
%394 = phi i64 [ %374, %379 ], [ %419, %415 ]
%395 = icmp eq i32 %381, 0
br i1 %395, label %403, label %396
396: ; preds = %392, %396
%397 = phi i64 [ %400, %396 ], [ %394, %392 ]
%398 = phi i32 [ %401, %396 ], [ 0, %392 ]
%399 = lshr i64 %397, 4
%400 = or i64 %399, -5764607523034234880
%401 = add i32 %398, 1
%402 = icmp eq i32 %401, %381
br i1 %402, label %403, label %396
403: ; preds = %392, %396, %373
%404 = phi i64 [ %374, %373 ], [ %393, %392 ], [ %400, %396 ]
%405 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 12
%406 = load i8, i8* %405
%407 = zext i8 %406 to i32
%408 = icmp eq i8 %406, 0
br i1 %408, label %433, label %409
409: ; preds = %403
%410 = add nsw i32 %407, -1
%411 = and i32 %407, 7
%412 = icmp ult i32 %410, 7
br i1 %412, label %422, label %413
413: ; preds = %409
%414 = and i32 %407, 248
br label %445
415: ; preds = %415, %383
%416 = phi i64 [ %374, %383 ], [ %419, %415 ]
%417 = phi i32 [ 0, %383 ], [ %420, %415 ]
%418 = lshr i64 %416, 32
%419 = or i64 %418, -4919131756138856448
%420 = add i32 %417, 8
%421 = icmp eq i32 %420, %384
br i1 %421, label %392, label %415
422: ; preds = %445, %409
%423 = phi i64 [ undef, %409 ], [ %449, %445 ]
%424 = phi i64 [ %404, %409 ], [ %449, %445 ]
%425 = icmp eq i32 %411, 0
br i1 %425, label %433, label %426
426: ; preds = %422, %426
%427 = phi i64 [ %430, %426 ], [ %424, %422 ]
%428 = phi i32 [ %431, %426 ], [ 0, %422 ]
%429 = lshr i64 %427, 4
%430 = or i64 %429, -4611686018427387904
%431 = add i32 %428, 1
%432 = icmp eq i32 %431, %411
br i1 %432, label %433, label %426
433: ; preds = %422, %426, %403
%434 = phi i64 [ %404, %403 ], [ %423, %422 ], [ %430, %426 ]
%435 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 13
%436 = load i8, i8* %435
%437 = zext i8 %436 to i32
%438 = icmp eq i8 %436, 0
br i1 %438, label %463, label %439
439: ; preds = %433
%440 = add nsw i32 %437, -1
%441 = and i32 %437, 7
%442 = icmp ult i32 %440, 7
br i1 %442, label %452, label %443
443: ; preds = %439
%444 = and i32 %437, 248
br label %475
445: ; preds = %445, %413
%446 = phi i64 [ %404, %413 ], [ %449, %445 ]
%447 = phi i32 [ 0, %413 ], [ %450, %445 ]
%448 = lshr i64 %446, 32
%449 = or i64 %448, -3689348818177884160
%450 = add i32 %447, 8
%451 = icmp eq i32 %450, %414
br i1 %451, label %422, label %445
452: ; preds = %475, %439
%453 = phi i64 [ undef, %439 ], [ %479, %475 ]
%454 = phi i64 [ %434, %439 ], [ %479, %475 ]
%455 = icmp eq i32 %441, 0
br i1 %455, label %463, label %456
456: ; preds = %452, %456
%457 = phi i64 [ %460, %456 ], [ %454, %452 ]
%458 = phi i32 [ %461, %456 ], [ 0, %452 ]
%459 = lshr i64 %457, 4
%460 = or i64 %459, -3458764513820540928
%461 = add i32 %458, 1
%462 = icmp eq i32 %461, %441
br i1 %462, label %463, label %456
463: ; preds = %452, %456, %433
%464 = phi i64 [ %434, %433 ], [ %453, %452 ], [ %460, %456 ]
%465 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 14
%466 = load i8, i8* %465
%467 = zext i8 %466 to i32
%468 = icmp eq i8 %466, 0
br i1 %468, label %493, label %469
469: ; preds = %463
%470 = add nsw i32 %467, -1
%471 = and i32 %467, 7
%472 = icmp ult i32 %470, 7
br i1 %472, label %482, label %473
473: ; preds = %469
%474 = and i32 %467, 248
br label %505
475: ; preds = %475, %443
%476 = phi i64 [ %434, %443 ], [ %479, %475 ]
%477 = phi i32 [ 0, %443 ], [ %480, %475 ]
%478 = lshr i64 %476, 32
%479 = or i64 %478, -2459565880216911872
%480 = add i32 %477, 8
%481 = icmp eq i32 %480, %444
br i1 %481, label %452, label %475
482: ; preds = %505, %469
%483 = phi i64 [ undef, %469 ], [ %509, %505 ]
%484 = phi i64 [ %464, %469 ], [ %509, %505 ]
%485 = icmp eq i32 %471, 0
br i1 %485, label %493, label %486
486: ; preds = %482, %486
%487 = phi i64 [ %490, %486 ], [ %484, %482 ]
%488 = phi i32 [ %491, %486 ], [ 0, %482 ]
%489 = lshr i64 %487, 4
%490 = or i64 %489, -2305843009213693952
%491 = add i32 %488, 1
%492 = icmp eq i32 %491, %471
br i1 %492, label %493, label %486
493: ; preds = %482, %486, %463
%494 = phi i64 [ %464, %463 ], [ %483, %482 ], [ %490, %486 ]
%495 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 15
%496 = load i8, i8* %495
%497 = zext i8 %496 to i32
%498 = icmp eq i8 %496, 0
br i1 %498, label %523, label %499
499: ; preds = %493
%500 = add nsw i32 %497, -1
%501 = and i32 %497, 7
%502 = icmp ult i32 %500, 7
br i1 %502, label %512, label %503
503: ; preds = %499
%504 = and i32 %497, 248
br label %525
505: ; preds = %505, %473
%506 = phi i64 [ %464, %473 ], [ %509, %505 ]
%507 = phi i32 [ 0, %473 ], [ %510, %505 ]
%508 = lshr i64 %506, 32
%509 = or i64 %508, -1229782942255939584
%510 = add i32 %507, 8
%511 = icmp eq i32 %510, %474
br i1 %511, label %482, label %505
512: ; preds = %525, %499
%513 = phi i64 [ undef, %499 ], [ %529, %525 ]
%514 = phi i64 [ %494, %499 ], [ %529, %525 ]
%515 = icmp eq i32 %501, 0
br i1 %515, label %523, label %516
516: ; preds = %512, %516
%517 = phi i64 [ %520, %516 ], [ %514, %512 ]
%518 = phi i32 [ %521, %516 ], [ 0, %512 ]
%519 = lshr i64 %517, 4
%520 = or i64 %519, -1152921504606846976
%521 = add i32 %518, 1
%522 = icmp eq i32 %521, %501
br i1 %522, label %523, label %516
523: ; preds = %512, %516, %493
%524 = phi i64 [ %494, %493 ], [ %513, %512 ], [ %520, %516 ]
ret i64 %524
525: ; preds = %525, %503
%526 = phi i64 [ %494, %503 ], [ %529, %525 ]
%527 = phi i32 [ 0, %503 ], [ %530, %525 ]
%528 = lshr i64 %526, 32
%529 = or i64 %528, -4294967296
%530 = add i32 %527, 8
%531 = icmp eq i32 %530, %504
br i1 %531, label %512, label %525
}