user: 下面的汇编指令对应的C源代码是什么：

```asm
<calculate_E_discriminative_contributions_multi>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %r9,%r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  sub    $0x48,%rsp
  cmpl   $0x1,0x130(%rsp)
  mov    0xb8(%rsp),%r14
  mov    0xe8(%rsp),%r15d
  jne    L149
  mov    0xa8(%rsp),%rax
  mov    0xf8(%rsp),%r15d
  mov    %rcx,%rbp
  mov    0xc8(%rsp),%r14
  mov    0x88(%rsp),%r12
  mov    %rax,0x98(%rsp)
L149:
  mov    0xd8(%rsp),%eax
  sub    $0x1,%eax
  mov    %eax,0x3c(%rsp)
  cmp    $0x1,%eax
  jle    L82
  mov    $0x1,%ebx
  test   %r15d,%r15d
  jle    L106
  xchg   %ax,%ax
L227:
  xor    %r13d,%r13d
  nopl   0x0(%rax,%rax,1)
L183:
  mov    %r13d,%esi
  mov    %r15d,%edx
  mov    %ebx,%edi
  add    $0x1,%r13d
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  fldt   (%r14,%rax,1)
  fstpt  0x0(%rbp,%rax,1)
  cmp    %r13d,%r15d
  jne    L183
  add    $0x1,%ebx
  cmp    0x3c(%rsp),%ebx
  jne    L227
L106:
  mov    $0x1,%ebx
  nopw   0x0(%rax,%rax,1)
L85:
  test   %r15d,%r15d
  jle    L66
  fldz
  xor    %r13d,%r13d
  xchg   %ax,%ax
L200:
  mov    %r13d,%esi
  mov    %r15d,%edx
  mov    %ebx,%edi
  fstpt  (%rsp)
  call   <get_mtx_index@plt>
  mov    0x98(%rsp),%rcx
  mov    %r13d,%r9d
  add    $0x1,%r13d
  cltq
  shl    $0x4,%rax
  fldt   (%rcx,%rax,1)
  fldt   (%rsp)
  faddp  %st,%st(1)
  cmp    %r13d,%r15d
  jne    L200
  fldz
  fxch   %st(1)
  fcomip %st(1),%st
  fstp   %st(0)
  ja     L9
L112:
  fldz
  xor    %ecx,%ecx
  nopl   0x0(%rax)
L297:
  mov    %ecx,%esi
  mov    %r15d,%edx
  mov    %ebx,%edi
  fstpt  0x10(%rsp)
  mov    %ecx,(%rsp)
  call   <get_mtx_index@plt>
  mov    (%rsp),%ecx
  cltq
  shl    $0x4,%rax
  add    $0x1,%ecx
  fldt   (%r12,%rax,1)
  fldt   0x10(%rsp)
  faddp  %st,%st(1)
  cmp    %ecx,%r15d
  jg     L297
  fldz
  fxch   %st(1)
  fcomip %st(1),%st
  fstp   %st(0)
  ja     L144
L66:
  add    $0x1,%ebx
  cmp    0x3c(%rsp),%ebx
  jne    L85
  fld1
  pxor   %xmm0,%xmm0
  mov    $0x1,%r13d
  fstpt  0x10(%rsp)
  movss  %xmm0,(%rsp)
  cs nopw 0x0(%rax,%rax,1)
L67:
  xor    %ebx,%ebx
  test   %r15d,%r15d
  jle    L130
  nopw   0x0(%rax,%rax,1)
L164:
  mov    %r15d,%edx
  mov    %ebx,%esi
  mov    %r13d,%edi
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  fldt   0x0(%rbp,%rax,1)
  fld1
  fsub   %st(1),%st
  fxch   %st(1)
  fcomi  %st(1),%st
  fxch   %st(1)
  fcmovbe %st(1),%st
  fldz
  fxch   %st(2)
  fucomip %st(2),%st
  fstp   %st(1)
  jp     L254
  je     L242
L254:
  mov    0x98(%rsp),%rcx
  fldt   (%rcx,%rax,1)
  fldt   (%r12,%rax,1)
  fsubrp %st,%st(1)
  fdivp  %st,%st(1)
  fldt   0x10(%rsp)
  fxch   %st(1)
  fucomi %st(1),%st
  fcmovbe %st(1),%st
  fstp   %st(1)
  fstpt  0x10(%rsp)
  jmp    L236
  nopl   0x0(%rax)
L242:
  fstp   %st(0)
L236:
  add    $0x1,%ebx
  cmp    %ebx,%r15d
  jne    L164
L130:
  add    $0x1,%r13d
  cmp    0x3c(%rsp),%r13d
  jne    L67
  fldt   0x10(%rsp)
  fmuls  0xcd9(%rip)        # 2000 <_fini+0xb48>
  fstpt  0x20(%rsp)
  test   %r15d,%r15d
  jle    L179
  mov    0x100(%rsp),%rax
  pxor   %xmm1,%xmm1
  mov    $0x1,%r13d
  movss  %xmm1,(%rsp)
  lea    0x10(%rax),%rbx
  nop
L171:
  xor    %esi,%esi
  nopw   0x0(%rax,%rax,1)
L12:
  mov    %r15d,%edx
  mov    %r13d,%edi
  mov    %esi,0x10(%rsp)
  call   <get_mtx_index@plt>
  mov    0x98(%rsp),%rdi
  mov    0x10(%rsp),%esi
  cltq
  shl    $0x4,%rax
  fldt   (%r12,%rax,1)
  lea    0x0(%rbp,%rax,1),%rdx
  fldt   (%rdi,%rax,1)
  fsubrp %st,%st(1)
  fldt   (%rbx)
  fldt   0x20(%rsp)
  fmulp  %st,%st(1)
  fdivrp %st,%st(1)
  fldt   (%rdx)
  faddp  %st,%st(1)
  fldz
  fucomi %st(1),%st
  fcmovbe %st(1),%st
  fstp   %st(1)
  add    $0x1,%esi
  fstpt  (%rdx)
  cmp    %esi,%r15d
  jne    L12
  add    $0x1,%r13d
  add    $0x10,%rbx
  cmp    0x3c(%rsp),%r13d
  jne    L171
L179:
  mov    $0x1,%ebx
  nopl   0x0(%rax,%rax,1)
L136:
  test   %r15d,%r15d
  jle    L299
  fldz
  xor    %ebp,%ebp
  fstpt  (%rsp)
  nopl   0x0(%rax)
L77:
  mov    %ebp,%esi
  mov    %r15d,%edx
  mov    %ebx,%edi
  mov    %ebp,%r12d
  call   <get_mtx_index@plt>
  add    $0x1,%ebp
  cltq
  shl    $0x4,%rax
  fldt   (%r14,%rax,1)
  fldt   (%rsp)
  faddp  %st,%st(1)
  fstpt  (%rsp)
  cmp    %ebp,%r15d
  jne    L77
  fldz
  fldt   (%rsp)
  fucomip %st(1),%st
  fstp   %st(0)
  jp     L156
  jne    L156
L299:
  add    $0x1,%ebx
  cmp    0x3c(%rsp),%ebx
  jne    L136
L82:
  add    $0x48,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L9:
  xor    %esi,%esi
  nopw   0x0(%rax,%rax,1)
L3:
  mov    %r13d,%edx
  mov    %ebx,%edi
  mov    %r9d,0x10(%rsp)
  mov    %esi,(%rsp)
  call   <get_mtx_index@plt>
  mov    (%rsp),%esi
  mov    0x10(%rsp),%r9d
  mov    %esi,%eax
  add    $0x1,%esi
  cmp    %r9d,%eax
  jne    L3
  jmp    L112
  nopl   0x0(%rax)
L144:
  xor    %ecx,%ecx
  nopw   0x0(%rax,%rax,1)
L93:
  mov    %ecx,%esi
  mov    %r15d,%edx
  mov    %ebx,%edi
  mov    %ecx,(%rsp)
  call   <get_mtx_index@plt>
  mov    (%rsp),%ecx
  add    $0x1,%ecx
  cmp    %ecx,%r15d
  jg     L93
  jmp    L66
  nop
L156:
  xor    %r13d,%r13d
  nopl   0x0(%rax,%rax,1)
L45:
  mov    %r13d,%esi
  mov    %ebp,%edx
  mov    %ebx,%edi
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  add    %r14,%rax
  fldt   (%rax)
  fldt   (%rsp)
  fdivrp %st,%st(1)
  fstpt  (%rax)
  mov    %r13d,%eax
  add    $0x1,%r13d
  cmp    %r12d,%eax
  jne    L45
  jmp    L299
```

assistant: ```c
void calculate_E_discriminative_contributions_multi(long double *E, long double *E_2, long double *E_3, long double *E_4, long double *E_num, long double *E_num_2, long double *E_num_3, long double *E_num_4, long double *E_den, long double *E_den_2, long double *E_den_3, long double *E_den_4, long double *emissions, long double *emissions_2, long double *emissions_3, long double *emissions_4, long double *transitions, int nr_v, int a_size, int a_size_2, int a_size_3, int a_size_4, long double *emiss_prior_scalers, long double *emiss_prior_scalers_2, long double *emiss_prior_scalers_3, long double *emiss_prior_scalers_4, int rd, int nr_alphabets, int opt_alpha) {
  int v, w;
  int a;
  int x, y, y_2, y_3, y_4;
  long double rowsum, dist_tot;
  long double E_divider, E_divider_2, E_divider_3, E_divider_4, max_T_den;
  long double max_E_den, max_E_den_2, max_E_den_3, max_E_den_4;
  long double E_limiter, E_limiter_2, E_limiter_3, E_limiter_4, T_limiter;
  static long double DIVIDER_SCALER = 10.0;
  long double *E_cur, *E_cur_num, *E_cur_den, *emissions_cur;
  int a_size_cur;
  if (opt_alpha == 1) {
    E_cur = E;
    E_cur_num = E_num;
    E_cur_den = E_den;
    emissions_cur = emissions;
    a_size_cur = a_size;
  }
  if (opt_alpha == 2) {
    E_cur = E_2;
    E_cur_num = E_num_2;
    E_cur_den = E_den_2;
    emissions_cur = emissions_2;
    a_size_cur = a_size_2;
  }
  if (opt_alpha == 1) {
    E_cur = E_3;
    E_cur_num = E_num_3;
    E_cur_den = E_den_3;
    emissions_cur = emissions_3;
    a_size_cur = a_size_3;
  }
  if (opt_alpha == 1) {
    E_cur = E_4;
    E_cur_num = E_num_4;
    E_cur_den = E_den_4;
    emissions_cur = emissions_4;
    a_size_cur = a_size_4;
  }
  for (v = 1; v < nr_v - 1; v++) {
    for (a = 0; a < a_size_cur; a++) {
      y = get_mtx_index(v, a, a_size_cur);
      *(E_cur + y) = *(emissions_cur + y);
    }
  }
  for (v = 1; v < nr_v - 1; v++) {
    dist_tot = 0.0;
    for (a = 0; a < a_size_cur; a++) {
      y = get_mtx_index(v, a, a_size_cur);
      dist_tot += *(E_cur_den + y);
    }
    if (dist_tot > 0.0) {
      for (a = 0; a < a_size_cur; a++) {
        y = get_mtx_index(v, a, a_size_cur);
      }
    }
    dist_tot = 0.0;
    for (a = 0; a < a_size_cur; a++) {
      y = get_mtx_index(v, a, a_size_cur);
      dist_tot += *(E_cur_num + y);
    }
    if (dist_tot > 0.0) {
      for (a = 0; a < a_size_cur; a++) {
        y = get_mtx_index(v, a, a_size_cur);
      }
    }
  }
  E_divider = 1.0;
  for (v = 1; v < nr_v - 1; v++) {
    for (a = 0; a < a_size_cur; a++) {
      y = get_mtx_index(v, a, a_size_cur);
      E_limiter = *(E_cur + y);
      if (*(E_cur + y) > (1.0 - *(E_cur + y))) {
        E_limiter = 1.0 - *(E_cur + y);
      }
      if (*(E_cur + y) != 0.0 && (*(E_cur_den + y) - *(E_cur_num + y)) / E_limiter > E_divider) {
        E_divider = (*(E_cur_den + y) - *(E_cur_num + y)) / E_limiter;
      }
    }
  }
  E_divider = E_divider * DIVIDER_SCALER;
  for (v = 1; v < nr_v - 1; v++) {
    for (a = 0; a < a_size_cur; a++) {
      y = get_mtx_index(v, a, a_size_cur);
      *(E_cur + y) += (*(E_cur_num + y) - *(E_cur_den + y)) / (E_divider * *(emiss_prior_scalers + v));
      if (*(E_cur + y) < 0.0) {
        *(E_cur + y) = 0.0;
      }
    }
  }
  for (v = 1; v < nr_v - 1; v++) {
    rowsum = 0.0;
    for (a = 0; a < a_size_cur; a++) {
      y = get_mtx_index(v, a, a_size_cur);
      rowsum += *(emissions_cur + y);
    }
    if (rowsum != 0.0) {
      for (a = 0; a < a_size_cur; a++) {
        y = get_mtx_index(v, a, a_size_cur);
        *(emissions_cur + y) = *(emissions_cur + y) / rowsum;
      }
    }
  }
}
```