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

```asm
<hpsort_double_doublematrix>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x70,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %rsi,-0x60(%rbp)
  mov    %rdx,-0x68(%rbp)
  mov    %rcx,-0x70(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    %rsp,%rax
  mov    %rax,%rsi
  mov    -0x60(%rbp),%rax
  mov    %rax,%rdx
  sub    $0x1,%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %rax,%r10
  mov    $0x0,%r11d
  mov    %rax,%r8
  mov    $0x0,%r9d
  lea    0x0(,%rax,8),%rdx
  mov    $0x10,%eax
  sub    $0x1,%rax
  add    %rdx,%rax
  mov    $0x10,%edi
  mov    $0x0,%edx
  div    %rdi
  imul   $0x10,%rax,%rax
  mov    %rax,%rcx
  and    $0xfffffffffffff000,%rcx
  mov    %rsp,%rdx
  sub    %rcx,%rdx
L83:
  cmp    %rdx,%rsp
  je     L8
  sub    $0x1000,%rsp
  orq    $0x0,0xff8(%rsp)
  jmp    L83
L8:
  mov    %rax,%rdx
  and    $0xfff,%edx
  sub    %rdx,%rsp
  mov    %rax,%rdx
  and    $0xfff,%edx
  test   %rdx,%rdx
  je     L177
  and    $0xfff,%eax
  sub    $0x8,%rax
  add    %rsp,%rax
  orq    $0x0,(%rax)
L177:
  mov    %rsp,%rax
  add    $0x7,%rax
  shr    $0x3,%rax
  shl    $0x3,%rax
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x58(%rbp)
  jne    L248
  mov    %rsi,%rsp
  jmp    L110
L248:
  mov    -0x58(%rbp),%rax
  shr    %rax
  add    $0x1,%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x58(%rbp),%rax
  mov    %rax,-0x40(%rbp)
L202:
  cmpq   $0x1,-0x30(%rbp)
  jbe    L53
  subq   $0x1,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movq   $0x0,-0x28(%rbp)
  jmp    L30
L142:
  mov    -0x30(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x10(%rbp),%rax
  mov    -0x28(%rbp),%rdx
  movsd  %xmm0,(%rax,%rdx,8)
  addq   $0x1,-0x28(%rbp)
L30:
  mov    -0x28(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jb     L142
  jmp    L198
L53:
  mov    -0x40(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movq   $0x0,-0x28(%rbp)
  jmp    L201
L3:
  mov    -0x40(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x10(%rbp),%rax
  mov    -0x28(%rbp),%rdx
  movsd  %xmm0,(%rax,%rdx,8)
  addq   $0x1,-0x28(%rbp)
L201:
  mov    -0x28(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jb     L3
  mov    -0x40(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rax,%rdx
  mov    -0x68(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,(%rdx)
  movq   $0x0,-0x28(%rbp)
  jmp    L70
L69:
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  shl    $0x3,%rax
  add    %rax,%rdx
  mov    -0x40(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rcx
  mov    -0x70(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rcx
  mov    -0x28(%rbp),%rax
  shl    $0x3,%rax
  add    %rcx,%rax
  movsd  (%rdx),%xmm0
  movsd  %xmm0,(%rax)
  addq   $0x1,-0x28(%rbp)
L70:
  mov    -0x28(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jb     L69
  subq   $0x1,-0x40(%rbp)
  cmpq   $0x1,-0x40(%rbp)
  jne    L198
  mov    -0x68(%rbp),%rax
  movsd  -0x20(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  movq   $0x0,-0x28(%rbp)
  jmp    L120
L175:
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  shl    $0x3,%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x10(%rbp),%rax
  mov    -0x28(%rbp),%rdx
  movsd  (%rax,%rdx,8),%xmm0
  movsd  %xmm0,(%rcx)
  addq   $0x1,-0x28(%rbp)
L120:
  mov    -0x28(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jb     L175
  jmp    L56
L198:
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  jmp    L143
L250:
  mov    -0x38(%rbp),%rax
  cmp    -0x40(%rbp),%rax
  jae    L195
  mov    -0x38(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x38(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd %xmm1,%xmm0
  jbe    L195
  addq   $0x1,-0x38(%rbp)
L195:
  mov    -0x38(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  comisd -0x20(%rbp),%xmm0
  jbe    L61
  mov    -0x38(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rax,%rdx
  mov    -0x48(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rcx
  mov    -0x68(%rbp),%rax
  add    %rcx,%rax
  movsd  (%rdx),%xmm0
  movsd  %xmm0,(%rax)
  movq   $0x0,-0x28(%rbp)
  jmp    L281
L157:
  mov    -0x38(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  shl    $0x3,%rax
  add    %rax,%rdx
  mov    -0x48(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rcx
  mov    -0x70(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rcx
  mov    -0x28(%rbp),%rax
  shl    $0x3,%rax
  add    %rcx,%rax
  movsd  (%rdx),%xmm0
  movsd  %xmm0,(%rax)
  addq   $0x1,-0x28(%rbp)
L281:
  mov    -0x28(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jb     L157
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  shlq   -0x38(%rbp)
  jmp    L143
L61:
  mov    -0x40(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x38(%rbp)
L143:
  mov    -0x38(%rbp),%rax
  cmp    -0x40(%rbp),%rax
  jbe    L250
  mov    -0x48(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x20(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  movq   $0x0,-0x28(%rbp)
  jmp    L113
L209:
  mov    -0x48(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  shl    $0x3,%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x10(%rbp),%rax
  mov    -0x28(%rbp),%rdx
  movsd  (%rax,%rdx,8),%xmm0
  movsd  %xmm0,(%rcx)
  addq   $0x1,-0x28(%rbp)
L113:
  mov    -0x28(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jb     L209
  jmp    L202
L56:
  mov    %rsi,%rsp
L110:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L21
  call   <__stack_chk_fail@plt>
L21:
  leave
  ret
```

assistant: ```c
void hpsort_double_doublematrix(unsigned long n, unsigned long nmat, double ra[], double **ra2) {
  unsigned long i, ir, j, l;
  unsigned long iaux;
  double rra;
  double rra2[nmat];
  if (n < 1)
    return;
  l = (n >> 1) + 1;
  ir = n;
  for (;;) {
    if (l > 1) {
      rra = ra[--l - 1];
      for (iaux = 0; iaux < nmat; iaux++) {
        rra2[iaux] = ra2[l - 1][iaux];
      }
    } else {
      rra = ra[ir - 1];
      for (iaux = 0; iaux < nmat; iaux++) {
        rra2[iaux] = ra2[ir - 1][iaux];
      }
      ra[ir - 1] = ra[0];
      for (iaux = 0; iaux < nmat; iaux++) {
        ra2[ir - 1][iaux] = ra2[0][iaux];
      }
      if (--ir == 1) {
        ra[0] = rra;
        for (iaux = 0; iaux < nmat; iaux++) {
          ra2[0][iaux] = rra2[iaux];
        }
        break;
      }
    }
    i = l;
    j = l;
    while (j <= ir) {
      if (j < ir && ra[j - 1] < ra[j])
        j++;
      if (rra < ra[j - 1]) {
        ra[i - 1] = ra[j - 1];
        for (iaux = 0; iaux < nmat; iaux++) {
          ra2[i - 1][iaux] = ra2[j - 1][iaux];
        }
        i = j;
        j <<= 1;
      } else
        j = ir + 1;
    }
    ra[i - 1] = rra;
    for (iaux = 0; iaux < nmat; iaux++) {
      ra2[i - 1][iaux] = rra2[iaux];
    }
  }
}
```