void est_a_dev(float *a_d, float *alpha_d, float *beta_d, float *xi_sum_d,
               float *gamma_sum_d, float sum_ab, int nstates, int length) {
  int i, j;
  for (i = 0; i < nstates; ++i) {
    for (j = 0; j < nstates; ++j) {
      a_d[(j * nstates) + i] =
          xi_sum_d[(j * nstates) + i] /
          (gamma_sum_d[j] -
           alpha_d[(j * nstates) + i] * beta_d[(j * nstates) + i] / sum_ab);
    }
  }
}


x86 assembly (clang, -O0):
<est_a_dev>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
movss  %xmm0,-0x2c(%rbp)
mov    %r9d,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    11dd <est_a_dev+0xdd>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    11ca <est_a_dev+0xca>
mov    -0x20(%rbp),%rax
mov    -0x38(%rbp),%ecx
imul   -0x30(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
imul   -0x30(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
imul   -0x30(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
mulss  (%rax,%rcx,4),%xmm2
divss  -0x2c(%rbp),%xmm2
subss  %xmm2,%xmm1
divss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%ecx
imul   -0x30(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    113e <est_a_dev+0x3e>
jmp    11cf <est_a_dev+0xcf>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    112b <est_a_dev+0x2b>
pop    %rbp
ret

x86 assembly (clang, -O2):
<est_a_dev>:
test   %r9d,%r9d
jle    116b <est_a_dev+0x6b>
mov    %r9d,%r10d
xor    %r9d,%r9d
nopl   0x0(%rax,%rax,1)
xor    %eax,%eax
xor    %r11d,%r11d
cs nopw 0x0(%rax,%rax,1)
nop
movss  (%rcx,%rax,4),%xmm1
movss  (%rsi,%rax,4),%xmm2
mulss  (%rdx,%rax,4),%xmm2
movss  (%r8,%r11,4),%xmm3
divss  %xmm0,%xmm2
subss  %xmm2,%xmm3
divss  %xmm3,%xmm1
movss  %xmm1,(%rdi,%rax,4)
add    $0x1,%r11
add    %r10,%rax
cmp    %r11,%r10
jne    1120 <est_a_dev+0x20>
add    $0x1,%r9
add    $0x4,%rcx
add    $0x4,%rsi
add    $0x4,%rdx
add    $0x4,%rdi
cmp    %r10,%r9
jne    1110 <est_a_dev+0x10>
ret

LLVM IR (-O0):
define void @est_a_dev(float* %0, float* %1, float* %2, float* %3, float* %4, float %5, i32 %6, i32 %7) {
%9 = alloca float*
%10 = alloca float*
%11 = alloca float*
%12 = alloca float*
%13 = alloca float*
%14 = alloca float
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
store float* %0, float** %9
store float* %1, float** %10
store float* %2, float** %11
store float* %3, float** %12
store float* %4, float** %13
store float %5, float* %14
store i32 %6, i32* %15
store i32 %7, i32* %16
store i32 0, i32* %17
br label %19
19: ; preds = %78, %8
%20 = load i32, i32* %17
%21 = load i32, i32* %15
%22 = icmp slt i32 %20, %21
br i1 %22, label %23, label %81
23: ; preds = %19
store i32 0, i32* %18
br label %24
24: ; preds = %74, %23
%25 = load i32, i32* %18
%26 = load i32, i32* %15
%27 = icmp slt i32 %25, %26
br i1 %27, label %28, label %77
28: ; preds = %24
%29 = load float*, float** %12
%30 = load i32, i32* %18
%31 = load i32, i32* %15
%32 = mul nsw i32 %30, %31
%33 = load i32, i32* %17
%34 = add nsw i32 %32, %33
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds float, float* %29, i64 %35
%37 = load float, float* %36
%38 = load float*, float** %13
%39 = load i32, i32* %18
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds float, float* %38, i64 %40
%42 = load float, float* %41
%43 = load float*, float** %10
%44 = load i32, i32* %18
%45 = load i32, i32* %15
%46 = mul nsw i32 %44, %45
%47 = load i32, i32* %17
%48 = add nsw i32 %46, %47
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds float, float* %43, i64 %49
%51 = load float, float* %50
%52 = load float*, float** %11
%53 = load i32, i32* %18
%54 = load i32, i32* %15
%55 = mul nsw i32 %53, %54
%56 = load i32, i32* %17
%57 = add nsw i32 %55, %56
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds float, float* %52, i64 %58
%60 = load float, float* %59
%61 = fmul float %51, %60
%62 = load float, float* %14
%63 = fdiv float %61, %62
%64 = fsub float %42, %63
%65 = fdiv float %37, %64
%66 = load float*, float** %9
%67 = load i32, i32* %18
%68 = load i32, i32* %15
%69 = mul nsw i32 %67, %68
%70 = load i32, i32* %17
%71 = add nsw i32 %69, %70
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds float, float* %66, i64 %72
store float %65, float* %73
br label %74
74: ; preds = %28
%75 = load i32, i32* %18
%76 = add nsw i32 %75, 1
store i32 %76, i32* %18
br label %24
77: ; preds = %24
br label %78
78: ; preds = %77
%79 = load i32, i32* %17
%80 = add nsw i32 %79, 1
store i32 %80, i32* %17
br label %19
81: ; preds = %19
ret void
}

LLVM IR (-O2):
define void @est_a_dev(float* nocapture writeonly %0, float* nocapture %1, float* nocapture %2, float* nocapture %3, float* nocapture %4, float %5, i32 %6, i32 %7) {
%9 = icmp sgt i32 %6, 0
br i1 %9, label %10, label %37
10: ; preds = %8
%11 = zext i32 %6 to i64
%12 = zext i32 %6 to i64
br label %13
13: ; preds = %34, %10
%14 = phi i64 [ 0, %10 ], [ %35, %34 ]
br label %15
15: ; preds = %13, %15
%16 = phi i64 [ 0, %13 ], [ %32, %15 ]
%17 = mul nsw i64 %16, %11
%18 = add nuw nsw i64 %17, %14
%19 = getelementptr inbounds float, float* %3, i64 %18
%20 = load float, float* %19
%21 = getelementptr inbounds float, float* %4, i64 %16
%22 = load float, float* %21
%23 = getelementptr inbounds float, float* %1, i64 %18
%24 = load float, float* %23
%25 = getelementptr inbounds float, float* %2, i64 %18
%26 = load float, float* %25
%27 = fmul float %24, %26
%28 = fdiv float %27, %5
%29 = fsub float %22, %28
%30 = fdiv float %20, %29
%31 = getelementptr inbounds float, float* %0, i64 %18
store float %30, float* %31
%32 = add nuw nsw i64 %16, 1
%33 = icmp eq i64 %32, %12
br i1 %33, label %34, label %15
34: ; preds = %15
%35 = add nuw nsw i64 %14, 1
%36 = icmp eq i64 %35, %12
br i1 %36, label %37, label %13
37: ; preds = %34, %8
ret void
}