user: Please show me the C implementation that matches the assembly code listed below:

```asm
<PMatT92>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  movsd  %xmm0,-0x20(%rbp)
  movsd  %xmm1,-0x28(%rbp)
  movsd  %xmm2,-0x30(%rbp)
  movsd  D145(%rip),%xmm0
  subsd  -0x30(%rbp),%xmm0
  mulsd  -0x30(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x28(%rbp),%xmm1
  movsd  D218(%rip),%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x20(%rbp),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  D198(%rip),%xmm0
  comisd -0x20(%rbp),%xmm0
  jbe    L26
  mov    -0x20(%rbp),%rax
  movq   %rax,%xmm0
  lea    D227(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L26:
  movsd  D75(%rip),%xmm0
  comisd -0x20(%rbp),%xmm0
  jbe    L25
  mov    -0x18(%rbp),%rax
  mov    $0x4,%esi
  mov    %rax,%rdi
  call   <identity@plt>
  mov    $0x0,%eax
  jmp    L17
L25:
  movsd  -0x20(%rbp),%xmm0
  movq   D154(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x10(%rbp)
  movsd  -0x28(%rbp),%xmm1
  movsd  D145(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movq   D154(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  mulsd  -0x20(%rbp),%xmm0
  movsd  D225(%rip),%xmm1
  divsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x8(%rbp)
  movsd  D145(%rip),%xmm0
  subsd  -0x30(%rbp),%xmm0
  movsd  D225(%rip),%xmm2
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  -0x10(%rbp),%xmm2
  movsd  D145(%rip),%xmm0
  addsd  %xmm2,%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x30(%rbp),%xmm0
  mulsd  -0x8(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  add    $0x50,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  movsd  (%rax),%xmm0
  mov    -0x18(%rbp),%rax
  movsd  %xmm0,(%rax)
  movsd  -0x30(%rbp),%xmm0
  movsd  D225(%rip),%xmm2
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  -0x10(%rbp),%xmm2
  movsd  D145(%rip),%xmm0
  addsd  %xmm2,%xmm0
  mulsd  %xmm0,%xmm1
  movsd  D145(%rip),%xmm0
  subsd  -0x30(%rbp),%xmm0
  mulsd  -0x8(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  add    $0x78,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x18(%rbp),%rdx
  add    $0x28,%rdx
  movsd  (%rax),%xmm0
  movsd  %xmm0,(%rdx)
  movsd  D145(%rip),%xmm0
  subsd  -0x30(%rbp),%xmm0
  movsd  D225(%rip),%xmm2
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  -0x10(%rbp),%xmm2
  movsd  D145(%rip),%xmm0
  addsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  D145(%rip),%xmm1
  subsd  -0x30(%rbp),%xmm1
  mulsd  -0x8(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x70,%rax
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x18(%rbp),%rdx
  add    $0x20,%rdx
  movsd  (%rax),%xmm0
  movsd  %xmm0,(%rdx)
  movsd  -0x30(%rbp),%xmm0
  movsd  D225(%rip),%xmm2
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  -0x10(%rbp),%xmm2
  movsd  D145(%rip),%xmm0
  addsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  -0x30(%rbp),%xmm1
  mulsd  -0x8(%rbp),%xmm1
  mov    -0x18(%rbp),%rax
  add    $0x58,%rax
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x18(%rbp),%rdx
  add    $0x8,%rdx
  movsd  (%rax),%xmm0
  movsd  %xmm0,(%rdx)
  movsd  D145(%rip),%xmm0
  subsd  -0x30(%rbp),%xmm0
  movsd  D225(%rip),%xmm2
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  D145(%rip),%xmm0
  subsd  -0x10(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  add    $0x30,%rax
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x18(%rbp),%rdx
  add    $0x60,%rdx
  movsd  (%rax),%xmm0
  movsd  %xmm0,(%rdx)
  mov    -0x18(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rdx),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x18(%rbp),%rdx
  add    $0x10,%rdx
  movsd  (%rax),%xmm0
  movsd  %xmm0,(%rdx)
  movsd  -0x30(%rbp),%xmm0
  movsd  D225(%rip),%xmm2
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  D145(%rip),%xmm0
  subsd  -0x10(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  add    $0x48,%rax
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x18(%rbp),%rdx
  add    $0x18,%rdx
  movsd  (%rax),%xmm0
  movsd  %xmm0,(%rdx)
  mov    -0x18(%rbp),%rax
  add    $0x68,%rax
  movsd  (%rdx),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x18(%rbp),%rdx
  add    $0x38,%rdx
  movsd  (%rax),%xmm0
  movsd  %xmm0,(%rdx)
  mov    $0x0,%eax
L17:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D145
type: byte[8]
name: unpack_data
arguments: data_label: D218
type: byte[8]
name: unpack_data
arguments: data_label: D198
type: byte[8]
name: unpack_data
arguments: data_label: D227
type: string
name: unpack_data
arguments: data_label: D75
type: byte[8]
name: unpack_data
arguments: data_label: D154
type: byte[8]
name: unpack_data
arguments: data_label: D225
type: byte[8]

tool: {"D145": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

tool: {"D218": [0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f]}

tool: {"D198": [0x9a,0x99,0x99,0x99,0x99,0x99,0xb9,0xbf]}

tool: D227: 
t = %.5f in PMatT92

tool: {"D75": [0x30,0x05,0x8e,0xe4,0x2e,0xff,0x2b,0x2b]}

tool: {"D154": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80]}

tool: {"D225": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40]}

assistant: ```c
int PMatT92(double P[], double t, double kappa, double pGC) {
  double e1, e2;
  t /= (pGC * (1 - pGC) * kappa + .5);
  if (t < -0.1)
    printf("\nt = %.5f in PMatT92", t);
  if (t < 1e-100) {
    identity(P, 4);
    return (0);
  }
  e1 = exp(-t);
  e2 = exp(-(kappa + 1) * t / 2);
  P[0 * 4 + 0] = P[2 * 4 + 2] = (1 - pGC) / 2 * (1 + e1) + pGC * e2;
  P[1 * 4 + 1] = P[3 * 4 + 3] = pGC / 2 * (1 + e1) + (1 - pGC) * e2;
  P[1 * 4 + 0] = P[3 * 4 + 2] = (1 - pGC) / 2 * (1 + e1) - (1 - pGC) * e2;
  P[0 * 4 + 1] = P[2 * 4 + 3] = pGC / 2 * (1 + e1) - pGC * e2;
  P[0 * 4 + 2] = P[2 * 4 + 0] = P[3 * 4 + 0] = P[1 * 4 + 2] = (1 - pGC) / 2 * (1 - e1);
  P[1 * 4 + 3] = P[3 * 4 + 1] = P[0 * 4 + 3] = P[2 * 4 + 1] = pGC / 2 * (1 - e1);
  return (0);
}
```