void get_face_2d_quickest_a(int iX, int iY, int nX, int nY, int X_nbr,
                            int Y_nbr, int nrm, int tid, double delta_t,
                            double u_face, double dummy, double *sc_face,
                            double *sc_old) {
  int nbrid;
  double wind = 1.;
  double crnt;
  double tmp;
  double sc_face_tmp;
  crnt = u_face * delta_t * 1.;
  if (crnt < 0.)
    wind = -1.;
  tmp = (1. - crnt * crnt) * 0.08333333333333333;
  sc_face_tmp = *(sc_old + tid) *
                (0.5 + 0.5 * crnt * nrm + tmp * (1. + 3. * wind * (nrm)));
  nbrid = (iY + (Y_nbr)) * nX + iX + (X_nbr);
  sc_face_tmp += *(sc_old + nbrid) *
                 (0.5 - 0.5 * crnt * (nrm) + tmp * (1. - 3. * wind * (nrm)));
  nbrid = (iY - (Y_nbr)) * nX + iX - (X_nbr);
  sc_face_tmp += *(sc_old + nbrid) * (tmp * (-1. - (double)(wind * (nrm))));
  nbrid = (iY + 2 * (Y_nbr)) * nX + iX + 2 * (X_nbr);
  sc_face_tmp += *(sc_old + nbrid) * (tmp * (-1. + (double)(wind * (nrm))));
  *sc_face = sc_face_tmp;
}


x86 assembly (clang, -O0):
<get_face_2d_quickest_a>:
push   %rbp
mov    %rsp,%rbp
mov    0x28(%rbp),%rax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    %r9d,-0x18(%rbp)
movsd  %xmm0,-0x20(%rbp)
movsd  %xmm1,-0x28(%rbp)
movsd  %xmm2,-0x30(%rbp)
movsd  0xec3(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x28(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  0xeac(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x48(%rbp),%xmm0
jbe    1178 <get_face_2d_quickest_a+0x78>
movsd  0xe95(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  0xe5b(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  0xe6f(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    0x28(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  0xe49(%rip),%xmm2
mulsd  -0x48(%rbp),%xmm2
cvtsi2sdl 0x10(%rbp),%xmm1
mulsd  %xmm1,%xmm2
movsd  0xe33(%rip),%xmm1
addsd  %xmm1,%xmm2
movsd  -0x50(%rbp),%xmm1
movsd  0xe1a(%rip),%xmm3
mulsd  -0x40(%rbp),%xmm3
cvtsi2sdl 0x10(%rbp),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xdf4(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x8(%rbp),%eax
add    -0x18(%rbp),%eax
imul   -0xc(%rbp),%eax
add    -0x4(%rbp),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  0xdcf(%rip),%xmm1
mulsd  -0x48(%rbp),%xmm1
cvtsi2sdl 0x10(%rbp),%xmm2
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
movsd  0xda2(%rip),%xmm2
addsd  %xmm2,%xmm1
movsd  -0x50(%rbp),%xmm2
movsd  0xd89(%rip),%xmm3
mulsd  -0x40(%rbp),%xmm3
cvtsi2sdl 0x10(%rbp),%xmm4
movq   %xmm3,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm3
mulsd  %xmm4,%xmm3
movsd  0xd4c(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x8(%rbp),%eax
sub    -0x18(%rbp),%eax
imul   -0xc(%rbp),%eax
add    -0x4(%rbp),%eax
sub    -0x14(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x40(%rbp),%xmm1
cvtsi2sdl 0x10(%rbp),%xmm3
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm3,%xmm1
movsd  0xce4(%rip),%xmm3
addsd  %xmm3,%xmm1
mulsd  %xmm1,%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x8(%rbp),%eax
mov    -0x18(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
imul   -0xc(%rbp),%eax
add    -0x4(%rbp),%eax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
mov    %eax,-0x34(%rbp)
mov    0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x40(%rbp),%xmm1
cvtsi2sdl 0x10(%rbp),%xmm3
mulsd  %xmm3,%xmm1
movsd  0xc85(%rip),%xmm3
addsd  %xmm3,%xmm1
mulsd  %xmm1,%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_face_2d_quickest_a>:
movslq 0x10(%rsp),%rcx
mov    0x20(%rsp),%r10
mulsd  %xmm1,%xmm0
xorpd  %xmm2,%xmm2
movapd %xmm0,%xmm1
cmpltsd %xmm2,%xmm1
movsd  0xedc(%rip),%xmm8
movapd %xmm1,%xmm4
andpd  %xmm8,%xmm4
movsd  0xed3(%rip),%xmm3
andnpd %xmm3,%xmm1
orpd   %xmm4,%xmm1
movapd %xmm0,%xmm5
mulsd  %xmm0,%xmm5
movapd %xmm3,%xmm4
subsd  %xmm5,%xmm4
mulsd  0xebb(%rip),%xmm4
movsd  0xebb(%rip),%xmm6
mulsd  %xmm6,%xmm0
cvtsi2sdl 0x8(%rsp),%xmm9
mulsd  %xmm9,%xmm0
movapd %xmm0,%xmm7
addsd  %xmm6,%xmm7
movsd  0xea3(%rip),%xmm5
mulsd  %xmm1,%xmm5
mulsd  %xmm9,%xmm5
movapd %xmm5,%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm4,%xmm2
addsd  %xmm7,%xmm2
mulsd  (%r10,%rcx,8),%xmm2
lea    (%r9,%rsi,1),%ecx
imul   %edx,%ecx
add    %r8d,%ecx
add    %edi,%ecx
movslq %ecx,%rax
subsd  %xmm0,%xmm6
subsd  %xmm5,%xmm3
mulsd  %xmm4,%xmm3
addsd  %xmm6,%xmm3
mulsd  (%r10,%rax,8),%xmm3
mov    0x18(%rsp),%r11
addsd  %xmm2,%xmm3
lea    (%rsi,%r9,2),%eax
sub    %r9d,%esi
imul   %edx,%esi
lea    (%rdi,%r8,2),%ecx
sub    %r8d,%edi
add    %esi,%edi
movslq %edi,%rsi
mulsd  %xmm9,%xmm1
movapd %xmm8,%xmm0
subsd  %xmm1,%xmm0
mulsd  %xmm4,%xmm0
mulsd  (%r10,%rsi,8),%xmm0
addsd  %xmm3,%xmm0
imul   %edx,%eax
add    %eax,%ecx
movslq %ecx,%rax
addsd  %xmm8,%xmm1
mulsd  %xmm4,%xmm1
mulsd  (%r10,%rax,8),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%r11)
ret

LLVM IR (-O0):
define void @get_face_2d_quickest_a(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, double %8, double %9, double %10, double* %11, double* %12) {
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca double
%23 = alloca double
%24 = alloca double
%25 = alloca double*
%26 = alloca double*
%27 = alloca i32
%28 = alloca double
%29 = alloca double
%30 = alloca double
%31 = alloca double
store i32 %0, i32* %14
store i32 %1, i32* %15
store i32 %2, i32* %16
store i32 %3, i32* %17
store i32 %4, i32* %18
store i32 %5, i32* %19
store i32 %6, i32* %20
store i32 %7, i32* %21
store double %8, double* %22
store double %9, double* %23
store double %10, double* %24
store double* %11, double** %25
store double* %12, double** %26
store double 1.000000e+00, double* %28
%32 = load double, double* %23
%33 = load double, double* %22
%34 = fmul double %32, %33
%35 = fmul double %34, 1.000000e+00
store double %35, double* %29
%36 = load double, double* %29
%37 = fcmp olt double %36, 0.000000e+00
br i1 %37, label %38, label %39
38: ; preds = %13
store double -1.000000e+00, double* %28
br label %39
39: ; preds = %38, %13
%40 = load double, double* %29
%41 = load double, double* %29
%42 = fneg double %40
%43 = call double @llvm.fmuladd.f64(double %42, double %41, double 1.000000e+00)
%44 = fmul double %43, 0x3FB5555555555555
store double %44, double* %30
%45 = load double*, double** %26
%46 = load i32, i32* %21
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds double, double* %45, i64 %47
%49 = load double, double* %48
%50 = load double, double* %29
%51 = fmul double 5.000000e-01, %50
%52 = load i32, i32* %20
%53 = sitofp i32 %52 to double
%54 = call double @llvm.fmuladd.f64(double %51, double %53, double 5.000000e-01)
%55 = load double, double* %30
%56 = load double, double* %28
%57 = fmul double 3.000000e+00, %56
%58 = load i32, i32* %20
%59 = sitofp i32 %58 to double
%60 = call double @llvm.fmuladd.f64(double %57, double %59, double 1.000000e+00)
%61 = call double @llvm.fmuladd.f64(double %55, double %60, double %54)
%62 = fmul double %49, %61
store double %62, double* %31
%63 = load i32, i32* %15
%64 = load i32, i32* %19
%65 = add nsw i32 %63, %64
%66 = load i32, i32* %16
%67 = mul nsw i32 %65, %66
%68 = load i32, i32* %14
%69 = add nsw i32 %67, %68
%70 = load i32, i32* %18
%71 = add nsw i32 %69, %70
store i32 %71, i32* %27
%72 = load double*, double** %26
%73 = load i32, i32* %27
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds double, double* %72, i64 %74
%76 = load double, double* %75
%77 = load double, double* %29
%78 = fmul double 5.000000e-01, %77
%79 = load i32, i32* %20
%80 = sitofp i32 %79 to double
%81 = fneg double %78
%82 = call double @llvm.fmuladd.f64(double %81, double %80, double 5.000000e-01)
%83 = load double, double* %30
%84 = load double, double* %28
%85 = fmul double 3.000000e+00, %84
%86 = load i32, i32* %20
%87 = sitofp i32 %86 to double
%88 = fneg double %85
%89 = call double @llvm.fmuladd.f64(double %88, double %87, double 1.000000e+00)
%90 = call double @llvm.fmuladd.f64(double %83, double %89, double %82)
%91 = load double, double* %31
%92 = call double @llvm.fmuladd.f64(double %76, double %90, double %91)
store double %92, double* %31
%93 = load i32, i32* %15
%94 = load i32, i32* %19
%95 = sub nsw i32 %93, %94
%96 = load i32, i32* %16
%97 = mul nsw i32 %95, %96
%98 = load i32, i32* %14
%99 = add nsw i32 %97, %98
%100 = load i32, i32* %18
%101 = sub nsw i32 %99, %100
store i32 %101, i32* %27
%102 = load double*, double** %26
%103 = load i32, i32* %27
%104 = sext i32 %103 to i64
%105 = getelementptr inbounds double, double* %102, i64 %104
%106 = load double, double* %105
%107 = load double, double* %30
%108 = load double, double* %28
%109 = load i32, i32* %20
%110 = sitofp i32 %109 to double
%111 = fneg double %108
%112 = call double @llvm.fmuladd.f64(double %111, double %110, double -1.000000e+00)
%113 = fmul double %107, %112
%114 = load double, double* %31
%115 = call double @llvm.fmuladd.f64(double %106, double %113, double %114)
store double %115, double* %31
%116 = load i32, i32* %15
%117 = load i32, i32* %19
%118 = mul nsw i32 2, %117
%119 = add nsw i32 %116, %118
%120 = load i32, i32* %16
%121 = mul nsw i32 %119, %120
%122 = load i32, i32* %14
%123 = add nsw i32 %121, %122
%124 = load i32, i32* %18
%125 = mul nsw i32 2, %124
%126 = add nsw i32 %123, %125
store i32 %126, i32* %27
%127 = load double*, double** %26
%128 = load i32, i32* %27
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds double, double* %127, i64 %129
%131 = load double, double* %130
%132 = load double, double* %30
%133 = load double, double* %28
%134 = load i32, i32* %20
%135 = sitofp i32 %134 to double
%136 = call double @llvm.fmuladd.f64(double %133, double %135, double -1.000000e+00)
%137 = fmul double %132, %136
%138 = load double, double* %31
%139 = call double @llvm.fmuladd.f64(double %131, double %137, double %138)
store double %139, double* %31
%140 = load double, double* %31
%141 = load double*, double** %25
store double %140, double* %141
ret void
}

LLVM IR (-O2):
define void @get_face_2d_quickest_a(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, double %8, double %9, double %10, double* nocapture writeonly %11, double* nocapture %12) {
%14 = fmul double %8, %9
%15 = fcmp olt double %14, 0.000000e+00
%16 = select i1 %15, double -1.000000e+00, double 1.000000e+00
%17 = fneg double %14
%18 = tail call double @llvm.fmuladd.f64(double %17, double %14, double 1.000000e+00)
%19 = fmul double %18, 0x3FB5555555555555
%20 = sext i32 %7 to i64
%21 = getelementptr inbounds double, double* %12, i64 %20
%22 = load double, double* %21
%23 = fmul double %14, 5.000000e-01
%24 = sitofp i32 %6 to double
%25 = tail call double @llvm.fmuladd.f64(double %23, double %24, double 5.000000e-01)
%26 = fmul double %16, 3.000000e+00
%27 = tail call double @llvm.fmuladd.f64(double %26, double %24, double 1.000000e+00)
%28 = tail call double @llvm.fmuladd.f64(double %19, double %27, double %25)
%29 = fmul double %28, %22
%30 = add nsw i32 %5, %1
%31 = mul nsw i32 %30, %2
%32 = add i32 %4, %0
%33 = add i32 %32, %31
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds double, double* %12, i64 %34
%36 = load double, double* %35
%37 = fneg double %23
%38 = tail call double @llvm.fmuladd.f64(double %37, double %24, double 5.000000e-01)
%39 = fneg double %26
%40 = tail call double @llvm.fmuladd.f64(double %39, double %24, double 1.000000e+00)
%41 = tail call double @llvm.fmuladd.f64(double %19, double %40, double %38)
%42 = tail call double @llvm.fmuladd.f64(double %36, double %41, double %29)
%43 = sub nsw i32 %1, %5
%44 = mul nsw i32 %43, %2
%45 = sub i32 %0, %4
%46 = add i32 %45, %44
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds double, double* %12, i64 %47
%49 = load double, double* %48
%50 = fneg double %16
%51 = tail call double @llvm.fmuladd.f64(double %50, double %24, double -1.000000e+00)
%52 = fmul double %19, %51
%53 = tail call double @llvm.fmuladd.f64(double %49, double %52, double %42)
%54 = shl nsw i32 %5, 1
%55 = add nsw i32 %54, %1
%56 = mul nsw i32 %55, %2
%57 = shl nsw i32 %4, 1
%58 = add i32 %57, %0
%59 = add i32 %58, %56
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds double, double* %12, i64 %60
%62 = load double, double* %61
%63 = tail call double @llvm.fmuladd.f64(double %16, double %24, double -1.000000e+00)
%64 = fmul double %19, %63
%65 = tail call double @llvm.fmuladd.f64(double %62, double %64, double %53)
store double %65, double* %11
ret void
}