user: Translate the below assembly code into C programming language:

```asm
<makeP_Flex_Ancestral>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x460,%rsp
  mov    %rdi,-0x438(%rbp)
  mov    %rsi,-0x440(%rbp)
  mov    %rdx,-0x448(%rbp)
  mov    %ecx,-0x44c(%rbp)
  mov    %r8,-0x458(%rbp)
  mov    %r9d,-0x450(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x450(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x420(%rbp)
  mov    -0x450(%rbp),%eax
  imul   %eax,%eax
  mov    %eax,-0x41c(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x418(%rbp)
  cmpl   $0x40,-0x450(%rbp)
  setle  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  movl   $0x0,-0x42c(%rbp)
  jmp    L62
L76:
  mov    -0x42c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x448(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  -0x418(%rbp),%xmm0
  mov    -0x42c(%rbp),%eax
  cltq
  movsd  %xmm0,-0x410(%rbp,%rax,8)
  addl   $0x1,-0x42c(%rbp)
L62:
  mov    -0x42c(%rbp),%eax
  cmp    -0x420(%rbp),%eax
  jl     L76
  movl   $0x0,-0x42c(%rbp)
  jmp    L12
L16:
  movl   $0x0,-0x428(%rbp)
  jmp    L37
L15:
  mov    -0x42c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x438(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x428(%rbp),%eax
  cltq
  movsd  -0x410(%rbp,%rax,8),%xmm0
  mulsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movq   %xmm0,%rax
  mov    -0x428(%rbp),%edx
  movslq %edx,%rdx
  mov    %rax,-0x210(%rbp,%rdx,8)
  addl   $0x1,-0x428(%rbp)
L37:
  mov    -0x428(%rbp),%eax
  cmp    -0x420(%rbp),%eax
  jl     L15
  movl   $0x0,-0x428(%rbp)
  jmp    L64
L99:
  mov    -0x41c(%rbp),%eax
  imul   -0x42c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x450(%rbp),%eax
  imul   -0x428(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x458(%rbp),%rax
  add    %rdx,%rax
  movsd  D6(%rip),%xmm0
  movsd  %xmm0,(%rax)
  movl   $0x1,-0x424(%rbp)
  jmp    L72
L85:
  mov    -0x424(%rbp),%eax
  sub    $0x1,%eax
  cltq
  movsd  -0x210(%rbp,%rax,8),%xmm1
  mov    -0x420(%rbp),%eax
  imul   -0x428(%rbp),%eax
  mov    %eax,%edx
  mov    -0x424(%rbp),%eax
  sub    $0x1,%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x440(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x41c(%rbp),%eax
  imul   -0x42c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x450(%rbp),%eax
  imul   -0x428(%rbp),%eax
  add    %eax,%edx
  mov    -0x424(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x458(%rbp),%rax
  add    %rdx,%rax
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x424(%rbp)
L72:
  mov    -0x424(%rbp),%eax
  cmp    -0x450(%rbp),%eax
  jl     L85
  addl   $0x1,-0x428(%rbp)
L64:
  mov    -0x428(%rbp),%eax
  cmp    -0x450(%rbp),%eax
  jl     L99
  addl   $0x1,-0x42c(%rbp)
L12:
  mov    -0x42c(%rbp),%eax
  cmp    -0x44c(%rbp),%eax
  jl     L16
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L95
  call   <__stack_chk_fail@plt>
L95:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D6
type_guessed: f64

tool: D6: 1

assistant: ```c
void makeP_Flex_Ancestral(double *rptr, double *EI, double *EIGN, int numberOfCategories, double *left, const int numStates) {
  int i, j, k;
  const int rates = numStates - 1, statesSquare = numStates * numStates;
  double z1 = 0.0, lz1[64], d1[64];
  assert(numStates <= 64);
  for (i = 0; i < rates; i++)
    lz1[i] = EIGN[i] * z1;
  for (i = 0; i < numberOfCategories; i++) {
    for (j = 0; j < rates; j++)
      d1[j] = exp(rptr[i] * lz1[j]);
    for (j = 0; j < numStates; j++) {
      left[statesSquare * i + numStates * j] = 1.0;
      for (k = 1; k < numStates; k++)
        left[statesSquare * i + numStates * j + k] = d1[k - 1] * EI[rates * j + (k - 1)];
    }
  }
}
```