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

```asm
<dtrset_lib>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edi,-0x24(%rbp)
  movsd  %xmm0,-0x30(%rbp)
  mov    %esi,-0x28(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %ecx,-0x3c(%rbp)
  movl   $0x4,-0xc(%rbp)
  mov    -0x24(%rbp),%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x28(%rbp),%eax
  cltd
  idivl  -0xc(%rbp)
  mov    -0xc(%rbp),%eax
  sub    %edx,%eax
  cltd
  idivl  -0xc(%rbp)
  mov    %edx,-0x4(%rbp)
  mov    -0x4(%rbp),%edx
  mov    -0x24(%rbp),%eax
  cmp    %eax,%edx
  cmovle %edx,%eax
  mov    %eax,-0x4(%rbp)
  movl   $0x0,-0x14(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  jle    L97
  jmp    L78
L34:
  movl   $0x0,-0x10(%rbp)
  jmp    L24
L55:
  mov    -0x10(%rbp),%eax
  imul   -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x10(%rbp)
L24:
  mov    -0x10(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jle    L55
  addq   $0x8,-0x38(%rbp)
  addl   $0x1,-0x14(%rbp)
L78:
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L34
  mov    -0x3c(%rbp),%eax
  sub    $0x1,%eax
  imul   -0xc(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rax,-0x38(%rbp)
  jmp    L97
L49:
  movl   $0x0,-0x10(%rbp)
  jmp    L45
L99:
  mov    -0x10(%rbp),%eax
  imul   -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  imul   -0xc(%rbp),%eax
  add    $0x1,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  imul   -0xc(%rbp),%eax
  add    $0x2,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  imul   -0xc(%rbp),%eax
  add    $0x3,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x10(%rbp)
L45:
  mov    -0x10(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jl     L99
  mov    -0x10(%rbp),%eax
  imul   -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  imul   -0xc(%rbp),%eax
  add    $0x1,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  imul   -0xc(%rbp),%eax
  add    $0x2,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  imul   -0xc(%rbp),%eax
  add    $0x3,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  add    $0x1,%eax
  imul   -0xc(%rbp),%eax
  add    $0x1,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  add    $0x1,%eax
  imul   -0xc(%rbp),%eax
  add    $0x2,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  add    $0x1,%eax
  imul   -0xc(%rbp),%eax
  add    $0x3,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  add    $0x2,%eax
  imul   -0xc(%rbp),%eax
  add    $0x2,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  add    $0x2,%eax
  imul   -0xc(%rbp),%eax
  add    $0x3,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  add    $0x3,%eax
  imul   -0xc(%rbp),%eax
  add    $0x3,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0xc(%rbp),%eax
  imul   -0x3c(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rax,-0x38(%rbp)
  addl   $0x4,-0x14(%rbp)
L97:
  mov    -0x24(%rbp),%eax
  sub    $0x3,%eax
  cmp    %eax,-0x14(%rbp)
  jl     L49
  jmp    L113
L48:
  movl   $0x0,-0x10(%rbp)
  jmp    L1
L70:
  mov    -0x10(%rbp),%eax
  imul   -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x10(%rbp)
L1:
  mov    -0x14(%rbp),%eax
  cmp    -0x10(%rbp),%eax
  jge    L70
  addq   $0x8,-0x38(%rbp)
  addl   $0x1,-0x14(%rbp)
L113:
  mov    -0x14(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jl     L48
  nop
  nop
  pop    %rbp
  ret
```

assistant: ```c
void dtrset_lib(int row, double alpha, int offset, double *pA, int sda) {
  const int bs = 4;
  int ii, jj;
  int col = row;
  int na = (bs - offset % bs) % bs;
  na = row < na ? row : na;
  ii = 0;
  if (na > 0) {
    for (; ii < na; ii++) {
      for (jj = 0; jj <= ii; jj++) {
        pA[jj * bs] = alpha;
      }
      pA += 1;
    }
    pA += bs * (sda - 1);
  }
  for (; ii < row - 3; ii += 4) {
    for (jj = 0; jj < ii; jj++) {
      pA[0 + jj * bs] = alpha;
      pA[1 + jj * bs] = alpha;
      pA[2 + jj * bs] = alpha;
      pA[3 + jj * bs] = alpha;
    }
    pA[0 + (jj + 0) * bs] = alpha;
    pA[1 + (jj + 0) * bs] = alpha;
    pA[2 + (jj + 0) * bs] = alpha;
    pA[3 + (jj + 0) * bs] = alpha;
    pA[1 + (jj + 1) * bs] = alpha;
    pA[2 + (jj + 1) * bs] = alpha;
    pA[3 + (jj + 1) * bs] = alpha;
    pA[2 + (jj + 2) * bs] = alpha;
    pA[3 + (jj + 2) * bs] = alpha;
    pA[3 + (jj + 3) * bs] = alpha;
    pA += bs * sda;
  }
  for (; ii < row; ii++) {
    for (jj = 0; jj < ii + 1; jj++) {
      pA[jj * bs] = alpha;
    }
    pA += 1;
  }
}
```