user: 这段汇编代码用C语言表示是什么样的：

```asm
<_mbar_get_pointwise_unbiased_free_energies>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x58,%rsp
  mov    %edi,0x3c(%rsp)
  mov    0x90(%rsp),%rbx
  test   %r9d,%r9d
  jle    L44
  movslq %edi,%rax
  mov    0x98(%rsp),%r10
  mov    %r8d,%r15d
  xor    %ebp,%ebp
  lea    (%rdx,%rax,8),%rax
  and    $0xfffffffe,%r15d
  mov    %rdx,%r12
  mov    %rcx,%r14
  mov    %rax,0x48(%rsp)
  lea    -0x1(%r9),%eax
  movslq %r15d,%rdx
  mov    %rsi,%r13
  lea    0x8(%r10,%rax,8),%rax
  shl    $0x3,%rdx
  mov    %rax,0x40(%rsp)
  mov    %r8d,%eax
  lea    (%rsi,%rdx,1),%r9
  lea    (%r12,%rdx,1),%rcx
  shr    %eax
  add    %rbx,%rdx
  sub    $0x1,%eax
  add    $0x1,%rax
  shl    $0x4,%rax
  mov    %rax,%r11
  lea    -0x1(%r8),%eax
  mov    %eax,0x38(%rsp)
  nopl   0x0(%rax,%rax,1)
L60:
  test   %r8d,%r8d
  jle    L30
  movslq %ebp,%rax
  lea    0x8(,%rax,8),%rsi
  lea    0x8(%r13),%rax
  cmp    %rax,%rbx
  lea    0x8(%r12),%rax
  setne  %dil
  cmp    %rax,%rbx
  setne  %al
  and    %edi,%eax
  cmpl   $0x1,0x38(%rsp)
  seta   %dil
  test   %dil,%al
  je     L89
  lea    (%r14,%rsi,1),%rax
  cmp    %rax,%rbx
  je     L89
  lea    -0x8(%r14,%rsi,1),%rsi
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L51:
  movupd 0x0(%r13,%rax,1),%xmm0
  movupd (%r12,%rax,1),%xmm1
  movupd (%rsi,%rax,1),%xmm2
  addpd  %xmm1,%xmm0
  subpd  %xmm2,%xmm0
  movups %xmm0,(%rbx,%rax,1)
  add    $0x10,%rax
  cmp    %r11,%rax
  jne    L51
  cmp    %r15d,%r8d
  je     L30
  lea    0x0(%rbp,%r15,1),%eax
  movsd  (%r9),%xmm0
  addsd  (%rcx),%xmm0
  cltq
  subsd  (%r14,%rax,8),%xmm0
  movsd  %xmm0,(%rdx)
L30:
  mov    %r8d,%esi
  mov    %rbx,%rdi
  mov    %rdx,0x30(%rsp)
  mov    %r10,0x28(%rsp)
  mov    %rcx,0x20(%rsp)
  mov    %r9,0x18(%rsp)
  mov    %r11,0x10(%rsp)
  mov    %r8d,0x8(%rsp)
  call   <_logsumexp_sort_kahan_inplace@plt>
  mov    0x3c(%rsp),%eax
  mov    0x8(%rsp),%r8d
  mov    0x10(%rsp),%r11
  mov    0x18(%rsp),%r9
  cmp    $0xffffffff,%eax
  mov    0x20(%rsp),%rcx
  mov    0x28(%rsp),%r10
  mov    0x30(%rsp),%rdx
  je     L22
  add    %ebp,%eax
  cltq
  addsd  (%r14,%rax,8),%xmm0
  mov    0x48(%rsp),%rax
  subsd  (%rax),%xmm0
L22:
  movsd  %xmm0,(%r10)
  add    %r8d,%ebp
  add    $0x8,%r10
  cmp    0x40(%rsp),%r10
  jne    L60
L44:
  add    $0x58,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L89:
  mov    0x38(%rsp),%eax
  mov    %r11,0x10(%rsp)
  lea    -0x8(%r14,%rsi,1),%rdi
  mov    %rax,0x8(%rsp)
  mov    0x8(%rsp),%r11
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L49:
  movsd  (%r12,%rax,8),%xmm0
  addsd  0x0(%r13,%rax,8),%xmm0
  mov    %rax,%rsi
  subsd  (%rdi,%rax,8),%xmm0
  movsd  %xmm0,(%rbx,%rax,8)
  add    $0x1,%rax
  cmp    %rsi,%r11
  jne    L49
  mov    0x10(%rsp),%r11
  jmp    L30
```

assistant: ```c
void _mbar_get_pointwise_unbiased_free_energies(int k, double *log_therm_state_counts, double *therm_energies, double *bias_energy_sequence, int n_therm_states, int seq_length, double *scratch_T, double *pointwise_unbiased_free_energies) {
  int L, x;
  double log_divisor;
  for (x = 0; x < seq_length; ++x) {
    for (L = 0; L < n_therm_states; ++L)
      scratch_T[L] = log_therm_state_counts[L] + therm_energies[L] - bias_energy_sequence[x * n_therm_states + L];
    log_divisor = _logsumexp_sort_kahan_inplace(scratch_T, n_therm_states);
    if (k == -1)
      pointwise_unbiased_free_energies[x] = log_divisor;
    else
      pointwise_unbiased_free_energies[x] = bias_energy_sequence[x * n_therm_states + k] + log_divisor - therm_energies[k];
  }
}
```