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

```asm
<denseGETRS>:
  endbr64
  mov    %rsi,%r10
  mov    %rcx,%rax
  sub    $0x1,%rsi
  xor    %ecx,%ecx
  test   %r10,%r10
  je     L219
  nopl   (%rax)
L25:
  mov    (%rdx,%rcx,8),%r8
  cmp    %rcx,%r8
  je     L97
  lea    (%rax,%r8,8),%r8
  movsd  (%rax,%rcx,8),%xmm0
  movsd  (%r8),%xmm1
  movsd  %xmm1,(%rax,%rcx,8)
  add    $0x1,%rcx
  movsd  %xmm0,(%r8)
  cmp    %rcx,%r10
  jne    L25
  test   %rsi,%rsi
  je     L182
L219:
  push   %r13
  lea    0x8(%rax),%r8
  xor    %r11d,%r11d
  push   %r12
  mov    %r8,%rcx
  push   %rbp
  mov    $0x8,%ebp
  push   %rbx
  sub    %rax,%rbp
  mov    %rsi,%rbx
  nopw   0x0(%rax,%rax,1)
L90:
  mov    (%rdi,%r11,8),%r12
  add    $0x1,%r11
  cmp    %r11,%r10
  jbe    L136
  lea    0x0(%rbp,%rcx,1),%rdx
  lea    0x0(,%r11,8),%r9
  add    %r12,%rdx
  cmp    %rdx,%rcx
  je     L99
  cmp    $0x1,%rbx
  je     L99
  movsd  -0x8(%rcx),%xmm2
  mov    %rbx,%r13
  add    %r12,%r9
  xor    %edx,%edx
  shr    %r13
  unpcklpd %xmm2,%xmm2
  shl    $0x4,%r13
  nopl   0x0(%rax)
L104:
  movupd (%r9,%rdx,1),%xmm1
  movupd (%rcx,%rdx,1),%xmm0
  mulpd  %xmm2,%xmm1
  subpd  %xmm1,%xmm0
  movups %xmm0,(%rcx,%rdx,1)
  add    $0x10,%rdx
  cmp    %r13,%rdx
  jne    L104
  mov    %rbx,%rdx
  and    $0xfffffffffffffffe,%rdx
  lea    (%r11,%rdx,1),%r9
  cmp    %rdx,%rbx
  je     L136
  movsd  (%r12,%r9,8),%xmm1
  mulsd  -0x8(%rcx),%xmm1
  lea    (%rax,%r9,8),%rdx
  movsd  (%rdx),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%rdx)
L136:
  add    $0x8,%rcx
  sub    $0x1,%rbx
  cmp    %rsi,%r11
  jb     L90
  sub    $0x2,%r10
  lea    (%rax,%rsi,8),%r9
  nopl   0x0(%rax)
L17:
  mov    (%rdi,%rsi,8),%rcx
  movsd  (%r9),%xmm0
  divsd  (%rcx,%rsi,8),%xmm0
  movsd  %xmm0,(%r9)
  mulsd  (%rcx),%xmm0
  movsd  (%rax),%xmm1
  subsd  %xmm0,%xmm1
  movsd  %xmm1,(%rax)
  cmp    $0x1,%rsi
  jbe    L75
  lea    0x10(%rcx),%rdx
  cmp    %rdx,%r8
  je     L116
  cmp    $0x2,%rsi
  je     L116
  mov    %r10,%r11
  movsd  (%r9),%xmm2
  mov    $0x8,%edx
  shr    %r11
  shl    $0x4,%r11
  unpcklpd %xmm2,%xmm2
  add    $0x8,%r11
  nopl   0x0(%rax,%rax,1)
L22:
  movupd (%rcx,%rdx,1),%xmm1
  movupd (%rax,%rdx,1),%xmm0
  mulpd  %xmm2,%xmm1
  subpd  %xmm1,%xmm0
  movups %xmm0,(%rax,%rdx,1)
  add    $0x10,%rdx
  cmp    %r11,%rdx
  jne    L22
  mov    %r10,%r11
  or     $0x1,%r11
  test   $0x1,%r10b
  je     L23
  movsd  (%rcx,%r11,8),%xmm1
  mulsd  (%r9),%xmm1
  lea    (%rax,%r11,8),%rdx
  movsd  (%rdx),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%rdx)
L23:
  sub    $0x1,%rsi
  sub    $0x1,%r10
  sub    $0x8,%r9
  jmp    L17
  nopl   0x0(%rax,%rax,1)
L97:
  add    $0x1,%rcx
  cmp    %rcx,%r10
  jne    L25
  test   %rsi,%rsi
  jne    L219
L182:
  mov    (%rdi),%rdx
  movsd  (%rax),%xmm1
  divsd  (%rdx),%xmm1
  movsd  %xmm1,(%rax)
  ret
  cs nopw 0x0(%rax,%rax,1)
L99:
  mov    %r11,%rdx
  nopl   0x0(%rax,%rax,1)
L146:
  movsd  -0x8(%rcx),%xmm1
  mulsd  (%r12,%rdx,8),%xmm1
  movsd  (%rax,%rdx,8),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax,%rdx,8)
  add    $0x1,%rdx
  cmp    %rdx,%r10
  jne    L146
  jmp    L136
  nop
L116:
  mov    $0x1,%edx
  nopl   (%rax)
L93:
  movsd  (%rcx,%rdx,8),%xmm1
  mulsd  (%r9),%xmm1
  movsd  (%rax,%rdx,8),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax,%rdx,8)
  add    $0x1,%rdx
  cmp    %rdx,%rsi
  jne    L93
  jmp    L23
  xchg   %ax,%ax
L75:
  mov    (%rdi),%rdx
  pop    %rbx
  pop    %rbp
  pop    %r12
  divsd  (%rdx),%xmm1
  pop    %r13
  movsd  %xmm1,(%rax)
  ret
```

assistant: ```c
void denseGETRS(double **a, size_t n, long int *p, double *b) {
  size_t i, pk;
  double *col_k, tmp;
  for (size_t k = 0; k < n; k++) {
    pk = (size_t)p[k];
    if (pk != k) {
      tmp = b[k];
      b[k] = b[pk];
      b[pk] = tmp;
    }
  }
  for (size_t k = 0; k < n - 1; k++) {
    col_k = a[k];
    for (i = k + 1; i < n; i++)
      b[i] -= col_k[i] * b[k];
  }
  for (size_t k = n - 1; k > 0; k--) {
    col_k = a[k];
    b[k] /= col_k[k];
    for (i = 0; i < k; i++)
      b[i] -= col_k[i] * b[k];
  }
  b[0] /= a[0][0];
}
```