user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<weightExpVec>:
  endbr64
  push   %r15
  mov    %esi,%eax
  push   %r14
  imul   %edi,%eax
  push   %r13
  mov    %edx,%r13d
  push   %r12
  push   %rbp
  push   %rbx
  mov    %r9,%rbx
  sub    $0x38,%rsp
  mov    %edi,0x2c(%rsp)
  mov    %rcx,0x18(%rsp)
  mov    %r8,0x20(%rsp)
  test   %eax,%eax
  jle    L95
  mov    0x70(%rsp),%r15
  sub    $0x1,%eax
  xor    %r14d,%r14d
  mov    %edx,%r12d
  mov    %r14d,%ebp
  mov    %r9,%r14
  lea    0x8(%r15,%rax,8),%rax
  mov    %rax,0x10(%rsp)
  lea    -0x1(%rdx),%eax
  mov    %eax,0x28(%rsp)
  nopl   0x0(%rax,%rax,1)
L49:
  test   %r12d,%r12d
  jle    L106
  mov    0x18(%rsp),%rax
  movslq %ebp,%r9
  mov    0x28(%rsp),%ebx
  pxor   %xmm1,%xmm1
  lea    (%rax,%r9,4),%r13
  xor    %eax,%eax
  nop
L105:
  pxor   %xmm0,%xmm0
  mov    %rax,%rdx
  cvtsi2sdl 0x0(%r13,%rax,4),%xmm0
  mulsd  (%r14,%rax,8),%xmm0
  add    $0x1,%rax
  addsd  %xmm0,%xmm1
  cmp    %rdx,%rbx
  jne    L105
  xorpd  D20(%rip),%xmm1
  mov    %r9,0x8(%rsp)
  movapd %xmm1,%xmm0
  call   <exp@plt>
  mov    0x78(%rsp),%rax
  mov    0x8(%rsp),%r9
  movapd %xmm0,%xmm1
  movsd  %xmm0,(%r15)
  lea    (%rax,%r9,8),%r9
  xor    %eax,%eax
L33:
  pxor   %xmm0,%xmm0
  mov    %rax,%rdx
  cvtsi2sdl 0x0(%r13,%rax,4),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%r9,%rax,8)
  add    $0x1,%rax
  cmp    %rdx,%rbx
  jne    L33
  add    $0x8,%r15
  add    %r12d,%ebp
  cmp    0x10(%rsp),%r15
  jne    L49
L44:
  mov    %r12d,%r13d
  mov    %r14,%rbx
L95:
  mov    0x2c(%rsp),%eax
  test   %eax,%eax
  jle    L19
  mov    0x80(%rsp),%rbp
  sub    $0x1,%eax
  xor    %r12d,%r12d
  mov    %rbx,%r15
  mov    %r13d,%ebx
  lea    0x8(%rbp,%rax,8),%rax
  mov    %rbp,%r14
  mov    %r12d,%ebp
  mov    %rax,0x10(%rsp)
  lea    -0x1(%r13),%eax
  mov    %eax,0x18(%rsp)
  nopl   0x0(%rax)
L88:
  test   %ebx,%ebx
  jle    L59
  mov    0x20(%rsp),%rax
  movslq %ebp,%r9
  mov    0x18(%rsp),%r12d
  pxor   %xmm1,%xmm1
  lea    (%rax,%r9,4),%r13
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L35:
  pxor   %xmm0,%xmm0
  mov    %rax,%r8
  cvtsi2sdl 0x0(%r13,%rax,4),%xmm0
  mulsd  (%r15,%rax,8),%xmm0
  add    $0x1,%rax
  addsd  %xmm0,%xmm1
  cmp    %r8,%r12
  jne    L35
  xorpd  D20(%rip),%xmm1
  mov    %r9,0x8(%rsp)
  movapd %xmm1,%xmm0
  call   <exp@plt>
  mov    0x88(%rsp),%rax
  mov    0x8(%rsp),%r9
  movapd %xmm0,%xmm1
  movsd  %xmm0,(%r14)
  lea    (%rax,%r9,8),%r9
  xor    %eax,%eax
  nopl   0x0(%rax,%rax,1)
L128:
  pxor   %xmm0,%xmm0
  mov    %rax,%r8
  cvtsi2sdl 0x0(%r13,%rax,4),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%r9,%rax,8)
  add    $0x1,%rax
  cmp    %r8,%r12
  jne    L128
  add    $0x8,%r14
  add    %ebx,%ebp
  cmp    %r14,0x10(%rsp)
  jne    L88
L19:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L59:
  mov    D29(%rip),%rax
  add    $0x8,%r14
  add    %ebx,%ebp
  mov    %rax,-0x8(%r14)
  cmp    %r14,0x10(%rsp)
  jne    L88
  jmp    L19
  xchg   %ax,%ax
L106:
  mov    D29(%rip),%rax
  add    $0x8,%r15
  add    %r12d,%ebp
  mov    %rax,-0x8(%r15)
  cmp    0x10(%rsp),%r15
  jne    L49
  jmp    L44
```

tool_calls: name: disassemble_data
arguments: data_label: D20
type: f32[4]
name: disassemble_data
arguments: data_label: D29
type: f32[2]

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

tool: {"D29": [0.0,1.875]}

assistant: ```c
void weightExpVec(const int16_t ns, const int16_t nc, const int16_t dims, const int16_t *restrict tcounts, const int16_t *restrict fcounts, const double *restrict weights, double *restrict tprob, double *restrict tvec, double *restrict fprob, double *restrict fvec) {
  for (int t = 0; t < ns * nc; ++t) {
    double lp = 0;
    for (int i = 0; i < dims; ++i)
      lp += tcounts[t * dims + i] * weights[i];
    double p = exp(-lp);
    tprob[t] = p;
    for (int i = 0; i < dims; ++i)
      tvec[t * dims + i] = p * tcounts[t * dims + i];
  }
  for (int t = 0; t < ns; ++t) {
    double lp = 0;
    for (int i = 0; i < dims; ++i)
      lp += fcounts[t * dims + i] * weights[i];
    double p = exp(-lp);
    fprob[t] = p;
    for (int i = 0; i < dims; ++i)
      fvec[t * dims + i] = p * fcounts[t * dims + i];
  }
}
```