user: What is the c source code of the assembly code below:

```asm
<linreg>:
  endbr64
  pxor   %xmm7,%xmm7
  sub    $0x18,%rsp
  pxor   %xmm3,%xmm3
  movsd  (%rsi),%xmm1
  cvtsi2sd %edx,%xmm7
  movq   $0x0,(%r8)
  test   %edx,%edx
  jle    L73
  movslq %edx,%rdx
  movapd %xmm3,%xmm8
  movapd %xmm3,%xmm2
  xor    %eax,%eax
  movapd %xmm3,%xmm6
  nopl   0x0(%rax)
L57:
  movsd  (%rsi,%rax,8),%xmm0
  addsd  (%rdi,%rax,8),%xmm6
  add    $0x1,%rax
  movapd %xmm0,%xmm5
  addsd  %xmm0,%xmm2
  maxsd  %xmm8,%xmm0
  minsd  %xmm1,%xmm5
  movapd %xmm0,%xmm8
  movapd %xmm5,%xmm1
  cmp    %rax,%rdx
  jne    L57
  movapd %xmm2,%xmm5
  movapd %xmm6,%xmm4
  mov    0x28(%rsp),%rax
  movapd %xmm3,%xmm8
  divsd  %xmm7,%xmm5
  divsd  %xmm7,%xmm4
  movsd  %xmm5,(%rax)
  mov    0x20(%rsp),%rax
  movsd  %xmm1,(%r9)
  movsd  %xmm0,(%rax)
  movsd  (%r8),%xmm1
  xor    %eax,%eax
L51:
  movsd  (%rdi,%rax,8),%xmm0
  subsd  %xmm4,%xmm0
  movapd %xmm0,%xmm9
  mulsd  %xmm0,%xmm9
  mulsd  (%rsi,%rax,8),%xmm0
  add    $0x1,%rax
  addsd  %xmm9,%xmm8
  addsd  %xmm0,%xmm1
  movsd  %xmm1,(%r8)
  cmp    %rax,%rdx
  jne    L51
  divsd  %xmm8,%xmm1
  xor    %eax,%eax
  movapd %xmm3,%xmm0
  movsd  %xmm1,(%r8)
  mulsd  %xmm6,%xmm1
  movapd %xmm3,%xmm6
  subsd  %xmm1,%xmm2
  divsd  %xmm7,%xmm2
  movapd %xmm3,%xmm7
  movsd  %xmm2,(%rcx)
  nopw   0x0(%rax,%rax,1)
L2:
  movsd  (%rdi,%rax,8),%xmm2
  movsd  (%rsi,%rax,8),%xmm1
  add    $0x1,%rax
  subsd  %xmm4,%xmm2
  subsd  %xmm5,%xmm1
  movapd %xmm2,%xmm8
  mulsd  %xmm1,%xmm8
  mulsd  %xmm2,%xmm2
  mulsd  %xmm1,%xmm1
  addsd  %xmm8,%xmm7
  addsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm6
  cmp    %rax,%rdx
  jne    L2
  ucomisd %xmm0,%xmm3
  ja     L24
L48:
  movapd %xmm0,%xmm1
  sqrtsd %xmm1,%xmm1
L67:
  ucomisd %xmm6,%xmm3
  ja     L26
  sqrtsd %xmm6,%xmm6
L14:
  mulsd  %xmm6,%xmm1
  mov    0x30(%rsp),%rax
  divsd  %xmm1,%xmm7
  movsd  %xmm7,(%rax)
  add    $0x18,%rsp
  ret
L73:
  movapd %xmm3,%xmm0
  mov    0x28(%rsp),%rax
  movapd %xmm3,%xmm6
  divsd  %xmm7,%xmm0
  movsd  %xmm0,(%rax)
  mov    0x20(%rsp),%rax
  movsd  %xmm1,(%r9)
  movapd %xmm3,%xmm1
  movq   $0x0,(%rax)
  movsd  (%r8),%xmm0
  divsd  %xmm3,%xmm0
  movsd  %xmm0,(%r8)
  mulsd  %xmm3,%xmm0
  subsd  %xmm0,%xmm1
  movapd %xmm3,%xmm0
  divsd  %xmm7,%xmm1
  movapd %xmm3,%xmm7
  movsd  %xmm1,(%rcx)
  jmp    L48
L24:
  movsd  %xmm6,0x8(%rsp)
  movsd  %xmm7,(%rsp)
  call   <sqrt@plt>
  movsd  0x8(%rsp),%xmm6
  movsd  (%rsp),%xmm7
  pxor   %xmm3,%xmm3
  movapd %xmm0,%xmm1
  jmp    L67
L26:
  movapd %xmm6,%xmm0
  movsd  %xmm7,0x8(%rsp)
  movsd  %xmm1,(%rsp)
  call   <sqrt@plt>
  movsd  0x8(%rsp),%xmm7
  movsd  (%rsp),%xmm1
  movapd %xmm0,%xmm6
  jmp    L14
```

assistant: ```c
void linreg(double *x, double *y, int nitems, double *a, double *b, double *minp, double *maxp, double *meanp, double *r) {
  double sx = 0.0;
  double sy = 0.0;
  double st2 = 0.0;
  double min = y[0];
  double max = 0.0;
  double ss, meanx, meany, t;
  double errx, erry, prodsum, sqerrx, sqerry;
  int i;
  *b = 0.0;
  for (i = 0; i < nitems; i++) {
    sx += x[i];
    sy += y[i];
    if (y[i] < min)
      min = y[i];
    if (y[i] > max)
      max = y[i];
  }
  ss = nitems;
  meanx = sx / ss;
  meany = *meanp = sy / ss;
  *minp = min;
  *maxp = max;
  for (i = 0; i < nitems; i++) {
    t = x[i] - meanx;
    st2 += t * t;
    *b += t * y[i];
  }
  *b /= st2;
  *a = (sy - sx * (*b)) / ss;
  prodsum = 0.0;
  sqerrx = 0.0;
  sqerry = 0.0;
  for (i = 0; i < nitems; i++) {
    errx = x[i] - meanx;
    erry = y[i] - meany;
    prodsum += errx * erry;
    sqerrx += errx * errx;
    sqerry += erry * erry;
  }
  *r = prodsum / (sqrt(sqerrx) * sqrt(sqerry));
}
```