void ROE_2D_solver(double *F, double gamma, double P_L, double RHO_L,
                   double U_L, double V_L, double n_x, double n_y, double P_R,
                   double RHO_R, double U_R, double V_R, double *lambda_max,
                   double delta) {
  double H_L, H_R;
  H_L = gamma / (gamma - 1.0) * P_L / RHO_L + 0.5 * (U_L * U_L + V_L * V_L);
  H_R = gamma / (gamma - 1.0) * P_R / RHO_R + 0.5 * (U_R * U_R + V_R * V_R);
  F[0] = 0.5 * (RHO_L * U_L + RHO_R * U_R) * n_x +
         0.5 * (RHO_L * V_L + RHO_R * V_R) * n_y;
  F[1] = 0.5 * (RHO_L * U_L * U_L + P_L + RHO_R * U_R * U_R + P_R) * n_x +
         0.5 * (RHO_L * U_L * V_L + RHO_R * U_R * V_R) * n_y;
  F[2] = 0.5 * (RHO_L * U_L * V_L + RHO_R * U_R * V_R) * n_x +
         0.5 * (RHO_L * V_L * V_L + P_L + RHO_R * V_R * V_R + P_R) * n_y;
  F[3] = 0.5 * (RHO_L * U_L * H_L + RHO_R * U_R * H_R) * n_x +
         0.5 * (RHO_L * V_L * H_L + RHO_R * V_R * H_R) * n_y;
  double RHO_S, U_S, V_S, H_S, C_S;
  RHO_S = sqrt(RHO_L * RHO_R);
  U_S = (U_L * sqrt(RHO_L) + U_R * sqrt(RHO_R)) / (sqrt(RHO_L) + sqrt(RHO_R));
  V_S = (V_L * sqrt(RHO_L) + V_R * sqrt(RHO_R)) / (sqrt(RHO_L) + sqrt(RHO_R));
  H_S = (H_L * sqrt(RHO_L) + H_R * sqrt(RHO_R)) / (sqrt(RHO_L) + sqrt(RHO_R));
  C_S = sqrt((gamma - 1.0) * (H_S - 0.5 * U_S * U_S - 0.5 * V_S * V_S));
  double qn_S, qt_S;
  qn_S = U_S * n_x + V_S * n_y;
  qt_S = -U_S * n_y + V_S * n_x;
  double qn_R, qt_R;
  qn_R = U_R * n_x + V_R * n_y;
  qt_R = -U_R * n_y + V_R * n_x;
  double qn_L, qt_L;
  qn_L = U_L * n_x + V_L * n_y;
  qt_L = -U_L * n_y + V_L * n_x;
  double R[4][4];
  double lambda[4], W[4];
  R[0][0] = 1.0;
  R[0][1] = 1.0;
  R[0][2] = 1.0;
  R[0][3] = 0.0;
  R[1][0] = U_S - C_S * n_x;
  R[1][1] = U_S;
  R[1][2] = U_S + C_S * n_x;
  R[1][3] = -n_y;
  R[2][0] = V_S - C_S * n_y;
  R[2][1] = V_S;
  R[2][2] = V_S + C_S * n_y;
  R[2][3] = n_x;
  R[3][0] = H_S - qn_S * C_S;
  R[3][1] = 0.5 * (U_S * U_S + V_S * V_S);
  R[3][2] = H_S + qn_S * C_S;
  R[3][3] = qt_S;
  int i, j;
  W[0] = 0.5 * ((P_R - P_L) - RHO_S * C_S * (qn_R - qn_L)) / (C_S * C_S);
  W[1] = (RHO_R - RHO_L) - (P_R - P_L) / (C_S * C_S);
  W[2] = 0.5 * ((P_R - P_L) + RHO_S * C_S * (qn_R - qn_L)) / (C_S * C_S);
  W[3] = RHO_S * (qt_R - qt_L);
  lambda[0] = fabs(qn_S - C_S);
  lambda[1] = fabs(qn_S);
  lambda[2] = fabs(qn_S + C_S);
  lambda[3] = fabs(qn_S);
  double delta_1 = 0.01;
  double delta_2 = 0.2;
  if (lambda[0] < delta)
    lambda[0] = 0.5 / delta * (lambda[0] * lambda[0] + delta * delta);
  if (lambda[2] < delta)
    lambda[2] = 0.5 / delta * (lambda[2] * lambda[2] + delta * delta);
  *lambda_max = 0;
  for (i = 0; i < 4; i++) {
    *lambda_max = (*lambda_max > lambda[i] ? *lambda_max : lambda[i]);
    for (j = 0; j < 4; j++) {
      F[i] += -0.5 * lambda[j] * W[j] * R[i][j];
    }
  }
}


x86 assembly (clang, -O0):
<ROE_2D_solver>:
push   %rbp
mov    %rsp,%rbp
sub    $0x220,%rsp
movsd  0x28(%rbp),%xmm8
movsd  0x20(%rbp),%xmm8
movsd  0x18(%rbp),%xmm8
movsd  0x10(%rbp),%xmm8
mov    %rdi,-0x8(%rbp)
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
movsd  %xmm3,-0x28(%rbp)
movsd  %xmm4,-0x30(%rbp)
movsd  %xmm5,-0x38(%rbp)
movsd  %xmm6,-0x40(%rbp)
movsd  %xmm7,-0x48(%rbp)
mov    %rsi,-0x50(%rbp)
movsd  -0x10(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
movsd  0xea3(%rip),%xmm2
subsd  %xmm2,%xmm0
divsd  %xmm0,%xmm1
mulsd  -0x18(%rbp),%xmm1
divsd  -0x20(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm3
movsd  -0x30(%rbp),%xmm2
mulsd  -0x30(%rbp),%xmm2
mulsd  %xmm3,%xmm0
addsd  %xmm2,%xmm0
movsd  0xe65(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x10(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
movsd  0xe4e(%rip),%xmm2
subsd  %xmm2,%xmm0
divsd  %xmm0,%xmm1
mulsd  -0x48(%rbp),%xmm1
divsd  0x10(%rbp),%xmm1
movsd  0x18(%rbp),%xmm0
movsd  0x18(%rbp),%xmm3
movsd  0x20(%rbp),%xmm2
mulsd  0x20(%rbp),%xmm2
mulsd  %xmm3,%xmm0
addsd  %xmm2,%xmm0
movsd  0xe10(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x20(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm2
movsd  0x10(%rbp),%xmm0
mulsd  0x18(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0xddf(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm3
movsd  -0x30(%rbp),%xmm4
movsd  0x10(%rbp),%xmm1
mulsd  0x20(%rbp),%xmm1
mulsd  %xmm4,%xmm3
addsd  %xmm1,%xmm3
movsd  0xdb2(%rip),%xmm1
mulsd  %xmm3,%xmm1
mulsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x20(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm2
movsd  -0x18(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0x10(%rbp),%xmm1
mulsd  0x18(%rbp),%xmm1
movsd  0x18(%rbp),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
addsd  -0x48(%rbp),%xmm1
movsd  0xd59(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm3
mulsd  -0x28(%rbp),%xmm3
movsd  -0x30(%rbp),%xmm4
movsd  0x10(%rbp),%xmm1
mulsd  0x18(%rbp),%xmm1
mulsd  0x20(%rbp),%xmm1
mulsd  %xmm4,%xmm3
addsd  %xmm1,%xmm3
movsd  0xd22(%rip),%xmm1
mulsd  %xmm3,%xmm1
mulsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x20(%rbp),%xmm1
mulsd  -0x28(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm2
movsd  0x10(%rbp),%xmm0
mulsd  0x18(%rbp),%xmm0
mulsd  0x20(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0xcda(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm1
mulsd  -0x30(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm4
movsd  -0x18(%rbp),%xmm3
mulsd  %xmm4,%xmm1
addsd  %xmm3,%xmm1
movsd  0x10(%rbp),%xmm3
mulsd  0x20(%rbp),%xmm3
movsd  0x20(%rbp),%xmm4
mulsd  %xmm4,%xmm3
addsd  %xmm1,%xmm3
addsd  -0x48(%rbp),%xmm3
movsd  0xc91(%rip),%xmm1
mulsd  %xmm3,%xmm1
mulsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x20(%rbp),%xmm1
mulsd  -0x28(%rbp),%xmm1
movsd  -0x58(%rbp),%xmm2
movsd  0x10(%rbp),%xmm0
mulsd  0x18(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0xc49(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x20(%rbp),%xmm3
mulsd  -0x30(%rbp),%xmm3
movsd  -0x58(%rbp),%xmm4
movsd  0x10(%rbp),%xmm1
mulsd  0x20(%rbp),%xmm1
mulsd  -0x60(%rbp),%xmm1
mulsd  %xmm4,%xmm3
addsd  %xmm1,%xmm3
movsd  0xc12(%rip),%xmm1
mulsd  %xmm3,%xmm1
mulsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x18(%rax)
movsd  -0x20(%rbp),%xmm0
mulsd  0x10(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x68(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x200(%rbp)
ff
movsd  -0x20(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x208(%rbp)
ff
movsd  0x18(%rbp),%xmm0
movsd  %xmm0,-0x210(%rbp)
ff
movsd  0x10(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  -0x210(%rbp),%xmm1
ff
movsd  -0x208(%rbp),%xmm2
ff
movaps %xmm0,%xmm3
movsd  -0x200(%rbp),%xmm0
ff
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x1f0(%rbp)
ff
movsd  -0x20(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x1f8(%rbp)
ff
movsd  0x10(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  -0x1f8(%rbp),%xmm1
ff
movaps %xmm0,%xmm2
movsd  -0x1f0(%rbp),%xmm0
ff
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x1d8(%rbp)
ff
movsd  -0x20(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x1e0(%rbp)
ff
movsd  0x20(%rbp),%xmm0
movsd  %xmm0,-0x1e8(%rbp)
ff
movsd  0x10(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  -0x1e8(%rbp),%xmm1
ff
movsd  -0x1e0(%rbp),%xmm2
ff
movaps %xmm0,%xmm3
movsd  -0x1d8(%rbp),%xmm0
ff
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x1c8(%rbp)
ff
movsd  -0x20(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x1d0(%rbp)
ff
movsd  0x10(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  -0x1d0(%rbp),%xmm1
ff
movaps %xmm0,%xmm2
movsd  -0x1c8(%rbp),%xmm0
ff
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x1b0(%rbp)
ff
movsd  -0x20(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x1b8(%rbp)
ff
movsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x1c0(%rbp)
ff
movsd  0x10(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  -0x1c0(%rbp),%xmm1
ff
movsd  -0x1b8(%rbp),%xmm2
ff
movaps %xmm0,%xmm3
movsd  -0x1b0(%rbp),%xmm0
ff
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x1a0(%rbp)
ff
movsd  -0x20(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x1a8(%rbp)
ff
movsd  0x10(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  -0x1a8(%rbp),%xmm1
ff
movaps %xmm0,%xmm2
movsd  -0x1a0(%rbp),%xmm0
ff
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0x9fc(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  -0x80(%rbp),%xmm1
movsd  0x9e3(%rip),%xmm2
mulsd  -0x70(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm3
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
movsd  0x9b2(%rip),%xmm1
mulsd  -0x78(%rbp),%xmm1
movsd  -0x78(%rbp),%xmm3
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x70(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x70(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  0x18(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  0x20(%rbp),%xmm1
mulsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  0x18(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  0x20(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0x28(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm1
mulsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0x28(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  0x85b(%rip),%xmm0
movsd  %xmm0,-0x140(%rbp)
ff
movsd  0x84b(%rip),%xmm0
movsd  %xmm0,-0x138(%rbp)
ff
movsd  0x83b(%rip),%xmm0
movsd  %xmm0,-0x130(%rbp)
ff
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x128(%rbp)
ff
movsd  -0x70(%rbp),%xmm1
movsd  -0x88(%rbp),%xmm0
ff
movsd  -0x38(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x120(%rbp)
ff
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x118(%rbp)
ff
movsd  -0x70(%rbp),%xmm1
movsd  -0x88(%rbp),%xmm0
ff
movsd  -0x38(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x110(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x108(%rbp)
ff
movsd  -0x78(%rbp),%xmm1
movsd  -0x88(%rbp),%xmm0
ff
movsd  -0x40(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x100(%rbp)
ff
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0xf8(%rbp)
ff
movsd  -0x78(%rbp),%xmm1
movsd  -0x88(%rbp),%xmm0
ff
movsd  -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xf0(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  -0x80(%rbp),%xmm1
movsd  -0x90(%rbp),%xmm0
ff
movsd  -0x88(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
movsd  -0x70(%rbp),%xmm1
movsd  -0x70(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm0
mulsd  -0x78(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x6bf(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  -0x80(%rbp),%xmm1
movsd  -0x90(%rbp),%xmm0
ff
movsd  -0x88(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm1
mulsd  -0x88(%rbp),%xmm1
ff
movsd  -0xa0(%rbp),%xmm2
ff
subsd  -0xb0(%rbp),%xmm2
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x630(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  -0x88(%rbp),%xmm1
ff
mulsd  -0x88(%rbp),%xmm1
ff
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x180(%rbp)
ff
movsd  0x10(%rbp),%xmm0
subsd  -0x20(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
subsd  -0x18(%rbp),%xmm1
movsd  -0x88(%rbp),%xmm2
ff
mulsd  -0x88(%rbp),%xmm2
ff
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x178(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm1
mulsd  -0x88(%rbp),%xmm1
ff
movsd  -0xa0(%rbp),%xmm2
ff
subsd  -0xb0(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x5a5(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  -0x88(%rbp),%xmm1
ff
mulsd  -0x88(%rbp),%xmm1
ff
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x170(%rbp)
ff
movsd  -0x68(%rbp),%xmm0
movsd  -0xa8(%rbp),%xmm1
ff
subsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x168(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
subsd  -0x88(%rbp),%xmm0
ff
movaps 0x56d(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x160(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
movaps 0x552(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x158(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
addsd  -0x88(%rbp),%xmm0
ff
movaps 0x52f(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x150(%rbp)
ff
movsd  -0x90(%rbp),%xmm0
ff
movaps 0x514(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x148(%rbp)
ff
movsd  0x4d8(%rip),%xmm0
movsd  %xmm0,-0x190(%rbp)
ff
movsd  0x4c0(%rip),%xmm0
movsd  %xmm0,-0x198(%rbp)
ff
movsd  -0x160(%rbp),%xmm1
ff
movsd  0x28(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1b9a <ROE_2D_solver+0xa8a>
movsd  0x4a9(%rip),%xmm0
divsd  0x28(%rbp),%xmm0
movsd  -0x160(%rbp),%xmm1
ff
movsd  -0x160(%rbp),%xmm3
ff
movsd  0x28(%rbp),%xmm2
mulsd  0x28(%rbp),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x160(%rbp)
ff
movsd  -0x150(%rbp),%xmm1
ff
movsd  0x28(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1bec <ROE_2D_solver+0xadc>
movsd  0x457(%rip),%xmm0
divsd  0x28(%rbp),%xmm0
movsd  -0x150(%rbp),%xmm1
ff
movsd  -0x150(%rbp),%xmm3
ff
movsd  0x28(%rbp),%xmm2
mulsd  0x28(%rbp),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x150(%rbp)
ff
mov    -0x50(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x184(%rbp)
cmpl   $0x4,-0x184(%rbp)
jge    1d13 <ROE_2D_solver+0xc03>
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
movslq -0x184(%rbp),%rax
ucomisd -0x160(%rbp,%rax,8),%xmm0
ff ff
jbe    1c41 <ROE_2D_solver+0xb31>
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x218(%rbp)
ff
jmp    1c59 <ROE_2D_solver+0xb49>
movslq -0x184(%rbp),%rax
movsd  -0x160(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x218(%rbp)
ff
movsd  -0x218(%rbp),%xmm0
ff
mov    -0x50(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x188(%rbp)
cmpl   $0x4,-0x188(%rbp)
jge    1cfa <ROE_2D_solver+0xbea>
movslq -0x188(%rbp),%rax
movsd  0x391(%rip),%xmm0
mulsd  -0x160(%rbp,%rax,8),%xmm0
ff ff
movslq -0x188(%rbp),%rax
mulsd  -0x180(%rbp,%rax,8),%xmm0
ff ff
movslq -0x184(%rbp),%rcx
lea    -0x140(%rbp),%rax
shl    $0x5,%rcx
add    %rcx,%rax
movslq -0x188(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x8(%rbp),%rax
movslq -0x184(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x188(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x188(%rbp)
jmp    1c73 <ROE_2D_solver+0xb63>
jmp    1cff <ROE_2D_solver+0xbef>
mov    -0x184(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x184(%rbp)
jmp    1c01 <ROE_2D_solver+0xaf1>
add    $0x220,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ROE_2D_solver>:
push   %r14
push   %rbx
sub    $0x168,%rsp
mov    %rsi,%r14
movapd %xmm7,%xmm13
movapd %xmm5,%xmm12
movapd %xmm4,%xmm8
mov    %rdi,%rbx
movsd  0x190(%rsp),%xmm14
movsd  0x188(%rsp),%xmm11
movsd  0x180(%rsp),%xmm9
movsd  0xeab(%rip),%xmm4
addsd  %xmm0,%xmm4
movsd  %xmm4,0x78(%rsp)
divsd  %xmm4,%xmm0
movapd %xmm0,%xmm4
mulsd  %xmm1,%xmm4
divsd  %xmm2,%xmm4
movapd %xmm8,%xmm5
mulsd  %xmm8,%xmm5
movapd %xmm3,%xmm7
mulsd  %xmm3,%xmm7
addsd  %xmm5,%xmm7
movsd  0xe7b(%rip),%xmm5
mulsd  %xmm5,%xmm7
movapd %xmm5,%xmm10
addsd  %xmm4,%xmm7
mulsd  %xmm13,%xmm0
movapd %xmm9,%xmm5
divsd  %xmm9,%xmm0
movapd %xmm14,%xmm4
mulsd  %xmm14,%xmm4
movapd %xmm11,%xmm9
mulsd  %xmm11,%xmm9
addsd  %xmm4,%xmm9
mulsd  %xmm10,%xmm9
addsd  %xmm0,%xmm9
movapd %xmm5,%xmm14
mulsd  %xmm11,%xmm14
movapd %xmm2,%xmm15
mulsd  %xmm3,%xmm15
movapd %xmm15,%xmm0
movsd  %xmm3,0x68(%rsp)
mulsd  %xmm3,%xmm0
addsd  %xmm1,%xmm0
movapd %xmm14,%xmm3
mulsd  %xmm11,%xmm3
addsd  %xmm0,%xmm3
movapd %xmm15,%xmm0
addsd  %xmm14,%xmm0
addsd  %xmm13,%xmm3
unpcklpd %xmm3,%xmm0
movapd %xmm5,%xmm3
unpcklpd %xmm14,%xmm3
movsd  0x190(%rsp),%xmm5
unpcklpd %xmm5,%xmm5
mulpd  %xmm3,%xmm5
movapd %xmm2,%xmm3
unpcklpd %xmm15,%xmm3
movapd %xmm8,%xmm4
unpcklpd %xmm8,%xmm4
mulpd  %xmm3,%xmm4
movapd 0xdd2(%rip),%xmm11
mulpd  %xmm11,%xmm0
addpd  %xmm5,%xmm4
mulpd  %xmm11,%xmm4
movapd %xmm6,0x140(%rsp)
movapd %xmm6,%xmm10
unpcklpd %xmm6,%xmm10
movapd %xmm4,%xmm3
mulpd  %xmm10,%xmm3
movapd %xmm12,0x150(%rsp)
unpcklpd %xmm12,%xmm12
mulpd  %xmm12,%xmm0
addpd  %xmm3,%xmm0
movupd %xmm0,(%rdi)
movapd %xmm2,%xmm6
mulsd  %xmm8,%xmm6
movapd %xmm6,%xmm0
movapd %xmm8,0x130(%rsp)
mulsd  %xmm8,%xmm0
movsd  %xmm1,0x88(%rsp)
addsd  %xmm1,%xmm0
movapd %xmm5,%xmm3
movsd  0x190(%rsp),%xmm1
mulsd  %xmm1,%xmm3
addsd  %xmm0,%xmm3
mulsd  %xmm9,%xmm14
mulsd  %xmm7,%xmm15
addsd  %xmm14,%xmm15
movsd  %xmm9,0x18(%rsp)
mulsd  %xmm9,%xmm5
movsd  %xmm7,0x10(%rsp)
mulsd  %xmm7,%xmm6
addsd  %xmm5,%xmm6
addsd  %xmm13,%xmm3
unpcklpd %xmm6,%xmm3
mulpd  %xmm11,%xmm3
mulpd  %xmm10,%xmm3
mulsd  0xcf1(%rip),%xmm15
shufpd $0x1,%xmm15,%xmm4
mulpd  %xmm12,%xmm4
addpd  %xmm3,%xmm4
movupd %xmm4,0x10(%rdi)
movapd %xmm2,%xmm0
movsd  0x180(%rsp),%xmm1
mulsd  %xmm1,%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
movapd %xmm2,0x20(%rsp)
movsd  %xmm13,0x60(%rsp)
jb     1359 <ROE_2D_solver+0x249>
sqrtsd %xmm0,%xmm0
jmp    1368 <ROE_2D_solver+0x258>
call   1030 <sqrt@plt>
xorpd  %xmm1,%xmm1
movapd 0x20(%rsp),%xmm2
ucomisd %xmm1,%xmm2
movsd  %xmm0,0x80(%rsp)
jb     1380 <ROE_2D_solver+0x270>
xorps  %xmm1,%xmm1
sqrtsd %xmm2,%xmm1
jmp    138d <ROE_2D_solver+0x27d>
movapd %xmm2,%xmm0
call   1030 <sqrt@plt>
movapd %xmm0,%xmm1
movsd  0x180(%rsp),%xmm0
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm0
movsd  %xmm1,0x8(%rsp)
jb     13af <ROE_2D_solver+0x29f>
xorps  %xmm1,%xmm1
sqrtsd %xmm0,%xmm1
jmp    13bc <ROE_2D_solver+0x2ac>
call   1030 <sqrt@plt>
xorpd  %xmm2,%xmm2
movapd %xmm0,%xmm1
movapd 0x20(%rsp),%xmm0
ucomisd %xmm2,%xmm0
movsd  %xmm1,0x38(%rsp)
jb     13d7 <ROE_2D_solver+0x2c7>
xorps  %xmm1,%xmm1
sqrtsd %xmm0,%xmm1
jmp    13e0 <ROE_2D_solver+0x2d0>
call   1030 <sqrt@plt>
movapd %xmm0,%xmm1
movsd  0x180(%rsp),%xmm0
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm0
movsd  %xmm1,0x40(%rsp)
jb     13ff <ROE_2D_solver+0x2ef>
sqrtsd %xmm0,%xmm0
jmp    1408 <ROE_2D_solver+0x2f8>
call   1030 <sqrt@plt>
xorpd  %xmm2,%xmm2
movsd  %xmm0,0x58(%rsp)
movapd 0x20(%rsp),%xmm0
ucomisd %xmm2,%xmm0
jb     1423 <ROE_2D_solver+0x313>
xorps  %xmm1,%xmm1
sqrtsd %xmm0,%xmm1
jmp    142c <ROE_2D_solver+0x31c>
call   1030 <sqrt@plt>
movapd %xmm0,%xmm1
movsd  0x180(%rsp),%xmm0
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm0
movsd  %xmm1,(%rsp)
jb     144d <ROE_2D_solver+0x33d>
xorps  %xmm1,%xmm1
sqrtsd %xmm0,%xmm1
jmp    145a <ROE_2D_solver+0x34a>
call   1030 <sqrt@plt>
xorpd  %xmm2,%xmm2
movapd %xmm0,%xmm1
movapd 0x20(%rsp),%xmm0
ucomisd %xmm2,%xmm0
movsd  %xmm1,0x30(%rsp)
jb     1475 <ROE_2D_solver+0x365>
xorps  %xmm1,%xmm1
sqrtsd %xmm0,%xmm1
jmp    147e <ROE_2D_solver+0x36e>
call   1030 <sqrt@plt>
movapd %xmm0,%xmm1
movsd  0x180(%rsp),%xmm0
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm0
movsd  %xmm1,0x48(%rsp)
jb     149d <ROE_2D_solver+0x38d>
sqrtsd %xmm0,%xmm0
jmp    14a6 <ROE_2D_solver+0x396>
call   1030 <sqrt@plt>
xorpd  %xmm2,%xmm2
movsd  %xmm0,0x50(%rsp)
movapd 0x20(%rsp),%xmm0
ucomisd %xmm2,%xmm0
jb     14bf <ROE_2D_solver+0x3af>
sqrtsd %xmm0,%xmm8
jmp    14c9 <ROE_2D_solver+0x3b9>
call   1030 <sqrt@plt>
movapd %xmm0,%xmm8
movsd  0x180(%rsp),%xmm0
movsd  0x190(%rsp),%xmm1
movsd  0x8(%rsp),%xmm15
movsd  (%rsp),%xmm14
movsd  0x38(%rsp),%xmm6
movsd  0x30(%rsp),%xmm7
mulsd  0x188(%rsp),%xmm6
mulsd  0x68(%rsp),%xmm15
mulsd  %xmm1,%xmm7
mulsd  0x130(%rsp),%xmm14
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1522 <ROE_2D_solver+0x412>
sqrtsd %xmm0,%xmm0
jmp    156b <ROE_2D_solver+0x45b>
movsd  %xmm15,0x8(%rsp)
movsd  %xmm14,(%rsp)
movsd  %xmm6,0x38(%rsp)
movsd  %xmm7,0x30(%rsp)
movsd  %xmm8,0x70(%rsp)
call   1030 <sqrt@plt>
xorpd  %xmm1,%xmm1
movsd  0x70(%rsp),%xmm8
movsd  0x30(%rsp),%xmm7
movsd  0x38(%rsp),%xmm6
movsd  (%rsp),%xmm14
movsd  0x8(%rsp),%xmm15
movapd 0x20(%rsp),%xmm9
movsd  0x10(%rsp),%xmm13
movsd  0x18(%rsp),%xmm2
movsd  0x40(%rsp),%xmm5
addsd  %xmm6,%xmm15
addsd  0x58(%rsp),%xmm5
addsd  %xmm7,%xmm14
movsd  0x48(%rsp),%xmm6
addsd  0x50(%rsp),%xmm6
mulsd  %xmm0,%xmm2
mulsd  %xmm8,%xmm13
ucomisd %xmm1,%xmm9
jb     15bb <ROE_2D_solver+0x4ab>
xorps  %xmm1,%xmm1
sqrtsd %xmm9,%xmm1
jmp    1615 <ROE_2D_solver+0x505>
movapd %xmm9,%xmm0
movsd  %xmm13,0x10(%rsp)
movsd  %xmm15,0x8(%rsp)
movsd  %xmm2,0x18(%rsp)
movsd  %xmm14,(%rsp)
movsd  %xmm5,0x40(%rsp)
movsd  %xmm6,0x48(%rsp)
call   1030 <sqrt@plt>
movsd  0x48(%rsp),%xmm6
movsd  0x40(%rsp),%xmm5
movsd  (%rsp),%xmm14
movsd  0x18(%rsp),%xmm2
movsd  0x8(%rsp),%xmm15
movsd  0x10(%rsp),%xmm13
movapd %xmm0,%xmm1
movsd  0x180(%rsp),%xmm0
divsd  %xmm5,%xmm15
divsd  %xmm6,%xmm14
addsd  %xmm2,%xmm13
xorpd  %xmm5,%xmm5
ucomisd %xmm5,%xmm0
movsd  %xmm15,0x8(%rsp)
movsd  %xmm14,(%rsp)
jb     164a <ROE_2D_solver+0x53a>
sqrtsd %xmm0,%xmm0
jmp    167a <ROE_2D_solver+0x56a>
movsd  %xmm13,0x10(%rsp)
movsd  %xmm1,0x18(%rsp)
call   1030 <sqrt@plt>
movsd  0x18(%rsp),%xmm1
xorpd  %xmm5,%xmm5
movsd  (%rsp),%xmm14
movsd  0x8(%rsp),%xmm15
movsd  0x10(%rsp),%xmm13
addsd  %xmm0,%xmm1
divsd  %xmm1,%xmm13
movsd  0x985(%rip),%xmm2
movapd %xmm15,%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm15,%xmm0
addsd  %xmm13,%xmm0
movapd %xmm14,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm14,%xmm1
addsd  %xmm0,%xmm1
movsd  0x78(%rsp),%xmm0
mulsd  %xmm1,%xmm0
ucomisd %xmm5,%xmm0
jb     16c6 <ROE_2D_solver+0x5b6>
sqrtsd %xmm0,%xmm0
jmp    16e6 <ROE_2D_solver+0x5d6>
movsd  %xmm13,0x10(%rsp)
call   1030 <sqrt@plt>
movsd  (%rsp),%xmm14
movsd  0x8(%rsp),%xmm15
movsd  0x10(%rsp),%xmm13
movsd  0x180(%rsp),%xmm9
movsd  0x190(%rsp),%xmm10
movsd  0x60(%rsp),%xmm11
movapd %xmm14,%xmm2
movapd 0x140(%rsp),%xmm7
mulsd  %xmm7,%xmm2
movapd %xmm15,%xmm12
movapd 0x150(%rsp),%xmm6
mulsd  %xmm6,%xmm12
addsd  %xmm2,%xmm12
movapd %xmm14,%xmm8
mulsd  %xmm6,%xmm8
movapd %xmm15,%xmm3
mulsd  %xmm7,%xmm3
subsd  %xmm3,%xmm8
movapd %xmm7,%xmm3
mulsd  %xmm10,%xmm3
movsd  0x188(%rsp),%xmm1
movapd %xmm1,%xmm4
mulsd  %xmm6,%xmm4
addsd  %xmm3,%xmm4
mulsd  %xmm6,%xmm10
mulsd  %xmm7,%xmm1
subsd  %xmm1,%xmm10
movapd 0x130(%rsp),%xmm3
movapd %xmm3,%xmm2
mulsd  %xmm7,%xmm2
movsd  0x68(%rsp),%xmm1
movapd %xmm1,%xmm5
mulsd  %xmm6,%xmm5
addsd  %xmm2,%xmm5
subsd  %xmm5,%xmm4
mulsd  %xmm6,%xmm3
mulsd  %xmm7,%xmm1
subsd  %xmm1,%xmm3
subsd  %xmm3,%xmm10
movaps 0x882(%rip),%xmm3
movaps %xmm3,0xb0(%rsp)
movsd  0x85a(%rip),%xmm3
movaps %xmm3,0xc0(%rsp)
movapd %xmm0,%xmm3
mulsd  %xmm6,%xmm3
movapd %xmm15,%xmm5
subsd  %xmm3,%xmm5
movsd  %xmm5,0xd0(%rsp)
movsd  %xmm15,0xd8(%rsp)
addsd  %xmm15,%xmm3
movsd  %xmm3,0xe0(%rsp)
movapd %xmm0,%xmm3
mulsd  %xmm7,%xmm3
xorpd  0x838(%rip),%xmm7
movlpd %xmm7,0xe8(%rsp)
movapd %xmm14,%xmm5
subsd  %xmm3,%xmm5
movsd  %xmm5,0xf0(%rsp)
movsd  %xmm14,0xf8(%rsp)
addsd  %xmm14,%xmm3
movsd  %xmm3,0x100(%rsp)
movsd  %xmm6,0x108(%rsp)
movapd %xmm12,%xmm3
mulsd  %xmm0,%xmm3
movapd %xmm13,%xmm5
subsd  %xmm3,%xmm5
movsd  %xmm5,0x110(%rsp)
mulsd  %xmm14,%xmm14
mulsd  %xmm15,%xmm15
addsd  %xmm14,%xmm15
movsd  0x791(%rip),%xmm14
mulsd  %xmm14,%xmm15
movsd  %xmm15,0x118(%rsp)
addsd  %xmm13,%xmm3
movsd  %xmm3,0x120(%rsp)
movsd  %xmm8,0x128(%rsp)
subsd  0x88(%rsp),%xmm11
movsd  0x80(%rsp),%xmm13
movapd %xmm13,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm4,%xmm3
movapd %xmm11,%xmm4
subsd  %xmm3,%xmm4
mulsd  %xmm14,%xmm4
movapd %xmm0,%xmm6
mulsd  %xmm0,%xmm6
subsd  0x20(%rsp),%xmm9
addsd  %xmm11,%xmm3
divsd  %xmm6,%xmm11
mulsd  %xmm14,%xmm3
movapd %xmm12,%xmm7
subsd  %xmm0,%xmm7
movapd %xmm7,%xmm5
unpcklpd %xmm12,%xmm5
movapd 0x74b(%rip),%xmm2
andpd  %xmm2,%xmm5
movapd %xmm5,0x90(%rsp)
addsd  %xmm0,%xmm12
andpd  %xmm12,%xmm2
movapd %xmm2,%xmm0
shufpd $0x2,%xmm5,%xmm0
movapd %xmm0,0xa0(%rsp)
pshufd $0xee,%xmm5,%xmm0
movsd  0x198(%rsp),%xmm1
ucomisd %xmm5,%xmm1
jbe    196e <ROE_2D_solver+0x85e>
movapd %xmm14,%xmm8
divsd  %xmm1,%xmm8
movapd %xmm1,%xmm5
mulsd  %xmm1,%xmm5
mulsd  %xmm7,%xmm7
addsd  %xmm5,%xmm7
mulsd  %xmm8,%xmm7
movsd  %xmm7,0x90(%rsp)
movapd %xmm7,%xmm5
divsd  %xmm6,%xmm4
subsd  %xmm11,%xmm9
divsd  %xmm6,%xmm3
mulsd  %xmm13,%xmm10
ucomisd %xmm2,%xmm1
jbe    19ad <ROE_2D_solver+0x89d>
divsd  %xmm1,%xmm14
mulsd  %xmm1,%xmm1
mulsd  %xmm12,%xmm12
addsd  %xmm1,%xmm12
mulsd  %xmm14,%xmm12
movsd  %xmm12,0xa0(%rsp)
movapd %xmm12,%xmm2
movapd %xmm5,%xmm1
movsd  0x657(%rip),%xmm6
mulsd  %xmm6,%xmm1
mulsd  %xmm4,%xmm1
mulsd  %xmm6,%xmm0
mulsd  %xmm0,%xmm9
mulsd  %xmm6,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm10,%xmm0
xorpd  %xmm3,%xmm3
movapd %xmm0,%xmm4
mulsd  %xmm3,%xmm4
maxsd  %xmm5,%xmm3
movsd  %xmm3,(%r14)
movsd  (%rbx),%xmm3
addsd  %xmm1,%xmm3
addsd  %xmm9,%xmm3
addsd  %xmm2,%xmm3
addsd  %xmm4,%xmm3
movsd  %xmm3,(%rbx)
movsd  (%r14),%xmm3
maxsd  0x98(%rsp),%xmm3
movsd  0xd0(%rsp),%xmm4
mulsd  %xmm1,%xmm4
movsd  0xd8(%rsp),%xmm5
mulsd  %xmm9,%xmm5
movsd  0xe0(%rsp),%xmm6
mulsd  %xmm2,%xmm6
movsd  0xe8(%rsp),%xmm7
mulsd  %xmm0,%xmm7
movsd  %xmm3,(%r14)
addsd  0x8(%rbx),%xmm4
addsd  %xmm5,%xmm4
addsd  %xmm6,%xmm4
addsd  %xmm7,%xmm4
movsd  %xmm4,0x8(%rbx)
movsd  (%r14),%xmm3
maxsd  0xa0(%rsp),%xmm3
movsd  0xf0(%rsp),%xmm4
mulsd  %xmm1,%xmm4
movsd  0xf8(%rsp),%xmm5
mulsd  %xmm9,%xmm5
movsd  0x100(%rsp),%xmm6
mulsd  %xmm2,%xmm6
movsd  0x108(%rsp),%xmm7
movsd  %xmm3,(%r14)
addsd  0x10(%rbx),%xmm4
mulsd  %xmm0,%xmm7
addsd  %xmm5,%xmm4
addsd  %xmm6,%xmm4
addsd  %xmm7,%xmm4
movsd  %xmm4,0x10(%rbx)
movsd  (%r14),%xmm3
maxsd  0xa8(%rsp),%xmm3
mulsd  0x110(%rsp),%xmm1
mulsd  0x118(%rsp),%xmm9
mulsd  0x120(%rsp),%xmm2
mulsd  0x128(%rsp),%xmm0
movsd  %xmm3,(%r14)
addsd  0x18(%rbx),%xmm1
addsd  %xmm9,%xmm1
addsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,0x18(%rbx)
add    $0x168,%rsp
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define void @ROE_2D_solver(double* nocapture %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9, double %10, double %11, double* nocapture %12, double %13) {
%15 = alloca [4 x [4 x double]]
%16 = alloca [4 x double]
%17 = fadd double %1, -1.000000e+00
%18 = fdiv double %1, %17
%19 = fmul double %18, %2
%20 = fdiv double %19, %3
%21 = fmul double %5, %5
%22 = tail call double @llvm.fmuladd.f64(double %4, double %4, double %21)
%23 = tail call double @llvm.fmuladd.f64(double %22, double 5.000000e-01, double %20)
%24 = fmul double %18, %8
%25 = fdiv double %24, %9
%26 = fmul double %11, %11
%27 = tail call double @llvm.fmuladd.f64(double %10, double %10, double %26)
%28 = tail call double @llvm.fmuladd.f64(double %27, double 5.000000e-01, double %25)
%29 = fmul double %9, %10
%30 = tail call double @llvm.fmuladd.f64(double %3, double %4, double %29)
%31 = fmul double %3, %4
%32 = tail call double @llvm.fmuladd.f64(double %31, double %4, double %2)
%33 = tail call double @llvm.fmuladd.f64(double %29, double %10, double %32)
%34 = fadd double %33, %8
%35 = insertelement <2 x double> poison, double %30, i64 0
%36 = insertelement <2 x double> %35, double %34, i64 1
%37 = fmul <2 x double> %36, <double 5.000000e-01, double 5.000000e-01>
%38 = insertelement <2 x double> poison, double %9, i64 0
%39 = insertelement <2 x double> %38, double %29, i64 1
%40 = insertelement <2 x double> poison, double %11, i64 0
%41 = shufflevector <2 x double> %40, <2 x double> poison, <2 x i32> zeroinitializer
%42 = fmul <2 x double> %39, %41
%43 = insertelement <2 x double> poison, double %3, i64 0
%44 = insertelement <2 x double> %43, double %31, i64 1
%45 = insertelement <2 x double> poison, double %5, i64 0
%46 = shufflevector <2 x double> %45, <2 x double> poison, <2 x i32> zeroinitializer
%47 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %44, <2 x double> %46, <2 x double> %42)
%48 = fmul <2 x double> %47, <double 5.000000e-01, double 5.000000e-01>
%49 = insertelement <2 x double> poison, double %7, i64 0
%50 = shufflevector <2 x double> %49, <2 x double> poison, <2 x i32> zeroinitializer
%51 = fmul <2 x double> %48, %50
%52 = insertelement <2 x double> poison, double %6, i64 0
%53 = shufflevector <2 x double> %52, <2 x double> poison, <2 x i32> zeroinitializer
%54 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %37, <2 x double> %53, <2 x double> %51)
%55 = bitcast double* %0 to <2 x double>*
store <2 x double> %54, <2 x double>* %55
%56 = fmul double %3, %5
%57 = tail call double @llvm.fmuladd.f64(double %56, double %5, double %2)
%58 = extractelement <2 x double> %42, i64 0
%59 = tail call double @llvm.fmuladd.f64(double %58, double %11, double %57)
%60 = fadd double %59, %8
%61 = extractelement <2 x double> %48, i64 1
%62 = getelementptr inbounds double, double* %0, i64 2
%63 = fmul double %29, %28
%64 = tail call double @llvm.fmuladd.f64(double %31, double %23, double %63)
%65 = fmul double %64, 5.000000e-01
%66 = fmul double %58, %28
%67 = tail call double @llvm.fmuladd.f64(double %56, double %23, double %66)
%68 = insertelement <2 x double> poison, double %60, i64 0
%69 = insertelement <2 x double> %68, double %67, i64 1
%70 = fmul <2 x double> %69, <double 5.000000e-01, double 5.000000e-01>
%71 = fmul <2 x double> %70, %50
%72 = insertelement <2 x double> poison, double %61, i64 0
%73 = insertelement <2 x double> %72, double %65, i64 1
%74 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %73, <2 x double> %53, <2 x double> %71)
%75 = bitcast double* %62 to <2 x double>*
store <2 x double> %74, <2 x double>* %75
%76 = fmul double %3, %9
%77 = tail call double @sqrt(double %76)
%78 = tail call double @sqrt(double %3)
%79 = tail call double @sqrt(double %9)
%80 = fmul double %79, %10
%81 = tail call double @llvm.fmuladd.f64(double %4, double %78, double %80)
%82 = tail call double @sqrt(double %3)
%83 = tail call double @sqrt(double %9)
%84 = fadd double %82, %83
%85 = fdiv double %81, %84
%86 = tail call double @sqrt(double %3)
%87 = tail call double @sqrt(double %9)
%88 = fmul double %87, %11
%89 = tail call double @llvm.fmuladd.f64(double %5, double %86, double %88)
%90 = tail call double @sqrt(double %3)
%91 = tail call double @sqrt(double %9)
%92 = fadd double %90, %91
%93 = fdiv double %89, %92
%94 = tail call double @sqrt(double %3)
%95 = tail call double @sqrt(double %9)
%96 = fmul double %28, %95
%97 = tail call double @llvm.fmuladd.f64(double %23, double %94, double %96)
%98 = tail call double @sqrt(double %3)
%99 = tail call double @sqrt(double %9)
%100 = fadd double %98, %99
%101 = fdiv double %97, %100
%102 = fmul double %85, -5.000000e-01
%103 = tail call double @llvm.fmuladd.f64(double %102, double %85, double %101)
%104 = fmul double %93, -5.000000e-01
%105 = tail call double @llvm.fmuladd.f64(double %104, double %93, double %103)
%106 = fmul double %17, %105
%107 = tail call double @sqrt(double %106)
%108 = fmul double %93, %7
%109 = tail call double @llvm.fmuladd.f64(double %85, double %6, double %108)
%110 = fneg double %85
%111 = fmul double %93, %6
%112 = tail call double @llvm.fmuladd.f64(double %110, double %7, double %111)
%113 = fmul double %7, %11
%114 = tail call double @llvm.fmuladd.f64(double %10, double %6, double %113)
%115 = fneg double %10
%116 = fmul double %6, %11
%117 = tail call double @llvm.fmuladd.f64(double %115, double %7, double %116)
%118 = fmul double %5, %7
%119 = tail call double @llvm.fmuladd.f64(double %4, double %6, double %118)
%120 = fneg double %4
%121 = fmul double %5, %6
%122 = tail call double @llvm.fmuladd.f64(double %120, double %7, double %121)
%123 = bitcast [4 x [4 x double]]* %15 to i8*
%124 = bitcast [4 x double]* %16 to i8*
%125 = bitcast [4 x [4 x double]]* %15 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %125
%126 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 0, i64 2
%127 = bitcast double* %126 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 0.000000e+00>, <2 x double>* %127
%128 = fneg double %107
%129 = tail call double @llvm.fmuladd.f64(double %128, double %6, double %85)
%130 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 1, i64 0
store double %129, double* %130
%131 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 1, i64 1
store double %85, double* %131
%132 = tail call double @llvm.fmuladd.f64(double %107, double %6, double %85)
%133 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 1, i64 2
store double %132, double* %133
%134 = fneg double %7
%135 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 1, i64 3
store double %134, double* %135
%136 = tail call double @llvm.fmuladd.f64(double %128, double %7, double %93)
%137 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 2, i64 0
store double %136, double* %137
%138 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 2, i64 1
store double %93, double* %138
%139 = tail call double @llvm.fmuladd.f64(double %107, double %7, double %93)
%140 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 2, i64 2
store double %139, double* %140
%141 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 2, i64 3
store double %6, double* %141
%142 = fneg double %109
%143 = tail call double @llvm.fmuladd.f64(double %142, double %107, double %101)
%144 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 3, i64 0
store double %143, double* %144
%145 = fmul double %93, %93
%146 = tail call double @llvm.fmuladd.f64(double %85, double %85, double %145)
%147 = fmul double %146, 5.000000e-01
%148 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 3, i64 1
store double %147, double* %148
%149 = tail call double @llvm.fmuladd.f64(double %109, double %107, double %101)
%150 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 3, i64 2
store double %149, double* %150
%151 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 3, i64 3
store double %112, double* %151
%152 = fsub double %8, %2
%153 = fmul double %77, %107
%154 = fsub double %114, %119
%155 = fneg double %153
%156 = tail call double @llvm.fmuladd.f64(double %155, double %154, double %152)
%157 = fmul double %156, 5.000000e-01
%158 = fmul double %107, %107
%159 = fdiv double %157, %158
%160 = fsub double %9, %3
%161 = fdiv double %152, %158
%162 = fsub double %160, %161
%163 = tail call double @llvm.fmuladd.f64(double %153, double %154, double %152)
%164 = fmul double %163, 5.000000e-01
%165 = fdiv double %164, %158
%166 = fsub double %117, %122
%167 = fmul double %166, %77
%168 = fsub double %109, %107
%169 = insertelement <2 x double> poison, double %168, i64 0
%170 = insertelement <2 x double> %169, double %109, i64 1
%171 = call <2 x double> @llvm.fabs.v2f64(<2 x double> %170)
%172 = bitcast [4 x double]* %16 to <2 x double>*
store <2 x double> %171, <2 x double>* %172
%173 = fadd double %109, %107
%174 = tail call double @llvm.fabs.f64(double %173)
%175 = getelementptr inbounds [4 x double], [4 x double]* %16, i64 0, i64 2
store double %174, double* %175
%176 = getelementptr inbounds [4 x double], [4 x double]* %16, i64 0, i64 3
%177 = extractelement <2 x double> %171, i64 1
store double %177, double* %176
%178 = extractelement <2 x double> %171, i64 0
%179 = fcmp olt double %178, %13
br i1 %179, label %180, label %186
180: ; preds = %14
%181 = getelementptr inbounds [4 x double], [4 x double]* %16, i64 0, i64 0
%182 = fdiv double 5.000000e-01, %13
%183 = fmul double %13, %13
%184 = tail call double @llvm.fmuladd.f64(double %168, double %168, double %183)
%185 = fmul double %182, %184
store double %185, double* %181
br label %186
186: ; preds = %180, %14
%187 = phi double [ %185, %180 ], [ %178, %14 ]
%188 = fcmp olt double %174, %13
br i1 %188, label %189, label %194
189: ; preds = %186
%190 = fdiv double 5.000000e-01, %13
%191 = fmul double %13, %13
%192 = tail call double @llvm.fmuladd.f64(double %173, double %173, double %191)
%193 = fmul double %190, %192
store double %193, double* %175
br label %194
194: ; preds = %189, %186
%195 = phi double [ %193, %189 ], [ %174, %186 ]
%196 = fmul double %187, -5.000000e-01
%197 = fmul double %196, %159
%198 = fmul double %177, -5.000000e-01
%199 = fmul double %198, %162
%200 = fmul double %195, -5.000000e-01
%201 = fmul double %200, %165
%202 = fmul double %198, %167
%203 = fcmp olt double %187, 0.000000e+00
%204 = select i1 %203, double 0.000000e+00, double %187
store double %204, double* %12
%205 = load double, double* %0
%206 = fadd double %197, %205
%207 = fadd double %199, %206
%208 = fadd double %201, %207
%209 = tail call double @llvm.fmuladd.f64(double %202, double 0.000000e+00, double %208)
store double %209, double* %0
%210 = load double, double* %12
%211 = getelementptr inbounds [4 x double], [4 x double]* %16, i64 0, i64 1
%212 = load double, double* %211
%213 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 1, i64 0
%214 = load double, double* %213
%215 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 1, i64 1
%216 = load double, double* %215
%217 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 1, i64 2
%218 = load double, double* %217
%219 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 1, i64 3
%220 = load double, double* %219
%221 = fcmp ogt double %210, %212
%222 = select i1 %221, double %210, double %212
store double %222, double* %12
%223 = getelementptr inbounds double, double* %0, i64 1
%224 = load double, double* %223
%225 = tail call double @llvm.fmuladd.f64(double %197, double %214, double %224)
%226 = tail call double @llvm.fmuladd.f64(double %199, double %216, double %225)
%227 = tail call double @llvm.fmuladd.f64(double %201, double %218, double %226)
%228 = tail call double @llvm.fmuladd.f64(double %202, double %220, double %227)
store double %228, double* %223
%229 = load double, double* %12
%230 = getelementptr inbounds [4 x double], [4 x double]* %16, i64 0, i64 2
%231 = load double, double* %230
%232 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 2, i64 0
%233 = load double, double* %232
%234 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 2, i64 1
%235 = load double, double* %234
%236 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 2, i64 2
%237 = load double, double* %236
%238 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 2, i64 3
%239 = load double, double* %238
%240 = fcmp ogt double %229, %231
%241 = select i1 %240, double %229, double %231
store double %241, double* %12
%242 = getelementptr inbounds double, double* %0, i64 2
%243 = load double, double* %242
%244 = tail call double @llvm.fmuladd.f64(double %197, double %233, double %243)
%245 = tail call double @llvm.fmuladd.f64(double %199, double %235, double %244)
%246 = tail call double @llvm.fmuladd.f64(double %201, double %237, double %245)
%247 = tail call double @llvm.fmuladd.f64(double %202, double %239, double %246)
store double %247, double* %242
%248 = load double, double* %12
%249 = getelementptr inbounds [4 x double], [4 x double]* %16, i64 0, i64 3
%250 = load double, double* %249
%251 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 3, i64 0
%252 = load double, double* %251
%253 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 3, i64 1
%254 = load double, double* %253
%255 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 3, i64 2
%256 = load double, double* %255
%257 = getelementptr inbounds [4 x [4 x double]], [4 x [4 x double]]* %15, i64 0, i64 3, i64 3
%258 = load double, double* %257
%259 = fcmp ogt double %248, %250
%260 = select i1 %259, double %248, double %250
store double %260, double* %12
%261 = getelementptr inbounds double, double* %0, i64 3
%262 = load double, double* %261
%263 = tail call double @llvm.fmuladd.f64(double %197, double %252, double %262)
%264 = tail call double @llvm.fmuladd.f64(double %199, double %254, double %263)
%265 = tail call double @llvm.fmuladd.f64(double %201, double %256, double %264)
%266 = tail call double @llvm.fmuladd.f64(double %202, double %258, double %265)
store double %266, double* %261
ret void
}