void write_fv(int iX, int iY, int nX, int nY, int X_nbr, int Y_nbr,
              int fv_offset, int fid, double *u_face, double *sc_fv,
              double *sc_face, double *sc_face_grad, double alpha,
              double out_min, double out_max, int *out) {
  if (out[fid]) {
    sc_face[fid] = (((sc_face[fid]) < (out_max)) ? (sc_face[fid]) : (out_max));
    sc_face[fid] = (((sc_face[fid]) > (out_min)) ? (sc_face[fid]) : (out_min));
    *(sc_fv + (iY + (Y_nbr)) * nX + iX + (X_nbr) + nX * nY * (fv_offset)) =
        1. * alpha * sc_face_grad[fid] - sc_face[fid] * u_face[fid];
  }
}


x86 assembly (clang, -O0):
<write_fv>:
push   %rbp
mov    %rsp,%rbp
mov    0x40(%rbp),%rax
mov    0x38(%rbp),%rax
mov    0x30(%rbp),%rax
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)
mov    0x40(%rbp),%rax
movslq 0x18(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     1281 <write_fv+0x181>
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x30(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1186 <write_fv+0x86>
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    1190 <write_fv+0x90>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x28(%rbp),%xmm0
jbe    11d1 <write_fv+0xd1>
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    11db <write_fv+0xdb>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  0xe0b(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
mov    0x38(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    0x20(%rbp),%rax
movslq 0x18(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    0x28(%rbp),%rax
mov    -0x8(%rbp),%ecx
add    -0x18(%rbp),%ecx
imul   -0xc(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x4(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    -0xc(%rbp),%ecx
imul   -0x10(%rbp),%ecx
imul   0x10(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
pop    %rbp
ret

x86 assembly (clang, -O2):
<write_fv>:
push   %r14
push   %rbx
movslq 0x20(%rsp),%r10
mov    0x48(%rsp),%rax
cmpl   $0x0,(%rax,%r10,4)
je     117a <write_fv+0x7a>
mov    0x40(%rsp),%r11
mov    0x38(%rsp),%rax
mov    0x30(%rsp),%r14
mov    0x28(%rsp),%rbx
movsd  (%rax,%r10,8),%xmm3
minsd  %xmm2,%xmm3
maxsd  %xmm1,%xmm3
movsd  %xmm3,(%rax,%r10,8)
mulsd  (%rbx,%r10,8),%xmm3
mov    0x18(%rsp),%eax
mulsd  (%r11,%r10,8),%xmm0
subsd  %xmm3,%xmm0
add    %esi,%r9d
imul   %edx,%r9d
movslq %r9d,%rsi
lea    (%r14,%rsi,8),%rsi
movslq %edi,%rdi
lea    (%rsi,%rdi,8),%rsi
movslq %r8d,%rdi
lea    (%rsi,%rdi,8),%rsi
imul   %edx,%ecx
imul   %eax,%ecx
movslq %ecx,%rax
movsd  %xmm0,(%rsi,%rax,8)
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define void @write_fv(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, double* nocapture %8, double* nocapture writeonly %9, double* nocapture %10, double* nocapture %11, double %12, double %13, double %14, i32* nocapture %15) {
%17 = sext i32 %7 to i64
%18 = getelementptr inbounds i32, i32* %15, i64 %17
%19 = load i32, i32* %18
%20 = icmp eq i32 %19, 0
br i1 %20, label %47, label %21
21: ; preds = %16
%22 = getelementptr inbounds double, double* %10, i64 %17
%23 = load double, double* %22
%24 = fcmp olt double %23, %14
%25 = select i1 %24, double %23, double %14
%26 = fcmp ogt double %25, %13
%27 = select i1 %26, double %25, double %13
store double %27, double* %22
%28 = getelementptr inbounds double, double* %11, i64 %17
%29 = load double, double* %28
%30 = getelementptr inbounds double, double* %8, i64 %17
%31 = load double, double* %30
%32 = fneg double %27
%33 = fmul double %31, %32
%34 = tail call double @llvm.fmuladd.f64(double %12, double %29, double %33)
%35 = add nsw i32 %5, %1
%36 = mul nsw i32 %35, %2
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds double, double* %9, i64 %37
%39 = sext i32 %0 to i64
%40 = getelementptr inbounds double, double* %38, i64 %39
%41 = sext i32 %4 to i64
%42 = getelementptr inbounds double, double* %40, i64 %41
%43 = mul nsw i32 %3, %2
%44 = mul nsw i32 %43, %6
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds double, double* %42, i64 %45
store double %34, double* %46
br label %47
47: ; preds = %21, %16
ret void
}