user: 请将以下的汇编代码转换成C语言代码:

```asm
<lu_backsub>:
  endbr64
  push   %r15
  mov    %rdi,%r8
  mov    %esi,%r9d
  push   %r14
  push   %r13
  push   %r12
  mov    %rdx,%r12
  mov    %rcx,%rdx
  lea    -0x1(%rsi),%ecx
  push   %rbp
  push   %rbx
  test   %esi,%esi
  jle    L127
  mov    %ecx,%r15d
  xor    %esi,%esi
  pxor   %xmm2,%xmm2
  mov    $0xffffffff,%r10d
  nopl   0x0(%rax)
L6:
  movslq (%r12,%rsi,4),%rax
  movsd  (%rdx,%rsi,8),%xmm1
  mov    %esi,%edi
  mov    %esi,%r11d
  lea    (%rdx,%rax,8),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm1,(%rax)
  cmp    $0xffffffff,%r10d
  jne    L158
  ucomisd %xmm2,%xmm0
  jp     L221
  je     L126
L221:
  mov    %r11d,%r10d
L126:
  movsd  %xmm0,(%rdx,%rsi,8)
  cmp    %r15,%rsi
  je     L162
  add    $0x1,%rsi
  jmp    L6
  nopw   0x0(%rax,%rax,1)
L158:
  cmp    %esi,%r10d
  jge    L245
  mov    %esi,%r14d
  mov    (%r8,%rsi,8),%rbp
  sub    %r10d,%r14d
  cmp    $0x1,%r14d
  je     L117
  movslq %r10d,%r11
  mov    %r14d,%ebx
  xor    %eax,%eax
  shl    $0x3,%r11
  shr    %ebx
  lea    0x0(%rbp,%r11,1),%r13
  shl    $0x4,%rbx
  add    %rdx,%r11
  nopl   0x0(%rax,%rax,1)
L229:
  movupd 0x0(%r13,%rax,1),%xmm1
  movupd (%r11,%rax,1),%xmm4
  add    $0x10,%rax
  mulpd  %xmm4,%xmm1
  subsd  %xmm1,%xmm0
  unpckhpd %xmm1,%xmm1
  subsd  %xmm1,%xmm0
  cmp    %rax,%rbx
  jne    L229
  mov    %r14d,%r11d
  and    $0xfffffffe,%r11d
  lea    (%r11,%r10,1),%eax
  cmp    %r11d,%r14d
  je     L245
L242:
  cltq
  movsd  0x0(%rbp,%rax,8),%xmm1
  mulsd  (%rdx,%rax,8),%xmm1
  subsd  %xmm1,%xmm0
L245:
  movsd  %xmm0,(%rdx,%rsi,8)
  add    $0x1,%edi
  cmp    %r15,%rsi
  je     L162
  movslq %r10d,%r14
  mov    %edi,%esi
  sub    %r10d,%edi
  shl    $0x3,%r14
  lea    (%rdx,%r14,1),%r13
L37:
  movslq (%r12,%rsi,4),%rax
  movsd  (%rdx,%rsi,8),%xmm1
  lea    (%rdx,%rax,8),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm1,(%rax)
  cmp    %esi,%r10d
  jge    L154
  mov    (%r8,%rsi,8),%rbx
  cmp    $0x1,%edi
  je     L142
  mov    %edi,%r11d
  lea    (%rbx,%r14,1),%rbp
  xor    %eax,%eax
  shr    %r11d
  shl    $0x4,%r11
  nopw   0x0(%rax,%rax,1)
L22:
  movupd 0x0(%rbp,%rax,1),%xmm1
  movupd 0x0(%r13,%rax,1),%xmm5
  add    $0x10,%rax
  mulpd  %xmm5,%xmm1
  subsd  %xmm1,%xmm0
  unpckhpd %xmm1,%xmm1
  subsd  %xmm1,%xmm0
  cmp    %r11,%rax
  jne    L22
  mov    %edi,%r11d
  and    $0xfffffffe,%r11d
  lea    (%r11,%r10,1),%eax
  cmp    %r11d,%edi
  je     L154
L60:
  cltq
  movsd  (%rbx,%rax,8),%xmm1
  mulsd  (%rdx,%rax,8),%xmm1
  subsd  %xmm1,%xmm0
L154:
  movsd  %xmm0,(%rdx,%rsi,8)
  add    $0x1,%rsi
  add    $0x1,%edi
  cmp    %esi,%r9d
  jg     L37
L162:
  movslq %ecx,%rcx
  mov    %r9d,%edi
  lea    0x8(%rdx),%r11
  xor    %r10d,%r10d
  lea    0x0(,%rcx,8),%rsi
L121:
  movsd  (%rdx,%rsi,1),%xmm0
  mov    (%r8,%rsi,1),%rbx
  mov    %edi,%eax
  cmp    %edi,%r9d
  jle    L86
  cmp    $0x1,%r10d
  je     L228
  mov    %r10d,%ecx
  lea    0x8(%rbx,%rsi,1),%r12
  lea    (%r11,%rsi,1),%rbp
  xor    %eax,%eax
  shr    %ecx
  shl    $0x4,%rcx
  nopw   0x0(%rax,%rax,1)
L141:
  movupd 0x0(%rbp,%rax,1),%xmm1
  movupd (%r12,%rax,1),%xmm3
  add    $0x10,%rax
  mulpd  %xmm3,%xmm1
  subsd  %xmm1,%xmm0
  unpckhpd %xmm1,%xmm1
  subsd  %xmm1,%xmm0
  cmp    %rax,%rcx
  jne    L141
  mov    %r10d,%ecx
  and    $0xfffffffe,%ecx
  lea    (%rdi,%rcx,1),%eax
  cmp    %ecx,%r10d
  je     L86
L228:
  cltq
  movsd  (%rdx,%rax,8),%xmm1
  mulsd  (%rbx,%rax,8),%xmm1
  subsd  %xmm1,%xmm0
L86:
  divsd  (%rbx,%rsi,1),%xmm0
  add    $0x1,%r10d
  movsd  %xmm0,(%rdx,%rsi,1)
  lea    -0x1(%rdi),%eax
  sub    $0x8,%rsi
  sub    $0x2,%edi
  js     L164
  mov    %eax,%edi
  jmp    L121
L127:
  test   %ecx,%ecx
  jns    L162
L164:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L117:
  mov    %r10d,%eax
  jmp    L242
L142:
  mov    %r10d,%eax
  jmp    L60
```

assistant: ```c
void lu_backsub(double **a, int n, int *pivx, double *b) {
  int i, j;
  int nvi;
  for (nvi = -1, i = 0; i < n; i++) {
    int px;
    double sum;
    px = pivx[i];
    sum = b[px];
    b[px] = b[i];
    if (nvi >= 0) {
      for (j = nvi; j < i; j++)
        sum -= a[i][j] * b[j];
    } else {
      if (sum != 0.0)
        nvi = i;
    }
    b[i] = sum;
  }
  for (i = (n - 1); i >= 0; i--) {
    double sum;
    sum = b[i];
    for (j = i + 1; j < n; j++)
      sum -= a[i][j] * b[j];
    b[i] = sum / a[i][i];
  }
}
```