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

```asm
<bspline_quad>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x220,%rsp
  mov    %rdi,-0x208(%rbp)
  mov    %esi,-0x20c(%rbp)
  mov    %edx,-0x210(%rbp)
  mov    %ecx,-0x214(%rbp)
  mov    %r8d,-0x218(%rbp)
  mov    %r9d,-0x21c(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movsd  D389(%rip),%xmm0
  movsd  %xmm0,-0x1c0(%rbp)
  movsd  D81(%rip),%xmm0
  movsd  %xmm0,-0x1b8(%rbp)
  movsd  D165(%rip),%xmm0
  movsd  %xmm0,-0x1b0(%rbp)
  movsd  D68(%rip),%xmm0
  movsd  %xmm0,-0x1a8(%rbp)
  movsd  D295(%rip),%xmm0
  movsd  %xmm0,-0x1a0(%rbp)
  movsd  D273(%rip),%xmm0
  movsd  %xmm0,-0x198(%rbp)
  movsd  D38(%rip),%xmm0
  movsd  %xmm0,-0x190(%rbp)
  movsd  D314(%rip),%xmm0
  movsd  %xmm0,-0x188(%rbp)
  movsd  D148(%rip),%xmm0
  movsd  %xmm0,-0x180(%rbp)
  movsd  D4(%rip),%xmm0
  movsd  %xmm0,-0x178(%rbp)
  movsd  D231(%rip),%xmm0
  movsd  %xmm0,-0x170(%rbp)
  movsd  D228(%rip),%xmm0
  movsd  %xmm0,-0x168(%rbp)
  movsd  D341(%rip),%xmm0
  movsd  %xmm0,-0x160(%rbp)
  movsd  D340(%rip),%xmm0
  movsd  %xmm0,-0x158(%rbp)
  movsd  D192(%rip),%xmm0
  movsd  %xmm0,-0x150(%rbp)
  movsd  D299(%rip),%xmm0
  movsd  %xmm0,-0x148(%rbp)
  movsd  D177(%rip),%xmm0
  movsd  %xmm0,-0x140(%rbp)
  movsd  D184(%rip),%xmm0
  movsd  %xmm0,-0x138(%rbp)
  movsd  D344(%rip),%xmm0
  movsd  %xmm0,-0x130(%rbp)
  movsd  D173(%rip),%xmm0
  movsd  %xmm0,-0x128(%rbp)
  movsd  D131(%rip),%xmm0
  movsd  %xmm0,-0x120(%rbp)
  movsd  D129(%rip),%xmm0
  movsd  %xmm0,-0x118(%rbp)
  movsd  D294(%rip),%xmm0
  movsd  %xmm0,-0x110(%rbp)
  movsd  D380(%rip),%xmm0
  movsd  %xmm0,-0x108(%rbp)
  movsd  D6(%rip),%xmm0
  movsd  %xmm0,-0x100(%rbp)
  movsd  D46(%rip),%xmm0
  movsd  %xmm0,-0xf8(%rbp)
  movsd  D24(%rip),%xmm0
  movsd  %xmm0,-0xf0(%rbp)
  movsd  D360(%rip),%xmm0
  movsd  %xmm0,-0xe8(%rbp)
  movsd  D82(%rip),%xmm0
  movsd  %xmm0,-0xe0(%rbp)
  movsd  D145(%rip),%xmm0
  movsd  %xmm0,-0xd8(%rbp)
  movsd  D378(%rip),%xmm0
  movsd  %xmm0,-0xd0(%rbp)
  movsd  D89(%rip),%xmm0
  movsd  %xmm0,-0xc8(%rbp)
  movsd  D381(%rip),%xmm0
  movsd  %xmm0,-0xc0(%rbp)
  movsd  D290(%rip),%xmm0
  movsd  %xmm0,-0xb8(%rbp)
  movsd  D285(%rip),%xmm0
  movsd  %xmm0,-0xb0(%rbp)
  movsd  D375(%rip),%xmm0
  movsd  %xmm0,-0xa8(%rbp)
  movl   $0x12,-0x1ec(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x1e8(%rbp)
  mov    -0x214(%rbp),%eax
  sub    -0x210(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x1f4(%rbp)
  cmpl   $0x0,-0x1f4(%rbp)
  jns    L22
  movl   $0x0,-0x1f4(%rbp)
L22:
  mov    -0x210(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x1f4(%rbp),%eax
  add    %edx,%eax
  add    $0x4,%eax
  mov    %eax,-0x1f0(%rbp)
  mov    -0x20c(%rbp),%eax
  cmp    -0x1f0(%rbp),%eax
  jg     L47
  mov    -0x20c(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x1f0(%rbp)
L47:
  mov    -0x1f4(%rbp),%eax
  mov    %eax,-0x1fc(%rbp)
  jmp    L38
L42:
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x1e0(%rbp)
  mov    -0x1fc(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x208(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x1d8(%rbp)
  mov    -0x1fc(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x208(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x1d0(%rbp)
  movl   $0x0,-0x1f8(%rbp)
  jmp    L46
L71:
  movsd  -0x1d0(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  -0x1d8(%rbp),%xmm1
  mov    -0x1f8(%rbp),%eax
  cltq
  movsd  -0x1c0(%rbp,%rax,8),%xmm2
  movsd  D300(%rip),%xmm0
  addsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  D308(%rip),%xmm1
  divsd  %xmm1,%xmm0
  addsd  -0x1d8(%rbp),%xmm0
  mov    -0x1f8(%rbp),%eax
  cltq
  movsd  %xmm0,-0xa0(%rbp,%rax,8)
  addl   $0x1,-0x1f8(%rbp)
L46:
  mov    -0x1f8(%rbp),%eax
  cmp    -0x1ec(%rbp),%eax
  jl     L71
  mov    -0x214(%rbp),%r9d
  mov    -0x210(%rbp),%r8d
  mov    -0x20c(%rbp),%ecx
  mov    -0x208(%rbp),%rdx
  mov    -0x1ec(%rbp),%esi
  lea    -0xa0(%rbp),%rax
  sub    $0x8,%rsp
  mov    0x10(%rbp),%edi
  push   %rdi
  mov    -0x21c(%rbp),%edi
  push   %rdi
  mov    -0x218(%rbp),%edi
  push   %rdi
  mov    %rax,%rdi
  call   <bspline_prod@plt>
  add    $0x20,%rsp
  mov    %rax,-0x1c8(%rbp)
  movl   $0x0,-0x1f8(%rbp)
  jmp    L26
L27:
  mov    -0x1f8(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x1c8(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x1f8(%rbp),%eax
  cltq
  movsd  -0x130(%rbp,%rax,8),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  -0x1e0(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x1e0(%rbp)
  addl   $0x1,-0x1f8(%rbp)
L26:
  mov    -0x1f8(%rbp),%eax
  cmp    -0x1ec(%rbp),%eax
  jl     L27
  mov    -0x1c8(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  movsd  -0x1d0(%rbp),%xmm0
  subsd  -0x1d8(%rbp),%xmm0
  mulsd  -0x1e0(%rbp),%xmm0
  movsd  D308(%rip),%xmm1
  divsd  %xmm1,%xmm0
  movsd  -0x1e8(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x1e8(%rbp)
  addl   $0x1,-0x1fc(%rbp)
L38:
  mov    -0x1fc(%rbp),%eax
  cmp    -0x1f0(%rbp),%eax
  jl     L42
  movsd  -0x1e8(%rbp),%xmm0
  movq   %xmm0,%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L73
  call   <__stack_chk_fail@plt>
L73:
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: label: D389
type_guessed: byte[8]
name: disassemble_data
arguments: label: D81
type_guessed: byte[8]
name: disassemble_data
arguments: label: D165
type_guessed: byte[8]
name: disassemble_data
arguments: label: D68
type_guessed: byte[8]
name: disassemble_data
arguments: label: D295
type_guessed: byte[8]
name: disassemble_data
arguments: label: D273
type_guessed: byte[8]
name: disassemble_data
arguments: label: D38
type_guessed: byte[8]
name: disassemble_data
arguments: label: D314
type_guessed: byte[8]
name: disassemble_data
arguments: label: D148
type_guessed: byte[8]
name: disassemble_data
arguments: label: D4
type_guessed: f64
name: disassemble_data
arguments: label: D231
type_guessed: f64
name: disassemble_data
arguments: label: D228
type_guessed: f64
name: disassemble_data
arguments: label: D341
type_guessed: f64
name: disassemble_data
arguments: label: D340
type_guessed: f64
name: disassemble_data
arguments: label: D192
type_guessed: f64
name: disassemble_data
arguments: label: D299
type_guessed: f64
name: disassemble_data
arguments: label: D177
type_guessed: f64
name: disassemble_data
arguments: label: D184
type_guessed: f64
name: disassemble_data
arguments: label: D344
type_guessed: f64
name: disassemble_data
arguments: label: D173
type_guessed: f64
name: disassemble_data
arguments: label: D131
type_guessed: f64
name: disassemble_data
arguments: label: D129
type_guessed: f64
name: disassemble_data
arguments: label: D294
type_guessed: f64
name: disassemble_data
arguments: label: D380
type_guessed: f64
name: disassemble_data
arguments: label: D6
type_guessed: f64
name: disassemble_data
arguments: label: D46
type_guessed: f64
name: disassemble_data
arguments: label: D24
type_guessed: f64
name: disassemble_data
arguments: label: D360
type_guessed: f64
name: disassemble_data
arguments: label: D82
type_guessed: f64
name: disassemble_data
arguments: label: D145
type_guessed: f64
name: disassemble_data
arguments: label: D378
type_guessed: f64
name: disassemble_data
arguments: label: D89
type_guessed: f64
name: disassemble_data
arguments: label: D381
type_guessed: f64
name: disassemble_data
arguments: label: D290
type_guessed: f64
name: disassemble_data
arguments: label: D285
type_guessed: f64
name: disassemble_data
arguments: label: D375
type_guessed: f64
name: disassemble_data
arguments: label: D300
type_guessed: f32[2]
name: disassemble_data
arguments: label: D308
type_guessed: f64

tool: {"D389": [0x67,0x0f,0x47,0xe0,0xe6,0xba,0xef,0xbf]}

tool: {"D81": [0x13,0x91,0x84,0x1b,0x1c,0x96,0xee,0xbf]}

tool: {"D165": [0x36,0xf3,0x3d,0x0c,0x33,0x90,0xec,0xbf]}

tool: {"D68": [0xb5,0x70,0x4d,0x76,0xf3,0xb7,0xe9,0xbf]}

tool: {"D295": [0x6f,0x5b,0xa0,0xdd,0x4c,0x22,0xe6,0xbf]}

tool: {"D273": [0x7d,0xf4,0x96,0x84,0xa4,0xe9,0xe1,0xbf]}

tool: {"D38": [0xdb,0xaa,0x24,0x8b,0x21,0x5a,0xda,0xbf]}

tool: {"D314": [0xe8,0x1a,0x6a,0x67,0xe7,0x1e,0xd0,0xbf]}

tool: {"D148": [0x09,0x40,0x88,0xb4,0xd0,0xb3,0xb5,0xbf]}

tool: D4: 0.0847750130417353

tool: D231: 0.25188622569150554

tool: D228: 0.41175116146284246

tool: D341: 0.5597708310739474

tool: D340: 0.6916870430603519

tool: D192: 0.8037049589725231

tool: D299: 0.8926024664975564

tool: D177: 0.9558239495713962

tool: D184: 0.9915651684209319

tool: D344: 0.021616013526480963

tool: D173: 0.049714548894972385

tool: D131: 0.0764257302548893

tool: D129: 0.10094204410628659

tool: D294: 0.12255520671147889

tool: D380: 0.14064291467065104

tool: D6: 0.15468467512626605

tool: D46: 0.16427648374583206

tool: D24: 0.16914238296314324

tool: D360: 0.169142382963143

tool: D82: 0.16427648374583295

tool: D145: 0.1546846751262658

tool: D378: 0.14064291467065093

tool: D89: 0.12255520671147752

tool: D381: 0.10094204410628753

tool: D290: 0.07642573025488848

tool: D285: 0.049714548894967854

tool: D375: 0.021616013526484387

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

tool: D308: 2

assistant: ```c
double bspline_quad(double *knots, int nknots, int m, int l, int r, int dl, int dr) {
  double *y;
  double qx[18] = {-0.9915651684209309, -0.95582394957139838, -0.89260246649755604, -0.80370495897252303, -0.69168704306035333, -0.55977083107394743, -0.41175116146284346, -0.25188622569150576, -0.084775013041735417, 0.084775013041735306, 0.25188622569150554, 0.41175116146284246, 0.55977083107394743, 0.69168704306035189, 0.80370495897252314, 0.89260246649755637, 0.95582394957139616, 0.9915651684209319};
  double qw[18] = {0.021616013526480963, 0.049714548894972385, 0.076425730254889301, 0.10094204410628659, 0.12255520671147889, 0.14064291467065104, 0.15468467512626605, 0.16427648374583206, 0.16914238296314324, 0.16914238296314299, 0.16427648374583295, 0.1546846751262658, 0.14064291467065093, 0.12255520671147752, 0.10094204410628753, 0.076425730254888483, 0.049714548894967854, 0.021616013526484387};
  double x[18];
  int nq = 18;
  int k, kk;
  int lower, upper;
  double result, a, b, partial;
  result = 0;
  lower = l - m - 1;
  if (lower < 0) {
    lower = 0;
  }
  upper = lower + 2 * m + 4;
  if (upper > nknots - 1) {
    upper = nknots - 1;
  }
  for (k = lower; k < upper; k++) {
    partial = 0.;
    a = knots[k];
    b = knots[k + 1];
    for (kk = 0; kk < nq; kk++) {
      x[kk] = (b - a) * (qx[kk] + 1) / 2. + a;
    }
    y = bspline_prod(x, nq, knots, nknots, m, l, r, dl, dr);
    for (kk = 0; kk < nq; kk++) {
      partial += y[kk] * qw[kk];
    }
    free(y);
    result += (b - a) * partial / 2.;
  }
  return (result);
}
```