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

```asm
<gammln>:
  endbr64
  sub    $0x28,%rsp
  movapd %xmm0,%xmm3
  addsd  D167(%rip),%xmm3
  movsd  %xmm0,0x10(%rsp)
  movapd %xmm3,%xmm0
  movsd  %xmm3,0x18(%rsp)
  call   <log@plt>
  movsd  0x10(%rsp),%xmm2
  movsd  D124(%rip),%xmm4
  movsd  D49(%rip),%xmm5
  movsd  %xmm0,0x8(%rsp)
  movsd  D134(%rip),%xmm0
  movapd %xmm2,%xmm1
  addsd  %xmm4,%xmm1
  divsd  %xmm1,%xmm5
  addsd  %xmm4,%xmm1
  divsd  %xmm1,%xmm0
  addsd  %xmm4,%xmm1
  addsd  D170(%rip),%xmm5
  addsd  %xmm5,%xmm0
  movsd  D150(%rip),%xmm5
  divsd  %xmm1,%xmm5
  addsd  %xmm4,%xmm1
  addsd  %xmm0,%xmm5
  movsd  D16(%rip),%xmm0
  divsd  %xmm1,%xmm0
  addsd  %xmm4,%xmm1
  addsd  %xmm5,%xmm0
  movsd  D142(%rip),%xmm5
  divsd  %xmm1,%xmm5
  addsd  %xmm4,%xmm1
  addsd  %xmm0,%xmm5
  movsd  D10(%rip),%xmm0
  divsd  %xmm1,%xmm0
  addsd  %xmm4,%xmm1
  addsd  %xmm5,%xmm0
  movsd  D44(%rip),%xmm5
  divsd  %xmm1,%xmm5
  addsd  %xmm4,%xmm1
  addsd  %xmm0,%xmm5
  movsd  D111(%rip),%xmm0
  divsd  %xmm1,%xmm0
  addsd  %xmm4,%xmm1
  addsd  %xmm5,%xmm0
  movsd  D148(%rip),%xmm5
  divsd  %xmm1,%xmm5
  addsd  %xmm4,%xmm1
  addsd  %xmm0,%xmm5
  movsd  D86(%rip),%xmm0
  divsd  %xmm1,%xmm0
  addsd  %xmm4,%xmm1
  addsd  %xmm5,%xmm0
  movsd  D24(%rip),%xmm5
  divsd  %xmm1,%xmm5
  addsd  %xmm4,%xmm1
  addsd  %xmm0,%xmm5
  movsd  D81(%rip),%xmm0
  divsd  %xmm1,%xmm0
  addsd  %xmm4,%xmm1
  addsd  %xmm5,%xmm0
  movsd  D130(%rip),%xmm5
  divsd  %xmm1,%xmm5
  addsd  %xmm4,%xmm1
  movsd  D153(%rip),%xmm4
  divsd  %xmm1,%xmm4
  addsd  %xmm0,%xmm5
  movapd %xmm4,%xmm0
  addsd  %xmm5,%xmm0
  mulsd  D46(%rip),%xmm0
  divsd  %xmm2,%xmm0
  call   <log@plt>
  movsd  0x10(%rsp),%xmm2
  addsd  D51(%rip),%xmm2
  mulsd  0x8(%rsp),%xmm2
  movsd  0x18(%rsp),%xmm3
  movapd %xmm0,%xmm1
  add    $0x28,%rsp
  subsd  %xmm3,%xmm2
  movapd %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  ret
```

tool_calls: name: read_data
arguments: label: D167
data_type: f64
name: read_data
arguments: label: D124
data_type: f32[2]
name: read_data
arguments: label: D49
data_type: f64
name: read_data
arguments: label: D134
data_type: byte[8]
name: read_data
arguments: label: D170
data_type: f64
name: read_data
arguments: label: D150
data_type: f64
name: read_data
arguments: label: D16
data_type: byte[8]
name: read_data
arguments: label: D142
data_type: byte[8]
name: read_data
arguments: label: D10
data_type: byte[8]
name: read_data
arguments: label: D44
data_type: byte[8]
name: read_data
arguments: label: D111
data_type: byte[8]
name: read_data
arguments: label: D148
data_type: byte[8]
name: read_data
arguments: label: D86
data_type: byte[8]
name: read_data
arguments: label: D24
data_type: byte[8]
name: read_data
arguments: label: D81
data_type: byte[8]
name: read_data
arguments: label: D130
data_type: byte[8]
name: read_data
arguments: label: D153
data_type: byte[8]
name: read_data
arguments: label: D46
data_type: f64
name: read_data
arguments: label: D51
data_type: f64

tool: D167: 5.2421875

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

tool: D49: 57.15623566586292

tool: {"D134": [0x30,0x89,0x05,0xf7,0x89,0xcc,0x4d,0xc0]}

tool: D170: 0.9999999999999971

tool: D150: 14.136097974741746

tool: {"D16": [0xe4,0xbf,0x25,0x16,0x84,0x7b,0xdf,0xbf]}

tool: {"D142": [0x3a,0x18,0x86,0x47,0xaf,0xd2,0x01,0x3f]}

tool: {"D10": [0xbd,0xe3,0xc5,0xb7,0x4b,0x64,0x08,0x3f]}

tool: {"D44": [0xb7,0x74,0xe5,0x9d,0xcc,0xc9,0x19,0xbf]}

tool: {"D111": [0x24,0x85,0xdd,0x4b,0xa9,0x93,0xf0,0x3e]}

tool: {"D148": [0x36,0xbe,0x2a,0xcd,0x4d,0x8f,0x2b,0xbf]}

tool: {"D86": [0x26,0xe8,0xe9,0x18,0x10,0x80,0x2c,0x3f]}

tool: {"D24": [0x40,0x26,0x95,0xc9,0x99,0x89,0x25,0xbf]}

tool: {"D81": [0xdd,0x58,0x1d,0x78,0x7d,0x48,0x17,0x3f]}

tool: {"D130": [0x06,0xe2,0xd1,0xb5,0x8c,0x76,0xfb,0xbe]}

tool: {"D153": [0x10,0x98,0xfc,0x04,0x0a,0xf4,0xce,0x3e]}

tool: D46: 2.5066282746310007

tool: D51: 0.5

assistant: ```c
double gammln(const double xx) {
  int j;
  double x, tmp, y, ser;
  static const double cof[14] = {57.1562356658629235, -59.5979603554754912, 14.1360979747417471, -0.491913816097620199, 0.339946499848118887e-4, 0.465236289270485756e-4, -0.983744753048795646e-4, 0.0158088703224912494e-3, -0.210264441724104883e-3, 0.217439618115212643e-3, -0.164318106536763890e-3, 0.888182239838527433e-4, -0.261908384015814087e-4, 0.368991826595316234e-5};
  if (xx <= 0.0) {
  }
  y = xx;
  x = xx;
  tmp = x + 5.24218750000000000;
  tmp = (x + 0.5) * log(tmp) - tmp;
  ser = 0.999999999999997092;
  for (j = 0; j < 14; j++) {
    ser += cof[j] / ++y;
  }
  return tmp + log(2.5066282746310005 * ser / x);
}
```