user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<oncopy_4>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x68,%rsp
  mov    %edi,-0xc4(%rbp)
  mov    %esi,-0xc8(%rbp)
  mov    %rdx,-0xd0(%rbp)
  mov    %ecx,-0xd4(%rbp)
  mov    %r8,-0xe0(%rbp)
  mov    -0xd0(%rbp),%rax
  mov    %rax,-0xb0(%rbp)
  mov    -0xe0(%rbp),%rax
  mov    %rax,-0x88(%rbp)
  mov    -0xc8(%rbp),%eax
  sar    $0x2,%eax
  mov    %eax,-0xb4(%rbp)
  cmpl   $0x0,-0xb4(%rbp)
  jle    L12
L7:
  mov    -0xb0(%rbp),%rax
  mov    %rax,-0xa8(%rbp)
  mov    -0xd4(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0xa8(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0xa0(%rbp)
  mov    -0xd4(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0xa0(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x98(%rbp)
  mov    -0xd4(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x90(%rbp)
  mov    -0xd4(%rbp),%eax
  shl    $0x2,%eax
  cltq
  shl    $0x3,%rax
  add    %rax,-0xb0(%rbp)
  mov    -0xc4(%rbp),%eax
  sar    $0x2,%eax
  mov    %eax,-0xb8(%rbp)
  cmpl   $0x0,-0xb8(%rbp)
  jle    L16
L95:
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  mov    -0xa8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x78(%rbp)
  mov    -0xa8(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x70(%rbp)
  mov    -0xa8(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x68(%rbp)
  mov    -0xa0(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x60(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x50(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x48(%rbp)
  mov    -0x98(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  mov    -0x98(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x38(%rbp)
  mov    -0x98(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x30(%rbp)
  mov    -0x98(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  mov    -0x90(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  mov    -0x90(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x18(%rbp)
  mov    -0x90(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  mov    -0x90(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  mov    -0x88(%rbp),%rax
  movsd  -0x80(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x8,%rax
  movsd  -0x60(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x10,%rax
  movsd  -0x40(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x18,%rax
  movsd  -0x20(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x20,%rax
  movsd  -0x78(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x28,%rax
  movsd  -0x58(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x30,%rax
  movsd  -0x38(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x38,%rax
  movsd  -0x18(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x40,%rax
  movsd  -0x70(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x48,%rax
  movsd  -0x50(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x50,%rax
  movsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x58,%rax
  movsd  -0x10(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x60,%rax
  movsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x68,%rax
  movsd  -0x48(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x70,%rax
  movsd  -0x28(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x78,%rax
  movsd  -0x8(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addq   $0x20,-0xa8(%rbp)
  addq   $0x20,-0xa0(%rbp)
  addq   $0x20,-0x98(%rbp)
  addq   $0x20,-0x90(%rbp)
  subq   $0xffffffffffffff80,-0x88(%rbp)
  subl   $0x1,-0xb8(%rbp)
  cmpl   $0x0,-0xb8(%rbp)
  jg     L95
L16:
  mov    -0xc4(%rbp),%eax
  and    $0x3,%eax
  mov    %eax,-0xb8(%rbp)
  cmpl   $0x0,-0xb8(%rbp)
  jle    L109
L97:
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  mov    -0xa0(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x60(%rbp)
  mov    -0x98(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  mov    -0x90(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  mov    -0x88(%rbp),%rax
  movsd  -0x80(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x8,%rax
  movsd  -0x60(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x10,%rax
  movsd  -0x40(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x18,%rax
  movsd  -0x20(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addq   $0x8,-0xa8(%rbp)
  addq   $0x8,-0xa0(%rbp)
  addq   $0x8,-0x98(%rbp)
  addq   $0x8,-0x90(%rbp)
  addq   $0x20,-0x88(%rbp)
  subl   $0x1,-0xb8(%rbp)
  cmpl   $0x0,-0xb8(%rbp)
  jg     L97
L109:
  subl   $0x1,-0xb4(%rbp)
  cmpl   $0x0,-0xb4(%rbp)
  jg     L7
L12:
  mov    -0xc8(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L31
  mov    -0xb0(%rbp),%rax
  mov    %rax,-0xa8(%rbp)
  mov    -0xd4(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0xa8(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0xa0(%rbp)
  mov    -0xd4(%rbp),%eax
  add    %eax,%eax
  cltq
  shl    $0x3,%rax
  add    %rax,-0xb0(%rbp)
  mov    -0xc4(%rbp),%eax
  sar    $0x2,%eax
  mov    %eax,-0xb8(%rbp)
  cmpl   $0x0,-0xb8(%rbp)
  jle    L119
L158:
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  mov    -0xa8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x78(%rbp)
  mov    -0xa8(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x70(%rbp)
  mov    -0xa8(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x68(%rbp)
  mov    -0xa0(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x60(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x50(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x48(%rbp)
  mov    -0x88(%rbp),%rax
  movsd  -0x80(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x8,%rax
  movsd  -0x60(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x10,%rax
  movsd  -0x78(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x18,%rax
  movsd  -0x58(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x20,%rax
  movsd  -0x70(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x28,%rax
  movsd  -0x50(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x30,%rax
  movsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x38,%rax
  movsd  -0x48(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addq   $0x20,-0xa8(%rbp)
  addq   $0x20,-0xa0(%rbp)
  addq   $0x40,-0x88(%rbp)
  subl   $0x1,-0xb8(%rbp)
  cmpl   $0x0,-0xb8(%rbp)
  jg     L158
L119:
  mov    -0xc4(%rbp),%eax
  and    $0x3,%eax
  mov    %eax,-0xb8(%rbp)
  cmpl   $0x0,-0xb8(%rbp)
  jle    L31
L89:
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  mov    -0xa0(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x60(%rbp)
  mov    -0x88(%rbp),%rax
  movsd  -0x80(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x8,%rax
  movsd  -0x60(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addq   $0x8,-0xa8(%rbp)
  addq   $0x8,-0xa0(%rbp)
  addq   $0x10,-0x88(%rbp)
  subl   $0x1,-0xb8(%rbp)
  cmpl   $0x0,-0xb8(%rbp)
  jg     L89
L31:
  mov    -0xc8(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L112
  mov    -0xb0(%rbp),%rax
  mov    %rax,-0xa8(%rbp)
  mov    -0xc4(%rbp),%eax
  sar    $0x2,%eax
  mov    %eax,-0xb8(%rbp)
  cmpl   $0x0,-0xb8(%rbp)
  jle    L83
L58:
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  mov    -0xa8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x78(%rbp)
  mov    -0xa8(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x70(%rbp)
  mov    -0xa8(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x68(%rbp)
  mov    -0x88(%rbp),%rax
  movsd  -0x80(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x8,%rax
  movsd  -0x78(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x10,%rax
  movsd  -0x70(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x88(%rbp),%rax
  add    $0x18,%rax
  movsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addq   $0x20,-0xa8(%rbp)
  addq   $0x20,-0x88(%rbp)
  subl   $0x1,-0xb8(%rbp)
  cmpl   $0x0,-0xb8(%rbp)
  jg     L58
L83:
  mov    -0xc4(%rbp),%eax
  and    $0x3,%eax
  mov    %eax,-0xb8(%rbp)
  cmpl   $0x0,-0xb8(%rbp)
  jle    L112
L100:
  mov    -0xa8(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  mov    -0x88(%rbp),%rax
  movsd  -0x80(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addq   $0x8,-0xa8(%rbp)
  addq   $0x8,-0x88(%rbp)
  subl   $0x1,-0xb8(%rbp)
  cmpl   $0x0,-0xb8(%rbp)
  jg     L100
L112:
  mov    $0x0,%eax
  leave
  ret
```

assistant: ```c
int oncopy_4(int m, int n, const double *a, int lda, double *b) {
  int i, j;
  const double *a_offset, *a_offset1, *a_offset2, *a_offset3, *a_offset4;
  double *b_offset;
  double ctemp1, ctemp2, ctemp3, ctemp4;
  double ctemp5, ctemp6, ctemp7, ctemp8;
  double ctemp9, ctemp10, ctemp11, ctemp12;
  double ctemp13, ctemp14, ctemp15, ctemp16;
  a_offset = a;
  b_offset = b;
  j = (n >> 2);
  if (j > 0) {
    do {
      a_offset1 = a_offset;
      a_offset2 = a_offset1 + lda;
      a_offset3 = a_offset2 + lda;
      a_offset4 = a_offset3 + lda;
      a_offset += 4 * lda;
      i = (m >> 2);
      if (i > 0) {
        do {
          ctemp1 = *(a_offset1 + 0);
          ctemp2 = *(a_offset1 + 1);
          ctemp3 = *(a_offset1 + 2);
          ctemp4 = *(a_offset1 + 3);
          ctemp5 = *(a_offset2 + 0);
          ctemp6 = *(a_offset2 + 1);
          ctemp7 = *(a_offset2 + 2);
          ctemp8 = *(a_offset2 + 3);
          ctemp9 = *(a_offset3 + 0);
          ctemp10 = *(a_offset3 + 1);
          ctemp11 = *(a_offset3 + 2);
          ctemp12 = *(a_offset3 + 3);
          ctemp13 = *(a_offset4 + 0);
          ctemp14 = *(a_offset4 + 1);
          ctemp15 = *(a_offset4 + 2);
          ctemp16 = *(a_offset4 + 3);
          *(b_offset + 0) = ctemp1;
          *(b_offset + 1) = ctemp5;
          *(b_offset + 2) = ctemp9;
          *(b_offset + 3) = ctemp13;
          *(b_offset + 4) = ctemp2;
          *(b_offset + 5) = ctemp6;
          *(b_offset + 6) = ctemp10;
          *(b_offset + 7) = ctemp14;
          *(b_offset + 8) = ctemp3;
          *(b_offset + 9) = ctemp7;
          *(b_offset + 10) = ctemp11;
          *(b_offset + 11) = ctemp15;
          *(b_offset + 12) = ctemp4;
          *(b_offset + 13) = ctemp8;
          *(b_offset + 14) = ctemp12;
          *(b_offset + 15) = ctemp16;
          a_offset1 += 4;
          a_offset2 += 4;
          a_offset3 += 4;
          a_offset4 += 4;
          b_offset += 16;
          i--;
        } while (i > 0);
      }
      i = (m & 3);
      if (i > 0) {
        do {
          ctemp1 = *(a_offset1 + 0);
          ctemp5 = *(a_offset2 + 0);
          ctemp9 = *(a_offset3 + 0);
          ctemp13 = *(a_offset4 + 0);
          *(b_offset + 0) = ctemp1;
          *(b_offset + 1) = ctemp5;
          *(b_offset + 2) = ctemp9;
          *(b_offset + 3) = ctemp13;
          a_offset1++;
          a_offset2++;
          a_offset3++;
          a_offset4++;
          b_offset += 4;
          i--;
        } while (i > 0);
      }
      j--;
    } while (j > 0);
  }
  if (n & 2) {
    a_offset1 = a_offset;
    a_offset2 = a_offset1 + lda;
    a_offset += 2 * lda;
    i = (m >> 2);
    if (i > 0) {
      do {
        ctemp1 = *(a_offset1 + 0);
        ctemp2 = *(a_offset1 + 1);
        ctemp3 = *(a_offset1 + 2);
        ctemp4 = *(a_offset1 + 3);
        ctemp5 = *(a_offset2 + 0);
        ctemp6 = *(a_offset2 + 1);
        ctemp7 = *(a_offset2 + 2);
        ctemp8 = *(a_offset2 + 3);
        *(b_offset + 0) = ctemp1;
        *(b_offset + 1) = ctemp5;
        *(b_offset + 2) = ctemp2;
        *(b_offset + 3) = ctemp6;
        *(b_offset + 4) = ctemp3;
        *(b_offset + 5) = ctemp7;
        *(b_offset + 6) = ctemp4;
        *(b_offset + 7) = ctemp8;
        a_offset1 += 4;
        a_offset2 += 4;
        b_offset += 8;
        i--;
      } while (i > 0);
    }
    i = (m & 3);
    if (i > 0) {
      do {
        ctemp1 = *(a_offset1 + 0);
        ctemp5 = *(a_offset2 + 0);
        *(b_offset + 0) = ctemp1;
        *(b_offset + 1) = ctemp5;
        a_offset1++;
        a_offset2++;
        b_offset += 2;
        i--;
      } while (i > 0);
    }
  }
  if (n & 1) {
    a_offset1 = a_offset;
    i = (m >> 2);
    if (i > 0) {
      do {
        ctemp1 = *(a_offset1 + 0);
        ctemp2 = *(a_offset1 + 1);
        ctemp3 = *(a_offset1 + 2);
        ctemp4 = *(a_offset1 + 3);
        *(b_offset + 0) = ctemp1;
        *(b_offset + 1) = ctemp2;
        *(b_offset + 2) = ctemp3;
        *(b_offset + 3) = ctemp4;
        a_offset1 += 4;
        b_offset += 4;
        i--;
      } while (i > 0);
    }
    i = (m & 3);
    if (i > 0) {
      do {
        ctemp1 = *(a_offset1 + 0);
        *(b_offset + 0) = ctemp1;
        a_offset1++;
        b_offset += 1;
        i--;
      } while (i > 0);
    }
  }
  return 0;
}
```