user: 请从给定的汇编指令推导出C源代码:

```asm
<linear_expansion_sum>:
  endbr64
  push   %r13
  movq   D8(%rip),%xmm7
  mov    %rsi,%r11
  mov    %rcx,%r9
  push   %r12
  push   %rbp
  push   %rbx
  movsd  (%rsi),%xmm5
  mov    %edx,%ebx
  movsd  (%rcx),%xmm0
  movapd %xmm5,%xmm1
  comisd %xmm5,%xmm0
  xorpd  %xmm7,%xmm1
  seta   %dl
  comisd %xmm1,%xmm0
  seta   %al
  cmp    %al,%dl
  je     L46
  movsd  0x8(%rcx),%xmm4
  mov    $0x10,%esi
  mov    $0x2,%ecx
  xor    %edx,%edx
  mov    $0x8,%ebp
  mov    $0x1,%r10d
  mov    $0x1,%eax
L90:
  cmp    %edi,%edx
  jge    L132
  cmp    %ebx,%eax
  jl     L30
L73:
  movapd %xmm5,%xmm1
  lea    (%rdi,%rbx,1),%r12d
  mov    %r10d,%edx
  mov    %eax,%ecx
  addsd  %xmm0,%xmm1
  lea    -0x2(%r12),%r10d
  movapd %xmm1,%xmm2
  subsd  %xmm5,%xmm2
  movsd  (%r11,%rbp,1),%xmm5
  subsd  %xmm2,%xmm0
  test   %r10d,%r10d
  jg     L43
L83:
  mov    %r8,%rax
  movapd %xmm1,%xmm2
  mov    $0x2,%r12d
  mov    $0x8,%r10d
  jmp    L111
  xchg   %ax,%ax
L30:
  comisd %xmm5,%xmm4
  movapd %xmm5,%xmm1
  xorpd  %xmm7,%xmm1
  seta   %r13b
  comisd %xmm1,%xmm4
  seta   %r12b
  cmp    %r12b,%r13b
  je     L73
L132:
  movapd %xmm4,%xmm1
  lea    (%rdi,%rbx,1),%r12d
  addsd  %xmm0,%xmm1
  lea    -0x2(%r12),%r10d
  movapd %xmm1,%xmm2
  subsd  %xmm4,%xmm2
  movsd  (%r9,%rsi,1),%xmm4
  subsd  %xmm2,%xmm0
  test   %r10d,%r10d
  jle    L83
L43:
  lea    -0x3(%r12),%ebp
  mov    $0x1,%eax
  add    $0x1,%rbp
  jmp    L122
  nopl   (%rax)
L25:
  movapd %xmm2,%xmm1
L122:
  cmp    %edx,%edi
  jle    L142
  cmp    %ecx,%ebx
  jle    L50
  comisd %xmm5,%xmm4
  movapd %xmm5,%xmm2
  xorpd  %xmm7,%xmm2
  seta   %r13b
  comisd %xmm2,%xmm4
  seta   %sil
  cmp    %sil,%r13b
  je     L50
L142:
  movapd %xmm0,%xmm3
  add    $0x1,%ecx
  movslq %eax,%r13
  addsd  %xmm4,%xmm3
  movslq %ecx,%rsi
  movapd %xmm3,%xmm2
  subsd  %xmm4,%xmm2
  subsd  %xmm2,%xmm0
  movapd %xmm3,%xmm2
  addsd  %xmm1,%xmm2
  movsd  %xmm0,-0x8(%r8,%rax,8)
  movsd  (%r9,%rsi,8),%xmm4
  movapd %xmm2,%xmm6
  movapd %xmm2,%xmm8
  subsd  %xmm1,%xmm6
  subsd  %xmm6,%xmm8
  subsd  %xmm6,%xmm3
  subsd  %xmm8,%xmm1
  movapd %xmm1,%xmm0
  addsd  %xmm3,%xmm0
  cmp    %rbp,%rax
  je     L10
  add    $0x1,%rax
  cmp    %edx,%edi
  jle    1040 <linear_expansion_sum.cold>
  jmp    L25
L50:
  movapd %xmm5,%xmm3
  add    $0x1,%edx
  addsd  %xmm0,%xmm3
  movslq %edx,%rsi
  movapd %xmm3,%xmm2
  subsd  %xmm5,%xmm2
  subsd  %xmm2,%xmm0
  movapd %xmm3,%xmm2
  addsd  %xmm1,%xmm2
  movsd  %xmm0,-0x8(%r8,%rax,8)
  movsd  (%r11,%rsi,8),%xmm5
  movapd %xmm2,%xmm6
  movapd %xmm2,%xmm8
  subsd  %xmm1,%xmm6
  subsd  %xmm6,%xmm8
  subsd  %xmm6,%xmm3
  subsd  %xmm8,%xmm1
  movapd %xmm1,%xmm0
  addsd  %xmm3,%xmm0
  cmp    %rbp,%rax
  je     L10
  add    $0x1,%rax
  jmp    L25
L10:
  movslq %r10d,%r10
  shl    $0x3,%r10
  lea    (%r8,%r10,1),%rax
  add    $0x8,%r10
L111:
  movsd  %xmm0,(%rax)
  mov    %r12d,%eax
  pop    %rbx
  pop    %rbp
  movsd  %xmm2,(%r8,%r10,1)
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax,%rax,1)
L46:
  movapd %xmm0,%xmm4
  mov    $0x1,%ecx
  movapd %xmm5,%xmm0
  xor    %eax,%eax
  movsd  0x8(%rsi),%xmm5
  mov    $0x10,%ebp
  mov    $0x8,%esi
  mov    $0x2,%r10d
  mov    $0x1,%edx
  jmp    L90
```

tool_calls: name: disassemble_data
arguments: data_label: D8
datatype: byte[8]

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

assistant: ```c
int linear_expansion_sum(elen, e, flen, f, h)
int elen;
double *e;
int flen;
double *f;
double *h;
{
  double Q, q;
  double Qnew;
  double R;
  double bvirt;
  double avirt, bround, around;
  int eindex, findex, hindex;
  double enow, fnow;
  double g0;
  enow = e[0];
  fnow = f[0];
  eindex = findex = 0;
  if ((fnow > enow) == (fnow > -enow)) {
    g0 = enow;
    enow = e[++eindex];
  } else {
    g0 = fnow;
    fnow = f[++findex];
  }
  if ((eindex < elen) && ((findex >= flen) || ((fnow > enow) == (fnow > -enow)))) {
    Qnew = (double)(enow + g0);
    bvirt = Qnew - enow;
    q = g0 - bvirt;
    enow = e[++eindex];
  } else {
    Qnew = (double)(fnow + g0);
    bvirt = Qnew - fnow;
    q = g0 - bvirt;
    fnow = f[++findex];
  }
  Q = Qnew;
  for (hindex = 0; hindex < elen + flen - 2; hindex++) {
    if ((eindex < elen) && ((findex >= flen) || ((fnow > enow) == (fnow > -enow)))) {
      R = (double)(enow + q);
      bvirt = R - enow;
      h[hindex] = q - bvirt;
      enow = e[++eindex];
    } else {
      R = (double)(fnow + q);
      bvirt = R - fnow;
      h[hindex] = q - bvirt;
      fnow = f[++findex];
    }
    Qnew = (double)(Q + R);
    bvirt = (double)(Qnew - Q);
    avirt = Qnew - bvirt;
    bround = R - bvirt;
    around = Q - avirt;
    q = around + bround;
    Q = Qnew;
  }
  h[hindex] = q;
  h[hindex + 1] = Q;
  return hindex + 2;
}
```