user: What would the C source look like for the assembly code provided here:

```asm
<_tram_update_biased_conf_energies>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %edx,-0x44(%rbp)
  mov    %rcx,-0x50(%rbp)
  mov    %r8d,-0x48(%rbp)
  mov    %r9d,-0x54(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L171
L117:
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x1c(%rbp)
  cmpl   $0x0,-0x1c(%rbp)
  js     L96
  movl   $0x0,-0x20(%rbp)
  movl   $0x0,-0x28(%rbp)
  jmp    L5
L12:
  mov    -0x28(%rbp),%eax
  cmp    -0x48(%rbp),%eax
  setl   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x28(%rbp),%eax
  not    %eax
  shr    $0x1f,%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x28(%rbp),%eax
  imul   -0x54(%rbp),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  D2(%rip),%xmm1
  pxor   %xmm2,%xmm2
  divsd  %xmm2,%xmm1
  movq   D42(%rip),%xmm2
  xorpd  %xmm2,%xmm1
  ucomisd %xmm1,%xmm0
  jp     L87
  ucomisd %xmm1,%xmm0
  je     L28
L87:
  mov    -0x28(%rbp),%eax
  imul   -0x54(%rbp),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x24(%rbp),%eax
  imul   -0x48(%rbp),%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x20(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x20(%rbp)
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x10(%rbp),%rax
  add    %rdx,%rax
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  jmp    L189
L28:
  nop
L189:
  addl   $0x1,-0x28(%rbp)
L5:
  mov    -0x28(%rbp),%eax
  cmp    -0x48(%rbp),%eax
  jl     L12
  mov    -0x20(%rbp),%eax
  mov    %eax,%esi
  mov    0x10(%rbp),%rdi
  call   <_logsumexp_sort_kahan_inplace@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x8(%rbp)
  movl   $0x0,-0x28(%rbp)
  jmp    L159
L172:
  mov    -0x24(%rbp),%eax
  imul   -0x48(%rbp),%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  addsd  -0x8(%rbp),%xmm0
  movq   D42(%rip),%xmm1
  movapd %xmm0,%xmm2
  xorpd  %xmm1,%xmm2
  mov    -0x28(%rbp),%eax
  imul   -0x54(%rbp),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x18(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movq   D42(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movapd %xmm2,%xmm1
  movq   %rax,%xmm0
  call   <_logsumexp_pair@plt>
  movq   %xmm0,%rax
  mov    -0x28(%rbp),%edx
  mov    %edx,%ecx
  imul   -0x54(%rbp),%ecx
  mov    -0x1c(%rbp),%edx
  add    %ecx,%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    0x18(%rbp),%rdx
  add    %rcx,%rdx
  movq   D42(%rip),%xmm0
  movq   %rax,%xmm3
  xorpd  %xmm0,%xmm3
  movapd %xmm3,%xmm0
  movsd  %xmm0,(%rdx)
  addl   $0x1,-0x28(%rbp)
L159:
  mov    -0x28(%rbp),%eax
  cmp    -0x48(%rbp),%eax
  jl     L172
  jmp    L140
L96:
  nop
L140:
  addl   $0x1,-0x24(%rbp)
L171:
  mov    -0x24(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jl     L117
  cmpl   $0x0,0x20(%rbp)
  je     L49
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L165
L26:
  movl   $0x0,-0x20(%rbp)
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x1c(%rbp)
  cmpl   $0x0,-0x1c(%rbp)
  js     L25
  movl   $0x0,-0x28(%rbp)
  jmp    L183
L157:
  mov    -0x28(%rbp),%eax
  imul   -0x54(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  jbe    L128
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x24(%rbp),%eax
  imul   -0x48(%rbp),%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x20(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x20(%rbp)
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    0x10(%rbp),%rax
  add    %rdx,%rax
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
L128:
  addl   $0x1,-0x28(%rbp)
L183:
  mov    -0x28(%rbp),%eax
  cmp    -0x48(%rbp),%eax
  jl     L157
  mov    -0x20(%rbp),%eax
  mov    %eax,%esi
  mov    0x10(%rbp),%rdi
  call   <_logsumexp_sort_kahan_inplace@plt>
  movapd %xmm0,%xmm1
  movsd  -0x10(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  jmp    L107
L25:
  nop
L107:
  addl   $0x1,-0x24(%rbp)
L165:
  mov    -0x24(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jl     L26
  movsd  -0x10(%rbp),%xmm0
  jmp    L132
L49:
  pxor   %xmm0,%xmm0
L132:
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: tag: D2
type_infered: f64
name: disassemble_data
arguments: tag: D42
type_infered: f32[2]

tool: D2: 1

tool: {"D42": [0.0,-0.0]}

assistant: ```c
double _tram_update_biased_conf_energies(double *bias_energy_sequence, int *state_sequence, int seq_length, double *log_R_K_i, int n_therm_states, int n_conf_states, double *scratch_T, double *new_biased_conf_energies, int return_log_L) {
  int i, K, x, o, Ki;
  int KM;
  double divisor, log_L;
  for (x = 0; x < seq_length; ++x) {
    i = state_sequence[x];
    if (i < 0)
      continue;
    o = 0;
    for (K = 0; K < n_therm_states; ++K) {
      assert(K < n_therm_states);
      assert(K >= 0);
      if (-(1.0 / 0.0) == log_R_K_i[K * n_conf_states + i])
        continue;
      scratch_T[o++] = log_R_K_i[K * n_conf_states + i] - bias_energy_sequence[x * n_therm_states + K];
    }
    divisor = _logsumexp_sort_kahan_inplace(scratch_T, o);
    for (K = 0; K < n_therm_states; ++K) {
      new_biased_conf_energies[K * n_conf_states + i] = -_logsumexp_pair(-new_biased_conf_energies[K * n_conf_states + i], -(divisor + bias_energy_sequence[x * n_therm_states + K]));
    }
  }
  if (return_log_L) {
    log_L = 0;
    for (x = 0; x < seq_length; ++x) {
      o = 0;
      i = state_sequence[x];
      if (i < 0)
        continue;
      for (K = 0; K < n_therm_states; ++K) {
        KM = K * n_conf_states;
        Ki = KM + i;
        if (log_R_K_i[Ki] > 0)
          scratch_T[o++] = log_R_K_i[Ki] - bias_energy_sequence[x * n_therm_states + K];
      }
      log_L -= _logsumexp_sort_kahan_inplace(scratch_T, o);
    }
    return log_L;
  } else
    return 0;
}
```