int FEN_to_arr(const char *fen, double *input) {
  int index = 0, rank = 7, file = 0;
  while (fen[index]) {
    if (file > 7) {
      if (file != 8) {
        break;
      }
      file = 0;
      rank--;
      if (rank == -1) {
        return 1;
      }
      if (fen[index] != '/') {
        break;
      }
      index++;
    }
    int empty;
    switch (fen[index]) {
    case 'k':
      input[rank * 8 + file] = -6.0 / 14;
      file++;
      break;
    case 'q':
      input[rank * 8 + file] = -5.0 / 14;
      file++;
      break;
    case 'b':
      input[rank * 8 + file] = -4.0 / 14;
      file++;
      break;
    case 'n':
      input[rank * 8 + file] = -3.0 / 14;
      file++;
      break;
    case 'r':
      input[rank * 8 + file] = -2.0 / 14;
      file++;
      break;
    case 'p':
      input[rank * 8 + file] = -1.0 / 14;
      file++;
      break;
    case 'K':
      input[rank * 8 + file] = 6.0 / 14;
      file++;
      break;
    case 'Q':
      input[rank * 8 + file] = 5.0 / 14;
      file++;
      break;
    case 'B':
      input[rank * 8 + file] = 4.0 / 14;
      file++;
      break;
    case 'N':
      input[rank * 8 + file] = 3.0 / 14;
      file++;
      break;
    case 'R':
      input[rank * 8 + file] = 2.0 / 14;
      file++;
      break;
    case 'P':
      input[rank * 8 + file] = 1.0 / 14;
      file++;
      break;
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
      empty = fen[index] - '0';
      for (int i = 0; i < empty; i++) {
        input[rank * 8 + file + i] = 0.0;
      }
      file += empty;
      break;
    default:
      return 0;
    }
    index++;
  }
  return 1;
}


x86 assembly (clang, -O0):
<FEN_to_arr>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x7,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     1441 <FEN_to_arr+0x341>
cmpl   $0x7,-0x24(%rbp)
jle    1195 <FEN_to_arr+0x95>
cmpl   $0x8,-0x24(%rbp)
je     114c <FEN_to_arr+0x4c>
jmp    1441 <FEN_to_arr+0x341>
movl   $0x0,-0x24(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0xffffffff,-0x20(%rbp)
jne    1172 <FEN_to_arr+0x72>
movl   $0x1,-0x4(%rbp)
jmp    1448 <FEN_to_arr+0x348>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2f,%eax
je     118c <FEN_to_arr+0x8c>
jmp    1441 <FEN_to_arr+0x341>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
add    $0xffffffcf,%eax
mov    %eax,%ecx
mov    %rcx,-0x38(%rbp)
sub    $0x41,%eax
ja     1427 <FEN_to_arr+0x327>
mov    -0x38(%rbp),%rax
lea    0xea2(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xe79(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xe46(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xe13(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xde0(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xdad(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xd7a(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xd47(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xd14(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xce1(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xcae(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xc7b(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xc48(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
mov    %eax,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    1419 <FEN_to_arr+0x319>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
shl    $0x3,%ecx
add    -0x24(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    13e4 <FEN_to_arr+0x2e4>
mov    -0x28(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1433 <FEN_to_arr+0x333>
movl   $0x0,-0x4(%rbp)
jmp    1448 <FEN_to_arr+0x348>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1121 <FEN_to_arr+0x21>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<FEN_to_arr>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    (%rdi),%al
test   %al,%al
je     1346 <FEN_to_arr+0x246>
lea    0x70(%rsi),%r8
mov    $0x7,%r10d
xor    %r11d,%r11d
movsd  0xed7(%rip),%xmm7
lea    0xf30(%rip),%r9
xorps  %xmm1,%xmm1
movsd  0xee4(%rip),%xmm8
movsd  0xeeb(%rip),%xmm9
movsd  0xeca(%rip),%xmm10
movsd  0xeb1(%rip),%xmm11
movsd  0xec8(%rip),%xmm12
movsd  0xea7(%rip),%xmm13
movsd  0xedf(%rip),%xmm2
movsd  0xecf(%rip),%xmm3
movsd  0xeb7(%rip),%xmm4
movsd  0xecf(%rip),%xmm5
movsd  0xeaf(%rip),%xmm6
xor    %ecx,%ecx
jmp    11c7 <FEN_to_arr+0xc7>
movaps %xmm5,%xmm0
nopl   0x0(%rax,%rax,1)
lea    (%r11,%r10,8),%eax
cltq
movsd  %xmm0,(%rsi,%rax,8)
mov    $0x1,%r13d
add    %r11d,%r13d
mov    0x1(%rdi,%rcx,1),%al
add    $0x1,%rcx
mov    %r13d,%r11d
test   %al,%al
je     1346 <FEN_to_arr+0x246>
cmp    $0x8,%r11d
jl     11ee <FEN_to_arr+0xee>
jne    1346 <FEN_to_arr+0x246>
test   %r10d,%r10d
je     1346 <FEN_to_arr+0x246>
cmp    $0x2f,%al
jne    1346 <FEN_to_arr+0x246>
add    $0xffffffff,%r10d
add    $0x1,%ecx
xor    %r11d,%r11d
movslq %ecx,%rcx
movsbl (%rdi,%rcx,1),%r13d
xor    %eax,%eax
lea    -0x31(%r13),%edx
cmp    $0x41,%edx
ja     134b <FEN_to_arr+0x24b>
movslq (%r9,%rdx,4),%rdx
add    %r9,%rdx
movaps %xmm7,%xmm0
jmp    *%rdx
mov    %r13d,%eax
add    $0xffffffd0,%r13d
cmp    $0x31,%al
jl     11b1 <FEN_to_arr+0xb1>
lea    (%r11,%r10,8),%eax
movslq %eax,%r14
mov    %r13d,%r12d
cmp    $0x2,%r13d
jae    1233 <FEN_to_arr+0x133>
xor    %ebx,%ebx
jmp    1326 <FEN_to_arr+0x226>
mov    %r12d,%ebx
and    $0xfffffffe,%ebx
lea    -0x2(%rbx),%rdx
mov    %rdx,%rax
shr    %rax
add    $0x1,%rax
mov    %eax,%r15d
and    $0x7,%r15d
cmp    $0xe,%rdx
jae    12b1 <FEN_to_arr+0x1b1>
xor    %edx,%edx
jmp    12f2 <FEN_to_arr+0x1f2>
movaps %xmm8,%xmm0
jmp    11a0 <FEN_to_arr+0xa0>
movaps %xmm9,%xmm0
jmp    11a0 <FEN_to_arr+0xa0>
movaps %xmm10,%xmm0
jmp    11a0 <FEN_to_arr+0xa0>
movaps %xmm11,%xmm0
jmp    11a0 <FEN_to_arr+0xa0>
movaps %xmm12,%xmm0
jmp    11a0 <FEN_to_arr+0xa0>
movaps %xmm13,%xmm0
jmp    11a0 <FEN_to_arr+0xa0>
movaps %xmm2,%xmm0
jmp    11a0 <FEN_to_arr+0xa0>
movaps %xmm3,%xmm0
jmp    11a0 <FEN_to_arr+0xa0>
movaps %xmm4,%xmm0
jmp    11a0 <FEN_to_arr+0xa0>
movaps %xmm6,%xmm0
jmp    11a0 <FEN_to_arr+0xa0>
and    $0xfffffffffffffff8,%rax
lea    (%r8,%r14,8),%rbp
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movups %xmm1,-0x70(%rbp,%rdx,8)
movups %xmm1,-0x60(%rbp,%rdx,8)
movups %xmm1,-0x50(%rbp,%rdx,8)
movups %xmm1,-0x40(%rbp,%rdx,8)
movups %xmm1,-0x30(%rbp,%rdx,8)
movups %xmm1,-0x20(%rbp,%rdx,8)
movups %xmm1,-0x10(%rbp,%rdx,8)
movups %xmm1,0x0(%rbp,%rdx,8)
add    $0x10,%rdx
add    $0xfffffffffffffff8,%rax
jne    12c0 <FEN_to_arr+0x1c0>
test   %r15,%r15
je     131d <FEN_to_arr+0x21d>
add    %r14,%rdx
lea    (%rsi,%rdx,8),%rax
shl    $0x4,%r15
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movups %xmm1,(%rax,%rdx,1)
add    $0x10,%rdx
cmp    %rdx,%r15
jne    1310 <FEN_to_arr+0x210>
cmp    %r12,%rbx
je     11b1 <FEN_to_arr+0xb1>
lea    (%rsi,%r14,8),%rax
nopw   0x0(%rax,%rax,1)
movq   $0x0,(%rax,%rbx,8)
add    $0x1,%rbx
cmp    %rbx,%r12
jne    1330 <FEN_to_arr+0x230>
jmp    11b1 <FEN_to_arr+0xb1>
mov    $0x1,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @FEN_to_arr(i8* %0, double* %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca double*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
store i8* %0, i8** %4
store double* %1, double** %5
store i32 0, i32* %6
store i32 7, i32* %7
store i32 0, i32* %8
br label %11
11: ; preds = %200, %2
%12 = load i8*, i8** %4
%13 = load i32, i32* %6
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds i8, i8* %12, i64 %14
%16 = load i8, i8* %15
%17 = icmp ne i8 %16, 0
br i1 %17, label %18, label %203
18: ; preds = %11
%19 = load i32, i32* %8
%20 = icmp sgt i32 %19, 7
br i1 %20, label %21, label %43
21: ; preds = %18
%22 = load i32, i32* %8
%23 = icmp ne i32 %22, 8
br i1 %23, label %24, label %25
24: ; preds = %21
br label %203
25: ; preds = %21
store i32 0, i32* %8
%26 = load i32, i32* %7
%27 = add nsw i32 %26, -1
store i32 %27, i32* %7
%28 = load i32, i32* %7
%29 = icmp eq i32 %28, -1
br i1 %29, label %30, label %31
30: ; preds = %25
store i32 1, i32* %3
br label %204
31: ; preds = %25
%32 = load i8*, i8** %4
%33 = load i32, i32* %6
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds i8, i8* %32, i64 %34
%36 = load i8, i8* %35
%37 = sext i8 %36 to i32
%38 = icmp ne i32 %37, 47
br i1 %38, label %39, label %40
39: ; preds = %31
br label %203
40: ; preds = %31
%41 = load i32, i32* %6
%42 = add nsw i32 %41, 1
store i32 %42, i32* %6
br label %43
43: ; preds = %40, %18
%44 = load i8*, i8** %4
%45 = load i32, i32* %6
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds i8, i8* %44, i64 %46
%48 = load i8, i8* %47
%49 = sext i8 %48 to i32
switch i32 %49, label %199 [
i32 107, label %50
i32 113, label %60
i32 98, label %70
i32 110, label %80
i32 114, label %90
i32 112, label %100
i32 75, label %110
i32 81, label %120
i32 66, label %130
i32 78, label %140
i32 82, label %150
i32 80, label %160
i32 49, label %170
i32 50, label %170
i32 51, label %170
i32 52, label %170
i32 53, label %170
i32 54, label %170
i32 55, label %170
i32 56, label %170
]
50: ; preds = %43
%51 = load double*, double** %5
%52 = load i32, i32* %7
%53 = mul nsw i32 %52, 8
%54 = load i32, i32* %8
%55 = add nsw i32 %53, %54
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds double, double* %51, i64 %56
store double 0xBFDB6DB6DB6DB6DB, double* %57
%58 = load i32, i32* %8
%59 = add nsw i32 %58, 1
store i32 %59, i32* %8
br label %200
60: ; preds = %43
%61 = load double*, double** %5
%62 = load i32, i32* %7
%63 = mul nsw i32 %62, 8
%64 = load i32, i32* %8
%65 = add nsw i32 %63, %64
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds double, double* %61, i64 %66
store double 0xBFD6DB6DB6DB6DB7, double* %67
%68 = load i32, i32* %8
%69 = add nsw i32 %68, 1
store i32 %69, i32* %8
br label %200
70: ; preds = %43
%71 = load double*, double** %5
%72 = load i32, i32* %7
%73 = mul nsw i32 %72, 8
%74 = load i32, i32* %8
%75 = add nsw i32 %73, %74
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds double, double* %71, i64 %76
store double 0xBFD2492492492492, double* %77
%78 = load i32, i32* %8
%79 = add nsw i32 %78, 1
store i32 %79, i32* %8
br label %200
80: ; preds = %43
%81 = load double*, double** %5
%82 = load i32, i32* %7
%83 = mul nsw i32 %82, 8
%84 = load i32, i32* %8
%85 = add nsw i32 %83, %84
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds double, double* %81, i64 %86
store double 0xBFCB6DB6DB6DB6DB, double* %87
%88 = load i32, i32* %8
%89 = add nsw i32 %88, 1
store i32 %89, i32* %8
br label %200
90: ; preds = %43
%91 = load double*, double** %5
%92 = load i32, i32* %7
%93 = mul nsw i32 %92, 8
%94 = load i32, i32* %8
%95 = add nsw i32 %93, %94
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds double, double* %91, i64 %96
store double 0xBFC2492492492492, double* %97
%98 = load i32, i32* %8
%99 = add nsw i32 %98, 1
store i32 %99, i32* %8
br label %200
100: ; preds = %43
%101 = load double*, double** %5
%102 = load i32, i32* %7
%103 = mul nsw i32 %102, 8
%104 = load i32, i32* %8
%105 = add nsw i32 %103, %104
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds double, double* %101, i64 %106
store double 0xBFB2492492492492, double* %107
%108 = load i32, i32* %8
%109 = add nsw i32 %108, 1
store i32 %109, i32* %8
br label %200
110: ; preds = %43
%111 = load double*, double** %5
%112 = load i32, i32* %7
%113 = mul nsw i32 %112, 8
%114 = load i32, i32* %8
%115 = add nsw i32 %113, %114
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds double, double* %111, i64 %116
store double 0x3FDB6DB6DB6DB6DB, double* %117
%118 = load i32, i32* %8
%119 = add nsw i32 %118, 1
store i32 %119, i32* %8
br label %200
120: ; preds = %43
%121 = load double*, double** %5
%122 = load i32, i32* %7
%123 = mul nsw i32 %122, 8
%124 = load i32, i32* %8
%125 = add nsw i32 %123, %124
%126 = sext i32 %125 to i64
%127 = getelementptr inbounds double, double* %121, i64 %126
store double 0x3FD6DB6DB6DB6DB7, double* %127
%128 = load i32, i32* %8
%129 = add nsw i32 %128, 1
store i32 %129, i32* %8
br label %200
130: ; preds = %43
%131 = load double*, double** %5
%132 = load i32, i32* %7
%133 = mul nsw i32 %132, 8
%134 = load i32, i32* %8
%135 = add nsw i32 %133, %134
%136 = sext i32 %135 to i64
%137 = getelementptr inbounds double, double* %131, i64 %136
store double 0x3FD2492492492492, double* %137
%138 = load i32, i32* %8
%139 = add nsw i32 %138, 1
store i32 %139, i32* %8
br label %200
140: ; preds = %43
%141 = load double*, double** %5
%142 = load i32, i32* %7
%143 = mul nsw i32 %142, 8
%144 = load i32, i32* %8
%145 = add nsw i32 %143, %144
%146 = sext i32 %145 to i64
%147 = getelementptr inbounds double, double* %141, i64 %146
store double 0x3FCB6DB6DB6DB6DB, double* %147
%148 = load i32, i32* %8
%149 = add nsw i32 %148, 1
store i32 %149, i32* %8
br label %200
150: ; preds = %43
%151 = load double*, double** %5
%152 = load i32, i32* %7
%153 = mul nsw i32 %152, 8
%154 = load i32, i32* %8
%155 = add nsw i32 %153, %154
%156 = sext i32 %155 to i64
%157 = getelementptr inbounds double, double* %151, i64 %156
store double 0x3FC2492492492492, double* %157
%158 = load i32, i32* %8
%159 = add nsw i32 %158, 1
store i32 %159, i32* %8
br label %200
160: ; preds = %43
%161 = load double*, double** %5
%162 = load i32, i32* %7
%163 = mul nsw i32 %162, 8
%164 = load i32, i32* %8
%165 = add nsw i32 %163, %164
%166 = sext i32 %165 to i64
%167 = getelementptr inbounds double, double* %161, i64 %166
store double 0x3FB2492492492492, double* %167
%168 = load i32, i32* %8
%169 = add nsw i32 %168, 1
store i32 %169, i32* %8
br label %200
170: ; preds = %43, %43, %43, %43, %43, %43, %43, %43
%171 = load i8*, i8** %4
%172 = load i32, i32* %6
%173 = sext i32 %172 to i64
%174 = getelementptr inbounds i8, i8* %171, i64 %173
%175 = load i8, i8* %174
%176 = sext i8 %175 to i32
%177 = sub nsw i32 %176, 48
store i32 %177, i32* %9
store i32 0, i32* %10
br label %178
178: ; preds = %192, %170
%179 = load i32, i32* %10
%180 = load i32, i32* %9
%181 = icmp slt i32 %179, %180
br i1 %181, label %182, label %195
182: ; preds = %178
%183 = load double*, double** %5
%184 = load i32, i32* %7
%185 = mul nsw i32 %184, 8
%186 = load i32, i32* %8
%187 = add nsw i32 %185, %186
%188 = load i32, i32* %10
%189 = add nsw i32 %187, %188
%190 = sext i32 %189 to i64
%191 = getelementptr inbounds double, double* %183, i64 %190
store double 0.000000e+00, double* %191
br label %192
192: ; preds = %182
%193 = load i32, i32* %10
%194 = add nsw i32 %193, 1
store i32 %194, i32* %10
br label %178
195: ; preds = %178
%196 = load i32, i32* %9
%197 = load i32, i32* %8
%198 = add nsw i32 %197, %196
store i32 %198, i32* %8
br label %200
199: ; preds = %43
store i32 0, i32* %3
br label %204
200: ; preds = %195, %160, %150, %140, %130, %120, %110, %100, %90, %80, %70, %60, %50
%201 = load i32, i32* %6
%202 = add nsw i32 %201, 1
store i32 %202, i32* %6
br label %11
203: ; preds = %39, %24, %11
store i32 1, i32* %3
br label %204
204: ; preds = %203, %199, %30
%205 = load i32, i32* %3
ret i32 %205
}

LLVM IR (-O2):
define i32 @FEN_to_arr(i8* nocapture %0, double* nocapture writeonly %1) {
%3 = load i8, i8* %0
%4 = icmp eq i8 %3, 0
br i1 %4, label %130, label %5
5: ; preds = %2, %122
%6 = phi i8 [ %128, %122 ], [ %3, %2 ]
%7 = phi i32 [ %124, %122 ], [ 0, %2 ]
%8 = phi i32 [ %22, %122 ], [ 7, %2 ]
%9 = phi i32 [ %125, %122 ], [ 0, %2 ]
%10 = icmp sgt i32 %7, 7
br i1 %10, label %11, label %20
11: ; preds = %5
%12 = icmp eq i32 %7, 8
br i1 %12, label %13, label %130
13: ; preds = %11
%14 = icmp ne i32 %8, 0
%15 = icmp eq i8 %6, 47
%16 = select i1 %14, i1 %15, i1 false
br i1 %16, label %17, label %130
17: ; preds = %13
%18 = add nsw i32 %8, -1
%19 = add nsw i32 %9, 1
br label %20
20: ; preds = %17, %5
%21 = phi i32 [ %19, %17 ], [ %9, %5 ]
%22 = phi i32 [ %18, %17 ], [ %8, %5 ]
%23 = phi i32 [ 0, %17 ], [ %7, %5 ]
%24 = sext i32 %21 to i64
%25 = getelementptr inbounds i8, i8* %0, i64 %24
%26 = load i8, i8* %25
%27 = sext i8 %26 to i32
switch i32 %27, label %130 [
i32 107, label %116
i32 113, label %28
i32 98, label %29
i32 110, label %30
i32 114, label %31
i32 112, label %32
i32 75, label %33
i32 81, label %34
i32 66, label %35
i32 78, label %36
i32 82, label %37
i32 80, label %38
i32 49, label %39
i32 50, label %39
i32 51, label %39
i32 52, label %39
i32 53, label %39
i32 54, label %39
i32 55, label %39
i32 56, label %39
]
28: ; preds = %20
br label %116
29: ; preds = %20
br label %116
30: ; preds = %20
br label %116
31: ; preds = %20
br label %116
32: ; preds = %20
br label %116
33: ; preds = %20
br label %116
34: ; preds = %20
br label %116
35: ; preds = %20
br label %116
36: ; preds = %20
br label %116
37: ; preds = %20
br label %116
38: ; preds = %20
br label %116
39: ; preds = %20, %20, %20, %20, %20, %20, %20, %20
%40 = add nsw i32 %27, -48
%41 = icmp sgt i8 %26, 48
br i1 %41, label %42, label %122
42: ; preds = %39
%43 = shl nsw i32 %22, 3
%44 = add nsw i32 %43, %23
%45 = sext i32 %44 to i64
%46 = zext i32 %40 to i64
%47 = icmp ult i32 %40, 2
br i1 %47, label %108, label %48
48: ; preds = %42
%49 = and i64 %46, 4294967294
%50 = add nsw i64 %49, -2
%51 = lshr exact i64 %50, 1
%52 = add nuw i64 %51, 1
%53 = and i64 %52, 7
%54 = icmp ult i64 %50, 14
br i1 %54, label %94, label %55
55: ; preds = %48
%56 = and i64 %52, -8
br label %57
57: ; preds = %57, %55
%58 = phi i64 [ 0, %55 ], [ %91, %57 ]
%59 = phi i64 [ 0, %55 ], [ %92, %57 ]
%60 = add nsw i64 %58, %45
%61 = getelementptr inbounds double, double* %1, i64 %60
%62 = bitcast double* %61 to <2 x double>*
store <2 x double> zeroinitializer, <2 x double>* %62
%63 = or i64 %58, 2
%64 = add nsw i64 %63, %45
%65 = getelementptr inbounds double, double* %1, i64 %64
%66 = bitcast double* %65 to <2 x double>*
store <2 x double> zeroinitializer, <2 x double>* %66
%67 = or i64 %58, 4
%68 = add nsw i64 %67, %45
%69 = getelementptr inbounds double, double* %1, i64 %68
%70 = bitcast double* %69 to <2 x double>*
store <2 x double> zeroinitializer, <2 x double>* %70
%71 = or i64 %58, 6
%72 = add nsw i64 %71, %45
%73 = getelementptr inbounds double, double* %1, i64 %72
%74 = bitcast double* %73 to <2 x double>*
store <2 x double> zeroinitializer, <2 x double>* %74
%75 = or i64 %58, 8
%76 = add nsw i64 %75, %45
%77 = getelementptr inbounds double, double* %1, i64 %76
%78 = bitcast double* %77 to <2 x double>*
store <2 x double> zeroinitializer, <2 x double>* %78
%79 = or i64 %58, 10
%80 = add nsw i64 %79, %45
%81 = getelementptr inbounds double, double* %1, i64 %80
%82 = bitcast double* %81 to <2 x double>*
store <2 x double> zeroinitializer, <2 x double>* %82
%83 = or i64 %58, 12
%84 = add nsw i64 %83, %45
%85 = getelementptr inbounds double, double* %1, i64 %84
%86 = bitcast double* %85 to <2 x double>*
store <2 x double> zeroinitializer, <2 x double>* %86
%87 = or i64 %58, 14
%88 = add nsw i64 %87, %45
%89 = getelementptr inbounds double, double* %1, i64 %88
%90 = bitcast double* %89 to <2 x double>*
store <2 x double> zeroinitializer, <2 x double>* %90
%91 = add nuw i64 %58, 16
%92 = add i64 %59, 8
%93 = icmp eq i64 %92, %56
br i1 %93, label %94, label %57
94: ; preds = %57, %48
%95 = phi i64 [ 0, %48 ], [ %91, %57 ]
%96 = icmp eq i64 %53, 0
br i1 %96, label %106, label %97
97: ; preds = %94, %97
%98 = phi i64 [ %103, %97 ], [ %95, %94 ]
%99 = phi i64 [ %104, %97 ], [ 0, %94 ]
%100 = add nsw i64 %98, %45
%101 = getelementptr inbounds double, double* %1, i64 %100
%102 = bitcast double* %101 to <2 x double>*
store <2 x double> zeroinitializer, <2 x double>* %102
%103 = add nuw i64 %98, 2
%104 = add i64 %99, 1
%105 = icmp eq i64 %104, %53
br i1 %105, label %106, label %97
106: ; preds = %97, %94
%107 = icmp eq i64 %49, %46
br i1 %107, label %122, label %108
108: ; preds = %42, %106
%109 = phi i64 [ 0, %42 ], [ %49, %106 ]
br label %110
110: ; preds = %108, %110
%111 = phi i64 [ %114, %110 ], [ %109, %108 ]
%112 = add nsw i64 %111, %45
%113 = getelementptr inbounds double, double* %1, i64 %112
store double 0.000000e+00, double* %113
%114 = add nuw nsw i64 %111, 1
%115 = icmp eq i64 %114, %46
br i1 %115, label %122, label %110
116: ; preds = %20, %38, %37, %36, %35, %34, %33, %32, %31, %30, %29, %28
%117 = phi double [ 0xBFD6DB6DB6DB6DB7, %28 ], [ 0xBFD2492492492492, %29 ], [ 0xBFCB6DB6DB6DB6DB, %30 ], [ 0xBFC2492492492492, %31 ], [ 0xBFB2492492492492, %32 ], [ 0x3FDB6DB6DB6DB6DB, %33 ], [ 0x3FD6DB6DB6DB6DB7, %34 ], [ 0x3FD2492492492492, %35 ], [ 0x3FCB6DB6DB6DB6DB, %36 ], [ 0x3FC2492492492492, %37 ], [ 0x3FB2492492492492, %38 ], [ 0xBFDB6DB6DB6DB6DB, %20 ]
%118 = shl nsw i32 %22, 3
%119 = add nsw i32 %118, %23
%120 = sext i32 %119 to i64
%121 = getelementptr inbounds double, double* %1, i64 %120
store double %117, double* %121
br label %122
122: ; preds = %110, %106, %116, %39
%123 = phi i32 [ %40, %39 ], [ 1, %116 ], [ %40, %106 ], [ %40, %110 ]
%124 = add nsw i32 %123, %23
%125 = add nsw i32 %21, 1
%126 = sext i32 %125 to i64
%127 = getelementptr inbounds i8, i8* %0, i64 %126
%128 = load i8, i8* %127
%129 = icmp eq i8 %128, 0
br i1 %129, label %130, label %5
130: ; preds = %13, %11, %122, %20, %2
%131 = phi i32 [ 1, %2 ], [ 0, %20 ], [ 1, %122 ], [ 1, %11 ], [ 1, %13 ]
ret i32 %131
}